From 44488c7014fe1960c8daa01a723e858d6dd8a204 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Fri, 13 Jan 2023 16:40:48 +0100 Subject: [PATCH] feat(dossier): use select in filters bygroupe instructeur --- app/components/dossiers/filter_component.rb | 2 +- app/models/procedure_presentation.rb | 29 +++++++++++++++---- .../models/procedure_presentation/en.yml | 1 + .../models/procedure_presentation/fr.yml | 1 + spec/models/procedure_presentation_spec.rb | 8 ++--- .../instructeurs/procedure_filters_spec.rb | 9 ++++++ 6 files changed, 40 insertions(+), 10 deletions(-) diff --git a/app/components/dossiers/filter_component.rb b/app/components/dossiers/filter_component.rb index f827393fc..1f4c9a54f 100644 --- a/app/components/dossiers/filter_component.rb +++ b/app/components/dossiers/filter_component.rb @@ -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 diff --git a/app/models/procedure_presentation.rb b/app/models/procedure_presentation.rb index d33c6f315..f6dd14071 100644 --- a/app/models/procedure_presentation.rb +++ b/app/models/procedure_presentation.rb @@ -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' - dossiers - .joins(:groupe_instructeur) - .filter_ilike(table, column, values) + 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 diff --git a/config/locales/models/procedure_presentation/en.yml b/config/locales/models/procedure_presentation/en.yml index 48cbb41a6..8c46c4965 100644 --- a/config/locales/models/procedure_presentation/en.yml +++ b/config/locales/models/procedure_presentation/en.yml @@ -22,6 +22,7 @@ en: followers_instructeurs: email: Email instructeur groupe_instructeur: + id: Team label: Team individual: prenom: First name diff --git a/config/locales/models/procedure_presentation/fr.yml b/config/locales/models/procedure_presentation/fr.yml index 6a3496ded..640c1a5a2 100644 --- a/config/locales/models/procedure_presentation/fr.yml +++ b/config/locales/models/procedure_presentation/fr.yml @@ -22,6 +22,7 @@ fr: followers_instructeurs: email: Email instructeur groupe_instructeur: + id: Groupe instructeur label: Groupe instructeur individual: prenom: Prénom diff --git a/spec/models/procedure_presentation_spec.rb b/spec/models/procedure_presentation_spec.rb index 0f7cae5ed..2e7168e21 100644 --- a/spec/models/procedure_presentation_spec.rb +++ b/spec/models/procedure_presentation_spec.rb @@ -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 diff --git a/spec/system/instructeurs/procedure_filters_spec.rb b/spec/system/instructeurs/procedure_filters_spec.rb index 44ef71eb9..86430d082 100644 --- a/spec/system/instructeurs/procedure_filters_spec.rb +++ b/spec/system/instructeurs/procedure_filters_spec.rb @@ -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)