active_scaffold 3.4.43 → 3.5.0
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 +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
| @@ -2,7 +2,7 @@ module ActiveScaffold | |
| 2 2 | 
             
              module Helpers
         | 
| 3 3 | 
             
                module ListColumnHelpers
         | 
| 4 4 | 
             
                  def active_scaffold_column_paperclip(record, column)
         | 
| 5 | 
            -
                    paperclip = record.send( | 
| 5 | 
            +
                    paperclip = record.send(column.name.to_s)
         | 
| 6 6 | 
             
                    return nil unless paperclip.file?
         | 
| 7 7 | 
             
                    content =
         | 
| 8 8 | 
             
                      if paperclip.styles.include?(ActiveScaffold::Bridges::Paperclip::PaperclipBridgeHelpers.thumbnail_style)
         | 
| @@ -2,8 +2,8 @@ module ActiveScaffold | |
| 2 2 | 
             
              module Bridges
         | 
| 3 3 | 
             
                class Paperclip
         | 
| 4 4 | 
             
                  module PaperclipBridge
         | 
| 5 | 
            -
                    def  | 
| 6 | 
            -
                       | 
| 5 | 
            +
                    def initialize(model_id)
         | 
| 6 | 
            +
                      super
         | 
| 7 7 | 
             
                      return unless model.respond_to?(:attachment_definitions) && !model.attachment_definitions.nil?
         | 
| 8 8 |  | 
| 9 9 | 
             
                      update.multipart = true
         | 
| @@ -16,10 +16,6 @@ module ActiveScaffold | |
| 16 16 | 
             
                      end
         | 
| 17 17 | 
             
                    end
         | 
| 18 18 |  | 
| 19 | 
            -
                    def self.included(base)
         | 
| 20 | 
            -
                      base.alias_method_chain :initialize, :paperclip
         | 
| 21 | 
            -
                    end
         | 
| 22 | 
            -
             | 
| 23 19 | 
             
                    private
         | 
| 24 20 |  | 
| 25 21 | 
             
                    def configure_paperclip_field(field)
         | 
| @@ -27,7 +23,7 @@ module ActiveScaffold | |
| 27 23 | 
             
                      columns[field].form_ui ||= :paperclip
         | 
| 28 24 | 
             
                      columns[field].params.add "delete_#{field}"
         | 
| 29 25 |  | 
| 30 | 
            -
                      [ | 
| 26 | 
            +
                      %i[file_name content_type file_size updated_at].each do |f|
         | 
| 31 27 | 
             
                        columns.exclude("#{field}_#{f}".to_sym)
         | 
| 32 28 | 
             
                      end
         | 
| 33 29 | 
             
                    end
         | 
| @@ -2,9 +2,11 @@ class ActiveScaffold::Bridges::RecordSelect < ActiveScaffold::DataStructures::Br | |
| 2 2 | 
             
              def self.install
         | 
| 3 3 | 
             
                require File.join(File.dirname(__FILE__), 'record_select/helpers.rb')
         | 
| 4 4 | 
             
              end
         | 
| 5 | 
            +
             | 
| 5 6 | 
             
              def self.stylesheets
         | 
| 6 7 | 
             
                'record_select'
         | 
| 7 8 | 
             
              end
         | 
| 9 | 
            +
             | 
| 8 10 | 
             
              def self.javascripts
         | 
| 9 11 | 
             
                'record_select'
         | 
| 10 12 | 
             
              end
         | 
| @@ -11,13 +11,11 @@ class ActiveScaffold::Bridges::RecordSelect | |
| 11 11 | 
             
                  # requires RecordSelect plugin to be installed and configured.
         | 
| 12 12 | 
             
                  def active_scaffold_input_record_select(column, options)
         | 
| 13 13 | 
             
                    record = options.delete(:object)
         | 
| 14 | 
            -
                     | 
| 15 | 
            -
                    record ||= @record # TODO: Remove when relying on @record is removed
         | 
| 16 | 
            -
                    if column.singular_association?
         | 
| 14 | 
            +
                    if column.association.try(:singular?)
         | 
| 17 15 | 
             
                      multiple = false
         | 
| 18 | 
            -
                      multiple = column.options[:html_options][:multiple] if column.options[:html_options] && | 
| 16 | 
            +
                      multiple = column.options[:html_options][:multiple] if column.options[:html_options] && column.options[:html_options][:multiple]
         | 
| 19 17 | 
             
                      active_scaffold_record_select(record, column, options, record.send(column.name), multiple)
         | 
| 20 | 
            -
                    elsif column. | 
| 18 | 
            +
                    elsif column.association.try(:collection?)
         | 
| 21 19 | 
             
                      active_scaffold_record_select(record, column, options, record.send(column.name), true)
         | 
| 22 20 | 
             
                    else
         | 
| 23 21 | 
             
                      active_scaffold_record_select_autocomplete(record, column, options)
         | 
| @@ -29,7 +27,7 @@ class ActiveScaffold::Bridges::RecordSelect | |
| 29 27 | 
             
                      raise ArgumentError, "record_select can only work against associations (and #{column.name} is not).  A common mistake is to specify the foreign key field (like :user_id), instead of the association (:user)."
         | 
| 30 28 | 
             
                    end
         | 
| 31 29 | 
             
                    klass =
         | 
| 32 | 
            -
                      if column. | 
| 30 | 
            +
                      if column.association.polymorphic?
         | 
| 33 31 | 
             
                        record.send(column.association.foreign_type).constantize rescue nil
         | 
| 34 32 | 
             
                      else
         | 
| 35 33 | 
             
                        column.association.klass
         | 
| @@ -40,8 +38,8 @@ class ActiveScaffold::Bridges::RecordSelect | |
| 40 38 |  | 
| 41 39 | 
             
                    # if the opposite association is a :belongs_to (in that case association in this class must be has_one or has_many)
         | 
| 42 40 | 
             
                    # then only show records that have not been associated yet
         | 
| 43 | 
            -
                    if  | 
| 44 | 
            -
                      params | 
| 41 | 
            +
                    if column.association.has_one? || column.association.has_many?
         | 
| 42 | 
            +
                      params[column.association.foreign_key] = ''
         | 
| 45 43 | 
             
                    end
         | 
| 46 44 |  | 
| 47 45 | 
             
                    record_select_options = active_scaffold_input_text_options(options).merge(
         | 
| @@ -51,7 +49,7 @@ class ActiveScaffold::Bridges::RecordSelect | |
| 51 49 |  | 
| 52 50 | 
             
                    html =
         | 
| 53 51 | 
             
                      if multiple
         | 
| 54 | 
            -
                        record_multi_select_field(options[:name], value || [], record_select_options)
         | 
| 52 | 
            +
                        record_multi_select_field(options[:name], value || [], record_select_options.except(:required))
         | 
| 55 53 | 
             
                      else
         | 
| 56 54 | 
             
                        record_select_field(options[:name], value || klass.new, record_select_options)
         | 
| 57 55 | 
             
                      end
         | 
| @@ -71,18 +69,16 @@ class ActiveScaffold::Bridges::RecordSelect | |
| 71 69 |  | 
| 72 70 | 
             
                module SearchColumnHelpers
         | 
| 73 71 | 
             
                  def active_scaffold_search_record_select(column, options)
         | 
| 74 | 
            -
                    value = field_search_record_select_value(column)
         | 
| 72 | 
            +
                    value = field_search_record_select_value(column, options[:value])
         | 
| 75 73 | 
             
                    active_scaffold_record_select(options[:object], column, options, value, column.options[:multiple])
         | 
| 76 74 | 
             
                  end
         | 
| 77 75 |  | 
| 78 | 
            -
                  def field_search_record_select_value(column)
         | 
| 79 | 
            -
                     | 
| 80 | 
            -
                     | 
| 81 | 
            -
                       | 
| 82 | 
            -
             | 
| 83 | 
            -
                       | 
| 84 | 
            -
                        column.association.klass.find(value.to_i)
         | 
| 85 | 
            -
                      end
         | 
| 76 | 
            +
                  def field_search_record_select_value(column, value)
         | 
| 77 | 
            +
                    return if value.blank?
         | 
| 78 | 
            +
                    if column.options[:multiple]
         | 
| 79 | 
            +
                      column.association.klass.find value.collect!(&:to_i)
         | 
| 80 | 
            +
                    else
         | 
| 81 | 
            +
                      column.association.klass.find(value.to_i)
         | 
| 86 82 | 
             
                    end
         | 
| 87 83 | 
             
                  rescue StandardError => e
         | 
| 88 84 | 
             
                    logger.error "#{e.class.name}: #{e.message} -- Sorry, we are not that smart yet. Attempted to restore search values to search fields :#{column.name} in #{controller.class}"
         | 
| @@ -1,20 +1,16 @@ | |
| 1 1 | 
             
            class ActiveScaffold::Bridges::SemanticAttributes
         | 
| 2 2 | 
             
              module Column
         | 
| 3 | 
            -
                def  | 
| 4 | 
            -
                   | 
| 5 | 
            -
                end
         | 
| 6 | 
            -
             | 
| 7 | 
            -
                def initialize_with_semantic_attributes(name, active_record_class)
         | 
| 8 | 
            -
                  initialize_without_semantic_attributes(name, active_record_class)
         | 
| 3 | 
            +
                def initialize(name, active_record_class)
         | 
| 4 | 
            +
                  super
         | 
| 9 5 | 
             
                  self.required = !active_record_class.semantic_attributes[self.name].predicates.find { |p| p.allow_empty? == false }.nil?
         | 
| 10 6 | 
             
                  active_record_class.semantic_attributes[self.name].predicates.find do |p|
         | 
| 11 7 | 
             
                    sem_type = p.class.to_s.split('::')[1].underscore.to_sym
         | 
| 12 | 
            -
                    next if [ | 
| 8 | 
            +
                    next if %i[required association].include?(sem_type)
         | 
| 13 9 | 
             
                    @form_ui = sem_type
         | 
| 14 10 | 
             
                  end
         | 
| 15 11 | 
             
                end
         | 
| 16 12 | 
             
              end
         | 
| 17 13 | 
             
            end
         | 
| 18 14 | 
             
            ActiveScaffold::DataStructures::Column.class_eval do
         | 
| 19 | 
            -
               | 
| 15 | 
            +
              prepend ActiveScaffold::Bridges::SemanticAttributes::Column
         | 
| 20 16 | 
             
            end
         | 
| @@ -12,7 +12,7 @@ module ActiveScaffold | |
| 12 12 | 
             
                        tags << active_scaffold_search_date_bridge_trend_tag(column, options, current_search)
         | 
| 13 13 | 
             
                        tags << active_scaffold_search_date_bridge_numeric_tag(column, options, current_search)
         | 
| 14 14 | 
             
                        tags << active_scaffold_search_date_bridge_range_tag(column, options, current_search)
         | 
| 15 | 
            -
                        tags | 
| 15 | 
            +
                        safe_join tags, ' '.html_safe
         | 
| 16 16 | 
             
                      end
         | 
| 17 17 |  | 
| 18 18 | 
             
                      def active_scaffold_search_date_bridge_comparator_options(column)
         | 
| @@ -70,7 +70,7 @@ module ActiveScaffold | |
| 70 70 | 
             
                      end
         | 
| 71 71 |  | 
| 72 72 | 
             
                      def column_datetime?(column)
         | 
| 73 | 
            -
                        (!column.column.nil? && [ | 
| 73 | 
            +
                        (!column.column.nil? && %i[datetime time].include?(column.column.type))
         | 
| 74 74 | 
             
                      end
         | 
| 75 75 | 
             
                    end
         | 
| 76 76 |  | 
| @@ -141,7 +141,7 @@ module ActiveScaffold | |
| 141 141 | 
             
                            values.collect!(&conversion) if conversion != :to_time
         | 
| 142 142 | 
             
                            values
         | 
| 143 143 | 
             
                          else
         | 
| 144 | 
            -
                            %w | 
| 144 | 
            +
                            %w[from to].collect { |field| condition_value_for_datetime(column, value[field], conversion) }
         | 
| 145 145 | 
             
                          end
         | 
| 146 146 | 
             
                        end
         | 
| 147 147 |  | 
| @@ -152,41 +152,41 @@ module ActiveScaffold | |
| 152 152 | 
             
                        def date_bridge_from_to_for_trend(column, value)
         | 
| 153 153 | 
             
                          case value['opt']
         | 
| 154 154 | 
             
                          when 'PAST'
         | 
| 155 | 
            -
                            trend_number = [value['number'].to_i, | 
| 155 | 
            +
                            trend_number = [value['number'].to_i, 1].max
         | 
| 156 156 | 
             
                            now = date_bridge_now
         | 
| 157 157 | 
             
                            if date_bridge_column_date?(column)
         | 
| 158 | 
            -
                              from = now.beginning_of_day.ago( | 
| 158 | 
            +
                              from = now.beginning_of_day.ago(trend_number.send(value['unit'].downcase.singularize.to_sym))
         | 
| 159 159 | 
             
                              to = now.end_of_day
         | 
| 160 160 | 
             
                            else
         | 
| 161 | 
            -
                              from = now.ago( | 
| 161 | 
            +
                              from = now.ago(trend_number.send(value['unit'].downcase.singularize.to_sym))
         | 
| 162 162 | 
             
                              to = now
         | 
| 163 163 | 
             
                            end
         | 
| 164 | 
            -
                             | 
| 164 | 
            +
                            [from, to]
         | 
| 165 165 | 
             
                          when 'FUTURE'
         | 
| 166 | 
            -
                            trend_number = [value['number'].to_i, | 
| 166 | 
            +
                            trend_number = [value['number'].to_i, 1].max
         | 
| 167 167 | 
             
                            now = date_bridge_now
         | 
| 168 168 | 
             
                            if date_bridge_column_date?(column)
         | 
| 169 169 | 
             
                              from = now.beginning_of_day
         | 
| 170 | 
            -
                              to = now.end_of_day.in( | 
| 170 | 
            +
                              to = now.end_of_day.in(trend_number.send(value['unit'].downcase.singularize.to_sym))
         | 
| 171 171 | 
             
                            else
         | 
| 172 172 | 
             
                              from = now
         | 
| 173 | 
            -
                              to = now.in( | 
| 173 | 
            +
                              to = now.in(trend_number.send(value['unit'].downcase.singularize.to_sym))
         | 
| 174 174 | 
             
                            end
         | 
| 175 | 
            -
                             | 
| 175 | 
            +
                            [from, to]
         | 
| 176 176 | 
             
                          end
         | 
| 177 177 | 
             
                        end
         | 
| 178 178 |  | 
| 179 179 | 
             
                        def date_bridge_from_to_for_range(column, value)
         | 
| 180 180 | 
             
                          case value['range']
         | 
| 181 181 | 
             
                          when 'TODAY'
         | 
| 182 | 
            -
                             | 
| 182 | 
            +
                            [date_bridge_now.beginning_of_day, date_bridge_now.end_of_day]
         | 
| 183 183 | 
             
                          when 'YESTERDAY'
         | 
| 184 | 
            -
                             | 
| 184 | 
            +
                            [date_bridge_now.ago(1.day).beginning_of_day, date_bridge_now.ago(1.day).end_of_day]
         | 
| 185 185 | 
             
                          when 'TOMORROW'
         | 
| 186 | 
            -
                             | 
| 186 | 
            +
                            [date_bridge_now.in(1.day).beginning_of_day, date_bridge_now.in(1.day).end_of_day]
         | 
| 187 187 | 
             
                          else
         | 
| 188 188 | 
             
                            range_type, range = value['range'].downcase.split('_')
         | 
| 189 | 
            -
                            raise ArgumentError unless %w | 
| 189 | 
            +
                            raise ArgumentError unless %w[week month year].include?(range)
         | 
| 190 190 | 
             
                            case range_type
         | 
| 191 191 | 
             
                            when 'this'
         | 
| 192 192 | 
             
                              return date_bridge_now.send("beginning_of_#{range}".to_sym), date_bridge_now.send("end_of_#{range}")
         | 
| @@ -201,7 +201,7 @@ module ActiveScaffold | |
| 201 201 | 
             
                        end
         | 
| 202 202 |  | 
| 203 203 | 
             
                        def date_bridge_column_date?(column)
         | 
| 204 | 
            -
                          if [ | 
| 204 | 
            +
                          if %i[date_picker datetime_picker].include? column.form_ui
         | 
| 205 205 | 
             
                            column.form_ui == :date_picker
         | 
| 206 206 | 
             
                          else
         | 
| 207 207 | 
             
                            (!column.column.nil? && [:date].include?(column.column.type))
         | 
| @@ -214,7 +214,7 @@ module ActiveScaffold | |
| 214 214 | 
             
              end
         | 
| 215 215 | 
             
            end
         | 
| 216 216 |  | 
| 217 | 
            -
            ActiveScaffold::Finder.const_set('DATE_COMPARATORS', %w | 
| 218 | 
            -
            ActiveScaffold::Finder.const_set('DATE_UNITS', %w | 
| 219 | 
            -
            ActiveScaffold::Finder.const_set('TIME_UNITS', %w | 
| 220 | 
            -
            ActiveScaffold::Finder.const_set('DATE_RANGES', %w | 
| 217 | 
            +
            ActiveScaffold::Finder.const_set('DATE_COMPARATORS', %w[PAST FUTURE RANGE])
         | 
| 218 | 
            +
            ActiveScaffold::Finder.const_set('DATE_UNITS', %w[DAYS WEEKS MONTHS YEARS])
         | 
| 219 | 
            +
            ActiveScaffold::Finder.const_set('TIME_UNITS', %w[SECONDS MINUTES HOURS])
         | 
| 220 | 
            +
            ActiveScaffold::Finder.const_set('DATE_RANGES', %w[TODAY YESTERDAY TOMORROW THIS_WEEK PREV_WEEK NEXT_WEEK THIS_MONTH PREV_MONTH NEXT_MONTH THIS_YEAR PREV_YEAR NEXT_YEAR])
         | 
| @@ -8,10 +8,6 @@ class ActiveScaffold::Bridges::TinyMce | |
| 8 8 | 
             
                end
         | 
| 9 9 |  | 
| 10 10 | 
             
                module FormColumnHelpers
         | 
| 11 | 
            -
                  def self.included(base)
         | 
| 12 | 
            -
                    base.alias_method_chain :onsubmit, :tiny_mce
         | 
| 13 | 
            -
                  end
         | 
| 14 | 
            -
             | 
| 15 11 | 
             
                  # The two column options that can be set specifically for the text_editor input
         | 
| 16 12 | 
             
                  # is :tinymce, which overrides single values in the tinymce config.
         | 
| 17 13 | 
             
                  # E.g. column[:foo].options[:tinymce] = {theme: 'other'} will change the theme
         | 
| @@ -21,31 +17,20 @@ class ActiveScaffold::Bridges::TinyMce | |
| 21 17 | 
             
                  def active_scaffold_input_text_editor(column, options)
         | 
| 22 18 | 
             
                    options[:class] = "#{options[:class]} mceEditor #{column.options[:class]}".strip
         | 
| 23 19 |  | 
| 24 | 
            -
                    settings = tinymce_configuration(column.options[:tinymce_config] || :default).options | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
                     | 
| 28 | 
            -
                    settings = "tinyMCE.settings = #{settings};"
         | 
| 20 | 
            +
                    settings = tinymce_configuration(column.options[:tinymce_config] || :default).options
         | 
| 21 | 
            +
                                                                                                 .reject { |k, _v| k == 'selector' }
         | 
| 22 | 
            +
                                                                                                 .merge(column.options[:tinymce] || {})
         | 
| 23 | 
            +
                    options['data-tinymce'] = settings.to_json if ActiveScaffold.js_framework != :prototype
         | 
| 29 24 |  | 
| 30 25 | 
             
                    html = []
         | 
| 31 26 | 
             
                    html << send(override_input(:textarea), column, options)
         | 
| 32 | 
            -
                    html << javascript_tag(settings  | 
| 33 | 
            -
                    html | 
| 34 | 
            -
                  end
         | 
| 35 | 
            -
             | 
| 36 | 
            -
                  def onsubmit_with_tiny_mce
         | 
| 37 | 
            -
                    case ActiveScaffold.js_framework
         | 
| 38 | 
            -
                    when :jquery
         | 
| 39 | 
            -
                      submit_js = 'tinyMCE.triggerSave();jQuery(\'textarea.mceEditor\').each(function(index, elem) { tinyMCE.execCommand(\'mceRemoveEditor\', false, jQuery(elem).attr(\'id\')); });'
         | 
| 40 | 
            -
                    when :prototype
         | 
| 41 | 
            -
                      submit_js = 'tinyMCE.triggerSave();this.select(\'textarea.mceEditor\').each(function(elem) { tinyMCE.execCommand(\'mceRemoveEditor\', false, elem.id); });'
         | 
| 42 | 
            -
                    end
         | 
| 43 | 
            -
                    [onsubmit_without_tiny_mce, submit_js].compact.join ';'
         | 
| 27 | 
            +
                    html << javascript_tag("tinyMCE.settings = #{settings.to_json}; tinyMCE.execCommand('mceAddEditor', false, '#{options[:id]}');") if ActiveScaffold.js_framework == :prototype && (request.xhr? || params[:iframe])
         | 
| 28 | 
            +
                    safe_join html
         | 
| 44 29 | 
             
                  end
         | 
| 45 30 |  | 
| 46 31 | 
             
                  # The implementation is very tinymce specific, so it makes sense allowing :form_ui
         | 
| 47 32 | 
             
                  # to be :tinymce as well
         | 
| 48 | 
            -
                   | 
| 33 | 
            +
                  alias active_scaffold_input_tinymce active_scaffold_input_text_editor
         | 
| 49 34 | 
             
                end
         | 
| 50 35 |  | 
| 51 36 | 
             
                module SearchColumnHelpers
         | 
| @@ -2,7 +2,7 @@ module ActiveScaffold::Bridges | |
| 2 2 | 
             
              class UsaStateSelect
         | 
| 3 3 | 
             
                module UsaStateSelectHelpers
         | 
| 4 4 | 
             
                  def usa_state_select_options(options)
         | 
| 5 | 
            -
                    # TODO remove when rails 3.2 support is dropped
         | 
| 5 | 
            +
                    # TODO: remove when rails 3.2 support is dropped
         | 
| 6 6 | 
             
                    defined?(ActionView::Helpers::InstanceTag) ? options[:object] : options
         | 
| 7 7 | 
             
                  end
         | 
| 8 8 |  | 
| @@ -17,22 +17,22 @@ module ActiveScaffold::Bridges | |
| 17 17 | 
             
                  # in case you want to highligh a local area
         | 
| 18 18 | 
             
                  # NOTE: Only the option tags are returned from this method, wrap it in a <select>
         | 
| 19 19 | 
             
                  def usa_state_options_for_select(selected = nil, priority_states = nil)
         | 
| 20 | 
            -
                    if priority_states
         | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 20 | 
            +
                    state_options = if priority_states
         | 
| 21 | 
            +
                                      options_for_select(priority_states + [['-------------', '']], :selected => selected, :disabled => '')
         | 
| 22 | 
            +
                                    else
         | 
| 23 | 
            +
                                      options_for_select([])
         | 
| 24 | 
            +
                                    end
         | 
| 25 25 |  | 
| 26 | 
            -
                    if priority_states && priority_states.include?(selected)
         | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 26 | 
            +
                    state_options += if priority_states && priority_states.include?(selected)
         | 
| 27 | 
            +
                                       options_for_select(USASTATES - priority_states, :selected => selected)
         | 
| 28 | 
            +
                                     else
         | 
| 29 | 
            +
                                       options_for_select(USASTATES, :selected => selected)
         | 
| 30 | 
            +
                                     end
         | 
| 31 31 |  | 
| 32 32 | 
             
                    state_options
         | 
| 33 33 | 
             
                  end
         | 
| 34 34 |  | 
| 35 | 
            -
                  USASTATES = [%w | 
| 35 | 
            +
                  USASTATES = [%w[Alabama AL], %w[Alaska AK], %w[Arizona AZ], %w[Arkansas AR], %w[California CA], %w[Colorado CO], %w[Connecticut CT], %w[Delaware DE], ['District of Columbia', 'DC'], %w[Florida FL], %w[Georgia GA], %w[Hawaii HI], %w[Idaho ID], %w[Illinois IL], %w[Indiana IN], %w[Iowa IA], %w[Kansas KS], %w[Kentucky KY], %w[Louisiana LA], %w[Maine ME], %w[Maryland MD], %w[Massachusetts MA], %w[Michigan MI], %w[Minnesota MN], %w[Mississippi MS], %w[Missouri MO], %w[Montana MT], %w[Nebraska NE], %w[Nevada NV], ['New Hampshire', 'NH'], ['New Jersey', 'NJ'], ['New Mexico', 'NM'], ['New York', 'NY'], ['North Carolina', 'NC'], ['North Dakota', 'ND'], %w[Ohio OH], %w[Oklahoma OK], %w[Oregon OR], %w[Pennsylvania PA], ['Rhode Island', 'RI'], ['South Carolina', 'SC'], ['South Dakota', 'SD'], %w[Tennessee TN], %w[Texas TX], %w[Utah UT], %w[Vermont VT], %w[Virginia VA], %w[Washington WA], %w[Wisconsin WI], ['West Virginia', 'WV'], %w[Wyoming WY]].freeze unless const_defined?('USASTATES')
         | 
| 36 36 | 
             
                end
         | 
| 37 37 |  | 
| 38 38 | 
             
                module InstanceTagMethods
         | 
| @@ -50,7 +50,7 @@ module ActiveScaffold::Bridges | |
| 50 50 | 
             
                    select_options = {:prompt => as_(:_select_)}
         | 
| 51 51 | 
             
                    select_options.merge!(options)
         | 
| 52 52 | 
             
                    options.reverse_merge!(column.options).except!(:prompt, :priority)
         | 
| 53 | 
            -
                     | 
| 53 | 
            +
                    active_scaffold_select_name_with_multiple options
         | 
| 54 54 | 
             
                    usa_state_select(:record, column.name, column.options[:priority], select_options, options.except(:object))
         | 
| 55 55 | 
             
                  end
         | 
| 56 56 | 
             
                end
         | 
| @@ -69,7 +69,7 @@ ActionView::Base.class_eval do | |
| 69 69 | 
             
              include ActiveScaffold::Bridges::UsaStateSelect::FormColumnHelpers
         | 
| 70 70 | 
             
              include ActiveScaffold::Bridges::UsaStateSelect::SearchColumnHelpers
         | 
| 71 71 | 
             
            end
         | 
| 72 | 
            -
            if defined? ActionView::Helpers::InstanceTag # TODO remove when rails 3.2 support is dropped
         | 
| 72 | 
            +
            if defined? ActionView::Helpers::InstanceTag # TODO: remove when rails 3.2 support is dropped
         | 
| 73 73 | 
             
              module ActionView::Helpers::Tags
         | 
| 74 74 | 
             
                class UsaStateSelect < ActionView::Helpers::InstanceTag
         | 
| 75 75 | 
             
                  include ActiveScaffold::Bridges::UsaStateSelect::UsaStateSelectOptionsHelpers
         | 
| @@ -21,7 +21,7 @@ module ActiveScaffold::Config | |
| 21 21 | 
             
                    protected
         | 
| 22 22 |  | 
| 23 23 | 
             
                    def crud_type=(val)
         | 
| 24 | 
            -
                      raise ArgumentError, "unknown CRUD type #{val}" unless [ | 
| 24 | 
            +
                      raise ArgumentError, "unknown CRUD type #{val}" unless %i[create read update delete].include?(val.to_sym)
         | 
| 25 25 | 
             
                      @crud_type = val.to_sym
         | 
| 26 26 | 
             
                    end
         | 
| 27 27 | 
             
                  end
         | 
| @@ -42,7 +42,7 @@ module ActiveScaffold::Config | |
| 42 42 |  | 
| 43 43 | 
             
                # define a default action_group for this action
         | 
| 44 44 | 
             
                # e.g. 'members.crud'
         | 
| 45 | 
            -
                class_attribute :action_group
         | 
| 45 | 
            +
                class_attribute :action_group, instance_accessor: false
         | 
| 46 46 |  | 
| 47 47 | 
             
                # action_group this action should belong to
         | 
| 48 48 | 
             
                attr_accessor :action_group
         | 
| @@ -97,7 +97,7 @@ module ActiveScaffold::Config | |
| 97 97 | 
             
                  names.each do |name|
         | 
| 98 98 | 
             
                    var = "@#{name}"
         | 
| 99 99 | 
             
                    define_method "#{name}=" do |val|
         | 
| 100 | 
            -
                      if  | 
| 100 | 
            +
                      if instance_variable_defined?(var)
         | 
| 101 101 | 
             
                        instance_variable_get(var).set_values(*val)
         | 
| 102 102 | 
             
                      else
         | 
| 103 103 | 
             
                        instance_variable_set(var, build_action_columns(val))
         | 
| @@ -105,21 +105,24 @@ module ActiveScaffold::Config | |
| 105 105 | 
             
                      instance_variable_get(var)
         | 
| 106 106 | 
             
                    end
         | 
| 107 107 |  | 
| 108 | 
            +
                    return if method_defined? name
         | 
| 108 109 | 
             
                    define_method name do
         | 
| 109 | 
            -
                      unless  | 
| 110 | 
            +
                      unless instance_variable_defined?(var) # lazy evaluation
         | 
| 110 111 | 
             
                        action, columns = options[:copy] if options[:copy]
         | 
| 111 112 | 
             
                        if action && @core.actions.include?(action)
         | 
| 112 113 | 
             
                          action_columns = @core.send(action).send(columns || :columns).clone
         | 
| 113 114 | 
             
                          action_columns.action = self
         | 
| 114 115 | 
             
                          instance_variable_set(var, action_columns)
         | 
| 115 116 | 
             
                        else
         | 
| 116 | 
            -
                           | 
| 117 | 
            +
                          send("#{name}=", @core.columns._inheritable)
         | 
| 117 118 | 
             
                        end
         | 
| 118 | 
            -
                        instance_exec | 
| 119 | 
            +
                        instance_exec(&block) if block
         | 
| 119 120 | 
             
                      end
         | 
| 120 121 | 
             
                      instance_variable_get(var)
         | 
| 121 122 | 
             
                    end
         | 
| 122 123 | 
             
                  end
         | 
| 123 124 | 
             
                end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                private_class_method :columns_accessor
         | 
| 124 127 | 
             
              end
         | 
| 125 128 | 
             
            end
         | 
| @@ -1,55 +1,55 @@ | |
| 1 1 | 
             
            module ActiveScaffold::Config
         | 
| 2 2 | 
             
              # to fix the ckeditor bridge problem inherit from full class name
         | 
| 3 3 | 
             
              class Core < ActiveScaffold::Config::Base
         | 
| 4 | 
            +
                include ActiveScaffold::OrmChecks
         | 
| 4 5 | 
             
                # global level configuration
         | 
| 5 6 | 
             
                # --------------------------
         | 
| 6 7 |  | 
| 7 8 | 
             
                # provides read/write access to the global Actions DataStructure
         | 
| 8 | 
            -
                cattr_reader :actions
         | 
| 9 | 
            +
                cattr_reader :actions, instance_accessor: false
         | 
| 9 10 | 
             
                def self.actions=(val)
         | 
| 10 11 | 
             
                  @@actions = ActiveScaffold::DataStructures::Actions.new(*val)
         | 
| 11 12 | 
             
                end
         | 
| 12 | 
            -
                self.actions = [ | 
| 13 | 
            +
                self.actions = %i[create list search update delete show nested subform]
         | 
| 13 14 |  | 
| 14 15 | 
             
                # configures where the ActiveScaffold plugin itself is located. there is no instance version of this.
         | 
| 15 16 | 
             
                cattr_accessor :plugin_directory
         | 
| 16 17 | 
             
                @@plugin_directory = File.expand_path(__FILE__).match(%{(^.*)/lib/active_scaffold/config/core.rb})[1]
         | 
| 17 18 |  | 
| 18 19 | 
             
                # lets you specify a global ActiveScaffold frontend.
         | 
| 19 | 
            -
                cattr_accessor :frontend
         | 
| 20 | 
            +
                cattr_accessor :frontend, instance_accessor: false
         | 
| 20 21 | 
             
                @@frontend = :default
         | 
| 21 22 |  | 
| 22 23 | 
             
                # lets you specify a global ActiveScaffold theme for your frontend.
         | 
| 23 | 
            -
                cattr_accessor :theme
         | 
| 24 | 
            +
                cattr_accessor :theme, instance_accessor: false
         | 
| 24 25 | 
             
                @@theme = :default
         | 
| 25 26 |  | 
| 26 27 | 
             
                # enable caching of action link urls
         | 
| 27 | 
            -
                cattr_accessor :cache_action_link_urls
         | 
| 28 | 
            +
                cattr_accessor :cache_action_link_urls, instance_accessor: false
         | 
| 28 29 | 
             
                @@cache_action_link_urls = true
         | 
| 29 30 |  | 
| 30 31 | 
             
                # enable caching of association options
         | 
| 31 | 
            -
                cattr_accessor :cache_association_options
         | 
| 32 | 
            +
                cattr_accessor :cache_association_options, instance_accessor: false
         | 
| 32 33 | 
             
                @@cache_association_options = true
         | 
| 33 34 |  | 
| 34 35 | 
             
                # enable setting ETag and LastModified on responses and using fresh_when/stale? to respond with 304 and avoid rendering views
         | 
| 35 | 
            -
                cattr_accessor :conditional_get_support
         | 
| 36 | 
            +
                cattr_accessor :conditional_get_support, instance_accessor: false
         | 
| 36 37 | 
             
                @@conditional_get_support = false
         | 
| 37 38 |  | 
| 38 39 | 
             
                # enable saving user settings in session (per_page, limit, page, sort, search params)
         | 
| 39 | 
            -
                cattr_accessor :store_user_settings
         | 
| 40 | 
            +
                cattr_accessor :store_user_settings, instance_accessor: false
         | 
| 40 41 | 
             
                @@store_user_settings = true
         | 
| 41 42 |  | 
| 42 43 | 
             
                # lets you disable the DHTML history
         | 
| 43 | 
            -
                 | 
| 44 | 
            -
             | 
| 45 | 
            -
                end
         | 
| 44 | 
            +
                cattr_writer :dhtml_history, instance_accessor: false
         | 
| 45 | 
            +
             | 
| 46 46 | 
             
                def self.dhtml_history?
         | 
| 47 47 | 
             
                  @@dhtml_history ? true : false
         | 
| 48 48 | 
             
                end
         | 
| 49 49 | 
             
                @@dhtml_history = true
         | 
| 50 50 |  | 
| 51 51 | 
             
                # action links are used by actions to tie together. you can use them, too! this is a collection of ActiveScaffold::DataStructures::ActionLink objects.
         | 
| 52 | 
            -
                cattr_reader :action_links
         | 
| 52 | 
            +
                cattr_reader :action_links, instance_reader: false
         | 
| 53 53 | 
             
                @@action_links = ActiveScaffold::DataStructures::ActionLinks.new
         | 
| 54 54 |  | 
| 55 55 | 
             
                # access to the permissions configuration.
         | 
| @@ -65,21 +65,22 @@ module ActiveScaffold::Config | |
| 65 65 | 
             
                def self.ignore_columns
         | 
| 66 66 | 
             
                  @@ignore_columns
         | 
| 67 67 | 
             
                end
         | 
| 68 | 
            +
             | 
| 68 69 | 
             
                def self.ignore_columns=(val)
         | 
| 69 70 | 
             
                  @@ignore_columns = ActiveScaffold::DataStructures::Set.new(*val)
         | 
| 70 71 | 
             
                end
         | 
| 71 72 | 
             
                @@ignore_columns = ActiveScaffold::DataStructures::Set.new
         | 
| 72 73 |  | 
| 73 74 | 
             
                # lets you specify whether add a create link for each sti child
         | 
| 74 | 
            -
                cattr_accessor :sti_create_links
         | 
| 75 | 
            +
                cattr_accessor :sti_create_links, instance_accessor: false
         | 
| 75 76 | 
             
                @@sti_create_links = true
         | 
| 76 77 |  | 
| 77 78 | 
             
                # prefix messages with current timestamp, set the format to display (you can use I18n keys) or true and :short will be used
         | 
| 78 | 
            -
                cattr_accessor :timestamped_messages
         | 
| 79 | 
            +
                cattr_accessor :timestamped_messages, instance_accessor: false
         | 
| 79 80 | 
             
                @@timestamped_messages = false
         | 
| 80 81 |  | 
| 81 82 | 
             
                # a hash of string (or array of strings) and highlighter string to highlight words in messages. It will use highlight rails helper
         | 
| 82 | 
            -
                cattr_accessor :highlight_messages
         | 
| 83 | 
            +
                cattr_accessor :highlight_messages, instance_accessor: false
         | 
| 83 84 | 
             
                @@highlight_messages = nil
         | 
| 84 85 |  | 
| 85 86 | 
             
                # instance-level configuration
         | 
| @@ -153,12 +154,15 @@ module ActiveScaffold::Config | |
| 153 154 | 
             
                  @actions = self.class.actions.clone
         | 
| 154 155 |  | 
| 155 156 | 
             
                  # create a new default columns datastructure, since it doesn't make sense before now
         | 
| 156 | 
            -
                  attribute_names =  | 
| 157 | 
            -
                  association_column_names =  | 
| 158 | 
            -
                   | 
| 157 | 
            +
                  attribute_names = _columns.collect { |c| c.name.to_sym }.sort_by(&:to_s)
         | 
| 158 | 
            +
                  association_column_names = _reflect_on_all_associations.collect { |a| a.name.to_sym }
         | 
| 159 | 
            +
                  if defined?(ActiveMongoid) && model < ActiveMongoid::Associations
         | 
| 160 | 
            +
                    association_column_names.concat model.am_relations.keys.map(&:to_sym)
         | 
| 161 | 
            +
                  end
         | 
| 162 | 
            +
                  @columns = ActiveScaffold::DataStructures::Columns.new(model, attribute_names + association_column_names.sort_by(&:to_s))
         | 
| 159 163 |  | 
| 160 164 | 
             
                  # and then, let's remove some columns from the inheritable set.
         | 
| 161 | 
            -
                  content_columns = Set.new( | 
| 165 | 
            +
                  content_columns = Set.new(_content_columns.map(&:name))
         | 
| 162 166 | 
             
                  @columns.exclude(*self.class.ignore_columns)
         | 
| 163 167 | 
             
                  @columns.exclude(*@columns.find_all { |c| c.column && content_columns.exclude?(c.column.name) }.collect(&:name))
         | 
| 164 168 | 
             
                  @columns.exclude(*model.reflect_on_all_associations.collect { |a| a.foreign_type.to_sym if a.options[:polymorphic] }.compact)
         | 
| @@ -232,6 +236,11 @@ module ActiveScaffold::Config | |
| 232 236 | 
             
                def model
         | 
| 233 237 | 
             
                  @model ||= @model_id.to_s.camelize.constantize
         | 
| 234 238 | 
             
                end
         | 
| 239 | 
            +
                alias active_record_class model
         | 
| 240 | 
            +
             | 
| 241 | 
            +
                def primary_key
         | 
| 242 | 
            +
                  mongoid? ? '_id' : model.primary_key
         | 
| 243 | 
            +
                end
         | 
| 235 244 |  | 
| 236 245 | 
             
                # warning - this won't work as a per-request dynamic attribute in rails 2.0.  You'll need to interact with Controller#generic_view_paths
         | 
| 237 246 | 
             
                def inherited_view_paths
         | 
| @@ -248,11 +257,11 @@ module ActiveScaffold::Config | |
| 248 257 | 
             
                # note that this is unaffected by per-controller frontend configuration.
         | 
| 249 258 | 
             
                def self.javascripts(frontend = self.frontend)
         | 
| 250 259 | 
             
                  javascript_dir = File.join(Rails.public_path, 'javascripts', asset_path('', frontend))
         | 
| 251 | 
            -
                  Dir.entries(javascript_dir).reject { |e| !e.match(/\.js$/) || (! | 
| 260 | 
            +
                  Dir.entries(javascript_dir).reject { |e| !e.match(/\.js$/) || (!dhtml_history? && e.match('dhtml_history')) }
         | 
| 252 261 | 
             
                end
         | 
| 253 262 |  | 
| 254 263 | 
             
                def self.available_frontends
         | 
| 255 | 
            -
                  frontends_dir =  | 
| 264 | 
            +
                  frontends_dir = Rails.root.join('vendor', 'plugins', ActiveScaffold::Config::Core.plugin_directory, 'frontends')
         | 
| 256 265 | 
             
                  Dir.entries(frontends_dir).reject { |e| e.match(/^\./) } # Get rid of files that start with .
         | 
| 257 266 | 
             
                end
         | 
| 258 267 | 
             
              end
         |