Full Code of leikind/wice_grid for AI

rails7 512a2c200d5d cached
396 files
1.4 MB
475.7k tokens
999 symbols
1 requests
Download .txt
Showing preview only (1,547K chars total). Download the full file or copy to clipboard to get everything.
Repository: leikind/wice_grid
Branch: rails7
Commit: 512a2c200d5d
Files: 396
Total size: 1.4 MB

Directory structure:
gitextract_k8x_hooj/

├── .circleci/
│   ├── config.yml
│   └── run-build-locally.sh
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── bug_report.md
│   └── dependabot.yml
├── .gitignore
├── .inch.yml
├── .rspec
├── .rubocop.yml
├── Appraisals
├── CHANGELOG.md
├── Gemfile
├── Guardfile
├── MIT-LICENSE
├── README.md
├── Rakefile
├── SAVED_QUERIES_HOWTO.md
├── app/
│   └── views/
│       └── kaminari/
│           └── wice_grid/
│               ├── _gap.html.erb
│               ├── _next_page.html.erb
│               ├── _page.html.erb
│               ├── _paginator.html.erb
│               └── _prev_page.html.erb
├── config/
│   └── locales/
│       ├── cz.yml
│       ├── de.yml
│       ├── en.yml
│       ├── es.yml
│       ├── fr.yml
│       ├── is.yml
│       ├── it.yml
│       ├── ja.yml
│       ├── nl.yml
│       ├── pt-BR.yml
│       ├── pt.yml
│       ├── ru.yml
│       ├── sk.yml
│       ├── uk.yml
│       └── zh.yml
├── gemfiles/
│   ├── rails_5.0.gemfile
│   ├── rails_5.1.gemfile
│   └── rails_5.2.gemfile
├── lib/
│   ├── generators/
│   │   └── wice_grid/
│   │       ├── add_migration_for_serialized_queries_generator.rb
│   │       ├── install_generator.rb
│   │       └── templates/
│   │           ├── create_wice_grid_serialized_queries.rb
│   │           └── wice_grid_config.rb
│   ├── wice/
│   │   ├── active_record_column_wrapper.rb
│   │   ├── columns/
│   │   │   ├── column_action.rb
│   │   │   ├── column_boolean.rb
│   │   │   ├── column_bootstrap_datepicker.rb
│   │   │   ├── column_custom_dropdown.rb
│   │   │   ├── column_float.rb
│   │   │   ├── column_html5_datepicker.rb
│   │   │   ├── column_integer.rb
│   │   │   ├── column_jquery_datepicker.rb
│   │   │   ├── column_processor_index.rb
│   │   │   ├── column_rails_date_helper.rb
│   │   │   ├── column_rails_datetime_helper.rb
│   │   │   ├── column_range.rb
│   │   │   ├── column_string.rb
│   │   │   ├── common_date_datetime_mixin.rb
│   │   │   ├── common_js_date_datetime_conditions_generator_mixin.rb
│   │   │   ├── common_js_date_datetime_mixin.rb
│   │   │   ├── common_rails_date_datetime_conditions_generator_mixin.rb
│   │   │   └── common_standard_helper_date_datetime_mixin.rb
│   │   ├── columns.rb
│   │   ├── grid_output_buffer.rb
│   │   ├── grid_renderer.rb
│   │   ├── helpers/
│   │   │   ├── bs_calendar_helpers.rb
│   │   │   ├── js_calendar_helpers.rb
│   │   │   ├── wice_grid_misc_view_helpers.rb
│   │   │   ├── wice_grid_serialized_queries_view_helpers.rb
│   │   │   └── wice_grid_view_helpers.rb
│   │   ├── kaminari_monkey_patching.rb
│   │   ├── table_column_matrix.rb
│   │   ├── wice_grid_controller.rb
│   │   ├── wice_grid_core_ext.rb
│   │   ├── wice_grid_misc.rb
│   │   ├── wice_grid_serialized_queries_controller.rb
│   │   ├── wice_grid_serialized_query.rb
│   │   └── wice_grid_spreadsheet.rb
│   └── wice_grid.rb
├── package.json
├── spec/
│   ├── acceptance_helper.rb
│   ├── features/
│   │   ├── action_column_request_spec.rb
│   │   ├── adding_rows_request_spec.rb
│   │   ├── all_records_request_spec.rb
│   │   ├── auto_reloads2_request_spec.rb
│   │   ├── auto_reloads3_request_spec.rb
│   │   ├── auto_reloads_request_spec.rb
│   │   ├── basics1_request_spec.rb
│   │   ├── basics2_request_spec.rb
│   │   ├── basics3_request_spec.rb
│   │   ├── basics4_request_spec.rb
│   │   ├── basics5_request_spec.rb
│   │   ├── basics6_request_spec.rb
│   │   ├── blockless_column_definition_spec.rb
│   │   ├── buttons_request_spec.rb
│   │   ├── csv_and_detached_filters_spec.rb
│   │   ├── csv_export_request_spec.rb
│   │   ├── custom_filter_params_request_spec.rb
│   │   ├── custom_filters1_request_spec.rb
│   │   ├── custom_filters2_request_spec.rb
│   │   ├── custom_filters3_request_spec.rb
│   │   ├── custom_filters4_request_spec.rb
│   │   ├── custom_ordering_on_calculated_request_spec.rb
│   │   ├── custom_ordering_request_spec.rb
│   │   ├── custom_ordering_with_arel_request_spec.rb
│   │   ├── custom_ordering_with_proc_request_spec.rb
│   │   ├── custom_ordering_with_ruby_request_spec.rb
│   │   ├── dates_request_spec.rb
│   │   ├── detached_filters_spec.rb
│   │   ├── detached_filters_two_grids_spec.rb
│   │   ├── disable_all_filters_spec.rb
│   │   ├── hiding_checkboxes_in_action_column_request_spec.rb
│   │   ├── integration_with_application_view_request_spec.rb
│   │   ├── integration_with_forms_request_spec.rb
│   │   ├── joining_tables_spec.rb
│   │   ├── localization_request_spec.rb
│   │   ├── many_grids_on_page_request_spec.rb
│   │   ├── negation_request_spec.rb
│   │   ├── no_records_request_spec.rb
│   │   ├── numeric_filters_request_spec.rb
│   │   ├── resultset_processings2_request_spec.rb
│   │   ├── resultset_processings_request_spec.rb
│   │   ├── saved_queries_request_spec.rb
│   │   ├── shared.rb
│   │   ├── shared_detached_filters.rb
│   │   ├── styling_spec.rb
│   │   ├── two_associations_spec.rb
│   │   ├── upper_pagination_panel_request_spec.rb
│   │   └── when_filtered_spec.rb
│   ├── fixtures/
│   │   ├── .gitkeep
│   │   ├── companies.yml
│   │   ├── priorities.yml
│   │   ├── project_roles.yml
│   │   ├── projects.yml
│   │   ├── statuses.yml
│   │   ├── tasks.yml
│   │   ├── tasks_users.yml
│   │   ├── users.yml
│   │   └── versions.yml
│   ├── models/
│   │   ├── company_spec.rb
│   │   ├── priority_spec.rb
│   │   ├── project_spec.rb
│   │   ├── status_spec.rb
│   │   ├── task_spec.rb
│   │   ├── user_project_participation_spec.rb
│   │   ├── user_spec.rb
│   │   └── version_spec.rb
│   ├── rails_helper.rb
│   ├── schema.rb
│   ├── spec_helper.rb
│   ├── support/
│   │   ├── active_record.rb
│   │   ├── download_helper.rb
│   │   └── test_app/
│   │       ├── Rakefile
│   │       ├── app/
│   │       │   ├── assets/
│   │       │   │   ├── builds/
│   │       │   │   │   ├── .keep
│   │       │   │   │   └── application.css
│   │       │   │   ├── config/
│   │       │   │   │   └── manifest.js
│   │       │   │   └── stylesheets/
│   │       │   │       ├── adding_rows.scss
│   │       │   │       ├── application.scss
│   │       │   │       ├── csv_and_detached_filters.scss
│   │       │   │       └── many_grids_on_page.scss
│   │       │   ├── controllers/
│   │       │   │   ├── action_column_controller.rb
│   │       │   │   ├── adding_rows_controller.rb
│   │       │   │   ├── all_records_controller.rb
│   │       │   │   ├── application_controller.rb
│   │       │   │   ├── auto_reloads2_controller.rb
│   │       │   │   ├── auto_reloads3_controller.rb
│   │       │   │   ├── auto_reloads_controller.rb
│   │       │   │   ├── basics1_controller.rb
│   │       │   │   ├── basics2_controller.rb
│   │       │   │   ├── basics3_controller.rb
│   │       │   │   ├── basics4_controller.rb
│   │       │   │   ├── basics5_controller.rb
│   │       │   │   ├── basics6_controller.rb
│   │       │   │   ├── blockless_column_definition_controller.rb
│   │       │   │   ├── buttons_controller.rb
│   │       │   │   ├── csv_and_detached_filters_controller.rb
│   │       │   │   ├── csv_export_controller.rb
│   │       │   │   ├── custom_filter_params_controller.rb
│   │       │   │   ├── custom_filters1_controller.rb
│   │       │   │   ├── custom_filters2_controller.rb
│   │       │   │   ├── custom_filters3_controller.rb
│   │       │   │   ├── custom_filters4_controller.rb
│   │       │   │   ├── custom_ordering_controller.rb
│   │       │   │   ├── custom_ordering_on_calculated_controller.rb
│   │       │   │   ├── custom_ordering_with_arel_controller.rb
│   │       │   │   ├── custom_ordering_with_proc_controller.rb
│   │       │   │   ├── custom_ordering_with_ruby_controller.rb
│   │       │   │   ├── dates_controller.rb
│   │       │   │   ├── detached_filters_controller.rb
│   │       │   │   ├── detached_filters_two_grids_controller.rb
│   │       │   │   ├── disable_all_filters_controller.rb
│   │       │   │   ├── hiding_checkboxes_in_action_column_controller.rb
│   │       │   │   ├── home_controller.rb
│   │       │   │   ├── integration_with_application_view_controller.rb
│   │       │   │   ├── integration_with_forms_controller.rb
│   │       │   │   ├── joining_tables_controller.rb
│   │       │   │   ├── localization_controller.rb
│   │       │   │   ├── many_grids_on_page_controller.rb
│   │       │   │   ├── negation_controller.rb
│   │       │   │   ├── no_records_controller.rb
│   │       │   │   ├── null_values_controller.rb
│   │       │   │   ├── numeric_filters_controller.rb
│   │       │   │   ├── queries_controller.rb
│   │       │   │   ├── resultset_processings2_controller.rb
│   │       │   │   ├── resultset_processings_controller.rb
│   │       │   │   ├── saved_queries_controller.rb
│   │       │   │   ├── styling_controller.rb
│   │       │   │   ├── tasks_controller.rb
│   │       │   │   ├── two_associations_controller.rb
│   │       │   │   ├── upper_pagination_panel_controller.rb
│   │       │   │   └── when_filtered_controller.rb
│   │       │   ├── helpers/
│   │       │   │   └── application_helper.rb
│   │       │   ├── javascript/
│   │       │   │   └── application.js
│   │       │   ├── mailers/
│   │       │   │   └── .gitkeep
│   │       │   ├── models/
│   │       │   │   ├── .gitkeep
│   │       │   │   ├── company.rb
│   │       │   │   ├── populate.rb
│   │       │   │   ├── priority.rb
│   │       │   │   ├── project.rb
│   │       │   │   ├── project_role.rb
│   │       │   │   ├── status.rb
│   │       │   │   ├── task.rb
│   │       │   │   ├── to_dropdown_mixin.rb
│   │       │   │   ├── user.rb
│   │       │   │   ├── user_project_participation.rb
│   │       │   │   └── version.rb
│   │       │   └── views/
│   │       │       ├── action_column/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── adding_rows/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── all_records/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── auto_reloads/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── auto_reloads2/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── auto_reloads3/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── basics1/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── basics2/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── basics3/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── basics4/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── basics5/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── basics6/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── blockless_column_definition/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── buttons/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── csv_and_detached_filters/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── csv_export/
│   │       │       │   ├── _projects_grid.html.erb
│   │       │       │   ├── _tasks_grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_filter_params/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_filters1/
│   │       │       │   ├── _g1.html.erb
│   │       │       │   ├── _g2.html.erb
│   │       │       │   ├── _g3.html.erb
│   │       │       │   ├── _g4.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_filters2/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_filters3/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_filters4/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_ordering/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_ordering_on_calculated/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_ordering_with_arel/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_ordering_with_proc/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_ordering_with_ruby/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── dates/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── detached_filters/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── detached_filters_two_grids/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── disable_all_filters/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── hiding_checkboxes_in_action_column/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── integration_with_application_view/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── integration_with_forms/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── joining_tables/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── layouts/
│   │       │       │   └── application.html.haml
│   │       │       ├── localization/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── many_grids_on_page/
│   │       │       │   ├── _tasks_grid1.html.erb
│   │       │       │   ├── _tasks_grid2.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── negation/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── no_records/
│   │       │       │   ├── _empty_grid.html.haml
│   │       │       │   ├── _grid1.html.erb
│   │       │       │   ├── _grid2.html.erb
│   │       │       │   ├── _grid3.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── null_values/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── numeric_filters/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── resultset_processings/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── resultset_processings2/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── saved_queries/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── styling/
│   │       │       │   ├── _grid1.html.erb
│   │       │       │   ├── _grid2.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── tasks/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── two_associations/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── upper_pagination_panel/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       └── when_filtered/
│   │       │           ├── _grid.html.erb
│   │       │           └── index.html.haml
│   │       ├── bin/
│   │       │   ├── dartsass
│   │       │   ├── importmap
│   │       │   ├── rails
│   │       │   └── rake
│   │       ├── config/
│   │       │   ├── application.rb
│   │       │   ├── boot.rb
│   │       │   ├── database.travis.yml
│   │       │   ├── database.yml
│   │       │   ├── database.yml.mysql
│   │       │   ├── database.yml.postgresql
│   │       │   ├── environment.rb
│   │       │   ├── environments/
│   │       │   │   ├── development.rb
│   │       │   │   ├── production.rb
│   │       │   │   └── test.rb
│   │       │   ├── importmap.rb
│   │       │   ├── initializers/
│   │       │   │   ├── assets.rb
│   │       │   │   ├── backtrace_silencers.rb
│   │       │   │   ├── inflections.rb
│   │       │   │   ├── mime_types.rb
│   │       │   │   ├── secret_token.rb
│   │       │   │   ├── session_store.rb
│   │       │   │   ├── wice_grid_config.rb
│   │       │   │   └── wrap_parameters.rb
│   │       │   ├── locales/
│   │       │   │   ├── en.yml
│   │       │   │   └── wice_grid.yml
│   │       │   ├── puma.rb
│   │       │   └── routes.rb
│   │       ├── config.ru
│   │       ├── db/
│   │       │   ├── migrate/
│   │       │   │   ├── 20120224193505_create_tasks.rb
│   │       │   │   ├── 20120224193517_create_users.rb
│   │       │   │   ├── 20120224193522_create_projects.rb
│   │       │   │   ├── 20120224193529_create_priorities.rb
│   │       │   │   ├── 20120224193537_create_statuses.rb
│   │       │   │   ├── 20120224193543_create_versions.rb
│   │       │   │   ├── 20120224193550_create_project_roles.rb
│   │       │   │   ├── 20120224193610_create_companies.rb
│   │       │   │   ├── 20120224195351_create_user_project_participations.rb
│   │       │   │   ├── 20120224195521_add_tasks_users.rb
│   │       │   │   └── 20120610091944_create_wice_grid_serialized_queries.rb
│   │       │   ├── schema.rb
│   │       │   └── seeds.rb
│   │       ├── lib/
│   │       │   ├── ar_fixtures.rb
│   │       │   ├── assets/
│   │       │   │   └── .gitkeep
│   │       │   └── tasks/
│   │       │       ├── .gitkeep
│   │       │       └── ar_fixtures.rake
│   │       ├── public/
│   │       │   ├── 404.html
│   │       │   ├── 422.html
│   │       │   ├── 500.html
│   │       │   └── robots.txt
│   │       └── vendor/
│   │           └── javascript/
│   │               ├── .keep
│   │               ├── @hotwired--stimulus.js
│   │               ├── @stimulus-components--rails-nested-form.js
│   │               ├── jquery.ui.datepicker.locales.js
│   │               └── reload_on_change.js
│   └── wice/
│       ├── grid_output_buffer_spec.rb
│       ├── table_column_matrix_spec.rb
│       ├── wice_grid_misc_spec.rb
│       └── wice_grid_spreadsheet_spec.rb
├── vendor/
│   └── assets/
│       ├── javascripts/
│       │   ├── wice_grid.js
│       │   ├── wice_grid_init.js.coffee
│       │   ├── wice_grid_processor.js.coffee
│       │   └── wice_grid_saved_queries_init.js.coffee
│       └── stylesheets/
│           └── wice_grid.scss
└── wice_grid.gemspec

================================================
FILE CONTENTS
================================================

================================================
FILE: .circleci/config.yml
================================================
build_job: &build_job
  working_directory: ~/wice_grid
  steps:
    - checkout

    # Install PhantomJS (if not found in cache)
    - run:
        name: Install phantomjs
        command: |
          if ! [ $(which phantomjs) ]; then
          sudo curl --output /usr/local/bin/phantomjs https://s3.amazonaws.com/circle-downloads/phantomjs-2.1.1
          fi

          sudo chmod ugo+x /usr/local/bin/phantomjs

    # Restore Cached Dependencies
    - type: cache-restore
      name: Restore bundle cache
      key: wice_grid-{{ checksum "Gemfile.lock" }}

    # Bundle install dependencies
    - run: bundle install --path vendor/bundle

    # Install Appraisal gemfiles
    - run: bundle exec appraisal install

    # Cache Dependencies
    - type: cache-save
      name: Store bundle cache
      key: wice_grid-{{ checksum "Gemfile.lock" }}
      paths:
      - vendor/bundle

    # Run the tests
    - run: bundle exec appraisal rspec

    - store_artifacts:
        path: spec/support/test_app/tmp/capybara
        destination: screenshots

version: 2
jobs:
  build-ruby24:
    <<: *build_job
    docker:
      - image: circleci/ruby:2.4
        environment:
          RAILS_ENV: test
  build-ruby25:
    <<: *build_job
    docker:
      - image: circleci/ruby:2.5
        environment:
          RAILS_ENV: test
  build-ruby26:
    <<: *build_job
    docker:
      - image: circleci/ruby:2.6
        environment:
          RAILS_ENV: test

workflows:
  version: 2
  build:
    jobs:
    - build-ruby24
    - build-ruby25
    - build-ruby26


================================================
FILE: .circleci/run-build-locally.sh
================================================
#!/usr/bin/env bash
curl --user ${CIRCLE_TOKEN}: \
  --request POST \
  --form revision=fa279c82728d4e0d764f09f3db0f63269575fba4 \
  --form config=@config.yml \
  --form notify=false \
  https://circleci.com/api/v1.1/project/github/patricklindsay/wice_grid/tree/master


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve

---

## Precheck

- For bugs, do a quick search and make sure the bug has not yet been reported
- Try to be clear and concise - the more information you provide the easier it is for us to resolve
- Things to include;
  - Code samples
  - Stack traces
  - Screenshots
  - Sample application or a test case that reproduces the error.

## Environment

- Ruby **[version]**
- Rails **[version]**
- WiceGrid **[version]**

## Description of issue


## Current behaviour


## Expected behaviour


## Additional context


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: bundler
  directory: "/"
  schedule:
    interval: monthly
  open-pull-requests-limit: 10
  ignore:
  - dependency-name: activerecord
  - dependency-name: activesupport
  - dependency-name: actionpack
  - dependency-name: appraisal
  - dependency-name: byebug
  - dependency-name: capybara
  - dependency-name: capybara-screenshot
  - dependency-name: coderay
  - dependency-name: coffee-rails
  - dependency-name: faker
  - dependency-name: font-awesome-sass
  - dependency-name: haml
  - dependency-name: inch
  - dependency-name: jquery-rails
  - dependency-name: nokogiri
  - dependency-name: rack
  - dependency-name: rails
  - dependency-name: rake
  - dependency-name: rdoc
  - dependency-name: rspec
  - dependency-name: rspec-rails
  - dependency-name: sass-rails
  - dependency-name: selenium-webdriver
  - dependency-name: shoulda-matchers
  - dependency-name: simplecov
  - dependency-name: sqlite3
  - dependency-name: turbolinks
  - dependency-name: yard


================================================
FILE: .gitignore
================================================
*.gem
*.rbc
.bundle
.config
.idea
.yardoc
.rbenv-version
InstalledFiles
_yardoc
coverage
doc/
lib/bundler/man
pkg
rdoc
spec/reports
test/tmp
test/version_tmp
tmp
.byebug_history
spec/support/test_app/log
spec/support/test_app/tmp
spec/support/test_app/db/*.sqlite3*


================================================
FILE: .inch.yml
================================================
files:
  excluded:
    - lib/generators/wice_grid/add_migration_for_serialized_queries_generator.rb


================================================
FILE: .rspec
================================================
--color
--require rails_helper
--format d


================================================
FILE: .rubocop.yml
================================================
AllCops:
  DisabledByDefault: true

Style/MultilineTernaryOperator:
  Enabled: true

# Cop supports --auto-correct.
Style/DefWithParentheses:
  Enabled: true

# Cop supports --auto-correct.
Style/MethodCallParentheses:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyleInsidePipes, SupportedStyles.
Style/SpaceAroundBlockParameters:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyleForMultiline, SupportedStyles.
Style/TrailingCommaInArguments:
  EnforcedStyleForMultiline: no_comma

# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyleForMultiline, SupportedStyles.
Style/TrailingCommaInLiteral:
  EnforcedStyleForMultiline: no_comma

# Cop supports --auto-correct.
Style/SpaceBeforeFirstArg:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
Style/FirstParameterIndentation:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: AllowSafeAssignment.
Style/ParenthesesAroundCondition:
  Enabled: true

# Cop supports --auto-correct.
Style/SpecialGlobalVars:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: IgnoredMethods.
Style/SymbolProc:
  Enabled: true

# Cop supports --auto-correct.
Style/Lambda:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
Style/MethodDefParentheses:
  Enabled: true

# Cop supports --auto-correct.
Style/EmptyLiteral:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, UseHashRocketsWithSymbolValues.
Style/HashSyntax:
  Enabled: true

# Cop supports --auto-correct.
Style/Not:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: AllowMultipleReturnValues.
Style/RedundantReturn:
  Enabled: true

# Cop supports --auto-correct.
Style/SpaceAfterComma:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
Style/SignalException:
  Enabled: true

# Cop supports --auto-correct.
Style/LineEndConcatenation:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
Style/AndOr:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: PreferredDelimiters.
Style/PercentLiteralDelimiters:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, AutoCorrectEncodingComment.
Style/Encoding:
  Enabled: true

# Cop supports --auto-correct.
Lint/UnusedMethodArgument:
  Enabled: true

# Cop supports --auto-correct.
Style/AlignArray:
  Enabled: true

# Cop supports --auto-correct.
Style/ColonMethodCall:
  Enabled: true

# Cop supports --auto-correct.
Lint/UnusedBlockArgument:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
Style/DotPosition:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
Style/EmptyElse:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: MultiSpaceAllowedForOperators.
Style/SpaceAroundOperators:
  Enabled: true

# Cop supports --auto-correct.
Style/SpaceBeforeComma:
  Enabled: true

# Cop supports --auto-correct.
Style/SpaceInsideParens:
  Enabled: true

# Cop supports --auto-correct.
Style/DeprecatedHashMethods:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, ProceduralMethods, FunctionalMethods, IgnoredMethods.
Style/BlockDelimiters:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
Style/BracesAroundHashParameters:
  Enabled: true

Lint/AmbiguousRegexpLiteral:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
Style/StringLiterals:
  Enabled: true

Lint/AmbiguousOperator:
  Enabled: true

Lint/UselessAssignment:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
Style/ClassCheck:
  Enabled: true

# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
Style/AlignParameters:
  Enabled: true

Lint/ConditionPosition:
  Enabled: true


================================================
FILE: Appraisals
================================================
appraise "rails-5.0" do
  gem "rails", "~> 5.0.0"
end

appraise "rails-5.1" do
  gem "rails", "~> 5.1.0"
end

appraise "rails-5.2" do
  gem "rails", "~> 5.2.0"
end


================================================
FILE: CHANGELOG.md
================================================
## 7.1.4

* Allow Rails 7.0
* Wice::Columns#add_css_class does not update the value given
to the :class option of Wice::GridRenderer#column method.

## 7.1.3

* Fixes [the bug](https://github.com/leikind/wice_grid/issues/395).

## 7.1.2

* This is the fix for the workaround of the [Facebook](https://www.facebook.com) problem.

## 7.1.1

* I have discovered that [Facebook](https://www.facebook.com) spoils the links
that have WiceGrid filters when you share them. That lead to the exception
in the application. This is a workaround for the case.

## 7.1.0

* Rails 7.1 uses the gem `dartsass-rails` instead of the deprecatad gem `sass-rails`.
And the gem `importmap-rails` is the standard gem for Javascript.
The support of them is added and the required gems for development are changed.
* Turbolinks was replaced with Turbo.
* Added the dependencies of `jquery-rails`.
* I could not fix the problem with the Specs to run without a browser that is required
with the environment variable `BROWSER` set to any value. Moreover not always all the test are green. The suggesons are welcome.

## 6.1.2

* Added Rails 6.1 support
* Fix bug in "Dangerous query methods" deprecation warning fix in custom order when using Arel.sql

## 4.1.0 (28 November, 2018)

* Add option `filter_control_options` to columns. Initial use is to pass in the options `start_year`, `end_year`, and `max_year_allowed` when using `rails_datetime_helper` - [#12](https://github.com/leikind/wice_grid/pull/18)
* Fix deprecation (in Rails 5.0.x) and incorrect behaviour (in Rails 5.1.x) of CSV exports - [#4](https://github.com/leikind/wice_grid/pull/4)
* Fix deprecation (in Rails 5.2) regarding "Dangerous query methods" in `order` clauses. Note that when using the `custom_order` option you must pass a value acceptable for ActiveRecord's `order` method, otherwise you will receive the same warning. - [#41](https://github.com/leikind/wice_grid/pull/41)
* Add support for using `Arel::Attributes::Attribute`s with the `custom_order` option. - [#41](https://github.com/leikind/wice_grid/pull/41)
* Added `sort_by` option to column to allow arbitrary, Ruby-based ordering. - [#3](https://github.com/leikind/wice_grid/pull/3)
* Added Rails 5.2 support
* Bump Kaminari to ~> 1.1.0

## 4.0.1 (31 May, 2018)

* Fixed tagbuilder issue with Rails 5.0.x - [#1](https://github.com/leikind/wice_grid/pull/1)
* Moved testbed into repo - [#12](https://github.com/leikind/wice_grid/pull/12)
* Remove old release notes and empty /test directory
* Removed `Gemfile.lock` from `.gitignore`
* Removed `codeclimate-test-reporter` dev dependancy

## 4.0.0 (18 Jan, 2018)

### Rails 5.0 & 5.1 Support
Added support for Rails 5.0 & 5.1. Anything below Rails 5 is no longer supported.

### Focused Filter Has Cursor/Caret at the End of Input

The cursor/caret used to appear at the beginning of the focused autocomplete in FF and IE.
This caused annoyances for users of those browsers who typed slowly since the page would
reload and when they started typing again the text would appear before their last entries.

For example if someone was searching for 'john' but paused after 'joh', they would end up typing 'njoh', instead of 'john'. If they weren't paying attention,
they might think there is no 'john', when they'd mistakenly searched for 'njoh'.

### Turbolinks 5 Support
Handled by initializing WiceGrid on `turbolinks:render` as well as `page:load ready`

## 3.6.0

## New API For Joined Tables

Before 3.6.0 `:model_class` was used in column definitions for columns from joined tables.

In 3.6.0 the API has changed to use associations.
If, say, a `Task` `belongs_to` a `Priority`, a column definition should specify this association using `:assoc`:

```ruby
g.column name: 'Priority', attribute: 'name',  assoc: :priority do |task|
  task.priority.name if task.priority
end
```

If, say, a `Task` `belongs_to` a `Project`, and a `Project` belongs to a `Customer`,
`assoc:` should be a list of these associations:

```ruby
g.column name: 'Customer', attribute: 'name', assoc: [:project, :customer]  do |task|
  task.project.customer.name if task.project && task.project.customer
end
```


## Blockless Columns For Joined Tables

Blockless columns used to only work for the main model.
Now they can be used for joined tables, too.

Instead of

```ruby
g.column name: 'Priority', attribute: 'name',  assoc: :priority do |task|
  task.priority.name if task.priority
end
```

you can write

```ruby
g.column name: 'Priority', attribute: 'name',  assoc: :priority
```

Instead of

```ruby
g.column name: 'Customer', attribute: 'name', assoc: [:project, :customer]  do |task|
  task.project.customer.name if task.project && task.project.customer
end
```

you can write

```ruby
  g.column name: 'Customer', attribute: 'name', assoc: [:project, :customer]
```


## New Way To Choose Datepickers

Before 3.6.0 to choose a datepicker type we used `:helper_style` in column definitions and `Wice::Defaults:HELPER_STYLE` in the configuration_file.

In 3.6.0 `:helper_style` and `Wice::Defaults:HELPER_STYLE` are gone.

Now each datepicker is simply a separate filter type, and to pick a datepicker we can use `:filter_type`, just like other filter types are chosen.

Filter types for dates and datetimes are

* `:rails_datetime_helper`
* `:rails_date_helper`
* `:jquery_datepicker`
* `:bootstrap_datepicker`

Example:

```ruby
g.column name: 'Updated', attribute: 'updated_at', filter_type: :rails_datetime_helper do |task|
  task.updated_at.to_fs(:db)
end
```

Default filter types for date and datetime columns are set by `Wice::Defaults:DEFAULT_FILTER_FOR_DATE` and `Wice::Defaults:DEFAULT_FILTER_FOR_DATETIME`.


## Icons

There are no more icons inside of the gem. Instead, [Font Awesome](https://github.com/FortAwesome/font-awesome-sass) is used.

## CSS

CSS is no longer copied to the applications asset directory. Instead the user is supposed to add

```sass
@import "wice_grid";
@import "font-awesome-sprockets";
@import "font-awesome";
```

to `application.scss`.

`font-awesome-sass` is not a dependency of WiceGrid in case you decide to style WiceGrid icons differently,
so you need to add it explicitly to your Gemfile:

```ruby
gem 'font-awesome-sass',  '~> 4.3'
```


## CI_LIKE

Setting a configuration value in Wice::Defaults::STRING_MATCHING_OPERATORS to CI_LIKE will result in the following SQL generated for string filters:

```sql
UPPER(table.field) LIKE UPPER(?)"
```


## USE_DEFAULT_SCOPE

New `USE_DEFAULT_SCOPE` configuration value from @nathanvda.
By default ActiveRecord calls are always executed inside `Model.unscoped{}`.
Setting `USE_DEFAULT_SCOPE` to `true` will use the default scope for all queries.


# 3.5.0

* In addition to two icons "SET ALL" and "UNSET ALL" in the action column, there is now
  an option to use a standard HTML checkbox. This is now the default.
* Support for Bootstrap Datepicker. A suggested way to use Bootstrap Datepicker in a Rails app
  is https://github.com/Nerian/bootstrap-datepicker-rails. Configuration variable HELPER_STYLE
  sets the default flavor of date pickers. Can also be set per grid with helper_style: :bootstrap
  * :calendar  jQuery UI datepicker
  * :bootstrap Bootstrap datepicker
  * :standard
* Italian locale
* Spanish locale
* various fixes
* Configuration variable ALLOW_SHOWING_ALL_QUERIES renamed to ALLOW_SHOWING_ALL_RECORDS



# 3.4.14

Wice::Defaults::HIDE_ALL_LINK_FROM is nil by default

# 3.4.13

New configuration variable Wice::Defaults::HIDE_ALL_LINK_FROM! When set and the total
number of row exceeds its value, the "SHOW ALL" link disappears.

# 3.4.12

fixes

# 3.4.11

started adding HTML5 datepicker
changed how relations are detected so that it can work with relation proxies (aka octopus)

# 3.4.10

bug fixes
better support for :group

# 3.4.9

better support for Asset Pipeline

bugfixes

dropped support for Ruby 1.8

# 3.4.8

a friendlier exception message when a constant is missing in wice_grid_config.rb

bugfixes

# 3.4.6

Better support for Turbolinks

Better support for ActiveRelation #references

variable Wice::Defaults::PAGE_METHOD_NAME

# 3.4.5

Support for ActiveRelation #references

bugfixes

# 3.4.4

bugfixes

# 3.4.3

bugfixes

# 3.4.2

External columns processors

Operators '<','>','<=','>=','=' in the integer column

Bugfixes

# 3.4.1

Support for Bootstrap 3

# 3.4.0

Support for Rails 4

# 3.3.0

The with_paginated_resultset callback receives an ActiveRelation object, not a lambda

Wice::Defaults::DATEPICKER_YEAR_RANGE added to the config to define the default year range in Datepicker (https://github.com/leikind/wice_grid/issues/61)

Improvement of the javascript calendar control: if the FROM field is set to a value after TO, TO is set to the value of FROM.
Vice versa: if the TO field is set to a value before FROM, FROM is set to the value of TO

New view helpers filter_and_order_state_as_hash(grid) and filter_state_as_hash(grid)

HTML tag caption supported

Support for Ruby 2.0

2 errors fixed in the Saved Queries UI ( https://github.com/leikind/wice_grid/issues/89 )

Bug fixed: extra_request_parameters not propagating to the pagination panel

Documentation improvements

# 3.2.2

improvement of the javascript calendar control: if the FROM field is set to a value after TO, TO is set to the value of FROM.
Vice versa: if the TO field is set to a value before FROM, FROM is set to the value of TO

Wice::Defaults::DATEPICKER_YEAR_RANGE added to the config to define the default year range in Datepicker (https://github.com/leikind/wice_grid/issues/61)

support for Ruby 2.0

<caption> supported

2 js errors fixed in the Saved Queries UI ( https://github.com/leikind/wice_grid/issues/89

helpers filter_and_order_state_as_hash(grid) and filter_state_as_hash(grid)

the with_paginated_resultset callback receives an ActiveRelation object, not a lambda

# 3.2.1

action_column can now also take a block. If the block returns a falsy value, no checkbox will be rendered.

A fix: the css class submitted to column is also added to the <th> tags of the column.

Filter related code has been refactored: condition generators are unified together with view column processors into one module. Writing your own filters has been simplified.

The default filter for numeric columns has been replaced by a simple one field filter which checks the values for equality, not the inclusion in a range.
New column parameter :filter_type allows to load custom alternative filters.
The old numeric range filter can still be used by specifying filter_type: :range. See lib/columns/column_processor_index.rb for the list of available filters.

# 3.2.0

Fixes:
https://github.com/leikind/wice_grid/issues/83
https://github.com/leikind/wice_grid/issues/82

action_column can now also take a block. If the block returns a falsy value, no checkbox will be rendered

A fix: the css class submitted to column is also added to <th> tags of the column

Filter related code has been refactored: condition generators are unified together with view column processors into one module. Writing your own filters has been simplified.

The default filter for numeric columns has been replaced by a simple one field filter which checks the values for equality, not the inclusion in a range.
New column parameter :filter_type allows to load custom alternative filters. The old numeric range filter can still be used by specifying  filter_type: :range.
See lib/columns/column_processor_index.rb</tt> for the list of available filters.


# 3.0.4

bugfixes

# 3.0.3

bugxixes

# 3.0.2

bugxixes

# 3.0.1

Fixed the "Cannot modify SafeBuffer in place" problem and thus Rails # 3.0.8 and # 3.0.9
Support for ActiveRecord::Relation

# 3.0.0

Rails 3 support

0.6

wice_grid_custom_filter_params used to be a view helper, not it is also accessible from the controller, to be used in cases like redirect_to(my_resource_path(wice_grid_custom_filter_params(...)))

auto reloading filters

helper export_to_csv_javascript to create custom CSV buttons

option :hide_csv_button to hide the default CSV export button

Method WiceGrid#selected_records and parameter :after were a bit of a mess and have been substituted by

* WiceGrid#current_page_records returning records on the current page
* WiceGrid#all_pages_records returning records browsable throughout all pages
* :with_paginated_resultset - callback to process records on the current page
* :with_resultset - callback to process records browsable throughout all pages

Compliant with Rails 1.2.8 with or without rails_xss and erubis

Ruby 1.9.1 compliance

Dropdowns generated with :custom_filter => :auto and :custom_filter => [method chain] are now ordered by option labels

how_filters => false is the same as :show_filters => :no and :show_filters => true is the same as :show_filters => :always

action_column - Adds a column with checkboxes for each record.
Useful for actions with multiple records, for example, delete
the selected records.

using merge_conditions to merge conditions :)

WiceGrid is now compatible with the new Rails XSS behavior which
will be the default in Rails # 3.0 and can be used in Rails 2.3.5
using the rails_xss plugin.
Read http://github.com/nzkoz/rails_xss for more

wice_grid_custom_filter_params

support for with_scope and with_exclusive_scope

:total_entries parameter added to initialize_grid (will_paginate)

Localization

assert_keys wherever possible

== 0.5

Today "WiceGrid":http://leikind.org/pages/wicegrid has reached its next level of maturity and was awarded the tag of version 0.5.

This version of WiceGrid is accompanied by an application called _WiceGrid Examples_ running "online":http://grid.leikind.org/ and with source code available on  "GitHub":http://github.com/leikind/wice_grid_examples.

Here's a list of changes as compared with "version 0.4":https://blog.wice.eu/2009/7/6/moving-to-github-and-wicegrid-version-0-4 :


--- RHTML
<%= grid(@tasks_grid) do |g|
   ...
end -%>

<% selected = @tasks_grid.selected_records %>
<p><%= selected.size %> records selected: <%= selected.map(&:id).to_sentence %></p>
---

"See an online example":http://grid.leikind.org/integration_with_application_view

h4. placement of filter related icons

A change in placement of filter related icons (filter icon, reset icon, show/hide icon): if the last column doesn't have  any filter or a column name, icons will be placed in the header of this column, otherwise it falls back to the usual   behavior when an additional table column is added. To change the behavior back to the old style, set   @Wice::Defaults::REUSE_LAST_COLUMN_FOR_FILTER_ICONS@ to @false@ in the configuration file.

"See an online example":http://grid.leikind.org/custom_filters2


h4. wice_grid_assets generator

Copying asset files (images, css, js, and the configuration file) is now done by a plugin generator, not rake tasks:

---
./script/generate wice_grid_assets
---

h4. blank slate

Blank slate feature: it is now possible to replace the grid with some alternative view if no filters are active  and there are no records to render:

--- RHTML
<%= grid(@grid) do |g|

   g.blank_slate  do
     "There are no records"
   end

   g.column  do |product|
      ...
   end
end  -%>
---

There are also two alternative three ways to do it:

--- Ruby
g.blank_slate "some text to be rendered"
---
and
--- Ruby
g.blank_slate :partial => "partial_name"
---

"See an online example":http://grid.leikind.org/no_records

h4. custom filters with symbols

Improvement to custom filters, namely to
--- Ruby
:custom_filter => :symbol
---
and
--- Ruby
:custom_filter => [:symbol1, :symbol2, :symbol3]
---

Now, if the last method returns an array of 2 elements, the first element becomes  the select option label and the second - the select option value (usually @id@).

Before this change the value returned by the method had been used for both the value and the label of the select option.

"See an online example":http://grid.leikind.org/custom_filters3

h4. custom filters and NULL

Values @null@ and @not null@ in a generated custom filter dropdown are treated specially, as SQL @null@ statement  and not as strings.  Value @null@ is transformed into SQL condition @IS NULL@, and @not null@ into @IS NOT NULL@ .

Thus, if in a filter defined by

--- Ruby
:custom_filter => {'No' => 'null', 'Yes' => 'not null', '1' => 1, '2' => '2', '3' => '3'}
---
values @1@, @2@ and @'No'@ are selected (in a multi-select mode),  this will result in the following SQL:

--- SQL
( table.field IN ( '1', '2' ) OR table.field IS NULL )
---

"See an online example":http://grid.leikind.org/null_values

h4. Wice::Defaults::STRING_MATCHING_OPERATORS

 in addition to the configuration constant @Wice::Defaults::STRING_MATCHING_OPERATOR@   to define the operator for matching strings (@LIKE@ in most cases), hash @Wice::Defaults::STRING_MATCHING_OPERATORS@   was added to specify string matching operators on per-database basis:

--- Ruby
Wice::Defaults::STRING_MATCHING_OPERATORS = {
 'ActiveRecord::ConnectionAdapters::MysqlAdapter' => 'LIKE',
 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter' => 'ILIKE'
}
---

A use-case for this is a Rails application connecting to two databases, one of which is MySQL, and the other is Postgresql. To use case-insensitive matching in Postgresql 'ILIKE' has to be used, but this operator is unknown to MySQL.

h4. td_html_attrs and table_html_attrs shortcuts

@:td_html_attrs@ in column definitions and @table_html_attrs@ in the table definitions are mostly used to add css classes, so a shorter way has been added to add css classes.

Instead of

--- RHTML
<%= grid(@grid, :table_html_attrs => {:class => 'css_class1'}) do |g|
    g.column(:td_html_attrs => {:class => 'css_class2'}) do
      ...
    end
end -%>
---

It's possible to just use the new @:class@ option:

--- RHTML
<%= grid(@grid, :class => 'css_class1') do |g|
  g.column(:class => 'css_class2') do
  end
end -%>
---

h4. allow_multiple_selection

New options for @column@: @:allow_multiple_selection@, use @:allow_multiple_selection => false@ to disable switching between single and multiple selection modes for custom dropdown boxes.

"See an online example":http://grid.leikind.org/custom_filters4

h4. allow_ordering

New parameter for @column@: @:allow_ordering@. Use @:allow_ordering => false@ to disable the ordering of the column.

"See an online example":http://grid.leikind.org/basics6

h4. allow_showing_all_records

Parameter @:allow_showing_all_records@ moved from @initialize_grid@  to the view helper.

h4. other

* Default styles updated.
* Javascript code cleaned up and refactored.
* Quite some number of bugs fixed

== 0.4

* Detached filters: it has become possible to detach filters and place them anywhere on the page, before or after the grid.
  Read section "Detached Filters" in the README.

*  More control over Submit and Reset buttons.
   Two new view helpers: submit_grid_javascript returns javascript which applies current filters; reset_grid_javascript returns javascript
   which resets the grid, clearing the state of filters. This allows to create your own Submit and Reset buttons anywhere on the page
   with the help of button_to_function:

     <%= button_to_function "Submit", submit_grid_javascript(@grid) %>
     <%= button_to_function "Reset",  reset_grid_javascript(@grid) %>

   To complement this feature there are two new parameters in the +grid+ helper :hide_submit_button and :hide_reset_button which
   hide default buttons in the grid if set to true. Together with detached filter this allows to completely
   get rid of the filter row with filters and icons.

* erb_mode option has been moved to the grid view helper - watch for warnings and remove the parameter from initialize_grid if you have it there.

* helper include_wice_grid_assets will require WiceGrid javascripts and stylesheets on demand, that is, only if at least one initialize_grid
  has been called in the controller. Otherwise the helper returns an empty string. However, you can force the old unconditioned behavior if you
  need by submitting  parameter :load_on_demand set to false:
    <%= include_wice_grid_assets(:load_on_demand => false) %>

* Compatibility with Rails asset caching. Helpers names_of_wice_grid_stylesheets and names_of_wice_grid_javascripts return names of stylesheet and
  javascript files and can be used with stylesheet_link_tag and javascript_include_tag with :cache => true. Using this trick you have to deal with
  the parameters correctly, mind that Prototype has to be loaded before WiceGrid javascripts:

    <%= stylesheet_link_tag *(['core',  'modalbox'] + names_of_wice_grid_stylesheets + [ {:cache => true}]) %>
    <%= javascript_include_tag *([:defaults] + names_of_wice_grid_javascripts + [ 'ui', 'swfobject', {:cache => true}]) %>

*  When a page with a WiceGrid instance is loaded there is check a small chunk of javascript that checks whether Prototype is loaded and whether
   the main WiceGrid javascript files is loaded and is of the correct version. Problems are reported to the user via alert() dialog boxes.
   This check has now been disabled in the production mode.

*  The default field separator in generated CSV (comma) can now be overridden by setting :enable_export_to_csv  to a string instead of +true+.

*  It is possible to add your own handcrafted HTML after and/or before each grid row. This works similar to +row_attributes+,
   by adding blocks after_row and before_row:

   <%= grid(@tasks_grid) do |g|
      g.before_row do |task|
        if task.active?
          "<tr><td colspan=\"10\">Custom line for #{t.name}</td></tr>"  # this would add a row
                                                                        # before every active task row
        else
          nil
        end
      end
      .......
    end %>



*  Bug fixes

*  Refactoring
=============

=== 03/04/2009

Possibility to add custom lines after and/or before a grid row.


=== 16/03/2009

Option to override the default field separator in generated CSV (comma).


=== 13/02/2009

a bug fix for incorrect generation if dom ids for javascript calendar filter. Happened only for columns belonging to joined tables

=== 12/01/2009

WiceGrid 0.3 released

=== 12/01/2009

All records mode

=== 10/12/2008

custom_filter made Rails-compliant, a new flavor -  Array of two-element arrays

=== 4/12/2008
A single helper to include all assets in a page

A javascript error message if Prototype is not loaded

A javascript error message if wice_grid.js is not loaded

Added status info to the pagination line:
       « Previous 1 2 3 Next »          1-20 / 50

=== 3/12/2008
First implementation of saved queries


=== 25/11/2008

Negation for string filters: match records where this fiels DOES NOT include the given fragment.

=== 24/11/2008

The string matching operator for string filters (LIKE) has been moved to wice_grid_config.rb in order to make it easier to substitute it with
something else, for example, ILIKE of Postgresql.


=== 19/11/2008

Experimental feature: :table_alias parameter to allow ordering and filtering for joining associations referring the same table.
(See "Joined associations referring to the same table" in README)

=== 18/11/2008

Refactoring

=== 6/11/2008

Ability to provide a callback to a Proc object or a method, the callback will be called with the objects of the current selection of
objects (throughout all pages). Can be used to use the WiceGrid filters set up by the user for further processing of the user's selection  of
objects.

=== 5/11/2008

Javascript calendars as Date/Datetime filters


=== 4/11/2008

Ability to inject custom sql code into the ORDER BY clause, for example, ORDER BY char_length(table1.foo)

=== 4/11/2008

Creates a new branch for version 2.3



=== 21/10/2008

A bugfix related to custom filters influencing other columns with filters
A more informative error message if the grid can't find the underlying database column for a view column (incorrect :column_name and :model)

=== 8/10/2008

New view helper parameter <tt>:sorting_dependant_row_cycling</tt> - When set to true (by default it is false) the row styles +odd+ and +even+
will be changed only when the content of the cell belonging to the sorted column changes. In other words, rows with identical values in the
ordered column will have the same style (color).

=== 3/10/2008

For simple columns like

  g.column :column_name => 'Username', :attribute_name => 'username'  do |account|
    account.username
  end

the following blockless shortcut can be used:

  g.column :column_name => 'Username', :attribute_name => 'username'

In this case +attribute_name+ will be used as the method name to send to the ActiveRecord instance.

=== revision 27 (30/09/2008)

* CSV export
* Custom filters can switch between a dropdown list and a multiple select list, thus allowing to search for records matching
  more that one value (operator OR)

=== revision 17 (19/08/2008)

* A bug fixed: extra_request_parameters did not propagate to will_paginate page panel. Now it does.

=== revision 13 (6/08/2008)

* File <tt>config.rb</tt> renamed.
* New parameters for +column+ :
  * <tt>:boolean_filter_true_label</tt> - overrides the default value for <tt>BOOLEAN_FILTER_TRUE_LABEL</tt> ('+yes+') in the config.
    Only has effect in a column with a boolean filter.
  * <tt>:boolean_filter_false_label</tt> - overrides the default value for <tt>BOOLEAN_FILTER_FALSE_LABEL</tt> ('+no+') in the config.
    Only has effect in a column with a boolean filter.
  * <tt>:filter_all_label</tt> - overrides the default value for <tt>BOOLEAN_FILTER_FALSE_LABEL</tt> ('<tt>--</tt>') in the config.
    Has effect in a column with a boolean filter _or_ a custom filter.

=== revision 11

* New row_attributes method to dynamically generate HTML attributes for the <tt><tr></tt> tag:

	<%= grid(@portal_applications_grid) do |g|
		g.row_attributes{ |portal_application|
			{:id => "#{@portal_applications_grid.name}_row_#{portal_application.id}"}
		}

		g.column{ |portal_application| ... }
		g.column{ |portal_application| ... }
	end    -%>

* The column block can now optionally return an array of two values, where the first element is the cell
  contents and the second is a hash of HTML attributes to be added for the <td> tag of the current cell.

=== revision 10

* New parameter +grid+ parameter: <tt>:extra_request_parameters</tt>.
  (Read http://redmine.wice.eu/api/wice_grid/classes/Wice/GridViewHelper.html#M000002)

=== 0


================================================
FILE: Gemfile
================================================
source 'https://rubygems.org'

# Use custom version of jquery-ui-rails and font-awesome-sass
gem 'jquery-ui-rails', github: 'dima4p/jquery-ui-rails'
gem 'font-awesome-sass', github: 'dima4p/font-awesome-sass'

gemspec


================================================
FILE: Guardfile
================================================
# A sample Guardfile
# More info at https://github.com/guard/guard#readme

## Uncomment and set this to only include directories you want to watch
# directories %w(app lib config test spec features) \
#  .select{|d| Dir.exist?(d) ? d : UI.warning("Directory #{d} does not exist")}

## Note: if you are using the `directories` clause above and you are not
## watching the project directory ('.'), then you will want to move
## the Guardfile to a watched dir and symlink it back, e.g.
#
#  $ mkdir config
#  $ mv Guardfile config/
#  $ ln -s config/Guardfile .
#
# and, you'll have to watch "config/Guardfile" instead of "Guardfile"

# Note: The cmd option is now required due to the increasing number of ways
#       rspec may be run, below are examples of the most common uses.
#  * bundler: 'bundle exec rspec'
#  * bundler binstubs: 'bin/rspec'
#  * spring: 'bin/rspec' (This will use spring if running and you have
#                          installed the spring binstubs per the docs)
#  * zeus: 'zeus rspec' (requires the server to be started separately)
#  * 'just' rspec: 'rspec'

guard :rspec, cmd: "bundle exec rspec",
    all_after_pass: false, all_on_start: false, failed_mode: :focus do
  require "guard/rspec/dsl"
  dsl = Guard::RSpec::Dsl.new(self)

  # Feel free to open issues for suggestions and improvements

  # RSpec files
  rspec = dsl.rspec
  watch(rspec.spec_helper) { rspec.spec_dir }
  watch(rspec.spec_support) { rspec.spec_dir }
  watch(rspec.spec_files)

  # Ruby files
  ruby = dsl.ruby
  dsl.watch_spec_files_for(ruby.lib_files)

  # Rails files
  rails = dsl.rails(view_extensions: %w(erb haml slim))
  dsl.watch_spec_files_for(rails.app_files)
  dsl.watch_spec_files_for(rails.views)

  watch(rails.controllers) do |m|
    [
      rspec.spec.call("routing/#{m[1]}_routing"),
      rspec.spec.call("controllers/#{m[1]}_controller"),
      rspec.spec.call("acceptance/#{m[1]}")
    ]
  end

  # Rails config changes
  watch(rails.spec_helper)     { rspec.spec_dir }
  watch(rails.routes)          { "#{rspec.spec_dir}/routing" }
  watch(rails.app_controller)  { "#{rspec.spec_dir}/controllers" }

  # Capybara features specs
  watch(rails.view_dirs)     { |m| rspec.spec.call("features/#{m[1]}") }
  watch(rails.layouts)       { |m| rspec.spec.call("features/#{m[1]}") }

  # Turnip features and steps
  watch(%r{^spec/acceptance/(.+)\.feature$})
  watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) do |m|
    Dir[File.join("**/#{m[1]}.feature")][0] || "spec/acceptance"
  end
end


================================================
FILE: MIT-LICENSE
================================================
Copyright (c) 2008-2014 Yuri Leikind

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: README.md
================================================
[![Version](http://img.shields.io/gem/v/wice_grid.svg)](https://rubygems.org/gems/wice_grid)
[![CircleCI](https://circleci.com/gh/leikind/wice_grid.svg?style=svg)](https://circleci.com/gh/leikind/wice_grid)
[![Inline docs](http://inch-ci.org/github/leikind/wice_grid.svg)](http://inch-ci.org/github/leikind/wice_grid)
[![License](http://img.shields.io/badge/license-MIT-yellowgreen.svg)](#license)

# WiceGrid

- [Intro](#intro)
- [Requirements and Rails versions](#requirements-and-rails-versions)
- [Installation](#installation)
- [Basics](#basics)
  - [Rendering filter panel](#rendering-filter-panel)
  - [Initial Ordering](#initial-ordering)
  - [Records Per Page](#records-per-page)
  - [Conditions](#conditions)
  - [Queries with join tables](#queries-with-join-tables)
  - [Joined associations referring to the same table](#joined-associations-referring-to-the-same-table)
  - [More than one grid on a page](#more-than-one_grid-on-a-page)
  - [Custom Ordering](#custom-ordering)
  - [Custom Sorting](#custom-sorting)
- [Filters](#filters)
  - [Custom dropdown filters](#custom-dropdown-filters)
  - [Numeric Filters](#numeric-filters)
  - [Date and DateTime Filters](#date-and-datetime-filters)
  - [Detached Filters](#detached-filters)
- [Defaults](#defaults)
- [Testing](#testing)
- [Bug reports](#bug-reports)


## Intro

WiceGrid is a Rails grid plugin.

One of the goals of this plugin was to allow the programmer to define the contents of the cell on their
own, just like one does when rendering a collection via a simple table (and this is what differentiates
WiceGrid from various scaffolding solutions), but automate implementation of filters, ordering,
paginations, CSV export, and so on. Ruby blocks provide an elegant means for this.


WiceGrid builds the call to the ActiveRecord layer for you and creates a table view with the results
of the call including:

* Pagination
* Sortable columns
* Filtering by multiple columns
* Export to CSV
* Saved queries

Filters are added automatically according to the type of the underlying DB column. Filtering by more
than one column at the same time is possible. More than one such grid can appear on a page, and
manipulations with one grid do not have any impact on others.

WiceGrid does not take a collection as an input, it works directly with ActiveRecord.

WiceGrid does not use XHR calls to reload itself, instead simple GET requests are used for this,
nevertheless, all other page parameters are respected and preserved. WiceGrid works well with Turbolinks.

WiceGrid views do not contain forms so you can include it in your own forms.

WiceGrid is known to work with MySQL, Postgres, and Oracle.

Continue reading for more information or check out our [CHANGELOG](https://github.com/leikind/wice_grid/blob/rails7/CHANGELOG.md) to find out whats been going on.


## Requirements and Rails versions

```
# Rails 7 with importmap, HotWire, and dartsass-rails
gem 'wice_grid', '~> 7.1'

# Rails 5, 6, and 7.0 without importmap (see below)
gem 'wice_grid', '~> 6.1'

# Rails 4
gem 'wice_grid', '3.6.2'
```

WiceGrid relies on jQuery and coffeescript and the dependencies are added to the gem specification.

If you need a JS Datepicker, WiceGrid supports jQuery Datepicker or
Bootstrap Datepicker, so you might need one of those. See the section "Installation"
for details on how to use datepickers.

## Installation

Here is described the case when the gems `importmap` and `dartsass-rails` are in use.
For the case of `sass-rails` and other JavaScript approach see the
branch [rails6](https://github.com/leikind/wice_grid/tree/rails6).

Add the following lines to your `Gemfile`:

```ruby
gem "wice_grid"
gem 'font-awesome-sass', github: 'dima4p/font-awesome-sass'
```

The current version of the gem `font-awesome-sass` has a
[bug](https://github.com/FortAwesome/font-awesome-sass/issues/222).
As soon as it is fixed, you can use the standard version.

If the application uses Date and DateTime filters, you have to use
jQuery Datepicker from the gem `jquery-ui-rails`.

```ruby
gem 'jquery-ui-rails', github: 'dima4p/jquery-ui-rails'
```

The regular version of the gem also have an
[incompatibility](https://github.com/jquery-ui-rails/jquery-ui-rails/pull/153) with
`dartsass-rails` that is fixed in the custom version. I hope it will be fixed too.

Alternatively you can also use Bootstrap Datepicker.

```ruby
gem 'bootstrap'
```

Note: `font-awesome-sass` is not a dependency of WiceGrid in case you decide to style WiceGrid icons differently. But if you use it it must be the version that is compatible with `dartsass-rails`. As well as the gem `jquery-ui-rails`.

Then run `bundle install`.

Run the generator:

```
rails g wice_grid:install
```

This adds the following file:
* `config/initializers/wice_grid_config.rb`

You have to edit it if required in order to define which kind of the Datepicker
to use changing the value for `DEFAULT_FILTER_FOR_DATE` and
`DEFAULT_FILTER_FOR_DATETIME`.

In the file `config/importmap.rb` add the following lines:

```ruby
pin "jquery", to: "jquery3.min.js", preload: true
pin "wice_grid", to: "wice_grid.js", preload: true
pin "jquery-ui", to: "jquery-ui.js", preload: true
```

You do not need the last line if you do not use jQuery Datepicker.

If you are going to use `bootstrap` add also the lines:

```ruby
pin "bootstrap", to: "bootstrap.min.js", preload: true
pin "@popperjs/core", to: "popper.js", preload: true
```

In the file `app/assets/config/manifest.js` add the following lines:

```
//= link wice_grid.js
//= link jquery3.min.js
//= link jquery-ui.js
//= link bootstrap.min.js
//= link popper.js
```

The last two lines are required if you use `bootstrap`. And the middle is not needed if you do not use jQuery Datepicker.

If the application uses Date and DateTime filters, you have to use one of
jQuery Datepicker, Bootstrap Datepicker or the standard Rails date helper.

Here is an example of `app/javascript/application.js` if jQuery Datepicker is used:

```javascript
import "jquery" // this import first
import "jquery-ui"
import "wice_grid"
```

Here is `app/javascript/application.js` if Bootstrap Datepicker is used:

```javascript
import "jquery" // this import first
import "bootstrap"
import "wice_grid"
```

Require WiceGrid and Font Awesome CSS in your `app/assets/stylesheets/application.scss`:

```scss
@import "wice_grid";
@import "font-awesome";
@import "bootstrap";
```

This will provide very basic styles, not specifying exactly how the table should
look like.

WiceGrid uses icons from Font Awesome.
Should you decide to write you own styles for WiceGrid, you can just remove these imports and write your own styles.

If the application does not use Bootstrap you do not need the last line.
But the markup generated by WiceGrid will have correct classes and will fit nicely if you include Bootstrap.

## Basics

The simplest example of a WiceGrid for one simple DB table is the following:

Controller:

```ruby
@tasks_grid = initialize_grid(Task)
```

It is also possible to use an  `ActiveRecord::Relation` instance as the first argument:

```ruby
@tasks_grid = initialize_grid(Task.where(active: true))
```

View:

```erb
<%= grid(@tasks_grid) do |g|

  g.column do |task|
    task.id
  end

  g.column  do |task|
    task.title
  end

  g.column do |task|
    task.description
  end

  g.column do |task|
    task.archived? ? 'Yes' : 'No'
  end

  g.column do |task|
    link_to('Edit', edit_task_path(task))
  end
end -%>
```

Code `g.column do |task| ... end`
defines everything related to a column in the resulting view table including column names, sorting,
filtering, the content of the column cells, etc. The return value of the block is the table cell content.

Column names are defined with parameter `:name`:

```erb
<%= grid(@tasks_grid) do |g|

  g.column name: 'ID' do |task|
    task.id
  end

  g.column name: 'Title'  do |task|
    task.title
  end

  g.column name: 'Description' do |task|
    task.description
  end

  g.column name: 'Archived' do |task|
    task.archived? ? 'Yes' : 'No'
  end

  g.column do |task|
    link_to('Edit', edit_task_path(task))
  end
end -%>
```

To add filtering and ordering, declare to which column in the underlying database table(s) the view
column corresponds using parameter `:attribute`:

```erb
<%= grid(@tasks_grid) do |g|

  g.column name: 'ID', attribute: 'id' do |task|
    task.id
  end

  g.column name: 'Title', attribute: 'title'  do |task|
    task.title
  end

  g.column  name: 'Description', attribute: 'description' do |task|
    task.description
  end

  g.column name: 'Archived', attribute: 'archived' do |task|
    task.archived? ? 'Yes' : 'No'
  end

  g.column do |task|
    link_to('Edit', edit_task_path(task))
  end
end -%>
```

This will  add sorting links and filters for columns `Username` and `Active`. The plugin automatically
creates filters according to the type of the database column. In the above example a text field will be
created for column Title (title is a string), for column `Archived` a dropdown filter will be created
with options 'Yes', 'No', and '--', and for the integer ID two short text fields are added which can
contain the numeric range (more than, less than).

It is important to remember that `:attribute` is the name of the database column, not a model attribute.
Of course, all database columns have corresponding model attributes, but not all model attributes map to
columns in the same table with the same name.

Read more about available filters in the documentation for the column method.

Read the section about custom dropdown filters for more advanced filters.

For columns like

```ruby
g.column name: 'Title', attribute: 'title'  do |task|
  task.title
end
```

where the block contains just a call to the same attribute declared by :attribute, the block can be
omitted:

```erb
<%= grid(@tasks_grid) do |g|

  g.column name: 'ID', attribute: 'id'

  g.column name: 'Title', attribute: 'title'

  g.column name: 'Description', attribute: 'description'

  g.column name: 'Archived', attribute: 'archived' do |task|
    task.archived? ? 'Yes' : 'No'
  end

  g.column  do |task|
    link_to('Edit', edit_task_path(task))
  end
end -%>
```

In this case `name` will be used as the method name to send to the ActiveRecord instance.

If only ordering is needed, and no filter, we can turn off filters using `:filter` :

```ruby
g.column name: 'ID', attribute: 'id', filter: false
```

If no ordering links are needed, use `ordering: false`:

```ruby
g.column name: 'Added', attribute: 'created_at', ordering: false
```

It is important to understand that it is up to the developer to make sure that the value returned by a
column block (the content of a cell) corresponds to the underlying database column specified by
`:attribute` (and `:assoc` discussed below).


### Rendering filter panel

The filter panel can be shown and hidden clicking the icon with binoculars.

The way the filter panel is shown after the page is loaded is controlled via parameter
`:show_filters` of the `grid` helper.
Possible values are:

* `:when_filtered` - the filter is shown when the current table is the result of filtering
* `:always` - always show the filter
* `:no` - never show the filter

Example:

```erb
<%= grid(@tasks_grid, show_filters: :always) do |g|
  ......
end -%>
```

Filter related icons (filter icon, reset icon, show/hide icon) are placed in the header of the last
column if it doesn't have any filter or a column name, otherwise an additional table column is added.
To always place the icons in the additional column, set
`Wice::Defaults::REUSE_LAST_COLUMN_FOR_FILTER_ICONS` to `false` in the configuration file.


### Initial ordering

Initializing the grid we can also define the column by which the record will be ordered <em>on the first
rendering of the grid</em>, when the user has not set their ordering setting by clicking the column label,
and the order direction:

```ruby
@tasks_grid = initialize_grid(Task,
  order:           'tasks.title',
  order_direction: 'desc'
)
```

### Records per page

The number of rows per page is set with `:per_page`:

```ruby
@tasks_grid = initialize_grid(Task, per_page: 40)
```

### Conditions

The `initialize_grid` method supports a `:conditions` parameter which is passed on to the underlying
ActiveRecord, so it can be in any format processable by ActiveRecord:

```ruby
@tasks_grid = initialize_grid(Task,
  conditions: ["archived = false and estimated_time > ?", 100]
)

@tasks_grid = initialize_grid(Task,
  include:    :project,
  conditions: {archived: false, project: {active: true}}
)
```

A good example is substituting a common pattern like

```ruby
@user_groups = @portal_application.user_groups
```

with WiceGrid code:

```ruby
@user_groups_grid = initialize_grid(
  UserGroup,
  conditions: ['portal_application_id = ?', @portal_application]
)
```

Alternatively, instead of a Class object as the first parameter, you can use  ActiveRecord::Relation:

```ruby
@tasks_grid = initialize_grid(
  Task.where(archived: false, projects: {active: true}).joins(:project)
)
```

Please note that though all queries inside of WiceGrid are run without the default scope, if you use an
ActiveRecord::Relation instance to initialize grid, it will already include the default scope. Thus you
might consider using `unscoped`:

```ruby
@tasks_grid = initialize_grid(
  Task.unscoped.where(archived: false, projects: {active: true}).joins(:project)
)
```

### Queries with join tables

To join other tables, use `:include`:

```ruby
@products_grid = initialize_grid(Product,
  include:  :category,
  order:    'products.name',
  per_page: 20
)
```

The value of `:include` can be an array of association names:

```ruby
include: [:category, :users, :status]
```

If you need to join tables to joined tables, use hashes:


```ruby
include: [:category, {users: :group}, :status]
```


Note that if we want to order initially by a column from a joined table we have to specify the table and
the column name with the sql dot notation, that is, `products.name`.

To show columns of joined tables in the view table, specify the corresponding association with `:assoc`:

```erb
<%= grid(@products_grid) do |g|
  g.column name: 'Product Name', attribute: 'name' do |product|  # primary table
    link_to(product.name, product_path(product))
  end

  g.column name: 'Category', attribute: 'name', assoc: :category do |product| # joined table
    product.category.name
  end
%>
```

Please note that the blockless definition of the column can also be used with joined tables:

```
g.column name: 'Category', attribute: 'name', assoc: :category

```

If an association is mentioned in the column definition, it can be omitted from `:include` in `initialize_grid`.
Thus, the above example can be rewritten without `:category` in `:include`:


```ruby
@products_grid = initialize_grid(Product,
  order:    'products.name',
  per_page: 20
)
```

```erb
<%= grid(@products_grid) do |g|
  g.column name: 'Product Name', attribute: 'name' do |product|  # primary table
    link_to(product.name, product_path(product))
  end

  g.column name: 'Category', attribute: 'name', assoc: :category

%>
```

### Joined associations referring to the same table

In case there are two joined associations both referring to the same table, ActiveRecord constructs a query
where the second join provides an alias for the joined table. To enable WiceGrid to order and filter by
columns belonging to different associations but originating from the same table, set `:table_alias`
to this alias:

Model:

```ruby
 class Project < ActiveRecord::Base
   belongs_to :customer, class_name: 'Company'
   belongs_to :supplier, class_name: 'Company'
 end
```

Controller:

```ruby
@projects_grid = initialize_grid(Project)
```

View:

```erb
<%= grid(@projects_grid, show_filters: :always) do |g|

  g.column name: 'Project Name', attribute: 'name'

  g.column name: 'Customer company', assoc: :customer, attribute: 'name'

  g.column name: 'Supplier company', assoc: :supplier, attribute: 'name', table_alias: 'suppliers_projects'

end -%>
```

### More than one grid on a page

It is possible to use more that one grid on a page, each with its own state. To do so, you must specify the
name of the grid in `initialize_grid` using parameter `:name`.

The name serves as the base name for HTTP parameters, DOM IDs, etc, so it is important that all grids on a
page have different names. The default name is 'grid'.

The name can only contain alphanumeric characters.

```ruby
@projects_grid = initialize_grid(Project, name: 'g1')
@tasks_grid    = initialize_grid(Task,    name: 'g2')
```

### Custom Ordering

It is possible to change the way results are ordered injecting a chunk of SQL code, for example, use
`ORDER BY INET_ATON(ip_address)` instead of `ORDER BY ip_address`.

To do so, provide parameter `:custom_order` in the initialization of the grid with a `Hash` where
keys are fully qualified names of database columns, and values are anything that can be passed to ActiveRecord's
`order` method (without specifying `ASC` or `DESC`.)

#### String

Starting in Rails 5.2, you may need to whitelist `String` values with `Arel.sql`
to avoid a warning or error.

```ruby
@hosts_grid = initialize_grid(Host,
  custom_order: {
    'hosts.ip_address' => Arel.sql('INET_ATON(hosts.ip_address)')
  })
```

It is possible to use `?` instead of the name of the column in the `Hash` value:

```ruby
@hosts_grid = initialize_grid(Host,
  custom_order: {
    'hosts.ip_address' => Arel.sql('INET_ATON( ? )')
  })
```

#### Arel::Attributes::Attribute

Assuming you wish to display `hosts.ip_address` but sort by another column named `hosts.ip_address_number`:

```ruby
@hosts_grid = initialize_grid(Host,
  custom_order: {
    'hosts.ip_address' => Arel::Table.new(:hosts)[:ip_address_number]
  })
```

#### Proc

You can use a `Proc` to return a `String` or `Arel::Attributes::Attribute` as above.

```ruby
@hosts_grid = initialize_grid(Host,
  custom_order: {
    'hosts.ip_address' => lambda{|f| Arel.sql(request[:numeric_sorting] ? "INET_ATON( #{f} )" : f) }
  })
```

### Custom Sorting

While `:custom_order` lets you define SQL that determines the results order, you may want to sort the result by arbritrary Ruby code. The `:sort_by` option on columns lets you define a `Proc` that determines the sorting on that column. This `Proc` is passed to Ruby's `Enumerable#sort_by`.

```ruby
grid.column name: 'Status Name', attribute: 'name', sort_by: ->(status) { [status.number_of_vowels, status] }
```

You can also use `:sort_by` to add sorting on values that are not columns in the database. In this case, you must also define an arbitrary `:attribute` option that serves as the request's sort key parameter.

```ruby
grid.column name: 'Task Count', attribute: 'task_count', sort_by: ->(status) { status.tasks.count } do |status|
  status.tasks.count
end
```

Note that `sort_by` will load all records into memory to sort them (even the ones not on the current page), so it may not be appropriate for use with a large number of results.

## Filters

Each column filter type is supported by a `column processor`. Each `column processor` is
responsible for

* generating HTML and supporting Javascript for the filter, input fields, dropdowns, javascript calendars, etc
* converting HTTP parameters from those input fields into ActiveRelation instances

By default column filters depend on the type of the underlying database column.

You can override these defaults in two ways:

* defining a custom filter with `:custom_filter`. Read more about it section "Custom dropdown filters".
* overriding the `column processor` type with `:filter_type`.

Which Column Processor is instantiated for which data types is defined in file
`lib/wice/columns/column_processor_index.rb`:

```ruby
module Wice
  module Columns
    COLUMN_PROCESSOR_INDEX = ActiveSupport::OrderedHash[ #:nodoc:
      :action,                 'column_action',                # Special processor for action column, columns with checkboxes
      :text,                   'column_string',
      :string,                 'column_string',
      :rails_datetime_helper,  'column_rails_datetime_helper', # standard Rails datepicker helper
      :rails_date_helper,      'column_rails_date_helper',     # standard Rails date helper
      :jquery_datepicker,      'column_jquery_datepicker',
      :bootstrap_datepicker,   'column_bootstrap_datepicker',
      :html5_datepicker,       'column_html5_datepicker',      # not ready
      :integer,                'column_integer',
      :range,                  'column_range',
      :float,                  'column_float',
      :decimal,                'column_float',
      :custom,                 'column_custom_dropdown',       # Special processor for custom filter columns
      :boolean,                'column_boolean'
    ]
  end
end
```

A good example for using `:filter_type` to change th default is numeric columns. By default
`'column_integer'` is instantiated for `integer` columns, and it renders one input field.
But it is also possible to use another Column Processor called `'column_range'` which renders two
input fields and searches for values in the given the range instead of searching for values which equal
the given search term.

It also possible to define and use your own column processors outside of the plugin, in you application.
Read more about this in section "Defining your own external filter processors".


### Custom dropdown filters

It is possible to construct custom dropdown filters. A custom dropdown filter is essentially a dropdown
list.

Depending on the value of `column` parameter`:custom_filter` different modes are available:


#### Array of two-element arrays or a hash

An array of two-element arrays or a hash are semantically identical ways of creating a custom filter.

Every first item of the two-element array is used for the label of the select option while the second
element is the value of the select option. In case of a hash the keys become the labels of the generated
dropdown list, while the values will be values of options of the dropdown list:

```ruby
g.column name: 'Status', attribute: 'status',
         custom_filter: {'Development' => 'development', 'Testing' => 'testing', 'Production' => 'production'}

g.column name: 'Status', attribute: 'status',
        custom_filter: [['Development', 'development'], ['Testing', 'testing'], ['Production', 'production']]
```

It is also possible to submit a array of strings or numbers, in this case every item will be used both as
the value of the select option and as its label:

```ruby
g.column name: 'Status', attribute: 'status', custom_filter: ['development', 'testing', 'production']
```

#### :auto

`:auto` - a powerful option which populates the dropdown list with all unique values of the column
specified by `:attribute` and `:assoc`, if present.

```ruby
g.column name: 'Status', attribute: 'status', custom_filter: :auto
```

In the above example all statuses will appear in the dropdown even if they don't appear in the current
resultset.


#### Custom filters and associations (joined tables)

In most cases custom fields are needed for one-to-many and many-to-many associations.

To correctly build a filter condition foreign keys have to be used, not the actual values rendered in the
column.

For example, if there is a column:

```ruby
g.column name: 'Project Name', attribute: 'name', assoc: :project do |task|
  task.project.name if task.project
end
```

adding `:custom_filter` like this:

```ruby
g.column name: 'Project Name', attribute: 'name', assoc: :project,
         custom_filter: Project.find(:all).map{|pr| [pr.name, pr.name]} do |task|
  task.project.name if task.project
end
```

is bad style and can fail, because the resulting condition will compare the name of the project,
`projects.name` to a string, and in some databases it is possible that different records
(projects in our example) have the same name.

To use filter with foreign keys, it is advised to change the declaration of the column from
`projects.name`, to `tasks.project_id`, and build the dropdown with foreign keys as values:

```ruby
g.column name: 'Project Name', attribute: 'tasks.project_id',
         custom_filter: Project.find(:all).map{|pr| [pr.id, pr.name]} do |task|
  task.project.name if task.project
end
```

However, this will break the ordering of the column - the column will be ordered by the integer foreign
key. To fix this, we can override the ordering using `:custom_order`:

```ruby
@tasks_grid = initialize_grid(Task,
  include: :project,
  custom_order: {
    'tasks.project_id' => 'projects.name'
  }
)
```

#### Any other symbol (method name) or an array of symbols (method names)


For one symbol (different from `:auto`) the dropdown list is populated by all unique values returned
by the method with this name sent to <em>all</em> ActiveRecord objects throughout all pages.

The conditions set up by the user are ignored, that is, the records used are all those found on all pages
without any filters active.

For an array of symbols, the first method name is sent to the ActiveRecord object if it responds to this
method, the second method name is sent to the returned value unless it is `nil`, and so on. In other
words, a single symbol mode is the same as an array of symbols where the array contains just one element.

```ruby
g.column name: 'Version', attribute: 'expected_version_id', custom_filter: [:expected_version, :to_option] do |task|
  task.expected_version.name if task.expected_version
end
```

There are two important differences from `:auto`:

1. The  method does not have to be a field in the result set, it is just some  value computed in the method after the database call and ActiveRecord instantiation.
2. Filtering by any option of such a custom filter will bring a non-empty list, unlike with `:auto`.


This mode has one major drawback - this mode requires an additional query without `offset` and `limit`
clauses to instantiate _all_ ActiveRecord objects, and performance-wise it brings all the advantages of
pagination to nothing. Thus, memory- and performance-wise this can be really bad for some queries and
tables and should be used with care.


If the final method returns a atomic value like a string or an integer, it is used for both the value and
the label of the select option element:

```html
<option value="returned value">returned value</option>
```

However, if the retuned value is a two element array, the first element is used for the option label and
the second - for the value.

Typically, a model method like the following:

```ruby
def to_option
  [name, id]
end
```

together with

```ruby
custom_filter: :to_option
```

would do the trick:

```html
<option value="id">name</option>
```

Alternatively, a hash with the single key-value pair can be used, where the key will be used for the
label, and the key - for the value:

```ruby
def to_option
  {name => id}
end
```

#### Special treatment of values 'null' and 'not null'

Values `null` and `not null` in a generated custom filter are treated specially, as  SQL `null` statement
and not as strings. Value `null` is transformed into SQL condition `IS NULL`, and `not null` into
`IS NOT NULL`.

Thus, if in a filter defined by

```ruby
custom_filter: {'No' => 'null', 'Yes' => 'not null', '1' => 1, '2' => '2', '3' => '3'}
```

values '1', '2' and 'No' are selected (in a multi-select mode),  this will result in the following SQL:

```sql
( table.field IN ( '1', '2' ) OR table.field IS NULL )
```

#### Multiple selection

By default it is possible for any dropdown list to switch between single and multiple selection modes.
To only allow single selection use `:allow_multiple_selection`:

```ruby
g.column name: 'Expected in version', attribute: 'expected_version_id',
       custom_filter: [:expected_version, :to_option], allow_multiple_selection: false do |task|
  ...
end
```

### Numeric Filters

Before version 3.2.1 the filter used for numeric columns was a range filter with two limits. Beginning
with version  3.2.1 the default is a direct comparison filter with one input field. The old range filter
can still be loaded using parameter `:filter_type` with value `:range`:

```ruby
g.column filter_type: :range do |task|
  ...
end
```

### Date and DateTime Filters

WiceGrid provides four filters for selecting dates and time:

  * ```:jquery_datepicker``` - Jquery datepicker (works for datetime, too)
  * ```:bootstrap_datepicker``` - Bootstrap datepicker (works for datetime, too)
  * ```:rails_date_helper``` - standard Rails date helper
  * ```:rails_datetime_helper``` - standard Rails datetime helper

Specify a date/datetime filter just like you specify any other filter:

```
  g.column name: 'Updated', attribute: 'updated_at', filter_type: :rails_datetime_helper do |task|
    task.updated_at.to_fs(:db)
  end
```

Default filters are defined in configuration constants Wice::Defaults::DEFAULT_FILTER_FOR_DATE and
Wice::Defaults::DEFAULT_FILTER_FOR_DATETIME.



#### jQuery UI DatePicker `(HELPER_STYLE = :calendar)`

By default WiceGrid uses jQuery UI datepicker[http://jqueryui.com/demos/datepicker/] for Date and DateTime
filters. Because this is part of the standard jQuery UI codebase, it is not bundled together with the
plugin, and it is the responsibility of the programmer to include all necessary assets including
localization files if the application is multilingual.

jQuery UI datepicker does not have any time related controls, and when dealing with DateTime filters, the
time value is ignored.

Constants `DATE_FORMAT` and `DATETIME_FORMAT` in the configuration file define the format of dates the
user will see, as well as the format of the string sent in a HTTP parameter. If you change the formats,
make sure that lamdbas defined in `DATETIME_PARSER` and `DATE_PARSER` return valid DateTime and Date
objects.

jQuery `datepicker` uses a different format flavor, therefore there is an additional constant
`DATE_FORMAT_JQUERY`. While `DATE_FORMAT_JQUERY` is fed to `datepicker`, `DATE_FORMAT` is still used
for presenting initial date values in filters, so make sure that `DATE_FORMAT_JQUERY` and `DATE_FORMAT`
result in an identical date representation.

Constant `DATEPICKER_YEAR_RANGE` defines the range of years in the Datepicker year dropdown. Alternatively,
you can always change this range dynamically with the following javascript:

```js
$( ".hasDatepicker" ).datepicker( "option", "yearRange", "2000:2042" );
```

#### jQuery UI DatePicker `(HELPER_STYLE = :bootstrap)`

WiceGrid also supports [Bootstrap Datepicker](https://github.com/Nerian/bootstrap-datepicker-rails).

#### Rails standard input fields `(HELPER_STYLE = :standard)`

Another option is standard Rails helpers for date fields, these are separate select fields for years,
months and days (also for hour and minute if it is a datetime field).

### Detached Filters

Filters can also be detached from the grid table and placed anywhere on page.

This is a 3-step process.

First, define the grid with helper `define_grid` instead of `grid`. Everything should be done the same way
as with `grid`, but every column which will have an external filter, add
`detach_with_id: :some_filter_name`` in the column definition. The value of `:detach_with_id` is an
arbitrary string or a symbol value which will be used later to identify the filter.

```erb
<%= define_grid(@tasks_grid, show_filters: :always) do |g|

  g.column name: 'Title', attribute: 'title', detach_with_id: :title_filter do |task|
    link_to('Edit', edit_task_path(task.title))
  end

  g.column name: 'Archived', attribute: 'archived', detach_with_id: :archived_filter do |task|
    task.archived? ? 'Yes' : 'No'
  end

  g.column name: 'Added', attribute: 'created_at', detach_with_id: :created_at_filter do |task|
    task.created_at.to_fs(:short)
  end

end -%>
```

Then, use `grid_filter(grid, :some_filter_name)` to render filters:

```erb
<% # rendering filter with key :title_filter %>
<%= grid_filter @tasks_grid, :title_filter  %>

<% # rendering filter with key :archived_filter %>
<%= grid_filter @tasks_grid, :archived_filter  %>

<% # rendering filter with key :created_at_filter %>
<%= grid_filter @tasks_grid, :created_at_filter  %>

<% # Rendering the grid body %>
<%= grid(@tasks_grid) %>
```

Finally, use `render_grid(@grid)` to actually output the grid table.


Using custom submit and reset buttons together with `hide_submit_button: true` and
`hide_reset_button: true` allows to completely get rid of the default filter row and the default
icons (see section 'Submit/Reset Buttons').


If a column was declared with `:detach_with_id`, but never output with `grid_filter`, filtering
the  grid in development mode will result in an warning javascript message and the missing filter will be
ignored. There is no such message in production.


### Defining your own external filter processors


It possible to define and use your own column processors outside of the plugin, in you application.

The first step is to edit `Wice::Defaults::ADDITIONAL_COLUMN_PROCESSORS` in
`wice_grid_config.rb`:

```ruby

Wice::Defaults::ADDITIONAL_COLUMN_PROCESSORS = {
  my_own_filter:  ['ViewColumnMyOwnFilter',   'ConditionsGeneratorMyOwnFilter'],
  another_filter: ['ViewColumnAnotherFilter', 'ConditionsGeneratorAnotherFilter']
}
```

The first element in the two-item array is the name of a class responsible for rendering
the filter view. The second element  is the name of a class responsible for processing
filter parameters.

For examples of these two classes look at the existing column processors in `lib/wice/columns/`

The structure of these two classes is as follows:

```ruby
class ViewColumnMyOwnFilter < Wice::Columns::ViewColumn

  def render_filter_internal(params)
    ...
  end

  def yield_declaration_of_column_filter
    {
      templates: [...],
      ids:       [...]
    }
  end
end


class ConditionsGeneratorMyOwnFilter < Wice::Columns::ConditionsGeneratorColumn

  def generate_conditions(table_name, opts)
    ...
  end

end
```

To use an external column processor use `:filter_type` in a column definition:

```ruby
column name: 'name', attribute: 'attribute', filter_type: :my_own_filter do |rec|
  ...
end
```

## Defaults

Default values like  can be  changed in `config/initializers/wice_grid_config.rb`.

## Submit/Reset buttons
Instead of using default Submit and Reset icons you can use external HTML elements to trigger
these actions. Add a button or any other clickable HTML element with class
`wg-external-submit-button` or `wg-external-reset-button`, and attribute `data-grid-name`
whose value is the name of the grid:

```html
<button class="wg-external-submit-button" data-grid-name="grid">Submit</button>
<button class="wg-external-reset-button" data-grid-name="grid">Reset</button>
```

To hide the default icons use `hide_submit_button: true` and
`hide_reset_button: true` in the `grid` helper.


## Auto-reloading filters

It is possible to configure a grid to reload itself once a filter has been changed. It works with all
filter types including the JS calendar, the only exception is the standard Rails date/datetime filters.

Use option `:auto_reload` in the column definiton:

```erb

<%= grid(@tasks_grid, show_filters: :always, hide_submit_button: true) do |g|

  # String
  g.column name: 'Title', attribute: 'title', auto_reload: true

  # Boolean
  g.column name: 'Archived', attribute: 'archived', auto_reload: true

  # Custom (dropdown)
  g.column name: 'Status', attribute: 'status_id', custom_filter: Status.to_dropdown, auto_reload: true  do |task|
    task.status.name if task.status
  end

  # Datetime
  g.column name: 'Added', attribute: 'created_at', auto_reload: true, helper_style: :calendar do |task|
    task.created_at.to_fs(:short)
  end

end -%>
```

To make this  behavior default change constant `AUTO_RELOAD` in the configuration file.

## Styling the grid


### Adding classes and styles

The `grid` helper accepts parameter `:html` which is a hash of HTML attributes for the table tag.

Another `grid` parameter is `header_tr_html` which is a hash of HTML attributes to
be added to the first `tr` tag (or two first `tr`'s if the filter row is present).

`:html` is a parameter for the `column` method setting HTML attributes of `td` tags for a certain column.

### Adding classes and styles dynamically

WiceGrid offers ways to dynamically add classes and styles to `TR` and `TD` based on the current ActiveRecord instance.


For `<TD>`, let the `column` return an array where the first item is the usual
string output whole the second is a hash of HTML attributes to be added for the
`<td>` tag of the current cell:

```ruby
g.column  do |portal_application|
  css_class = portal_application.public? ? 'public' : 'private'
  [portal_application.name, {class: css_class}]
end
```

For adding classes/styles to `<TR>` use special clause  `row_attributes` ,
similar to `column`, only returning a hash:

```erb
<%= grid(@versions_grid) do |g|
  g.row_attributes do |version|
    if version.in_production?
      {style: 'background-color: rgb(255, 255, 204);'}
    end
  end

  g.column{|version| ... }
  g.column{|version| ... }
end  -%>
```

Naturally, there can be only one `row_attributes` definition for a WiceGrid instance.

Various classes do not overwrite each other, instead, they are concatenated.


## Adding rows to the grid

It is possible to add your own handcrafted HTML after and/or before each grid row.
This works similar to `row_attributes`, by adding blocks `after_row`, `before_row`,  and `last_row`:

```erb
<%= grid(@tasks_grid) do |g|
  g.before_row do |task, number_of_columns|
    if task.active?
      "<tr><td colspan=\"10\">Custom line for #{t.name}</td></tr>"  # this would add a row
                                                                    # before every active task row
    else
      nil
    end
  end

  g.last_row do |number_of_columns|         # This row will always be added to the bottom of the grid
    content_tag(:tr,
      content_tag(:td,
        'Last row',
      colspan: 10),
     class: 'last_row')
  end

  .......
end %>
```

It is up for the developer to return the correct HTML code, or return `nil` if no row is needed for this record.
Naturally, there is only one `before_row`  definition and one `after_row` definition for a WiceGrid instance.

The second variable injected into to `before_row` and `after_row` block, and the first parameter injected
into the `last_row` is the number of columns in the current grid.

## Rendering a grid without records

If the grid does not contain any records to show, it is possible show some alternative view instead of
an empty grid. Bear in mind that if the user sets up the filters in such a way that the selection of
records is empty, this will still render the grid and it will be possible to reset the grid clicking
 on the Reset button. Thus, this only works if the initial number of records is 0.

```erb
<%= grid(@grid) do |g|

  g.blank_slate  do
    "There are no records"
  end

  g.column  do |product|
     ...
  end
 end  -%>
```

There are two alternative ways to do the same, submitting a string to `blank_slate`:

```ruby
g.blank_slate "some text to be rendered"
```

Or a partial:

```ruby
g.blank_slate partial: "partial_name"
```

## Action Column

It is possible to add a column with checkboxes for each record. This is useful for actions with multiple records,
for example, deleting selected records. Please note that `action_column` only creates the checkboxes and the
'Select All' and 'Deselect All' buttons, and the form itself as well as processing the parameters should be
taken care of by the application code.

```erb
<%= grid(@tasks_grid, show_filters: :always) do |g|

  ...

  g.action_column

  ...

end -%>
```

By default the name of the HTTP parameter follows pattern `"#{grid_name}[#{param_name}][]"`, thus
`params[grid_name][param_name]` will contain an array of object IDs.

You can hide a certain action checkbox if you add the usual block to `g.action_column`, just like with the
`g.column` definition. If the block returns `nil` or `false` no checkbox will be rendered.

```erb
<%= grid(@tasks_grid, show_filters: :always) do |g|

  ...

  g.action_column do |task|
    task.finished?
  end

  ...

end -%>
```

WiceGrid is form-friendly: submitting grid in a form retains the state of the form.



## Integration of the grid with other forms on page

Imagine that the user should be able to change the behavior of the grid using some other control
on the page, and not a grid filter.

For example, on a page showing tasks, change between 'Show active tasks' to 'Show archived tasks' using a dropdown box.
WiceGrid allows to keep the status of the grid with all the filtering and sorting using helper
`dump_filter_parameters_as_hidden_fields` which takes a grid object and dumps
all current sorting and filtering parameters as hidden fields. Just include
`dump_filter_parameters_as_hidden_fields(@grid)` inside your form, and the newly rendered grid will keep ordering and filtering.

```erb
<% form_tag('', method: :get) do %>
  <%= dump_filter_parameters_as_hidden_fields(@tasks_grid) %>
  <%= select_tag 'archived',
     options_for_select([['View active tasks', 0], ['View archived tasks', 1]], @archived ? 1 : 0),
    onchange: 'this.form.submit()' %>
<% end -%>
```


## Show All Records

It is possible to switch to the All Records mode clicking on link "show all" in the bottom right corner.
This functionality should be used with care. To turn this mode off for all grid instances,
change constant `ALLOW_SHOWING_ALL_RECORDS` in `config/initializers/wice_grid_config.rb` to
`false`. To do so for a specific grid, use initializer parameter `:allow_showing_all_records`.

Configuration constant `START_SHOWING_WARNING_FROM` sets the threshold number of all records after
which clicking on the link results in a javascript confirmation dialog.


## CSV Export

It is possible to export the data displayed on a grid to a CSV file. The dumped data is the current resultset
with all the current filters and sorting applied, only without the pagination constraint (i.e. all pages).

To enable CSV export add parameters `enable_export_to_csv` and `csv_file_name` to the initialization of the grid:

```ruby
@projects_grid = initialize_grid(Project,
  include:              [:customer, :supplier],
  name:                 'g2',
  enable_export_to_csv: true,
  csv_file_name:        'projects'
)
```

`csv_file_name` is the name of the downloaded file. This parameter is optional, if it is missing, the name of
the grid is used instead. The export icon will appear at the bottom right corner of the grid. If the program you are importing the generated CSV into has problem processing UTF-8, you can change the character encoding using the `csv_encoding` option. P.e. setting `csv_encoding: 'CP1252:UTF-8'` will make older versions of Excel happy. The format used is `<output encoding>:<input encoding>`.

Next, each grid view helper should be placed in a partial of its own, requiring it from the master
template for the usual flow. There must be no HTML or ERB code in this partial except for the grid helper.

By convention the name of such a partial follows the following pattern:

```
  _GRID_NAME_grid.html.erb
```

In other words, a grid named `tasks` is expected to be found in a template called
`_tasks_grid.html.erb` (remember that the default name of grids is '`grid`'.)

Next, method `export_grid_if_requested` should be added to the end of each action
containing grids with enabled CSV export.

`export_grid_if_requested` intercepts CSV export requests and evaluates the partial with the required grid helper.

The naming convention for grid partials can be easily overridden by supplying a hash parameter
to `export_grid_if_requested` where each key is the name of a grid, and the value is the name of
the template (like it is specified for `render`, i.e. without '_' and extensions):

```ruby
  export_grid_if_requested('g1' => 'tasks_grid', 'g2' => 'projects_grid')
```

If the request is not a CSV export request, `export_grid_if_requested` does nothing and returns
`false`, if it is a CSV export request, the method returns `true`.


If the action has no explicit `render` call, it's OK to just place `export_grid_if_requested`
as the last line of the action:

```ruby
def index

  @tasks_grid = initialize_grid(Task,
    name:                 'g1',
    enable_export_to_csv: true,
    csv_file_name:        'tasks'
  )

  @projects_grid = initialize_grid(Project,
    name:                 'g2',
    enable_export_to_csv: true,
    csv_file_name:        'projects'
  )

  export_grid_if_requested
end
```

Otherwise, to avoid double rendering, use the return value of the method to conditionally call your `render` :

```ruby

def index

  ...........

  export_grid_if_requested || render(action: 'my_template')
end
```

It's also possible to supply a block which will be called if no CSV export is requested:

```ruby
def index

  ...........

  export_grid_if_requested do
     render(action: 'my_template')
  end
end
```

If a column has to be excluded from the CSV export,
set `column` parameter `in_csv` to `false`:

```ruby
g.column in_csv: false do |task|
  link_to('Edit', edit_task_path(task))
end
```

If a column must appear both in HTML and CSV, but with different output, duplicate the column and use
parameters `in_csv` and `in_html` to include one of them to  html output only, the other to CSV only:

```ruby
# html version
g.column name: 'Title', attribute: 'title', in_csv: false do |task|
  link_to('Edit', edit_task_path(task.title))
end
# plain text version
g.column name: 'Title', in_html: false do |task|
  task.title
end
```

The default field separator in generated CSV is a comma, but it's possible to override it:

```ruby
@products_grid = initialize_grid(Product,
  enable_export_to_csv:  true,
  csv_field_separator:   ';',
  csv_file_name:         'products'
)
```

If you need an external CSV export button , add class `wg-external-csv-export-button`
to any clickable element on page and set its attribute `data-grid-name` to the name of the grid:

```html
<button class="wg-external-csv-export-button" data-grid-name="grid">Export To CSV</button>
```

If you need to disable the default export icon in the grid, add `hide_csv_button: true` to the `grid` helper.


## Access to Records From Outside The Grid

There are two ways you can access the records outside the grid - using methods of the WiceGrid
object and using callbacks.

### Accessing Records Via The WiceGrid Object

Method `current_page_records` returns exactly the same list of objects displayed on page:

```erb
<%= grid(@tasks_grid) do |g|
  ...
end -%>

<p>
  IDs of records on the current page:
  <%= @tasks_grid.current_page_records.map(&:id).to_sentence %>
</p>
```

Method `all_pages_records` returns a list of objects browsable through all pages with the current filters:

```erb
<%= grid(@tasks_grid) do |g|
  ...
end -%>

<p>
  IDs of all records:
  <%= @tasks_grid.all_pages_records.map(&:id).to_sentence %>
</p>
```

Mind that this helper results in an additional SQL query.

Because of the current implementation of WiceGrid these helpers work only after the declaration
of the grid in the view.
This is due to the lazy nature of WiceGrid - the actual call to the database is made during
the execution of
the `grid` helper, because to build the correct query columns declarations are required.

### Accessing Records Via Callbacks

It is possible to set up callbacks which are executed from within the plugin just after the call to the database.
The callbacks are called before rendering the grid cells, so the results of this processing can be used in the grid.
There are 3 ways you can set up such callbacks:

Via a lambda object:

```ruby
def index
  @tasks_grid = initialize_grid(Task,
    with_paginated_resultset: ->(records){
      ...
    }
  )
end
```

Via a symbol which is the name of a controller method:

```ruby
def index
  @tasks_grid = initialize_grid(Task,
    with_paginated_resultset: :process_selection
  )
end

def process_selection(records)
  ...
end
```

Via a separate block:

```ruby
def index
  @tasks_grid = initialize_grid(Task)

  @tasks_grid.with_paginated_resultset do |records|
    ...
  end
end
```

There are two callbacks:

* `:with_paginated_resultset` - used to process records of the current page
* `:with_resultset` - used to process all records browsable through all pages with the current filters

While the `:with_paginated_resultset` callback just receives the list of records, `:with_resultset`
receives an ActiveRelation object which can be used to obtain the list of all records:

```ruby
def index
  @tasks_grid = initialize_grid(Task)

  @tasks_grid.with_resultset do |active_relation|
    all_records = active_relation.all
    ...
  end
end
```

This lazy nature exists for performance reasons.
Reading all records leads to an additional call, and there can be cases when processing all records should be triggered
only under certain circumstances:

```ruby
def index
  @tasks_grid = initialize_grid(Task)

  @tasks_grid.with_resultset do |active_relation|
    if params[:process_all_records]
      all_records = active_relation.all
      ...
    end
  end
end
```

## Testing

To run tests:

1. `git clone https://github.com/leikind/wice_grid.git`
2. `cd wice_grid`
3. `bundle`
4. Install phantomjs (e.g. `brew install phantomjs` or `apt-get install phantomjs` or something else)
5. `bundle exec appraisal rspec`

Tests against Rails 5.0, 5.1 & 5.2. To test against a specific version, for example Rails 5.2 run `bundle exec appraisal rails-5.2 rspec`

This repository contains a Rails application for testing purposes. To fire up this application manually, run `cd spec/support/test_app/bin; RAILS_ENV=test rails s`.

## Bug reports

If you discover a problem with Wicegrid, we would love to know about it. Please use the [GitHub issue tracker](https://github.com/leikind/wice_grid/issues)


================================================
FILE: Rakefile
================================================
require 'rubygems'
require 'bundler'
require 'bundler/gem_tasks'

begin
  Bundler.setup(:default, :development)
rescue Bundler::BundlerError => e
  $stderr.puts e.message
  $stderr.puts 'Run `bundle install` to install missing gems'
  exit e.status_code
end

require 'rake'
require 'rspec/core'
require 'rspec/core/rake_task'

RSpec::Core::RakeTask.new(:spec)

desc 'Run RSpec with code coverage'
task :coverage do
  ENV['COVERAGE'] = 'true'
  Rake::Task['spec'].execute
end

# Experimenting with documentation system we will keep both Yardoc and Rdoc for some time, plus Inch

require 'yard'
require 'yard/rake/yardoc_task'
desc 'Generate YARDOC documentation for the plugin'
YARD::Rake::YardocTask.new(:yardoc) do |t|
  OTHER_PATHS = %w()
  t.files   = ['lib/**/*.rb', OTHER_PATHS]
  t.options = %w(--main=README.md --file TODO.md,CHANGELOG.md,SAVED_QUERIES_HOWTO.md,MIT-LICENSE)
  t.stats_options = ['--list-undoc']
end

gem 'rdoc'
require 'rdoc/task'
Rake::RDocTask.new(:rdoc) do |rdoc|
  rdoc.rdoc_dir = 'rdoc'
  rdoc.title    = 'WiceGrid'
  rdoc.options << '--line-numbers' << '--inline-source'
  rdoc.rdoc_files.include('README.md')
  rdoc.rdoc_files.include('SAVED_QUERIES_HOWTO.md')
  rdoc.rdoc_files.include('CHANGELOG.md')
  rdoc.rdoc_files.include('lib/**/*.rb')
end

task default: [:spec, :yardoc]


================================================
FILE: SAVED_QUERIES_HOWTO.md
================================================
## Saving Queries How-To

WiceGrid allows to save the state of filters as a custom query and later restore it from the list of saved queries.

### Step 1: Create the database table to store queries

To get started create the database table to store queries. Run the following generator:
```
rails g wice_grid:add_migration_for_serialized_queries
```
This add a migration file with the definition of the table. Run the migrate task:
```
  bundle 'rake db:migrate'
```
### Step 2: Create the controller to handle AJAX queries.

Creation and deletion of queries is implemented as AJAX calls, and a controller is needed to handle these calls. Create an empty controller
with any name and add  method +save_wice_grid_queries+ to it:
```
  class QueriesController < ApplicationController
    save_wice_grid_queries
  end
```
This is it. The controller now has the required action methods.

### Step 3: Add routes

If the name of the query controller is QueriesController, add the following to `routes.rb`:
```
  Wice::define_routes(self, 'queries')
```
### Step 4: Add the saved query panel to the view.

To show the list of saved queries and the form to create new queries in a view, add the following helper to the view:
```
  <%= saved_queries_panel(@grid_object) %>
```
Voila!

Just like WiceGrid itself, the query panel contains no forms and is thus form-friendly.

*Important*: Saved queries of all grids in the application are stored in one table and differentiated by the name of the grid, thus, for all forms
with saved queries it is important to define different names! (use parameter `:name` in +initialize_grid+)

It is also possible to initialize a grid with an initial saved query providing the id of the query record or the ActiveRecord
itself to parameter `saved_query`:
```
  @products_grid = initialize_grid(Product,
    name:        'prod_grid',
    saved_query: SavedQuery.find_by_id_and_grid_name(12, 'prod_grid') )
```

## Adding Application Specific Logic to Saving/Restoring Queries

WiceGrid allows to add application specific logic to saving and restoring queries by substituting the default ActiveRecord model provided by WiceGrid with a custom model.

Copy `lib/wice_grid_serialized_query.rb` from the gem to `app/models/`, rename the file and the class to your liking.

After renaming the model to SavedQuery it looks like this:
```
  class SavedQuery < ActiveRecord::Base  #:nodoc:
    serialize :query

    validates_uniqueness_of :name, scope: :grid_name, on: :create,
      message: 'A query with this name already exists'

    validates_presence_of :name, message: 'Please submit the name of the custom query'

    def self.list(name, controller)
      conditions = {grid_name: name}
      self.find(:all, conditions: conditions)
    end
  end
```

It is required that the model provides class method +list+ which accepts two parameters: the name of the WiceGrid instance and the controller
object, and returns a list of queries. The controller object is needed to provide the application context. For instance, if it is needed to
store queries for each user, we could add +user_id+ to the table and modify the code so it looks like the following:
```
  class SavedQuery < ActiveRecord::Base
    serialize :query

    validates_uniqueness_of :name, scope: :grid_name, on: :create,
      message: 'A query with this name already exists'

    validates_presence_of :name, message: 'Please submit the name of the custom query'

    belongs_to :identity # !

    def self.list(name, controller)
      conditions = {grid_name: name}
      if controller.current_user # !
        conditions[:user_id] = controller.current_user.id # provided that method current_user is defined in ApplicationController and returns the currrent user.
      end
      self.find(:all, conditions: conditions)
    end
  end
```

The following step is to make sure that a new query is saved with the correct +user_id+. To do so, change the helper
`saved_queries_panel(@grid_object)` to the following:

```
   <%= saved_queries_panel(@identities_grid, extra_parameters: {user_id: @current_user.id}) %>
```
For every key in has :extra_parameters there must exist a field in the model - this hash will be used as a parameter to
`attributes=` method of the query object.

Finally, let WiceGrid know which model to use for saving queries by changing constant  +QUERY_STORE_MODEL+
in `lib/wice_grid_config.rb` to the name of the custom model (as a string), in the above example this would look like the following:
```
      QUERY_STORE_MODEL = 'SavedQuery'
```


================================================
FILE: app/views/kaminari/wice_grid/_gap.html.erb
================================================
<li class="disabled"><a href="#">...</a></li>


================================================
FILE: app/views/kaminari/wice_grid/_next_page.html.erb
================================================
<li><%= link_to_unless current_page.last?, ::Wice::NlMessage['next_label'], url, rel: 'next', remote: remote %></li>


================================================
FILE: app/views/kaminari/wice_grid/_page.html.erb
================================================
<li <%if page.current?%>class="active"<%end%>><%= link_to page, url, {remote: remote, rel: page.next? ? 'next' : page.prev? ? 'prev' : nil} %></li>


================================================
FILE: app/views/kaminari/wice_grid/_paginator.html.erb
================================================
<%= paginator.render do %>
  <div class="pagination">
    <ul class="grid pagination">
      <% unless current_page.first? %>
        <%= prev_page_tag %>
      <% end %>
      <% each_page do |page| %>
        <% if page.left_outer? || page.right_outer? || page.inside_window? %>
          <%= page_tag page %>
        <% elsif !page.was_truncated? %>
          <%= gap_tag %>
        <% end %>
      <% end %>
      <% unless current_page.last? %>
        <%= next_page_tag %>
      <% end %>
    </ul>
  </div>
<% end %>


================================================
FILE: app/views/kaminari/wice_grid/_prev_page.html.erb
================================================
<li><%= link_to_unless current_page.first?, ::Wice::NlMessage['previous_label'], url, rel: 'prev', remote: remote %></li>


================================================
FILE: config/locales/cz.yml
================================================
cz:
  wice_grid:
    show_filter_tooltip: Zobrazit filtr
    hide_filter_tooltip: Skrýt filtr
    csv_export_tooltip: Exportovat do CSV
    filter_tooltip: Filtr
    reset_filter_tooltip: Zrušit filtr
    boolean_filter_true_label: "áno"
    boolean_filter_false_label: "ne"
    previous_label: «
    next_label: »
    # Title of the icon clicking on which will show the calendar to set the FROM date.
    date_selector_tooltip_from: Dátum od
    # Title of the icon clicking on which will show the calendar to set the TO date.
    date_selector_tooltip_to: Dátum do
    # The title of the checkox to turn on negation
    negation_checkbox_title: Inverzní výběr
    # link to switch to show all records
    show_all_records_label: Zobrazit všechno
    # tooltip for the link to switch to show all records
    show_all_records_tooltip: Zobrazí všechny záznamy v databáze
    # Warning message shown when the user wants to switch to all-records mode
    all_queries_warning: Určitě chceš zobrazit všechny záznamy v databáze?
    # link to paginated view
    switch_back_to_paginated_mode_label: zpět na stránkové zobrazení
    # tooltip for the link to paginated view
    switch_back_to_paginated_mode_tooltip: Přepnout do stránkového zobrazení
    # Title of the date string.
    date_string_tooltip: Kliknutím zmažeš
    saved_query_panel_title: Uložené filtry
    save_query_button_label: Uložit aktuálni stav filtrů
    saved_query_deletion_confirmation: Seš si jistej?
    saved_query_deletion_link_title: Smazat uloženej filtr
    saved_query_link_title: Použít uloženej filtr
    validates_uniqueness_error: Filtr už existuje.
    validates_presence_error: Prosím zadej název filtru.
    query_deleted_message: Uložený filtr byl smazán.
    query_saved_message: Filtr byl uložen.
    select_all: Vyber všechno
    deselect_all: Zrušit výběr
    expand: Rozšířit
    collapse: Kolaps


================================================
FILE: config/locales/de.yml
================================================
de:
  wice_grid:
    show_filter_tooltip: Filter einblenden
    hide_filter_tooltip: Filter ausblenden
    csv_export_tooltip: CSV Export
    filter_tooltip: Filter
    reset_filter_tooltip: Reset
    boolean_filter_true_label: "Ja"
    boolean_filter_false_label: "Nein"
    previous_label: «
    next_label: »
    # Title of the icon clicking on which will show the calendar to set the FROM date.
    date_selector_tooltip_from: Von
    # Title of the icon clicking on which will show the calendar to set the TO date.
    date_selector_tooltip_to: Bis
    # The title of the checkox to turn on negation
    negation_checkbox_title: Ausschließen
    # link to switch to show all records
    show_all_records_label: Alle anzeigen
    # tooltip for the link to switch to show all records
    show_all_records_tooltip: Alle anzeigen
    # Warning message shown when the user wants to switch to all-records mode
    all_queries_warning: Wollen Sie wirkliche alle Einträge anzeigen?
    # link to paginated view
    switch_back_to_paginated_mode_label: Zurück zur seitenbasierten Ansicht
    # tooltip for the link to paginated view
    switch_back_to_paginated_mode_tooltip: Zurück zur seitenbasierten Ansicht
    # Title of the date string.
    date_string_tooltip: Löschen
    saved_query_panel_title: Gespeicherte Abfragen
    save_query_button_label: Filter speichern
    saved_query_deletion_confirmation: Sind Sie sicher?
    saved_query_deletion_link_title: Abfrage löschen
    saved_query_link_title: Abfrage laden
    validates_uniqueness_error: Eine Abfrage mit dieser Bezeichnung existiert bereits!
    validates_presence_error: Bitte vergeben Sie einen Namen!
    query_deleted_message: Abfrage gelöscht.
    query_saved_message: Abfrage gespeichert.
    select_all: Alle auswählen
    deselect_all: Auswahl aufheben
    expand: Ausklappen
    collapse: Einklappen


================================================
FILE: config/locales/en.yml
================================================
en:
  wice_grid:
    show_filter_tooltip: Show filter
    hide_filter_tooltip: Hide filter
    csv_export_tooltip: Export to CSV
    filter_tooltip: Filter
    reset_filter_tooltip: Reset
    boolean_filter_true_label: "yes"
    boolean_filter_false_label: "no"
    previous_label: «
    next_label: »
    # Title of the icon clicking on which will show the calendar to set the FROM date.
    date_selector_tooltip_from: From
    # Title of the icon clicking on which will show the calendar to set the TO date.
    date_selector_tooltip_to: To
    # The title of the checkox to turn on negation
    negation_checkbox_title: Exclude
    # link to switch to show all records
    show_all_records_label: show all
    # tooltip for the link to switch to show all records
    show_all_records_tooltip: Show all records
    # Warning message shown when the user wants to switch to all-records mode
    all_queries_warning: Are you sure you want to display all records?
    # link to paginated view
    switch_back_to_paginated_mode_label: back to paginated view
    # tooltip for the link to paginated view
    switch_back_to_paginated_mode_tooltip: Switch back to the view with pages
    # Title of the date string.
    date_string_tooltip: Click to delete
    saved_query_panel_title: Saved Queries
    save_query_button_label: Save the state of filters
    saved_query_deletion_confirmation: Are you sure?
    saved_query_deletion_link_title: Delete query
    saved_query_link_title: Load query
    validates_uniqueness_error: A query with this name already exists
    validates_presence_error: Please submit the name of the custom query
    query_deleted_message: Saved query deleted.
    query_saved_message: Query saved.
    select_all: Select all
    deselect_all: Remove selection
    expand: Expand
    collapse: Collapse


================================================
FILE: config/locales/es.yml
================================================
es:
  wice_grid:
    show_filter_tooltip: Mostrar filtro
    hide_filter_tooltip: Ocultar filtro
    csv_export_tooltip: Exportar a CSV
    filter_tooltip: Filtro
    reset_filter_tooltip: Reset
    boolean_filter_true_label: "Si"
    boolean_filter_false_label: "No"
    previous_label: «
    next_label: »
    # Title of the icon clicking on which will show the calendar to set the FROM date.
    date_selector_tooltip_from: Desde
    # Title of the icon clicking on which will show the calendar to set the TO date.
    date_selector_tooltip_to: Hasta
    # The title of the checkox to turn on negation
    negation_checkbox_title: Excluir
    # link to switch to show all records
    show_all_records_label: mostrar todos
    # tooltip for the link to switch to show all records
    show_all_records_tooltip: Mostrar todos los registros
    # Warning message shown when the user wants to switch to all-records mode
    all_queries_warning: ¿Estás seguro que quieres mostrar todos los registros?
    # link to paginated view
    switch_back_to_paginated_mode_label: volver a la vista paginada
    # tooltip for the link to paginated view
    switch_back_to_paginated_mode_tooltip: Cambiar atrás a la vista con páginas
    # Title of the date string.
    date_string_tooltip: Click en borrar
    saved_query_panel_title: Consultas salvadas
    save_query_button_label: Salvar el estado de los filtros
    saved_query_deletion_confirmation: ¿Estás seguro?
    saved_query_deletion_link_title: Borrar consulta
    saved_query_link_title: Cargar consulta
    validates_uniqueness_error: Una consulta con este nombre ya existe
    validates_presence_error: Por favor tramita el nombre la consulta modificada
    query_deleted_message: Salvada la consulta borrado.
    query_saved_message: Consulta salvada.
    select_all: Selecciona todo
    deselect_all: Borra la selección
    expand: Expandir
    collapse: Contraer


================================================
FILE: config/locales/fr.yml
================================================
fr:
  wice_grid:
    show_filter_tooltip: Afficher le filtre
    hide_filter_tooltip: Cacher le filtrer
    csv_export_tooltip: Exporter en CSV
    filter_tooltip: Filtrer
    reset_filter_tooltip: Effacer
    boolean_filter_true_label: oui
    boolean_filter_false_label: non
    previous_label: «
    next_label: »
    # Title of the icon clicking on which will show the calendar to set the FROM date.
    date_selector_tooltip_from: De
    # Title of the icon clicking on which will show the calendar to set the TO date.
    date_selector_tooltip_to: à
    # The title of the checkox to turn on negation
    negation_checkbox_title: Exclure
    # link to switch to show all records
    show_all_records_label: Voir tous
    # tooltip for the link to switch to show all records
    show_all_records_tooltip: Voir tous les enregistrements
    # Warning message shown when the user wants to switch to all-records mode
    all_queries_warning: Etes-vous certain de vouloir afficher tous les enregistrements?
    # link to paginated view
    switch_back_to_paginated_mode_label: Retour à la vue paginée
    # tooltip for the link to paginated view
    switch_back_to_paginated_mode_tooltip: Retour à la vue par pages
    # Title of the date string.
    date_string_tooltip: Cliquez pour effacer
    saved_query_panel_title: Requêtes sauvées
    save_query_button_label: Sauver l'état des filtres
    saved_query_deletion_confirmation: Etes vous sûr?
    saved_query_deletion_link_title: Effacer la requête
    saved_query_link_title: Charger la requête
    validates_uniqueness_error: Un requête existante porte déjà ce nom
    validates_presence_error: Veuillez indiquer le nom de la requête que vous souhaitez sauver
    query_deleted_message: La requête a été effacée.
    query_saved_message: La requête a été sauvée.
    select_all: Sélectionner tout
    deselect_all: Désélectionner tout
    expand: Étendre
    collapse: Écrouler


================================================
FILE: config/locales/is.yml
================================================
is:
  wice_grid:
    show_filter_tooltip: Sýna síumöguleika
    hide_filter_tooltip: Fela síumoguleika
    csv_export_tooltip: Flytja út CSV
    filter_tooltip: Sía
    reset_filter_tooltip: Hreinsa
    boolean_filter_true_label: Já
    boolean_filter_false_label: Nei
    previous_label: «
    next_label: »
    # Title of the icon clicking on which will show the calendar to set the FROM date.
    date_selector_tooltip_from: Frá
    # Title of the icon clicking on which will show the calendar to set the TO date.
    date_selector_tooltip_to: Til
    # The title of the checkox to turn on negation
    negation_checkbox_title: Undanskilja
    # link to switch to show all records
    show_all_records_label: Sýna allt
    # tooltip for the link to switch to show all records
    show_all_records_tooltip: Sýna öll gögn
    # Warning message shown when the user wants to switch to all-records mode
    all_queries_warning: Ertu viss um að þú viljir láta sýna öll gögn?
    # link to paginated view
    switch_back_to_paginated_mode_label: Aftur til síðuhorfs
    # tooltip for the link to paginated view
    switch_back_to_paginated_mode_tooltip: Aftur til síðuhorfs
    # Title of the date string.
    date_string_tooltip: Smella á til að eyða
    saved_query_panel_title: Vistaðar leitarskipanir
    save_query_button_label: Vista síuval
    saved_query_deletion_confirmation: Ertu viss?
    saved_query_deletion_link_title: Eyða leitarskipun
    saved_query_link_title: Hlaða leitarskipun
    validates_uniqueness_error: Leitarskipun með þessu nafni er þegar til
    validates_presence_error: Vinsamlegast gefið heiti fyrir leitarskipun
    query_deleted_message: Vistaðri leitarskipun hefur verið eytt
    query_saved_message: leitaskipun hefur verið vistuð
    select_all: Velja allt
    deselect_all: Fjarlægðu val
    expand: Stækka
    collapse: Hrun


================================================
FILE: config/locales/it.yml
================================================
it:
  wice_grid:
    show_filter_tooltip: Mostra filtri
    hide_filter_tooltip: Nascondi filtri
    csv_export_tooltip: Esporta in CSV
    filter_tooltip: Filtri
    reset_filter_tooltip: Cancella
    boolean_filter_true_label: "si"
    boolean_filter_false_label: "no"
    previous_label: «
    next_label: »
    date_selector_tooltip_from: Da
    date_selector_tooltip_to: A
    negation_checkbox_title: Escludi
    show_all_records_label: Tutti i risultati
    show_all_records_tooltip: Mostra tutti i risultati
    all_queries_warning: Sei sicuro di voler mostrare tutti i risultati?
    switch_back_to_paginated_mode_label: torna alla vista paginata
    switch_back_to_paginated_mode_tooltip: Per tornare alla paginazione
    date_string_tooltip: Clicca per cancellare
    saved_query_panel_title: Ricerche salvate
    save_query_button_label: Salva il valore dei filtri
    saved_query_deletion_confirmation: Sei sicuro?
    saved_query_deletion_link_title: Cancella la ricerca
    saved_query_link_title: Carica ricerca
    validates_uniqueness_error: Una ricerca con questo nome già esiste
    validates_presence_error: Per favore inserisci il nome per questa ricerca personalizzata
    query_deleted_message: Ricerca cancellata
    query_saved_message: Ricerca salvata
    select_all: Seleziona tutti
    deselect_all: Deseleziona tutti
    expand: Espandi
    collapse: Chiudi


================================================
FILE: config/locales/ja.yml
================================================
ja:
  wice_grid:
    show_filter_tooltip: フィルタ表示
    hide_filter_tooltip: フィルタ非表示
    csv_export_tooltip: CSVエクスポート
    filter_tooltip: フィルタ
    reset_filter_tooltip: リセット
    boolean_filter_true_label: "yes"
    boolean_filter_false_label: "no"
    previous_label: «
    next_label: »
    # Title of the icon clicking on which will show the calendar to set the FROM date.
    date_selector_tooltip_from: From
    # Title of the icon clicking on which will show the calendar to set the TO date.
    date_selector_tooltip_to: To
    # The title of the checkox to turn on negation
    negation_checkbox_title: 除外する
    # link to switch to show all records
    show_all_records_label: すべて表示
    # tooltip for the link to switch to show all records
    show_all_records_tooltip: 前レコード表示
    # Warning message shown when the user wants to switch to all-records mode
    all_queries_warning: 全てのレコードを表示しますか?
    # link to paginated view
    switch_back_to_paginated_mode_label: 戻る
    # tooltip for the link to paginated view
    switch_back_to_paginated_mode_tooltip: 戻る
    # Title of the date string.
    date_string_tooltip: 削除
    saved_query_panel_title: クエリ保存
    save_query_button_label: フィルタ保存
    saved_query_deletion_confirmation: 本当によろしいですか?
    saved_query_deletion_link_title: クエリ削除
    saved_query_link_title: クエリのロード
    validates_uniqueness_error: 同じ名前がすでに存在します
    validates_presence_error: クエリ名を記入して下さい
    query_deleted_message: クエリの削除が完了しました
    query_saved_message: クエリを保存しました
    select_all: 全てを選択
    deselect_all: 選択を解除
    expand: 開く
    collapse: 閉じる


================================================
FILE: config/locales/nl.yml
================================================
nl:
  wice_grid:
    show_filter_tooltip: Filter tonen
    hide_filter_tooltip: Filter verbergen
    csv_export_tooltip: Als CSV exporteren
    filter_tooltip: Filter
    reset_filter_tooltip: Terugstellen
    boolean_filter_true_label: ja
    boolean_filter_false_label: neen
    previous_label: «
    next_label: »
    # Title of the icon clicking on which will show the calendar to set the FROM date.
    date_selector_tooltip_from: Vanaf
    # Title of the icon clicking on which will show the calendar to set the TO date.
    date_selector_tooltip_to: Tot
    # The title of the checkox to turn on negation
    negation_checkbox_title: Uitsluiten
    # link to switch to show all records
    show_all_records_label: Alle rijen tonen
    # tooltip for the link to switch to show all records
    show_all_records_tooltip: Alle rijen tonen
    # Warning message shown when the user wants to switch to all-records mode
    all_queries_warning: Bent u zeker dat u alle rijen wilt tonen?
    # link to paginated view
    switch_back_to_paginated_mode_label: Terug naar pagina's
    # tooltip for the link to paginated view
    switch_back_to_paginated_mode_tooltip: Terug naar pagina's
    # Title of the date string.
    date_string_tooltip: Klik om te verwijderen
    saved_query_panel_title: Opgeslagen query's
    save_query_button_label: Query opslaan
    saved_query_deletion_confirmation: Bent u zeker?
    saved_query_deletion_link_title: Query verwijderen
    saved_query_link_title: Query laden
    validates_uniqueness_error: Deze query bestaat reeds
    validates_presence_error: Gelieve de naam van de query in te vullen
    query_deleted_message: Opgeslagen query verwijderd.
    query_saved_message: Query opgeslagen
    select_all: Selecteer alle rijen
    deselect_all: Deselecteer alle rijen
    expand: Uitklappen
    collapse: Inklappen


================================================
FILE: config/locales/pt-BR.yml
================================================
pt-BR:
  wice_grid:
    show_filter_tooltip: Mostrar o filtro
    hide_filter_tooltip: Esconder o filtro
    csv_export_tooltip: Exportar em CSV
    filter_tooltip: Filtrar
    reset_filter_tooltip: Reinicializar
    boolean_filter_true_label: sim
    boolean_filter_false_label: não
    previous_label: «
    next_label: »
    date_selector_tooltip_from: De
    date_selector_tooltip_to: a
    negation_checkbox_title: Excluir
    show_all_records_label: Ver todos
    show_all_records_tooltip: Ver todos os registos
    all_queries_warning: Tem certeza que gostaria de visualizar todos os registos?
    switch_back_to_paginated_mode_label: Voltar à lista paginada
    switch_back_to_paginated_mode_tooltip: Voltar à lista por página
    date_string_tooltip: Clique para apagar
    saved_query_panel_title: Filtros gravados
    save_query_button_label: Gravar o estado dos filtros
    saved_query_deletion_confirmation: Tem certeza?
    saved_query_deletion_link_title: Apagar o filtro
    saved_query_link_title: Carregar o filtro
    validates_uniqueness_error: Já existe um filtro com o mesmo nome
    validates_presence_error: Indique o nome do filtro que deseja gravar
    query_deleted_message: O filtro foi apagado.
    query_saved_message: O filtro foi gravado.
    select_all: Selecionar todos
    deselect_all: Remover seleção
    expand: Expandir
    collapse: Colapso


================================================
FILE: config/locales/pt.yml
================================================
pt:
  wice_grid:
    show_filter_tooltip: Mostrar o filtro
    hide_filter_tooltip: Esconder o filtro
    csv_export_tooltip: Exportar em CSV
    filter_tooltip: Filtrar
    reset_filter_tooltip: Reinicializar
    boolean_filter_true_label: sim
    boolean_filter_false_label: não
    previous_label: «
    next_label: »
    # Title of the icon clicking on which will show the calendar to set the FROM date.
    date_selector_tooltip_from: De
    # Title of the icon clicking on which will show the calendar to set the TO date.
    date_selector_tooltip_to: a
    # The title of the checkox to turn on negation
    negation_checkbox_title: Excluir
    # link to switch to show all records
    show_all_records_label: Ver todos
    # tooltip for the link to switch to show all records
    show_all_records_tooltip: Ver todos os registos
    # Warning message shown when the user wants to switch to all-records mode
    all_queries_warning: Tem a certeza de querer visualizar todos os registos?
    # link to paginated view
    switch_back_to_paginated_mode_label: Retorno à vista paginada
    # tooltip for the link to paginated view
    switch_back_to_paginated_mode_tooltip: Retorno à vista por página
    # Title of the date string.
    date_string_tooltip: Cliquar para apagar
    saved_query_panel_title: Queries gravadas
    save_query_button_label: Gravar o estado dos filtros
    saved_query_deletion_confirmation: Tem a certeza?
    saved_query_deletion_link_title: Apagar a query
    saved_query_link_title: Caregar a query
    validates_uniqueness_error: Já existe uma query com o mesmo nome
    validates_presence_error: Queira indicar o nome da query que deseja gravar
    query_deleted_message: A query foi apagada.
    query_saved_message: A query foi gravada.
    select_all: Selecionar todos
    deselect_all: Remover seleção
    expand: Expandir
    collapse: Colapso


================================================
FILE: config/locales/ru.yml
================================================
ru:
  wice_grid:
    show_filter_tooltip: Показать фильтр
    hide_filter_tooltip: Спрятать фильтр
    csv_export_tooltip: Экспорт в CSV
    filter_tooltip: Фильтровать
    reset_filter_tooltip: Сброс
    boolean_filter_true_label: да
    boolean_filter_false_label: нет
    previous_label: «
    next_label: »
    # Title of the icon clicking on which will show the calendar to set the FROM date.
    date_selector_tooltip_from: С
    # Title of the icon clicking on which will show the calendar to set the TO date.
    date_selector_tooltip_to: До
    # The title of the checkox to turn on negation
    negation_checkbox_title: Исключая строки
    # link to switch to show all records
    show_all_records_label: показать все
    # tooltip for the link to switch to show all records
    show_all_records_tooltip: Показать все записи
    # Warning message shown when the user wants to switch to all-records mode
    all_queries_warning: Вы уверены в том, что хотите отобразить все записи?
    # link to paginated view
    switch_back_to_paginated_mode_label: Назад к постраничному выводу
    # tooltip for the link to paginated view
    switch_back_to_paginated_mode_tooltip: Назад к постраничному выводу
    # Title of the date string.
    date_string_tooltip: Кликните, чтобы удалить дату
    saved_query_panel_title: Сохранённые фильтры
    save_query_button_label: Сохранить фильтр
    saved_query_deletion_confirmation: Вы уверены?
    saved_query_deletion_link_title: Удалить сохранённый фильтр
    saved_query_link_title: Загрузить сохранённый фильтр
    validates_uniqueness_error: Сохранённый фильтр с таким именем уже существует
    validates_presence_error: Пожалуйста введите имя сохраняемого фильтра
    query_deleted_message: Сохранённый фильтр удалён.
    query_saved_message: Сохранённый фильтр сохранён.
    select_all: Отметить все
    deselect_all: Убрать выделение
    expand: Развернуть
    collapse: Свернуть


================================================
FILE: config/locales/sk.yml
================================================
sk:
  wice_grid:
    show_filter_tooltip: Zobraziť filter
    hide_filter_tooltip: Skryť filter
    csv_export_tooltip: Exportovať do CSV
    filter_tooltip: Filter
    reset_filter_tooltip: Zrušiť filtre
    boolean_filter_true_label: "áno"
    boolean_filter_false_label: "nie"
    previous_label: «
    next_label: »
    # Title of the icon clicking on which will show the calendar to set the FROM date.
    date_selector_tooltip_from: Dátum od
    # Title of the icon clicking on which will show the calendar to set the TO date.
    date_selector_tooltip_to: Dátum do
    # The title of the checkox to turn on negation
    negation_checkbox_title: Inverzný výber
    # link to switch to show all records
    show_all_records_label: Zobraziť všetko
    # tooltip for the link to switch to show all records
    show_all_records_tooltip: Zobrazí všetky záznamy v databáze
    # Warning message shown when the user wants to switch to all-records mode
    all_queries_warning: Určite chceš zobraziť všetky záznamy v databáze?
    # link to paginated view
    switch_back_to_paginated_mode_label: späť na stránkové zobrazenie
    # tooltip for the link to paginated view
    switch_back_to_paginated_mode_tooltip: Prepnúť do stránkového zobrazenia
    # Title of the date string.
    date_string_tooltip: Kliknutím zmažeš
    saved_query_panel_title: Uložené filtre/výsledky
    save_query_button_label: Uložiť stav filtrov
    saved_query_deletion_confirmation: Si si istý?
    saved_query_deletion_link_title: Vymazať uložený filter
    saved_query_link_title: Nahrať uložený filter
    validates_uniqueness_error: Filter s uvedeným názvom už existuje.
    validates_presence_error: Prosím zadaj názov uloženého filtra.
    query_deleted_message: Uložený filter bol vymazaný.
    query_saved_message: Filter bol uložený.
    select_all: Vyber všetko
    deselect_all: Zrušiť výber
    expand: Zväčšiť
    collapse: Kolaps


================================================
FILE: config/locales/uk.yml
================================================
uk:
  wice_grid:
    show_filter_tooltip: "Показати фільтр"
    hide_filter_tooltip: "Сховати фільтр"
    csv_export_tooltip: "Експорт в CSV"
    filter_tooltip: "Фільтрувати"
    reset_filter_tooltip: "Скинути фільтр"
    boolean_filter_true_label: "так"
    boolean_filter_false_label: "ні"
    previous_label: "«"
    next_label: "»"
    # Title of the icon clicking on which will show the calendar to set the FROM date.
    date_selector_tooltip_from: "Від"
    # Title of the icon clicking on which will show the calendar to set the TO date.
    date_selector_tooltip_to: "До"
    # The title of the checkox to turn on negation
    negation_checkbox_title: "За винятком"
    # link to switch to show all records
    show_all_records_label: "показати всі"
    # tooltip for the link to switch to show all records
    show_all_records_tooltip: "Показати всі записи"
    # Warning message shown when the user wants to switch to all-records mode
    all_queries_warning: "Ви впевнені в тому, що хочете відобразити всі записи?"
    # link to paginated view
    switch_back_to_paginated_mode_label: "Назад до посторінкового виводу"
    # tooltip for the link to paginated view
    switch_back_to_paginated_mode_tooltip: "Назад до посторінкового виводу"
    # Title of the date string.
    date_string_tooltip: "Натисніть, щоб видалити дату"
    saved_query_panel_title: "Збережені фільтри"
    save_query_button_label: "Зберегти фільтр"
    saved_query_deletion_confirmation: "Ви впевнені?"
    saved_query_deletion_link_title: "Видалити збережуваний фільтр"
    saved_query_link_title: "Завантажити збережуваний фільтр"
    validates_uniqueness_error: "Збережуваний фільтр з такою назвою вже існує"
    validates_presence_error: "Будь ласка, введіть назву Збережуваного фільтра"
    query_deleted_message: "Збережуваний фільтр видалено."
    query_saved_message: "Збережуваний фільтр збережено."
    select_all: "Виділити все"
    deselect_all: "Забрати виділення"
    expand: Розгорнути
    collapse: Згорнути


================================================
FILE: config/locales/zh.yml
================================================
zh:
  wice_grid:
    show_filter_tooltip: 显示过滤
    hide_filter_tooltip: 隐藏过滤
    csv_export_tooltip: 输出CSV档
    filter_tooltip: 过滤
    reset_filter_tooltip: 清除过滤
    boolean_filter_true_label: "是"
    boolean_filter_false_label: "否"
    previous_label: «
    next_label: »
    # Title of the icon clicking on which will show the calendar to set the FROM date.
    date_selector_tooltip_from: 从
    # Title of the icon clicking on which will show the calendar to set the TO date.
    date_selector_tooltip_to: 至
    # The title of the checkox to turn on negation
    negation_checkbox_title: 排除
    # link to switch to show all records
    show_all_records_label: 显示全部
    # tooltip for the link to switch to show all records
    show_all_records_tooltip: 显示全部记录
    # Warning message shown when the user wants to switch to all-records mode
    all_queries_warning: 确定要显示全部记录?
    # link to paginated view
    switch_back_to_paginated_mode_label: 回到分页显示
    # tooltip for the link to paginated view
    switch_back_to_paginated_mode_tooltip: 切换到分页显示
    # Title of the date string.
    date_string_tooltip: 按下以清除
    saved_query_panel_title: 查询存储
    save_query_button_label: 储存查询状态
    saved_query_deletion_confirmation: 确定删除?
    saved_query_deletion_link_title: 删除查询
    saved_query_link_title: 读取查询
    validates_uniqueness_error: 已存在相同名称的查询
    validates_presence_error: 请为此查询命名
    query_deleted_message: 查询已删除
    query_saved_message: 查询已储存
    select_all: 全选
    deselect_all: 全清
    expand: 擴大
    collapse: 坍方


================================================
FILE: gemfiles/rails_5.0.gemfile
================================================
# This file was generated by Appraisal

source "https://rubygems.org"

gem "rails", "~> 5.0.0"

gemspec path: "../"


================================================
FILE: gemfiles/rails_5.1.gemfile
================================================
# This file was generated by Appraisal

source "https://rubygems.org"

gem "rails", "~> 5.1.0"

gemspec path: "../"


================================================
FILE: gemfiles/rails_5.2.gemfile
================================================
# This file was generated by Appraisal

source "https://rubygems.org"

gem "rails", "~> 5.2.0"

gemspec path: "../"


================================================
FILE: lib/generators/wice_grid/add_migration_for_serialized_queries_generator.rb
================================================
module WiceGrid #:nodoc:
  module Generators #:nodoc:
    class AddMigrationForSerializedQueriesGenerator < Rails::Generators::Base  #:nodoc:
      include Rails::Generators::Migration

      desc 'Add a migration which creates a table for serialized queries'

      source_root File.expand_path('../templates', __FILE__)

      def self.next_migration_number(_path)
        Time.now.utc.strftime('%Y%m%d%H%M%S')
      end

      def create_model_file
        migration_template 'create_wice_grid_serialized_queries.rb', 'db/migrate/create_wice_grid_serialized_queries.rb'
      end
    end
  end
end


================================================
FILE: lib/generators/wice_grid/install_generator.rb
================================================
module WiceGrid #:nodoc:
  module Generators #:nodoc:
    class InstallGenerator < Rails::Generators::Base #:nodoc:
      desc 'Copy WiceGrid wice_grid_config.rb to config/initializers'

      source_root File.expand_path('../templates', __FILE__)

      def copy_stuff #:nodoc:
        template 'wice_grid_config.rb', 'config/initializers/wice_grid_config.rb'
      end
    end
  end
end


================================================
FILE: lib/generators/wice_grid/templates/create_wice_grid_serialized_queries.rb
================================================
class CreateWiceGridSerializedQueries < ::ActiveRecord::Migration #:nodoc:
  def change #:nodoc:
    create_table :wice_grid_serialized_queries do |t|
      t.column :name,      :string
      t.column :grid_name, :string
      t.column :query,     :text

      t.timestamps
    end
    add_index :wice_grid_serialized_queries, :grid_name
    add_index :wice_grid_serialized_queries, [:grid_name, :id]
  end
end


================================================
FILE: lib/generators/wice_grid/templates/wice_grid_config.rb
================================================
if defined?(Wice::Defaults)

  # Default number of rows to show per page.
  Wice::Defaults::PER_PAGE = 20

  # Default order direction
  Wice::Defaults::ORDER_DIRECTION = 'asc'

  # Default name for a grid. A grid name is the basis for a lot of
  # names including parameter names, DOM IDs, etc
  # The shorter the name is the shorter the request URI will be.
  Wice::Defaults::GRID_NAME = 'grid'

  # If REUSE_LAST_COLUMN_FOR_FILTER_ICONS is true and the last column doesn't have any filter and column name, it will be used
  # for filter related icons (filter icon, reset icon, show/hide icon), otherwise an additional table column is added.
  Wice::Defaults::REUSE_LAST_COLUMN_FOR_FILTER_ICONS = true

  # The label of the first option of a custom dropdown list meaning 'All items'
  Wice::Defaults::CUSTOM_FILTER_ALL_LABEL = '--'

  # A list of classes for the table tag of the grid
  Wice::Defaults::DEFAULT_TABLE_CLASSES = ['table', 'table-bordered', 'table-striped']

  # Allow switching between a single and multiple selection modes in custom filters (dropdown boxes)
  Wice::Defaults::ALLOW_MULTIPLE_SELECTION = true

  # Show the upper pagination panel by default or not
  Wice::Defaults::SHOW_UPPER_PAGINATION_PANEL = false

  # Disabling CSV export by default
  Wice::Defaults::ENABLE_EXPORT_TO_CSV = false

  # Default CSV field separator
  Wice::Defaults::CSV_FIELD_SEPARATOR = ','

  # Default CSV encoding (p.e. 'CP1252:UTF-8' to make Microsoft Excel(tm) happy)
  Wice::Defaults::CSV_ENCODING = nil

  # The strategy when to show the filter.
  # * <tt>:when_filtered</tt> - when the table is the result of filtering
  # * <tt>:always</tt>        - show the filter always
  # * <tt>:no</tt>            - never show the filter
  Wice::Defaults::SHOW_FILTER = :always

  # A boolean value specifying if a change in a filter triggers reloading of the grid.
  Wice::Defaults::AUTO_RELOAD = false

  # SQL operator used for matching strings in string filters.
  Wice::Defaults::STRING_MATCHING_OPERATOR = 'LIKE'
  # STRING_MATCHING_OPERATOR = 'ILIKE' # Use this for Postgresql case-insensitive matching.

  # Defining one string matching operator globally for the whole application turns is not enough
  # when you connect to two databases one of which is MySQL and the other is Postgresql.
  # If the key for an adapter is missing it will fall back to Wice::Defaults::STRING_MATCHING_OPERATOR.
  #
  # 'CI_LIKE' is a special value. Setting a value in STRING_MATCHING_OPERATORS to CI_LIKE will result in the following SQL:
  #
  #    UPPER(table.field) LIKE  UPPER(?)"
  Wice::Defaults::STRING_MATCHING_OPERATORS = {
    'ActiveRecord::ConnectionAdapters::MysqlAdapter'      => 'LIKE',
    'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter' => 'ILIKE'
  }

  # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  #                              Advanced Filters                             #

  # Switch of the negation checkbox in all text filters
  Wice::Defaults::NEGATION_IN_STRING_FILTERS = false

  # Each WiceGrid filter column is defined in two classes, one used for rendering the filter, the other
  # for generating query conditions. All these columns are in lib/wice/columns/*.rb .
  # File lib/wice/columns/column_processor_index.rb lists all predefined processors.
  # In most cases a processor is chosen automatically based on the DB column type,
  # for example, integer columns
  # can have two of processors, the default one with one input field, and a processor called "range",
  # with 2 input fields. In this case it is possible to specify a processor in the column definition:
  #
  #     g.column filter_type: :range
  #
  # It is also possible to define you own processors:
  #
  #     Wice::Defaults::ADDITIONAL_COLUMN_PROCESSORS = {
  #       some_key_identifying_new_column_type: ['AViewColumnProcessorClass', 'ConditionsGeneratorClass'],
  #       another_key_identifying_new_column_type:  ['AnotherViewColumnProcessorClass', 'AnotherConditionsGeneratorClass']
  #     }
  #
  # Column processor keys/names should not coincide with the existing keys/names (see lib/wice/columns/column_processor_index.rb)
  # the value is a 2-element array with 2 strings, the first should be a name of view processor class inherited from
  # Wice::Columns::ViewColumn, the second should be a name of conditions generator class inherited from
  # Wice::Columns::ConditionsGeneratorColumn .

  # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  #                              Showing All Records                          #

  # Enable or disable showing all records (non-paginated table)
  Wice::Defaults::ALLOW_SHOWING_ALL_RECORDS = true

  # If number of all queries is more than this value, the user will be given a warning message
  Wice::Defaults::START_SHOWING_WARNING_FROM = 100

  # Hide the "show all" link if the number of all records is more than...
  # Force-resets back to pagination starting from this value.
  # Set to nil to always show it
  Wice::Defaults::SHOW_ALL_ALLOWED_UP_TO = nil

  #
  # set to nil to skip the check
  Wice::Defaults::SWITCH_BACK_TO_PAGINATION_FROM = nil

  # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  #                               Saving Queries                              #

  # ActiveRecord model to store queries. Read the documentation for details
  # QUERY_STORE_MODEL = 'WiceGridSerializedQuery'
  Wice::Defaults::QUERY_STORE_MODEL = 'WiceGridSerializedQuery'

  # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  #            Here go settings related to the date/datetime filters          #

  # Default column filters
  # Possible values:
  # * <tt>:jquery_datepicker</tt> - Jquery datepicker (works for datetime, too)
  # * <tt>:bootstrap_datepicker</tt> - Bootstrap datepicker (works for datetime, too)
  # * <tt>:rails_date_helper</tt> - standard Rails date helper
  # * <tt>:rails_datetime_helper</tt> - standard Rails datetime helper

  Wice::Defaults::DEFAULT_FILTER_FOR_DATE     = :jquery_datepicker
  Wice::Defaults::DEFAULT_FILTER_FOR_DATETIME = :jquery_datepicker

  # Format of the datetime displayed.
  # If you change the format, make sure to check if +DATETIME_PARSER+ can still parse this string.
  Wice::Defaults::DATETIME_FORMAT = '%Y-%m-%d %H:%M'

  # Format of the date displayed.
  # If you change the format, make sure to check if +DATE_PARSER+ can still parse this string.
  Wice::Defaults::DATE_FORMAT = '%Y-%m-%d'

  # Format of the date displayed in jQuery's Datepicker
  # If you change the format, make sure to check if +DATE_PARSER+ can still parse this string.
  Wice::Defaults::DATE_FORMAT_JQUERY =  'yy-mm-dd'

  # Format of the date displayed in Bootstrap's Datepicker
  # If you change the format, make sure to check if +DATE_PARSER+ can still parse this string.
  Wice::Defaults::DATE_FORMAT_BOOTSTRAP =  'yyyy-mm-dd'

  # With Calendar helpers enabled the parameter sent is the string displayed. This lambda will be given a date string in the
  # format defined by +DATETIME_FORMAT+ and must generate a DateTime object.
  # In many cases <tt>Time.zone.parse</tt> is enough, for instance,  <tt>%Y-%m-%d</tt>. If you change the format, make sure to check this code
  # and modify it if needed.
  Wice::Defaults::DATETIME_PARSER = lambda do|datetime_string|
    if datetime_string.blank?
      nil
    elsif Time.zone
      Time.zone.parse(datetime_string)
    else
      Time.parse(datetime_string)
    end
  end

  # The range of years to display in jQuery Datepicker.
  # It can always be changed dynamically with the following javascript:
  #  $( ".hasDatepicker" ).datepicker( "option", "yearRange", "2000:2042" );
  Wice::Defaults::DATEPICKER_YEAR_RANGE = (from = Date.current.year - 10).to_s + ':' + (from + 15).to_s

  # With Calendar helpers enabled the parameter sent is the string displayed. This lambda will be given a date string in the
  # format defined by +DATETIME+ and must generate a Date object.
  # In many cases <tt>Date.parse</tt> is enough, for instance,  <tt>%Y-%m-%d</tt>. If you change the format, make sure to check this code
  # and modify it if needed.
  Wice::Defaults::DATE_PARSER = lambda do|date_string|
    if date_string.blank?
      nil
    else
      begin
        Date.parse(date_string)
      rescue ArgumentError
        nil
      end
    end
  end

  # The name of the page method (should correspond to Kaminari.config.page_method_name)
  Wice::Defaults::PAGE_METHOD_NAME = :page

  # The name of the theme to use for the pagination with Kaminari
  Wice::Defaults::PAGINATION_THEME = :wice_grid

  # By default ActiveRecord calls are always executed inside Model.unscoped{}.
  # Setting <tt>USE_DEFAULT_SCOPE</tt> to true will use the default scope for all queries.
  Wice::Defaults::USE_DEFAULT_SCOPE = false

end


================================================
FILE: lib/wice/active_record_column_wrapper.rb
================================================
module Wice
  # to be mixed in into ActiveRecord::ConnectionAdapters::Column
  module WiceGridExtentionToActiveRecordColumn #:nodoc:
    # reference to the ActiveRecord model class
    attr_accessor :model
  end

  class ActiveRecordColumnWrapper #:nodoc:
    def initialize(column, all_filter_params, main_table, table_alias, custom_filter_active, filter_type) #:nodoc:
      @column = column

      # nil | Symbol
      @filter_type          = filter_type

      # Hash { String => String | Array[String]}
      @all_filter_params    = all_filter_params

      # nil | Boolean
      @main_table           = main_table

      # nil | String
      @table_alias          = table_alias

      # nil | Array[String] | Array[Array[...]] | Array[Symbol]
      @custom_filter_active = custom_filter_active
    end

    def wg_initialize_request_parameters  #:nodoc:
      @request_params = nil
      return if @all_filter_params.nil?

      # if the parameter does not specify the table name we only allow columns in the default table to use these parameters
      if @main_table && @request_params = @all_filter_params[@column.name]
        current_parameter_name = @column.name
      elsif @request_params = @all_filter_params[alias_or_table_name(@table_alias) + '.' + @column.name]
        current_parameter_name = alias_or_table_name(@table_alias) + '.' + @column.name
      end

      # Preprocess incoming parameters for datetime, if what's coming in is
      # a datetime (with custom_filter it can be anything else, and not
      # the datetime hash {fr: ..., to: ...})
      if @request_params

        if (@column.type == :datetime || @column.type == :timestamp) && @request_params.is_a?(Hash)
          [:fr, :to].each do |sym|
            if @request_params[sym]
              if @request_params[sym].is_a?(String)
                @request_params[sym] = Wice::ConfigurationProvider.value_for(:DATETIME_PARSER).call(@request_params[sym])
              elsif @request_params[sym].is_a?(Hash)
                @request_params[sym] = Wice::GridTools.params_2_datetime(@request_params[sym])
              end
            end
          end

        end

        # Preprocess incoming parameters for date, if what's coming in is
        # a date (with custom_filter it can be anything else, and not
        # the date hash {fr: ..., to: ...})
        if @column.type == :date && @request_params.is_a?(Hash)

          [:fr, :to].each do |sym|
            if @request_params[sym]
              if @request_params[sym].is_a?(String)
                @request_params[sym] = Wice::ConfigurationProvider.value_for(:DATE_PARSER).call(@request_params[sym])
              elsif @request_params[sym].is_a?(Hash)
                @request_params[sym] = ::Wice::GridTools.params_2_date(@request_params[sym])
              end
            end
          end

        end
      end

      [wg_generate_conditions, current_parameter_name]
    end

    def wg_generate_conditions  #:nodoc:
      return nil if @request_params.nil?

      if @custom_filter_active
        custom_processor_klass = ::Wice::Columns.get_conditions_generator_column_processor(:custom)
        custom_processor = custom_processor_klass.new(self)
        return custom_processor.generate_conditions(@table_alias, @request_params)
      end

      column_type = @filter_type || @column.type.to_s.intern

      filter_type = case column_type
      when :date
        ConfigurationProvider.value_for(:DEFAULT_FILTER_FOR_DATE)
      when :datetime
        ConfigurationProvider.value_for(:DEFAULT_FILTER_FOR_DATETIME)
      when :timestamp
        ConfigurationProvider.value_for(:DEFAULT_FILTER_FOR_DATETIME)
      else
        column_type
      end

      processor_class = ::Wice::Columns.get_conditions_generator_column_processor(filter_type)

      if processor_class
        return processor_class.new(self, column_type).generate_conditions(@table_alias, @request_params)
      else
        Wice.log("No processor for database type #{column_type}!!!")
        nil
      end
    end

    def name #:nodoc:
      @column.name
    end

    def model #:nodoc:
      @column.model
    end

    def array?
      if @column.sql_type_metadata.respond_to? :array
        @column.sql_type_metadata.array
      else
        @column.sql_type_metadata.sql_type.index('[]')
      end
    rescue
      false
    end

    def alias_or_table_name(table_alias) #:nodoc:
      table_alias || @column.model.table_name
    end
  end
end


================================================
FILE: lib/wice/columns/column_action.rb
================================================
module Wice
  module Columns #:nodoc:
    class ViewColumnAction < ViewColumn #:nodoc:
      def initialize(grid_obj, html, param_name, select_all_buttons, object_property, html_check_box, view, block = nil)  #:nodoc:
        @view                 = view
        @html_check_box       = html_check_box
        @select_all_buttons   = select_all_buttons
        self.grid             = grid_obj
        self.html             = html
        Wice::WgHash.add_or_append_class_value!(self.html, 'sel')
        grid_name             = self.grid.name
        @param_name           = param_name
        @cell_rendering_block = lambda do |object, params|
          if block && !block.call(object)
            ''
          else
            selected = params[grid_name] && params[grid_name][param_name] && params[grid_name][param_name].index(object.send(object_property).to_s)
            check_box_tag("#{grid_name}[#{param_name}][]", object.send(object_property), selected, id: nil)
          end
        end
      end

      def in_html  #:nodoc:
        true
      end

      def capable_of_hosting_filter_related_icons?  #:nodoc:
        false
      end

      def name  #:nodoc:
        return '' unless @select_all_buttons

        if @html_check_box
          check_box_tag :select_all, 1, false, class: 'wg-select-all'
        else
          content_tag(:div,
                      content_tag(:i, '', class: 'fa-regular fa-square-check'),
                      class: 'clickable select-all',
                      title: NlMessage['select_all']) + ' ' +
            content_tag(:div,
                        content_tag(:i, '', class: 'fa-regular fa-square'),
                        class: 'clickable deselect-all',
                        title: NlMessage['deselect_all'])
        end
      end
    end

    ConditionsGeneratorColumnAction = ConditionsGeneratorColumn #:nodoc:
  end
end


================================================
FILE: lib/wice/columns/column_boolean.rb
================================================
module Wice
  module Columns #:nodoc:
    class ViewColumnBoolean < ViewColumnCustomDropdown #:nodoc:
      include ActionView::Helpers::FormOptionsHelper

      # Text for the true value
      attr_accessor :boolean_filter_true_label

      # Text for the false value
      attr_accessor :boolean_filter_false_label

      def render_filter_internal(params) #:nodoc:
        @custom_filter = {
          @filter_all_label => nil,
          @boolean_filter_true_label  => 't',
          @boolean_filter_false_label => 'f'
        }

        @turn_off_select_toggling = true
        super(params)
      end
    end

    class ConditionsGeneratorColumnBoolean < ConditionsGeneratorColumn  #:nodoc:
      def  generate_conditions(table_alias, opts)   #:nodoc:
        unless opts.is_a?(Array) && opts.size == 1
          Wice.log "invalid parameters for the grid boolean filter - must be an one item array: #{opts.inspect}"
          return false
        end
        opts = opts[0]
        if opts == 'f'
          [" (#{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name} = ? or #{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name} is null) ", false]
        elsif opts == 't'
          [" #{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name} = ?", true]
                end
      end
    end
  end
end


================================================
FILE: lib/wice/columns/column_bootstrap_datepicker.rb
================================================
module Wice
  module Columns #:nodoc:
    class ViewColumnBootstrapDatepicker < ViewColumn #:nodoc:

      include Wice::BsCalendarHelpers
      include Wice::Columns::CommonDateDatetimeMixin
      include Wice::Columns::CommonJsDateDatetimeMixin

      def do_render(params) #:nodoc:
        calendar_data_from = prepare_data_for_bscalendar(
          initial_date: params[:fr],
          name:       @name1,
          fire_event: auto_reload,
          grid_name:  self.grid.name
        )

        calendar_data_to = prepare_data_for_bscalendar(
          initial_date: params[:to],
          name:       @name2,
          fire_event: auto_reload,
          grid_name:  self.grid.name
        )

        calendar_data_from.the_other_datepicker_id_to   = calendar_data_to.dom_id
        calendar_data_to.the_other_datepicker_id_from   = calendar_data_from.dom_id

        html1 = date_calendar_bs calendar_data_from

        html2 = date_calendar_bs calendar_data_to

        %(<div class="date-filter wg-bootstrap-datepicker">#{html1}#{html2}</div>)
      end


      def has_auto_reloading_calendar? #:nodoc:
        auto_reload
      end

    end

    class ConditionsGeneratorColumnBootstrapDatepicker < ConditionsGeneratorColumn  #:nodoc:

      include Wice::Columns::CommonJsDateDatetimeConditionsGeneratorMixin

    end
  end
end


================================================
FILE: lib/wice/columns/column_custom_dropdown.rb
================================================
module Wice
  module Columns #:nodoc:
    class ViewColumnCustomDropdown < ViewColumn #:nodoc:
      include ActionView::Helpers::FormOptionsHelper

      # text in the filter dropdown for an empty <option><option>
      attr_accessor :filter_all_label

      # contains an array of option label + option value pairs for the select, or a Proc object which returns this array
      attr_accessor :custom_filter

      def render_filter_internal(params) #:nodoc:
        @query, @query_without_equals_sign, @parameter_name, @dom_id = form_parameter_name_id_and_query('')
        @query_without_equals_sign += '%5B%5D='

        @custom_filter = @custom_filter.call if @custom_filter.is_a? Proc

        if @custom_filter.is_a? Array
          @custom_filter = [[@filter_all_label, nil]] + @custom_filter.map do|label, value|
            [label.to_s, value.to_s]
          end
        end

        select_options = { name: @parameter_name + '[]', id: @dom_id, class: 'custom-dropdown form-control' }

        if @turn_off_select_toggling
          select_toggle = ''
        else
          if self.allow_multiple_selection
            select_options[:multiple] = params.is_a?(Array) && params.size > 1

            expand_icon_style, collapse_icon_style = nil, 'display: none'
            expand_icon_style, collapse_icon_style = collapse_icon_style, expand_icon_style if select_options[:multiple]

            select_toggle = content_tag(
              :span,
              content_tag(:i, '', class: 'fa fa-plus'),
              title: NlMessage['expand'],
              class: 'expand-multi-select-icon clickable',
              style: expand_icon_style
            ) +
            content_tag(
              :span,
              content_tag(:i, '', class: 'fa fa-minus'),
              title: NlMessage['collapse'],
              class: 'collapse-multi-select-icon clickable',
              style: collapse_icon_style
            )
          else
            select_options[:multiple] = false
            select_toggle = ''
          end
        end

        if auto_reload
          select_options[:class] += ' auto-reload'
        end

        params_for_select = (params.is_a?(Hash) && params.empty?) ? [nil] : params

        '<div class="custom-dropdown-container">'.html_safe +
          content_tag(:select,
                      options_for_select(@custom_filter, params_for_select),
                      select_options) + select_toggle.html_safe + '</div>'.html_safe
      end

      def yield_declaration_of_column_filter #:nodoc:
        {
          templates: [@query_without_equals_sign],
          ids:       [@dom_id]
        }
      end

      def has_auto_reloading_select? #:nodoc:
        auto_reload
      end
    end

    class ConditionsGeneratorColumnCustomDropdown < ConditionsGeneratorColumn #:nodoc:
      def generate_conditions(table_alias, opts)   #:nodoc:
        if opts.empty? || (opts.is_a?(Array) && opts.size == 1 && opts[0].blank?)
          return false
        end
        opts = (opts.is_a?(Array) && opts.size == 1) ? opts[0] : opts

        column_name =
            "#{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name}"
        if opts.is_a?(Array)
          opts_with_special_values, normal_opts = opts.partition { |v| ::Wice::GridTools.special_value(v) }

          conditions_ar = if normal_opts.size > 0
            if @column_wrapper.array?
              [(["? = ANY(#{column_name})"] * normal_opts.size).join(' OR ')] + normal_opts
            else
              [" #{column_name} IN ( " + (['?'] * normal_opts.size).join(', ') + ' )'] + normal_opts
            end
          else
            []
          end

          if opts_with_special_values.size > 0
            special_conditions = opts_with_special_values.collect { |v| " #{column_name} is " + v }.join(' or ')
            if conditions_ar.size > 0
              conditions_ar[0] = " (#{conditions_ar[0]} or #{special_conditions} ) "
            else
              conditions_ar = " ( #{special_conditions} ) "
            end
          end
          conditions_ar
        else
          if ::Wice::GridTools.special_value(opts)
            " #{column_name} is " + opts
          else
            if @column_wrapper.array?
              [" ? = ANY(#{column_name})", opts]
            else
              [" #{column_name} = ?", opts]
            end
          end
        end
      end
    end
  end
end


================================================
FILE: lib/wice/columns/column_float.rb
================================================
module Wice #:nodoc:
  module Columns #:nodoc:
    class ViewColumnFloat < ViewColumnInteger #:nodoc:
    end

    ConditionsGeneratorColumnFloat = ConditionsGeneratorColumnInteger #:nodoc:
  end
end


================================================
FILE: lib/wice/columns/column_html5_datepicker.rb
================================================
module Wice
  module Columns #:nodoc:
    class ViewColumnHtml5Datepicker < ViewColumn #:nodoc:

      include Wice::Columns::CommonDateDatetimeMixin
      include Wice::Columns::CommonJsDateDatetimeMixin

      def do_render(params) #:nodoc:
        css_class = 'form-control input-sm native-datepicker ' + (auto_reload ? 'auto-reload' : '')
        date_format = Wice::ConfigurationProvider.value_for(:DATE_FORMAT)
        '<div class="date-filter wg-html5-datepicker">' +
          date_field_tag(@name1, params[:fr].try(:strftime, date_format), class: css_class, id: @dom_id) + '<br/>' +
          date_field_tag(@name2, params[:to].try(:strftime, date_format), class: css_class, id: @dom_id2) +
          '</div>'
      end

      def has_auto_reloading_calendar? #:nodoc:
        # To be implemented
        false
      end

    end

    class ConditionsGeneratorColumnHtml5Datepicker < ConditionsGeneratorColumn  #:nodoc:

      include Wice::Columns::CommonJsDateDatetimeConditionsGeneratorMixin

    end
  end
end


================================================
FILE: lib/wice/columns/column_integer.rb
================================================
module Wice
  module Columns #:nodoc:
    class ViewColumnInteger < ViewColumn #:nodoc:
      def render_filter_internal(params) #:nodoc:
        @contains_a_text_input = true

        @query, _, parameter_name, @dom_id = form_parameter_name_id_and_query(eq: '')

        opts = { size: 3, id: @dom_id, class: 'range-start' }

        opts[:class] += ' form-control input-sm'

        if auto_reload
          opts[:class] += ' auto-reload'
        end

        text_field_tag(parameter_name,  params[:eq], opts)
      end

      def yield_declaration_of_column_filter #:nodoc:
        {
          templates: [@query],
          ids:       [@dom_id]
        }
      end

      def has_auto_reloading_input? #:nodoc:
        auto_reload
      end
    end

    class ConditionsGeneratorColumnInteger < ConditionsGeneratorColumn  #:nodoc:
      # Note: also used in ColumnRange, hence class method
      def self.get_value(val) #:nodoc:
        # Try to determine localized separator using I18n and replace it with default one
        separator = I18n.t!('number.format.separator') rescue nil
        val = val.sub(separator, '.') if val.respond_to?(:sub) && separator

        Integer(val) rescue nil
      end

      def get_op_and_value(val) #:nodoc:
        num = nil
        op  = nil

        # remove spaces
        val = val.gsub(' ', '')

        start_of_num = val =~ /[0-9.-]/ # first digit, dot or negative sign
        if start_of_num
          op = val[0...start_of_num]
          op = '=' if op == ''
          num = ConditionsGeneratorColumnInteger.get_value(val[start_of_num..-1])

          op = nil unless ['<', '>', '<=', '>=', '='].include?(op)
        end
        [op, num]
      end

      def generate_conditions(table_alias, opts)   #:nodoc:
        unless opts.is_a? Hash
          Wice.log 'invalid parameters for the grid integer filter - must be a hash'
          return false
        end
        conditions = [[]]
        if opts[:eq]
          op, num = get_op_and_value(opts[:eq])
          if op && num
            conditions[0] << " #{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name} " + op + ' ? '
            conditions << num
          else
            opts.delete(:eq)
          end
        end

        if conditions.size == 1
          return false
        end

        conditions[0] = conditions[0].join(' and ')

        conditions
      end
    end
  end
end


================================================
FILE: lib/wice/columns/column_jquery_datepicker.rb
================================================
module Wice
  module Columns #:nodoc:
    class ViewColumnJqueryDatepicker < ViewColumn #:nodoc:

      include Wice::JsCalendarHelpers
      include Wice::Columns::CommonDateDatetimeMixin
      include Wice::Columns::CommonJsDateDatetimeMixin

      def do_render(params) #:nodoc:
        calendar_data_from = prepare_data_for_calendar(
          initial_date: params[:fr],
          title:      NlMessage['date_selector_tooltip_from'],
          name:       @name1,
          fire_event: auto_reload,
          grid_name:  self.grid.name
        )

        calendar_data_to = prepare_data_for_calendar(
          initial_date: params[:to],
          title:      NlMessage['date_selector_tooltip_to'],
          name:       @name2,
          fire_event: auto_reload,
          grid_name:  self.grid.name
        )

        calendar_data_from.the_other_datepicker_id_to   = calendar_data_to.dom_id
        calendar_data_to.the_other_datepicker_id_from   = calendar_data_from.dom_id

        html1 = date_calendar_jquery calendar_data_from

        html2 = date_calendar_jquery calendar_data_to

        %(<div class="date-filter wg-jquery-datepicker">#{html1}<br/>#{html2}</div>)
      end

      def has_auto_reloading_calendar? #:nodoc:
        auto_reload
      end

    end

    class ConditionsGeneratorColumnJqueryDatepicker < ConditionsGeneratorColumn  #:nodoc:

      include Wice::Columns::CommonJsDateDatetimeConditionsGeneratorMixin

    end
  end
end


================================================
FILE: lib/wice/columns/column_processor_index.rb
================================================
module Wice #:nodoc:
  module Columns #:nodoc:
    require 'active_support'

    COLUMN_PROCESSOR_INDEX = ActiveSupport::OrderedHash[ #:nodoc:
      :action,                 'column_action',               # Special processor for action column, columns with checkboxes
      :text,                   'column_string',
      :string,                 'column_string',
      :rails_datetime_helper,  'column_rails_datetime_helper',       # standard Rails datepicker helper
      :rails_date_helper,      'column_rails_date_helper',           # standard Rails date helper
      :jquery_datepicker,      'column_jquery_datepicker',
      :bootstrap_datepicker,   'column_bootstrap_datepicker',
      :html5_datepicker,       'column_html5_datepicker',     # not ready
      :integer,                'column_integer',
      :range,                  'column_range',
      :float,                  'column_float',
      :decimal,                'column_float',
      :custom,                 'column_custom_dropdown',      # Special processor for custom filter columns
      :boolean,                'column_boolean'
    ]
  end
end


================================================
FILE: lib/wice/columns/column_rails_date_helper.rb
================================================
module Wice
  module Columns #:nodoc:
    class ViewColumnRailsDateHelper < ViewColumn #:nodoc:

      include ActionView::Helpers::DateHelper
      include Wice::Columns::CommonDateDatetimeMixin
      include Wice::Columns::CommonStandardDateDatetimeMixin

      def chunk_names #:nodoc:
        %w(year month day)
      end

      def do_render(params) #:nodoc:
        '<div class="date-filter">' +
          select_date(params[:fr], include_blank: true, prefix: @name1, id: @dom_id) + '<br/>' +
          select_date(params[:to], include_blank: true, prefix: @name2, id: @dom_id2) +
          '</div>'
      end

      # name_and_id_from_options in Rails Date helper does not substitute '.' with '_'
      # like all other simpler form helpers do. Thus, overriding it here.
      def name_and_id_from_options(options, type)  #:nodoc:
        options[:name] = (options[:prefix] || DEFAULT_PREFIX) + (options[:discard_type] ? '' : "[#{type}]")
        options[:id] = options[:name].gsub(/([\[\(])|(\]\[)/, '_').gsub(/[\]\)]/, '').gsub(/\./, '_').gsub(/_+/, '_')
      end


      def has_auto_reloading_calendar? #:nodoc:
        false
      end

    end

    class ConditionsGeneratorColumnRailsDateHelper < ConditionsGeneratorColumn  #:nodoc:

      include Wice::Columns::CommonRailsDateDatetimeConditionsGeneratorMixin

    end
  end
end


================================================
FILE: lib/wice/columns/column_rails_datetime_helper.rb
================================================
module Wice
  module Columns #:nodoc:
    class ViewColumnRailsDatetimeHelper < ViewColumn #:nodoc:

      include ActionView::Helpers::DateHelper
      include Wice::Columns::CommonDateDatetimeMixin
      include Wice::Columns::CommonStandardDateDatetimeMixin

      def chunk_names #:nodoc:
        %w(year month day hour minute)
      end

      def do_render(params) #:nodoc:
        datetime_options = filter_control_options ? filter_control_options.slice(:start_year, :end_year, :max_year_allowed) : {}
        '<div class="date-filter">' +
          select_datetime(params[:fr], datetime_options.merge(include_blank: true, prefix: @name1)) + '<br/>' +
          select_datetime(params[:to], datetime_options.merge(include_blank: true, prefix: @name2)) +
          '</div>'
      end

      # name_and_id_from_options in Rails Date helper does not substitute '.' with '_'
      # like all other simpler form helpers do. Thus, overriding it here.
      def name_and_id_from_options(options, type)  #:nodoc:
        options[:name] = (options[:prefix] || DEFAULT_PREFIX) + (options[:discard_type] ? '' : "[#{type}]")
        options[:id] = options[:name].gsub(/([\[\(])|(\]\[)/, '_').gsub(/[\]\)]/, '').gsub(/\./, '_').gsub(/_+/, '_')
      end

      def has_auto_reloading_calendar? #:nodoc:
        false
      end

    end

    class ConditionsGeneratorColumnRailsDatetimeHelper < ConditionsGeneratorColumn  #:nodoc:

      include Wice::Columns::CommonRailsDateDatetimeConditionsGeneratorMixin

    end
  end
end


================================================
FILE: lib/wice/columns/column_range.rb
================================================
module Wice
  module Columns #:nodoc:
    class ViewColumnRange < ViewColumn #:nodoc:
      def render_filter_internal(params) #:nodoc:
        @contains_a_text_input = true

        @query,  _, parameter_name,  @dom_id  = form_parameter_name_id_and_query(fr: '')
        @query2, _, parameter_name2, @dom_id2 = form_parameter_name_id_and_query(to: '')

        opts1 = { size: 2, id: @dom_id,  class: 'form-control input-sm range-start' }
        opts2 = { size: 2, id: @dom_id2, class: 'form-control input-sm range-end' }

        if auto_reload
          opts1[:class] += ' auto-reload'
          opts2[:class] += ' auto-reload'
        end

        content_tag(
          :div,
          text_field_tag(parameter_name,  params[:fr], opts1) + text_field_tag(parameter_name2, params[:to], opts2),
          class: 'form-inline')
      end

      def yield_declaration_of_column_filter #:nodoc:
        {
          templates: [@query, @query2],
          ids:       [@dom_id, @dom_id2]
        }
      end

      def has_auto_reloading_input? #:nodoc:
        auto_reload
      end
    end

    class ConditionsGeneratorColumnRange < ConditionsGeneratorColumn  #:nodoc:
      def generate_conditions(table_alias, opts)   #:nodoc:
        unless opts.is_a? Hash
          Wice.log 'invalid parameters for the grid integer filter - must be a hash'
          return false
        end
        conditions = [[]]
        if opts[:fr]
          fr_num = ConditionsGeneratorColumnInteger.get_value(opts[:fr])
          if fr_num
            conditions[0] << " #{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name} >= ? "
            conditions << fr_num
          else
            opts.delete(:fr)
          end
        end

        if opts[:to]
          to_num = ConditionsGeneratorColumnInteger.get_value(opts[:to])
          if to_num
            conditions[0] << " #{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name} <= ? "
            conditions << to_num
          else
            opts.delete(:to)
          end
        end

        if conditions.size == 1
          return false
        end

        conditions[0] = conditions[0].join(' and ')

        conditions
      end
    end
  end
end


================================================
FILE: lib/wice/columns/column_string.rb
================================================
module Wice
  module Columns #:nodoc:
    class ViewColumnString < ViewColumn #:nodoc:

      # whether the filter contains a negation checkbox
      attr_accessor :negation

      # whether the filter contains a negation checkbox and autoreloading is necessary
      attr_accessor :auto_reloading_input_with_negation_checkbox

      def render_filter_internal(params) #:nodoc:
        @contains_a_text_input = true
        css_class = 'form-control input-sm ' + (auto_reload ? 'auto-reload' : '')

        if negation
          self.auto_reloading_input_with_negation_checkbox = true if auto_reload

          @query, _, parameter_name, @dom_id = form_parameter_name_id_and_query(v: '')
          @query2, _, parameter_name2, @dom_id2 = form_parameter_name_id_and_query(n: '')

          '<div class="text-filter-container">' +
            text_field_tag(parameter_name, params[:v], size: 8, id: @dom_id, class: css_class) +
            if defined?(Wice::Defaults::NEGATION_CHECKBOX_LABEL) && !Wice::ConfigurationProvider.value_for(:NEGATION_CHECKBOX_LABEL).blank?
              Wice::ConfigurationProvider.value_for(:NEGATION_CHECKBOX_LABEL)
            else
              ''
            end +
            check_box_tag(parameter_name2, '1', (params[:n] == '1'),
                          id: @dom_id2,
                          title: NlMessage['negation_checkbox_title'],
                          class: "negation-checkbox #{css_class}") +
            '</div>'
        else
          @query, _, parameter_name, @dom_id = form_parameter_name_id_and_query('')
          text_field_tag(parameter_name, (params.blank? ? '' : params), size: 8, id: @dom_id, class: css_class)
        end
      end

      def yield_declaration_of_column_filter #:nodoc:
        if negation
          {
            templates: [@query, @query2],
            ids:       [@dom_id, @dom_id2]
          }
        else
          {
            templates: [@query],
            ids:       [@dom_id]
          }
        end
      end

      def has_auto_reloading_input? #:nodoc:
        auto_reload
      end

      def auto_reloading_input_with_negation_checkbox? #:nodoc:
        self.auto_reloading_input_with_negation_checkbox
      end
    end

    class ConditionsGeneratorColumnString < ConditionsGeneratorColumn  #:nodoc:
      def generate_conditions(table_alias, opts)   #:nodoc:
        if opts.is_a? String
          string_fragment = opts
          negation = ''
        elsif (opts.is_a? Hash) && opts.key?(:v)
          string_fragment = opts[:v]
          negation = opts[:n] == '1' ? 'NOT' : ''
        else
          Wice.log "invalid parameters for the grid string filter - must be a string: #{opts.inspect} or a Hash with keys :v and :n"
          return false
        end
        if string_fragment.empty?
          return false
        end

        string_matching_operator = ::Wice.get_string_matching_operators(@column_wrapper.model)

        comparator = if string_matching_operator == 'CI_LIKE'
          " #{negation}  UPPER(#{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name}) LIKE  UPPER(?)"
        else
          " #{negation}  #{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name} #{string_matching_operator} ?"
        end

        [ comparator, '%' + string_fragment + '%' ]

      end
    end
  end
end


================================================
FILE: lib/wice/columns/common_date_datetime_mixin.rb
================================================
module Wice
  module Columns #:nodoc:
    module CommonDateDatetimeMixin #:nodoc:

      def render_filter_internal(params) #:nodoc:
        prepare
        do_render(params)
      end

      def yield_declaration_of_column_filter #:nodoc:
        {
          templates: @queris_ids.collect { |tuple|  tuple[0] },
          ids:       @queris_ids.collect { |tuple|  tuple[1] }
        }
      end

    end
  end
end


================================================
FILE: lib/wice/columns/common_js_date_datetime_conditions_generator_mixin.rb
================================================
module Wice
  module Columns #:nodoc:
    module CommonJsDateDatetimeConditionsGeneratorMixin #:nodoc:

      def generate_conditions(table_alias, opts)   #:nodoc:

        datetime = @column_type == :datetime || @column_type == :timestamp

        conditions = [[]]
        if opts[:fr]
          conditions[0] << " #{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name} >= ? "
          date = opts[:fr].to_date
          if datetime
            date = date.to_datetime
          end
          conditions << date
        end

        if opts[:to]
          op = '<='
          date = opts[:to].to_date
          if datetime
            date = (date + 1).to_datetime
            op = '<'
          end
          conditions[0] << " #{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name} #{op} ? "
          conditions << date
        end

        return false if conditions.size == 1

        conditions[0] = conditions[0].join(' and ')
        conditions
      end

    end
  end
end


================================================
FILE: lib/wice/columns/common_js_date_datetime_mixin.rb
================================================
module Wice
  module Columns #:nodoc:
    module CommonJsDateDatetimeMixin #:nodoc:

      def prepare #:nodoc:
        query, _, @name1, @dom_id = form_parameter_name_id_and_query(fr: '')
        query2, _, @name2, @dom_id2 = form_parameter_name_id_and_query(to: '')

        @queris_ids = [[query, @dom_id], [query2, @dom_id2]]
      end

    end
  end
end


================================================
FILE: lib/wice/columns/common_rails_date_datetime_conditions_generator_mixin.rb
================================================
module Wice
  module Columns #:nodoc:
    module CommonRailsDateDatetimeConditionsGeneratorMixin #:nodoc:

      def generate_conditions(table_alias, opts)   #:nodoc:
        conditions = [[]]
        if opts[:fr]
          conditions[0] << " #{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name} >= ? "
          conditions << opts[:fr].to_date
        end

        if opts[:to]
          conditions[0] << " #{@column_wrapper.alias_or_table_name(table_alias)}.#{@column_wrapper.name} <= ? "
          conditions << (opts[:to].to_date + 1)
        end

        return false if conditions.size == 1

        conditions[0] = conditions[0].join(' and ')
        conditions
      end

    end
  end
end


================================================
FILE: lib/wice/columns/common_standard_helper_date_datetime_mixin.rb
================================================
module Wice
  module Columns #:nodoc:
    module CommonStandardDateDatetimeMixin #:nodoc:

      def prepare #:nodoc:
        x = lambda do|sym|
          chunk_names.map do|datetime_chunk_name|
            triple = form_parameter_name_id_and_query(sym => { datetime_chunk_name => '' })
            [triple[0], triple[3]]
          end
        end

        @queris_ids = x.call(:fr) + x.call(:to)

        _, _, @name1, _ = form_parameter_name_id_and_query(fr: '')
        _, _, @name2, _ = form_parameter_name_id_and_query(to: '')
      end

    end
  end
end


================================================
FILE: lib/wice/columns.rb
================================================
module Wice #:nodoc:
  module Columns #:nodoc:
    mattr_reader :handled_type_view, :handled_type_conditions_generator

    class << self #:nodoc:
      def load_column_processors #:nodoc:
        require_columns

        @@handled_type_view                 = build_table_of_processors 'view'
        @@handled_type_conditions_generator = build_table_of_processors 'conditions_generator'

        if Wice::Defaults.const_defined?(:ADDITIONAL_COLUMN_PROCESSORS)

          common_error_prefix = 'Error loading Wice::Defaults::ADDITIONAL_COLUMN_PROCESSORS. '

          Wice::Defaults::ADDITIONAL_COLUMN_PROCESSORS.each do |key, value|
            unless key.is_a?(Symbol)
              raise common_error_prefix + 'A key of Wice::Defaults::ADDITIONAL_COLUMN_PROCESSORS should be a Symbol!'
            end

            if @@handled_type_view.key?(key)
              raise common_error_prefix +
                "Column with key \"#{key}\" already exists in WiceGrid, overwriting existing columns is forbidden, please choose another key!"
            end

            if !value.is_a?(Array) || value.size != 2
              ail common_error_prefix +
                'A value of Wice::Defaults::ADDITIONAL_COLUMN_PROCESSORS should be a a 2-element array!'
            end

            view_processor, conditions_generator = value.map(&:to_s).map do |klass|
              begin
                eval(klass)
              rescue NameError
                raise common_error_prefix + "Class #{klass} is not defined!"
              end
            end

            unless view_processor.ancestors.include?(::Wice::Columns::ViewColumn)
              raise common_error_prefix +
                "#{view_processor} should be inherited from Wice::Columns::ViewColumn!"
            end

            unless conditions_generator.ancestors.include?(::Wice::Columns::ConditionsGeneratorColumn)
              raise common_error_prefix +
                "#{conditions_generator} should be inherited from Wice::Columns::ConditionsGeneratorColumn!"
            end

            @@handled_type_view[key] = view_processor
            @@handled_type_conditions_generator[key] = conditions_generator
          end
        end
      end

      def get_view_column_processor(column_type) #:nodoc:
        @@handled_type_view[column_type] || ViewColumn
      end

      def get_conditions_generator_column_processor(column_type) #:nodoc:
        column_type = column_type.intern if column_type.is_a? String
        @@handled_type_conditions_generator[column_type] || raise("Could not find conditions generator processor for column_type #{column_type}")
      end

      private

      def build_table_of_processors(prefix)
        {}.tap do |processor_table|
          loaded_processors = {}

          Wice::Columns::COLUMN_PROCESSOR_INDEX.each do |column_type, column_source_file|
            unless loaded_processors[column_source_file]
              processor_class_name = "#{prefix}_#{column_source_file}".classify

              unless Wice::Columns.const_defined?(processor_class_name.intern)
                raise "#{column_source_file}.rb is expected to define #{processor_class_name}!"
              end
              processor_class = eval("Wice::Columns::#{processor_class_name}")

              loaded_processors[column_source_file] = processor_class
            end

            processor_table[column_type] = loaded_processors[column_source_file]
          end
        end
      end

      def require_columns
        Wice::Columns::COLUMN_PROCESSOR_INDEX.values.uniq do |column_source_file|
          require "wice/columns/#{column_source_file}.rb"
        end
      end
    end

    class ViewColumn  #:nodoc:
      include ActionView::Helpers::FormTagHelper
      include ActionView::Helpers::TagHelper
      include ActionView::Helpers::JavaScriptHelper
      include ActionView::Helpers::AssetTagHelper

      # fields defined from the options parameter
      FIELDS = [:attribute, :name, :html, :filter, :model, :allow_multiple_selection,
                :in_html, :in_csv, :table_alias, :custom_order, :detach_with_id, :ordering, :auto_reload,
                :filter_control_options, :sort_by]

      attr_accessor(*FIELDS)

      # a Proc object which would return contents of one cell
      attr_accessor :cell_rendering_block

      # reference to the WiceGrid instance
      attr_accessor :grid

      # name of the table
      attr_accessor :table_name

      # name of the main table (first argument to initialize_grid)
      attr_accessor :main_table

      # attr_accessor :model

      # specification for a custom filter: an array of option label + option value pairs for the select, or a Proc object which returns this array.
      # Or nil if it is not a custom filter
      attr_accessor :custom_filter

      # A boolean flag: whether a column has a text input or not
      attr_reader :contains_a_text_input

      # options for rendering filter controls. Supported options are specific to the type.
      attr_accessor :filter_control_options

      def initialize(block, options, grid_obj, tname, mtable, cfilter, view)  #:nodoc:
        self.cell_rendering_block = block
        self.grid           = grid_obj
        self.table_name     = tname
        self.main_table     = mtable
        self.custom_filter  = cfilter
        @view = view

        FIELDS.each do |field|
          self.send(field.to_s + '=', options[field])
        end
      end

      def add_css_class(klass_value) #:nodoc:
        self.html ||= {}
        if html[:class].nil?
          html[:class] = klass_value
        else
          html[:class] += ' ' unless html[:class].empty?
          html[:class] << klass_value
        end
      end

      def css_class #:nodoc:
        if html && html[:class]
          html[:class]
        else
          ''
        end
      end

      def yield_declaration_of_column_filter #:nodoc:
        nil
      end

      def detachness #:nodoc:
        (!detach_with_id.blank?).to_s
      end

      def yield_declaration #:nodoc:
        declaration = yield_declaration_of_column_filter
        if declaration
          {
            filterName:  self.name,
            detached:    detachness,
            declaration: declaration
          }
        end
      end

      def config  #:nodoc:
        @view.config
      end

      def controller  #:nodoc:
        @view.controller
      end

      def render_filter #:nodoc:
        params = @grid.filter_params(self)
        render_filter_internal(params)
      end

      def render_filter_internal(_params) #:nodoc:
        '<!-- implement me! -->'
      end

      def form_parameter_name_id_and_query(v) #:nodoc:
        query = form_parameter_template(v)
        query_without_equals_sign = query.sub(/=$/, '')
        parameter_name = CGI.unescape(query_without_equals_sign)
        dom_id = id_out_of_name(parameter_name)
        [query, query_without_equals_sign, parameter_name, dom_id.tr('.', '_')]
      end

      # Returns a reference to the column in the form: "table_name.column_name", unless it is a column in the main
      # table, in which case it will return just "column_name",
      def attribute_name_fully_qualified_for_all_but_main_table_columns
        return attribute if main_table
        return fully_qualified_attribute_name
      end

      # Returns a reference to the column in the form: "table_name.column_name".
      def fully_qualified_attribute_name
        table_alias_or_table_name ? (table_alias_or_table_name + '.' + attribute) : nil
      end

      def filter_shown? #:nodoc:
        self.attribute && self.filter
      end

      def filter_shown_in_main_table? #:nodoc:
        filter_shown? && !self.detach_with_id
      end

      def table_alias_or_table_name  #:nodoc:
        table_alias || table_name
      end

      def capable_of_hosting_filter_related_icons?  #:nodoc:
        self.attribute.blank? && self.name.blank? && !self.filter_shown?
      end

      def has_auto_reloading_input?  #:nodoc:
        false
      end

      def auto_reloading_input_with_negation_checkbox?  #:nodoc:
        false
      end

      def has_auto_reloading_select?  #:nodoc:
        false
      end

      def has_auto_reloading_calendar?  #:nodoc:
        false
      end

      protected

      def form_parameter_template(v) #:nodoc:
        { @grid.name => { f: { self.attribute_name_fully_qualified_for_all_but_main_table_columns => v } } }.to_query
      end

      def form_parameter_name(v) #:nodoc:
        form_parameter_template_hash(v).to_query
      end

      def name_out_of_template(s) #:nodoc:
        CGI.unescape(s).sub(/=$/, '')
      end

      def id_out_of_name(s) #:nodoc:
        s.gsub(/[\[\]]+/, '_').sub(/_+$/, '')
      end
    end

    class ConditionsGeneratorColumn   #:nodoc:
      def initialize(column_wrapper, column_type = nil)   #:nodoc:
        # Wice::ActiveRecordColumnWrapper
        @column_wrapper = column_wrapper
        @column_type = column_type
      end

      def generate_conditions(_table_alias, _opts) #:nodoc:
        raise('implement me')
      end

    end
  end
end


================================================
FILE: lib/wice/grid_output_buffer.rb
================================================
module Wice
  class GridOutputBuffer < String #:nodoc:

    # defines behavior for rendering nonexistent filters.
    # If return_empty_strings_for_nonexistent_filters is true, a call to render a non existent filter will raise an exception
    # If return_empty_strings_for_nonexistent_filters is false (CSV mode), no exception will be raised.
    attr_accessor :return_empty_strings_for_nonexistent_filters

    # initializes a grid output buffer
    def initialize(*attrs)
      super(*attrs)
      @filters = HashWithIndifferentAccess.new
    end

    def inspect
      "#<Wice::GridOutputBuffer #{@filters.map{|key, filter| "#{key}: #{filter.inspect}"}.join ', '}>"
    end

    # returns HTML code the grid
    def to_s
      super.html_safe
    end

    # stores HTML code for a detached filter
    def add_filter(detach_with_id, filter_code)
      raise WiceGridException.new("Detached ID #{detach_with_id} is already used!") if @filters.key? detach_with_id
      @filters[detach_with_id] = filter_code
    end

    # returns HTML code for a detached filter
    def filter_for(detach_with_id)
      unless @filters.key? detach_with_id
        if @return_empty_strings_for_nonexistent_filters
          return ''
        else
          raise WiceGridException.new("No filter with Detached ID '#{detach_with_id}'!")
        end
      end

      unless @filters[detach_with_id]
        raise WiceGridException.new("Filter with Detached ID '#{detach_with_id}' has already been requested once! There cannot be two instances of the same filter on one page")
      end

      res = @filters[detach_with_id]
      @filters[detach_with_id] = false
      res
    end

    # returns HTML code for a detached filter
    alias_method :[], :filter_for
  end
end


================================================
FILE: lib/wice/grid_renderer.rb
================================================
module Wice

  # Instance of `GridRenderer` is injected into the top level block of the `grid` helper.
  # `g.column`, `g.action_column` are all examples of methods of `GridRenderer`
  class GridRenderer
    include ActionView::Helpers::TagHelper
    include ActionView::Helpers::CaptureHelper
    include ActionView::Helpers::TextHelper
    include ActionView::Helpers::AssetTagHelper
    include ActionView::Helpers::JavaScriptHelper

    # a Proc object for the after_row block
    attr_reader :after_row_handler

    # a Proc object for the before_row block
    attr_reader :before_row_handler

    # a Proc object for the replace_row block
    attr_reader :replace_row_handler

    # Configuration or a Proc object for the blank_slate block
    attr_reader :blank_slate_handler

    # a Proc object which returns contents of the last row
    attr_reader :last_row_handler

    # reference to the WiceGrid instance
    attr_reader :grid

    # Contents of <caption></caption>
    attr_reader :kaption

    # HTTP parameter for the order field
    ORDER_PARAMETER_NAME           = 'order'

    # HTTP parameter for the order direction (asc/desc)
    ORDER_DIRECTION_PARAMETER_NAME = 'order_direction'

    def initialize(grid, view)  #:nodoc:
      @grid                  = grid
      @grid.renderer         = self
      @columns               = []
      @columns_table         = {}
      @action_column_present = false
      @view                  = view
    end

    def config  #:nodoc:
      @view.config
    end

    def controller  #:nodoc:
      @view.controller
    end

    def add_column(vc)  #:nodoc:
      @columns_table[vc.fully_qualified_attribute_name] = vc if vc.attribute
      @columns << vc
    end

    def [](k)  #:nodoc:
      @columns_table[k]
    end

    def number_of_columns(filter = nil)  #:nodoc:
      filter_columns(filter).size
    end

    def each_column_label(filter = nil)  #:nodoc:
      filter_columns(filter).each { |col| yield col.name }
    end

    def column_labels(filter = nil)  #:nodoc:
      filter_columns(filter).collect(&:name)
    end

    def each_column(filter = nil)  #:nodoc:
      filter_columns(filter).each { |col| yield col }
    end

    def each_column_aware_of_one_last_one(filter = nil)  #:nodoc:
      cols = filter_columns(filter)
      cols[0..-2].each { |col| yield col, false }
      yield cols.last, true
    end

    def last_column_for_html  #:nodoc:
      filter_columns(:in_html).last
    end

    def select_for(filter)  #:nodoc:
      filter_columns(filter).select { |col| yield col }
    end

    def find_one_for(filter)  #:nodoc:
      filter_columns(filter).find { |col| yield col }
    end

    def each_column_with_attribute  #:nodoc:
      @columns.select(&:attribute).each { |col| yield col }
    end

    alias_method :each, :each_column
    include Enumerable

    def csv_export_icon #:nodoc:
      content_tag(
        :div,
        content_tag(:i, '', class: 'fa fa-file-csv'),
        title: NlMessage['csv_export_tooltip'],
        class: 'clickable export-to-csv-button'
      )
    end

    def pagination_panel(number_of_columns, hide_csv_button)  #:nodoc:
      panel = yield

      render_csv_button = @grid.export_to_csv_enabled && !hide_csv_button

      if panel.nil?
        if render_csv_button
          "<tr><td colspan=\"#{number_of_columns}\"></td><td class=\"csv_export\">#{csv_export_icon}</td></tr>"
        else
          ''
        end
      else
        if render_csv_button
          "<tr><td colspan=\"#{number_of_columns}\">#{panel}</td><td class=\"csv_export\">#{csv_export_icon}</td></tr>"
        else
          "<tr><td colspan=\"#{number_of_columns + 1}\">#{panel}</td></tr>"
        end
      end
    end

    # Takes one argument and adds the  <caption></caption> tag to the table with the
    # argument value as the contents of <caption>.
    def caption(kaption)
      @kaption = kaption
    end

    # Adds a column with checkboxes for each record. Useful for actions with multiple records, for example, deleting
    # selected records. Please note that +action_column+ only creates the checkboxes and the 'Select All' and
    # 'Deselect All' buttons, and the form itelf as well as processing the parameters should be taken care of
    # by the application code.
    #
    # * <tt>:param_name</tt> - The name of the HTTP parameter.
    #   The complete HTTP parameter is <tt>"#{grid_name}[#{param_name}][]"</tt>.
    #   The default param_name is 'selected'.
    # * <tt>:html</tt> - a hash of HTML attributes to be included into the <tt>td</tt> tag.
    # * <tt>:select_all_buttons</tt> - show/hide buttons 'Select All' and 'Deselect All' in the column header.
    #   The default is +true+.
    # * <tt>:object_property</tt> - a method used to obtain the value for the HTTP parameter. The default is +id+.
    # * <tt>:html_check_box</tt> - can be used to switch from a real check box to two images. The default is +true+.
    #
    # You can hide a certain action checkbox if you add the usual block to +g.action_column+, just like with the
    # +g.column+ definition. If the block returns +nil+ or +false+ no checkbox will be rendered.

    def action_column(opts = {}, &block)
      if @action_column_present
        raise Wice::WiceGridException.new('There can be only one action column in a WiceGrid')
      end

      options = {
        param_name:         :selected,
        html:               {},
        select_all_buttons: true,
        object_property:    :id,
        html_check_box:     true
      }

      opts.assert_valid_keys(options.keys)
      options.merge!(opts)
      @action_column_present = true
      column_processor_klass = Columns.get_view_column_processor(:action)

      @columns << column_processor_klass.new(
        @grid,
        options[:html],
        options[:param_name],
        options[:select_all_buttons],
        options[:object_property],
        options[:html_check_box],
        @view,
        block
      )
    end

    # Defines everything related to a column in a grid - column name, filtering, rendering cells, etc.
    #
    # +column+ is only used inside the block of the +grid+ method. See documentation for the +grid+ method for more details.
    #
    # The only parameter is a hash of options. None of them is optional. If no options are supplied, the result will be a
    # column with no name, no filtering and no sorting.
    #
    # * <tt>:name</tt> - Name of the column.
    # * <tt>:html</tt> - a hash of HTML attributes to be included into the <tt>td</tt> tag.
    # * <tt>:class</tt> - a shortcut for <tt>html: {class: 'css_class'}</tt>
    # * <tt>:attribute</tt> - name of a database column (which normally correspond to a model attribute with the
    #   same name). By default the field is assumed to belong to the default table (see documentation for the
    #   +initialize_grid+ method). Parameter <tt>:assoc</tt> (association) allows to specify another joined table. Presence of
    #   this parameter
    #   * adds sorting capabilities by this field
    #   * automatically creates a filter based on the type of the field unless parameter <tt>:filter</tt> is set to false.
    #     The following filters exist for the following types:
    #     * <tt>string</tt> - a text field
    #     * <tt>integer</tt> and <tt>float</tt>  - two text fields to specify the range. Both limits or only one
    #       can be specified
    #     * <tt>boolean</tt> - a dropdown list with 'yes', 'no', or '-'. These labels can be changed in
    #       <tt>lib/wice_grid_config.rb</tt>.
    #     * <tt>date</tt> - two sets of standard date dropdown lists so specify the time range.
    #     * <tt>datetime</tt> - two sets of standard datetime dropdown lists so specify the time range. This filter
    #       is far from being user-friendly due to the number of dropdown lists.
    # * <tt>:filter</tt> - Disables filters when set to false.
    #   This is needed if sorting is required while  filters are not.
    # * <tt>:filter_type</tt> - Using a column filter different from the default filter chosen automatically based on the
    #   data type or the <tt>:custom_filter</tt> argument. See <tt>lib/columns/column_processor_index.rb</tt> for the
    #   list of available filters.
    # * <tt>:filter_control_options</tt> - Additional options to pass to the filter class to change the filter control
    #   behaviour. Supported options are dependent on the filter used.
    #   This is needed if sorting is required while  filters are not.
    # * <tt>:ordering</tt> - Enable/disable ordering links in the column titles. The default is +true+
    #   (i.e. if <tt>:attribute</tt> is defined, ordering is enabled)
    # * <tt>:assoc</tt> - Name of the model association. <tt>:attribute</tt> belongs to the table joined via this association.
    # * <tt>:table_alias</tt> - In case there are two joined assocations both referring to the same table, ActiveRecord
    #   constructs a query where the second join provides an alias for the joined table. Setting <tt>:table_alias</tt>
    #   to this alias will enable WiceGrid to order and filter by columns belonging to different associatiations  but
    #   originating from the same table without confusion. See README for an example.
    # * <tt>:custom_filter</tt> - Allows to construct a custom dropdown filter. Depending on the value of
    #   <tt>:custom_filter</tt> different modes are available:
    #   * array of strings and/or numbers - this is a direct  definition of possible values of the dropdown.
    #     Every item will be used both as the value of the select option and as its label.
    #   * Array of two-element arrays - Every first item of the two-element array is used for the label of the select option
    #     while the second element is the value of the select option
    #   * Hash - The keys of the hash become the labels of the generated dropdown list,
    #     while the values will be values of options of the dropdown list:
    #   * <tt>:auto</tt> - a powerful option which populates the dropdown list with all unique values of the field specified by
    #     <tt>:attribute</tt> and <tt>:model</tt>.
    #     <tt>:attribute</tt> throughout all pages. In other words, this runs an SQL query without +offset+ and +limit+
    #     clauses and  with <tt>distinct(table.field)</tt> instead of <tt>distinct(*)</tt>
    #   * any other symbol name (method name) - The dropdown list is populated by all unique value returned by the
    #     method with this name sent to <em>all</em> ActiveRecord objects throughout all pages. The main difference
    #     from <tt>:auto</tt> is that this method does not have to be a field in the result set, it is just some
    #     value computed in the method after the database call and ActiveRecord instantiation.
    #
    #     But here lies the major drawback - this mode requires additional query without +offset+ and +limit+
    #     clauses to instantiate _all_ ActiveRecord objects, and performance-wise it brings all the advantages
    #     of pagination to nothing. Thus, memory- and performance-wise this can be really bad for some queries
    #     and tables and should be used with care.
    #
    #     If the method returns a atomic value like a string or an integer, it is used for both the value and the
    #     label of the select option element. However, if the retuned value is a two element array, the first element
    #     is used for the option label and the second - for the value.
    #     Read more in README, section 'Custom dropdown filters'
    #   * An array of symbols (method names) - similar to the mode with a single symbol name. The first method name
    #     is sent to the ActiveRecord object if it responds to this method, the second method name is sent to the
    #     returned value unless it is +nil+, and so on. In other words, a single symbol mode is a
    #     case of an array of symbols where the array contains just one element. Thus the warning about the single method name
    #     mode applies here as well.
    #
    #     If the last method returns a atomic value like a string or an integer, it is used for both the value and the
    #     label of the select option element.
    #     However, if the retuned value is a two element array, the first element is used for the option label and the
    #     second - for the value.
    #     Read more in README, section 'Custom dropdown filters'
    # * <tt>:sort_by</tt> - allows arbitrary sorting of the results. This option takes a Proc which returns a value to
    #   sort by. When this option is used and sorting on this column is activated, the entire resultset is loaded and
    #   the Proc is passed to Enumerable#sort_by. This can also be used with calculated columns, but an arbitrary
    #   <tt>:attribute</tt> option must be included to provide a request parameter key. Because this option will load
    #   the entire resultset, it should only be used with small resultsets. The <tt>:custom_order</tt> option on grid
    #   initialization should be preferred if possible, as it will perform the sorting in SQL.
    # * <tt>:boolean_filter_true_label</tt> - overrides the label for <tt>true</tt> in the boolean filter (<tt>wice_grid.boolean_filter_true_label</tt> in <tt>wice_grid.yml</tt>).
    # * <tt>:boolean_filter_false_label</tt> - overrides the label for <tt>false</tt> in the boolean filter (<tt>wice_grid.boolean_filter_false_label</tt> in <tt>wice_grid.yml</tt>).
    # * <tt>:allow_multiple_selection</tt> - enables or disables switching between single and multiple selection modes for
    #   custom dropdown boxes. +true+ by default (see +ALLOW_MULTIPLE_SELECTION+ in the configuration file).
    # * <tt>:filter_all_label</tt> - overrides the default value for <tt>BOOLEAN_FILTER_FALSE_LABEL</tt> ('<tt>--</tt>')
    #   in the config. Has effect in a column with a boolean filter _or_ a custom filter.
    # * <tt>:detach_with_id</tt> - allows to detach the filter and render it after or before the grid with the
    #   +grid_filter+ helper. The value is an arbitrary unique identifier
    #   of the filter. Read section 'Detached Filters' in README for details.
    #   Has effect in a column with a boolean filter _or_ a custom filter.
    # * <tt>:in_csv</tt> - When CSV export is enabled, all columns are included into the export. Setting <tt>:in_csv</tt>
    #   to false will prohibit the column from inclusion into the export.
    # * <tt>:in_html</tt> - When CSV export is enabled and it is needed to use a column for CSV export only and ignore it
    #   in HTML, set this parameter to false.
    # * <tt>:negation</tt> - turn on/off the negation checkbox in string filters
    # * <tt>:auto_reload</tt> - a boolean value specifying if a change in a filter triggers reloading of the grid. Works with all
    #   filter types including the JS calendar, the only exception is the standard Rails date/datetime filters.
    #   The default is false. (see +AUTO_RELOAD+ in the configuration file).
    #
    # The block parameter is an ActiveRecord instance. This block is called for every ActiveRecord shown, and the return
    # value of the block is a string which becomes the contents of one table cell, or an array of two elements where
    # the first element is the cell contents and the second is a hash of HTML attributes to be added for the <tt><td></tt>
    # tag of the current cell.
    #
    # In case of an array output, please note that if you need to define HTML attributes for all <tt><td></tt>'s in a
    # column, use +html+. Also note that if the method returns a hash with a <tt>:class</tt> or <tt>'class'</tt>
    # element, it will not overwrite the class defined in +html+, or classes added by
Download .txt
gitextract_k8x_hooj/

├── .circleci/
│   ├── config.yml
│   └── run-build-locally.sh
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── bug_report.md
│   └── dependabot.yml
├── .gitignore
├── .inch.yml
├── .rspec
├── .rubocop.yml
├── Appraisals
├── CHANGELOG.md
├── Gemfile
├── Guardfile
├── MIT-LICENSE
├── README.md
├── Rakefile
├── SAVED_QUERIES_HOWTO.md
├── app/
│   └── views/
│       └── kaminari/
│           └── wice_grid/
│               ├── _gap.html.erb
│               ├── _next_page.html.erb
│               ├── _page.html.erb
│               ├── _paginator.html.erb
│               └── _prev_page.html.erb
├── config/
│   └── locales/
│       ├── cz.yml
│       ├── de.yml
│       ├── en.yml
│       ├── es.yml
│       ├── fr.yml
│       ├── is.yml
│       ├── it.yml
│       ├── ja.yml
│       ├── nl.yml
│       ├── pt-BR.yml
│       ├── pt.yml
│       ├── ru.yml
│       ├── sk.yml
│       ├── uk.yml
│       └── zh.yml
├── gemfiles/
│   ├── rails_5.0.gemfile
│   ├── rails_5.1.gemfile
│   └── rails_5.2.gemfile
├── lib/
│   ├── generators/
│   │   └── wice_grid/
│   │       ├── add_migration_for_serialized_queries_generator.rb
│   │       ├── install_generator.rb
│   │       └── templates/
│   │           ├── create_wice_grid_serialized_queries.rb
│   │           └── wice_grid_config.rb
│   ├── wice/
│   │   ├── active_record_column_wrapper.rb
│   │   ├── columns/
│   │   │   ├── column_action.rb
│   │   │   ├── column_boolean.rb
│   │   │   ├── column_bootstrap_datepicker.rb
│   │   │   ├── column_custom_dropdown.rb
│   │   │   ├── column_float.rb
│   │   │   ├── column_html5_datepicker.rb
│   │   │   ├── column_integer.rb
│   │   │   ├── column_jquery_datepicker.rb
│   │   │   ├── column_processor_index.rb
│   │   │   ├── column_rails_date_helper.rb
│   │   │   ├── column_rails_datetime_helper.rb
│   │   │   ├── column_range.rb
│   │   │   ├── column_string.rb
│   │   │   ├── common_date_datetime_mixin.rb
│   │   │   ├── common_js_date_datetime_conditions_generator_mixin.rb
│   │   │   ├── common_js_date_datetime_mixin.rb
│   │   │   ├── common_rails_date_datetime_conditions_generator_mixin.rb
│   │   │   └── common_standard_helper_date_datetime_mixin.rb
│   │   ├── columns.rb
│   │   ├── grid_output_buffer.rb
│   │   ├── grid_renderer.rb
│   │   ├── helpers/
│   │   │   ├── bs_calendar_helpers.rb
│   │   │   ├── js_calendar_helpers.rb
│   │   │   ├── wice_grid_misc_view_helpers.rb
│   │   │   ├── wice_grid_serialized_queries_view_helpers.rb
│   │   │   └── wice_grid_view_helpers.rb
│   │   ├── kaminari_monkey_patching.rb
│   │   ├── table_column_matrix.rb
│   │   ├── wice_grid_controller.rb
│   │   ├── wice_grid_core_ext.rb
│   │   ├── wice_grid_misc.rb
│   │   ├── wice_grid_serialized_queries_controller.rb
│   │   ├── wice_grid_serialized_query.rb
│   │   └── wice_grid_spreadsheet.rb
│   └── wice_grid.rb
├── package.json
├── spec/
│   ├── acceptance_helper.rb
│   ├── features/
│   │   ├── action_column_request_spec.rb
│   │   ├── adding_rows_request_spec.rb
│   │   ├── all_records_request_spec.rb
│   │   ├── auto_reloads2_request_spec.rb
│   │   ├── auto_reloads3_request_spec.rb
│   │   ├── auto_reloads_request_spec.rb
│   │   ├── basics1_request_spec.rb
│   │   ├── basics2_request_spec.rb
│   │   ├── basics3_request_spec.rb
│   │   ├── basics4_request_spec.rb
│   │   ├── basics5_request_spec.rb
│   │   ├── basics6_request_spec.rb
│   │   ├── blockless_column_definition_spec.rb
│   │   ├── buttons_request_spec.rb
│   │   ├── csv_and_detached_filters_spec.rb
│   │   ├── csv_export_request_spec.rb
│   │   ├── custom_filter_params_request_spec.rb
│   │   ├── custom_filters1_request_spec.rb
│   │   ├── custom_filters2_request_spec.rb
│   │   ├── custom_filters3_request_spec.rb
│   │   ├── custom_filters4_request_spec.rb
│   │   ├── custom_ordering_on_calculated_request_spec.rb
│   │   ├── custom_ordering_request_spec.rb
│   │   ├── custom_ordering_with_arel_request_spec.rb
│   │   ├── custom_ordering_with_proc_request_spec.rb
│   │   ├── custom_ordering_with_ruby_request_spec.rb
│   │   ├── dates_request_spec.rb
│   │   ├── detached_filters_spec.rb
│   │   ├── detached_filters_two_grids_spec.rb
│   │   ├── disable_all_filters_spec.rb
│   │   ├── hiding_checkboxes_in_action_column_request_spec.rb
│   │   ├── integration_with_application_view_request_spec.rb
│   │   ├── integration_with_forms_request_spec.rb
│   │   ├── joining_tables_spec.rb
│   │   ├── localization_request_spec.rb
│   │   ├── many_grids_on_page_request_spec.rb
│   │   ├── negation_request_spec.rb
│   │   ├── no_records_request_spec.rb
│   │   ├── numeric_filters_request_spec.rb
│   │   ├── resultset_processings2_request_spec.rb
│   │   ├── resultset_processings_request_spec.rb
│   │   ├── saved_queries_request_spec.rb
│   │   ├── shared.rb
│   │   ├── shared_detached_filters.rb
│   │   ├── styling_spec.rb
│   │   ├── two_associations_spec.rb
│   │   ├── upper_pagination_panel_request_spec.rb
│   │   └── when_filtered_spec.rb
│   ├── fixtures/
│   │   ├── .gitkeep
│   │   ├── companies.yml
│   │   ├── priorities.yml
│   │   ├── project_roles.yml
│   │   ├── projects.yml
│   │   ├── statuses.yml
│   │   ├── tasks.yml
│   │   ├── tasks_users.yml
│   │   ├── users.yml
│   │   └── versions.yml
│   ├── models/
│   │   ├── company_spec.rb
│   │   ├── priority_spec.rb
│   │   ├── project_spec.rb
│   │   ├── status_spec.rb
│   │   ├── task_spec.rb
│   │   ├── user_project_participation_spec.rb
│   │   ├── user_spec.rb
│   │   └── version_spec.rb
│   ├── rails_helper.rb
│   ├── schema.rb
│   ├── spec_helper.rb
│   ├── support/
│   │   ├── active_record.rb
│   │   ├── download_helper.rb
│   │   └── test_app/
│   │       ├── Rakefile
│   │       ├── app/
│   │       │   ├── assets/
│   │       │   │   ├── builds/
│   │       │   │   │   ├── .keep
│   │       │   │   │   └── application.css
│   │       │   │   ├── config/
│   │       │   │   │   └── manifest.js
│   │       │   │   └── stylesheets/
│   │       │   │       ├── adding_rows.scss
│   │       │   │       ├── application.scss
│   │       │   │       ├── csv_and_detached_filters.scss
│   │       │   │       └── many_grids_on_page.scss
│   │       │   ├── controllers/
│   │       │   │   ├── action_column_controller.rb
│   │       │   │   ├── adding_rows_controller.rb
│   │       │   │   ├── all_records_controller.rb
│   │       │   │   ├── application_controller.rb
│   │       │   │   ├── auto_reloads2_controller.rb
│   │       │   │   ├── auto_reloads3_controller.rb
│   │       │   │   ├── auto_reloads_controller.rb
│   │       │   │   ├── basics1_controller.rb
│   │       │   │   ├── basics2_controller.rb
│   │       │   │   ├── basics3_controller.rb
│   │       │   │   ├── basics4_controller.rb
│   │       │   │   ├── basics5_controller.rb
│   │       │   │   ├── basics6_controller.rb
│   │       │   │   ├── blockless_column_definition_controller.rb
│   │       │   │   ├── buttons_controller.rb
│   │       │   │   ├── csv_and_detached_filters_controller.rb
│   │       │   │   ├── csv_export_controller.rb
│   │       │   │   ├── custom_filter_params_controller.rb
│   │       │   │   ├── custom_filters1_controller.rb
│   │       │   │   ├── custom_filters2_controller.rb
│   │       │   │   ├── custom_filters3_controller.rb
│   │       │   │   ├── custom_filters4_controller.rb
│   │       │   │   ├── custom_ordering_controller.rb
│   │       │   │   ├── custom_ordering_on_calculated_controller.rb
│   │       │   │   ├── custom_ordering_with_arel_controller.rb
│   │       │   │   ├── custom_ordering_with_proc_controller.rb
│   │       │   │   ├── custom_ordering_with_ruby_controller.rb
│   │       │   │   ├── dates_controller.rb
│   │       │   │   ├── detached_filters_controller.rb
│   │       │   │   ├── detached_filters_two_grids_controller.rb
│   │       │   │   ├── disable_all_filters_controller.rb
│   │       │   │   ├── hiding_checkboxes_in_action_column_controller.rb
│   │       │   │   ├── home_controller.rb
│   │       │   │   ├── integration_with_application_view_controller.rb
│   │       │   │   ├── integration_with_forms_controller.rb
│   │       │   │   ├── joining_tables_controller.rb
│   │       │   │   ├── localization_controller.rb
│   │       │   │   ├── many_grids_on_page_controller.rb
│   │       │   │   ├── negation_controller.rb
│   │       │   │   ├── no_records_controller.rb
│   │       │   │   ├── null_values_controller.rb
│   │       │   │   ├── numeric_filters_controller.rb
│   │       │   │   ├── queries_controller.rb
│   │       │   │   ├── resultset_processings2_controller.rb
│   │       │   │   ├── resultset_processings_controller.rb
│   │       │   │   ├── saved_queries_controller.rb
│   │       │   │   ├── styling_controller.rb
│   │       │   │   ├── tasks_controller.rb
│   │       │   │   ├── two_associations_controller.rb
│   │       │   │   ├── upper_pagination_panel_controller.rb
│   │       │   │   └── when_filtered_controller.rb
│   │       │   ├── helpers/
│   │       │   │   └── application_helper.rb
│   │       │   ├── javascript/
│   │       │   │   └── application.js
│   │       │   ├── mailers/
│   │       │   │   └── .gitkeep
│   │       │   ├── models/
│   │       │   │   ├── .gitkeep
│   │       │   │   ├── company.rb
│   │       │   │   ├── populate.rb
│   │       │   │   ├── priority.rb
│   │       │   │   ├── project.rb
│   │       │   │   ├── project_role.rb
│   │       │   │   ├── status.rb
│   │       │   │   ├── task.rb
│   │       │   │   ├── to_dropdown_mixin.rb
│   │       │   │   ├── user.rb
│   │       │   │   ├── user_project_participation.rb
│   │       │   │   └── version.rb
│   │       │   └── views/
│   │       │       ├── action_column/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── adding_rows/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── all_records/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── auto_reloads/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── auto_reloads2/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── auto_reloads3/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── basics1/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── basics2/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── basics3/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── basics4/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── basics5/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── basics6/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── blockless_column_definition/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── buttons/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── csv_and_detached_filters/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── csv_export/
│   │       │       │   ├── _projects_grid.html.erb
│   │       │       │   ├── _tasks_grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_filter_params/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_filters1/
│   │       │       │   ├── _g1.html.erb
│   │       │       │   ├── _g2.html.erb
│   │       │       │   ├── _g3.html.erb
│   │       │       │   ├── _g4.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_filters2/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_filters3/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_filters4/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_ordering/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_ordering_on_calculated/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_ordering_with_arel/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_ordering_with_proc/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── custom_ordering_with_ruby/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── dates/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── detached_filters/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── detached_filters_two_grids/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── disable_all_filters/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── hiding_checkboxes_in_action_column/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── integration_with_application_view/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── integration_with_forms/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── joining_tables/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── layouts/
│   │       │       │   └── application.html.haml
│   │       │       ├── localization/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── many_grids_on_page/
│   │       │       │   ├── _tasks_grid1.html.erb
│   │       │       │   ├── _tasks_grid2.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── negation/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── no_records/
│   │       │       │   ├── _empty_grid.html.haml
│   │       │       │   ├── _grid1.html.erb
│   │       │       │   ├── _grid2.html.erb
│   │       │       │   ├── _grid3.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── null_values/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── numeric_filters/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── resultset_processings/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── resultset_processings2/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── saved_queries/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── styling/
│   │       │       │   ├── _grid1.html.erb
│   │       │       │   ├── _grid2.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── tasks/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── two_associations/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       ├── upper_pagination_panel/
│   │       │       │   ├── _grid.html.erb
│   │       │       │   └── index.html.haml
│   │       │       └── when_filtered/
│   │       │           ├── _grid.html.erb
│   │       │           └── index.html.haml
│   │       ├── bin/
│   │       │   ├── dartsass
│   │       │   ├── importmap
│   │       │   ├── rails
│   │       │   └── rake
│   │       ├── config/
│   │       │   ├── application.rb
│   │       │   ├── boot.rb
│   │       │   ├── database.travis.yml
│   │       │   ├── database.yml
│   │       │   ├── database.yml.mysql
│   │       │   ├── database.yml.postgresql
│   │       │   ├── environment.rb
│   │       │   ├── environments/
│   │       │   │   ├── development.rb
│   │       │   │   ├── production.rb
│   │       │   │   └── test.rb
│   │       │   ├── importmap.rb
│   │       │   ├── initializers/
│   │       │   │   ├── assets.rb
│   │       │   │   ├── backtrace_silencers.rb
│   │       │   │   ├── inflections.rb
│   │       │   │   ├── mime_types.rb
│   │       │   │   ├── secret_token.rb
│   │       │   │   ├── session_store.rb
│   │       │   │   ├── wice_grid_config.rb
│   │       │   │   └── wrap_parameters.rb
│   │       │   ├── locales/
│   │       │   │   ├── en.yml
│   │       │   │   └── wice_grid.yml
│   │       │   ├── puma.rb
│   │       │   └── routes.rb
│   │       ├── config.ru
│   │       ├── db/
│   │       │   ├── migrate/
│   │       │   │   ├── 20120224193505_create_tasks.rb
│   │       │   │   ├── 20120224193517_create_users.rb
│   │       │   │   ├── 20120224193522_create_projects.rb
│   │       │   │   ├── 20120224193529_create_priorities.rb
│   │       │   │   ├── 20120224193537_create_statuses.rb
│   │       │   │   ├── 20120224193543_create_versions.rb
│   │       │   │   ├── 20120224193550_create_project_roles.rb
│   │       │   │   ├── 20120224193610_create_companies.rb
│   │       │   │   ├── 20120224195351_create_user_project_participations.rb
│   │       │   │   ├── 20120224195521_add_tasks_users.rb
│   │       │   │   └── 20120610091944_create_wice_grid_serialized_queries.rb
│   │       │   ├── schema.rb
│   │       │   └── seeds.rb
│   │       ├── lib/
│   │       │   ├── ar_fixtures.rb
│   │       │   ├── assets/
│   │       │   │   └── .gitkeep
│   │       │   └── tasks/
│   │       │       ├── .gitkeep
│   │       │       └── ar_fixtures.rake
│   │       ├── public/
│   │       │   ├── 404.html
│   │       │   ├── 422.html
│   │       │   ├── 500.html
│   │       │   └── robots.txt
│   │       └── vendor/
│   │           └── javascript/
│   │               ├── .keep
│   │               ├── @hotwired--stimulus.js
│   │               ├── @stimulus-components--rails-nested-form.js
│   │               ├── jquery.ui.datepicker.locales.js
│   │               └── reload_on_change.js
│   └── wice/
│       ├── grid_output_buffer_spec.rb
│       ├── table_column_matrix_spec.rb
│       ├── wice_grid_misc_spec.rb
│       └── wice_grid_spreadsheet_spec.rb
├── vendor/
│   └── assets/
│       ├── javascripts/
│       │   ├── wice_grid.js
│       │   ├── wice_grid_init.js.coffee
│       │   ├── wice_grid_processor.js.coffee
│       │   └── wice_grid_saved_queries_init.js.coffee
│       └── stylesheets/
│           └── wice_grid.scss
└── wice_grid.gemspec
Download .txt
SYMBOL INDEX (999 symbols across 122 files)

FILE: lib/generators/wice_grid/add_migration_for_serialized_queries_generator.rb
  type WiceGrid (line 1) | module WiceGrid #:nodoc:
    type Generators (line 2) | module Generators #:nodoc:
      class AddMigrationForSerializedQueriesGenerator (line 3) | class AddMigrationForSerializedQueriesGenerator < Rails::Generators:...
        method next_migration_number (line 10) | def self.next_migration_number(_path)
        method create_model_file (line 14) | def create_model_file

FILE: lib/generators/wice_grid/install_generator.rb
  type WiceGrid (line 1) | module WiceGrid #:nodoc:
    type Generators (line 2) | module Generators #:nodoc:
      class InstallGenerator (line 3) | class InstallGenerator < Rails::Generators::Base #:nodoc:
        method copy_stuff (line 8) | def copy_stuff #:nodoc:

FILE: lib/generators/wice_grid/templates/create_wice_grid_serialized_queries.rb
  class CreateWiceGridSerializedQueries (line 1) | class CreateWiceGridSerializedQueries < ::ActiveRecord::Migration #:nodoc:
    method change (line 2) | def change #:nodoc:

FILE: lib/wice/active_record_column_wrapper.rb
  type Wice (line 1) | module Wice
    type WiceGridExtentionToActiveRecordColumn (line 3) | module WiceGridExtentionToActiveRecordColumn #:nodoc:
    class ActiveRecordColumnWrapper (line 8) | class ActiveRecordColumnWrapper #:nodoc:
      method initialize (line 9) | def initialize(column, all_filter_params, main_table, table_alias, c...
      method wg_initialize_request_parameters (line 28) | def wg_initialize_request_parameters  #:nodoc:
      method wg_generate_conditions (line 78) | def wg_generate_conditions  #:nodoc:
      method name (line 110) | def name #:nodoc:
      method model (line 114) | def model #:nodoc:
      method array? (line 118) | def array?
      method alias_or_table_name (line 128) | def alias_or_table_name(table_alias) #:nodoc:

FILE: lib/wice/columns.rb
  type Wice (line 1) | module Wice #:nodoc:
    type Columns (line 2) | module Columns #:nodoc:
      function load_column_processors (line 6) | def load_column_processors #:nodoc:
      function get_view_column_processor (line 55) | def get_view_column_processor(column_type) #:nodoc:
      function get_conditions_generator_column_processor (line 59) | def get_conditions_generator_column_processor(column_type) #:nodoc:
      function build_table_of_processors (line 66) | def build_table_of_processors(prefix)
      function require_columns (line 87) | def require_columns
      class ViewColumn (line 94) | class ViewColumn  #:nodoc:
        method initialize (line 131) | def initialize(block, options, grid_obj, tname, mtable, cfilter, v...
        method add_css_class (line 144) | def add_css_class(klass_value) #:nodoc:
        method css_class (line 154) | def css_class #:nodoc:
        method yield_declaration_of_column_filter (line 162) | def yield_declaration_of_column_filter #:nodoc:
        method detachness (line 166) | def detachness #:nodoc:
        method yield_declaration (line 170) | def yield_declaration #:nodoc:
        method config (line 181) | def config  #:nodoc:
        method controller (line 185) | def controller  #:nodoc:
        method render_filter (line 189) | def render_filter #:nodoc:
        method render_filter_internal (line 194) | def render_filter_internal(_params) #:nodoc:
        method form_parameter_name_id_and_query (line 198) | def form_parameter_name_id_and_query(v) #:nodoc:
        method attribute_name_fully_qualified_for_all_but_main_table_columns (line 208) | def attribute_name_fully_qualified_for_all_but_main_table_columns
        method fully_qualified_attribute_name (line 214) | def fully_qualified_attribute_name
        method filter_shown? (line 218) | def filter_shown? #:nodoc:
        method filter_shown_in_main_table? (line 222) | def filter_shown_in_main_table? #:nodoc:
        method table_alias_or_table_name (line 226) | def table_alias_or_table_name  #:nodoc:
        method capable_of_hosting_filter_related_icons? (line 230) | def capable_of_hosting_filter_related_icons?  #:nodoc:
        method has_auto_reloading_input? (line 234) | def has_auto_reloading_input?  #:nodoc:
        method auto_reloading_input_with_negation_checkbox? (line 238) | def auto_reloading_input_with_negation_checkbox?  #:nodoc:
        method has_auto_reloading_select? (line 242) | def has_auto_reloading_select?  #:nodoc:
        method has_auto_reloading_calendar? (line 246) | def has_auto_reloading_calendar?  #:nodoc:
        method form_parameter_template (line 252) | def form_parameter_template(v) #:nodoc:
        method form_parameter_name (line 256) | def form_parameter_name(v) #:nodoc:
        method name_out_of_template (line 260) | def name_out_of_template(s) #:nodoc:
        method id_out_of_name (line 264) | def id_out_of_name(s) #:nodoc:
      class ConditionsGeneratorColumn (line 269) | class ConditionsGeneratorColumn   #:nodoc:
        method initialize (line 270) | def initialize(column_wrapper, column_type = nil)   #:nodoc:
        method generate_conditions (line 276) | def generate_conditions(_table_alias, _opts) #:nodoc:

FILE: lib/wice/columns/column_action.rb
  type Wice (line 1) | module Wice
    type Columns (line 2) | module Columns #:nodoc:
      class ViewColumnAction (line 3) | class ViewColumnAction < ViewColumn #:nodoc:
        method initialize (line 4) | def initialize(grid_obj, html, param_name, select_all_buttons, obj...
        method in_html (line 23) | def in_html  #:nodoc:
        method capable_of_hosting_filter_related_icons? (line 27) | def capable_of_hosting_filter_related_icons?  #:nodoc:
        method name (line 31) | def name  #:nodoc:

FILE: lib/wice/columns/column_boolean.rb
  type Wice (line 1) | module Wice
    type Columns (line 2) | module Columns #:nodoc:
      class ViewColumnBoolean (line 3) | class ViewColumnBoolean < ViewColumnCustomDropdown #:nodoc:
        method render_filter_internal (line 12) | def render_filter_internal(params) #:nodoc:
      class ConditionsGeneratorColumnBoolean (line 24) | class ConditionsGeneratorColumnBoolean < ConditionsGeneratorColumn  ...
        method generate_conditions (line 25) | def  generate_conditions(table_alias, opts)   #:nodoc:

FILE: lib/wice/columns/column_bootstrap_datepicker.rb
  type Wice (line 1) | module Wice
    type Columns (line 2) | module Columns #:nodoc:
      class ViewColumnBootstrapDatepicker (line 3) | class ViewColumnBootstrapDatepicker < ViewColumn #:nodoc:
        method do_render (line 9) | def do_render(params) #:nodoc:
        method has_auto_reloading_calendar? (line 35) | def has_auto_reloading_calendar? #:nodoc:
      class ConditionsGeneratorColumnBootstrapDatepicker (line 41) | class ConditionsGeneratorColumnBootstrapDatepicker < ConditionsGener...

FILE: lib/wice/columns/column_custom_dropdown.rb
  type Wice (line 1) | module Wice
    type Columns (line 2) | module Columns #:nodoc:
      class ViewColumnCustomDropdown (line 3) | class ViewColumnCustomDropdown < ViewColumn #:nodoc:
        method render_filter_internal (line 12) | def render_filter_internal(params) #:nodoc:
        method yield_declaration_of_column_filter (line 67) | def yield_declaration_of_column_filter #:nodoc:
        method has_auto_reloading_select? (line 74) | def has_auto_reloading_select? #:nodoc:
      class ConditionsGeneratorColumnCustomDropdown (line 79) | class ConditionsGeneratorColumnCustomDropdown < ConditionsGeneratorC...
        method generate_conditions (line 80) | def generate_conditions(table_alias, opts)   #:nodoc:

FILE: lib/wice/columns/column_float.rb
  type Wice (line 1) | module Wice #:nodoc:
    type Columns (line 2) | module Columns #:nodoc:
      class ViewColumnFloat (line 3) | class ViewColumnFloat < ViewColumnInteger #:nodoc:

FILE: lib/wice/columns/column_html5_datepicker.rb
  type Wice (line 1) | module Wice
    type Columns (line 2) | module Columns #:nodoc:
      class ViewColumnHtml5Datepicker (line 3) | class ViewColumnHtml5Datepicker < ViewColumn #:nodoc:
        method do_render (line 8) | def do_render(params) #:nodoc:
        method has_auto_reloading_calendar? (line 17) | def has_auto_reloading_calendar? #:nodoc:
      class ConditionsGeneratorColumnHtml5Datepicker (line 24) | class ConditionsGeneratorColumnHtml5Datepicker < ConditionsGenerator...

FILE: lib/wice/columns/column_integer.rb
  type Wice (line 1) | module Wice
    type Columns (line 2) | module Columns #:nodoc:
      class ViewColumnInteger (line 3) | class ViewColumnInteger < ViewColumn #:nodoc:
        method render_filter_internal (line 4) | def render_filter_internal(params) #:nodoc:
        method yield_declaration_of_column_filter (line 20) | def yield_declaration_of_column_filter #:nodoc:
        method has_auto_reloading_input? (line 27) | def has_auto_reloading_input? #:nodoc:
      class ConditionsGeneratorColumnInteger (line 32) | class ConditionsGeneratorColumnInteger < ConditionsGeneratorColumn  ...
        method get_value (line 34) | def self.get_value(val) #:nodoc:
        method get_op_and_value (line 42) | def get_op_and_value(val) #:nodoc:
        method generate_conditions (line 60) | def generate_conditions(table_alias, opts)   #:nodoc:

FILE: lib/wice/columns/column_jquery_datepicker.rb
  type Wice (line 1) | module Wice
    type Columns (line 2) | module Columns #:nodoc:
      class ViewColumnJqueryDatepicker (line 3) | class ViewColumnJqueryDatepicker < ViewColumn #:nodoc:
        method do_render (line 9) | def do_render(params) #:nodoc:
        method has_auto_reloading_calendar? (line 36) | def has_auto_reloading_calendar? #:nodoc:
      class ConditionsGeneratorColumnJqueryDatepicker (line 42) | class ConditionsGeneratorColumnJqueryDatepicker < ConditionsGenerato...

FILE: lib/wice/columns/column_processor_index.rb
  type Wice (line 1) | module Wice #:nodoc:
    type Columns (line 2) | module Columns #:nodoc:

FILE: lib/wice/columns/column_rails_date_helper.rb
  type Wice (line 1) | module Wice
    type Columns (line 2) | module Columns #:nodoc:
      class ViewColumnRailsDateHelper (line 3) | class ViewColumnRailsDateHelper < ViewColumn #:nodoc:
        method chunk_names (line 9) | def chunk_names #:nodoc:
        method do_render (line 13) | def do_render(params) #:nodoc:
        method name_and_id_from_options (line 22) | def name_and_id_from_options(options, type)  #:nodoc:
        method has_auto_reloading_calendar? (line 28) | def has_auto_reloading_calendar? #:nodoc:
      class ConditionsGeneratorColumnRailsDateHelper (line 34) | class ConditionsGeneratorColumnRailsDateHelper < ConditionsGenerator...

FILE: lib/wice/columns/column_rails_datetime_helper.rb
  type Wice (line 1) | module Wice
    type Columns (line 2) | module Columns #:nodoc:
      class ViewColumnRailsDatetimeHelper (line 3) | class ViewColumnRailsDatetimeHelper < ViewColumn #:nodoc:
        method chunk_names (line 9) | def chunk_names #:nodoc:
        method do_render (line 13) | def do_render(params) #:nodoc:
        method name_and_id_from_options (line 23) | def name_and_id_from_options(options, type)  #:nodoc:
        method has_auto_reloading_calendar? (line 28) | def has_auto_reloading_calendar? #:nodoc:
      class ConditionsGeneratorColumnRailsDatetimeHelper (line 34) | class ConditionsGeneratorColumnRailsDatetimeHelper < ConditionsGener...

FILE: lib/wice/columns/column_range.rb
  type Wice (line 1) | module Wice
    type Columns (line 2) | module Columns #:nodoc:
      class ViewColumnRange (line 3) | class ViewColumnRange < ViewColumn #:nodoc:
        method render_filter_internal (line 4) | def render_filter_internal(params) #:nodoc:
        method yield_declaration_of_column_filter (line 24) | def yield_declaration_of_column_filter #:nodoc:
        method has_auto_reloading_input? (line 31) | def has_auto_reloading_input? #:nodoc:
      class ConditionsGeneratorColumnRange (line 36) | class ConditionsGeneratorColumnRange < ConditionsGeneratorColumn  #:...
        method generate_conditions (line 37) | def generate_conditions(table_alias, opts)   #:nodoc:

FILE: lib/wice/columns/column_string.rb
  type Wice (line 1) | module Wice
    type Columns (line 2) | module Columns #:nodoc:
      class ViewColumnString (line 3) | class ViewColumnString < ViewColumn #:nodoc:
        method render_filter_internal (line 11) | def render_filter_internal(params) #:nodoc:
        method yield_declaration_of_column_filter (line 39) | def yield_declaration_of_column_filter #:nodoc:
        method has_auto_reloading_input? (line 53) | def has_auto_reloading_input? #:nodoc:
        method auto_reloading_input_with_negation_checkbox? (line 57) | def auto_reloading_input_with_negation_checkbox? #:nodoc:
      class ConditionsGeneratorColumnString (line 62) | class ConditionsGeneratorColumnString < ConditionsGeneratorColumn  #...
        method generate_conditions (line 63) | def generate_conditions(table_alias, opts)   #:nodoc:

FILE: lib/wice/columns/common_date_datetime_mixin.rb
  type Wice (line 1) | module Wice
    type Columns (line 2) | module Columns #:nodoc:
      type CommonDateDatetimeMixin (line 3) | module CommonDateDatetimeMixin #:nodoc:
        function render_filter_internal (line 5) | def render_filter_internal(params) #:nodoc:
        function yield_declaration_of_column_filter (line 10) | def yield_declaration_of_column_filter #:nodoc:

FILE: lib/wice/columns/common_js_date_datetime_conditions_generator_mixin.rb
  type Wice (line 1) | module Wice
    type Columns (line 2) | module Columns #:nodoc:
      type CommonJsDateDatetimeConditionsGeneratorMixin (line 3) | module CommonJsDateDatetimeConditionsGeneratorMixin #:nodoc:
        function generate_conditions (line 5) | def generate_conditions(table_alias, opts)   #:nodoc:

FILE: lib/wice/columns/common_js_date_datetime_mixin.rb
  type Wice (line 1) | module Wice
    type Columns (line 2) | module Columns #:nodoc:
      type CommonJsDateDatetimeMixin (line 3) | module CommonJsDateDatetimeMixin #:nodoc:
        function prepare (line 5) | def prepare #:nodoc:

FILE: lib/wice/columns/common_rails_date_datetime_conditions_generator_mixin.rb
  type Wice (line 1) | module Wice
    type Columns (line 2) | module Columns #:nodoc:
      type CommonRailsDateDatetimeConditionsGeneratorMixin (line 3) | module CommonRailsDateDatetimeConditionsGeneratorMixin #:nodoc:
        function generate_conditions (line 5) | def generate_conditions(table_alias, opts)   #:nodoc:

FILE: lib/wice/columns/common_standard_helper_date_datetime_mixin.rb
  type Wice (line 1) | module Wice
    type Columns (line 2) | module Columns #:nodoc:
      type CommonStandardDateDatetimeMixin (line 3) | module CommonStandardDateDatetimeMixin #:nodoc:
        function prepare (line 5) | def prepare #:nodoc:

FILE: lib/wice/grid_output_buffer.rb
  type Wice (line 1) | module Wice
    class GridOutputBuffer (line 2) | class GridOutputBuffer < String #:nodoc:
      method initialize (line 10) | def initialize(*attrs)
      method inspect (line 15) | def inspect
      method to_s (line 20) | def to_s
      method add_filter (line 25) | def add_filter(detach_with_id, filter_code)
      method filter_for (line 31) | def filter_for(detach_with_id)

FILE: lib/wice/grid_renderer.rb
  type Wice (line 1) | module Wice
    class GridRenderer (line 5) | class GridRenderer
      method initialize (line 39) | def initialize(grid, view)  #:nodoc:
      method config (line 48) | def config  #:nodoc:
      method controller (line 52) | def controller  #:nodoc:
      method add_column (line 56) | def add_column(vc)  #:nodoc:
      method [] (line 61) | def [](k)  #:nodoc:
      method number_of_columns (line 65) | def number_of_columns(filter = nil)  #:nodoc:
      method each_column_label (line 69) | def each_column_label(filter = nil)  #:nodoc:
      method column_labels (line 73) | def column_labels(filter = nil)  #:nodoc:
      method each_column (line 77) | def each_column(filter = nil)  #:nodoc:
      method each_column_aware_of_one_last_one (line 81) | def each_column_aware_of_one_last_one(filter = nil)  #:nodoc:
      method last_column_for_html (line 87) | def last_column_for_html  #:nodoc:
      method select_for (line 91) | def select_for(filter)  #:nodoc:
      method find_one_for (line 95) | def find_one_for(filter)  #:nodoc:
      method each_column_with_attribute (line 99) | def each_column_with_attribute  #:nodoc:
      method csv_export_icon (line 106) | def csv_export_icon #:nodoc:
      method pagination_panel (line 115) | def pagination_panel(number_of_columns, hide_csv_button)  #:nodoc:
      method caption (line 137) | def caption(kaption)
      method action_column (line 158) | def action_column(opts = {}, &block)
      method column (line 304) | def column(opts = {}, &block)
      method get_model_from_associations (line 465) | def get_model_from_associations(model, assocs) # :nodoc:
      method row_attributes (line 486) | def row_attributes(&block)
      method after_row (line 492) | def after_row(&block)
      method before_row (line 498) | def before_row(&block)
      method replace_row (line 504) | def replace_row(&block)
      method last_row (line 510) | def last_row(&block)
      method blank_slate (line 519) | def blank_slate(opts = nil, &block)
      method get_row_attributes (line 529) | def get_row_attributes(ar_object) #:nodoc:
      method no_filter_needed? (line 542) | def no_filter_needed?   #:nodoc:
      method no_filter_needed_in_main_table? (line 546) | def no_filter_needed_in_main_table?   #:nodoc:
      method base_link_for_filter (line 550) | def base_link_for_filter(controller, extra_parameters = {})   #:nodoc:
      method link_for_export (line 570) | def link_for_export(controller, format, extra_parameters = {})   #:n...
      method column_link (line 581) | def column_link(column, direction, params, extra_parameters = {})   ...
      method filter_columns (line 610) | def filter_columns(method_name = nil) #:nodoc:
      method omit_empty_query (line 614) | def omit_empty_query(url) #:nodoc:

FILE: lib/wice/helpers/bs_calendar_helpers.rb
  type Wice (line 1) | module Wice #:nodoc:
    type BsCalendarHelpers (line 2) | module BsCalendarHelpers #:nodoc:
      class CalendarData (line 5) | class CalendarData #:nodoc:
      function date_calendar_bs (line 19) | def date_calendar_bs(calendar_data)  #:nodoc:
      function prepare_data_for_bscalendar (line 59) | def prepare_data_for_bscalendar(options)  #:nodoc:

FILE: lib/wice/helpers/js_calendar_helpers.rb
  type Wice (line 1) | module Wice #:nodoc:
    type JsCalendarHelpers (line 2) | module JsCalendarHelpers #:nodoc:
      class CalendarData (line 5) | class CalendarData
      function date_calendar_jquery (line 20) | def date_calendar_jquery(calendar_data)  #:nodoc:
      function prepare_data_for_calendar (line 67) | def prepare_data_for_calendar(options)  #:nodoc:

FILE: lib/wice/helpers/wice_grid_misc_view_helpers.rb
  type Wice (line 1) | module Wice
    type GridViewHelper (line 4) | module GridViewHelper
      function dump_filter_parameters_as_hidden_fields (line 9) | def dump_filter_parameters_as_hidden_fields(grid)
      function filter_state_as_hash (line 25) | def filter_state_as_hash(grid)
      function filter_and_order_state_as_hash (line 33) | def filter_and_order_state_as_hash(grid)
      function dump_state (line 44) | def dump_state(grid)  #:nodoc:
      function scaffolded_grid (line 51) | def scaffolded_grid(grid_obj, opts = {}) #:nodoc:

FILE: lib/wice/helpers/wice_grid_serialized_queries_view_helpers.rb
  type Wice (line 1) | module Wice
    type GridViewHelper (line 2) | module GridViewHelper
      function saved_queries_panel (line 8) | def saved_queries_panel(grid, opts = {})
      function saved_queries_list (line 51) | def saved_queries_list(grid_name, saved_query = nil, extra_parameter...

FILE: lib/wice/helpers/wice_grid_view_helpers.rb
  type Wice (line 1) | module Wice
    type GridViewHelper (line 2) | module GridViewHelper
      function grid (line 70) | def grid(grid, opts = {}, &block)
      function define_grid (line 82) | def define_grid(grid, opts = {}, &block)
      function render_grid (line 136) | def render_grid(grid)
      function generate_blank_slate (line 146) | def generate_blank_slate(grid, rendering) #:nodoc:
      function call_block (line 164) | def call_block(block, ar, extra_argument = nil)  #:nodoc:
      function get_row_content (line 168) | def get_row_content(rendering, ar, sorting_dependant_row_cycling) #:...
      function grid_html (line 219) | def grid_html(grid, options, rendering, reuse_last_column_for_filter...
      function hide_show_icon (line 521) | def hide_show_icon(_filter_row_id, _grid, filter_shown, no_filter_ro...
      function reset_submit_buttons (line 546) | def reset_submit_buttons(options, grid, _rendering)  #:nodoc:
      function grid_filter (line 571) | def grid_filter(grid, filter_key)
      function grid_csv (line 589) | def grid_csv(grid, rendering) #:nodoc:
      function pagination_panel_content (line 615) | def pagination_panel_content(grid, extra_request_parameters, allow_s...
      function show_all_link (line 633) | def show_all_link(collection_total_entries, parameters, _grid_name) ...
      function back_to_pagination_link (line 648) | def back_to_pagination_link(parameters, grid_name) #:nodoc:
      function pagination_info (line 660) | def pagination_info(grid, allow_showing_all_records)  #:nodoc:

FILE: lib/wice/kaminari_monkey_patching.rb
  type Kaminari (line 2) | module Kaminari #:nodoc:
    type Helpers (line 3) | module Helpers #:nodoc:
      class Tag (line 4) | class Tag #:nodoc:
        method page_url_for (line 5) | def page_url_for(page) #:nodoc:

FILE: lib/wice/table_column_matrix.rb
  type Wice (line 1) | module Wice
    class TableColumnMatrix (line 4) | class TableColumnMatrix < Hash #:nodoc:
      method initialize (line 12) | def initialize  #:nodoc:
      method add_condition (line 19) | def add_condition(column, conditions)
      method conditions (line 24) | def conditions
      method default_model_class= (line 29) | def default_model_class=(model)  #:nodoc:
      method [] (line 36) | def [](model)  #:nodoc:
      method get_column_by_model_class_and_column_name (line 41) | def get_column_by_model_class_and_column_name(model_class, column_na...
      method get_column_in_default_model_class_by_column_name (line 45) | def get_column_in_default_model_class_by_column_name(column_name)  #...
      method init_columns_of_table (line 53) | def init_columns_of_table(model) #:nodoc:

FILE: lib/wice/wice_grid_controller.rb
  type Wice (line 1) | module Wice
    type Controller (line 2) | module Controller #:nodoc:
      function included (line 3) | def self.included(base) #:nodoc:
      type ClassMethods (line 7) | module ClassMethods #:nodoc:
        function save_wice_grid_queries (line 10) | def save_wice_grid_queries
      function initialize_grid (line 68) | def initialize_grid(klass, opts = {})
      function export_grid_if_requested (line 108) | def export_grid_if_requested(opts = {})
      function wice_grid_custom_filter_params (line 138) | def wice_grid_custom_filter_params(opts = {})
      function get_output_encoding (line 166) | def get_output_encoding(csv_encoding)

FILE: lib/wice/wice_grid_core_ext.rb
  type Wice (line 1) | module Wice
    type WgHash (line 2) | module WgHash #:nodoc:
      function deep_clone (line 6) | def deep_clone(hash)  #:nodoc:
      function add_or_append_class_value! (line 19) | def add_or_append_class_value!(hash, klass_value, prepend = false) #...
      function make_hash (line 42) | def make_hash(key, value) #:nodoc:
      function rec_merge (line 49) | def rec_merge(hash, other)  #:nodoc:
      function parameter_names_and_values (line 69) | def parameter_names_and_values(hash, initial = []) #:nodoc:
      function recursively_gather_finite_non_hash_values_with_key_path (line 80) | def recursively_gather_finite_non_hash_values_with_key_path(hash, re...
    type WgEnumerable (line 92) | module WgEnumerable #:nodoc:
      function all_items_are_of_class (line 94) | def self.all_items_are_of_class(enumerable, klass)  #:nodoc:
    type WgArray (line 100) | module WgArray #:nodoc:
      function to_parameter_name (line 103) | def self.to_parameter_name(array) #:nodoc:
  type ActionView (line 112) | module ActionView #:nodoc:
    type Helpers (line 113) | module Helpers #:nodoc:
      type TagHelper (line 114) | module TagHelper #:nodoc:
        function public_tag_options (line 115) | def public_tag_options(options, escape = true) #:nodoc:
  type WGObjectExtensions (line 126) | module WGObjectExtensions #:nodoc:
    function deep_send (line 129) | def deep_send(*messages)  #:nodoc:
  class Object (line 143) | class Object #:nodoc:

FILE: lib/wice/wice_grid_misc.rb
  type Wice (line 1) | module Wice
    function assoc_list_to_hash (line 7) | def assoc_list_to_hash(assocs) #:nodoc:
    function build_includes (line 20) | def build_includes(existing_includes, new_assocs) #:nodoc:
    function build_includes_int (line 43) | def build_includes_int(includes, assocs) #:nodoc:
    function build_includes_includes_is_hash (line 52) | def build_includes_includes_is_hash(includes, assocs) #:nodoc:
    function build_includes_includes_is_array (line 79) | def build_includes_includes_is_array(includes, assocs) #:nodoc:
    function validate_query_model (line 124) | def validate_query_model(query_store_model)  #:nodoc:
    function get_query_store_model (line 136) | def get_query_store_model #:nodoc:
    function get_string_matching_operators (line 144) | def get_string_matching_operators(model)   #:nodoc:
    function deprecated_call (line 153) | def deprecated_call(old_name, new_name, opts) #:nodoc:
    function log (line 161) | def log(message) #:nodoc:
    type NlMessage (line 166) | module NlMessage #:nodoc:
      function [] (line 168) | def [](key) #:nodoc:
    type ConfigurationProvider (line 174) | module ConfigurationProvider #:nodoc:
      function value_for (line 176) | def value_for(key, strict: true) #:nodoc:
    type Defaults (line 191) | module Defaults  #:nodoc:
    type ExceptionsMixin (line 194) | module ExceptionsMixin  #:nodoc:
      function initialize (line 195) | def initialize(str)  #:nodoc:
    class WiceGridArgumentError (line 199) | class WiceGridArgumentError < ArgumentError #:nodoc:
    class WiceGridException (line 202) | class WiceGridException < Exception #:nodoc:
    class WiceGridMissingConfigurationConstantException (line 205) | class WiceGridMissingConfigurationConstantException < Exception #:nodoc:

FILE: lib/wice/wice_grid_serialized_queries_controller.rb
  type Wice (line 1) | module Wice
    function define_routes (line 9) | def define_routes(map, controller)
    type SerializedQueriesControllerMixin (line 22) | module SerializedQueriesControllerMixin   #:nodoc:
      function delete_saved_query (line 23) | def delete_saved_query  #:nodoc:
      function create_saved_query (line 39) | def create_saved_query  #:nodoc:
      function extra (line 66) | def extra #:nodoc:
      function render_asyns_result (line 72) | def render_asyns_result #:nodoc:
      function init (line 80) | def init  #:nodoc:

FILE: lib/wice/wice_grid_serialized_query.rb
  class WiceGridSerializedQuery (line 1) | class WiceGridSerializedQuery < ActiveRecord::Base  #:nodoc:
    method list (line 9) | def self.list(name, _controller)

FILE: lib/wice/wice_grid_spreadsheet.rb
  type Wice (line 3) | module Wice
    class Spreadsheet (line 4) | class Spreadsheet  #:nodoc:
      method initialize (line 9) | def initialize(name, field_separator, encoding = nil)  #:nodoc:
      method << (line 15) | def << (row)  #:nodoc:

FILE: lib/wice_grid.rb
  type Wice (line 28) | module Wice
    function on_action_view_load (line 30) | def self.on_action_view_load #:nodoc:
    class WiceGridEngine (line 47) | class WiceGridEngine < ::Rails::Engine #:nodoc:
    class WiceGrid (line 69) | class WiceGrid
      method initialize (line 77) | def initialize(klass_or_relation, controller, opts = {})  #:nodoc:
      method with_paginated_resultset (line 180) | def with_paginated_resultset(&callback)
      method with_resultset (line 187) | def with_resultset(&callback)
      method fix_facebook_bug (line 191) | def fix_facebook_bug
      method process_loading_query (line 204) | def process_loading_query #:nodoc:
      method process_params (line 231) | def process_params  #:nodoc:
      method declare_column (line 239) | def declare_column(
      method form_ar_options (line 287) | def form_ar_options(opts = {})  #:nodoc:
      method add_references (line 353) | def add_references(relation) #:nodoc:
      method apply_sort_by (line 362) | def apply_sort_by(relation)
      method read (line 372) | def read  #:nodoc:
      method filter_params (line 414) | def filter_params(view_column)  #:nodoc:
      method resultset (line 423) | def resultset  #:nodoc:
      method each (line 428) | def each   #:nodoc:
      method ordered_by? (line 436) | def ordered_by?(column)
      method ordered_by (line 445) | def ordered_by  #:nodoc:
      method order_direction (line 449) | def order_direction  #:nodoc:
      method filtering_on? (line 453) | def filtering_on?  #:nodoc:
      method filtered_by (line 457) | def filtered_by  #:nodoc:
      method filtered_by? (line 461) | def filtered_by?(view_column)  #:nodoc:
      method get_state_as_parameter_value_pairs (line 465) | def get_state_as_parameter_value_pairs(including_saved_query_request...
      method count (line 493) | def count  #:nodoc:
      method do_count (line 498) | def do_count #:nodoc:
      method empty? (line 510) | def empty?  #:nodoc:
      method distinct_values_for_column (line 515) | def distinct_values_for_column(column)  #:nodoc:
      method distinct_values_for_column_in_resultset (line 521) | def distinct_values_for_column_in_resultset(messages)  #:nodoc:
      method output_csv? (line 539) | def output_csv? #:nodoc:
      method output_html? (line 543) | def output_html? #:nodoc:
      method all_record_mode? (line 547) | def all_record_mode? #:nodoc:
      method dump_status (line 551) | def dump_status #:nodoc:
      method all_pages_records (line 558) | def all_pages_records
      method current_page_records (line 564) | def current_page_records
      method invoke_resultset_callback (line 571) | def invoke_resultset_callback(callback, argument) #:nodoc:
      method invoke_resultset_callbacks (line 580) | def invoke_resultset_callbacks #:nodoc:
      method get_custom_order_reference (line 586) | def get_custom_order_reference
      method arel_column_reference (line 605) | def arel_column_reference(col_name)  #:nodoc:
      method complete_column_name (line 615) | def complete_column_name(col_name)
      method params (line 620) | def params  #:nodoc:
      method this_grid_params (line 624) | def this_grid_params  #:nodoc:
      method resultset_without_paging_without_user_filters (line 628) | def resultset_without_paging_without_user_filters  #:nodoc:
      method resultset_without_paging_with_user_filters (line 656) | def resultset_without_paging_with_user_filters  #:nodoc:
      method active_relation_for_resultset_without_paging_with_user_filters (line 660) | def active_relation_for_resultset_without_paging_with_user_filters  ...
      method load_query (line 679) | def load_query(query_id) #:nodoc:
      method use_default_or_unscoped (line 686) | def use_default_or_unscoped #:nodoc:
    type GridTools (line 697) | module GridTools   #:nodoc:
      function special_value (line 699) | def special_value(str)   #:nodoc:
      function params_2_datetime (line 704) | def params_2_datetime(par)   #:nodoc:
      function params_2_date (line 715) | def params_2_date(par)   #:nodoc:

FILE: spec/features/saved_queries_request_spec.rb
  function delete_all_saved_queries (line 9) | def delete_all_saved_queries(context)

FILE: spec/features/shared.rb
  function set_datepicker (line 483) | def set_datepicker(context, picker, year, month, day)

FILE: spec/support/active_record.rb
  class Dummy (line 7) | class Dummy < ActiveRecord::Base

FILE: spec/support/download_helper.rb
  type DownloadHelpers (line 1) | module DownloadHelpers
    function downloads (line 7) | def downloads
    function download (line 11) | def download
    function download_content (line 15) | def download_content
    function wait_for_download (line 20) | def wait_for_download
    function downloaded? (line 26) | def downloaded?
    function downloading? (line 30) | def downloading?
    function clear_downloads (line 34) | def clear_downloads

FILE: spec/support/test_app/app/controllers/action_column_controller.rb
  class ActionColumnController (line 2) | class ActionColumnController < ::ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/adding_rows_controller.rb
  class AddingRowsController (line 2) | class AddingRowsController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/all_records_controller.rb
  class AllRecordsController (line 2) | class AllRecordsController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/application_controller.rb
  class ApplicationController (line 2) | class ApplicationController < ActionController::Base
    method init_current_example_map (line 10) | def init_current_example_map
    method init_example_map (line 22) | def init_example_map

FILE: spec/support/test_app/app/controllers/auto_reloads2_controller.rb
  class AutoReloads2Controller (line 2) | class AutoReloads2Controller < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/auto_reloads3_controller.rb
  class AutoReloads3Controller (line 2) | class AutoReloads3Controller < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/auto_reloads_controller.rb
  class AutoReloadsController (line 2) | class AutoReloadsController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/basics1_controller.rb
  class Basics1Controller (line 2) | class Basics1Controller < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/basics2_controller.rb
  class Basics2Controller (line 2) | class Basics2Controller < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/basics3_controller.rb
  class Basics3Controller (line 2) | class Basics3Controller < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/basics4_controller.rb
  class Basics4Controller (line 2) | class Basics4Controller < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/basics5_controller.rb
  class Basics5Controller (line 2) | class Basics5Controller < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/basics6_controller.rb
  class Basics6Controller (line 2) | class Basics6Controller < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/blockless_column_definition_controller.rb
  class BlocklessColumnDefinitionController (line 2) | class BlocklessColumnDefinitionController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/buttons_controller.rb
  class ButtonsController (line 2) | class ButtonsController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/csv_and_detached_filters_controller.rb
  class CsvAndDetachedFiltersController (line 2) | class CsvAndDetachedFiltersController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/csv_export_controller.rb
  class CsvExportController (line 2) | class CsvExportController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/custom_filter_params_controller.rb
  class CustomFilterParamsController (line 2) | class CustomFilterParamsController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/custom_filters1_controller.rb
  class CustomFilters1Controller (line 2) | class CustomFilters1Controller < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/custom_filters2_controller.rb
  class CustomFilters2Controller (line 2) | class CustomFilters2Controller < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/custom_filters3_controller.rb
  class CustomFilters3Controller (line 2) | class CustomFilters3Controller < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/custom_filters4_controller.rb
  class CustomFilters4Controller (line 2) | class CustomFilters4Controller < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/custom_ordering_controller.rb
  class CustomOrderingController (line 2) | class CustomOrderingController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/custom_ordering_on_calculated_controller.rb
  class CustomOrderingOnCalculatedController (line 2) | class CustomOrderingOnCalculatedController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/custom_ordering_with_arel_controller.rb
  class CustomOrderingWithArelController (line 2) | class CustomOrderingWithArelController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/custom_ordering_with_proc_controller.rb
  class CustomOrderingWithProcController (line 2) | class CustomOrderingWithProcController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/custom_ordering_with_ruby_controller.rb
  class CustomOrderingWithRubyController (line 2) | class CustomOrderingWithRubyController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/dates_controller.rb
  class DatesController (line 2) | class DatesController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/detached_filters_controller.rb
  class DetachedFiltersController (line 2) | class DetachedFiltersController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/detached_filters_two_grids_controller.rb
  class DetachedFiltersTwoGridsController (line 2) | class DetachedFiltersTwoGridsController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/disable_all_filters_controller.rb
  class DisableAllFiltersController (line 2) | class DisableAllFiltersController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/hiding_checkboxes_in_action_column_controller.rb
  class HidingCheckboxesInActionColumnController (line 2) | class HidingCheckboxesInActionColumnController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/home_controller.rb
  class HomeController (line 2) | class HomeController < ApplicationController

FILE: spec/support/test_app/app/controllers/integration_with_application_view_controller.rb
  class IntegrationWithApplicationViewController (line 2) | class IntegrationWithApplicationViewController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/integration_with_forms_controller.rb
  class IntegrationWithFormsController (line 2) | class IntegrationWithFormsController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/joining_tables_controller.rb
  class JoiningTablesController (line 2) | class JoiningTablesController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/localization_controller.rb
  class LocalizationController (line 2) | class LocalizationController < ApplicationController
    method init_locale (line 5) | def init_locale
    method index (line 13) | def index

FILE: spec/support/test_app/app/controllers/many_grids_on_page_controller.rb
  class ManyGridsOnPageController (line 2) | class ManyGridsOnPageController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/negation_controller.rb
  class NegationController (line 2) | class NegationController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/no_records_controller.rb
  class NoRecordsController (line 2) | class NoRecordsController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/null_values_controller.rb
  class NullValuesController (line 2) | class NullValuesController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/numeric_filters_controller.rb
  class NumericFiltersController (line 2) | class NumericFiltersController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/queries_controller.rb
  class QueriesController (line 2) | class QueriesController < ApplicationController

FILE: spec/support/test_app/app/controllers/resultset_processings2_controller.rb
  class ResultsetProcessings2Controller (line 2) | class ResultsetProcessings2Controller < ApplicationController
    method index (line 5) | def index
    method process_records (line 24) | def process_records(active_relation)

FILE: spec/support/test_app/app/controllers/resultset_processings_controller.rb
  class ResultsetProcessingsController (line 2) | class ResultsetProcessingsController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/saved_queries_controller.rb
  class SavedQueriesController (line 2) | class SavedQueriesController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/styling_controller.rb
  class StylingController (line 2) | class StylingController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/tasks_controller.rb
  class TasksController (line 2) | class TasksController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/two_associations_controller.rb
  class TwoAssociationsController (line 2) | class TwoAssociationsController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/upper_pagination_panel_controller.rb
  class UpperPaginationPanelController (line 2) | class UpperPaginationPanelController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/controllers/when_filtered_controller.rb
  class WhenFilteredController (line 2) | class WhenFilteredController < ApplicationController
    method index (line 3) | def index

FILE: spec/support/test_app/app/helpers/application_helper.rb
  type ApplicationHelper (line 2) | module ApplicationHelper
    function show_code (line 5) | def show_code
    function code_chunks (line 29) | def code_chunks
    function code_for (line 43) | def code_for(filename, filename_for_view, filetype = :ruby)
    function each_example (line 49) | def each_example
    function current_page_title (line 57) | def current_page_title
    function previous_next_example_urls (line 65) | def previous_next_example_urls

FILE: spec/support/test_app/app/models/company.rb
  class Company (line 2) | class Company < ActiveRecord::Base

FILE: spec/support/test_app/app/models/populate.rb
  type Populate (line 2) | module Populate
    function me (line 3) | def self.me

FILE: spec/support/test_app/app/models/priority.rb
  class Priority (line 2) | class Priority < ActiveRecord::Base
    method urgent (line 7) | def self.urgent

FILE: spec/support/test_app/app/models/project.rb
  class Project (line 2) | class Project < ActiveRecord::Base

FILE: spec/support/test_app/app/models/project_role.rb
  class ProjectRole (line 2) | class ProjectRole < ActiveRecord::Base

FILE: spec/support/test_app/app/models/status.rb
  class Status (line 2) | class Status < ActiveRecord::Base
    method number_of_vowels (line 7) | def number_of_vowels

FILE: spec/support/test_app/app/models/task.rb
  class Task (line 2) | class Task < ActiveRecord::Base

FILE: spec/support/test_app/app/models/to_dropdown_mixin.rb
  type ToDropdownMixin (line 2) | module ToDropdownMixin
    function included (line 3) | def self.included(base)
    type ClassMethods (line 7) | module ClassMethods
      function to_dropdown (line 8) | def to_dropdown
    function to_option (line 13) | def to_option

FILE: spec/support/test_app/app/models/user.rb
  class User (line 2) | class User < ActiveRecord::Base

FILE: spec/support/test_app/app/models/user_project_participation.rb
  class UserProjectParticipation (line 2) | class UserProjectParticipation < ActiveRecord::Base

FILE: spec/support/test_app/app/models/version.rb
  class Version (line 2) | class Version < ActiveRecord::Base

FILE: spec/support/test_app/config/application.rb
  type Examples (line 21) | module Examples
    class TestApp (line 22) | class TestApp < Rails::Application

FILE: spec/support/test_app/db/migrate/20120224193505_create_tasks.rb
  class CreateTasks (line 2) | class CreateTasks < ActiveRecord::Migration
    method change (line 3) | def change

FILE: spec/support/test_app/db/migrate/20120224193517_create_users.rb
  class CreateUsers (line 2) | class CreateUsers < ActiveRecord::Migration
    method change (line 3) | def change

FILE: spec/support/test_app/db/migrate/20120224193522_create_projects.rb
  class CreateProjects (line 2) | class CreateProjects < ActiveRecord::Migration
    method change (line 3) | def change

FILE: spec/support/test_app/db/migrate/20120224193529_create_priorities.rb
  class CreatePriorities (line 2) | class CreatePriorities < ActiveRecord::Migration
    method change (line 3) | def change

FILE: spec/support/test_app/db/migrate/20120224193537_create_statuses.rb
  class CreateStatuses (line 2) | class CreateStatuses < ActiveRecord::Migration
    method change (line 3) | def change

FILE: spec/support/test_app/db/migrate/20120224193543_create_versions.rb
  class CreateVersions (line 2) | class CreateVersions < ActiveRecord::Migration
    method change (line 3) | def change

FILE: spec/support/test_app/db/migrate/20120224193550_create_project_roles.rb
  class CreateProjectRoles (line 2) | class CreateProjectRoles < ActiveRecord::Migration
    method change (line 3) | def change

FILE: spec/support/test_app/db/migrate/20120224193610_create_companies.rb
  class CreateCompanies (line 2) | class CreateCompanies < ActiveRecord::Migration
    method change (line 3) | def change

FILE: spec/support/test_app/db/migrate/20120224195351_create_user_project_participations.rb
  class CreateUserProjectParticipations (line 2) | class CreateUserProjectParticipations < ActiveRecord::Migration
    method change (line 3) | def change

FILE: spec/support/test_app/db/migrate/20120224195521_add_tasks_users.rb
  class AddTasksUsers (line 2) | class AddTasksUsers < ActiveRecord::Migration
    method change (line 3) | def change

FILE: spec/support/test_app/db/migrate/20120610091944_create_wice_grid_serialized_queries.rb
  class CreateWiceGridSerializedQueries (line 2) | class CreateWiceGridSerializedQueries < ::ActiveRecord::Migration
    method change (line 3) | def change

FILE: spec/support/test_app/lib/ar_fixtures.rb
  class ActiveRecord::Base (line 3) | class ActiveRecord::Base
    method dump_to_file (line 8) | def dump_to_file(path = nil, limit = nil)
    method load_from_file (line 16) | def load_from_file(path = nil)
    method to_fixture (line 48) | def to_fixture(limit = nil)
    method habtm_to_fixture (line 60) | def habtm_to_fixture
    method to_skeleton (line 85) | def to_skeleton
    method write_file (line 94) | def write_file(path, content) # :nodoc:

FILE: spec/support/test_app/lib/tasks/ar_fixtures.rake
  function env_or_raise (line 4) | def env_or_raise(var_name, human_name)
  function model_or_raise (line 12) | def model_or_raise
  function limit_or_nil_string (line 16) | def limit_or_nil_string

FILE: spec/support/test_app/vendor/javascript/@hotwired--stimulus.js
  class EventListener (line 1) | class EventListener{constructor(e,t,r){this.eventTarget=e;this.eventName...
    method constructor (line 1) | constructor(e,t,r){this.eventTarget=e;this.eventName=t;this.eventOptio...
    method connect (line 1) | connect(){this.eventTarget.addEventListener(this.eventName,this,this.e...
    method disconnect (line 1) | disconnect(){this.eventTarget.removeEventListener(this.eventName,this,...
    method bindingConnected (line 1) | bindingConnected(e){this.unorderedBindings.add(e)}
    method bindingDisconnected (line 1) | bindingDisconnected(e){this.unorderedBindings.delete(e)}
    method handleEvent (line 1) | handleEvent(e){const t=extendEvent(e);for(const e of this.bindings){if...
    method hasBindings (line 1) | hasBindings(){return this.unorderedBindings.size>0}
    method bindings (line 1) | get bindings(){return Array.from(this.unorderedBindings).sort(((e,t)=>...
  function extendEvent (line 1) | function extendEvent(e){if("immediatePropagationStopped"in e)return e;{c...
  class Dispatcher (line 1) | class Dispatcher{constructor(e){this.application=e;this.eventListenerMap...
    method constructor (line 1) | constructor(e){this.application=e;this.eventListenerMaps=new Map;this....
    method start (line 1) | start(){if(!this.started){this.started=true;this.eventListeners.forEac...
    method stop (line 1) | stop(){if(this.started){this.started=false;this.eventListeners.forEach...
    method eventListeners (line 1) | get eventListeners(){return Array.from(this.eventListenerMaps.values()...
    method bindingConnected (line 1) | bindingConnected(e){this.fetchEventListenerForBinding(e).bindingConnec...
    method bindingDisconnected (line 1) | bindingDisconnected(e,t=false){this.fetchEventListenerForBinding(e).bi...
    method handleError (line 1) | handleError(e,t,r={}){this.application.handleError(e,`Error ${t}`,r)}
    method clearEventListenersForBinding (line 1) | clearEventListenersForBinding(e){const t=this.fetchEventListenerForBin...
    method removeMappedEventListenerFor (line 1) | removeMappedEventListenerFor(e){const{eventTarget:t,eventName:r,eventO...
    method fetchEventListenerForBinding (line 1) | fetchEventListenerForBinding(e){const{eventTarget:t,eventName:r,eventO...
    method fetchEventListener (line 1) | fetchEventListener(e,t,r){const s=this.fetchEventListenerMapForEventTa...
    method createEventListener (line 1) | createEventListener(e,t,r){const s=new EventListener(e,t,r);this.start...
    method fetchEventListenerMapForEventTarget (line 1) | fetchEventListenerMapForEventTarget(e){let t=this.eventListenerMaps.ge...
    method cacheKey (line 1) | cacheKey(e,t){const r=[e];Object.keys(t).sort().forEach((e=>{r.push(`$...
  method stop (line 1) | stop({event:e,value:t}){t&&e.stopPropagation();return true}
  method prevent (line 1) | prevent({event:e,value:t}){t&&e.preventDefault();return true}
  method self (line 1) | self({event:e,value:t,element:r}){return!t||r===e.target}
  function parseActionDescriptorString (line 1) | function parseActionDescriptorString(e){const r=e.trim();const s=r.match...
  function parseEventTarget (line 1) | function parseEventTarget(e){return"window"==e?window:"document"==e?docu...
  function parseEventOptions (line 1) | function parseEventOptions(e){return e.split(":").reduce(((e,t)=>Object....
  function stringifyEventTarget (line 1) | function stringifyEventTarget(e){return e==window?"window":e==document?"...
  function camelize (line 1) | function camelize(e){return e.replace(/(?:[_-])([a-z0-9])/g,((e,t)=>t.to...
  function namespaceCamelize (line 1) | function namespaceCamelize(e){return camelize(e.replace(/--/g,"-").repla...
  function capitalize (line 1) | function capitalize(e){return e.charAt(0).toUpperCase()+e.slice(1)}
  function dasherize (line 1) | function dasherize(e){return e.replace(/([A-Z])/g,((e,t)=>`-${t.toLowerC...
  function tokenize (line 1) | function tokenize(e){return e.match(/[^\s]+/g)||[]}
  function isSomething (line 1) | function isSomething(e){return null!==e&&void 0!==e}
  function hasProperty (line 1) | function hasProperty(e,t){return Object.prototype.hasOwnProperty.call(e,t)}
  class Action (line 1) | class Action{constructor(e,t,r,s){this.element=e;this.index=t;this.event...
    method constructor (line 1) | constructor(e,t,r,s){this.element=e;this.index=t;this.eventTarget=r.ev...
    method forToken (line 1) | static forToken(e,t){return new this(e.element,e.index,parseActionDesc...
    method toString (line 1) | toString(){const e=this.keyFilter?`.${this.keyFilter}`:"";const t=this...
    method shouldIgnoreKeyboardEvent (line 1) | shouldIgnoreKeyboardEvent(e){if(!this.keyFilter)return false;const t=t...
    method shouldIgnoreMouseEvent (line 1) | shouldIgnoreMouseEvent(e){if(!this.keyFilter)return false;const t=[thi...
    method params (line 1) | get params(){const e={};const t=new RegExp(`^data-${this.identifier}-(...
    method eventTargetName (line 1) | get eventTargetName(){return stringifyEventTarget(this.eventTarget)}
    method keyMappings (line 1) | get keyMappings(){return this.schema.keyMappings}
    method keyFilterDissatisfied (line 1) | keyFilterDissatisfied(e,t){const[s,n,i,o]=r.map((e=>t.includes(e)));re...
  function getDefaultEventNameForElement (line 1) | function getDefaultEventNameForElement(e){const t=e.tagName.toLowerCase(...
  function error (line 1) | function error(e){throw new Error(e)}
  function typecast (line 1) | function typecast(e){try{return JSON.parse(e)}catch(t){return e}}
  class Binding (line 1) | class Binding{constructor(e,t){this.context=e;this.action=t}get index(){...
    method constructor (line 1) | constructor(e,t){this.context=e;this.action=t}
    method index (line 1) | get index(){return this.action.index}
    method eventTarget (line 1) | get eventTarget(){return this.action.eventTarget}
    method eventOptions (line 1) | get eventOptions(){return this.action.eventOptions}
    method identifier (line 1) | get identifier(){return this.context.identifier}
    method handleEvent (line 1) | handleEvent(e){const t=this.prepareActionEvent(e);this.willBeInvokedBy...
    method eventName (line 1) | get eventName(){return this.action.eventName}
    method method (line 1) | get method(){const e=this.controller[this.methodName];if("function"==t...
    method applyEventModifiers (line 1) | applyEventModifiers(e){const{element:t}=this.action;const{actionDescri...
    method prepareActionEvent (line 1) | prepareActionEvent(e){return Object.assign(e,{params:this.action.param...
    method invokeWithEvent (line 1) | invokeWithEvent(e){const{target:t,currentTarget:r}=e;try{this.method.c...
    method willBeInvokedByEvent (line 1) | willBeInvokedByEvent(e){const t=e.target;return!(e instanceof Keyboard...
    method controller (line 1) | get controller(){return this.context.controller}
    method methodName (line 1) | get methodName(){return this.action.methodName}
    method element (line 1) | get element(){return this.scope.element}
    method scope (line 1) | get scope(){return this.context.scope}
  class ElementObserver (line 1) | class ElementObserver{constructor(e,t){this.mutationObserverInit={attrib...
    method constructor (line 1) | constructor(e,t){this.mutationObserverInit={attributes:true,childList:...
    method start (line 1) | start(){if(!this.started){this.started=true;this.mutationObserver.obse...
    method pause (line 1) | pause(e){if(this.started){this.mutationObserver.disconnect();this.star...
    method stop (line 1) | stop(){if(this.started){this.mutationObserver.takeRecords();this.mutat...
    method refresh (line 1) | refresh(){if(this.started){const e=new Set(this.matchElementsInTree())...
    method processMutations (line 1) | processMutations(e){if(this.started)for(const t of e)this.processMutat...
    method processMutation (line 1) | processMutation(e){if("attributes"==e.type)this.processAttributeChange...
    method processAttributeChange (line 1) | processAttributeChange(e,t){this.elements.has(e)?this.delegate.element...
    method processRemovedNodes (line 1) | processRemovedNodes(e){for(const t of Array.from(e)){const e=this.elem...
    method processAddedNodes (line 1) | processAddedNodes(e){for(const t of Array.from(e)){const e=this.elemen...
    method matchElement (line 1) | matchElement(e){return this.delegate.matchElement(e)}
    method matchElementsInTree (line 1) | matchElementsInTree(e=this.element){return this.delegate.matchElements...
    method processTree (line 1) | processTree(e,t){for(const r of this.matchElementsInTree(e))t.call(thi...
    method elementFromNode (line 1) | elementFromNode(e){if(e.nodeType==Node.ELEMENT_NODE)return e}
    method elementIsActive (line 1) | elementIsActive(e){return e.isConnected==this.element.isConnected&&thi...
    method addElement (line 1) | addElement(e){if(!this.elements.has(e)&&this.elementIsActive(e)){this....
    method removeElement (line 1) | removeElement(e){if(this.elements.has(e)){this.elements.delete(e);this...
  class AttributeObserver (line 1) | class AttributeObserver{constructor(e,t,r){this.attributeName=t;this.del...
    method constructor (line 1) | constructor(e,t,r){this.attributeName=t;this.delegate=r;this.elementOb...
    method element (line 1) | get element(){return this.elementObserver.element}
    method selector (line 1) | get selector(){return`[${this.attributeName}]`}
    method start (line 1) | start(){this.elementObserver.start()}
    method pause (line 1) | pause(e){this.elementObserver.pause(e)}
    method stop (line 1) | stop(){this.elementObserver.stop()}
    method refresh (line 1) | refresh(){this.elementObserver.refresh()}
    method started (line 1) | get started(){return this.elementObserver.started}
    method matchElement (line 1) | matchElement(e){return e.hasAttribute(this.attributeName)}
    method matchElementsInTree (line 1) | matchElementsInTree(e){const t=this.matchElement(e)?[e]:[];const r=Arr...
    method elementMatched (line 1) | elementMatched(e){this.delegate.elementMatchedAttribute&&this.delegate...
    method elementUnmatched (line 1) | elementUnmatched(e){this.delegate.elementUnmatchedAttribute&&this.dele...
    method elementAttributeChanged (line 1) | elementAttributeChanged(e,t){this.delegate.elementAttributeValueChange...
  function add (line 1) | function add(e,t,r){fetch(e,t).add(r)}
  function del (line 1) | function del(e,t,r){fetch(e,t).delete(r);prune(e,t)}
  function fetch (line 1) | function fetch(e,t){let r=e.get(t);if(!r){r=new Set;e.set(t,r)}return r}
  function prune (line 1) | function prune(e,t){const r=e.get(t);null!=r&&0==r.size&&e.delete(t)}
  class Multimap (line 1) | class Multimap{constructor(){this.valuesByKey=new Map}get keys(){return ...
    method constructor (line 1) | constructor(){this.valuesByKey=new Map}
    method keys (line 1) | get keys(){return Array.from(this.valuesByKey.keys())}
    method values (line 1) | get values(){const e=Array.from(this.valuesByKey.values());return e.re...
    method size (line 1) | get size(){const e=Array.from(this.valuesByKey.values());return e.redu...
    method add (line 1) | add(e,t){add(this.valuesByKey,e,t)}
    method delete (line 1) | delete(e,t){del(this.valuesByKey,e,t)}
    method has (line 1) | has(e,t){const r=this.valuesByKey.get(e);return null!=r&&r.has(t)}
    method hasKey (line 1) | hasKey(e){return this.valuesByKey.has(e)}
    method hasValue (line 1) | hasValue(e){const t=Array.from(this.valuesByKey.values());return t.som...
    method getValuesForKey (line 1) | getValuesForKey(e){const t=this.valuesByKey.get(e);return t?Array.from...
    method getKeysForValue (line 1) | getKeysForValue(e){return Array.from(this.valuesByKey).filter((([t,r])...
  class IndexedMultimap (line 1) | class IndexedMultimap extends Multimap{constructor(){super();this.keysBy...
    method constructor (line 1) | constructor(){super();this.keysByValue=new Map}
    method values (line 1) | get values(){return Array.from(this.keysByValue.keys())}
    method add (line 1) | add(e,t){super.add(e,t);add(this.keysByValue,t,e)}
    method delete (line 1) | delete(e,t){super.delete(e,t);del(this.keysByValue,t,e)}
    method hasValue (line 1) | hasValue(e){return this.keysByValue.has(e)}
    method getKeysForValue (line 1) | getKeysForValue(e){const t=this.keysByValue.get(e);return t?Array.from...
  class SelectorObserver (line 1) | class SelectorObserver{constructor(e,t,r,s){this._selector=t;this.detail...
    method constructor (line 1) | constructor(e,t,r,s){this._selector=t;this.details=s;this.elementObser...
    method started (line 1) | get started(){return this.elementObserver.started}
    method selector (line 1) | get selector(){return this._selector}
    method selector (line 1) | set selector(e){this._selector=e;this.refresh()}
    method start (line 1) | start(){this.elementObserver.start()}
    method pause (line 1) | pause(e){this.elementObserver.pause(e)}
    method stop (line 1) | stop(){this.elementObserver.stop()}
    method refresh (line 1) | refresh(){this.elementObserver.refresh()}
    method element (line 1) | get element(){return this.elementObserver.element}
    method matchElement (line 1) | matchElement(e){const{selector:t}=this;if(t){const r=e.matches(t);retu...
    method matchElementsInTree (line 1) | matchElementsInTree(e){const{selector:t}=this;if(t){const r=this.match...
    method elementMatched (line 1) | elementMatched(e){const{selector:t}=this;t&&this.selectorMatched(e,t)}
    method elementUnmatched (line 1) | elementUnmatched(e){const t=this.matchesByElement.getKeysForValue(e);f...
    method elementAttributeChanged (line 1) | elementAttributeChanged(e,t){const{selector:r}=this;if(r){const t=this...
    method selectorMatched (line 1) | selectorMatched(e,t){this.delegate.selectorMatched(e,t,this.details);t...
    method selectorUnmatched (line 1) | selectorUnmatched(e,t){this.delegate.selectorUnmatched(e,t,this.detail...
  class StringMapObserver (line 1) | class StringMapObserver{constructor(e,t){this.element=e;this.delegate=t;...
    method constructor (line 1) | constructor(e,t){this.element=e;this.delegate=t;this.started=false;thi...
    method start (line 1) | start(){if(!this.started){this.started=true;this.mutationObserver.obse...
    method stop (line 1) | stop(){if(this.started){this.mutationObserver.takeRecords();this.mutat...
    method refresh (line 1) | refresh(){if(this.started)for(const e of this.knownAttributeNames)this...
    method processMutations (line 1) | processMutations(e){if(this.started)for(const t of e)this.processMutat...
    method processMutation (line 1) | processMutation(e){const t=e.attributeName;t&&this.refreshAttribute(t,...
    method refreshAttribute (line 1) | refreshAttribute(e,t){const r=this.delegate.getStringMapKeyForAttribut...
    method stringMapKeyAdded (line 1) | stringMapKeyAdded(e,t){this.delegate.stringMapKeyAdded&&this.delegate....
    method stringMapValueChanged (line 1) | stringMapValueChanged(e,t,r){this.delegate.stringMapValueChanged&&this...
    method stringMapKeyRemoved (line 1) | stringMapKeyRemoved(e,t,r){this.delegate.stringMapKeyRemoved&&this.del...
    method knownAttributeNames (line 1) | get knownAttributeNames(){return Array.from(new Set(this.currentAttrib...
    method currentAttributeNames (line 1) | get currentAttributeNames(){return Array.from(this.element.attributes)...
    method recordedAttributeNames (line 1) | get recordedAttributeNames(){return Array.from(this.stringMap.keys())}
  class TokenListObserver (line 1) | class TokenListObserver{constructor(e,t,r){this.attributeObserver=new At...
    method constructor (line 1) | constructor(e,t,r){this.attributeObserver=new AttributeObserver(e,t,th...
    method started (line 1) | get started(){return this.attributeObserver.started}
    method start (line 1) | start(){this.attributeObserver.start()}
    method pause (line 1) | pause(e){this.attributeObserver.pause(e)}
    method stop (line 1) | stop(){this.attributeObserver.stop()}
    method refresh (line 1) | refresh(){this.attributeObserver.refresh()}
    method element (line 1) | get element(){return this.attributeObserver.element}
    method attributeName (line 1) | get attributeName(){return this.attributeObserver.attributeName}
    method elementMatchedAttribute (line 1) | elementMatchedAttribute(e){this.tokensMatched(this.readTokensForElemen...
    method elementAttributeValueChanged (line 1) | elementAttributeValueChanged(e){const[t,r]=this.refreshTokensForElemen...
    method elementUnmatchedAttribute (line 1) | elementUnmatchedAttribute(e){this.tokensUnmatched(this.tokensByElement...
    method tokensMatched (line 1) | tokensMatched(e){e.forEach((e=>this.tokenMatched(e)))}
    method tokensUnmatched (line 1) | tokensUnmatched(e){e.forEach((e=>this.tokenUnmatched(e)))}
    method tokenMatched (line 1) | tokenMatched(e){this.delegate.tokenMatched(e);this.tokensByElement.add...
    method tokenUnmatched (line 1) | tokenUnmatched(e){this.delegate.tokenUnmatched(e);this.tokensByElement...
    method refreshTokensForElement (line 1) | refreshTokensForElement(e){const t=this.tokensByElement.getValuesForKe...
    method readTokensForElement (line 1) | readTokensForElement(e){const t=this.attributeName;const r=e.getAttrib...
  function parseTokenString (line 1) | function parseTokenString(e,t,r){return e.trim().split(/\s+/).filter((e=...
  function zip (line 1) | function zip(e,t){const r=Math.max(e.length,t.length);return Array.from(...
  function tokensAreEqual (line 1) | function tokensAreEqual(e,t){return e&&t&&e.index==t.index&&e.content==t...
  class ValueListObserver (line 1) | class ValueListObserver{constructor(e,t,r){this.tokenListObserver=new To...
    method constructor (line 1) | constructor(e,t,r){this.tokenListObserver=new TokenListObserver(e,t,th...
    method started (line 1) | get started(){return this.tokenListObserver.started}
    method start (line 1) | start(){this.tokenListObserver.start()}
    method stop (line 1) | stop(){this.tokenListObserver.stop()}
    method refresh (line 1) | refresh(){this.tokenListObserver.refresh()}
    method element (line 1) | get element(){return this.tokenListObserver.element}
    method attributeName (line 1) | get attributeName(){return this.tokenListObserver.attributeName}
    method tokenMatched (line 1) | tokenMatched(e){const{element:t}=e;const{value:r}=this.fetchParseResul...
    method tokenUnmatched (line 1) | tokenUnmatched(e){const{element:t}=e;const{value:r}=this.fetchParseRes...
    method fetchParseResultForToken (line 1) | fetchParseResultForToken(e){let t=this.parseResultsByToken.get(e);if(!...
    method fetchValuesByTokenForElement (line 1) | fetchValuesByTokenForElement(e){let t=this.valuesByTokenByElement.get(...
    method parseToken (line 1) | parseToken(e){try{const t=this.delegate.parseValueForToken(e);return{v...
  class BindingObserver (line 1) | class BindingObserver{constructor(e,t){this.context=e;this.delegate=t;th...
    method constructor (line 1) | constructor(e,t){this.context=e;this.delegate=t;this.bindingsByAction=...
    method start (line 1) | start(){if(!this.valueListObserver){this.valueListObserver=new ValueLi...
    method stop (line 1) | stop(){if(this.valueListObserver){this.valueListObserver.stop();delete...
    method element (line 1) | get element(){return this.context.element}
    method identifier (line 1) | get identifier(){return this.context.identifier}
    method actionAttribute (line 1) | get actionAttribute(){return this.schema.actionAttribute}
    method schema (line 1) | get schema(){return this.context.schema}
    method bindings (line 1) | get bindings(){return Array.from(this.bindingsByAction.values())}
    method connectAction (line 1) | connectAction(e){const t=new Binding(this.context,e);this.bindingsByAc...
    method disconnectAction (line 1) | disconnectAction(e){const t=this.bindingsByAction.get(e);if(t){this.bi...
    method disconnectAllActions (line 1) | disconnectAllActions(){this.bindings.forEach((e=>this.delegate.binding...
    method parseValueForToken (line 1) | parseValueForToken(e){const t=Action.forToken(e,this.schema);if(t.iden...
    method elementMatchedValue (line 1) | elementMatchedValue(e,t){this.connectAction(t)}
    method elementUnmatchedValue (line 1) | elementUnmatchedValue(e,t){this.disconnectAction(t)}
  class ValueObserver (line 1) | class ValueObserver{constructor(e,t){this.context=e;this.receiver=t;this...
    method constructor (line 1) | constructor(e,t){this.context=e;this.receiver=t;this.stringMapObserver...
    method start (line 1) | start(){this.stringMapObserver.start();this.invokeChangedCallbacksForD...
    method stop (line 1) | stop(){this.stringMapObserver.stop()}
    method element (line 1) | get element(){return this.context.element}
    method controller (line 1) | get controller(){return this.context.controller}
    method getStringMapKeyForAttribute (line 1) | getStringMapKeyForAttribute(e){if(e in this.valueDescriptorMap)return ...
    method stringMapKeyAdded (line 1) | stringMapKeyAdded(e,t){const r=this.valueDescriptorMap[t];this.hasValu...
    method stringMapValueChanged (line 1) | stringMapValueChanged(e,t,r){const s=this.valueDescriptorNameMap[t];if...
    method stringMapKeyRemoved (line 1) | stringMapKeyRemoved(e,t,r){const s=this.valueDescriptorNameMap[e];this...
    method invokeChangedCallbacksForDefaultValues (line 1) | invokeChangedCallbacksForDefaultValues(){for(const{key:e,name:t,defaul...
    method invokeChangedCallback (line 1) | invokeChangedCallback(e,t,r){const s=`${e}Changed`;const n=this.receiv...
    method valueDescriptors (line 1) | get valueDescriptors(){const{valueDescriptorMap:e}=this;return Object....
    method valueDescriptorNameMap (line 1) | get valueDescriptorNameMap(){const e={};Object.keys(this.valueDescript...
    method hasValue (line 1) | hasValue(e){const t=this.valueDescriptorNameMap[e];const r=`has${capit...
  class TargetObserver (line 1) | class TargetObserver{constructor(e,t){this.context=e;this.delegate=t;thi...
    method constructor (line 1) | constructor(e,t){this.context=e;this.delegate=t;this.targetsByName=new...
    method start (line 1) | start(){if(!this.tokenListObserver){this.tokenListObserver=new TokenLi...
    method stop (line 1) | stop(){if(this.tokenListObserver){this.disconnectAllTargets();this.tok...
    method tokenMatched (line 1) | tokenMatched({element:e,content:t}){this.scope.containsElement(e)&&thi...
    method tokenUnmatched (line 1) | tokenUnmatched({element:e,content:t}){this.disconnectTarget(e,t)}
    method connectTarget (line 1) | connectTarget(e,t){var r;if(!this.targetsByName.has(t,e)){this.targets...
    method disconnectTarget (line 1) | disconnectTarget(e,t){var r;if(this.targetsByName.has(t,e)){this.targe...
    method disconnectAllTargets (line 1) | disconnectAllTargets(){for(const e of this.targetsByName.keys)for(cons...
    method attributeName (line 1) | get attributeName(){return`data-${this.context.identifier}-target`}
    method element (line 1) | get element(){return this.context.element}
    method scope (line 1) | get scope(){return this.context.scope}
  function readInheritableStaticArrayValues (line 1) | function readInheritableStaticArrayValues(e,t){const r=getAncestorsForCo...
  function readInheritableStaticObjectPairs (line 1) | function readInheritableStaticObjectPairs(e,t){const r=getAncestorsForCo...
  function getAncestorsForConstructor (line 1) | function getAncestorsForConstructor(e){const t=[];while(e){t.push(e);e=O...
  function getOwnStaticArrayValues (line 1) | function getOwnStaticArrayValues(e,t){const r=e[t];return Array.isArray(...
  function getOwnStaticObjectPairs (line 1) | function getOwnStaticObjectPairs(e,t){const r=e[t];return r?Object.keys(...
  class OutletObserver (line 1) | class OutletObserver{constructor(e,t){this.started=false;this.context=e;...
    method constructor (line 1) | constructor(e,t){this.started=false;this.context=e;this.delegate=t;thi...
    method start (line 1) | start(){if(!this.started){this.outletDefinitions.forEach((e=>{this.set...
    method refresh (line 1) | refresh(){this.selectorObserverMap.forEach((e=>e.refresh()));this.attr...
    method stop (line 1) | stop(){if(this.started){this.started=false;this.disconnectAllOutlets()...
    method stopSelectorObservers (line 1) | stopSelectorObservers(){if(this.selectorObserverMap.size>0){this.selec...
    method stopAttributeObservers (line 1) | stopAttributeObservers(){if(this.attributeObserverMap.size>0){this.att...
    method selectorMatched (line 1) | selectorMatched(e,t,{outletName:r}){const s=this.getOutlet(e,r);s&&thi...
    method selectorUnmatched (line 1) | selectorUnmatched(e,t,{outletName:r}){const s=this.getOutletFromMap(e,...
    method selectorMatchElement (line 1) | selectorMatchElement(e,{outletName:t}){const r=this.selector(t);const ...
    method elementMatchedAttribute (line 1) | elementMatchedAttribute(e,t){const r=this.getOutletNameFromOutletAttri...
    method elementAttributeValueChanged (line 1) | elementAttributeValueChanged(e,t){const r=this.getOutletNameFromOutlet...
    method elementUnmatchedAttribute (line 1) | elementUnmatchedAttribute(e,t){const r=this.getOutletNameFromOutletAtt...
    method connectOutlet (line 1) | connectOutlet(e,t,r){var s;if(!this.outletElementsByName.has(r,t)){thi...
    method disconnectOutlet (line 1) | disconnectOutlet(e,t,r){var s;if(this.outletElementsByName.has(r,t)){t...
    method disconnectAllOutlets (line 1) | disconnectAllOutlets(){for(const e of this.outletElementsByName.keys)f...
    method updateSelectorObserverForOutlet (line 1) | updateSelectorObserverForOutlet(e){const t=this.selectorObserverMap.ge...
    method setupSelectorObserverForOutlet (line 1) | setupSelectorObserverForOutlet(e){const t=this.selector(e);const r=new...
    method setupAttributeObserverForOutlet (line 1) | setupAttributeObserverForOutlet(e){const t=this.attributeNameForOutlet...
    method selector (line 1) | selector(e){return this.scope.outlets.getSelectorForOutletName(e)}
    method attributeNameForOutletName (line 1) | attributeNameForOutletName(e){return this.scope.schema.outletAttribute...
    method getOutletNameFromOutletAttributeName (line 1) | getOutletNameFromOutletAttributeName(e){return this.outletDefinitions....
    method outletDependencies (line 1) | get outletDependencies(){const e=new Multimap;this.router.modules.forE...
    method outletDefinitions (line 1) | get outletDefinitions(){return this.outletDependencies.getKeysForValue...
    method dependentControllerIdentifiers (line 1) | get dependentControllerIdentifiers(){return this.outletDependencies.ge...
    method dependentContexts (line 1) | get dependentContexts(){const e=this.dependentControllerIdentifiers;re...
    method hasOutlet (line 1) | hasOutlet(e,t){return!!this.getOutlet(e,t)||!!this.getOutletFromMap(e,t)}
    method getOutlet (line 1) | getOutlet(e,t){return this.application.getControllerForElementAndIdent...
    method getOutletFromMap (line 1) | getOutletFromMap(e,t){return this.outletsByName.getValuesForKey(t).fin...
    method scope (line 1) | get scope(){return this.context.scope}
    method schema (line 1) | get schema(){return this.context.schema}
    method identifier (line 1) | get identifier(){return this.context.identifier}
    method application (line 1) | get application(){return this.context.application}
    method router (line 1) | get router(){return this.application.router}
  class Context (line 1) | class Context{constructor(e,t){this.logDebugActivity=(e,t={})=>{const{id...
    method constructor (line 1) | constructor(e,t){this.logDebugActivity=(e,t={})=>{const{identifier:r,c...
    method connect (line 1) | connect(){this.bindingObserver.start();this.valueObserver.start();this...
    method refresh (line 1) | refresh(){this.outletObserver.refresh()}
    method disconnect (line 1) | disconnect(){try{this.controller.disconnect();this.logDebugActivity("d...
    method application (line 1) | get application(){return this.module.application}
    method identifier (line 1) | get identifier(){return this.module.identifier}
    method schema (line 1) | get schema(){return this.application.schema}
    method dispatcher (line 1) | get dispatcher(){return this.application.dispatcher}
    method element (line 1) | get element(){return this.scope.element}
    method parentElement (line 1) | get parentElement(){return this.element.parentElement}
    method handleError (line 1) | handleError(e,t,r={}){const{identifier:s,controller:n,element:i}=this;...
    method targetConnected (line 1) | targetConnected(e,t){this.invokeControllerMethod(`${t}TargetConnected`...
    method targetDisconnected (line 1) | targetDisconnected(e,t){this.invokeControllerMethod(`${t}TargetDisconn...
    method outletConnected (line 1) | outletConnected(e,t,r){this.invokeControllerMethod(`${namespaceCameliz...
    method outletDisconnected (line 1) | outletDisconnected(e,t,r){this.invokeControllerMethod(`${namespaceCame...
    method invokeControllerMethod (line 1) | invokeControllerMethod(e,...t){const r=this.controller;"function"==typ...
  function bless (line 1) | function bless(e){return shadow(e,getBlessedProperties(e))}
  function shadow (line 1) | function shadow(e,t){const r=i(e);const s=getShadowProperties(e.prototyp...
  function getBlessedProperties (line 1) | function getBlessedProperties(e){const t=readInheritableStaticArrayValue...
  function getShadowProperties (line 1) | function getShadowProperties(e,t){return n(t).reduce(((r,s)=>{const n=ge...
  function getShadowedDescriptor (line 1) | function getShadowedDescriptor(e,t,r){const s=Object.getOwnPropertyDescr...
  function extendWithReflect (line 1) | function extendWithReflect(e){function extended(){return Reflect.constru...
  function testReflectExtension (line 1) | function testReflectExtension(){const a=function(){this.a.call(this)};co...
  function blessDefinition (line 1) | function blessDefinition(e){return{identifier:e.identifier,controllerCon...
  class Module (line 1) | class Module{constructor(e,t){this.application=e;this.definition=blessDe...
    method constructor (line 1) | constructor(e,t){this.application=e;this.definition=blessDefinition(t)...
    method identifier (line 1) | get identifier(){return this.definition.identifier}
    method controllerConstructor (line 1) | get controllerConstructor(){return this.definition.controllerConstructor}
    method contexts (line 1) | get contexts(){return Array.from(this.connectedContexts)}
    method connectContextForScope (line 1) | connectContextForScope(e){const t=this.fetchContextForScope(e);this.co...
    method disconnectContextForScope (line 1) | disconnectContextForScope(e){const t=this.contextsByScope.get(e);if(t)...
    method fetchContextForScope (line 1) | fetchContextForScope(e){let t=this.contextsByScope.get(e);if(!t){t=new...
  class ClassMap (line 1) | class ClassMap{constructor(e){this.scope=e}has(e){return this.data.has(t...
    method constructor (line 1) | constructor(e){this.scope=e}
    method has (line 1) | has(e){return this.data.has(this.getDataKey(e))}
    method get (line 1) | get(e){return this.getAll(e)[0]}
    method getAll (line 1) | getAll(e){const t=this.data.get(this.getDataKey(e))||"";return tokeniz...
    method getAttributeName (line 1) | getAttributeName(e){return this.data.getAttributeNameForKey(this.getDa...
    method getDataKey (line 1) | getDataKey(e){return`${e}-class`}
    method data (line 1) | get data(){return this.scope.data}
  class DataMap (line 1) | class DataMap{constructor(e){this.scope=e}get element(){return this.scop...
    method constructor (line 1) | constructor(e){this.scope=e}
    method element (line 1) | get element(){return this.scope.element}
    method identifier (line 1) | get identifier(){return this.scope.identifier}
    method get (line 1) | get(e){const t=this.getAttributeNameForKey(e);return this.element.getA...
    method set (line 1) | set(e,t){const r=this.getAttributeNameForKey(e);this.element.setAttrib...
    method has (line 1) | has(e){const t=this.getAttributeNameForKey(e);return this.element.hasA...
    method delete (line 1) | delete(e){if(this.has(e)){const t=this.getAttributeNameForKey(e);this....
    method getAttributeNameForKey (line 1) | getAttributeNameForKey(e){return`data-${this.identifier}-${dasherize(e...
  class Guide (line 1) | class Guide{constructor(e){this.warnedKeysByObject=new WeakMap;this.logg...
    method constructor (line 1) | constructor(e){this.warnedKeysByObject=new WeakMap;this.logger=e}
    method warn (line 1) | warn(e,t,r){let s=this.warnedKeysByObject.get(e);if(!s){s=new Set;this...
  function attributeValueContainsToken (line 1) | function attributeValueContainsToken(e,t){return`[${e}~="${t}"]`}
  class TargetSet (line 1) | class TargetSet{constructor(e){this.scope=e}get element(){return this.sc...
    method constructor (line 1) | constructor(e){this.scope=e}
    method element (line 1) | get element(){return this.scope.element}
    method identifier (line 1) | get identifier(){return this.scope.identifier}
    method schema (line 1) | get schema(){return this.scope.schema}
    method has (line 1) | has(e){return null!=this.find(e)}
    method find (line 1) | find(...e){return e.reduce(((e,t)=>e||this.findTarget(t)||this.findLeg...
    method findAll (line 1) | findAll(...e){return e.reduce(((e,t)=>[...e,...this.findAllTargets(t),...
    method findTarget (line 1) | findTarget(e){const t=this.getSelectorForTargetName(e);return this.sco...
    method findAllTargets (line 1) | findAllTargets(e){const t=this.getSelectorForTargetName(e);return this...
    method getSelectorForTargetName (line 1) | getSelectorForTargetName(e){const t=this.schema.targetAttributeForScop...
    method findLegacyTarget (line 1) | findLegacyTarget(e){const t=this.getLegacySelectorForTargetName(e);ret...
    method findAllLegacyTargets (line 1) | findAllLegacyTargets(e){const t=this.getLegacySelectorForTargetName(e)...
    method getLegacySelectorForTargetName (line 1) | getLegacySelectorForTargetName(e){const t=`${this.identifier}.${e}`;re...
    method deprecate (line 1) | deprecate(e,t){if(e){const{identifier:r}=this;const s=this.schema.targ...
    method guide (line 1) | get guide(){return this.scope.guide}
  class OutletSet (line 1) | class OutletSet{constructor(e,t){this.scope=e;this.controllerElement=t}g...
    method constructor (line 1) | constructor(e,t){this.scope=e;this.controllerElement=t}
    method element (line 1) | get element(){return this.scope.element}
    method identifier (line 1) | get identifier(){return this.scope.identifier}
    method schema (line 1) | get schema(){return this.scope.schema}
    method has (line 1) | has(e){return null!=this.find(e)}
    method find (line 1) | find(...e){return e.reduce(((e,t)=>e||this.findOutlet(t)),void 0)}
    method findAll (line 1) | findAll(...e){return e.reduce(((e,t)=>[...e,...this.findAllOutlets(t)]...
    method getSelectorForOutletName (line 1) | getSelectorForOutletName(e){const t=this.schema.outletAttributeForScop...
    method findOutlet (line 1) | findOutlet(e){const t=this.getSelectorForOutletName(e);if(t)return thi...
    method findAllOutlets (line 1) | findAllOutlets(e){const t=this.getSelectorForOutletName(e);return t?th...
    method findElement (line 1) | findElement(e,t){const r=this.scope.queryElements(e);return r.filter((...
    method findAllElements (line 1) | findAllElements(e,t){const r=this.scope.queryElements(e);return r.filt...
    method matchesElement (line 1) | matchesElement(e,t,r){const s=e.getAttribute(this.scope.schema.control...
  class Scope (line 1) | class Scope{constructor(e,t,r,s){this.targets=new TargetSet(this);this.c...
    method constructor (line 1) | constructor(e,t,r,s){this.targets=new TargetSet(this);this.classes=new...
    method findElement (line 1) | findElement(e){return this.element.matches(e)?this.element:this.queryE...
    method findAllElements (line 1) | findAllElements(e){return[...this.element.matches(e)?[this.element]:[]...
    method queryElements (line 1) | queryElements(e){return Array.from(this.element.querySelectorAll(e))}
    method controllerSelector (line 1) | get controllerSelector(){return attributeValueContainsToken(this.schem...
    method isDocumentScope (line 1) | get isDocumentScope(){return this.element===document.documentElement}
    method documentScope (line 1) | get documentScope(){return this.isDocumentScope?this:new Scope(this.sc...
  class ScopeObserver (line 1) | class ScopeObserver{constructor(e,t,r){this.element=e;this.schema=t;this...
    method constructor (line 1) | constructor(e,t,r){this.element=e;this.schema=t;this.delegate=r;this.v...
    method start (line 1) | start(){this.valueListObserver.start()}
    method stop (line 1) | stop(){this.valueListObserver.stop()}
    method controllerAttribute (line 1) | get controllerAttribute(){return this.schema.controllerAttribute}
    method parseValueForToken (line 1) | parseValueForToken(e){const{element:t,content:r}=e;return this.parseVa...
    method parseValueForElementAndIdentifier (line 1) | parseValueForElementAndIdentifier(e,t){const r=this.fetchScopesByIdent...
    method elementMatchedValue (line 1) | elementMatchedValue(e,t){const r=(this.scopeReferenceCounts.get(t)||0)...
    method elementUnmatchedValue (line 1) | elementUnmatchedValue(e,t){const r=this.scopeReferenceCounts.get(t);if...
    method fetchScopesByIdentifierForElement (line 1) | fetchScopesByIdentifierForElement(e){let t=this.scopesByIdentifierByEl...
  class Router (line 1) | class Router{constructor(e){this.application=e;this.scopeObserver=new Sc...
    method constructor (line 1) | constructor(e){this.application=e;this.scopeObserver=new ScopeObserver...
    method element (line 1) | get element(){return this.application.element}
    method schema (line 1) | get schema(){return this.application.schema}
    method logger (line 1) | get logger(){return this.application.logger}
    method controllerAttribute (line 1) | get controllerAttribute(){return this.schema.controllerAttribute}
    method modules (line 1) | get modules(){return Array.from(this.modulesByIdentifier.values())}
    method contexts (line 1) | get contexts(){return this.modules.reduce(((e,t)=>e.concat(t.contexts)...
    method start (line 1) | start(){this.scopeObserver.start()}
    method stop (line 1) | stop(){this.scopeObserver.stop()}
    method loadDefinition (line 1) | loadDefinition(e){this.unloadIdentifier(e.identifier);const t=new Modu...
    method unloadIdentifier (line 1) | unloadIdentifier(e){const t=this.modulesByIdentifier.get(e);t&&this.di...
    method getContextForElementAndIdentifier (line 1) | getContextForElementAndIdentifier(e,t){const r=this.modulesByIdentifie...
    method proposeToConnectScopeForElementAndIdentifier (line 1) | proposeToConnectScopeForElementAndIdentifier(e,t){const r=this.scopeOb...
    method handleError (line 1) | handleError(e,t,r){this.application.handleError(e,t,r)}
    method createScopeForElementAndIdentifier (line 1) | createScopeForElementAndIdentifier(e,t){return new Scope(this.schema,e...
    method scopeConnected (line 1) | scopeConnected(e){this.scopesByIdentifier.add(e.identifier,e);const t=...
    method scopeDisconnected (line 1) | scopeDisconnected(e){this.scopesByIdentifier.delete(e.identifier,e);co...
    method connectModule (line 1) | connectModule(e){this.modulesByIdentifier.set(e.identifier,e);const t=...
    method disconnectModule (line 1) | disconnectModule(e){this.modulesByIdentifier.delete(e.identifier);cons...
  function objectFromEntries (line 1) | function objectFromEntries(e){return e.reduce(((e,[t,r])=>Object.assign(...
  class Application (line 1) | class Application{constructor(t=document.documentElement,r=o){this.logge...
    method constructor (line 1) | constructor(t=document.documentElement,r=o){this.logger=console;this.d...
    method start (line 1) | static start(e,t){const r=new this(e,t);r.start();return r}
    method start (line 1) | async start(){await domReady();this.logDebugActivity("application","st...
    method stop (line 1) | stop(){this.logDebugActivity("application","stopping");this.dispatcher...
    method register (line 1) | register(e,t){this.load({identifier:e,controllerConstructor:t})}
    method registerActionOption (line 1) | registerActionOption(e,t){this.actionDescriptorFilters[e]=t}
    method load (line 1) | load(e,...t){const r=Array.isArray(e)?e:[e,...t];r.forEach((e=>{e.cont...
    method unload (line 1) | unload(e,...t){const r=Array.isArray(e)?e:[e,...t];r.forEach((e=>this....
    method controllers (line 1) | get controllers(){return this.router.contexts.map((e=>e.controller))}
    method getControllerForElementAndIdentifier (line 1) | getControllerForElementAndIdentifier(e,t){const r=this.router.getConte...
    method handleError (line 1) | handleError(e,t,r){var s;this.logger.error("%s\n\n%o\n\n%o",t,e,r);nul...
    method logFormattedMessage (line 1) | logFormattedMessage(e,t,r={}){r=Object.assign({application:this},r);th...
  function domReady (line 1) | function domReady(){return new Promise((e=>{"loading"==document.readySta...
  function ClassPropertiesBlessing (line 1) | function ClassPropertiesBlessing(e){const t=readInheritableStaticArrayVa...
  function propertiesForClassDefinition (line 1) | function propertiesForClassDefinition(e){return{[`${e}Class`]:{get(){con...
  function OutletPropertiesBlessing (line 1) | function OutletPropertiesBlessing(e){const t=readInheritableStaticArrayV...
  function getOutletController (line 1) | function getOutletController(e,t,r){return e.application.getControllerFo...
  function getControllerAndEnsureConnectedScope (line 1) | function getControllerAndEnsureConnectedScope(e,t,r){let s=getOutletCont...
  function propertiesForOutletDefinition (line 1) | function propertiesForOutletDefinition(e){const t=namespaceCamelize(e);r...
  function TargetPropertiesBlessing (line 1) | function TargetPropertiesBlessing(e){const t=readInheritableStaticArrayV...
  function propertiesForTargetDefinition (line 1) | function propertiesForTargetDefinition(e){return{[`${e}Target`]:{get(){c...
  function ValuePropertiesBlessing (line 1) | function ValuePropertiesBlessing(e){const t=readInheritableStaticObjectP...
  function propertiesForValueDefinitionPair (line 1) | function propertiesForValueDefinitionPair(e,t){const r=parseValueDefinit...
  function parseValueDefinitionPair (line 1) | function parseValueDefinitionPair([e,t],r){return valueDescriptorForToke...
  function parseValueTypeConstant (line 1) | function parseValueTypeConstant(e){switch(e){case Array:return"array";ca...
  function parseValueTypeDefault (line 1) | function parseValueTypeDefault(e){switch(typeof e){case"boolean":return"...
  function parseValueTypeObject (line 1) | function parseValueTypeObject(e){const{controller:t,token:r,typeObject:s...
  function parseValueTypeDefinition (line 1) | function parseValueTypeDefinition(e){const{controller:t,token:r,typeDefi...
  function defaultValueForDefinition (line 1) | function defaultValueForDefinition(e){const t=parseValueTypeConstant(e);...
  function valueDescriptorForTokenAndTypeDefinition (line 1) | function valueDescriptorForTokenAndTypeDefinition(e){const{token:t,typeD...
  method array (line 1) | get array(){return[]}
  method object (line 1) | get object(){return{}}
  method array (line 1) | array(e){const t=JSON.parse(e);if(!Array.isArray(t))throw new TypeError(...
  method boolean (line 1) | boolean(e){return!("0"==e||"false"==String(e).toLowerCase())}
  method number (line 1) | number(e){return Number(e.replace(/_/g,""))}
  method object (line 1) | object(e){const t=JSON.parse(e);if(null===t||"object"!=typeof t||Array.i...
  method string (line 1) | string(e){return e}
  function writeJSON (line 1) | function writeJSON(e){return JSON.stringify(e)}
  function writeString (line 1) | function writeString(e){return`${e}`}
  class Controller (line 1) | class Controller{constructor(e){this.context=e}static get shouldLoad(){r...
    method constructor (line 1) | constructor(e){this.context=e}
    method shouldLoad (line 1) | static get shouldLoad(){return true}
    method afterLoad (line 1) | static afterLoad(e,t){}
    method application (line 1) | get application(){return this.context.application}
    method scope (line 1) | get scope(){return this.context.scope}
    method element (line 1) | get element(){return this.scope.element}
    method identifier (line 1) | get identifier(){return this.scope.identifier}
    method targets (line 1) | get targets(){return this.scope.targets}
    method outlets (line 1) | get outlets(){return this.scope.outlets}
    method classes (line 1) | get classes(){return this.scope.classes}
    method data (line 1) | get data(){return this.scope.data}
    method initialize (line 1) | initialize(){}
    method connect (line 1) | connect(){}
    method disconnect (line 1) | disconnect(){}
    method dispatch (line 1) | dispatch(e,{target:t=this.element,detail:r={},prefix:s=this.identifier...

FILE: spec/support/test_app/vendor/javascript/@stimulus-components--rails-nested-form.js
  method add (line 1) | add(e){e.preventDefault();const t=this.templateTarget.innerHTML.replace(...
  method remove (line 1) | remove(e){e.preventDefault();const t=e.target.closest(this.wrapperSelect...
Condensed preview — 396 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,564K chars).
[
  {
    "path": ".circleci/config.yml",
    "chars": 1546,
    "preview": "build_job: &build_job\n  working_directory: ~/wice_grid\n  steps:\n    - checkout\n\n    # Install PhantomJS (if not found in"
  },
  {
    "path": ".circleci/run-build-locally.sh",
    "chars": 269,
    "preview": "#!/usr/bin/env bash\ncurl --user ${CIRCLE_TOKEN}: \\\n  --request POST \\\n  --form revision=fa279c82728d4e0d764f09f3db0f6326"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 577,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\n\n---\n\n## Precheck\n\n- For bugs, do a quick search and make"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 1010,
    "preview": "version: 2\nupdates:\n- package-ecosystem: bundler\n  directory: \"/\"\n  schedule:\n    interval: monthly\n  open-pull-requests"
  },
  {
    "path": ".gitignore",
    "chars": 266,
    "preview": "*.gem\n*.rbc\n.bundle\n.config\n.idea\n.yardoc\n.rbenv-version\nInstalledFiles\n_yardoc\ncoverage\ndoc/\nlib/bundler/man\npkg\nrdoc\ns"
  },
  {
    "path": ".inch.yml",
    "chars": 100,
    "preview": "files:\n  excluded:\n    - lib/generators/wice_grid/add_migration_for_serialized_queries_generator.rb\n"
  },
  {
    "path": ".rspec",
    "chars": 42,
    "preview": "--color\n--require rails_helper\n--format d\n"
  },
  {
    "path": ".rubocop.yml",
    "chars": 4331,
    "preview": "AllCops:\n  DisabledByDefault: true\n\nStyle/MultilineTernaryOperator:\n  Enabled: true\n\n# Cop supports --auto-correct.\nStyl"
  },
  {
    "path": "Appraisals",
    "chars": 164,
    "preview": "appraise \"rails-5.0\" do\n  gem \"rails\", \"~> 5.0.0\"\nend\n\nappraise \"rails-5.1\" do\n  gem \"rails\", \"~> 5.1.0\"\nend\n\nappraise \""
  },
  {
    "path": "CHANGELOG.md",
    "chars": 26515,
    "preview": "## 7.1.4\n\n* Allow Rails 7.0\n* Wice::Columns#add_css_class does not update the value given\nto the :class option of Wice::"
  },
  {
    "path": "Gemfile",
    "chars": 218,
    "preview": "source 'https://rubygems.org'\n\n# Use custom version of jquery-ui-rails and font-awesome-sass\ngem 'jquery-ui-rails', gith"
  },
  {
    "path": "Guardfile",
    "chars": 2511,
    "preview": "# A sample Guardfile\n# More info at https://github.com/guard/guard#readme\n\n## Uncomment and set this to only include dir"
  },
  {
    "path": "MIT-LICENSE",
    "chars": 1061,
    "preview": "Copyright (c) 2008-2014 Yuri Leikind\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of th"
  },
  {
    "path": "README.md",
    "chars": 50210,
    "preview": "[![Version](http://img.shields.io/gem/v/wice_grid.svg)](https://rubygems.org/gems/wice_grid)\n[![CircleCI](https://circle"
  },
  {
    "path": "Rakefile",
    "chars": 1311,
    "preview": "require 'rubygems'\nrequire 'bundler'\nrequire 'bundler/gem_tasks'\n\nbegin\n  Bundler.setup(:default, :development)\nrescue B"
  },
  {
    "path": "SAVED_QUERIES_HOWTO.md",
    "chars": 4554,
    "preview": "## Saving Queries How-To\n\nWiceGrid allows to save the state of filters as a custom query and later restore it from the l"
  },
  {
    "path": "app/views/kaminari/wice_grid/_gap.html.erb",
    "chars": 46,
    "preview": "<li class=\"disabled\"><a href=\"#\">...</a></li>\n"
  },
  {
    "path": "app/views/kaminari/wice_grid/_next_page.html.erb",
    "chars": 117,
    "preview": "<li><%= link_to_unless current_page.last?, ::Wice::NlMessage['next_label'], url, rel: 'next', remote: remote %></li>\n"
  },
  {
    "path": "app/views/kaminari/wice_grid/_page.html.erb",
    "chars": 148,
    "preview": "<li <%if page.current?%>class=\"active\"<%end%>><%= link_to page, url, {remote: remote, rel: page.next? ? 'next' : page.pr"
  },
  {
    "path": "app/views/kaminari/wice_grid/_paginator.html.erb",
    "chars": 524,
    "preview": "<%= paginator.render do %>\n  <div class=\"pagination\">\n    <ul class=\"grid pagination\">\n      <% unless current_page.firs"
  },
  {
    "path": "app/views/kaminari/wice_grid/_prev_page.html.erb",
    "chars": 122,
    "preview": "<li><%= link_to_unless current_page.first?, ::Wice::NlMessage['previous_label'], url, rel: 'prev', remote: remote %></li"
  },
  {
    "path": "config/locales/cz.yml",
    "chars": 1888,
    "preview": "cz:\n  wice_grid:\n    show_filter_tooltip: Zobrazit filtr\n    hide_filter_tooltip: Skrýt filtr\n    csv_export_tooltip: Ex"
  },
  {
    "path": "config/locales/de.yml",
    "chars": 1874,
    "preview": "de:\n  wice_grid:\n    show_filter_tooltip: Filter einblenden\n    hide_filter_tooltip: Filter ausblenden\n    csv_export_to"
  },
  {
    "path": "config/locales/en.yml",
    "chars": 1825,
    "preview": "en:\n  wice_grid:\n    show_filter_tooltip: Show filter\n    hide_filter_tooltip: Hide filter\n    csv_export_tooltip: Expor"
  },
  {
    "path": "config/locales/es.yml",
    "chars": 1917,
    "preview": "es:\n  wice_grid:\n    show_filter_tooltip: Mostrar filtro\n    hide_filter_tooltip: Ocultar filtro\n    csv_export_tooltip:"
  },
  {
    "path": "config/locales/fr.yml",
    "chars": 1935,
    "preview": "fr:\n  wice_grid:\n    show_filter_tooltip: Afficher le filtre\n    hide_filter_tooltip: Cacher le filtrer\n    csv_export_t"
  },
  {
    "path": "config/locales/is.yml",
    "chars": 1862,
    "preview": "is:\n  wice_grid:\n    show_filter_tooltip: Sýna síumöguleika\n    hide_filter_tooltip: Fela síumoguleika\n    csv_export_to"
  },
  {
    "path": "config/locales/it.yml",
    "chars": 1388,
    "preview": "it:\n  wice_grid:\n    show_filter_tooltip: Mostra filtri\n    hide_filter_tooltip: Nascondi filtri\n    csv_export_tooltip:"
  },
  {
    "path": "config/locales/ja.yml",
    "chars": 1572,
    "preview": "ja:\n  wice_grid:\n    show_filter_tooltip: フィルタ表示\n    hide_filter_tooltip: フィルタ非表示\n    csv_export_tooltip: CSVエクスポート\n    "
  },
  {
    "path": "config/locales/nl.yml",
    "chars": 1856,
    "preview": "nl:\n  wice_grid:\n    show_filter_tooltip: Filter tonen\n    hide_filter_tooltip: Filter verbergen\n    csv_export_tooltip:"
  },
  {
    "path": "config/locales/pt-BR.yml",
    "chars": 1381,
    "preview": "pt-BR:\n  wice_grid:\n    show_filter_tooltip: Mostrar o filtro\n    hide_filter_tooltip: Esconder o filtro\n    csv_export_"
  },
  {
    "path": "config/locales/pt.yml",
    "chars": 1885,
    "preview": "pt:\n  wice_grid:\n    show_filter_tooltip: Mostrar o filtro\n    hide_filter_tooltip: Esconder o filtro\n    csv_export_too"
  },
  {
    "path": "config/locales/ru.yml",
    "chars": 1932,
    "preview": "ru:\n  wice_grid:\n    show_filter_tooltip: Показать фильтр\n    hide_filter_tooltip: Спрятать фильтр\n    csv_export_toolti"
  },
  {
    "path": "config/locales/sk.yml",
    "chars": 1922,
    "preview": "sk:\n  wice_grid:\n    show_filter_tooltip: Zobraziť filter\n    hide_filter_tooltip: Skryť filter\n    csv_export_tooltip: "
  },
  {
    "path": "config/locales/uk.yml",
    "chars": 2011,
    "preview": "uk:\n  wice_grid:\n    show_filter_tooltip: \"Показати фільтр\"\n    hide_filter_tooltip: \"Сховати фільтр\"\n    csv_export_too"
  },
  {
    "path": "config/locales/zh.yml",
    "chars": 1519,
    "preview": "zh:\n  wice_grid:\n    show_filter_tooltip: 显示过滤\n    hide_filter_tooltip: 隐藏过滤\n    csv_export_tooltip: 输出CSV档\n    filter_t"
  },
  {
    "path": "gemfiles/rails_5.0.gemfile",
    "chars": 116,
    "preview": "# This file was generated by Appraisal\n\nsource \"https://rubygems.org\"\n\ngem \"rails\", \"~> 5.0.0\"\n\ngemspec path: \"../\"\n"
  },
  {
    "path": "gemfiles/rails_5.1.gemfile",
    "chars": 116,
    "preview": "# This file was generated by Appraisal\n\nsource \"https://rubygems.org\"\n\ngem \"rails\", \"~> 5.1.0\"\n\ngemspec path: \"../\"\n"
  },
  {
    "path": "gemfiles/rails_5.2.gemfile",
    "chars": 116,
    "preview": "# This file was generated by Appraisal\n\nsource \"https://rubygems.org\"\n\ngem \"rails\", \"~> 5.2.0\"\n\ngemspec path: \"../\"\n"
  },
  {
    "path": "lib/generators/wice_grid/add_migration_for_serialized_queries_generator.rb",
    "chars": 601,
    "preview": "module WiceGrid #:nodoc:\n  module Generators #:nodoc:\n    class AddMigrationForSerializedQueriesGenerator < Rails::Gener"
  },
  {
    "path": "lib/generators/wice_grid/install_generator.rb",
    "chars": 389,
    "preview": "module WiceGrid #:nodoc:\n  module Generators #:nodoc:\n    class InstallGenerator < Rails::Generators::Base #:nodoc:\n    "
  },
  {
    "path": "lib/generators/wice_grid/templates/create_wice_grid_serialized_queries.rb",
    "chars": 411,
    "preview": "class CreateWiceGridSerializedQueries < ::ActiveRecord::Migration #:nodoc:\n  def change #:nodoc:\n    create_table :wice_"
  },
  {
    "path": "lib/generators/wice_grid/templates/wice_grid_config.rb",
    "chars": 8884,
    "preview": "if defined?(Wice::Defaults)\n\n  # Default number of rows to show per page.\n  Wice::Defaults::PER_PAGE = 20\n\n  # Default o"
  },
  {
    "path": "lib/wice/active_record_column_wrapper.rb",
    "chars": 4474,
    "preview": "module Wice\n  # to be mixed in into ActiveRecord::ConnectionAdapters::Column\n  module WiceGridExtentionToActiveRecordCol"
  },
  {
    "path": "lib/wice/columns/column_action.rb",
    "chars": 1888,
    "preview": "module Wice\n  module Columns #:nodoc:\n    class ViewColumnAction < ViewColumn #:nodoc:\n      def initialize(grid_obj, ht"
  },
  {
    "path": "lib/wice/columns/column_boolean.rb",
    "chars": 1369,
    "preview": "module Wice\n  module Columns #:nodoc:\n    class ViewColumnBoolean < ViewColumnCustomDropdown #:nodoc:\n      include Acti"
  },
  {
    "path": "lib/wice/columns/column_bootstrap_datepicker.rb",
    "chars": 1340,
    "preview": "module Wice\n  module Columns #:nodoc:\n    class ViewColumnBootstrapDatepicker < ViewColumn #:nodoc:\n\n      include Wice:"
  },
  {
    "path": "lib/wice/columns/column_custom_dropdown.rb",
    "chars": 4437,
    "preview": "module Wice\n  module Columns #:nodoc:\n    class ViewColumnCustomDropdown < ViewColumn #:nodoc:\n      include ActionView:"
  },
  {
    "path": "lib/wice/columns/column_float.rb",
    "chars": 200,
    "preview": "module Wice #:nodoc:\n  module Columns #:nodoc:\n    class ViewColumnFloat < ViewColumnInteger #:nodoc:\n    end\n\n    Condi"
  },
  {
    "path": "lib/wice/columns/column_html5_datepicker.rb",
    "chars": 1023,
    "preview": "module Wice\n  module Columns #:nodoc:\n    class ViewColumnHtml5Datepicker < ViewColumn #:nodoc:\n\n      include Wice::Col"
  },
  {
    "path": "lib/wice/columns/column_integer.rb",
    "chars": 2424,
    "preview": "module Wice\n  module Columns #:nodoc:\n    class ViewColumnInteger < ViewColumn #:nodoc:\n      def render_filter_internal"
  },
  {
    "path": "lib/wice/columns/column_jquery_datepicker.rb",
    "chars": 1463,
    "preview": "module Wice\n  module Columns #:nodoc:\n    class ViewColumnJqueryDatepicker < ViewColumn #:nodoc:\n\n      include Wice::Js"
  },
  {
    "path": "lib/wice/columns/column_processor_index.rb",
    "chars": 1123,
    "preview": "module Wice #:nodoc:\n  module Columns #:nodoc:\n    require 'active_support'\n\n    COLUMN_PROCESSOR_INDEX = ActiveSupport:"
  },
  {
    "path": "lib/wice/columns/column_rails_date_helper.rb",
    "chars": 1344,
    "preview": "module Wice\n  module Columns #:nodoc:\n    class ViewColumnRailsDateHelper < ViewColumn #:nodoc:\n\n      include ActionVie"
  },
  {
    "path": "lib/wice/columns/column_rails_datetime_helper.rb",
    "chars": 1521,
    "preview": "module Wice\n  module Columns #:nodoc:\n    class ViewColumnRailsDatetimeHelper < ViewColumn #:nodoc:\n\n      include Actio"
  },
  {
    "path": "lib/wice/columns/column_range.rb",
    "chars": 2240,
    "preview": "module Wice\n  module Columns #:nodoc:\n    class ViewColumnRange < ViewColumn #:nodoc:\n      def render_filter_internal(p"
  },
  {
    "path": "lib/wice/columns/column_string.rb",
    "chars": 3357,
    "preview": "module Wice\n  module Columns #:nodoc:\n    class ViewColumnString < ViewColumn #:nodoc:\n\n      # whether the filter conta"
  },
  {
    "path": "lib/wice/columns/common_date_datetime_mixin.rb",
    "chars": 416,
    "preview": "module Wice\n  module Columns #:nodoc:\n    module CommonDateDatetimeMixin #:nodoc:\n\n      def render_filter_internal(para"
  },
  {
    "path": "lib/wice/columns/common_js_date_datetime_conditions_generator_mixin.rb",
    "chars": 1027,
    "preview": "module Wice\n  module Columns #:nodoc:\n    module CommonJsDateDatetimeConditionsGeneratorMixin #:nodoc:\n\n      def genera"
  },
  {
    "path": "lib/wice/columns/common_js_date_datetime_mixin.rb",
    "chars": 359,
    "preview": "module Wice\n  module Columns #:nodoc:\n    module CommonJsDateDatetimeMixin #:nodoc:\n\n      def prepare #:nodoc:\n        "
  },
  {
    "path": "lib/wice/columns/common_rails_date_datetime_conditions_generator_mixin.rb",
    "chars": 721,
    "preview": "module Wice\n  module Columns #:nodoc:\n    module CommonRailsDateDatetimeConditionsGeneratorMixin #:nodoc:\n\n      def gen"
  },
  {
    "path": "lib/wice/columns/common_standard_helper_date_datetime_mixin.rb",
    "chars": 561,
    "preview": "module Wice\n  module Columns #:nodoc:\n    module CommonStandardDateDatetimeMixin #:nodoc:\n\n      def prepare #:nodoc:\n  "
  },
  {
    "path": "lib/wice/columns.rb",
    "chars": 9146,
    "preview": "module Wice #:nodoc:\n  module Columns #:nodoc:\n    mattr_reader :handled_type_view, :handled_type_conditions_generator\n\n"
  },
  {
    "path": "lib/wice/grid_output_buffer.rb",
    "chars": 1755,
    "preview": "module Wice\n  class GridOutputBuffer < String #:nodoc:\n\n    # defines behavior for rendering nonexistent filters.\n    # "
  },
  {
    "path": "lib/wice/grid_renderer.rb",
    "chars": 28942,
    "preview": "module Wice\n\n  # Instance of `GridRenderer` is injected into the top level block of the `grid` helper.\n  # `g.column`, `"
  },
  {
    "path": "lib/wice/helpers/bs_calendar_helpers.rb",
    "chars": 2935,
    "preview": "module Wice #:nodoc:\n  module BsCalendarHelpers #:nodoc:\n\n    # A struct containing all data for rendering a calendar\n  "
  },
  {
    "path": "lib/wice/helpers/js_calendar_helpers.rb",
    "chars": 3170,
    "preview": "module Wice #:nodoc:\n  module JsCalendarHelpers #:nodoc:\n\n    # A struct containing all data for rendering a calendar\n  "
  },
  {
    "path": "lib/wice/helpers/wice_grid_misc_view_helpers.rb",
    "chars": 3275,
    "preview": "module Wice\n\n  # Various grid related helpers\n  module GridViewHelper\n    # This method dumps all HTTP parameters relate"
  },
  {
    "path": "lib/wice/helpers/wice_grid_serialized_queries_view_helpers.rb",
    "chars": 4255,
    "preview": "module Wice\n  module GridViewHelper\n    # View helper to render the list of saved queries and the form to create a new q"
  },
  {
    "path": "lib/wice/helpers/wice_grid_view_helpers.rb",
    "chars": 29176,
    "preview": "module Wice\n  module GridViewHelper\n    # View helper for rendering the grid.\n    #\n    # The first parameter is a grid "
  },
  {
    "path": "lib/wice/kaminari_monkey_patching.rb",
    "chars": 529,
    "preview": "# Ugly monkey-patching Kaminari (https://github.com/amatsuda/kaminari/pull/267)\nmodule Kaminari #:nodoc:\n  module Helper"
  },
  {
    "path": "lib/wice/table_column_matrix.rb",
    "chars": 1882,
    "preview": "module Wice\n\n  # a matrix for all declared columns\n  class TableColumnMatrix < Hash #:nodoc:\n\n    # returns the main Act"
  },
  {
    "path": "lib/wice/wice_grid_controller.rb",
    "chars": 9845,
    "preview": "module Wice\n  module Controller #:nodoc:\n    def self.included(base) #:nodoc:\n      base.extend(ClassMethods)\n    end\n\n "
  },
  {
    "path": "lib/wice/wice_grid_core_ext.rb",
    "chars": 5056,
    "preview": "module Wice\n  module WgHash #:nodoc:\n    class << self #:nodoc:\n      # if there's a hash of hashes, the original struct"
  },
  {
    "path": "lib/wice/wice_grid_misc.rb",
    "chars": 6616,
    "preview": "module Wice\n  class << self\n\n    # a flag storing whether the saved query class is a valid storage for saved queries\n   "
  },
  {
    "path": "lib/wice/wice_grid_serialized_queries_controller.rb",
    "chars": 2838,
    "preview": "module Wice\n  class <<self\n    # Used in routes.rb to define routes to the query processing controller.\n    # Parameters"
  },
  {
    "path": "lib/wice/wice_grid_serialized_query.rb",
    "chars": 441,
    "preview": "class WiceGridSerializedQuery < ActiveRecord::Base  #:nodoc:\n  serialize :query\n\n  validates_uniqueness_of :name, scope:"
  },
  {
    "path": "lib/wice/wice_grid_spreadsheet.rb",
    "chars": 395,
    "preview": "require 'csv'\n\nmodule Wice\n  class Spreadsheet  #:nodoc:\n\n    #:nodoc:\n    attr_reader :tempfile\n\n    def initialize(nam"
  },
  {
    "path": "lib/wice_grid.rb",
    "chars": 25579,
    "preview": "require 'wice/wice_grid_misc.rb'\nrequire 'wice/wice_grid_core_ext.rb'\nrequire 'wice/grid_renderer.rb'\nrequire 'wice/tabl"
  },
  {
    "path": "package.json",
    "chars": 410,
    "preview": "{\n  \"name\": \"wice-grid\",\n  \"version\": \"4.1.0\",\n  \"description\": \"WiceGrid is a Rails grid plugin\",\n  \"main\": \"vendor/ass"
  },
  {
    "path": "spec/acceptance_helper.rb",
    "chars": 1381,
    "preview": "# encoding: utf-8\nrequire 'capybara/rspec'\n\n# This file is copied to spec/ when you run 'rails generate rspec:install'\nE"
  },
  {
    "path": "spec/features/action_column_request_spec.rb",
    "chars": 8065,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /action_column WiceGrid', type: :request, js: true "
  },
  {
    "path": "spec/features/adding_rows_request_spec.rb",
    "chars": 639,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /adding_rows WiceGrid', type: :request, js: true do"
  },
  {
    "path": "spec/features/all_records_request_spec.rb",
    "chars": 551,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /all_records WiceGrid', type: :request, js: true do"
  },
  {
    "path": "spec/features/auto_reloads2_request_spec.rb",
    "chars": 10603,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /auto_reloads2 with detached filters WiceGrid', typ"
  },
  {
    "path": "spec/features/auto_reloads3_request_spec.rb",
    "chars": 4240,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /auto_reloads3 with two tables and detached filters"
  },
  {
    "path": "spec/features/auto_reloads_request_spec.rb",
    "chars": 10435,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /auto_reloads WiceGrid', type: :feature, js: true d"
  },
  {
    "path": "spec/features/basics1_request_spec.rb",
    "chars": 251,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /basics1 the most simple WiceGrid',  js: true do\n  "
  },
  {
    "path": "spec/features/basics2_request_spec.rb",
    "chars": 215,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /basics2 with the parameter :name WiceGrid',  js: t"
  },
  {
    "path": "spec/features/basics3_request_spec.rb",
    "chars": 908,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /basics3 with :attrubute parameter WiceGrid',  js: "
  },
  {
    "path": "spec/features/basics4_request_spec.rb",
    "chars": 650,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /basics4 with filter: false WiceGrid',  js: true do"
  },
  {
    "path": "spec/features/basics5_request_spec.rb",
    "chars": 388,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /basics5 with allow_ordering: false WiceGrid',  js:"
  },
  {
    "path": "spec/features/basics6_request_spec.rb",
    "chars": 615,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /basics6 with the parameters :order and :order_dire"
  },
  {
    "path": "spec/features/blockless_column_definition_spec.rb",
    "chars": 978,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /blockless_column_definition it is possible to rend"
  },
  {
    "path": "spec/features/buttons_request_spec.rb",
    "chars": 4700,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /buttons with external buttons for Submit and Reset"
  },
  {
    "path": "spec/features/csv_and_detached_filters_spec.rb",
    "chars": 292,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /csv_and_detached_filters with external buttons and"
  },
  {
    "path": "spec/features/csv_export_request_spec.rb",
    "chars": 513,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /csv_export with enabled CSV export WiceGrid', type"
  },
  {
    "path": "spec/features/custom_filter_params_request_spec.rb",
    "chars": 870,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /custom_filter_params with helper :wice_grid_custom"
  },
  {
    "path": "spec/features/custom_filters1_request_spec.rb",
    "chars": 4708,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /custom_filters1 with one table and custom filters "
  },
  {
    "path": "spec/features/custom_filters2_request_spec.rb",
    "chars": 1087,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /custom_filters2 with joined tables and custom filt"
  },
  {
    "path": "spec/features/custom_filters3_request_spec.rb",
    "chars": 990,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /custom_filters3 with method chains and custom filt"
  },
  {
    "path": "spec/features/custom_filters4_request_spec.rb",
    "chars": 410,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /custom_filters4 with allow_multiple_selection: fal"
  },
  {
    "path": "spec/features/custom_ordering_on_calculated_request_spec.rb",
    "chars": 993,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /custom_ordering_on_calculated with sort_by: as a P"
  },
  {
    "path": "spec/features/custom_ordering_request_spec.rb",
    "chars": 1284,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /custom_ordering with custom_ordering in controler "
  },
  {
    "path": "spec/features/custom_ordering_with_arel_request_spec.rb",
    "chars": 1320,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /custom_ordering_with_arel with custom_ordering in "
  },
  {
    "path": "spec/features/custom_ordering_with_proc_request_spec.rb",
    "chars": 1553,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /custom_ordering_with_proc with custom_ordering in "
  },
  {
    "path": "spec/features/custom_ordering_with_ruby_request_spec.rb",
    "chars": 1016,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /custom_ordering_with_ruby with custom_ordering in "
  },
  {
    "path": "spec/features/dates_request_spec.rb",
    "chars": 1766,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /dates with filter_type: :rails_datetime_helper Wic"
  },
  {
    "path": "spec/features/detached_filters_spec.rb",
    "chars": 245,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /detached_filters with detached filters WiceGrid', "
  },
  {
    "path": "spec/features/detached_filters_two_grids_spec.rb",
    "chars": 4768,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /detached_filters_two_grids with detached filters a"
  },
  {
    "path": "spec/features/disable_all_filters_spec.rb",
    "chars": 825,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /disable_all_filters with show_filters: :no as a gr"
  },
  {
    "path": "spec/features/hiding_checkboxes_in_action_column_request_spec.rb",
    "chars": 8650,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /hiding_checkboxes_in_action_column with g.action_c"
  },
  {
    "path": "spec/features/integration_with_application_view_request_spec.rb",
    "chars": 2319,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /integration_with_application_view with the methods"
  },
  {
    "path": "spec/features/integration_with_forms_request_spec.rb",
    "chars": 3905,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ncontext 'On the page /integration_with_forms with another form on the pag"
  },
  {
    "path": "spec/features/joining_tables_spec.rb",
    "chars": 1358,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /joining_tables with :include in :initialize_grid t"
  },
  {
    "path": "spec/features/localization_request_spec.rb",
    "chars": 549,
    "preview": "# encoding: UTF-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /localization with the proper use of I18n WiceGrid'"
  },
  {
    "path": "spec/features/many_grids_on_page_request_spec.rb",
    "chars": 3104,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /many_grids_on_page with multiple girds on the page"
  },
  {
    "path": "spec/features/negation_request_spec.rb",
    "chars": 709,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /negation with negation: true WiceGrid', type: :req"
  },
  {
    "path": "spec/features/no_records_request_spec.rb",
    "chars": 809,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ncontext 'On the page /no_records when there is no records to show' do\n  d"
  },
  {
    "path": "spec/features/numeric_filters_request_spec.rb",
    "chars": 294,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /numeric_filters with filter_type: :range WiceGrid'"
  },
  {
    "path": "spec/features/resultset_processings2_request_spec.rb",
    "chars": 1330,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /resultset_processings2 with the helper :with_resul"
  },
  {
    "path": "spec/features/resultset_processings_request_spec.rb",
    "chars": 1373,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /resultset_processings with the helper :with_pagina"
  },
  {
    "path": "spec/features/saved_queries_request_spec.rb",
    "chars": 3443,
    "preview": "# encoding: utf-8\nrequire 'acceptance_helper'\n\ndescribe 'On the page /saved_queries when saved queries are configured Wi"
  },
  {
    "path": "spec/features/shared.rb",
    "chars": 28466,
    "preview": "# encoding: utf-8\nshared_examples 'basic task table specs' do\n  it 'is present on the page' do\n    expect(page).to have_"
  },
  {
    "path": "spec/features/shared_detached_filters.rb",
    "chars": 5244,
    "preview": "# encoding: utf-8\nshared_examples \"detached_filters\" do\n  it \"allows to filter by Archived\" do\n    select 'yes', :from ="
  },
  {
    "path": "spec/features/styling_spec.rb",
    "chars": 421,
    "preview": "require 'acceptance_helper'\n\ndescribe \"On the page /styling with the :html helper in the grid WiceGrid\", :type => :reque"
  },
  {
    "path": "spec/features/two_associations_spec.rb",
    "chars": 1173,
    "preview": "require 'acceptance_helper'\n\ncontext 'On the page /two_associations when two associations referring to the same model ar"
  },
  {
    "path": "spec/features/upper_pagination_panel_request_spec.rb",
    "chars": 678,
    "preview": "require 'acceptance_helper'\n\ndescribe \"On the page /upper_pagination_panel with the upper_pagination_panel parameter for"
  },
  {
    "path": "spec/features/when_filtered_spec.rb",
    "chars": 5416,
    "preview": "require 'acceptance_helper'\n\ndescribe \"On the page /when_filtered whith the parameter show_filters: :when_filtered in gr"
  },
  {
    "path": "spec/fixtures/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "spec/fixtures/companies.yml",
    "chars": 548,
    "preview": "---\ncompany_00005:\n  id: 5\n  name: MNU\n  created_at: 2022-02-26 22:11:12.000000000 Z\n  updated_at: 2022-02-26 22:11:12.0"
  },
  {
    "path": "spec/fixtures/priorities.yml",
    "chars": 728,
    "preview": "---\npriority_00006:\n  id: 6\n  name: Urgent\n  position: 0\n  created_at: 2022-02-26 22:11:12.000000000 Z\n  updated_at: 202"
  },
  {
    "path": "spec/fixtures/project_roles.yml",
    "chars": 658,
    "preview": "---\nproject_role_00005:\n  id: 5\n  name: Manager\n  can_close_tasks: true\n  created_at: 2022-02-26 22:11:12.000000000 Z\n  "
  },
  {
    "path": "spec/fixtures/projects.yml",
    "chars": 519,
    "preview": "---\nproject_00004:\n  id: 4\n  name: Ultimate Website\n  customer_id: 5\n  supplier_id: 7\n  created_at: 2022-02-26 22:11:12."
  },
  {
    "path": "spec/fixtures/statuses.yml",
    "chars": 1313,
    "preview": "---\nstatus_00010:\n  id: 10\n  name: New\n  position: 0\n  created_at: 2022-02-26 22:11:12.000000000 Z\n  updated_at: 2022-02"
  },
  {
    "path": "spec/fixtures/tasks.yml",
    "chars": 18954,
    "preview": "---\ntask_00507:\n  id: 507\n  title: sed impedit iste\n  description: Velit atque sapiente aspernatur sint fuga.\n  created_"
  },
  {
    "path": "spec/fixtures/tasks_users.yml",
    "chars": 27955,
    "preview": "---\njoin_00000:\n  task_id: 1\n  user_id: 10\njoin_00001:\n  task_id: 2\n  user_id: 5\njoin_00002:\n  task_id: 2\n  user_id: 4\nj"
  },
  {
    "path": "spec/fixtures/users.yml",
    "chars": 1637,
    "preview": "---\nuser_00013:\n  id: 13\n  name: Wikus van de Merwe\n  created_at: 2022-02-26 22:11:12.000000000 Z\n  updated_at: 2022-02-"
  },
  {
    "path": "spec/fixtures/versions.yml",
    "chars": 1837,
    "preview": "---\nversion_00012:\n  id: 12\n  name: '1.0'\n  project_id: 4\n  status: development\n  created_at: 2022-02-26 22:11:12.000000"
  },
  {
    "path": "spec/models/company_spec.rb",
    "chars": 154,
    "preview": "require 'rails_helper'\n\ndescribe Company do\n  it { is_expected.to have_many(:supplier_projects)}\n  it { is_expected.to h"
  },
  {
    "path": "spec/models/priority_spec.rb",
    "chars": 90,
    "preview": "require 'rails_helper'\n\ndescribe Priority do\n  it { is_expected.to have_many(:tasks)}\nend\n"
  },
  {
    "path": "spec/models/project_spec.rb",
    "chars": 365,
    "preview": "require 'rails_helper'\n\ndescribe Project do\n  it {is_expected.to have_many(:tasks)}\n  it { is_expected.to have_many(:tas"
  },
  {
    "path": "spec/models/status_spec.rb",
    "chars": 89,
    "preview": "require 'rails_helper'\n\ndescribe Status do\n  it {is_expected.to have_many(:tasks) }\nend\n\n"
  },
  {
    "path": "spec/models/task_spec.rb",
    "chars": 389,
    "preview": "require 'rails_helper'\n\ndescribe Task do\n  it { is_expected.to belong_to(:created_by)}\n  it { is_expected.to belong_to(:"
  },
  {
    "path": "spec/models/user_project_participation_spec.rb",
    "chars": 196,
    "preview": "require 'rails_helper'\n\ndescribe UserProjectParticipation do\n  it { is_expected.to belong_to(:user)}\n  it { is_expected."
  },
  {
    "path": "spec/models/user_spec.rb",
    "chars": 265,
    "preview": "require 'rails_helper'\n\ndescribe User do\n  it { is_expected.to have_many(:created_tasks)}\n  it { is_expected.to have_and"
  },
  {
    "path": "spec/models/version_spec.rb",
    "chars": 91,
    "preview": "require 'rails_helper'\n\ndescribe Version do\n  it { is_expected.to belong_to(:project)}\nend\n"
  },
  {
    "path": "spec/rails_helper.rb",
    "chars": 2705,
    "preview": "require 'rails/all'\nrequire 'spec_helper'\nrequire 'shoulda/matchers'\nrequire 'support/test_app/config/environment'\nrequi"
  },
  {
    "path": "spec/schema.rb",
    "chars": 192,
    "preview": "ActiveRecord::Schema.define(version: 20150713103513) do\n  create_table 'dummies', force: :cascade do |t|\n    t.string 'n"
  },
  {
    "path": "spec/spec_helper.rb",
    "chars": 2797,
    "preview": "# This file was generated by the `rspec --init` command. Conventionally, all\n# specs live under a `spec` directory, whic"
  },
  {
    "path": "spec/support/active_record.rb",
    "chars": 195,
    "preview": "require 'active_record'\n\nActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'\n\nload 'spec/sc"
  },
  {
    "path": "spec/support/download_helper.rb",
    "chars": 552,
    "preview": "module DownloadHelpers\n  TIMEOUT = 1\n  PATH    = Rails.root.join(\"tmp/downloads\")\n\n  extend self\n\n  def downloads\n    Di"
  },
  {
    "path": "spec/support/test_app/Rakefile",
    "chars": 68,
    "preview": "require_relative 'config/application'\n\nExamples::TestApp.load_tasks\n"
  },
  {
    "path": "spec/support/test_app/app/assets/builds/.keep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "spec/support/test_app/app/assets/builds/application.css",
    "chars": 702772,
    "preview": "@charset \"UTF-8\";\n/*\n * This is a manifest file that'll be compiled into application.css, which will include all the fil"
  },
  {
    "path": "spec/support/test_app/app/assets/config/manifest.js",
    "chars": 337,
    "preview": "//= link_tree ../images\n//= link_tree ../../javascript .js\n//= link_tree ../../../vendor/javascript .js\n//= link_tree .."
  },
  {
    "path": "spec/support/test_app/app/assets/stylesheets/adding_rows.scss",
    "chars": 79,
    "preview": ".last-row button, .extra-row button {margin: 10px}\n\n.urgent{font-weight: bold}\n"
  },
  {
    "path": "spec/support/test_app/app/assets/stylesheets/application.scss",
    "chars": 1434,
    "preview": "/*\n * This is a manifest file that'll be compiled into application.css, which will include all the files\n * listed below"
  },
  {
    "path": "spec/support/test_app/app/assets/stylesheets/csv_and_detached_filters.scss",
    "chars": 40,
    "preview": ".external-buttons{\n  margin-top: 10px;\n}"
  },
  {
    "path": "spec/support/test_app/app/assets/stylesheets/many_grids_on_page.scss",
    "chars": 55,
    "preview": ".many-grids-on-page input[type=text]{\n  width: 100px;\n}"
  },
  {
    "path": "spec/support/test_app/app/controllers/action_column_controller.rb",
    "chars": 336,
    "preview": "# encoding: utf-8\nclass ActionColumnController < ::ApplicationController\n  def index\n    @tasks_grid = initialize_grid(T"
  },
  {
    "path": "spec/support/test_app/app/controllers/adding_rows_controller.rb",
    "chars": 410,
    "preview": "# encoding: utf-8\nclass AddingRowsController < ApplicationController\n  def index\n    @tasks_grid = initialize_grid(Task,"
  },
  {
    "path": "spec/support/test_app/app/controllers/all_records_controller.rb",
    "chars": 410,
    "preview": "# encoding: utf-8\nclass AllRecordsController < ApplicationController\n  def index\n    @tasks_grid = initialize_grid(Task,"
  },
  {
    "path": "spec/support/test_app/app/controllers/application_controller.rb",
    "chars": 3889,
    "preview": "# encoding: utf-8\nclass ApplicationController < ActionController::Base\n  protect_from_forgery\n\n  before_action :init_exa"
  },
  {
    "path": "spec/support/test_app/app/controllers/auto_reloads2_controller.rb",
    "chars": 367,
    "preview": "# encoding: utf-8\nclass AutoReloads2Controller < ApplicationController\n  def index\n    @tasks_grid = initialize_grid(Tas"
  },
  {
    "path": "spec/support/test_app/app/controllers/auto_reloads3_controller.rb",
    "chars": 553,
    "preview": "# encoding: utf-8\nclass AutoReloads3Controller < ApplicationController\n  def index\n    @tasks_grid = initialize_grid(Tas"
  },
  {
    "path": "spec/support/test_app/app/controllers/auto_reloads_controller.rb",
    "chars": 363,
    "preview": "# encoding: utf-8\nclass AutoReloadsController < ApplicationController\n  def index\n    @tasks_grid = initialize_grid(Task"
  },
  {
    "path": "spec/support/test_app/app/controllers/basics1_controller.rb",
    "chars": 128,
    "preview": "# encoding: utf-8\nclass Basics1Controller < ApplicationController\n  def index\n    @tasks_grid = initialize_grid(Task)\n  "
  },
  {
    "path": "spec/support/test_app/app/controllers/basics2_controller.rb",
    "chars": 128,
    "preview": "# encoding: utf-8\nclass Basics2Controller < ApplicationController\n  def index\n    @tasks_grid = initialize_grid(Task)\n  "
  },
  {
    "path": "spec/support/test_app/app/controllers/basics3_controller.rb",
    "chars": 141,
    "preview": "# encoding: utf-8\nclass Basics3Controller < ApplicationController\n  def index\n    @tasks_grid = initialize_grid(Task, or"
  },
  {
    "path": "spec/support/test_app/app/controllers/basics4_controller.rb",
    "chars": 129,
    "preview": "# encoding: utf-8\nclass Basics4Controller < ApplicationController\n  def index\n     @tasks_grid = initialize_grid(Task)\n "
  },
  {
    "path": "spec/support/test_app/app/controllers/basics5_controller.rb",
    "chars": 129,
    "preview": "# encoding: utf-8\nclass Basics5Controller < ApplicationController\n  def index\n     @tasks_grid = initialize_grid(Task)\n "
  },
  {
    "path": "spec/support/test_app/app/controllers/basics6_controller.rb",
    "chars": 251,
    "preview": "# encoding: utf-8\nclass Basics6Controller < ApplicationController\n  def index\n    @tasks_grid = initialize_grid(Task,\n  "
  },
  {
    "path": "spec/support/test_app/app/controllers/blockless_column_definition_controller.rb",
    "chars": 160,
    "preview": "# encoding: utf-8\nclass BlocklessColumnDefinitionController < ApplicationController\n  def index\n     @tasks_grid = initi"
  },
  {
    "path": "spec/support/test_app/app/controllers/buttons_controller.rb",
    "chars": 128,
    "preview": "# encoding: utf-8\nclass ButtonsController < ApplicationController\n  def index\n    @tasks_grid = initialize_grid(Task)\n  "
  },
  {
    "path": "spec/support/test_app/app/controllers/csv_and_detached_filters_controller.rb",
    "chars": 310,
    "preview": "# encoding: utf-8\nclass CsvAndDetachedFiltersController < ApplicationController\n  def index\n    @tasks_grid = initialize"
  },
  {
    "path": "spec/support/test_app/app/controllers/csv_export_controller.rb",
    "chars": 841,
    "preview": "# encoding: utf-8\nclass CsvExportController < ApplicationController\n  def index\n    @tasks_grid = initialize_grid(Task,\n"
  },
  {
    "path": "spec/support/test_app/app/controllers/custom_filter_params_controller.rb",
    "chars": 145,
    "preview": "# encoding: utf-8\nclass CustomFilterParamsController < ApplicationController\n  def index\n    @projects_grid = initialize"
  },
  {
    "path": "spec/support/test_app/app/controllers/custom_filters1_controller.rb",
    "chars": 383,
    "preview": "# encoding: utf-8\nclass CustomFilters1Controller < ApplicationController\n  def index\n    @versions_grid1 = initialize_gr"
  },
  {
    "path": "spec/support/test_app/app/controllers/custom_filters2_controller.rb",
    "chars": 399,
    "preview": "# encoding: utf-8\nclass CustomFilters2Controller < ApplicationController\n  def index\n    @tasks_grid = initialize_grid(T"
  },
  {
    "path": "spec/support/test_app/app/controllers/custom_filters3_controller.rb",
    "chars": 364,
    "preview": "# encoding: utf-8\nclass CustomFilters3Controller < ApplicationController\n  def index\n    @tasks_grid = initialize_grid(T"
  },
  {
    "path": "spec/support/test_app/app/controllers/custom_filters4_controller.rb",
    "chars": 360,
    "preview": "# encoding: utf-8\nclass CustomFilters4Controller < ApplicationController\n  def index\n    @tasks_grid = initialize_grid(T"
  },
  {
    "path": "spec/support/test_app/app/controllers/custom_ordering_controller.rb",
    "chars": 421,
    "preview": "# encoding: utf-8\nclass CustomOrderingController < ApplicationController\n  def index\n    @status_grid1 = initialize_grid"
  },
  {
    "path": "spec/support/test_app/app/controllers/custom_ordering_on_calculated_controller.rb",
    "chars": 150,
    "preview": "# encoding: utf-8\nclass CustomOrderingOnCalculatedController < ApplicationController\n  def index\n    @status_grid = init"
  },
  {
    "path": "spec/support/test_app/app/controllers/custom_ordering_with_arel_controller.rb",
    "chars": 448,
    "preview": "# encoding: utf-8\nclass CustomOrderingWithArelController < ApplicationController\n  def index\n    @status_grid1 = initial"
  },
  {
    "path": "spec/support/test_app/app/controllers/custom_ordering_with_proc_controller.rb",
    "chars": 324,
    "preview": "# encoding: utf-8\nclass CustomOrderingWithProcController < ApplicationController\n  def index\n    @status_grid = initiali"
  },
  {
    "path": "spec/support/test_app/app/controllers/custom_ordering_with_ruby_controller.rb",
    "chars": 146,
    "preview": "# encoding: utf-8\nclass CustomOrderingWithRubyController < ApplicationController\n  def index\n    @status_grid = initiali"
  },
  {
    "path": "spec/support/test_app/app/controllers/dates_controller.rb",
    "chars": 150,
    "preview": "# encoding: utf-8\nclass DatesController < ApplicationController\n  def index\n    @tasks_grid = initialize_grid(Task,\n    "
  },
  {
    "path": "spec/support/test_app/app/controllers/detached_filters_controller.rb",
    "chars": 136,
    "preview": "# encoding: utf-8\nclass DetachedFiltersController < ApplicationController\n  def index\n    @tasks_grid = initialize_grid("
  },
  {
    "path": "spec/support/test_app/app/controllers/detached_filters_two_grids_controller.rb",
    "chars": 189,
    "preview": "# encoding: utf-8\nclass DetachedFiltersTwoGridsController < ApplicationController\n  def index\n    @grid1 = initialize_gr"
  },
  {
    "path": "spec/support/test_app/app/controllers/disable_all_filters_controller.rb",
    "chars": 139,
    "preview": "# encoding: utf-8\nclass DisableAllFiltersController < ApplicationController\n  def index\n     @tasks_grid = initialize_gr"
  },
  {
    "path": "spec/support/test_app/app/controllers/hiding_checkboxes_in_action_column_controller.rb",
    "chars": 284,
    "preview": "# encoding: utf-8\nclass HidingCheckboxesInActionColumnController < ApplicationController\n  def index\n    @tasks_grid = i"
  },
  {
    "path": "spec/support/test_app/app/controllers/home_controller.rb",
    "chars": 67,
    "preview": "# encoding: utf-8\nclass HomeController < ApplicationController\nend\n"
  },
  {
    "path": "spec/support/test_app/app/controllers/integration_with_application_view_controller.rb",
    "chars": 464,
    "preview": "# encoding: utf-8\nclass IntegrationWithApplicationViewController < ApplicationController\n  def index\n    @tasks_grid = i"
  },
  {
    "path": "spec/support/test_app/app/controllers/integration_with_forms_controller.rb",
    "chars": 263,
    "preview": "# encoding: utf-8\nclass IntegrationWithFormsController < ApplicationController\n  def index\n    @archived = params[:archi"
  },
  {
    "path": "spec/support/test_app/app/controllers/joining_tables_controller.rb",
    "chars": 337,
    "preview": "# encoding: utf-8\nclass JoiningTablesController < ApplicationController\n  def index\n    @tasks_grid = initialize_grid(Ta"
  },
  {
    "path": "spec/support/test_app/app/controllers/localization_controller.rb",
    "chars": 610,
    "preview": "# encoding: utf-8\nclass LocalizationController < ApplicationController\n  before_action :init_locale\n\n  def init_locale\n "
  },
  {
    "path": "spec/support/test_app/app/controllers/many_grids_on_page_controller.rb",
    "chars": 202,
    "preview": "# encoding: utf-8\nclass ManyGridsOnPageController < ApplicationController\n  def index\n    @tasks_grid1 = initialize_grid"
  },
  {
    "path": "spec/support/test_app/app/controllers/negation_controller.rb",
    "chars": 391,
    "preview": "# encoding: utf-8\nclass NegationController < ApplicationController\n  def index\n    @tasks_grid = initialize_grid(Task,\n "
  },
  {
    "path": "spec/support/test_app/app/controllers/no_records_controller.rb",
    "chars": 390,
    "preview": "# encoding: utf-8\nclass NoRecordsController < ApplicationController\n  def index\n    @tasks_grid  = initialize_grid(Task,"
  }
]

// ... and 196 more files (download for full content)

About this extraction

This page contains the full source code of the leikind/wice_grid GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 396 files (1.4 MB), approximately 475.7k tokens, and a symbol index with 999 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!