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
    
        data/config/locales/ru.yml
    CHANGED
    
    | @@ -1,80 +1,84 @@ | |
| 1 | 
            -
            ru: | 
| 2 | 
            -
              active_scaffold: | 
| 3 | 
            -
                 | 
| 4 | 
            -
                : " | 
| 5 | 
            -
                 | 
| 6 | 
            -
                 | 
| 7 | 
            -
                 | 
| 8 | 
            -
                : " | 
| 9 | 
            -
                ? ">="
         | 
| 10 | 
            -
                : ">="
         | 
| 1 | 
            +
            ru:
         | 
| 2 | 
            +
              active_scaffold:
         | 
| 3 | 
            +
                "!=": "!="
         | 
| 4 | 
            +
                "<": "<"
         | 
| 5 | 
            +
                "<=": "<="
         | 
| 6 | 
            +
                "=": "="
         | 
| 7 | 
            +
                ">": ">"
         | 
| 8 | 
            +
                ">=": ">="
         | 
| 11 9 | 
             
                _select_: "- выбрать -"
         | 
| 12 10 | 
             
                _to_: " to "
         | 
| 13 | 
            -
                add:  | 
| 14 | 
            -
                add_existing:  | 
| 11 | 
            +
                add: Добавить запись
         | 
| 12 | 
            +
                add_existing: Добавить существующую запись
         | 
| 15 13 | 
             
                add_existing_model: "%{model}: добавить существующую запись"
         | 
| 16 | 
            -
                 | 
| 14 | 
            +
                apply: Применить
         | 
| 15 | 
            +
                are_you_sure_to_delete: Удалить %{label}?
         | 
| 17 16 | 
             
                average: Среднее
         | 
| 18 | 
            -
                begins_with:  | 
| 19 | 
            -
                between:  | 
| 17 | 
            +
                begins_with: Начинается с
         | 
| 18 | 
            +
                between: В интервале
         | 
| 20 19 | 
             
                cancel: Отмена
         | 
| 21 | 
            -
                cant_destroy_record:  | 
| 22 | 
            -
                 | 
| 23 | 
            -
                 | 
| 20 | 
            +
                cant_destroy_record: Запись %{record} не может быть удалена
         | 
| 21 | 
            +
                changes: 
         | 
| 22 | 
            +
                click_to_edit: Нажмите для редактирования
         | 
| 23 | 
            +
                click_to_reset: Нажмите для сброса
         | 
| 24 24 | 
             
                close: Закрыть
         | 
| 25 | 
            +
                config_list: Настройки списка
         | 
| 26 | 
            +
                config_list_model: "%{model}: настройки списка"
         | 
| 25 27 | 
             
                contains: Содержит
         | 
| 26 28 | 
             
                create: Создать
         | 
| 27 29 | 
             
                create_another: "%{model}: Создать другую запись"
         | 
| 28 | 
            -
                create_apply:  | 
| 30 | 
            +
                create_apply: 
         | 
| 29 31 | 
             
                create_model: "%{model}: создать запись"
         | 
| 30 | 
            -
                create_new:  | 
| 32 | 
            +
                create_new: Создать новую запись
         | 
| 31 33 | 
             
                created_model: "%{model}: запись создана"
         | 
| 32 34 | 
             
                customize: Настроить
         | 
| 33 | 
            -
                date_picker_options: | 
| 35 | 
            +
                date_picker_options:
         | 
| 34 36 | 
             
                  firstDay: 1
         | 
| 35 37 | 
             
                  isRTL: false
         | 
| 36 38 | 
             
                  showMonthAfterYear: false
         | 
| 37 39 | 
             
                  weekHeader: Нед.
         | 
| 38 | 
            -
                datetime_picker_options: | 
| 39 | 
            -
                  closeText:  | 
| 40 | 
            -
                  currentText:  | 
| 41 | 
            -
                  timeText:  | 
| 40 | 
            +
                datetime_picker_options:
         | 
| 41 | 
            +
                  closeText: Закрыть
         | 
| 42 | 
            +
                  currentText: Текущее время
         | 
| 43 | 
            +
                  timeText: 
         | 
| 42 44 | 
             
                days: дней
         | 
| 43 45 | 
             
                delete: Удалить
         | 
| 44 46 | 
             
                deleted_model: "%{model}: запись удалена"
         | 
| 47 | 
            +
                deleted_records: 
         | 
| 45 48 | 
             
                delimiter: Разделитель
         | 
| 46 49 | 
             
                download: Загрузить
         | 
| 47 50 | 
             
                edit: Изменить
         | 
| 48 | 
            -
                ends_with:  | 
| 49 | 
            -
                error_500:  | 
| 50 | 
            -
                errors: | 
| 51 | 
            -
                  template: | 
| 52 | 
            -
                    body:  | 
| 53 | 
            -
                    header: | 
| 51 | 
            +
                ends_with: Оканчивается на
         | 
| 52 | 
            +
                error_500: 500 ошибка сервера
         | 
| 53 | 
            +
                errors:
         | 
| 54 | 
            +
                  template:
         | 
| 55 | 
            +
                    body: 'Проблемы возникли со следующими полями:'
         | 
| 56 | 
            +
                    header:
         | 
| 54 57 | 
             
                      few: "%{model}: сохранение не удалось из-за %{count} ошибок"
         | 
| 55 58 | 
             
                      many: "%{model}: сохранение не удалось из-за %{count} ошибок"
         | 
| 56 59 | 
             
                      one: "%{model}: сохранение не удалось из-за %{count} ошибки"
         | 
| 57 60 | 
             
                      other: "%{model}: сохранение не удалось из-за %{count} ошибки"
         | 
| 58 61 | 
             
                export: Экспорт
         | 
| 59 | 
            -
                 | 
| 60 | 
            -
                :  | 
| 61 | 
            -
                 | 
| 62 | 
            -
                found: 
         | 
| 62 | 
            +
                'false': Нет
         | 
| 63 | 
            +
                filtered: "(Найденное)"
         | 
| 64 | 
            +
                found:
         | 
| 63 65 | 
             
                  few: записи
         | 
| 64 66 | 
             
                  many: записей
         | 
| 65 67 | 
             
                  one: запись
         | 
| 66 68 | 
             
                  other: записи
         | 
| 67 69 | 
             
                future: Будущие
         | 
| 68 | 
            -
                 | 
| 70 | 
            +
                group_by: 
         | 
| 71 | 
            +
                grouped_by: 
         | 
| 72 | 
            +
                hide: "(Скрыть)"
         | 
| 69 73 | 
             
                hours: часов
         | 
| 70 | 
            -
                human_conditions: | 
| 74 | 
            +
                human_conditions:
         | 
| 71 75 | 
             
                  association: "%{column} = %{value}"
         | 
| 72 76 | 
             
                  boolean: "%{column} = %{value}"
         | 
| 73 77 | 
             
                inplace_edit_handle: "--"
         | 
| 74 | 
            -
                internal_error:  | 
| 78 | 
            +
                internal_error: Внутренняя ошибка
         | 
| 75 79 | 
             
                live_search: Поиск
         | 
| 76 80 | 
             
                loading: Загрузка…
         | 
| 77 | 
            -
                mark_all_records:  | 
| 81 | 
            +
                mark_all_records: Отметить все
         | 
| 78 82 | 
             
                maximum: Максимум
         | 
| 79 83 | 
             
                minimum: Минимум
         | 
| 80 84 | 
             
                minutes: минут
         | 
| @@ -82,62 +86,69 @@ ru: | |
| 82 86 | 
             
                nested_for_model: "%{parent_model} / %{nested_model}"
         | 
| 83 87 | 
             
                nested_of_model: "%{nested_model} @ %{parent_model}"
         | 
| 84 88 | 
             
                next: Следующее
         | 
| 85 | 
            -
                next_month:  | 
| 86 | 
            -
                next_week:  | 
| 87 | 
            -
                next_year:  | 
| 88 | 
            -
                no_authorization_for_action:  | 
| 89 | 
            -
                 | 
| 90 | 
            -
                 | 
| 91 | 
            -
                 | 
| 92 | 
            -
                 | 
| 93 | 
            -
                :  | 
| 94 | 
            -
                 | 
| 95 | 
            -
                 | 
| 89 | 
            +
                next_month: В следующем месяце
         | 
| 90 | 
            +
                next_week: На следующей неделе
         | 
| 91 | 
            +
                next_year: В следующем году
         | 
| 92 | 
            +
                no_authorization_for_action: Нет прав на выполнение действия "%{action}"
         | 
| 93 | 
            +
                no_color: 
         | 
| 94 | 
            +
                no_entries: Нет записей
         | 
| 95 | 
            +
                no_group: 
         | 
| 96 | 
            +
                no_options: Нет вариантов
         | 
| 97 | 
            +
                not_null: Не пусто
         | 
| 98 | 
            +
                'null': Пусто
         | 
| 99 | 
            +
                omit_header: Пропустить заголовок
         | 
| 100 | 
            +
                optional_attributes: Дополнительные настройки
         | 
| 96 101 | 
             
                options: Настройки
         | 
| 97 102 | 
             
                past: Прошедшие
         | 
| 98 103 | 
             
                pdf: PDF
         | 
| 99 | 
            -
                prev_month:  | 
| 100 | 
            -
                prev_week:  | 
| 101 | 
            -
                prev_year:  | 
| 104 | 
            +
                prev_month: В прошлом месяце
         | 
| 105 | 
            +
                prev_week: На прошлой неделе
         | 
| 106 | 
            +
                prev_year: В прошлом году
         | 
| 102 107 | 
             
                previous: Предыдущее
         | 
| 103 108 | 
             
                print: Печать
         | 
| 104 109 | 
             
                range: Интервал
         | 
| 105 | 
            -
                record_not_saved:  | 
| 106 | 
            -
                records_marked: | 
| 107 | 
            -
                  few:  | 
| 108 | 
            -
                  many:  | 
| 109 | 
            -
                  one:  | 
| 110 | 
            -
                  other:  | 
| 110 | 
            +
                record_not_saved: Запись  не может быть сохранена из-за неизвестной ошибки
         | 
| 111 | 
            +
                records_marked:
         | 
| 112 | 
            +
                  few: Отмечено %{count} записи
         | 
| 113 | 
            +
                  many: Отмечено %{count} записей
         | 
| 114 | 
            +
                  one: Отмечена 1 запись
         | 
| 115 | 
            +
                  other: Отмечено %{count} записи
         | 
| 111 116 | 
             
                refresh: Обновить
         | 
| 112 117 | 
             
                remove: Удалить
         | 
| 113 | 
            -
                remove_file:  | 
| 114 | 
            -
                replace_existing:  | 
| 115 | 
            -
                replace_with_new:  | 
| 118 | 
            +
                remove_file: Удалить или заменить файл
         | 
| 119 | 
            +
                replace_existing: Заменить существующим
         | 
| 120 | 
            +
                replace_with_new: Заменить новым
         | 
| 116 121 | 
             
                reset: Сброс
         | 
| 117 122 | 
             
                revisions_for_model: "%{model}: редакции"
         | 
| 118 123 | 
             
                saving: Сохранение…
         | 
| 119 124 | 
             
                search: Поиск
         | 
| 120 | 
            -
                search_terms:  | 
| 125 | 
            +
                search_terms: Ключевые слова
         | 
| 121 126 | 
             
                seconds: секунд
         | 
| 122 127 | 
             
                show: Показать
         | 
| 123 | 
            -
                show_block: (Показать)
         | 
| 128 | 
            +
                show_block: "(Показать)"
         | 
| 124 129 | 
             
                show_model: "%{model}: показать запись"
         | 
| 125 130 | 
             
                sum: Сумма
         | 
| 126 | 
            -
                this_month:  | 
| 127 | 
            -
                this_week:  | 
| 128 | 
            -
                this_year:  | 
| 131 | 
            +
                this_month: В этом месяце
         | 
| 132 | 
            +
                this_week: На этой неделе
         | 
| 133 | 
            +
                this_year: В этом году
         | 
| 129 134 | 
             
                today: Сегодня
         | 
| 130 135 | 
             
                tomorrow: Завтра
         | 
| 131 | 
            -
                 | 
| 132 | 
            -
                :  | 
| 133 | 
            -
                 | 
| 134 | 
            -
                update_apply: Применить
         | 
| 136 | 
            +
                'true': Да
         | 
| 137 | 
            +
                update: Обновить запись
         | 
| 138 | 
            +
                update_apply: 
         | 
| 135 139 | 
             
                update_model: "%{model}: обновить запись"
         | 
| 136 140 | 
             
                updated_model: "%{model}: запись обновлена"
         | 
| 137 | 
            -
                version_inconsistency:  | 
| 141 | 
            +
                version_inconsistency: Эта запись была обновлена с того момента, как вы начали ее редактировать
         | 
| 138 142 | 
             
                weeks: недель
         | 
| 139 143 | 
             
                years: лет
         | 
| 140 144 | 
             
                yesterday: Вчера
         | 
| 141 | 
            -
               | 
| 142 | 
            -
                formats: | 
| 145 | 
            +
              date:
         | 
| 146 | 
            +
                formats:
         | 
| 147 | 
            +
                  month: 
         | 
| 148 | 
            +
                  quarter: 
         | 
| 149 | 
            +
                  week: 
         | 
| 150 | 
            +
                  year_month: 
         | 
| 151 | 
            +
                  year_quarter: 
         | 
| 152 | 
            +
              time:
         | 
| 153 | 
            +
                formats:
         | 
| 143 154 | 
             
                  picker: "%a, %d %b %Y %H:%M:%S"
         | 
    
        data/lib/active_scaffold.rb
    CHANGED
    
    | @@ -8,6 +8,7 @@ module ActiveScaffold | |
| 8 8 | 
             
              autoload :DelayedSetup, 'active_scaffold/delayed_setup'
         | 
| 9 9 | 
             
              autoload :Finder, 'active_scaffold/finder'
         | 
| 10 10 | 
             
              autoload :MarkedModel, 'active_scaffold/marked_model'
         | 
| 11 | 
            +
              autoload :OrmChecks, 'active_scaffold/orm_checks'
         | 
| 11 12 | 
             
              autoload :RespondsToParent, 'active_scaffold/responds_to_parent'
         | 
| 12 13 | 
             
              autoload :Tableless, 'active_scaffold/tableless'
         | 
| 13 14 | 
             
              autoload :Version, 'active_scaffold/version'
         | 
| @@ -91,5 +92,7 @@ module ActiveScaffold | |
| 91 92 | 
             
              end
         | 
| 92 93 | 
             
            end
         | 
| 93 94 | 
             
            require 'active_scaffold/engine'
         | 
| 95 | 
            +
            require 'ice_nine'
         | 
| 96 | 
            +
            require 'ice_nine/core_ext/object'
         | 
| 94 97 | 
             
            # TODO: clean up extensions. some could be organized for autoloading, and others could be removed entirely.
         | 
| 95 98 | 
             
            Dir["#{File.dirname __FILE__}/active_scaffold/extensions/*.rb"].each { |file| require file }
         | 
| @@ -3,9 +3,9 @@ module ActiveScaffold::Actions | |
| 3 3 | 
             
                def self.included(base)
         | 
| 4 4 | 
             
                  unless base < InstanceMethods
         | 
| 5 5 | 
             
                    base.send :include, InstanceMethods
         | 
| 6 | 
            -
                    base. | 
| 7 | 
            -
                    base. | 
| 8 | 
            -
                    base. | 
| 6 | 
            +
                    base.before_action :search_authorized_filter, :only => :show_search
         | 
| 7 | 
            +
                    base.before_action :store_search_params_into_session, :only => [:index]
         | 
| 8 | 
            +
                    base.before_action :do_search, :only => [:index]
         | 
| 9 9 | 
             
                    base.helper_method :search_params
         | 
| 10 10 | 
             
                  end
         | 
| 11 11 | 
             
                end
         | 
| @@ -17,8 +17,7 @@ module ActiveScaffold::Actions | |
| 17 17 |  | 
| 18 18 | 
             
                  protected
         | 
| 19 19 |  | 
| 20 | 
            -
                  def do_search
         | 
| 21 | 
            -
                  end
         | 
| 20 | 
            +
                  def do_search; end
         | 
| 22 21 |  | 
| 23 22 | 
             
                  def search_partial
         | 
| 24 23 | 
             
                    @_search_partial ||=
         | 
| @@ -29,12 +28,17 @@ module ActiveScaffold::Actions | |
| 29 28 | 
             
                      end
         | 
| 30 29 | 
             
                  end
         | 
| 31 30 |  | 
| 31 | 
            +
                  def permitted_search_params
         | 
| 32 | 
            +
                    params_hash params[:search]
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 32 35 | 
             
                  def store_search_params_into_session
         | 
| 33 36 | 
             
                    if active_scaffold_config.store_user_settings
         | 
| 34 | 
            -
                      active_scaffold_session_storage['search'] =  | 
| 37 | 
            +
                      active_scaffold_session_storage['search'] = permitted_search_params if params[:search]
         | 
| 35 38 | 
             
                    else
         | 
| 36 | 
            -
                      @search_params =  | 
| 39 | 
            +
                      @search_params = permitted_search_params
         | 
| 37 40 | 
             
                    end
         | 
| 41 | 
            +
                    params.delete :search
         | 
| 38 42 | 
             
                  end
         | 
| 39 43 |  | 
| 40 44 | 
             
                  def search_params
         | 
| @@ -2,15 +2,17 @@ module ActiveScaffold::Actions | |
| 2 2 | 
             
              module Core
         | 
| 3 3 | 
             
                def self.included(base)
         | 
| 4 4 | 
             
                  base.class_eval do
         | 
| 5 | 
            -
                     | 
| 6 | 
            -
                     | 
| 7 | 
            -
                     | 
| 8 | 
            -
                     | 
| 9 | 
            -
                     | 
| 5 | 
            +
                    before_action :set_vary_accept_header
         | 
| 6 | 
            +
                    before_action :handle_user_settings
         | 
| 7 | 
            +
                    before_action :check_input_device
         | 
| 8 | 
            +
                    before_action :register_constraints_with_action_columns, :unless => :nested?
         | 
| 9 | 
            +
                    after_action :clear_flashes
         | 
| 10 | 
            +
                    after_action :clear_storage
         | 
| 10 11 | 
             
                    rescue_from ActiveScaffold::RecordNotAllowed, ActiveScaffold::ActionNotAllowed, :with => :deny_access
         | 
| 11 12 | 
             
                  end
         | 
| 12 13 | 
             
                  base.helper_method :successful?
         | 
| 13 14 | 
             
                  base.helper_method :nested?
         | 
| 15 | 
            +
                  base.helper_method :grouped_search?
         | 
| 14 16 | 
             
                  base.helper_method :embedded?
         | 
| 15 17 | 
             
                  base.helper_method :loading_embedded?
         | 
| 16 18 | 
             
                  base.helper_method :calculate_query
         | 
| @@ -18,6 +20,7 @@ module ActiveScaffold::Actions | |
| 18 20 | 
             
                  base.helper_method :touch_device?
         | 
| 19 21 | 
             
                  base.helper_method :hover_via_click?
         | 
| 20 22 | 
             
                end
         | 
| 23 | 
            +
             | 
| 21 24 | 
             
                def render_field
         | 
| 22 25 | 
             
                  if request.get?
         | 
| 23 26 | 
             
                    render_field_for_inplace_editing
         | 
| @@ -33,7 +36,7 @@ module ActiveScaffold::Actions | |
| 33 36 | 
             
                protected
         | 
| 34 37 |  | 
| 35 38 | 
             
                def loading_embedded?
         | 
| 36 | 
            -
                  @loading_embedded ||=  | 
| 39 | 
            +
                  @loading_embedded ||= active_scaffold_embedded_params.delete(:loading)
         | 
| 37 40 | 
             
                end
         | 
| 38 41 |  | 
| 39 42 | 
             
                def embedded?
         | 
| @@ -44,6 +47,10 @@ module ActiveScaffold::Actions | |
| 44 47 | 
             
                  false
         | 
| 45 48 | 
             
                end
         | 
| 46 49 |  | 
| 50 | 
            +
                def grouped_search?
         | 
| 51 | 
            +
                  false
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
             | 
| 47 54 | 
             
                def render_field_for_inplace_editing
         | 
| 48 55 | 
             
                  @column = active_scaffold_config.columns[params[:update_column]]
         | 
| 49 56 | 
             
                  @record = find_if_allowed(params[:id], :crud_type => :update, :column => params[:update_column])
         | 
| @@ -65,13 +72,13 @@ module ActiveScaffold::Actions | |
| 65 72 | 
             
                    else
         | 
| 66 73 | 
             
                      updated_record_with_column(@column, params.delete(:value), @scope)
         | 
| 67 74 | 
             
                    end
         | 
| 68 | 
            -
                  set_parent(@record) if  | 
| 75 | 
            +
                  set_parent(@record) if main_form_controller && @scope
         | 
| 69 76 | 
             
                  after_render_field(@record, @column)
         | 
| 70 77 | 
             
                end
         | 
| 71 78 |  | 
| 72 79 | 
             
                def updated_record_with_form(columns, attributes, scope)
         | 
| 73 80 | 
             
                  if attributes && scope
         | 
| 74 | 
            -
                    attributes = scope. | 
| 81 | 
            +
                    attributes = scope.delete('[').split(']').inject(attributes) { |h, idx| h[idx] }
         | 
| 75 82 | 
             
                    id = attributes[:id]
         | 
| 76 83 | 
             
                  else
         | 
| 77 84 | 
             
                    id = params[:id]
         | 
| @@ -88,7 +95,7 @@ module ActiveScaffold::Actions | |
| 88 95 | 
             
                end
         | 
| 89 96 |  | 
| 90 97 | 
             
                def updated_record_with_column(column, value, scope)
         | 
| 91 | 
            -
                  record = params[:id] ? find_if_allowed(params[:id], :read) | 
| 98 | 
            +
                  record = params[:id] ? copy_attributes(find_if_allowed(params[:id], :read)) : new_model
         | 
| 92 99 | 
             
                  apply_constraints_to_record(record) unless scope || params[:id]
         | 
| 93 100 | 
             
                  value = column_value_from_param_value(record, column, value)
         | 
| 94 101 | 
             
                  record.send "#{column.name}=", value
         | 
| @@ -96,39 +103,55 @@ module ActiveScaffold::Actions | |
| 96 103 | 
             
                  record
         | 
| 97 104 | 
             
                end
         | 
| 98 105 |  | 
| 106 | 
            +
                def subform_child_association
         | 
| 107 | 
            +
                  params[:child_association].presence || (@scope.split(']').first.sub(/^\[/, '').presence if @scope)
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                def parent_controller_name
         | 
| 111 | 
            +
                  "#{params[:parent_controller].camelize}Controller"
         | 
| 112 | 
            +
                end
         | 
| 113 | 
            +
             | 
| 99 114 | 
             
                def set_parent(record)
         | 
| 100 | 
            -
                   | 
| 101 | 
            -
                   | 
| 102 | 
            -
                  child_association = params[:child_association].presence || @scope.split(']').first.sub(/^\[/, '')
         | 
| 103 | 
            -
                  association = parent_model.reflect_on_association(child_association.to_sym).try(:reverse)
         | 
| 115 | 
            +
                  cfg = main_form_controller.active_scaffold_config
         | 
| 116 | 
            +
                  association = cfg.columns[subform_child_association].try(:association).try(:reverse_association)
         | 
| 104 117 | 
             
                  return if association.nil?
         | 
| 105 118 |  | 
| 119 | 
            +
                  parent_model = cfg.model
         | 
| 106 120 | 
             
                  parent = parent_model.new
         | 
| 107 | 
            -
                  copy_attributes( | 
| 121 | 
            +
                  copy_attributes(find_if_allowed(params[:parent_id], :read, parent_model), parent) if params[:parent_id]
         | 
| 108 122 | 
             
                  parent.id = params[:parent_id]
         | 
| 109 | 
            -
                  parent = update_record_from_params(parent,  | 
| 123 | 
            +
                  parent = update_record_from_params(parent, cfg.send(params[:parent_id] ? :update : :create).columns, params[:record], true) if @column.send_form_on_update_column
         | 
| 110 124 | 
             
                  apply_constraints_to_record(parent) unless params[:parent_id]
         | 
| 111 | 
            -
                  if  | 
| 112 | 
            -
                    record.send(association) << parent
         | 
| 125 | 
            +
                  if association.collection?
         | 
| 126 | 
            +
                    record.send(association.name) << parent
         | 
| 113 127 | 
             
                  else
         | 
| 114 | 
            -
                    record.send("#{association}=", parent)
         | 
| 128 | 
            +
                    record.send("#{association.name}=", parent)
         | 
| 129 | 
            +
                  end
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                  if params[:nested] # form in nested scaffold, set nested parent_record to parent
         | 
| 132 | 
            +
                    nested = ActiveScaffold::DataStructures::NestedInfo.get(parent.class, params.delete(:nested))
         | 
| 133 | 
            +
                    if nested.child_association
         | 
| 134 | 
            +
                      apply_constraints_to_record(parent, constraints: {nested.child_association.name => nested.parent_id})
         | 
| 135 | 
            +
                    end
         | 
| 115 136 | 
             
                  end
         | 
| 137 | 
            +
                  parent
         | 
| 116 138 | 
             
                end
         | 
| 117 139 |  | 
| 118 140 | 
             
                def copy_attributes(orig, dst = nil)
         | 
| 119 141 | 
             
                  dst ||= orig.class.new
         | 
| 120 | 
            -
                  attributes  | 
| 121 | 
            -
                  if orig.class.respond_to?(:accessible_attributes) && orig.class.accessible_attributes.present?
         | 
| 122 | 
            -
                    attributes.each { |attr, value| dst.send :write_attribute, attr, value if orig.class.accessible_attributes.deny? attr }
         | 
| 123 | 
            -
                    attributes = attributes.slice(*orig.class.accessible_attributes)
         | 
| 124 | 
            -
                  elsif orig.class.respond_to? :protected_attributes
         | 
| 125 | 
            -
                    orig.class.protected_attributes.each { |attr| dst.send :write_attribute, attr, orig[attr] if attr.present? }
         | 
| 126 | 
            -
                    attributes = attributes.except(*orig.class.protected_attributes)
         | 
| 127 | 
            -
                  end
         | 
| 128 | 
            -
                  dst.attributes = attributes
         | 
| 142 | 
            +
                  orig.attributes.each { |attr, value| dst.send :write_attribute, attr, value }
         | 
| 129 143 | 
             
                  dst
         | 
| 130 144 | 
             
                end
         | 
| 131 145 |  | 
| 146 | 
            +
                def parent_sti_controller
         | 
| 147 | 
            +
                  return unless params[:parent_sti]
         | 
| 148 | 
            +
                  unless defined? @parent_sti_controller
         | 
| 149 | 
            +
                    controller = look_for_parent_sti_controller
         | 
| 150 | 
            +
                    @parent_sti_controller = controller.controller_path == params[:parent_sti] ? controller : false
         | 
| 151 | 
            +
                  end
         | 
| 152 | 
            +
                  @parent_sti_controller
         | 
| 153 | 
            +
                end
         | 
| 154 | 
            +
             | 
| 132 155 | 
             
                # override this method if you want to do something after render_field
         | 
| 133 156 | 
             
                def after_render_field(record, column); end
         | 
| 134 157 |  | 
| @@ -149,7 +172,7 @@ module ActiveScaffold::Actions | |
| 149 172 | 
             
                end
         | 
| 150 173 |  | 
| 151 174 | 
             
                def default_formats
         | 
| 152 | 
            -
                  [ | 
| 175 | 
            +
                  %i[html js json xml]
         | 
| 153 176 | 
             
                end
         | 
| 154 177 |  | 
| 155 178 | 
             
                # Returns true if the client accepts one of the MIME types passed to it
         | 
| @@ -192,12 +215,15 @@ module ActiveScaffold::Actions | |
| 192 215 | 
             
                end
         | 
| 193 216 |  | 
| 194 217 | 
             
                def successful=(val)
         | 
| 195 | 
            -
                  @successful =  | 
| 218 | 
            +
                  @successful = val ? true : false
         | 
| 196 219 | 
             
                end
         | 
| 197 220 |  | 
| 198 221 | 
             
                # Redirect to the main page (override if the ActiveScaffold is used as a component on another controllers page) for Javascript degradation
         | 
| 199 222 | 
             
                def return_to_main
         | 
| 200 | 
            -
                   | 
| 223 | 
            +
                  options = main_path_to_return
         | 
| 224 | 
            +
                  # use url_for in case main_path_to_return returns Hash with status param,
         | 
| 225 | 
            +
                  # which would be interpreted as status option to redirect_to instead of url param
         | 
| 226 | 
            +
                  redirect_to options.is_a?(Hash) ? url_for(options) : options
         | 
| 201 227 | 
             
                end
         | 
| 202 228 |  | 
| 203 229 | 
             
                # Overide this method on your controller to provide model with named scopes
         | 
| @@ -210,37 +236,43 @@ module ActiveScaffold::Actions | |
| 210 236 | 
             
                  @conditions_from_params ||= begin
         | 
| 211 237 | 
             
                    conditions = {}
         | 
| 212 238 | 
             
                    params.except(:controller, :action, :page, :sort, :sort_direction, :format, :id).each do |key, value|
         | 
| 213 | 
            -
                      column = active_scaffold_config. | 
| 239 | 
            +
                      column = active_scaffold_config._columns_hash[key.to_s]
         | 
| 214 240 | 
             
                      next unless column
         | 
| 215 241 | 
             
                      key = key.to_sym
         | 
| 216 | 
            -
                      not_string = [ | 
| 242 | 
            +
                      not_string = %i[string text].exclude?(column.type)
         | 
| 217 243 | 
             
                      next if active_scaffold_constraints[key]
         | 
| 218 244 | 
             
                      next if nested? && nested.param_name == key
         | 
| 245 | 
            +
             | 
| 246 | 
            +
                      range = %i[date datetime].include?(column.type) && value.is_a?(String) && value.scan('..').size == 1
         | 
| 247 | 
            +
                      value = value.split('..') if range
         | 
| 219 248 | 
             
                      conditions[key] =
         | 
| 220 249 | 
             
                        if value.is_a?(Array)
         | 
| 221 250 | 
             
                          value.map { |v| v == '' && not_string ? nil : ActiveScaffold::Core.column_type_cast(v, column) }
         | 
| 222 251 | 
             
                        else
         | 
| 223 252 | 
             
                          value == '' && not_string ? nil : ActiveScaffold::Core.column_type_cast(value, column)
         | 
| 224 253 | 
             
                        end
         | 
| 254 | 
            +
                      conditions[key] = Range.new(*conditions[key]) if range
         | 
| 225 255 | 
             
                    end
         | 
| 226 256 | 
             
                    conditions
         | 
| 227 257 | 
             
                  end
         | 
| 228 258 | 
             
                end
         | 
| 229 259 |  | 
| 230 260 | 
             
                def new_model
         | 
| 231 | 
            -
                   | 
| 232 | 
            -
                   | 
| 261 | 
            +
                  relation = beginning_of_chain
         | 
| 262 | 
            +
                  config = active_scaffold_config_for(relation.klass) if nested? && nested.plural_association?
         | 
| 263 | 
            +
                  if config && config._columns_hash[column = relation.klass.inheritance_column]
         | 
| 233 264 | 
             
                    model_name = params.delete(column) # in new action inheritance_column must be in params
         | 
| 234 | 
            -
                    model_name ||= params[:record].delete(column)  | 
| 265 | 
            +
                    model_name ||= params[:record].delete(column) if params[:record].present? # in create action must be inside record key
         | 
| 235 266 | 
             
                    model_name = model_name.camelize if model_name
         | 
| 236 267 | 
             
                    model_name ||= active_scaffold_config.model.name
         | 
| 237 268 | 
             
                    build_options = {column.to_sym => model_name} if model_name
         | 
| 238 269 | 
             
                  end
         | 
| 239 | 
            -
                   | 
| 270 | 
            +
                  relation.respond_to?(:build) ? relation.build(build_options || {}) : relation.new
         | 
| 240 271 | 
             
                end
         | 
| 241 272 |  | 
| 242 273 | 
             
                def get_row(crud_type_or_security_options = :read)
         | 
| 243 | 
            -
                  klass = beginning_of_chain | 
| 274 | 
            +
                  klass = beginning_of_chain
         | 
| 275 | 
            +
                  klass = klass.preload(active_scaffold_preload) unless active_scaffold_config.mongoid?
         | 
| 244 276 | 
             
                  @record = find_if_allowed(params[:id], crud_type_or_security_options, klass)
         | 
| 245 277 | 
             
                end
         | 
| 246 278 |  | 
| @@ -255,9 +287,17 @@ module ActiveScaffold::Actions | |
| 255 287 | 
             
                  session[session_index]
         | 
| 256 288 | 
             
                end
         | 
| 257 289 |  | 
| 290 | 
            +
                def active_scaffold_embedded_params
         | 
| 291 | 
            +
                  params[:embedded] || {}
         | 
| 292 | 
            +
                end
         | 
| 293 | 
            +
             | 
| 258 294 | 
             
                def clear_storage
         | 
| 259 295 | 
             
                  session_index = active_scaffold_session_storage_key
         | 
| 260 | 
            -
                  session.delete(session_index)  | 
| 296 | 
            +
                  session.delete(session_index) if session[session_index].blank?
         | 
| 297 | 
            +
                end
         | 
| 298 | 
            +
             | 
| 299 | 
            +
                def set_vary_accept_header
         | 
| 300 | 
            +
                  response.headers['Vary'] = 'Accept'
         | 
| 261 301 | 
             
                end
         | 
| 262 302 |  | 
| 263 303 | 
             
                # at some point we need to pass the session and params into config. we'll just take care of that before any particular action occurs by passing those hashes off to the UserSettings class of each action.
         | 
| @@ -271,13 +311,15 @@ module ActiveScaffold::Actions | |
| 271 311 | 
             
                end
         | 
| 272 312 |  | 
| 273 313 | 
             
                def check_input_device
         | 
| 274 | 
            -
                  if  | 
| 275 | 
            -
                     | 
| 276 | 
            -
             | 
| 277 | 
            -
             | 
| 278 | 
            -
                     | 
| 279 | 
            -
             | 
| 280 | 
            -
             | 
| 314 | 
            +
                  if session[:input_device_type].nil?
         | 
| 315 | 
            +
                    if request.env['HTTP_USER_AGENT'] && request.env['HTTP_USER_AGENT'][/(iPhone|iPod|iPad)/i]
         | 
| 316 | 
            +
                      session[:input_device_type] = 'TOUCH'
         | 
| 317 | 
            +
                      session[:hover_supported] = false
         | 
| 318 | 
            +
                    else
         | 
| 319 | 
            +
                      session[:input_device_type] = 'MOUSE'
         | 
| 320 | 
            +
                      session[:hover_supported] = true
         | 
| 321 | 
            +
                    end
         | 
| 322 | 
            +
                  end
         | 
| 281 323 | 
             
                end
         | 
| 282 324 |  | 
| 283 325 | 
             
                def touch_device?
         | 
| @@ -288,6 +330,22 @@ module ActiveScaffold::Actions | |
| 288 330 | 
             
                  session[:hover_supported] == false
         | 
| 289 331 | 
             
                end
         | 
| 290 332 |  | 
| 333 | 
            +
                def params_hash?(value)
         | 
| 334 | 
            +
                  value.is_a?(Hash) || controller_params?(value)
         | 
| 335 | 
            +
                end
         | 
| 336 | 
            +
             | 
| 337 | 
            +
                def controller_params?(value)
         | 
| 338 | 
            +
                  value.is_a?(::ActionController::Parameters)
         | 
| 339 | 
            +
                end
         | 
| 340 | 
            +
             | 
| 341 | 
            +
                def params_hash(value)
         | 
| 342 | 
            +
                  if controller_params?(value)
         | 
| 343 | 
            +
                    Rails.version < '4.2' ? value.clone.permit! : value.to_unsafe_h.with_indifferent_access
         | 
| 344 | 
            +
                  else
         | 
| 345 | 
            +
                    value
         | 
| 346 | 
            +
                  end
         | 
| 347 | 
            +
                end
         | 
| 348 | 
            +
             | 
| 291 349 | 
             
                # call this method in your action_link action to simplify processing of actions
         | 
| 292 350 | 
             
                # eg for member action_link :fire
         | 
| 293 351 | 
             
                # process_action_link_action do |record|
         | 
| @@ -362,11 +420,11 @@ module ActiveScaffold::Actions | |
| 362 420 | 
             
                end
         | 
| 363 421 |  | 
| 364 422 | 
             
                def virtual_columns(columns)
         | 
| 365 | 
            -
                  columns.reject { |col| active_scaffold_config.model.columns_hash[col.to_s] || active_scaffold_config. | 
| 423 | 
            +
                  columns.reject { |col| active_scaffold_config.model.columns_hash[col.to_s] || active_scaffold_config.columns[col].try(:association) }
         | 
| 366 424 | 
             
                end
         | 
| 367 425 |  | 
| 368 426 | 
             
                def association_columns(columns)
         | 
| 369 | 
            -
                  columns.select { |col| active_scaffold_config. | 
| 427 | 
            +
                  columns.select { |col| active_scaffold_config.columns[col].try(:association) }
         | 
| 370 428 | 
             
                end
         | 
| 371 429 |  | 
| 372 430 | 
             
                private
         | 
| @@ -392,5 +450,19 @@ module ActiveScaffold::Actions | |
| 392 450 | 
             
                      (default_formats + active_scaffold_config.formats).uniq
         | 
| 393 451 | 
             
                    end
         | 
| 394 452 | 
             
                end
         | 
| 453 | 
            +
             | 
| 454 | 
            +
                def look_for_parent_sti_controller
         | 
| 455 | 
            +
                  klass = self.class.active_scaffold_config.model
         | 
| 456 | 
            +
                  loop do
         | 
| 457 | 
            +
                    klass = klass.superclass
         | 
| 458 | 
            +
                    controller = self.class.active_scaffold_controller_for(klass)
         | 
| 459 | 
            +
                    cfg = controller.active_scaffold_config if controller.uses_active_scaffold?
         | 
| 460 | 
            +
                    next unless cfg && cfg.add_sti_create_links?
         | 
| 461 | 
            +
                    return controller if cfg.sti_children.map(&:to_s).include? self.class.active_scaffold_config.model.name.underscore
         | 
| 462 | 
            +
                  end
         | 
| 463 | 
            +
                rescue ActiveScaffold::ControllerNotFound => ex
         | 
| 464 | 
            +
                  logger.warn "#{ex.message} looking for parent_sti of #{self.class.active_scaffold_config.model.name}"
         | 
| 465 | 
            +
                  nil
         | 
| 466 | 
            +
                end
         | 
| 395 467 | 
             
              end
         | 
| 396 468 | 
             
            end
         |