active_scaffold 3.4.17 → 3.4.18
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
|