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
|
// 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
|
// remove pointer cursor on textarea
|
||||||
textarea {
|
textarea {
|
||||||
cursor: auto;
|
cursor: auto;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
class Dossiers::FilterComponent < ApplicationComponent
|
class Dossiers::InstructeurFilterComponent < ApplicationComponent
|
||||||
def initialize(procedure:, procedure_presentation:, statut:, field_id: nil)
|
def initialize(procedure:, procedure_presentation:, statut:, field_id: nil)
|
||||||
@procedure = procedure
|
@procedure = procedure
|
||||||
@procedure_presentation = procedure_presentation
|
@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)
|
end.page(page)
|
||||||
|
|
||||||
@first_brouillon_recently_updated = current_user.dossiers.visible_by_user.brouillons_recently_updated.first
|
@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
|
end
|
||||||
|
|
||||||
def show
|
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')
|
= t('views.instructeurs.dossiers.filters.title')
|
||||||
|
|
||||||
- menu.with_form do
|
- 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
|
= 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 }
|
= render partial: "dossiers_list", locals: { dossiers: @dossiers }
|
||||||
|
|
||||||
- else
|
- 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 @statut == "en-cours"
|
||||||
- if @first_brouillon_recently_updated.present?
|
- 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|
|
= 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_construction) { create(:dossier, :with_populated_champs, :en_construction, user: user) }
|
||||||
let!(:dossier_en_instruction) { create(:dossier, :en_instruction, user: user) }
|
let!(:dossier_en_instruction) { create(:dossier, :en_instruction, user: user) }
|
||||||
let!(:dossier_traite) { create(:dossier, :accepte, 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!(:dossier_archived) { create(:dossier, :en_instruction, :archived, user: user) }
|
||||||
let(:dossiers_per_page) { 25 }
|
let(:dossiers_per_page) { 25 }
|
||||||
let(:last_updated_dossier) { dossier_en_construction }
|
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_en_instruction.procedure.libelle)
|
||||||
expect(page).to have_content(dossier_archived.procedure.libelle)
|
expect(page).to have_content(dossier_archived.procedure.libelle)
|
||||||
expect(page).to have_text('4 en cours')
|
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
|
||||||
|
|
||||||
it 'the list must be ordered by last updated' do
|
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")
|
page.click_link("Suivant")
|
||||||
expect(page).to have_content(dossier_en_instruction.procedure.libelle)
|
expect(page).to have_content(dossier_en_instruction.procedure.libelle)
|
||||||
expect(page).to have_text('4 en cours')
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue