active_scaffold 3.6.0.pre → 3.6.0.rc1

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.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/{CHANGELOG → CHANGELOG.rdoc} +39 -0
  3. data/app/assets/javascripts/active_scaffold.js.erb +0 -1
  4. data/app/assets/javascripts/jquery/active_scaffold.js +35 -4
  5. data/app/assets/stylesheets/active_scaffold_colors.scss +1 -1
  6. data/app/assets/stylesheets/active_scaffold_layout.css +52 -29
  7. data/app/views/active_scaffold_overrides/_list_header.html.erb +5 -7
  8. data/app/views/active_scaffold_overrides/_list_record.html.erb +4 -5
  9. data/app/views/active_scaffold_overrides/_list_with_header.html.erb +1 -1
  10. data/app/views/active_scaffold_overrides/_refresh_list.js.erb +4 -0
  11. data/config/locales/de.yml +2 -1
  12. data/config/locales/en.yml +1 -0
  13. data/config/locales/es.yml +1 -0
  14. data/config/locales/fr.yml +2 -1
  15. data/config/locales/hu.yml +1 -0
  16. data/config/locales/ja.yml +1 -0
  17. data/config/locales/ru.yml +1 -0
  18. data/lib/active_scaffold.rb +8 -3
  19. data/lib/active_scaffold/actions/common_search.rb +11 -8
  20. data/lib/active_scaffold/actions/core.rb +79 -51
  21. data/lib/active_scaffold/actions/create.rb +27 -27
  22. data/lib/active_scaffold/actions/delete.rb +1 -1
  23. data/lib/active_scaffold/actions/field_search.rb +52 -42
  24. data/lib/active_scaffold/actions/list.rb +106 -23
  25. data/lib/active_scaffold/actions/nested.rb +59 -42
  26. data/lib/active_scaffold/actions/show.rb +3 -3
  27. data/lib/active_scaffold/actions/subform.rb +9 -16
  28. data/lib/active_scaffold/actions/update.rb +95 -77
  29. data/lib/active_scaffold/attribute_params.rb +93 -68
  30. data/lib/active_scaffold/bridges/active_storage.rb +6 -0
  31. data/lib/active_scaffold/bridges/active_storage/active_storage_bridge.rb +33 -0
  32. data/lib/active_scaffold/bridges/active_storage/active_storage_helpers.rb +54 -0
  33. data/lib/active_scaffold/bridges/active_storage/form_ui.rb +22 -0
  34. data/lib/active_scaffold/bridges/active_storage/list_ui.rb +36 -0
  35. data/lib/active_scaffold/bridges/bitfields.rb +1 -0
  36. data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +12 -15
  37. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +6 -0
  38. data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +2 -2
  39. data/lib/active_scaffold/bridges/date_picker/helper.rb +46 -41
  40. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +1 -1
  41. data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +2 -2
  42. data/lib/active_scaffold/bridges/file_column/form_ui.rb +3 -3
  43. data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +3 -1
  44. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +2 -2
  45. data/lib/active_scaffold/bridges/record_select/helpers.rb +3 -7
  46. data/lib/active_scaffold/bridges/shared/date_bridge.rb +19 -18
  47. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +3 -1
  48. data/lib/active_scaffold/bridges/usa_state_select/usa_state_select_helper.rb +20 -3
  49. data/lib/active_scaffold/config/base.rb +58 -34
  50. data/lib/active_scaffold/config/core.rb +31 -12
  51. data/lib/active_scaffold/config/delete.rb +12 -1
  52. data/lib/active_scaffold/config/list.rb +17 -7
  53. data/lib/active_scaffold/config/mark.rb +1 -1
  54. data/lib/active_scaffold/configurable.rb +5 -3
  55. data/lib/active_scaffold/constraints.rb +21 -19
  56. data/lib/active_scaffold/core.rb +35 -26
  57. data/lib/active_scaffold/data_structures/action_columns.rb +1 -1
  58. data/lib/active_scaffold/data_structures/action_link.rb +34 -16
  59. data/lib/active_scaffold/data_structures/action_links.rb +9 -11
  60. data/lib/active_scaffold/data_structures/association/abstract.rb +35 -13
  61. data/lib/active_scaffold/data_structures/association/active_mongoid.rb +2 -6
  62. data/lib/active_scaffold/data_structures/association/active_record.rb +5 -1
  63. data/lib/active_scaffold/data_structures/association/mongoid.rb +0 -3
  64. data/lib/active_scaffold/data_structures/column.rb +49 -58
  65. data/lib/active_scaffold/data_structures/columns.rb +3 -2
  66. data/lib/active_scaffold/data_structures/nested_info.rb +20 -18
  67. data/lib/active_scaffold/data_structures/sorting.rb +5 -0
  68. data/lib/active_scaffold/delayed_setup.rb +16 -6
  69. data/lib/active_scaffold/extensions/action_controller_rendering.rb +1 -1
  70. data/lib/active_scaffold/extensions/action_view_rendering.rb +34 -14
  71. data/lib/active_scaffold/extensions/cow_proxy.rb +50 -2
  72. data/lib/active_scaffold/extensions/localize.rb +3 -1
  73. data/lib/active_scaffold/extensions/routing_mapper.rb +2 -2
  74. data/lib/active_scaffold/extensions/to_label.rb +3 -2
  75. data/lib/active_scaffold/finder.rb +81 -46
  76. data/lib/active_scaffold/helpers/action_link_helpers.rb +47 -21
  77. data/lib/active_scaffold/helpers/association_helpers.rb +13 -11
  78. data/lib/active_scaffold/helpers/controller_helpers.rb +14 -11
  79. data/lib/active_scaffold/helpers/form_column_helpers.rb +133 -99
  80. data/lib/active_scaffold/helpers/human_condition_helpers.rb +1 -1
  81. data/lib/active_scaffold/helpers/id_helpers.rb +4 -0
  82. data/lib/active_scaffold/helpers/list_column_helpers.rb +76 -49
  83. data/lib/active_scaffold/helpers/pagination_helpers.rb +2 -2
  84. data/lib/active_scaffold/helpers/search_column_helpers.rb +25 -30
  85. data/lib/active_scaffold/helpers/show_column_helpers.rb +3 -5
  86. data/lib/active_scaffold/helpers/view_helpers.rb +31 -22
  87. data/lib/active_scaffold/orm_checks.rb +2 -2
  88. data/lib/active_scaffold/paginator.rb +1 -3
  89. data/lib/active_scaffold/registry.rb +11 -0
  90. data/lib/active_scaffold/responds_to_parent.rb +6 -5
  91. data/lib/active_scaffold/tableless.rb +6 -8
  92. data/lib/active_scaffold/version.rb +1 -1
  93. data/shoulda_macros/macros.rb +3 -1
  94. data/test/bridges/paperclip_test.rb +1 -1
  95. data/test/company.rb +2 -2
  96. data/test/data_structures/action_columns_test.rb +2 -2
  97. data/test/data_structures/column_test.rb +3 -6
  98. data/test/data_structures/columns_test.rb +2 -2
  99. data/test/extensions/active_record_test.rb +4 -4
  100. data/test/extensions/routing_mapper_test.rb +2 -2
  101. data/test/helpers/list_column_helpers_test.rb +3 -1
  102. data/test/misc/active_record_permissions_test.rb +2 -2
  103. data/test/misc/attribute_params_test.rb +4 -0
  104. data/test/misc/configurable_test.rb +10 -10
  105. data/test/misc/convert_numbers_format_test.rb +4 -0
  106. data/test/mock_app/app/assets/config/manifest.js +0 -0
  107. data/test/mock_app/app/controllers/cars_controller.rb +1 -0
  108. data/test/mock_app/app/controllers/people_controller.rb +3 -1
  109. data/test/mock_app/config/application.rb +1 -0
  110. data/test/mock_app/config/routes.rb +4 -1
  111. data/test/mock_app/db/schema.rb +2 -0
  112. data/test/performance/list_cars_performance_test.rb +34 -0
  113. data/test/performance/list_people_performance_test.rb +31 -0
  114. data/test/performance_test_help.rb +3 -0
  115. data/test/test_helper.rb +2 -1
  116. metadata +22 -12
  117. data/app/assets/javascripts/prototype/rico_corner.js +0 -370
  118. data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +0 -5
@@ -0,0 +1,6 @@
1
+ class ActiveScaffold::Bridges::ActiveStorage < ActiveScaffold::DataStructures::Bridge
2
+ def self.install
3
+ Dir[File.join(__dir__, 'active_storage', '*.rb')].each { |file| require file }
4
+ ActiveScaffold::Config::Core.send :prepend, ActiveScaffold::Bridges::ActiveStorage::ActiveStorageBridge
5
+ end
6
+ end
@@ -0,0 +1,33 @@
1
+ module ActiveScaffold
2
+ module Bridges
3
+ class ActiveStorage
4
+ module ActiveStorageBridge
5
+ def initialize(model_id)
6
+ super
7
+ return unless ActiveScaffold::Bridges::ActiveStorage::ActiveStorageBridgeHelpers.klass_has_active_storage_fields?(model)
8
+
9
+ model.send :extend, ActiveScaffold::Bridges::ActiveStorage::ActiveStorageBridgeHelpers
10
+
11
+ # include the "delete" helpers for use with active scaffold, unless they are already included
12
+ model.generate_delete_helpers
13
+
14
+ update.multipart = true
15
+ create.multipart = true
16
+
17
+ model.active_storage_has_one_fields.each { |field| configure_active_storage_field(field.to_sym, :has_one) }
18
+ model.active_storage_has_many_fields.each { |field| configure_active_storage_field(field.to_sym, :has_many) }
19
+ end
20
+
21
+ private
22
+
23
+ def configure_active_storage_field(field, field_type)
24
+ columns << field
25
+ columns.exclude "#{field}_attachment#{'s' if field_type == :has_many}".to_sym
26
+ columns.exclude "#{field}_blob#{'s' if field_type == :has_many}".to_sym
27
+ columns[field].form_ui ||= "active_storage_#{field_type}".to_sym
28
+ columns[field].params.add "delete_#{field}"
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,54 @@
1
+ module ActiveScaffold
2
+ module Bridges
3
+ class ActiveStorage
4
+ module ActiveStorageBridgeHelpers
5
+ mattr_accessor :thumbnail_variant
6
+ self.thumbnail_variant = {resize_to_limit: [nil, 30]}
7
+
8
+ class << self
9
+ # has_one :"#{name}_attachment", -> { where(name: name) }, class_name: "ActiveStorage::Attachment", as: :record, inverse_of: :record, dependent: false
10
+ def active_storage_has_one_fields(klass)
11
+ klass.reflect_on_all_associations(:has_one)&.select { |reflection| reflection.class_name == 'ActiveStorage::Attachment' } &.collect { |association| association.name[0..-12] } || []
12
+ end
13
+
14
+ # has_many :"#{name}_attachments", -> { where(name: name) }, as: :record, class_name: "ActiveStorage::Attachment", inverse_of: :record, dependent: false do
15
+ def active_storage_has_many_fields(klass)
16
+ klass.reflect_on_all_associations(:has_many)&.select { |reflection| reflection.class_name == 'ActiveStorage::Attachment' } &.collect { |association| association.name[0..-13] } || []
17
+ end
18
+
19
+ def klass_has_active_storage_fields?(klass)
20
+ active_storage_has_one_fields(klass).present? || active_storage_has_many_fields(klass).present?
21
+ end
22
+
23
+ def generate_delete_helpers(klass)
24
+ (active_storage_has_one_fields(klass) | active_storage_has_many_fields(klass)).each do |field|
25
+ klass.send :class_eval, <<-CODE, __FILE__, __LINE__ + 1 unless klass.method_defined?(:"#{field}_with_delete=")
26
+ attr_reader :delete_#{field}
27
+
28
+ def delete_#{field}=(value)
29
+ value = (value=="true") if String===value
30
+ return unless value
31
+
32
+ # passing nil to the file column causes the file to be deleted.
33
+ self.#{field}.purge
34
+ end
35
+ CODE
36
+ end
37
+ end
38
+ end
39
+
40
+ def active_storage_has_one_fields
41
+ @active_storage_has_one_fields ||= ActiveStorageBridgeHelpers.active_storage_has_one_fields(self)
42
+ end
43
+
44
+ def active_storage_has_many_fields
45
+ @active_storage_has_many_fields ||= ActiveStorageBridgeHelpers.active_storage_has_many_fields(self)
46
+ end
47
+
48
+ def generate_delete_helpers
49
+ ActiveStorageBridgeHelpers.generate_delete_helpers(self)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,22 @@
1
+ module ActiveScaffold
2
+ module Helpers
3
+ # Helpers that assist with the rendering of a Form Column
4
+ module FormColumnHelpers
5
+ def active_scaffold_input_active_storage_has_one(column, options)
6
+ record = options[:object]
7
+ active_storage = record.send(column.name.to_s)
8
+ content = active_scaffold_column_active_storage_has_one(record, column) if active_storage.attached?
9
+ active_scaffold_file_with_remove_link(column, options, content, 'delete_', 'active_storage_controls')
10
+ end
11
+
12
+ def active_scaffold_input_active_storage_has_many(column, options)
13
+ record = options[:object]
14
+ options[:multiple] = 'multiple'
15
+ options[:name] += '[]'
16
+ active_storage = record.send(column.name.to_s)
17
+ content = active_scaffold_column_active_storage_has_many(record, column) if active_storage.attached?
18
+ active_scaffold_file_with_remove_link(column, options, content, 'delete_', 'active_storage_controls')
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,36 @@
1
+ module ActiveScaffold
2
+ module Helpers
3
+ module ListColumnHelpers
4
+ def active_scaffold_column_active_storage_has_one(record, column)
5
+ attachment = record.send(column.name.to_s)
6
+ attachment.attached? ? link_for_attachment(attachment) : nil
7
+ end
8
+
9
+ def active_scaffold_column_active_storage_has_many(record, column)
10
+ active_storage_files = record.send(column.name.to_s)
11
+ return nil unless active_storage_files.attached?
12
+
13
+ attachments = active_storage_files.attachments
14
+ if attachments.size <= 3 # Lets display up to three links, otherwise just show the count.
15
+ links = attachments.map { |attachment| link_for_attachment(attachment) }
16
+ safe_join links, association_join_text(column)
17
+ else
18
+ pluralize attachments.size, column.name.to_s
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def link_for_attachment(attachment)
25
+ variant = column.options[:thumb] || ActiveScaffold::Bridges::ActiveStorage::ActiveStorageBridgeHelpers.thumbnail_variant
26
+ content =
27
+ if variant && attachment.variable?
28
+ image_tag(attachment.variant(variant))
29
+ else
30
+ attachment.filename
31
+ end
32
+ link_to(content, rails_blob_url(attachment, disposition: 'attachment'), target: '_blank', rel: 'noopener noreferrer')
33
+ end
34
+ end
35
+ end
36
+ end
@@ -2,5 +2,6 @@ class ActiveScaffold::Bridges::Bitfields < ActiveScaffold::DataStructures::Bridg
2
2
  def self.install
3
3
  require File.join(File.dirname(__FILE__), 'bitfields/bitfields_bridge')
4
4
  ActiveScaffold::Config::Core.send :prepend, ActiveScaffold::Bridges::Bitfields::BitfieldsBridge
5
+ ActiveScaffold::Config::Core.after_config_callbacks << :_setup_bitfields
5
6
  end
6
7
  end
@@ -6,7 +6,7 @@ module ActiveScaffold
6
6
  super
7
7
  return unless model.respond_to?(:bitfields) && model.bitfields.present?
8
8
 
9
- model.bitfields.each_value do |_, options|
9
+ model.bitfields.each_value do |options|
10
10
  columns << options.keys
11
11
  options.each do |column, value|
12
12
  columns[column].form_ui = :checkbox
@@ -15,23 +15,20 @@ module ActiveScaffold
15
15
  end
16
16
  end
17
17
 
18
- def _load_action_columns
19
- if model.respond_to?(:bitfields) && model.bitfields.present?
20
- model.bitfields.each do |column_name, options|
21
- columns = options.keys.sort_by { |column| self.columns[column].weight }
22
- %i[create update show subform].each do |action|
23
- next unless actions.include? action
24
- if send(action).columns.include? column_name
25
- send(action).columns.exclude column_name
26
- send(action).columns.add_subgroup(column_name) { |group| group.add *columns }
27
- else
28
- send(action).columns.exclude *columns
29
- end
18
+ def _setup_bitfields
19
+ return unless model.respond_to?(:bitfields) && model.bitfields.present?
20
+ model.bitfields.each do |column_name, options|
21
+ columns = options.keys.sort_by { |column| self.columns[column].weight }
22
+ %i[create update show subform].each do |action|
23
+ next unless actions.include? action
24
+ if send(action).columns.include? column_name
25
+ send(action).columns.exclude column_name
26
+ send(action).columns.add_subgroup(column_name) { |group| group.add(*columns) }
27
+ else
28
+ send(action).columns.exclude(*columns)
30
29
  end
31
30
  end
32
31
  end
33
-
34
- super
35
32
  end
36
33
  end
37
34
  end
@@ -45,6 +45,12 @@ module ActiveScaffold::Bridges
45
45
  def beginning_of_chain
46
46
  super.accessible_by(current_ability)
47
47
  end
48
+
49
+ # fix when ability allow access base on id
50
+ # can [:manage], Client, id: Client.of_employee(user).pluck(:id)
51
+ def new_model
52
+ super.tap { |record| record.id = nil }
53
+ end
48
54
  end
49
55
  end
50
56
 
@@ -7,11 +7,11 @@ module ActiveScaffold
7
7
  thumbnail_style = ActiveScaffold::Bridges::Carrierwave::CarrierwaveBridgeHelpers.thumbnail_style
8
8
  content =
9
9
  if carrierwave.versions.keys.include?(thumbnail_style)
10
- image_tag(carrierwave.url(thumbnail_style), :border => 0).html_safe
10
+ image_tag(carrierwave.url(thumbnail_style), :border => 0)
11
11
  else
12
12
  record.send(record.send(:_mounter, column.name).send(:serialization_column))
13
13
  end
14
- link_to(content, carrierwave.url, :target => '_blank')
14
+ link_to(content, carrierwave.url, :target => '_blank', rel: 'noopener noreferrer')
15
15
  end
16
16
  end
17
17
  end
@@ -24,9 +24,7 @@ module ActiveScaffold::Bridges
24
24
  def self.date_options_for_locales
25
25
  I18n.available_locales.collect do |locale|
26
26
  locale_date_options = date_options(locale)
27
- if locale_date_options
28
- "$.datepicker.regional['#{locale}'] = #{locale_date_options.to_json};"
29
- end
27
+ "$.datepicker.regional['#{locale}'] = #{locale_date_options.to_json};" if locale_date_options
30
28
  end.compact.join('')
31
29
  end
32
30
 
@@ -59,9 +57,7 @@ module ActiveScaffold::Bridges
59
57
  def self.datetime_options_for_locales
60
58
  I18n.available_locales.collect do |locale|
61
59
  locale_datetime_options = datetime_options(locale)
62
- if locale_datetime_options
63
- "$.timepicker.regional['#{locale}'] = #{locale_datetime_options.to_json};"
64
- end
60
+ "$.timepicker.regional['#{locale}'] = #{locale_datetime_options.to_json};" if locale_datetime_options
65
61
  end.compact.join('')
66
62
  end
67
63
 
@@ -78,12 +74,7 @@ module ActiveScaffold::Bridges
78
74
  datetime_picker_options.merge!(as_datetime_picker_options) if as_datetime_picker_options.is_a? Hash
79
75
  Rails.logger.warn "ActiveScaffold: Missing datetime picker localization for your locale: #{locale}" if as_datetime_picker_options.blank?
80
76
 
81
- date_format, time_format = split_datetime_format(to_datepicker_format(rails_time_format))
82
- datetime_picker_options[:dateFormat] = date_format unless date_format.nil?
83
- unless time_format.nil?
84
- datetime_picker_options[:timeFormat] = time_format
85
- datetime_picker_options[:ampm] = true if rails_time_format.include?('%I')
86
- end
77
+ datetime_picker_options.merge! format_to_datetime_picker(rails_time_format)
87
78
  datetime_picker_options
88
79
  rescue StandardError
89
80
  raise if locale == I18n.locale
@@ -92,7 +83,11 @@ module ActiveScaffold::Bridges
92
83
  def self.to_datepicker_format(rails_format)
93
84
  return nil if rails_format.nil?
94
85
  if rails_format =~ /%[cUWwxXZz]/
95
- Rails.logger.warn("AS DatePicker::Helper: rails date format #{rails_format} includes options which can't be converted to jquery datepicker format. Options %c, %U, %W, %w, %x %X, %z, %Z are not supported by datepicker and will be removed")
86
+ Rails.logger.warn(
87
+ "AS DatePicker::Helper: rails date format #{rails_format} includes options "\
88
+ "which can't be converted to jquery datepicker format. "\
89
+ 'Options %c, %U, %W, %w, %x %X, %z, %Z are not supported by datepicker and will be removed'
90
+ )
96
91
  nil
97
92
  end
98
93
  js_format = rails_format.dup
@@ -103,6 +98,17 @@ module ActiveScaffold::Bridges
103
98
  js_format
104
99
  end
105
100
 
101
+ def self.format_to_datetime_picker(rails_time_format)
102
+ date_format, time_format = split_datetime_format(to_datepicker_format(rails_time_format))
103
+ datetime_picker_options = {}
104
+ datetime_picker_options[:dateFormat] = date_format unless date_format.nil?
105
+ unless time_format.nil?
106
+ datetime_picker_options[:timeFormat] = time_format
107
+ datetime_picker_options[:ampm] = true if rails_time_format.include?('%I')
108
+ end
109
+ datetime_picker_options
110
+ end
111
+
106
112
  def self.split_datetime_format(datetime_format)
107
113
  date_format = datetime_format
108
114
  time_format = nil
@@ -119,46 +125,44 @@ module ActiveScaffold::Bridges
119
125
  end
120
126
 
121
127
  module DatepickerColumnHelpers
122
- def datepicker_split_datetime_format(datetime_format)
123
- ActiveScaffold::Bridges::DatePicker::Helper.split_datetime_format(datetime_format)
124
- end
125
-
126
128
  def to_datepicker_format(rails_format)
127
129
  ActiveScaffold::Bridges::DatePicker::Helper.to_datepicker_format(rails_format)
128
130
  end
129
131
 
130
- def datepicker_format_options(column, format, options)
131
- unless format == :default
132
- if column.form_ui == :date_picker
133
- js_format = to_datepicker_format(I18n.translate!("date.formats.#{format}"))
134
- options['data-dateFormat'] = js_format unless js_format.nil?
135
- else
136
- rails_time_format = I18n.translate!("time.formats.#{format}")
137
- date_format, time_format = datepicker_split_datetime_format(to_datepicker_format(rails_time_format))
138
- options['data-dateFormat'] = date_format unless date_format.nil?
139
- unless time_format.nil?
140
- options['data-timeFormat'] = time_format
141
- options['data-ampm'] = true if rails_time_format.include?('%I')
142
- end
143
- end
132
+ def datepicker_format_options(column, format)
133
+ return {} if format == :default
134
+ if column.form_ui == :date_picker
135
+ js_format = to_datepicker_format(I18n.translate!("date.formats.#{format}"))
136
+ js_format.nil? ? {} : {dateFormat: js_format}
137
+ else
138
+ rails_time_format = I18n.translate!("time.formats.#{format}")
139
+ ActiveScaffold::Bridges::DatePicker::Helper.format_to_datetime_picker(rails_time_format)
144
140
  end
145
141
  end
142
+
143
+ def datepicker_format(options, ui)
144
+ options.delete(:format) || (ui == :date_picker ? :default : :picker)
145
+ end
146
146
  end
147
147
 
148
148
  module SearchColumnHelpers
149
149
  def active_scaffold_search_date_bridge_calendar_control(column, options, current_search, name)
150
- value = if current_search.is_a? Hash
151
- controller.class.condition_value_for_datetime(column, current_search[name], column.search_ui == :date_picker ? :to_date : :to_time)
152
- else
153
- current_search
154
- end
150
+ value =
151
+ if current_search.is_a? Hash
152
+ controller.class.condition_value_for_datetime(column, current_search[name], column.search_ui == :date_picker ? :to_date : :to_time)
153
+ else
154
+ current_search
155
+ end
155
156
  options = column.options.merge(options).except!(:include_blank, :discard_time, :discard_date, :value)
156
157
  options = active_scaffold_input_text_options(options.merge(column.options))
158
+ format = datepicker_format(options, column.search_ui)
157
159
  options[:class] << " #{column.search_ui}"
158
160
  options[:style] = 'display: none' if options[:show] == false # hide only if asked to hide
159
- format = options.delete(:format) || (column.search_ui == :date_picker ? :default : :picker)
160
- datepicker_format_options(column, format, options)
161
- text_field_tag("#{options[:name]}[#{name}]", value ? l(value, :format => format) : nil, options.merge(:id => "#{options[:id]}_#{name}", :name => "#{options[:name]}[#{name}]", :object => nil))
161
+ options[:data] ||= {}
162
+ options[:data].merge! datepicker_format_options(column, format)
163
+ value = l(value, :format => format) if value
164
+ options = options.merge(:id => "#{options[:id]}_#{name}", :name => "#{options[:name]}[#{name}]", :object => nil)
165
+ text_field_tag("#{options[:name]}[#{name}]", value, options)
162
166
  end
163
167
  end
164
168
 
@@ -168,9 +172,10 @@ module ActiveScaffold::Bridges
168
172
  options = active_scaffold_input_text_options(options.merge(column.options))
169
173
  options[:class] << " #{column.form_ui}"
170
174
 
175
+ format = datepicker_format(options, column.form_ui)
171
176
  value = controller.class.condition_value_for_datetime(column, record.send(column.name), column.form_ui == :date_picker ? :to_date : :to_time)
172
- format = options.delete(:format) || (column.form_ui == :date_picker ? :default : :picker)
173
- datepicker_format_options(column, format, options)
177
+ options[:data] ||= {}
178
+ options[:data].merge! datepicker_format_options(column, format)
174
179
  options[:value] = (value ? l(value, :format => format) : nil)
175
180
  text_field(:record, column.name, options)
176
181
  end
@@ -10,7 +10,7 @@ module ActiveScaffold
10
10
  else
11
11
  attachment.name
12
12
  end
13
- link_to(content, dragonfly_url_for_attachment(attachment, record, column), :target => '_blank')
13
+ link_to(content, dragonfly_url_for_attachment(attachment, record, column), :target => '_blank', rel: 'noopener noreferrer')
14
14
  end
15
15
 
16
16
  def dragonfly_url_for_attachment(attachment, record, column)
@@ -9,7 +9,7 @@ module ActiveScaffold
9
9
 
10
10
  def generate_delete_helpers(klass)
11
11
  file_column_fields(klass).each do |field|
12
- klass.send :class_eval, <<-END, __FILE__, __LINE__ + 1 unless klass.method_defined?(:"#{field}_with_delete=")
12
+ klass.send :class_eval, <<-CODE, __FILE__, __LINE__ + 1 unless klass.method_defined?(:"#{field}_with_delete=")
13
13
  attr_reader :delete_#{field}
14
14
 
15
15
  def delete_#{field}=(value)
@@ -19,7 +19,7 @@ module ActiveScaffold
19
19
  # passing nil to the file column causes the file to be deleted. Don't delete if we just uploaded a file!
20
20
  self.#{field} = nil unless self.#{field}_just_uploaded?
21
21
  end
22
- END
22
+ CODE
23
23
  end
24
24
  end
25
25
 
@@ -18,9 +18,9 @@ module ActiveScaffold
18
18
 
19
19
  content_tag(:div) do
20
20
  content_tag(:div) do
21
- get_column_value(record, column) + " #{custom_hidden_field_tag} | ".html_safe <<
22
- content_tag(:a, as_(:remove_file), :href => '#', :onclick => remove_file_js) <<
23
- content_tag(:div, file_column_field('record', column.name, options), :style => 'display: none')
21
+ safe_join [get_column_value(record, column), custom_hidden_field_tag, '|',
22
+ content_tag(:a, as_(:remove_file), :href => '#', :onclick => remove_file_js),
23
+ content_tag(:div, 'test', :style => 'display: none')], ' '
24
24
  end
25
25
  end
26
26
  else
@@ -1,4 +1,6 @@
1
- require File.expand_path('../test_helper.rb', __dir__)
1
+ require 'test_helper'
2
+ require File.expand_path('../mock_model.rb', __dir__)
3
+ require File.expand_path('../../file_column_helpers.rb', __dir__)
2
4
 
3
5
  class DeleteFileColumnTest < MiniTest::Test
4
6
  def setup
@@ -6,7 +6,7 @@ module ActiveScaffold
6
6
  self.thumbnail_style = :thumbnail
7
7
 
8
8
  def self.generate_delete_helper(klass, field)
9
- klass.class_eval <<-END, __FILE__, __LINE__ + 1 unless klass.method_defined?(:"delete_#{field}=")
9
+ klass.class_eval <<-CODE, __FILE__, __LINE__ + 1 unless klass.method_defined?(:"delete_#{field}=")
10
10
  attr_reader :delete_#{field}
11
11
 
12
12
  def delete_#{field}=(value)
@@ -16,7 +16,7 @@ module ActiveScaffold
16
16
  # passing nil to the file column causes the file to be deleted. Don't delete if we just uploaded a file!
17
17
  self.#{field} = nil unless self.#{field}.dirty?
18
18
  end
19
- END
19
+ CODE
20
20
  end
21
21
  end
22
22
  end