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
================================================
[](https://rubygems.org/gems/wice_grid)
[](https://circleci.com/gh/leikind/wice_grid)
[](http://inch-ci.org/github/leikind/wice_grid)
[](#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
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
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": "[](https://rubygems.org/gems/wice_grid)\n[\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.