From df4a5638d081f645f4fb9267fc8bcbd94ba98c6c Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Thu, 12 Mar 2026 12:14:10 +0100 Subject: [PATCH 1/2] Add a button for unchecking all the checked thumbnails (bug 2022769) --- test/integration/reorganize_pages_spec.mjs | 43 ++++++++++++++++++++++ web/pdf_thumbnail_viewer.js | 12 ++++++ web/viewer.html | 21 ++++++++--- web/viewer.js | 3 ++ web/views_manager.css | 7 ++-- 5 files changed, 78 insertions(+), 8 deletions(-) diff --git a/test/integration/reorganize_pages_spec.mjs b/test/integration/reorganize_pages_spec.mjs index 2e1b874b985ed..2b7f4901726d7 100644 --- a/test/integration/reorganize_pages_spec.mjs +++ b/test/integration/reorganize_pages_spec.mjs @@ -1331,6 +1331,49 @@ describe("Reorganize Pages View", () => { }) ); }); + + it("should deselect all thumbnails when the deselect button is clicked", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForThumbnailVisible(page, 1); + await page.waitForSelector("#viewsManagerStatusActionButton", { + visible: true, + }); + + const labelSelector = "#viewsManagerStatusActionLabel"; + const deselectButtonSelector = + "#viewsManagerStatusActionDeselectButton"; + + // Check thumbnails 1 and 2. + await waitAndClick( + page, + `.thumbnail:has(${getThumbnailSelector(1)}) input` + ); + await waitAndClick( + page, + `.thumbnail:has(${getThumbnailSelector(2)}) input` + ); + await waitForTextToBe(page, labelSelector, `${FSI}2${PDI} selected`); + + // Click the deselect button: all thumbnails should be unchecked. + await waitAndClick(page, deselectButtonSelector); + + // Label should revert to "Select pages". + await waitForTextToBe(page, labelSelector, "Select pages"); + + // The deselect button should be hidden again. + await page.waitForSelector(deselectButtonSelector, { hidden: true }); + + // All checkboxes should be unchecked. + await page.waitForSelector( + "#thumbnailsView:not(:has(input:checked))", + { + visible: true, + } + ); + }) + ); + }); }); describe("Undo label reflects number of cut/deleted pages (bug 2010832)", () => { diff --git a/web/pdf_thumbnail_viewer.js b/web/pdf_thumbnail_viewer.js index 2a7b5838ae608..1547c3f314e1f 100644 --- a/web/pdf_thumbnail_viewer.js +++ b/web/pdf_thumbnail_viewer.js @@ -145,6 +145,8 @@ class PDFThumbnailViewer { #statusBar = null; + #deselectButton = null; + #undoBar = null; #undoLabel = null; @@ -183,6 +185,8 @@ class PDFThumbnailViewer { this.pageColors = pageColors || null; this.#enableSplitMerge = enableSplitMerge || false; this.#statusLabel = statusBar?.viewsManagerStatusActionLabel || null; + this.#deselectButton = + statusBar?.viewsManagerStatusActionDeselectButton || null; this.#statusBar = statusBar?.viewsManagerStatusAction || null; this.#undoBar = undoBar?.viewsManagerStatusUndo || null; this.#undoLabel = undoBar?.viewsManagerStatusUndoLabel || null; @@ -260,6 +264,12 @@ class PDFThumbnailViewer { "click", this.#dismissUndo.bind(this) ); + this.#deselectButton?.addEventListener("click", () => { + this.#clearSelection(); + this.#toggleMenuEntries(false); + this.#updateStatus("select"); + }); + this.#deselectButton.classList.toggle("hidden", true); } else { manageMenu.button.hidden = true; } @@ -910,8 +920,10 @@ class PDFThumbnailViewer { "data-l10n-args", JSON.stringify({ count }) ); + this.#deselectButton.classList.toggle("hidden", false); } else { this.#statusLabel.removeAttribute("data-l10n-args"); + this.#deselectButton.classList.toggle("hidden", true); } this.#statusBar.classList.toggle("hidden", false); this.#undoBar.classList.toggle("hidden", true); diff --git a/web/viewer.html b/web/viewer.html index 8cd0d8f77ae7e..fb3c351a0f745 100644 --- a/web/viewer.html +++ b/web/viewer.html @@ -188,11 +188,22 @@
- + + + +