add states filter for usager

This commit is contained in:
Lisa Durand 2023-04-28 15:28:04 +02:00
parent aac1cc7161
commit 39f534b3d7
15 changed files with 114 additions and 6 deletions

View file

@ -39,6 +39,11 @@ input[type="radio"] {
}
// scss-lint:enable DuplicateProperty
// remove additional calendar icon on date input already handle by navigator
.fr-input[type="date"] {
background-image: none;
}
// remove pointer cursor on textarea
textarea {
cursor: auto;

View file

@ -1,4 +1,4 @@
class Dossiers::FilterComponent < ApplicationComponent
class Dossiers::InstructeurFilterComponent < ApplicationComponent
def initialize(procedure:, procedure_presentation:, statut:, field_id: nil)
@procedure = procedure
@procedure_presentation = procedure_presentation

View file

@ -0,0 +1,21 @@
class Dossiers::UserFilterComponent < ApplicationComponent
def initialize(statut:, filter:)
@statut = statut
@filter = filter
end
attr_reader :statut, :filter
def render?
['en-cours', 'traites'].include?(@statut)
end
def states_collection(statut)
case statut
when 'en-cours'
Dossier.states.values - Dossier::TERMINE
when 'traites'
Dossier::TERMINE
end
end
end

View file

@ -0,0 +1,3 @@
en:
legend:
states: States

View file

@ -0,0 +1,3 @@
fr:
legend:
states: États

View file

@ -0,0 +1,18 @@
= form_with(url: dossiers_path(), method: :get ) do |f|
= f.hidden_field :statut, value: @statut
.fr-grid-row.fr-grid-row--gutters
.fr-col-12.fr-col-md-6
%fieldset#checkboxes-inline.fr-fieldset{ "aria-labelledby" => "checkboxes-inline-legend checkboxes-inline-messages" }
%legend.fr-fieldset__legend--regular.fr-fieldset__legend
= t('.legend.states')
= f.collection_check_boxes :states, states_collection(@statut), :to_s, :to_s, include_hidden: false do |b|
.fr-fieldset__element.fr-fieldset__element--inline
.fr-checkbox-group.fr-ml-2w.fr-py-1w
= b.check_box(checked: filter.states_filtered?(b.value))
= b.label(class: 'fr-label') { t b.text, scope: 'activerecord.attributes.procedure.aasm_state' }
.fr-mb-2w
= f.submit 'Appliquer les filtres', class: 'fr-btn fr-btn--sm'
= link_to 'Réinitialiser les filtres', dossiers_path(statut: @statut), class: 'fr-btn fr-btn--sm fr-btn--tertiary-no-outline'
%hr

View file

@ -49,6 +49,16 @@ module Users
end.page(page)
@first_brouillon_recently_updated = current_user.dossiers.visible_by_user.brouillons_recently_updated.first
@filter = DossiersFilter.new(current_user, params)
if params[:states]
@dossiers_result = filter_procedures(@filter, current_user.dossiers.visible_by_user)
@dossiers = @dossiers_result.page(page)
end
end
def filter_procedures(filter, dossiers)
dossiers.where(state: filter.states) if filter.states.present?
end
def show

View file

@ -0,0 +1,18 @@
class DossiersFilter
attr_reader :user, :params
ITEMS_PER_PAGE = 25
def initialize(user, params)
@user = user
@params = params.permit(:page, :from_publication_date, states: [])
end
def states
params[:states].compact_blank if params[:states].present?
end
def states_filtered?(state)
states&.include?(state)
end
end

View file

@ -3,5 +3,4 @@
= t('views.instructeurs.dossiers.filters.title')
- menu.with_form do
= render Dossiers::FilterComponent.new(procedure: procedure, procedure_presentation: @procedure_presentation, statut: statut)
= render Dossiers::InstructeurFilterComponent.new(procedure: procedure, procedure_presentation: @procedure_presentation, statut: statut)

View file

@ -1,2 +1,2 @@
= turbo_stream.replace 'filter-component' do
= render Dossiers::FilterComponent.new(procedure: @procedure, procedure_presentation: @procedure_presentation, statut: @statut, field_id: @field)
= render Dossiers::InstructeurFilterComponent.new(procedure: @procedure, procedure_presentation: @procedure_presentation, statut: @statut, field_id: @field)

View file

@ -68,6 +68,10 @@
= render partial: "dossiers_list", locals: { dossiers: @dossiers }
- else
- user_filter_component = Dossiers::UserFilterComponent.new(statut: @statut, filter: @filter)
- if user_filter_component.render?
= render user_filter_component
- if @statut == "en-cours"
- if @first_brouillon_recently_updated.present?
= render Dsfr::CalloutComponent.new(title: t('users.dossiers.header.callout.first_brouillon_recently_updated_title'), heading_level: 'h2') do |c|

View file

@ -4,6 +4,7 @@ describe 'user access to the list of their dossiers', js: true do
let!(:dossier_en_construction) { create(:dossier, :with_populated_champs, :en_construction, user: user) }
let!(:dossier_en_instruction) { create(:dossier, :en_instruction, user: user) }
let!(:dossier_traite) { create(:dossier, :accepte, user: user) }
let!(:dossier_refuse) { create(:dossier, :refuse, user: user) }
let!(:dossier_archived) { create(:dossier, :en_instruction, :archived, user: user) }
let(:dossiers_per_page) { 25 }
let(:last_updated_dossier) { dossier_en_construction }
@ -28,7 +29,7 @@ describe 'user access to the list of their dossiers', js: true do
expect(page).to have_content(dossier_en_instruction.procedure.libelle)
expect(page).to have_content(dossier_archived.procedure.libelle)
expect(page).to have_text('4 en cours')
expect(page).to have_text('1 traité')
expect(page).to have_text('2 traités')
end
it 'the list must be ordered by last updated' do
@ -51,7 +52,33 @@ describe 'user access to the list of their dossiers', js: true do
page.click_link("Suivant")
expect(page).to have_content(dossier_en_instruction.procedure.libelle)
expect(page).to have_text('4 en cours')
expect(page).to have_text('1 traité')
expect(page).to have_text('2 traités')
end
end
context 'when user uses filter' do
scenario 'user filter by brouillon state on tab "en-cours"' do
expect(page).to have_text('4 en cours')
expect(page).to have_text('2 traités')
expect(page).to have_text('4 sur 4 dossiers')
find("label", text: "Brouillon").click
click_on('Appliquer les filtres')
expect(page).to have_text('1 dossier')
expect(page).to have_checked_field('Brouillon')
end
scenario 'user filter by brouillon state on tab "traité"' do
visit dossiers_path(statut: 'traites')
expect(page).to have_text('4 en cours')
expect(page).to have_text('2 traités')
expect(page).to have_text('2 sur 2 dossiers')
find("label", text: "Refuse").click
click_on('Appliquer les filtres')
expect(page).to have_text('1 dossier')
expect(page).to have_checked_field('Refuse')
click_on('Réinitialiser les filtres')
expect(page).to have_text('2 sur 2 dossiers')
expect(page).to have_unchecked_field('Refuse')
end
end