amelioration(procedures#filtres): filtre par regions avec un enum sur la collection des regions normalisés

This commit is contained in:
Martin 2023-02-20 06:40:57 +01:00 committed by mfo
parent b0a757a89d
commit a89f5d373f
5 changed files with 46 additions and 2 deletions

View file

@ -54,6 +54,7 @@ class Champ < ApplicationRecord
:block?, :block?,
:dossier_link?, :dossier_link?,
:departement?, :departement?,
:region?,
:titre_identite?, :titre_identite?,
:header_section?, :header_section?,
:simple_drop_down_list?, :simple_drop_down_list?,

View file

@ -90,7 +90,7 @@ class ProcedurePresentation < ApplicationRecord
fields.concat procedure.types_de_champ_for_procedure_presentation fields.concat procedure.types_de_champ_for_procedure_presentation
.pluck(:type_champ, :libelle, :private, :stable_id) .pluck(:type_champ, :libelle, :private, :stable_id)
.map { |(type_champ, libelle, is_private, stable_id)| field_hash(is_private ? TYPE_DE_CHAMP_PRIVATE : TYPE_DE_CHAMP, stable_id.to_s, label: libelle, type: (type_champ == TypeDeChamp.type_champs.fetch(:departements) ? :enum : :text)) } .map { |(type_champ, libelle, is_private, stable_id)| field_hash(is_private ? TYPE_DE_CHAMP_PRIVATE : TYPE_DE_CHAMP, stable_id.to_s, label: libelle, type: (TypeDeChamp.options_for_select?(type_champ) ? :enum : :text)) }
fields fields
end end

View file

@ -373,6 +373,10 @@ class TypeDeChamp < ApplicationRecord
type_champ == TypeDeChamp.type_champs.fetch(:departements) type_champ == TypeDeChamp.type_champs.fetch(:departements)
end end
def region?
type_champ == TypeDeChamp.type_champs.fetch(:regions)
end
def mesri? def mesri?
type_champ == TypeDeChamp.type_champs.fetch(:mesri) type_champ == TypeDeChamp.type_champs.fetch(:mesri)
end end
@ -409,9 +413,18 @@ class TypeDeChamp < ApplicationRecord
self.drop_down_options = parse_drop_down_list_value(value) self.drop_down_options = parse_drop_down_list_value(value)
end end
def self.options_for_select?(type_champs)
[
TypeDeChamp.type_champs.fetch(:departements),
TypeDeChamp.type_champs.fetch(:regions)
].include?(type_champs)
end
def options_for_select def options_for_select
if departement? if departement?
APIGeoService.departements.map { ["#{_1[:code]} #{_1[:name]}", _1[:name]] } APIGeoService.departements.map { ["#{_1[:code]} #{_1[:name]}", _1[:name]] }
elsif region?
APIGeoService.regions.map { [_1[:name], _1[:name]] }
end end
end end

View file

@ -206,6 +206,12 @@ FactoryBot.define do
end end
end end
trait :with_region do
after(:build) do |procedure, _evaluator|
build(:type_de_champ_regions, procedure: procedure)
end
end
trait :with_piece_justificative do trait :with_piece_justificative do
after(:build) do |procedure, _evaluator| after(:build) do |procedure, _evaluator|
build(:type_de_champ_piece_justificative, procedure: procedure) build(:type_de_champ_piece_justificative, procedure: procedure)

View file

@ -1,6 +1,6 @@
describe "procedure filters" do describe "procedure filters" do
let(:instructeur) { create(:instructeur) } let(:instructeur) { create(:instructeur) }
let(:procedure) { create(:procedure, :published, :with_type_de_champ, :with_departement, instructeurs: [instructeur]) } let(:procedure) { create(:procedure, :published, :with_type_de_champ, :with_departement, :with_region, instructeurs: [instructeur]) }
let!(:type_de_champ) { procedure.active_revision.types_de_champ_public.first } let!(:type_de_champ) { procedure.active_revision.types_de_champ_public.first }
let!(:new_unfollow_dossier) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:en_instruction)) } let!(:new_unfollow_dossier) { create(:dossier, procedure: procedure, state: Dossier.states.fetch(:en_instruction)) }
let!(:champ) { Champ.find_by(type_de_champ_id: type_de_champ.id, dossier_id: new_unfollow_dossier.id) } let!(:champ) { Champ.find_by(type_de_champ_id: type_de_champ.id, dossier_id: new_unfollow_dossier.id) }
@ -118,6 +118,30 @@ describe "procedure filters" do
end end
end end
describe 'with a vcr cassette', vcr: { cassette_name: 'api_geo_regions' } do
let(:memory_store) { ActiveSupport::Cache.lookup_store(:memory_store) }
before do
allow(Rails).to receive(:cache).and_return(memory_store)
Rails.cache.clear
end
scenario "should be able to find by departements with custom enum lookup", js: true do
region_champ = new_unfollow_dossier.champs.find(&:regions?)
region_champ.update!(value: 'Bretagne', external_id: '53')
region_champ.reload
champ_select_value = "#{region_champ.external_id} #{region_champ.value}"
click_on 'Sélectionner un filtre'
select region_champ.libelle, from: "Colonne"
find("select#value", visible: true)
select champ_select_value, from: "Valeur"
click_button "Ajouter le filtre"
find("select#value", visible: false) # w8 for filter to be applied
expect(page).to have_link(new_unfollow_dossier.id.to_s)
end
end
scenario "should be able to add and remove two filters for the same field", js: true 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.value)
add_filter(type_de_champ.libelle, champ_2.value) add_filter(type_de_champ.libelle, champ_2.value)