diff --git a/app/controllers/instructeurs/procedures_controller.rb b/app/controllers/instructeurs/procedures_controller.rb index 051facd28..2ea5f4650 100644 --- a/app/controllers/instructeurs/procedures_controller.rb +++ b/app/controllers/instructeurs/procedures_controller.rb @@ -4,6 +4,7 @@ module Instructeurs before_action :ensure_not_super_admin!, only: [:download_export] ITEMS_PER_PAGE = 25 + BATCH_SELECTION_LIMIT = 500 def index @procedures = current_instructeur diff --git a/app/javascript/controllers/batch_operation_controller.ts b/app/javascript/controllers/batch_operation_controller.ts index 5662b140a..7b9f52b90 100644 --- a/app/javascript/controllers/batch_operation_controller.ts +++ b/app/javascript/controllers/batch_operation_controller.ts @@ -20,7 +20,10 @@ export class BatchOperationController extends ApplicationController { this.inputTargets.forEach((e) => (e.checked = target.checked)); this.toggleSubmitButtonWhenNeeded(); - displayNotice(this.inputTargets); + const pagination = document.querySelector('.pagination') + if (pagination) { + displayNotice(this.inputTargets); + } } onSelectMore(event) { @@ -38,6 +41,7 @@ export class BatchOperationController extends ApplicationController { event.preventDefault(); emptyCheckboxes(); deleteSelection(); + this.toggleSubmitButtonWhenNeeded(); } toggleSubmitButtonWhenNeeded() { diff --git a/app/views/instructeurs/procedures/_notice_dossier_select_all.html.haml b/app/views/instructeurs/procedures/_notice_dossier_select_all.html.haml index 39302669e..472de04a4 100644 --- a/app/views/instructeurs/procedures/_notice_dossier_select_all.html.haml +++ b/app/views/instructeurs/procedures/_notice_dossier_select_all.html.haml @@ -5,13 +5,19 @@ %p.fr-notice__title Les %span#dynamic_number n - dossiers de cette pages sont sélectionnés. - %a{ :href => "#", data: { action: "batch-operation#onSelectMore", dossiers: @filtered_sorted_ids.join(',') } } - = "Sélectionner les #{@dossiers_count} dossiers." + dossiers de cette page sont sélectionnés. + %a{ :href => "#", data: { action: "batch-operation#onSelectMore", dossiers: @filtered_sorted_ids.first(Instructeurs::ProceduresController::BATCH_SELECTION_LIMIT).join(',') } } + - if @dossiers_count <= Instructeurs::ProceduresController::BATCH_SELECTION_LIMIT + = "Sélectionner les #{@dossiers_count} dossiers." + - else + = "Sélectionner les #{Instructeurs::ProceduresController::BATCH_SELECTION_LIMIT} premiers dossiers sur les #{@dossiers_count}" #selected.hidden %p.fr-notice__title - = "#{@dossiers_count} dossiers sont sélectionnés" + - if @dossiers_count <= Instructeurs::ProceduresController::BATCH_SELECTION_LIMIT + = "#{@dossiers_count} dossiers sont sélectionnés." + - else + = "#{Instructeurs::ProceduresController::BATCH_SELECTION_LIMIT} dossiers sont sélectionnés." %a{ :href => "#", data: { action: "batch-operation#onDeleteSelection" } } = "Effacer la sélection" - = check_box_tag :"batch_operation[dossier_ids][]", [], false, class: 'hidden', data: { batch_operation_target: "input", action: "batch-operation#onCheckOne", operations: "accepter,repasser_en_construction,follow,unfollow" }, form: dom_id(BatchOperation.new), id: dom_id(BatchOperation.new, "checkbox_multiple"), aria: { label: t('views.instructeurs.dossiers.batch_operation.enabled') } + = check_box_tag :"batch_operation[dossier_ids][]", [], false, class: 'hidden', data: { batch_operation_target: "input", action: "batch-operation#onCheckOne", operations: BatchOperation.operations.values.join(',') }, form: dom_id(BatchOperation.new), id: dom_id(BatchOperation.new, "checkbox_multiple"), aria: { label: t('views.instructeurs.dossiers.batch_operation.enabled') } diff --git a/spec/system/instructeurs/batch_operation_spec.rb b/spec/system/instructeurs/batch_operation_spec.rb index 0d8f27ae3..e0545e9d7 100644 --- a/spec/system/instructeurs/batch_operation_spec.rb +++ b/spec/system/instructeurs/batch_operation_spec.rb @@ -61,18 +61,90 @@ describe 'BatchOperation a dossier:', js: true do # try checkall find("##{dom_id(BatchOperation.new, :checkbox_all)}").check + + # multiple select notice don't appear if all the dossiers are on the same page + expect(page).to have_selector('.fr-notice', visible: false) + [dossier_2, dossier_3].map do |dossier| dossier_checkbox_id = dom_id(BatchOperation.new, "checkbox_#{dossier.id}") expect(page).to have_selector("##{dossier_checkbox_id}:checked") end - # submnit checkall + # submit checkall expect { click_on "Archiver les dossiers" } .to change { BatchOperation.count } .from(1).to(2) expect(BatchOperation.last.dossiers).to match_array([dossier_2, dossier_3]) end + + scenario 'create a BatchOperation with more dossiers than pagination' do + stub_const "Instructeurs::ProceduresController::ITEMS_PER_PAGE", 2 + dossier_1 = create(:dossier, :en_instruction, procedure: procedure) + dossier_2 = create(:dossier, :en_instruction, procedure: procedure) + dossier_3 = create(:dossier, :en_instruction, procedure: procedure) + log_in(instructeur.email, password) + + visit instructeur_procedure_path(procedure, statut: 'a-suivre') + + expect(page).to have_content("1 - 2 sur 3 dossiers") + + # click on check_all make the notice appear + find("##{dom_id(BatchOperation.new, :checkbox_all)}").check + expect(page).to have_selector('.fr-notice') + expect(page).to have_content('Les 2 dossiers de cette pages sont sélectionnés. Sélectionner les 3 dossiers.') + + # click on selection link fill checkbox value with dossier_ids + click_on("Sélectionner les 3 dossiers") + expect(page).to have_content('3 dossiers sont sélectionnés. Effacer la sélection ') + expect(page).to have_selector('#checkbox_multiple_batch_operation', visible: false) + expect(find_field("batch_operation[dossier_ids][]", match: :first).value).to eq "#{dossier_3.id},#{dossier_2.id},#{dossier_1.id}" + + # click on delete link empty checkbox value and hide notice + click_on("Effacer la sélection") + expect(page).to have_selector('.fr-notice', visible: false) + expect(page).to have_button("Suivre les dossiers", disabled: true) + expect(find_field("batch_operation[dossier_ids][]", match: :first).value).to eq "" + + # click on check_all + notice link and submit + find("##{dom_id(BatchOperation.new, :checkbox_all)}").check + click_on("Sélectionner les 3 dossiers") + + expect { click_on "Suivre les dossiers" } + .to change { BatchOperation.count } + .from(0).to(1) + + expect(BatchOperation.last.dossiers).to match_array([dossier_1, dossier_2, dossier_3]) + end + + scenario 'create a BatchOperation within the limit of selection' do + stub_const "Instructeurs::ProceduresController::ITEMS_PER_PAGE", 2 + stub_const "Instructeurs::ProceduresController::BATCH_SELECTION_LIMIT", 3 + dossier_1 = create(:dossier, :en_instruction, procedure: procedure) + dossier_2 = create(:dossier, :en_instruction, procedure: procedure) + dossier_3 = create(:dossier, :en_instruction, procedure: procedure) + dossier_4 = create(:dossier, :en_instruction, procedure: procedure) + log_in(instructeur.email, password) + + visit instructeur_procedure_path(procedure, statut: 'a-suivre') + + # click on check_all make the notice appear + find("##{dom_id(BatchOperation.new, :checkbox_all)}").check + expect(page).to have_selector('.fr-notice') + expect(page).to have_content('Les 2 dossiers de cette page sont sélectionnés. Sélectionner les 3 premiers dossiers sur les 4') + + # click on selection link fill checkbox value with dossier_ids + click_on("Sélectionner les 3 premiers dossiers sur les 4") + expect(page).to have_content('3 dossiers sont sélectionnés. Effacer la sélection') + expect(find_field("batch_operation[dossier_ids][]", match: :first).value).to eq "#{dossier_4.id},#{dossier_3.id},#{dossier_2.id}" + + # create batch + expect { click_on "Suivre les dossiers" } + .to change { BatchOperation.count } + .from(0).to(1) + + expect(BatchOperation.last.dossiers).to match_array([dossier_2, dossier_3, dossier_4]) + end end def log_in(email, password, check_email: true)