active_scaffold 3.4.43 → 3.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +39 -0
- data/{LICENSE → LICENSE.md} +1 -1
- data/README.md +27 -19
- data/app/assets/javascripts/active_scaffold.js.erb +1 -1
- data/app/assets/javascripts/jquery/active_scaffold.js +95 -43
- data/app/assets/javascripts/jquery/tiny_mce_bridge.js +30 -6
- data/app/assets/javascripts/prototype/tiny_mce_bridge.js +11 -1
- data/app/assets/stylesheets/active_scaffold_colors.scss +2 -2
- data/app/assets/stylesheets/active_scaffold_layout.css +36 -28
- data/app/views/active_scaffold_overrides/_base_form.html.erb +2 -3
- data/app/views/active_scaffold_overrides/_field_search.html.erb +8 -7
- data/app/views/active_scaffold_overrides/_form_association.html.erb +9 -9
- data/app/views/active_scaffold_overrides/_form_association_footer.html.erb +6 -6
- data/app/views/active_scaffold_overrides/_form_association_record.html.erb +52 -50
- data/app/views/active_scaffold_overrides/_horizontal_subform.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_horizontal_subform_header.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_human_conditions.html.erb +3 -1
- data/app/views/active_scaffold_overrides/_list_calculations.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_list_column_headings.html.erb +2 -0
- data/app/views/active_scaffold_overrides/_list_messages.html.erb +5 -3
- data/app/views/active_scaffold_overrides/_list_record.html.erb +3 -1
- data/app/views/active_scaffold_overrides/_list_with_header.html.erb +9 -9
- data/app/views/active_scaffold_overrides/_messages.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_refresh_list.js.erb +18 -10
- data/app/views/active_scaffold_overrides/_render_field.js.erb +3 -3
- data/app/views/active_scaffold_overrides/_search.html.erb +7 -6
- data/app/views/active_scaffold_overrides/_show_actions.html.erb +14 -0
- data/app/views/active_scaffold_overrides/_show_association.html.erb +1 -1
- data/app/views/active_scaffold_overrides/_update_actions.html.erb +6 -2
- data/app/views/active_scaffold_overrides/_update_column.js.erb +1 -1
- data/app/views/active_scaffold_overrides/_update_form.html.erb +1 -1
- data/app/views/active_scaffold_overrides/destroy.js.erb +2 -3
- data/app/views/active_scaffold_overrides/edit_associated.js.erb +4 -3
- data/app/views/active_scaffold_overrides/on_action_update.js.erb +5 -3
- data/app/views/active_scaffold_overrides/on_create.js.erb +4 -4
- data/app/views/active_scaffold_overrides/on_update.js.erb +6 -6
- data/app/views/active_scaffold_overrides/show.html.erb +6 -0
- data/app/views/active_scaffold_overrides/update.html.erb +1 -1
- data/app/views/active_scaffold_overrides/update_column.js.erb +1 -1
- data/config/brakeman.ignore +26 -0
- data/config/brakeman.yml +3 -0
- data/config/i18n-tasks.yml +121 -0
- data/config/locales/de.yml +81 -70
- data/config/locales/en.yml +83 -74
- data/config/locales/es.yml +82 -73
- data/config/locales/fr.yml +86 -75
- data/config/locales/hu.yml +81 -70
- data/config/locales/ja.yml +71 -60
- data/config/locales/ru.yml +85 -74
- data/lib/active_scaffold.rb +3 -0
- data/lib/active_scaffold/actions/common_search.rb +11 -7
- data/lib/active_scaffold/actions/core.rb +119 -47
- data/lib/active_scaffold/actions/create.rb +1 -1
- data/lib/active_scaffold/actions/delete.rb +11 -8
- data/lib/active_scaffold/actions/field_search.rb +104 -6
- data/lib/active_scaffold/actions/list.rb +25 -21
- data/lib/active_scaffold/actions/mark.rb +12 -4
- data/lib/active_scaffold/actions/nested.rb +26 -26
- data/lib/active_scaffold/actions/search.rb +2 -2
- data/lib/active_scaffold/actions/show.rb +4 -5
- data/lib/active_scaffold/actions/subform.rb +9 -7
- data/lib/active_scaffold/actions/update.rb +20 -13
- data/lib/active_scaffold/active_record_permissions.rb +24 -5
- data/lib/active_scaffold/attribute_params.rb +68 -49
- data/lib/active_scaffold/bridges.rb +1 -1
- data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +15 -19
- data/lib/active_scaffold/bridges/bitfields.rb +1 -1
- data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +10 -14
- data/lib/active_scaffold/bridges/calendar_date_select.rb +0 -7
- data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +19 -22
- data/lib/active_scaffold/bridges/cancan.rb +4 -3
- data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +11 -21
- data/lib/active_scaffold/bridges/carrierwave.rb +2 -1
- data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +2 -6
- data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +6 -39
- data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/chosen.rb +4 -1
- data/lib/active_scaffold/bridges/chosen/helpers.rb +3 -2
- data/lib/active_scaffold/bridges/country_select/country_select_bridge_helper.rb +2 -2
- data/lib/active_scaffold/bridges/date_picker.rb +3 -0
- data/lib/active_scaffold/bridges/date_picker/ext.rb +43 -38
- data/lib/active_scaffold/bridges/date_picker/helper.rb +24 -23
- data/lib/active_scaffold/bridges/dragonfly.rb +1 -1
- data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +3 -7
- data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +3 -25
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +2 -2
- data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +6 -8
- data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +1 -1
- data/lib/active_scaffold/bridges/file_column/form_ui.rb +0 -2
- data/lib/active_scaffold/bridges/file_column/list_ui.rb +2 -1
- data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +1 -1
- data/lib/active_scaffold/bridges/paper_trail/actions.rb +1 -1
- data/lib/active_scaffold/bridges/paper_trail/helper.rb +1 -2
- data/lib/active_scaffold/bridges/paper_trail/paper_trail_bridge.rb +3 -7
- data/lib/active_scaffold/bridges/paperclip.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/form_ui.rb +3 -28
- data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +3 -7
- data/lib/active_scaffold/bridges/record_select.rb +2 -0
- data/lib/active_scaffold/bridges/record_select/helpers.rb +14 -18
- data/lib/active_scaffold/bridges/semantic_attributes/column.rb +4 -8
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +20 -20
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +7 -22
- data/lib/active_scaffold/bridges/usa_state_select/usa_state_select_helper.rb +14 -14
- data/lib/active_scaffold/config/base.rb +9 -6
- data/lib/active_scaffold/config/core.rb +30 -21
- data/lib/active_scaffold/config/create.rb +2 -1
- data/lib/active_scaffold/config/delete.rb +2 -2
- data/lib/active_scaffold/config/field_search.rb +9 -3
- data/lib/active_scaffold/config/form.rb +4 -4
- data/lib/active_scaffold/config/list.rb +27 -23
- data/lib/active_scaffold/config/nested.rb +4 -4
- data/lib/active_scaffold/config/search.rb +6 -6
- data/lib/active_scaffold/config/show.rb +11 -1
- data/lib/active_scaffold/config/subform.rb +1 -1
- data/lib/active_scaffold/config/update.rb +4 -2
- data/lib/active_scaffold/constraints.rb +39 -36
- data/lib/active_scaffold/core.rb +36 -15
- data/lib/active_scaffold/data_structures/action_columns.rb +14 -9
- data/lib/active_scaffold/data_structures/action_link.rb +4 -5
- data/lib/active_scaffold/data_structures/action_links.rb +5 -4
- data/lib/active_scaffold/data_structures/actions.rb +2 -2
- data/lib/active_scaffold/data_structures/association.rb +8 -0
- data/lib/active_scaffold/data_structures/association/abstract.rb +147 -0
- data/lib/active_scaffold/data_structures/association/active_mongoid.rb +42 -0
- data/lib/active_scaffold/data_structures/association/active_record.rb +94 -0
- data/lib/active_scaffold/data_structures/association/mongoid.rb +45 -0
- data/lib/active_scaffold/data_structures/bridge.rb +3 -6
- data/lib/active_scaffold/data_structures/column.rb +100 -82
- data/lib/active_scaffold/data_structures/columns.rb +21 -3
- data/lib/active_scaffold/data_structures/nested_info.rb +22 -37
- data/lib/active_scaffold/data_structures/set.rb +4 -4
- data/lib/active_scaffold/data_structures/sorting.rb +29 -15
- data/lib/active_scaffold/engine.rb +3 -1
- data/lib/active_scaffold/extensions/action_controller_rendering.rb +10 -5
- data/lib/active_scaffold/extensions/action_view_rendering.rb +65 -59
- data/lib/active_scaffold/extensions/left_outer_joins.rb +48 -53
- data/lib/active_scaffold/extensions/localize.rb +3 -4
- data/lib/active_scaffold/extensions/name_option_for_datetime.rb +7 -11
- data/lib/active_scaffold/extensions/paginator_extensions.rb +20 -18
- data/lib/active_scaffold/extensions/routing_mapper.rb +104 -40
- data/lib/active_scaffold/extensions/to_label.rb +1 -1
- data/lib/active_scaffold/extensions/unsaved_associated.rb +4 -13
- data/lib/active_scaffold/extensions/unsaved_record.rb +12 -1
- data/lib/active_scaffold/finder.rb +200 -134
- data/lib/active_scaffold/helpers/action_link_helpers.rb +398 -0
- data/lib/active_scaffold/helpers/association_helpers.rb +12 -30
- data/lib/active_scaffold/helpers/controller_helpers.rb +74 -24
- data/lib/active_scaffold/helpers/form_column_helpers.rb +205 -112
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +21 -11
- data/lib/active_scaffold/helpers/id_helpers.rb +1 -1
- data/lib/active_scaffold/helpers/list_column_helpers.rb +117 -39
- data/lib/active_scaffold/helpers/pagination_helpers.rb +11 -14
- data/lib/active_scaffold/helpers/search_column_helpers.rb +69 -32
- data/lib/active_scaffold/helpers/show_column_helpers.rb +9 -3
- data/lib/active_scaffold/helpers/view_helpers.rb +41 -426
- data/lib/active_scaffold/orm_checks.rb +109 -0
- data/lib/active_scaffold/paginator.rb +1 -1
- data/lib/active_scaffold/responds_to_parent.rb +12 -10
- data/lib/active_scaffold/tableless.rb +81 -43
- data/lib/active_scaffold/version.rb +2 -2
- data/lib/generators/active_scaffold/controller_generator.rb +49 -0
- data/lib/generators/active_scaffold/install_generator.rb +45 -0
- data/lib/generators/active_scaffold/resource_generator.rb +56 -0
- data/lib/generators/{active_scaffold_controller/templates → templates}/controller.rb +0 -0
- data/lib/generators/{active_scaffold_controller/templates → templates}/helper.rb +0 -0
- data/shoulda_macros/macros.rb +3 -3
- data/test/active_scaffold_config_mock.rb +33 -0
- data/test/bridges/bridge_test.rb +9 -9
- data/test/bridges/date_picker_test.rb +3 -1
- data/test/bridges/paper_trail_test.rb +2 -3
- data/test/bridges/paperclip_test.rb +21 -10
- data/test/bridges/tiny_mce_test.rb +20 -21
- data/test/class_with_finder.rb +42 -0
- data/test/company.rb +6 -4
- data/test/config/core_test.rb +1 -1
- data/test/config/create_test.rb +1 -1
- data/test/config/list_test.rb +3 -3
- data/test/config/update_test.rb +3 -3
- data/test/data_structures/action_columns_test.rb +3 -3
- data/test/data_structures/association_column_test.rb +5 -5
- data/test/data_structures/column_test.rb +14 -14
- data/test/data_structures/columns_test.rb +2 -2
- data/test/data_structures/set_test.rb +2 -2
- data/test/data_structures/sorting_test.rb +6 -4
- data/test/extensions/active_record_test.rb +1 -1
- data/test/extensions/routing_mapper_test.rb +64 -13
- data/test/helpers/form_column_helpers_test.rb +6 -6
- data/test/helpers/list_column_helpers_test.rb +9 -5
- data/test/helpers/pagination_helpers_test.rb +1 -0
- data/test/misc/active_record_permissions_test.rb +18 -1
- data/test/misc/attribute_params_test.rb +26 -17
- data/test/misc/calculation_test.rb +8 -31
- data/test/misc/configurable_test.rb +3 -2
- data/test/misc/constraints_test.rb +33 -22
- data/test/misc/convert_numbers_format_test.rb +28 -10
- data/test/misc/finder_test.rb +6 -29
- data/test/misc/parse_datetime_test.rb +160 -0
- data/test/misc/render_test.rb +1 -1
- data/test/misc/tableless_test.rb +24 -0
- data/test/mock_app/app/models/building.rb +2 -1
- data/test/mock_app/config.ru +1 -1
- data/test/mock_app/config/environments/test.rb +1 -1
- data/test/mock_app/config/routes.rb +11 -3
- data/test/model_stub.rb +11 -6
- data/test/run_all.rb +1 -1
- data/test/test_helper.rb +19 -4
- metadata +42 -23
- data/lib/active_scaffold/data_structures/error_message.rb +0 -22
- data/lib/active_scaffold/extensions/reverse_associations.rb +0 -119
- data/lib/generators/active_scaffold/USAGE +0 -29
- data/lib/generators/active_scaffold/active_scaffold_generator.rb +0 -21
- data/lib/generators/active_scaffold_controller/USAGE +0 -19
- data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +0 -29
- data/test/data_structures/error_message_test.rb +0 -25
@@ -3,18 +3,20 @@ module ActiveScaffold
|
|
3
3
|
# Helpers that assist with the rendering of a List Column
|
4
4
|
module ShowColumnHelpers
|
5
5
|
def show_column_value(record, column)
|
6
|
+
value_record = column.delegated_association ? record.send(column.delegated_association.name) : record
|
7
|
+
return get_column_value(record, column) unless value_record
|
6
8
|
# check for an override helper
|
7
9
|
if (method = show_column_override(column))
|
8
10
|
# we only pass the record as the argument. we previously also passed the formatted_value,
|
9
11
|
# but mike perham pointed out that prohibited the usage of overrides to improve on the
|
10
12
|
# performance of our default formatting. see issue #138.
|
11
|
-
send(method,
|
13
|
+
send(method, value_record, column)
|
12
14
|
# second, check if the dev has specified a valid list_ui for this column
|
13
15
|
elsif column.show_ui && (method = override_show_column_ui(column.show_ui))
|
14
|
-
send(method,
|
16
|
+
send(method, value_record, column)
|
15
17
|
else
|
16
18
|
if column.column && (method = override_show_column_ui(column.column.type))
|
17
|
-
send(method,
|
19
|
+
send(method, value_record, column)
|
18
20
|
else
|
19
21
|
get_column_value(record, column)
|
20
22
|
end
|
@@ -56,6 +58,10 @@ module ActiveScaffold
|
|
56
58
|
method = "active_scaffold_show_#{show_ui}"
|
57
59
|
method if respond_to? method
|
58
60
|
end
|
61
|
+
|
62
|
+
def display_link_in_show?(link, position)
|
63
|
+
position == :header
|
64
|
+
end
|
59
65
|
end
|
60
66
|
end
|
61
67
|
end
|
@@ -3,8 +3,8 @@ module ActiveScaffold
|
|
3
3
|
# All extra helpers that should be included in the View.
|
4
4
|
# Also a dumping ground for uncategorized helpers.
|
5
5
|
module ViewHelpers
|
6
|
-
NESTED_PARAMS = [:eid, :association, :parent_scaffold]
|
7
6
|
include ActiveScaffold::Helpers::IdHelpers
|
7
|
+
include ActiveScaffold::Helpers::ActionLinkHelpers
|
8
8
|
include ActiveScaffold::Helpers::AssociationHelpers
|
9
9
|
include ActiveScaffold::Helpers::PaginationHelpers
|
10
10
|
include ActiveScaffold::Helpers::ListColumnHelpers
|
@@ -44,16 +44,9 @@ module ActiveScaffold
|
|
44
44
|
# This is the template finder logic, keep it updated with however we find stuff in rails
|
45
45
|
# currently this very similar to the logic in ActionBase::Base.render for options file
|
46
46
|
def template_exists?(template_name, partial = false)
|
47
|
-
lookup_context.
|
48
|
-
|
49
|
-
|
50
|
-
# Turns [[label, value]] into <option> tags
|
51
|
-
# Takes optional parameter of :include_blank
|
52
|
-
def option_tags_for(select_options, options = {})
|
53
|
-
select_options.insert(0, [as_(:_select_), nil]) if options[:include_blank]
|
54
|
-
select_options.collect do |option|
|
55
|
-
label, value = option[0], option[1]
|
56
|
-
value.nil? ? '<option value='">#{label}</option>" : "<option value=\"#{value}\">#{label}</option>"
|
47
|
+
restore_view_paths, lookup_context.view_paths = lookup_context.view_paths, @_view_paths if @_view_paths
|
48
|
+
lookup_context.exists?(template_name, '', partial).tap do
|
49
|
+
lookup_context.view_paths = restore_view_paths if @_view_paths
|
57
50
|
end
|
58
51
|
end
|
59
52
|
|
@@ -61,9 +54,10 @@ module ActiveScaffold
|
|
61
54
|
options[:target] = action_iframe_id(url_for_options)
|
62
55
|
options[:multipart] ||= true
|
63
56
|
options[:class] = "#{options[:class]} as_remote_upload".strip
|
64
|
-
output =
|
57
|
+
output = []
|
65
58
|
output << form_tag(url_for_options, options)
|
66
|
-
|
59
|
+
output << content_tag(:iframe, '', id: action_iframe_id(url_for_options), name: action_iframe_id(url_for_options), style: 'display:none')
|
60
|
+
safe_join output
|
67
61
|
end
|
68
62
|
|
69
63
|
# a general-use loading indicator (the "stuff is happening, please wait" feedback)
|
@@ -81,389 +75,6 @@ module ActiveScaffold
|
|
81
75
|
link_to options[:default_visible] ? options[:hide_label] : options[:show_label], '#', :data => {:show => options[:show_label], :hide => options[:hide_label], :toggable => id}, :style => 'display: none;', :class => 'as-js-button visibility-toggle'
|
82
76
|
end
|
83
77
|
|
84
|
-
def skip_action_link?(link, *args)
|
85
|
-
!link.ignore_method.nil? && controller.respond_to?(link.ignore_method, true) && controller.send(link.ignore_method, *args)
|
86
|
-
end
|
87
|
-
|
88
|
-
def action_link_authorized?(link, *args)
|
89
|
-
if link.security_method_set? || controller.respond_to?(link.security_method, true)
|
90
|
-
controller.send(link.security_method, *args)
|
91
|
-
else
|
92
|
-
args.empty? ? true : args.first.authorized_for?(:crud_type => link.crud_type, :action => link.action)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def display_dynamic_action_group(action_link, links, record_or_ul_options = nil, ul_options = nil)
|
97
|
-
ul_options = record_or_ul_options if ul_options.nil? && record_or_ul_options.is_a?(Hash)
|
98
|
-
record = record_or_ul_options unless record_or_ul_options.is_a?(Hash)
|
99
|
-
html = content_tag :ul, ul_options do
|
100
|
-
links.map { |link| content_tag :li, link }.join('').html_safe
|
101
|
-
end
|
102
|
-
raw "ActiveScaffold.display_dynamic_action_group('#{get_action_link_id action_link, record}', '#{escape_javascript html}');"
|
103
|
-
end
|
104
|
-
|
105
|
-
def display_action_links(action_links, record, options, &block)
|
106
|
-
options[:level_0_tag] ||= nil
|
107
|
-
options[:options_level_0_tag] ||= nil
|
108
|
-
options[:level] ||= 0
|
109
|
-
options[:first_action] = true
|
110
|
-
output = ActiveSupport::SafeBuffer.new
|
111
|
-
|
112
|
-
action_links.each(:reverse => options.delete(:reverse), :groups => true) do |link|
|
113
|
-
if link.is_a? ActiveScaffold::DataStructures::ActionLinks
|
114
|
-
unless link.empty?
|
115
|
-
options[:level] += 1
|
116
|
-
content = display_action_links(link, record, options, &block)
|
117
|
-
options[:level] -= 1
|
118
|
-
if content.present?
|
119
|
-
output << display_action_link(link, content, record, options)
|
120
|
-
options[:first_action] = false
|
121
|
-
end
|
122
|
-
end
|
123
|
-
elsif !skip_action_link?(link, *Array(options[:for]))
|
124
|
-
authorized = action_link_authorized?(link, *Array(options[:for]))
|
125
|
-
next if !authorized && options[:skip_unauthorized]
|
126
|
-
output << display_action_link(link, nil, record, options.merge(:authorized => authorized))
|
127
|
-
options[:first_action] = false
|
128
|
-
end
|
129
|
-
end
|
130
|
-
output
|
131
|
-
end
|
132
|
-
|
133
|
-
def display_action_link(link, content, record, options)
|
134
|
-
if content
|
135
|
-
html_classes = hover_via_click? ? 'hover_click ' : ''
|
136
|
-
if options[:level] == 0
|
137
|
-
html_classes << 'action_group'
|
138
|
-
group_tag = :div
|
139
|
-
else
|
140
|
-
html_classes << 'top' if options[:first_action]
|
141
|
-
group_tag = :li
|
142
|
-
end
|
143
|
-
content = content_tag(group_tag, :class => (html_classes if html_classes.present?), :onclick => ('' if hover_via_click?)) do
|
144
|
-
content_tag(:div, as_(link.label), :class => link.name.to_s.downcase) << content_tag(:ul, content)
|
145
|
-
end
|
146
|
-
else
|
147
|
-
content = render_action_link(link, record, options)
|
148
|
-
content = content_tag(:li, content, :class => ('top' if options[:first_action])) unless options[:level] == 0
|
149
|
-
end
|
150
|
-
content = content_tag(options[:level_0_tag], content, options[:options_level_0_tag]) if options[:level] == 0 && options[:level_0_tag]
|
151
|
-
content
|
152
|
-
end
|
153
|
-
|
154
|
-
def render_action_link(link, record = nil, options = {})
|
155
|
-
if link.action.nil? || link.column.try(:polymorphic_association?)
|
156
|
-
link = action_link_to_inline_form(link, record) if link.column.try(:association)
|
157
|
-
options[:authorized] = false if link.action.nil? || link.controller.nil?
|
158
|
-
options.delete :link if link.crud_type == :create
|
159
|
-
end
|
160
|
-
if link.action.nil? || (link.type == :member && options.key?(:authorized) && !options[:authorized])
|
161
|
-
action_link_html(link, nil, {:link => action_link_text(link, options), :class => "disabled #{link.action}#{" #{link.html_options[:class]}" unless link.html_options[:class].blank?}"}, record)
|
162
|
-
else
|
163
|
-
url = action_link_url(link, record)
|
164
|
-
html_options = action_link_html_options(link, record, options)
|
165
|
-
action_link_html(link, url, html_options, record)
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
# setup the action link to inline form
|
170
|
-
def action_link_to_inline_form(link, record)
|
171
|
-
link = link.clone
|
172
|
-
associated = record.send(link.column.association.name)
|
173
|
-
if link.column.polymorphic_association?
|
174
|
-
link.controller = controller_path_for_activerecord(associated.class)
|
175
|
-
return link if link.controller.nil?
|
176
|
-
end
|
177
|
-
link = configure_column_link(link, record, associated) if link.action.nil?
|
178
|
-
link
|
179
|
-
end
|
180
|
-
|
181
|
-
def configure_column_link(link, record, associated, actions = nil)
|
182
|
-
actions ||= link.column.actions_for_association_links
|
183
|
-
if column_empty?(associated) # if association is empty, we only can link to create form
|
184
|
-
if actions.include?(:new)
|
185
|
-
link.action = 'new'
|
186
|
-
link.crud_type = :create
|
187
|
-
link.label ||= as_(:create_new)
|
188
|
-
end
|
189
|
-
elsif actions.include?(:edit)
|
190
|
-
link.action = 'edit'
|
191
|
-
link.crud_type = :update
|
192
|
-
elsif actions.include?(:show)
|
193
|
-
link.action = 'show'
|
194
|
-
link.crud_type = :read
|
195
|
-
elsif actions.include?(:list)
|
196
|
-
link.action = 'index'
|
197
|
-
link.crud_type = :read
|
198
|
-
end
|
199
|
-
|
200
|
-
unless column_link_authorized?(link, link.column, record, associated)
|
201
|
-
link.action = nil
|
202
|
-
# if action is edit and is not authorized, fallback to show if it's enabled
|
203
|
-
if link.crud_type == :update && actions.include?(:show)
|
204
|
-
link = configure_column_link(link, record, associated, [:show])
|
205
|
-
end
|
206
|
-
end
|
207
|
-
link
|
208
|
-
end
|
209
|
-
|
210
|
-
def column_link_authorized?(link, column, record, associated)
|
211
|
-
if column.association
|
212
|
-
associated_for_authorized =
|
213
|
-
if column.plural_association? || (associated.respond_to?(:blank?) && associated.blank?)
|
214
|
-
column.association.klass
|
215
|
-
else
|
216
|
-
associated
|
217
|
-
end
|
218
|
-
authorized = associated_for_authorized.authorized_for?(:crud_type => link.crud_type)
|
219
|
-
authorized &&= record.authorized_for?(:crud_type => :update, :column => column.name) if link.crud_type == :create
|
220
|
-
authorized
|
221
|
-
else
|
222
|
-
action_link_authorized?(link, record)
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
|
-
def is_sti_record?(record)
|
227
|
-
model = active_scaffold_config.model
|
228
|
-
record && model.columns_hash.include?(model.inheritance_column) &&
|
229
|
-
record[model.inheritance_column].present? && !record.instance_of?(model)
|
230
|
-
end
|
231
|
-
|
232
|
-
def cache_action_link_url?(link, record)
|
233
|
-
active_scaffold_config.cache_action_link_urls && link.type == :member && !link.dynamic_parameters.is_a?(Proc) && !is_sti_record?(record)
|
234
|
-
end
|
235
|
-
|
236
|
-
def cached_action_link_url(link, record)
|
237
|
-
@action_links_urls ||= {}
|
238
|
-
@action_links_urls[link.name_to_cache] || begin
|
239
|
-
url_options = cached_action_link_url_options(link, record)
|
240
|
-
if cache_action_link_url?(link, record)
|
241
|
-
@action_links_urls[link.name_to_cache] = url_for(url_options)
|
242
|
-
else
|
243
|
-
url_for(params_for(url_options))
|
244
|
-
end
|
245
|
-
end
|
246
|
-
end
|
247
|
-
|
248
|
-
def replace_id_params_in_action_link_url(link, record, url)
|
249
|
-
url = record ? url.sub('--ID--', record.to_param.to_s) : url.clone
|
250
|
-
if link.column.try(:singular_association?)
|
251
|
-
child_id = record.send(link.column.association.name).try(:to_param)
|
252
|
-
if child_id.present?
|
253
|
-
url.sub!('--CHILD_ID--', child_id)
|
254
|
-
else
|
255
|
-
url.sub!(/\w+=--CHILD_ID--&?/, '')
|
256
|
-
url.sub!(/\?$/, '')
|
257
|
-
end
|
258
|
-
elsif nested?
|
259
|
-
url.sub!('--CHILD_ID--', params[nested.param_name].to_s)
|
260
|
-
end
|
261
|
-
url
|
262
|
-
end
|
263
|
-
|
264
|
-
def add_query_string_to_cached_url(link, url)
|
265
|
-
query_string, non_nested_query_string = query_string_for_action_links(link)
|
266
|
-
nested_params = (!link.nested_link? && non_nested_query_string)
|
267
|
-
if query_string || nested_params
|
268
|
-
url << (url.include?('?') ? '&' : '?')
|
269
|
-
url << query_string if query_string
|
270
|
-
url << non_nested_query_string if nested_params
|
271
|
-
end
|
272
|
-
url
|
273
|
-
end
|
274
|
-
|
275
|
-
def action_link_url(link, record)
|
276
|
-
url = replace_id_params_in_action_link_url(link, record, cached_action_link_url(link, record))
|
277
|
-
url = add_query_string_to_cached_url(link, url) if @action_links_urls[link.name_to_cache]
|
278
|
-
url
|
279
|
-
end
|
280
|
-
|
281
|
-
def query_string_for_action_links(link)
|
282
|
-
if defined?(@query_string) && link.parameters.none? { |k, _| @query_string_params.include? k }
|
283
|
-
return [@query_string, @non_nested_query_string]
|
284
|
-
end
|
285
|
-
keep = true
|
286
|
-
@query_string_params ||= Set.new
|
287
|
-
query_string_options = {}
|
288
|
-
non_nested_query_string_options = {}
|
289
|
-
|
290
|
-
params_for.except(:controller, :action, :id).each do |key, value|
|
291
|
-
@query_string_params << key
|
292
|
-
if link.parameters.include? key
|
293
|
-
keep = false
|
294
|
-
next
|
295
|
-
end
|
296
|
-
if NESTED_PARAMS.include?(key) || conditions_from_params.include?(key) || (nested? && nested.param_name == key)
|
297
|
-
non_nested_query_string_options[key] = value
|
298
|
-
else
|
299
|
-
query_string_options[key] = value
|
300
|
-
end
|
301
|
-
end
|
302
|
-
|
303
|
-
query_string = query_string_options.to_query if query_string_options.present?
|
304
|
-
if non_nested_query_string_options.present?
|
305
|
-
non_nested_query_string = "#{'&' if query_string}#{non_nested_query_string_options.to_query}"
|
306
|
-
end
|
307
|
-
if keep
|
308
|
-
@query_string = query_string
|
309
|
-
@non_nested_query_string = non_nested_query_string
|
310
|
-
end
|
311
|
-
[query_string, non_nested_query_string]
|
312
|
-
end
|
313
|
-
|
314
|
-
def cache_action_link_url_options?(link, record)
|
315
|
-
active_scaffold_config.cache_action_link_urls && (link.type == :collection || !link.dynamic_parameters.is_a?(Proc)) && !is_sti_record?(record)
|
316
|
-
end
|
317
|
-
|
318
|
-
def cached_action_link_url_options(link, record)
|
319
|
-
@action_links_url_options ||= {}
|
320
|
-
@action_links_url_options[link.name_to_cache] || begin
|
321
|
-
options = action_link_url_options(link, record)
|
322
|
-
if cache_action_link_url_options?(link, record)
|
323
|
-
@action_links_url_options[link.name_to_cache] = options
|
324
|
-
end
|
325
|
-
options
|
326
|
-
end
|
327
|
-
end
|
328
|
-
|
329
|
-
def action_link_url_options(link, record)
|
330
|
-
url_options = {:action => link.action}
|
331
|
-
url_options[:id] = '--ID--' unless record.nil?
|
332
|
-
url_options[:controller] = link.controller.to_s if link.controller
|
333
|
-
url_options.merge! link.parameters if link.parameters
|
334
|
-
if link.dynamic_parameters.is_a?(Proc)
|
335
|
-
if record.nil?
|
336
|
-
url_options.merge! instance_exec &link.dynamic_parameters
|
337
|
-
else
|
338
|
-
url_options.merge! instance_exec record, &link.dynamic_parameters
|
339
|
-
end
|
340
|
-
end
|
341
|
-
if link.nested_link?
|
342
|
-
url_options_for_nested_link(link.column, record, link, url_options)
|
343
|
-
elsif nested?
|
344
|
-
url_options[nested.param_name] = '--CHILD_ID--'
|
345
|
-
end
|
346
|
-
url_options_for_sti_link(link.column, record, link, url_options) unless record.nil? || active_scaffold_config.sti_children.nil?
|
347
|
-
url_options[:_method] = link.method if !link.confirm? && link.inline? && link.method != :get
|
348
|
-
url_options
|
349
|
-
end
|
350
|
-
|
351
|
-
def action_link_text(link, options)
|
352
|
-
text = image_tag(link.image[:name], :size => link.image[:size], :alt => options[:link] || link.label, :title => options[:link] || link.label) if link.image
|
353
|
-
text || options[:link]
|
354
|
-
end
|
355
|
-
|
356
|
-
def replaced_action_link_url_options(link, record)
|
357
|
-
url = cached_action_link_url_options(link, record)
|
358
|
-
url[:controller] ||= params[:controller]
|
359
|
-
missing_options, url_options = url.partition { |_, v| v.nil? }
|
360
|
-
replacements = {}
|
361
|
-
replacements['--ID--'] = record.id.to_s if record
|
362
|
-
if link.column.try(:singular_association?)
|
363
|
-
replacements['--CHILD_ID--'] = record.send(link.column.association.name).try(:id).to_s
|
364
|
-
elsif nested?
|
365
|
-
replacements['--CHILD_ID--'] = params[nested.param_name].to_s
|
366
|
-
end
|
367
|
-
url_options.collect! do |k, v|
|
368
|
-
[k.to_s, replacements[v] || v]
|
369
|
-
end
|
370
|
-
[missing_options, url_options]
|
371
|
-
end
|
372
|
-
|
373
|
-
def action_link_selected?(link, record)
|
374
|
-
missing_options, url_options = replaced_action_link_url_options(link, record)
|
375
|
-
(url_options - params.to_a).blank? && missing_options.all? { |k, _| params[k].nil? }
|
376
|
-
end
|
377
|
-
|
378
|
-
def action_link_html_options(link, record, options)
|
379
|
-
link_id = get_action_link_id(link, record)
|
380
|
-
html_options = link.html_options.merge(:class => [link.html_options[:class], link.action.to_s].compact.join(' '))
|
381
|
-
html_options[:link] = action_link_text(link, options)
|
382
|
-
|
383
|
-
# Needs to be in html_options to as the adding _method to the url is no longer supported by Rails
|
384
|
-
html_options[:method] = link.method if link.method != :get
|
385
|
-
|
386
|
-
html_options[:data] ||= {}
|
387
|
-
html_options[:data][:confirm] = link.confirm(h(record.try(:to_label))) if link.confirm?
|
388
|
-
if link.inline?
|
389
|
-
html_options[:class] << ' as_action'
|
390
|
-
html_options[:data][:position] = link.position if link.position
|
391
|
-
html_options[:data][:action] = link.action
|
392
|
-
html_options[:data][:cancel_refresh] = true if link.refresh_on_close
|
393
|
-
html_options[:data][:keep_open] = true if link.keep_open?
|
394
|
-
end
|
395
|
-
|
396
|
-
if link.toggle
|
397
|
-
html_options[:class] << ' toggle'
|
398
|
-
html_options[:class] << ' active' if action_link_selected?(link, record)
|
399
|
-
end
|
400
|
-
|
401
|
-
html_options[:target] = '_blank' if link.popup?
|
402
|
-
html_options[:id] = link_id
|
403
|
-
html_options[:remote] = true unless link.page? || link.popup?
|
404
|
-
if link.dhtml_confirm?
|
405
|
-
unless link.inline?
|
406
|
-
html_options[:class] << ' as_action'
|
407
|
-
html_options[:page_link] = 'true'
|
408
|
-
end
|
409
|
-
html_options[:dhtml_confirm] = link.dhtml_confirm.value
|
410
|
-
html_options[:onclick] = link.dhtml_confirm.onclick_function(controller, link_id)
|
411
|
-
end
|
412
|
-
html_options
|
413
|
-
end
|
414
|
-
|
415
|
-
def get_action_link_id(link, record = nil, column = nil)
|
416
|
-
column ||= link.column
|
417
|
-
if column && column.plural_association?
|
418
|
-
id = "#{column.association.name}-#{record.id}"
|
419
|
-
elsif column && column.singular_association?
|
420
|
-
if record.try(column.association.name.to_sym).present?
|
421
|
-
id = "#{column.association.name}-#{record.send(column.association.name).id}-#{record.id}"
|
422
|
-
else
|
423
|
-
id = "#{column.association.name}-#{record.id}" unless record.nil?
|
424
|
-
end
|
425
|
-
end
|
426
|
-
id ||= record.try(:id) || (nested? ? nested_parent_id : '')
|
427
|
-
action_id = "#{id_from_controller("#{link.controller}-") if params[:parent_controller] || (link.controller && link.controller != controller.controller_path)}#{link.action}"
|
428
|
-
action_link_id(action_id, id)
|
429
|
-
end
|
430
|
-
|
431
|
-
def action_link_html(link, url, html_options, record)
|
432
|
-
label = html_options.delete(:link)
|
433
|
-
label ||= link.label
|
434
|
-
if url.nil?
|
435
|
-
content_tag(:a, label, html_options)
|
436
|
-
else
|
437
|
-
link_to(label, url, html_options)
|
438
|
-
end
|
439
|
-
end
|
440
|
-
|
441
|
-
def url_options_for_nested_link(column, record, link, url_options)
|
442
|
-
if column && column.association
|
443
|
-
url_options[:parent_scaffold] = controller_path
|
444
|
-
url_options[column.association.active_record.name.foreign_key.to_sym] = url_options.delete(:id)
|
445
|
-
if column.singular_association? && url_options[:action].to_sym != :index
|
446
|
-
url_options[:id] = '--CHILD_ID--'
|
447
|
-
else
|
448
|
-
url_options[:id] = nil
|
449
|
-
end
|
450
|
-
elsif link.parameters && link.parameters[:named_scope]
|
451
|
-
url_options[:parent_scaffold] = controller_path
|
452
|
-
url_options[active_scaffold_config.model.name.foreign_key.to_sym] = url_options.delete(:id)
|
453
|
-
end
|
454
|
-
end
|
455
|
-
|
456
|
-
def url_options_for_sti_link(column, record, link, url_options)
|
457
|
-
# need to find out controller of current record type and set parameters
|
458
|
-
# it's quite difficult to detect an sti link
|
459
|
-
# if link.column.nil? we are sure that it isn't a singular association inline autolink
|
460
|
-
# however that will not work if a sti parent is a singular association inline autolink
|
461
|
-
return unless link.column.nil?
|
462
|
-
return if (sti_controller_path = controller_path_for_activerecord(record.class)).nil?
|
463
|
-
url_options[:controller] = sti_controller_path
|
464
|
-
url_options[:parent_sti] = controller_path
|
465
|
-
end
|
466
|
-
|
467
78
|
def list_row_class_method(record)
|
468
79
|
return @_list_row_class_method if defined? @_list_row_class_method
|
469
80
|
class_override_helper = "#{clean_class_name(record.class.name)}_list_row_class"
|
@@ -488,6 +99,7 @@ module ActiveScaffold
|
|
488
99
|
classes << 'sorted ' if active_scaffold_config.actions.include?(:list) && active_scaffold_config.list.user.sorting.sorts_on?(column)
|
489
100
|
classes << 'numeric ' if column.number?
|
490
101
|
classes << column.css_class unless column.css_class.nil? || column.css_class.is_a?(Proc)
|
102
|
+
classes
|
491
103
|
end
|
492
104
|
classes = "#{@_column_classes[column.name]} "
|
493
105
|
classes << 'empty ' if column_empty? column_value
|
@@ -514,6 +126,9 @@ module ActiveScaffold
|
|
514
126
|
|
515
127
|
def column_empty?(column_value)
|
516
128
|
empty = column_value.nil?
|
129
|
+
# column_value != false would force boolean to be cast to integer
|
130
|
+
# when comparing to column_value of IPAddr class (PostgreSQL inet column type)
|
131
|
+
# rubocop:disable Style/YodaCondition
|
517
132
|
empty ||= false != column_value && column_value.blank?
|
518
133
|
empty ||= [' ', empty_field_text].include? column_value if column_value.is_a? String
|
519
134
|
empty
|
@@ -523,35 +138,16 @@ module ActiveScaffold
|
|
523
138
|
active_scaffold_config.list.empty_field_text if active_scaffold_config.actions.include?(:list)
|
524
139
|
end
|
525
140
|
|
526
|
-
def column_calculation(column)
|
527
|
-
if column.calculate.instance_of? Proc
|
528
|
-
column.calculate.call(@records)
|
529
|
-
else
|
530
|
-
calculate_query.calculate(column.calculate, column.name)
|
531
|
-
end
|
532
|
-
end
|
533
|
-
|
534
|
-
def render_column_calculation(column)
|
535
|
-
calculation = column_calculation(column)
|
536
|
-
override_formatter = "render_#{column.name}_#{column.calculate.is_a?(Proc) ? :calculate : column.calculate}"
|
537
|
-
calculation = send(override_formatter, calculation) if respond_to? override_formatter
|
538
|
-
format_column_calculation(column, calculation)
|
539
|
-
end
|
540
|
-
|
541
|
-
def format_column_calculation(column, calculation)
|
542
|
-
"#{"#{as_(column.calculate)}: " unless column.calculate.is_a? Proc}#{format_column_value nil, column, calculation}"
|
543
|
-
end
|
544
|
-
|
545
141
|
def as_slider(options)
|
546
142
|
content_tag(:span, '', class: 'as-slider', data: {slider: options})
|
547
143
|
end
|
548
144
|
|
549
145
|
def clean_column_name(name)
|
550
|
-
name.to_s.
|
146
|
+
name.to_s.delete('?')
|
551
147
|
end
|
552
148
|
|
553
149
|
def clean_class_name(name)
|
554
|
-
name.underscore.
|
150
|
+
name.underscore.tr('/', '_')
|
555
151
|
end
|
556
152
|
|
557
153
|
# the naming convention for overriding with helpers
|
@@ -575,7 +171,24 @@ module ActiveScaffold
|
|
575
171
|
end
|
576
172
|
end
|
577
173
|
|
174
|
+
def history_state
|
175
|
+
if active_scaffold_config.store_user_settings
|
176
|
+
state = {page: @page.try(:number)}
|
177
|
+
state[:search] = search_params if respond_to?(:search_params) && search_params.present?
|
178
|
+
if active_scaffold_config.list.user.user_sorting?
|
179
|
+
column, state[:sort_direction] = active_scaffold_config.list.user.sorting.first
|
180
|
+
state[:sort] = column.name
|
181
|
+
else
|
182
|
+
state.merge sort: '', sort_direction: ''
|
183
|
+
end
|
184
|
+
state
|
185
|
+
else
|
186
|
+
{}
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
578
190
|
def display_message(message)
|
191
|
+
message = safe_join message, tag(:br) if message.is_a?(Array)
|
579
192
|
if (highlights = active_scaffold_config.highlight_messages)
|
580
193
|
message = highlights.inject(message) do |msg, (phrases, highlighter)|
|
581
194
|
highlight(msg, phrases, highlighter || {})
|
@@ -583,7 +196,9 @@ module ActiveScaffold
|
|
583
196
|
end
|
584
197
|
if (format = active_scaffold_config.timestamped_messages)
|
585
198
|
format = :short if format == true
|
586
|
-
|
199
|
+
messages = [content_tag(:div, l(Time.current, :format => format), :class => 'timestamp')]
|
200
|
+
messages << content_tag(:div, message, :class => 'message-content')
|
201
|
+
message = safe_join messages, ' '
|
587
202
|
end
|
588
203
|
message
|
589
204
|
end
|
@@ -610,10 +225,10 @@ module ActiveScaffold
|
|
610
225
|
''
|
611
226
|
else
|
612
227
|
html = {}
|
613
|
-
[
|
228
|
+
%i[id class].each do |key|
|
614
229
|
if options.include?(key)
|
615
230
|
value = options[key]
|
616
|
-
html[key] = value
|
231
|
+
html[key] = value if value.present?
|
617
232
|
else
|
618
233
|
html[key] = 'errorExplanation'
|
619
234
|
end
|
@@ -624,7 +239,7 @@ module ActiveScaffold
|
|
624
239
|
if options.include?(:header_message)
|
625
240
|
options[:header_message]
|
626
241
|
else
|
627
|
-
as_('errors.template.header', :count => count, :model => options[:object_name].to_s.
|
242
|
+
as_('errors.template.header', :count => count, :model => options[:object_name].to_s.tr('_', ' '))
|
628
243
|
end
|
629
244
|
|
630
245
|
message = options.include?(:message) ? options[:message] : as_('errors.template.body')
|
@@ -636,16 +251,16 @@ module ActiveScaffold
|
|
636
251
|
end
|
637
252
|
error_messages =
|
638
253
|
if options[:list_type] == :br
|
639
|
-
error_messages
|
254
|
+
safe_join error_messages, tag(:br)
|
640
255
|
else
|
641
|
-
content_tag
|
256
|
+
content_tag options[:list_type], safe_join(error_messages)
|
642
257
|
end
|
643
258
|
|
644
259
|
contents = []
|
645
|
-
contents << content_tag(options[:header_tag] || :h2, header_message)
|
646
|
-
contents << content_tag(:p, message)
|
260
|
+
contents << content_tag(options[:header_tag] || :h2, header_message) if header_message.present?
|
261
|
+
contents << content_tag(:p, message) if message.present?
|
647
262
|
contents << error_messages
|
648
|
-
contents = contents
|
263
|
+
contents = safe_join(contents)
|
649
264
|
options[:container_tag] ? content_tag(options[:container_tag], contents, html) : contents
|
650
265
|
end
|
651
266
|
end
|