add states filter for usager
This commit is contained in:
parent
aac1cc7161
commit
39f534b3d7
15 changed files with 114 additions and 6 deletions
|
@ -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;
|
||||
|
|
|
@ -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
|
21
app/components/dossiers/user_filter_component.rb
Normal file
21
app/components/dossiers/user_filter_component.rb
Normal 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
|
|
@ -0,0 +1,3 @@
|
|||
en:
|
||||
legend:
|
||||
states: States
|
|
@ -0,0 +1,3 @@
|
|||
fr:
|
||||
legend:
|
||||
states: États
|
|
@ -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
|
|
@ -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
|
||||
|
|
18
app/models/dossiers_filter.rb
Normal file
18
app/models/dossiers_filter.rb
Normal 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
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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|
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue