Merge pull request #8432 from tchak/feat-better-filters
feat(dossier): use select in filters by groupe instructeur
This commit is contained in:
commit
3ea02b182a
6 changed files with 40 additions and 10 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -22,6 +22,7 @@ en:
|
|||
followers_instructeurs:
|
||||
email: Email instructeur
|
||||
groupe_instructeur:
|
||||
id: Team
|
||||
label: Team
|
||||
individual:
|
||||
prenom: First name
|
||||
|
|
|
@ -22,6 +22,7 @@ fr:
|
|||
followers_instructeurs:
|
||||
email: Email instructeur
|
||||
groupe_instructeur:
|
||||
id: Groupe instructeur
|
||||
label: Groupe instructeur
|
||||
individual:
|
||||
prenom: Prénom
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue