active_scaffold 3.4.17 → 3.4.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +12 -1
- data/README.md +8 -4
- data/app/assets/javascripts/jquery/active_scaffold.js +82 -67
- data/app/assets/stylesheets/active_scaffold.scss +1 -1
- data/app/assets/stylesheets/active_scaffold_colors.scss +1 -1
- data/app/assets/stylesheets/blue-theme.css +1 -1
- data/app/views/active_scaffold_overrides/_form_association.html.erb +3 -3
- data/app/views/active_scaffold_overrides/_form_association_record.html.erb +3 -3
- data/app/views/active_scaffold_overrides/_show_columns.html.erb +1 -1
- data/lib/active_scaffold.rb +16 -16
- data/lib/active_scaffold/actions/common_search.rb +13 -11
- data/lib/active_scaffold/actions/core.rb +85 -78
- data/lib/active_scaffold/actions/create.rb +29 -28
- data/lib/active_scaffold/actions/delete.rb +17 -17
- data/lib/active_scaffold/actions/field_search.rb +18 -19
- data/lib/active_scaffold/actions/list.rb +30 -22
- data/lib/active_scaffold/actions/mark.rb +1 -1
- data/lib/active_scaffold/actions/nested.rb +78 -65
- data/lib/active_scaffold/actions/search.rb +13 -10
- data/lib/active_scaffold/actions/show.rb +10 -6
- data/lib/active_scaffold/actions/subform.rb +1 -2
- data/lib/active_scaffold/actions/update.rb +39 -31
- data/lib/active_scaffold/active_record_permissions.rb +14 -15
- data/lib/active_scaffold/attribute_params.rb +42 -43
- data/lib/active_scaffold/bridges.rb +22 -12
- data/lib/active_scaffold/bridges/ancestry.rb +1 -1
- data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +6 -6
- data/lib/active_scaffold/bridges/bitfields.rb +1 -1
- data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +12 -13
- data/lib/active_scaffold/bridges/calendar_date_select.rb +5 -5
- data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +17 -20
- data/lib/active_scaffold/bridges/cancan.rb +1 -1
- data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +8 -9
- data/lib/active_scaffold/bridges/carrierwave.rb +4 -4
- data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +9 -8
- data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +11 -10
- data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +7 -6
- data/lib/active_scaffold/bridges/chosen.rb +1 -1
- data/lib/active_scaffold/bridges/chosen/helpers.rb +4 -4
- data/lib/active_scaffold/bridges/country_helper.rb +1 -1
- data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +259 -260
- data/lib/active_scaffold/bridges/date_picker.rb +2 -2
- data/lib/active_scaffold/bridges/date_picker/ext.rb +9 -11
- data/lib/active_scaffold/bridges/date_picker/helper.rb +61 -67
- data/lib/active_scaffold/bridges/dragonfly.rb +4 -4
- data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +9 -8
- data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +11 -10
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +6 -5
- data/lib/active_scaffold/bridges/file_column.rb +5 -5
- data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +20 -23
- data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +20 -23
- data/lib/active_scaffold/bridges/file_column/form_ui.rb +13 -14
- data/lib/active_scaffold/bridges/file_column/list_ui.rb +7 -8
- data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +18 -22
- data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +5 -4
- data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +2 -10
- data/lib/active_scaffold/bridges/paper_trail.rb +7 -5
- data/lib/active_scaffold/bridges/paper_trail/paper_trail_bridge.rb +4 -3
- data/lib/active_scaffold/bridges/paperclip.rb +5 -5
- data/lib/active_scaffold/bridges/paperclip/form_ui.rb +11 -10
- data/lib/active_scaffold/bridges/paperclip/list_ui.rb +6 -5
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +10 -9
- data/lib/active_scaffold/bridges/record_select.rb +1 -1
- data/lib/active_scaffold/bridges/record_select/helpers.rb +28 -28
- data/lib/active_scaffold/bridges/semantic_attributes.rb +1 -1
- data/lib/active_scaffold/bridges/semantic_attributes/column.rb +1 -1
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +58 -52
- data/lib/active_scaffold/bridges/tiny_mce.rb +2 -2
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +3 -3
- data/lib/active_scaffold/config/base.rb +9 -10
- data/lib/active_scaffold/config/core.rb +24 -29
- data/lib/active_scaffold/config/create.rb +0 -1
- data/lib/active_scaffold/config/field_search.rb +8 -10
- data/lib/active_scaffold/config/form.rb +5 -5
- data/lib/active_scaffold/config/list.rb +21 -20
- data/lib/active_scaffold/config/mark.rb +3 -3
- data/lib/active_scaffold/config/nested.rb +11 -10
- data/lib/active_scaffold/config/search.rb +2 -3
- data/lib/active_scaffold/config/show.rb +1 -1
- data/lib/active_scaffold/config/update.rb +1 -2
- data/lib/active_scaffold/configurable.rb +9 -11
- data/lib/active_scaffold/constraints.rb +9 -8
- data/lib/active_scaffold/core.rb +72 -84
- data/lib/active_scaffold/data_structures/action_columns.rb +26 -25
- data/lib/active_scaffold/data_structures/action_link.rb +43 -43
- data/lib/active_scaffold/data_structures/action_links.rb +17 -15
- data/lib/active_scaffold/data_structures/actions.rb +5 -5
- data/lib/active_scaffold/data_structures/bridge.rb +6 -3
- data/lib/active_scaffold/data_structures/column.rb +110 -89
- data/lib/active_scaffold/data_structures/columns.rb +3 -3
- data/lib/active_scaffold/data_structures/error_message.rb +4 -6
- data/lib/active_scaffold/data_structures/nested_info.rb +43 -48
- data/lib/active_scaffold/data_structures/set.rb +7 -8
- data/lib/active_scaffold/data_structures/sorting.rb +38 -33
- data/lib/active_scaffold/delayed_setup.rb +5 -6
- data/lib/active_scaffold/engine.rb +4 -4
- data/lib/active_scaffold/extensions/action_controller_rendering.rb +3 -4
- data/lib/active_scaffold/extensions/action_controller_rescueing.rb +1 -1
- data/lib/active_scaffold/extensions/action_view_rendering.rb +5 -6
- data/lib/active_scaffold/extensions/left_outer_joins.rb +11 -11
- data/lib/active_scaffold/extensions/localize.rb +1 -1
- data/lib/active_scaffold/extensions/name_option_for_datetime.rb +1 -1
- data/lib/active_scaffold/extensions/paginator_extensions.rb +2 -5
- data/lib/active_scaffold/extensions/reverse_associations.rb +13 -13
- data/lib/active_scaffold/extensions/routing_mapper.rb +9 -9
- data/lib/active_scaffold/extensions/unsaved_associated.rb +9 -9
- data/lib/active_scaffold/finder.rb +90 -93
- data/lib/active_scaffold/helpers/association_helpers.rb +5 -5
- data/lib/active_scaffold/helpers/controller_helpers.rb +22 -19
- data/lib/active_scaffold/helpers/form_column_helpers.rb +115 -105
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +62 -35
- data/lib/active_scaffold/helpers/id_helpers.rb +6 -6
- data/lib/active_scaffold/helpers/list_column_helpers.rb +89 -94
- data/lib/active_scaffold/helpers/pagination_helpers.rb +9 -9
- data/lib/active_scaffold/helpers/search_column_helpers.rb +47 -44
- data/lib/active_scaffold/helpers/show_column_helpers.rb +2 -2
- data/lib/active_scaffold/helpers/view_helpers.rb +86 -91
- data/lib/active_scaffold/marked_model.rb +10 -10
- data/lib/active_scaffold/paginator.rb +30 -34
- data/lib/active_scaffold/responds_to_parent.rb +27 -28
- data/lib/active_scaffold/tableless.rb +20 -15
- data/lib/active_scaffold/version.rb +1 -1
- data/lib/generators/active_scaffold/active_scaffold_generator.rb +8 -8
- data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +9 -9
- data/shoulda_macros/macros.rb +27 -22
- data/test/bridges/bridge_test.rb +38 -29
- data/test/bridges/date_picker_test.rb +1 -1
- data/test/bridges/paper_trail_test.rb +17 -0
- data/test/bridges/paperclip_test.rb +3 -2
- data/test/bridges/tiny_mce_test.rb +5 -2
- data/test/company.rb +25 -30
- data/test/config/base_test.rb +1 -1
- data/test/config/core_test.rb +9 -9
- data/test/config/create_test.rb +14 -8
- data/test/config/delete_test.rb +4 -4
- data/test/config/field_search_test.rb +6 -6
- data/test/config/list_test.rb +16 -16
- data/test/config/nested_test.rb +4 -4
- data/test/config/search_test.rb +8 -8
- data/test/config/show_test.rb +6 -6
- data/test/config/subform_test.rb +1 -1
- data/test/config/update_test.rb +5 -5
- data/test/const_mocker.rb +4 -4
- data/test/data_structures/action_columns_test.rb +4 -5
- data/test/data_structures/action_link_test.rb +1 -0
- data/test/data_structures/action_links_test.rb +5 -5
- data/test/data_structures/column_test.rb +9 -9
- data/test/data_structures/columns_test.rb +2 -2
- data/test/data_structures/error_message_test.rb +4 -5
- data/test/data_structures/set_test.rb +1 -2
- data/test/data_structures/sorting_test.rb +10 -10
- data/test/data_structures/validation_reflection_test.rb +8 -0
- data/test/extensions/routing_mapper_test.rb +2 -2
- data/test/helpers/list_column_helpers_test.rb +3 -2
- data/test/helpers/pagination_helpers_test.rb +5 -4
- data/test/helpers/search_column_helpers_test.rb +1 -1
- data/test/misc/active_record_permissions_test.rb +63 -50
- data/test/misc/attribute_params_test.rb +28 -26
- data/test/misc/calculation_test.rb +10 -3
- data/test/misc/configurable_test.rb +12 -13
- data/test/misc/constraints_test.rb +6 -6
- data/test/misc/convert_numbers_format_test.rb +7 -6
- data/test/misc/finder_test.rb +17 -12
- data/test/misc/lang_test.rb +3 -4
- data/test/misc/tableless_test.rb +2 -3
- data/test/mock_app/app/controllers/addresses_controller.rb +1 -1
- data/test/mock_app/app/controllers/buildings_controller.rb +1 -1
- data/test/mock_app/app/controllers/cars_controller.rb +1 -1
- data/test/mock_app/app/controllers/contacts_controller.rb +1 -1
- data/test/mock_app/app/controllers/people_controller.rb +1 -1
- data/test/mock_app/app/models/file_model.rb +2 -2
- data/test/mock_app/app/models/person.rb +1 -1
- data/test/mock_app/config/application.rb +3 -3
- data/test/mock_app/config/boot.rb +1 -1
- data/test/mock_app/config/environment.rb +1 -0
- data/test/mock_app/config/environments/development.rb +0 -1
- data/test/mock_app/config/environments/production.rb +1 -1
- data/test/mock_app/db/schema.rb +14 -15
- data/test/model_stub.rb +13 -16
- data/test/run_all.rb +5 -7
- data/test/test_helper.rb +12 -9
- metadata +19 -3
|
@@ -2,49 +2,76 @@ module ActiveScaffold
|
|
|
2
2
|
module Helpers
|
|
3
3
|
# Helpers that assist with rendering of a human readable search statement
|
|
4
4
|
module HumanConditionHelpers
|
|
5
|
-
|
|
6
5
|
def active_scaffold_human_condition_for(column)
|
|
7
|
-
value = field_search_params[column.name]
|
|
6
|
+
return if (value = field_search_params[column.name]).nil?
|
|
8
7
|
search_ui = column.search_ui
|
|
9
8
|
search_ui ||= column.column.type if column.column
|
|
10
9
|
if override_human_condition_column?(column)
|
|
11
10
|
send(override_human_condition_column(column), value, {})
|
|
12
|
-
elsif search_ui
|
|
13
|
-
send(override_human_condition(
|
|
11
|
+
elsif search_ui && override_human_condition?(search_ui)
|
|
12
|
+
send(override_human_condition(search_ui), column, value)
|
|
14
13
|
else
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
14
|
+
logger.warn "undefined active_scaffold_human_condition method for search_ui #{search_ui} on column #{column.name}"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def format_human_condition(column, opt, from = nil, to = nil)
|
|
19
|
+
attribute = column.active_record_class.human_attribute_name(column.name)
|
|
20
|
+
"#{attribute} #{as_(opt).downcase} #{from} #{to}"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def active_scaffold_human_condition_integer(column, value)
|
|
24
|
+
from = format_number_value(controller.class.condition_value_for_numeric(column, value[:from]), column.options) if value[:from].present?
|
|
25
|
+
to = "- #{format_number_value(controller.class.condition_value_for_numeric(column, value[:to]), column.options)}" if value[:opt] == 'BETWEEN'
|
|
26
|
+
format_human_condition column, value[:opt].downcase, from, to
|
|
27
|
+
end
|
|
28
|
+
alias_method :active_scaffold_human_condition_decimal, :active_scaffold_human_condition_integer
|
|
29
|
+
alias_method :active_scaffold_human_condition_float, :active_scaffold_human_condition_integer
|
|
30
|
+
|
|
31
|
+
def active_scaffold_human_condition_string(column, value)
|
|
32
|
+
opt = ActiveScaffold::Finder::STRING_COMPARATORS.index(value[:opt]) || value[:opt]
|
|
33
|
+
to = "- #{value[:to]}" if opt == 'BETWEEN'
|
|
34
|
+
format_human_condition column, opt, "'#{value[:from]}'", to
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def active_scaffold_human_condition_date(column, value)
|
|
38
|
+
conversion = column.column.type == :date ? :to_date : :to_time
|
|
39
|
+
from = I18n.l controller.condition_value_for_datetime(column, value[:from], conversion)
|
|
40
|
+
to = "- #{I18n.l controller.condition_value_for_datetime(column, value[:to], conversion)}" if value[:opt] == 'BETWEEN'
|
|
41
|
+
format_human_condition column, value[:opt], from, to
|
|
42
|
+
end
|
|
43
|
+
alias_method :active_scaffold_human_condition_time, :active_scaffold_human_condition_date
|
|
44
|
+
alias_method :active_scaffold_human_condition_datetime, :active_scaffold_human_condition_date
|
|
45
|
+
alias_method :active_scaffold_human_condition_timestamp, :active_scaffold_human_condition_date
|
|
46
|
+
|
|
47
|
+
def active_scaffold_human_condition_boolean(column, value)
|
|
48
|
+
attribute = column.active_record_class.human_attribute_name(column.name)
|
|
49
|
+
label = as_(ActiveScaffold::Core.column_type_cast(value, column.column) ? :true : :false)
|
|
50
|
+
as_(:boolean, :scope => :human_conditions, :column => attribute, :value => label)
|
|
51
|
+
end
|
|
52
|
+
alias_method :active_scaffold_human_condition_checkbox, :active_scaffold_human_condition_boolean
|
|
53
|
+
|
|
54
|
+
def active_scaffold_human_condition_null(column, value)
|
|
55
|
+
format_human_condition column, value.to_sym
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def active_scaffold_human_condition_select(column, associated)
|
|
59
|
+
attribute = column.active_record_class.human_attribute_name(column.name)
|
|
60
|
+
associated = [associated].compact unless associated.is_a? Array
|
|
61
|
+
if column.association
|
|
62
|
+
method = column.options[:label_method] || :to_label
|
|
63
|
+
associated = column.association.klass.where(:id => associated.map(&:to_i)).map(&method)
|
|
64
|
+
elsif column.options[:options]
|
|
65
|
+
associated = associated.collect do |value|
|
|
66
|
+
text, val = column.options[:options].find { |text, val| (val.nil? ? text : val).to_s == value.to_s }
|
|
67
|
+
value = active_scaffold_translated_option(column, text, val).first if text
|
|
68
|
+
value
|
|
45
69
|
end
|
|
46
|
-
end
|
|
70
|
+
end
|
|
71
|
+
as_(:association, :scope => :human_conditions, :column => attribute, :value => associated.join(', '))
|
|
47
72
|
end
|
|
73
|
+
alias_method :active_scaffold_human_condition_multi_select, :active_scaffold_human_condition_select
|
|
74
|
+
alias_method :active_scaffold_human_condition_record_select, :active_scaffold_human_condition_select
|
|
48
75
|
|
|
49
76
|
# the naming convention for overriding form fields with helpers
|
|
50
77
|
def override_human_condition_column(column)
|
|
@@ -3,11 +3,11 @@ module ActiveScaffold
|
|
|
3
3
|
# A bunch of helper methods to produce the common view ids
|
|
4
4
|
module IdHelpers
|
|
5
5
|
def id_from_controller(controller)
|
|
6
|
-
controller.to_s.gsub(
|
|
6
|
+
controller.to_s.gsub('/', '__').html_safe
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
def controller_id(controller = (params[:eid] || nested_id || params[:parent_controller] || params[:controller]))
|
|
10
|
-
|
|
10
|
+
'as_' + id_from_controller(controller)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def nested_parent_id
|
|
@@ -50,7 +50,7 @@ module ActiveScaffold
|
|
|
50
50
|
"#{controller_id}-search-input"
|
|
51
51
|
end
|
|
52
52
|
|
|
53
|
-
def action_link_id(link_action,link_id)
|
|
53
|
+
def action_link_id(link_action, link_id)
|
|
54
54
|
"#{controller_id}-#{link_action}-#{link_id}-link"
|
|
55
55
|
end
|
|
56
56
|
|
|
@@ -92,7 +92,7 @@ module ActiveScaffold
|
|
|
92
92
|
options[:id] ||= nested_parent_id if nested?
|
|
93
93
|
clean_id "#{controller_id}-#{options[:action]}-#{options[:id]}-loading-indicator"
|
|
94
94
|
end
|
|
95
|
-
|
|
95
|
+
|
|
96
96
|
def sub_section_id(options = {})
|
|
97
97
|
options[:id] ||= params[:id]
|
|
98
98
|
options[:id] ||= nested_parent_id if nested?
|
|
@@ -104,7 +104,7 @@ module ActiveScaffold
|
|
|
104
104
|
options[:id] ||= nested_parent_id if nested?
|
|
105
105
|
clean_id "#{controller_id}-#{options[:id]}-#{options[:association]}-subform"
|
|
106
106
|
end
|
|
107
|
-
|
|
107
|
+
|
|
108
108
|
def sub_form_list_id(options = {})
|
|
109
109
|
options[:id] ||= params[:id]
|
|
110
110
|
options[:id] ||= nested_parent_id if nested?
|
|
@@ -121,7 +121,7 @@ module ActiveScaffold
|
|
|
121
121
|
def action_iframe_id(options)
|
|
122
122
|
"#{controller_id}-#{options[:action]}-#{options[:id]}-iframe"
|
|
123
123
|
end
|
|
124
|
-
|
|
124
|
+
|
|
125
125
|
def scope_id(scope)
|
|
126
126
|
scope.gsub(/(\[|\])/, '_').gsub('__', '_').gsub(/_$/, '')
|
|
127
127
|
end
|
|
@@ -4,59 +4,51 @@ module ActiveScaffold
|
|
|
4
4
|
# Helpers that assist with the rendering of a List Column
|
|
5
5
|
module ListColumnHelpers
|
|
6
6
|
def get_column_value(record, column)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
raise e
|
|
15
|
-
end
|
|
7
|
+
method = get_column_method(record, column)
|
|
8
|
+
value = send(method, record, column)
|
|
9
|
+
value = ' '.html_safe if value.nil? || value.blank? # fix for IE 6
|
|
10
|
+
return value
|
|
11
|
+
rescue StandardError => e
|
|
12
|
+
logger.error "#{e.class.name}: #{e.message} -- on the ActiveScaffold column = :#{column.name} in #{controller.class}, record: #{record.inspect}"
|
|
13
|
+
raise e
|
|
16
14
|
end
|
|
17
15
|
|
|
18
|
-
|
|
19
16
|
def get_column_method(record, column)
|
|
20
17
|
# check for an override helper
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
method = if (method = column_override(column))
|
|
18
|
+
column.list_method ||= begin
|
|
19
|
+
if (method = column_override(column))
|
|
24
20
|
# we only pass the record as the argument. we previously also passed the formatted_value,
|
|
25
21
|
# but mike perham pointed out that prohibited the usage of overrides to improve on the
|
|
26
22
|
# performance of our default formatting. see issue #138.
|
|
27
23
|
method
|
|
28
24
|
# second, check if the dev has specified a valid list_ui for this column
|
|
29
|
-
elsif column.list_ui
|
|
25
|
+
elsif column.list_ui && (method = override_column_ui(column.list_ui))
|
|
30
26
|
method
|
|
31
|
-
elsif column.column
|
|
27
|
+
elsif column.column && (method = override_column_ui(column.column.type))
|
|
32
28
|
method
|
|
33
29
|
else
|
|
34
30
|
:format_column_value
|
|
35
31
|
end
|
|
36
|
-
column.list_method = method
|
|
37
32
|
end
|
|
38
|
-
method
|
|
39
33
|
end
|
|
40
34
|
|
|
41
35
|
# TODO: move empty_field_text and logic in here?
|
|
42
36
|
# TODO: we need to distinguish between the automatic links *we* create and the ones that the dev specified. some logic may not apply if the dev specified the link.
|
|
43
37
|
def render_list_column(text, column, record)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
text
|
|
55
|
-
end
|
|
56
|
-
rescue Exception => e
|
|
57
|
-
logger.error "#{e.class.name}: #{e.message} -- on the ActiveScaffold column = :#{column.name} in #{controller.class}"
|
|
58
|
-
raise e
|
|
38
|
+
if column.link && !skip_action_link?(column.link, record)
|
|
39
|
+
link = column.link
|
|
40
|
+
associated = record.send(column.association.name) if column.association
|
|
41
|
+
render_action_link(link, record, :link => text, :authorized => link.action.nil? || column_link_authorized?(link, column, record, associated))
|
|
42
|
+
elsif inplace_edit?(record, column)
|
|
43
|
+
active_scaffold_inplace_edit(record, column, :formatted_column => text)
|
|
44
|
+
elsif active_scaffold_config.actions.include?(:list) && active_scaffold_config.list.wrap_tag
|
|
45
|
+
content_tag active_scaffold_config.list.wrap_tag, text
|
|
46
|
+
else
|
|
47
|
+
text
|
|
59
48
|
end
|
|
49
|
+
rescue StandardError => e
|
|
50
|
+
logger.error "#{e.class.name}: #{e.message} -- on the ActiveScaffold column = :#{column.name} in #{controller.class}"
|
|
51
|
+
raise e
|
|
60
52
|
end
|
|
61
53
|
|
|
62
54
|
# There are two basic ways to clean a column's value: h() and sanitize(). The latter is useful
|
|
@@ -114,7 +106,7 @@ module ActiveScaffold
|
|
|
114
106
|
value ||= record.send(column.name) unless record.nil?
|
|
115
107
|
if column.association.nil?
|
|
116
108
|
if column.form_ui == :select && column.options[:options]
|
|
117
|
-
text, val = column.options[:options].find {|text, val| (val.nil? ? text : val).to_s == value.to_s}
|
|
109
|
+
text, val = column.options[:options].find { |text, val| (val.nil? ? text : val).to_s == value.to_s }
|
|
118
110
|
value = active_scaffold_translated_option(column, text, val).first if text
|
|
119
111
|
end
|
|
120
112
|
if value.is_a? Numeric
|
|
@@ -147,43 +139,51 @@ module ActiveScaffold
|
|
|
147
139
|
clean_column_value(value)
|
|
148
140
|
end
|
|
149
141
|
|
|
142
|
+
def format_collection_association_value(value, column, label_method, size)
|
|
143
|
+
if column.associated_limit.nil?
|
|
144
|
+
firsts = value.collect(&label_method)
|
|
145
|
+
elsif column.associated_limit == 0
|
|
146
|
+
size if column.associated_number?
|
|
147
|
+
else
|
|
148
|
+
firsts = value.first(column.associated_limit)
|
|
149
|
+
firsts.collect!(&label_method)
|
|
150
|
+
firsts << '…' if value.size > column.associated_limit
|
|
151
|
+
text = firsts.join(h(active_scaffold_config.list.association_join_text)).html_safe
|
|
152
|
+
text << " (#{size})" if column.associated_number? && column.associated_limit && value.size > column.associated_limit
|
|
153
|
+
text
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def format_singular_association_value(value, column, label_method)
|
|
158
|
+
if column.polymorphic_association?
|
|
159
|
+
"#{value.class.model_name.human}: #{value.send(label_method)}"
|
|
160
|
+
else
|
|
161
|
+
value.send(label_method)
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
150
165
|
def format_association_value(value, column, size)
|
|
151
166
|
method = column.options[:label_method] || :to_label
|
|
152
|
-
value =
|
|
153
|
-
if column.
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
firsts.collect!(&method)
|
|
158
|
-
firsts[column.associated_limit] = '…' if value.size > column.associated_limit
|
|
167
|
+
value =
|
|
168
|
+
if column.association.collection?
|
|
169
|
+
format_collection_association_value(value, column, method, size)
|
|
170
|
+
elsif value
|
|
171
|
+
format_singular_association_value(value, column, method)
|
|
159
172
|
end
|
|
160
|
-
if column.associated_limit == 0
|
|
161
|
-
size if column.associated_number?
|
|
162
|
-
else
|
|
163
|
-
joined_associated = firsts.join(h(active_scaffold_config.list.association_join_text)).html_safe
|
|
164
|
-
joined_associated << " (#{size})" if column.associated_number? and column.associated_limit and value.size > column.associated_limit
|
|
165
|
-
joined_associated
|
|
166
|
-
end
|
|
167
|
-
elsif value
|
|
168
|
-
if column.polymorphic_association?
|
|
169
|
-
"#{value.class.model_name.human}: #{value.send(method)}"
|
|
170
|
-
else
|
|
171
|
-
value.send(method)
|
|
172
|
-
end
|
|
173
|
-
end
|
|
174
173
|
format_value value
|
|
175
174
|
end
|
|
176
175
|
|
|
177
176
|
def format_value(column_value, options = {})
|
|
178
|
-
value =
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
177
|
+
value =
|
|
178
|
+
if column_empty?(column_value)
|
|
179
|
+
empty_field_text
|
|
180
|
+
elsif column_value.is_a?(Time) || column_value.is_a?(Date)
|
|
181
|
+
l(column_value, :format => options[:format] || :default)
|
|
182
|
+
elsif [FalseClass, TrueClass].include?(column_value.class)
|
|
183
|
+
as_(column_value.to_s.to_sym)
|
|
184
|
+
else
|
|
185
|
+
column_value.to_s
|
|
186
|
+
end
|
|
187
187
|
clean_column_value(value)
|
|
188
188
|
end
|
|
189
189
|
|
|
@@ -204,19 +204,18 @@ module ActiveScaffold
|
|
|
204
204
|
# ==========
|
|
205
205
|
|
|
206
206
|
def inplace_edit?(record, column)
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
end
|
|
207
|
+
return unless column.inplace_edit
|
|
208
|
+
editable = controller.send(:update_authorized?, record) if controller.respond_to?(:update_authorized?, true)
|
|
209
|
+
editable || record.authorized_for?(:crud_type => :update, :column => column.name)
|
|
211
210
|
end
|
|
212
211
|
|
|
213
212
|
def inplace_edit_cloning?(column)
|
|
214
|
-
|
|
213
|
+
column.inplace_edit != :ajax && (override_form_field?(column) || column.form_ui || (column.column && override_input?(column.column.type)))
|
|
215
214
|
end
|
|
216
215
|
|
|
217
216
|
def active_scaffold_inplace_edit_tag_options(record, column)
|
|
218
217
|
id_options = {:id => record.id.to_s, :action => 'update_column', :name => column.name.to_s}
|
|
219
|
-
tag_options = {:id => element_cell_id(id_options), :class =>
|
|
218
|
+
tag_options = {:id => element_cell_id(id_options), :class => 'in_place_editor_field',
|
|
220
219
|
:title => as_(:click_to_edit), :data => {:ie_id => record.to_param}}
|
|
221
220
|
tag_options[:data][:ie_update] = column.inplace_edit if column.inplace_edit != true
|
|
222
221
|
tag_options
|
|
@@ -225,32 +224,31 @@ module ActiveScaffold
|
|
|
225
224
|
def active_scaffold_inplace_edit(record, column, options = {})
|
|
226
225
|
formatted_column = options[:formatted_column] || format_column_value(record, column)
|
|
227
226
|
content_tag(:span, as_(:inplace_edit_handle), :class => 'handle') <<
|
|
228
|
-
|
|
227
|
+
content_tag(:span, formatted_column, active_scaffold_inplace_edit_tag_options(record, column))
|
|
229
228
|
end
|
|
230
229
|
|
|
231
230
|
def inplace_edit_control(column)
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
end
|
|
231
|
+
return unless inplace_edit?(active_scaffold_config.model, column) && inplace_edit_cloning?(column)
|
|
232
|
+
old_record, @record = @record, active_scaffold_config.model.new # TODO: remove when relying on @record is removed
|
|
233
|
+
column = column.clone
|
|
234
|
+
column.options = column.options.clone
|
|
235
|
+
column.form_ui = :select if column.association && column.form_ui.nil?
|
|
236
|
+
options = active_scaffold_input_options(column).merge(:object => active_scaffold_config.model.new)
|
|
237
|
+
options[:class] = "#{options[:class]} inplace_field"
|
|
238
|
+
options[:"data-id"] = options[:id]
|
|
239
|
+
options[:id] = nil
|
|
240
|
+
content_tag(:div, active_scaffold_input_for(column, nil, options), :style => 'display:none;', :class => inplace_edit_control_css_class).tap do
|
|
241
|
+
@record = old_record # TODO: remove when relying on @record is removed
|
|
244
242
|
end
|
|
245
243
|
end
|
|
246
244
|
|
|
247
245
|
def inplace_edit_control_css_class
|
|
248
|
-
|
|
246
|
+
'as_inplace_pattern'
|
|
249
247
|
end
|
|
250
248
|
|
|
251
249
|
def inplace_edit_data(column)
|
|
252
250
|
data = {}
|
|
253
|
-
data[:ie_url] = url_for(params_for(:action =>
|
|
251
|
+
data[:ie_url] = url_for(params_for(:action => 'update_column', :column => column.name, :id => '__id__'))
|
|
254
252
|
data[:ie_cancel_text] = column.options[:cancel_text] || as_(:cancel)
|
|
255
253
|
data[:ie_loading_text] = column.options[:loading_text] || as_(:loading)
|
|
256
254
|
data[:ie_save_text] = column.options[:save_text] || as_(:update)
|
|
@@ -275,22 +273,22 @@ module ActiveScaffold
|
|
|
275
273
|
|
|
276
274
|
def all_marked?
|
|
277
275
|
if active_scaffold_config.mark.mark_all_mode == :page
|
|
278
|
-
|
|
276
|
+
@page.items.detect { |record| !marked_records.include?(record.id) }.nil?
|
|
279
277
|
else
|
|
280
|
-
|
|
278
|
+
marked_records.length >= @page.pager.count.to_i
|
|
281
279
|
end
|
|
282
280
|
end
|
|
283
281
|
|
|
284
282
|
def mark_column_heading
|
|
285
283
|
tag_options = {
|
|
286
284
|
:id => "#{controller_id}_mark_heading",
|
|
287
|
-
:class =>
|
|
285
|
+
:class => 'mark_heading in_place_editor_field'
|
|
288
286
|
}
|
|
289
287
|
content_tag(:span, check_box_tag("#{controller_id}_mark_heading_span_input", '1', all_marked?), tag_options)
|
|
290
288
|
end
|
|
291
289
|
|
|
292
290
|
def column_heading_attributes(column, sorting, sort_direction)
|
|
293
|
-
|
|
291
|
+
{:id => active_scaffold_column_header_id(column), :class => column_heading_class(column, sorting), :title => strip_tags(column.description).presence}
|
|
294
292
|
end
|
|
295
293
|
|
|
296
294
|
def render_column_heading(column, sorting, sort_direction)
|
|
@@ -306,16 +304,15 @@ module ActiveScaffold
|
|
|
306
304
|
content_tag(:th, column_heading_value(column, sorting, sort_direction) + inplace_edit_control(column), tag_options)
|
|
307
305
|
end
|
|
308
306
|
|
|
309
|
-
|
|
310
307
|
def column_heading_value(column, sorting, sort_direction)
|
|
311
308
|
if column.name == :as_marked
|
|
312
309
|
mark_column_heading
|
|
313
310
|
elsif column.sortable?
|
|
314
|
-
options = {:id => nil, :class =>
|
|
311
|
+
options = {:id => nil, :class => 'as_sort',
|
|
315
312
|
'data-page-history' => controller_id,
|
|
316
313
|
:remote => true, :method => :get}
|
|
317
314
|
url_options = params_for(:action => :index, :page => 1,
|
|
318
|
-
|
|
315
|
+
:sort => column.name, :sort_direction => sort_direction)
|
|
319
316
|
unless active_scaffold_config.store_user_settings
|
|
320
317
|
url_options.merge!(:search => search_params) if search_params.present?
|
|
321
318
|
end
|
|
@@ -324,12 +321,10 @@ module ActiveScaffold
|
|
|
324
321
|
content_tag(:p, column_heading_label(column))
|
|
325
322
|
end
|
|
326
323
|
end
|
|
327
|
-
|
|
324
|
+
|
|
328
325
|
def column_heading_label(column)
|
|
329
326
|
column.label
|
|
330
327
|
end
|
|
331
|
-
|
|
332
328
|
end
|
|
333
329
|
end
|
|
334
330
|
end
|
|
335
|
-
|