improve filter

This commit is contained in:
david 2024-10-27 02:14:52 +02:00
parent 0d2e10d243
commit 351dc53029
3 changed files with 25 additions and 8 deletions

View file

@ -69,7 +69,7 @@ class ChecksController < ApplicationController
end end
def filter_params def filter_params
@filter_params ||= params.permit(filter: [ :s, priority: [], conformity_level: [], standard_ids: [], principle_id: [] ])[:filter] || {} @filter_params ||= params.permit(filter: [ :s, priority: [], conformity_level: [], standard_ids: [], principle_id: [], target_disabilities: []])[:filter] || {}
end end
private private

View file

@ -54,19 +54,18 @@ class Check < ApplicationRecord
before_validation { self.number = self.class.maximum(:id).to_i + 1 unless self.number.present? } before_validation { self.number = self.class.maximum(:id).to_i + 1 unless self.number.present? }
scope(:search, lambda { |term| scope(:search, lambda { |terms|
# TODO: Search only fields for current locale. # TODO: Search only fields for current locale.
joined = joins("INNER JOIN action_text_rich_texts ON action_text_rich_texts.record_id = checks.id AND record_type = 'Check'") joined = joins("INNER JOIN action_text_rich_texts ON action_text_rich_texts.record_id = checks.id AND record_type = 'Check'")
if term.to_i > 0 terms.split(" ").uniq.each_with_index do |term, i|
joined.where("checks.name_de LIKE :term OR checks.name_de LIKE :term OR checks.number = :number OR action_text_rich_texts.body LIKE :term", term: "%#{term}%", number: term.to_i).distinct joined = joined.where("checks.name_de LIKE :term OR action_text_rich_texts.body LIKE :term", term: "%#{term}%")
else
joined.where("checks.name_de LIKE :term OR checks.name_de LIKE :term OR action_text_rich_texts.body LIKE :term", term: "%#{term}%").distinct
end end
joined.distinct
}) })
scope(:filter_by, lambda { |filter| scope(:filter_by, lambda { |filter|
relation = where(nil) relation = where(nil)
filter.slice(:s, :principle_id, :priorities, :standard_ids, :conformity_level).each do |key, value| filter.slice(:s, :principle_id, :priorities, :standard_ids, :conformity_level, :target_disabilities).each do |key, value|
next unless value.present? next unless value.present?
case key case key
@ -74,6 +73,16 @@ class Check < ApplicationRecord
relation = relation.search(value) relation = relation.search(value)
when "standard_ids" when "standard_ids"
relation = relation.joins(:standards).where(standards: { id: value }) relation = relation.joins(:standards).where(standards: { id: value })
when "target_disabilities"
cond = String.new
value.intersection(%w(auditory visual physical cognitive)).each_with_index do |v, i|
if i == 0
cond << "checks.#{v} = 1"
else
cond << " OR checks.#{v} = 1"
end
end
relation = relation.where("(#{cond})")
else else
relation = relation.where(key => value) relation = relation.where(key => value)
end end
@ -90,6 +99,10 @@ class Check < ApplicationRecord
[ "links", "principle", "rich_text_comment", "rich_text_conformity_notice_de", "rich_text_conformity_notice_en", "rich_text_criterion_de", "rich_text_criterion_details_de", "rich_text_criterion_details_en", "rich_text_criterion_en", "rich_text_example_de", "rich_text_example_en", "rich_text_exemption_details_de", "rich_text_exemption_details_en", "rich_text_powerpoint_text_de", "rich_text_powerpoint_text_en", "rich_text_quick_criterion_de", "rich_text_quick_criterion_en", "rich_text_quick_fail_de", "rich_text_quick_fail_en", "rich_text_quick_fix_de", "rich_text_quick_fix_en", "rich_text_standard_text_de", "rich_text_standard_text_en", "rich_text_test_instructions", "standards" ] [ "links", "principle", "rich_text_comment", "rich_text_conformity_notice_de", "rich_text_conformity_notice_en", "rich_text_criterion_de", "rich_text_criterion_details_de", "rich_text_criterion_details_en", "rich_text_criterion_en", "rich_text_example_de", "rich_text_example_en", "rich_text_exemption_details_de", "rich_text_exemption_details_en", "rich_text_powerpoint_text_de", "rich_text_powerpoint_text_en", "rich_text_quick_criterion_de", "rich_text_quick_criterion_en", "rich_text_quick_fail_de", "rich_text_quick_fail_en", "rich_text_quick_fix_de", "rich_text_quick_fix_en", "rich_text_standard_text_de", "rich_text_standard_text_en", "rich_text_test_instructions", "standards" ]
end end
def self.target_disabilities
%i[visual auditory physical cognitive].index_with { self }
end
def display_target_disabilities def display_target_disabilities
%i[visual auditory physical cognitive].select { |d| send(:"#{d}?") }.map { |d| I18n.t("disability.#{d}") }.join(", ") %i[visual auditory physical cognitive].select { |d| send(:"#{d}?") }.map { |d| I18n.t("disability.#{d}") }.join(", ")
end end

View file

@ -19,7 +19,7 @@ h1
= bootstrap_form_with(url: checks_path, method: :get, scope: :filter) do |form| = bootstrap_form_with(url: checks_path, method: :get, scope: :filter) do |form|
= form.hidden_field :page, value: params[:page] if params[:page] = form.hidden_field :page, value: params[:page] if params[:page]
.row .row
.col-lg-5 .col-lg-12
= form.text_field(:s, placeholder: "suchen...", hide_label: true, value: filter_params[:s]) = form.text_field(:s, placeholder: "suchen...", hide_label: true, value: filter_params[:s])
.col-lg-2 .col-lg-2
- Principle.all.sort_by(&:name_de).each do |principle| - Principle.all.sort_by(&:name_de).each do |principle|
@ -37,6 +37,10 @@ h1
- Check.priorities.each do |priority, value| - Check.priorities.each do |priority, value|
.form-check.form-check-inline .form-check.form-check-inline
= form.check_box :priority, { label: t("priority.#{priority}"), multiple: true, checked: (filter_params[:priority] || []).include?(value.to_s) }, value, nil = form.check_box :priority, { label: t("priority.#{priority}"), multiple: true, checked: (filter_params[:priority] || []).include?(value.to_s) }, value, nil
.col-lg-1
- Check.target_disabilities.map { |d, _v| [I18n.t("disability.#{d}"), d] }.each do |target_disability, value|
.form-check.form-check-inline
= form.check_box :target_disabilities, { label: target_disability, multiple: true, checked: (filter_params[:target_disabilities] || []).include?(value.to_s) }, value, nil
.row .row
.col .col
= form.submit name: "", value: "Filtern" = form.submit name: "", value: "Filtern"