Merge pull request #8432 from tchak/feat-better-filters

feat(dossier): use select in filters by groupe instructeur
This commit is contained in:
Paul Chavard 2023-01-16 15:59:10 +01:00 committed by GitHub
commit 3ea02b182a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 40 additions and 10 deletions

View file

@ -18,6 +18,6 @@ class Dossiers::FilterComponent < ApplicationComponent
end
def options_for_select_of_field
I18n.t(procedure_presentation.field_enum(field_id)).map(&:to_a).map(&:reverse)
procedure_presentation.field_enum(field_id)
end
end

View file

@ -60,7 +60,7 @@ class ProcedurePresentation < ApplicationRecord
fields.push(
field_hash('user', 'email', type: :text),
field_hash('followers_instructeurs', 'email', type: :text),
field_hash('groupe_instructeur', 'label', type: :text)
field_hash('groupe_instructeur', 'id', type: :enum)
)
if procedure.for_individual
@ -214,9 +214,16 @@ class ProcedurePresentation < ApplicationRecord
.includes(table)
.filter_ilike(table, column, values)
when 'groupe_instructeur'
assert_supported_column(table, column)
if column == 'label'
dossiers
.joins(:groupe_instructeur)
.filter_ilike(table, column, values)
else
dossiers
.joins(:groupe_instructeur)
.where(groupe_instructeur_id: values)
end
end.pluck(:id)
end.reduce(:&)
end
@ -237,6 +244,9 @@ class ProcedurePresentation < ApplicationRecord
find_type_de_champ(filter[COLUMN]).dynamic_type.filter_to_human(filter['value'])
elsif filter['column'] == 'state'
Dossier.human_attribute_name("state.#{filter['value']}")
elsif filter['table'] == 'groupe_instructeur' && filter['column'] == 'id'
instructeur.groupe_instructeurs
.find { _1.id == filter['value'].to_i }&.label || "Groupe Instucteur #{filter['value']}"
else
filter['value']
end
@ -316,7 +326,13 @@ class ProcedurePresentation < ApplicationRecord
end
def field_enum(field_id)
find_field(*field_id.split(SLASH))['scope']
field = find_field(*field_id.split(SLASH))
if field['scope'].present?
I18n.t(field['scope']).map(&:to_a).map(&:reverse)
elsif field['table'] == 'groupe_instructeur'
instructeur.groupe_instructeurs
.map { [_1.label, _1.id] }
end
end
private
@ -424,5 +440,8 @@ class ProcedurePresentation < ApplicationRecord
if table == 'followers_instructeurs' && column != 'email'
raise ArgumentError, 'Table `followers_instructeurs` only supports the `email` column.'
end
if table == 'groupe_instructeur' && (column != 'label' && column != 'id')
raise ArgumentError, 'Table `groupe_instructeur` only supports the `label` or `id` column.'
end
end
end

View file

@ -22,6 +22,7 @@ en:
followers_instructeurs:
email: Email instructeur
groupe_instructeur:
id: Team
label: Team
individual:
prenom: First name

View file

@ -22,6 +22,7 @@ fr:
followers_instructeurs:
email: Email instructeur
groupe_instructeur:
id: Groupe instructeur
label: Groupe instructeur
individual:
prenom: Prénom

View file

@ -72,7 +72,7 @@ describe ProcedurePresentation do
{ "label" => "Statut", "table" => "self", "column" => "state", "classname" => "", 'virtual' => true, 'scope' => 'instructeurs.dossiers.filterable_state', 'type' => :enum },
{ "label" => 'Demandeur', "table" => 'user', "column" => 'email', 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '' },
{ "label" => 'Email instructeur', "table" => 'followers_instructeurs', "column" => 'email', 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '' },
{ "label" => 'Groupe instructeur', "table" => 'groupe_instructeur', "column" => 'label', 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '' },
{ "label" => 'Groupe instructeur', "table" => 'groupe_instructeur', "column" => 'id', 'classname' => '', 'virtual' => false, 'type' => :enum, "scope" => '' },
{ "label" => 'SIREN', "table" => 'etablissement', "column" => 'entreprise_siren', 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '' },
{ "label" => 'Forme juridique', "table" => 'etablissement', "column" => 'entreprise_forme_juridique', 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '' },
{ "label" => 'Nom commercial', "table" => 'etablissement', "column" => 'entreprise_nom_commercial', 'classname' => '', 'virtual' => false, 'type' => :text, "scope" => '' },
@ -739,7 +739,7 @@ describe ProcedurePresentation do
end
context 'for groupe_instructeur table' do
let(:filter) { [{ 'table' => 'groupe_instructeur', 'column' => 'label', 'value' => 'défaut' }] }
let(:filter) { [{ 'table' => 'groupe_instructeur', 'column' => 'id', 'value' => procedure.defaut_groupe_instructeur.id.to_s }] }
let!(:gi_2) { procedure.groupe_instructeurs.create(label: 'gi2') }
let!(:gi_3) { procedure.groupe_instructeurs.create(label: 'gi3') }
@ -752,8 +752,8 @@ describe ProcedurePresentation do
context 'with multiple search values' do
let(:filter) do
[
{ 'table' => 'groupe_instructeur', 'column' => 'label', 'value' => 'défaut' },
{ 'table' => 'groupe_instructeur', 'column' => 'label', 'value' => 'gi3' }
{ 'table' => 'groupe_instructeur', 'column' => 'id', 'value' => procedure.defaut_groupe_instructeur.id.to_s },
{ 'table' => 'groupe_instructeur', 'column' => 'id', 'value' => gi_3.id.to_s }
]
end

View file

@ -97,6 +97,7 @@ describe "procedure filters" do
scenario "should be able to add and remove two filters for the same field", js: true do
add_filter(type_de_champ.libelle, champ.value)
add_filter(type_de_champ.libelle, champ_2.value)
add_enum_filter('Groupe instructeur', procedure.groupe_instructeurs.first.label)
within ".dossiers-table" do
expect(page).to have_link(new_unfollow_dossier.id.to_s, exact: true)
@ -138,6 +139,14 @@ describe "procedure filters" do
expect(page).to have_no_css("select#field", visible: true)
end
def add_enum_filter(column_name, filter_value)
click_on 'Sélectionner un filtre'
select column_name, from: "Colonne"
select filter_value, from: "Valeur"
click_button "Ajouter le filtre"
expect(page).to have_no_css("select#field", visible: true)
end
def add_column(column_name)
click_on 'Personnaliser'
select_combobox('Colonne à afficher', column_name, column_name, check: false)