diff --git a/l10n/es-AR/viewer.ftl b/l10n/es-AR/viewer.ftl index 918b658e64f13..855aca3081092 100644 --- a/l10n/es-AR/viewer.ftl +++ b/l10n/es-AR/viewer.ftl @@ -203,8 +203,17 @@ pdfjs-thumb-page-canvas = .aria-label = Miniatura de página { $page } # Variables: # $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Seleccionar página { $page } +# Variables: +# $page (Number) - the page number pdfjs-thumb-page-checkbox = .aria-label = Seleccionar página { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Página { $page } de { $total } ## Find panel button title and messages @@ -649,9 +658,12 @@ pdfjs-toggle-views-manager-button = .title = Alternar barra lateral pdfjs-toggle-views-manager-notification-button = .title = Alternar barra lateral (el documento contiene miniaturas/esquemas/adjuntos/capas) +pdfjs-toggle-views-manager-button1-label = Administrar páginas pdfjs-toggle-views-manager-button-label = Alternar barra lateral pdfjs-views-manager-sidebar = .aria-label = Barra lateral +pdfjs-views-manager-sidebar-resizer = + .aria-label = Redimensionador de barra lateral pdfjs-views-manager-view-selector-button = .title = Vistas pdfjs-views-manager-view-selector-button-label = Vistas @@ -711,6 +723,8 @@ pdfjs-views-manager-status-close-button = .title = Cerrar pdfjs-views-manager-status-close-button-label = Cerrar pdfjs-views-manager-paste-button-label = Pegar +pdfjs-toggle-views-manager-button1 = + .title = Administrar páginas ## Main menu for adding/removing signatures diff --git a/l10n/fi/viewer.ftl b/l10n/fi/viewer.ftl index 2cd070ff1d0f9..d4e836a283334 100644 --- a/l10n/fi/viewer.ftl +++ b/l10n/fi/viewer.ftl @@ -201,6 +201,19 @@ pdfjs-thumb-page-title = # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Pienoiskuva sivusta { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Valitse sivu { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox = + .aria-label = Valitse sivu { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Sivu { $page }/{ $total } ## Find panel button title and messages @@ -645,9 +658,12 @@ pdfjs-toggle-views-manager-button = .title = Näytä/piilota sivupaneeli pdfjs-toggle-views-manager-notification-button = .title = Näytä/piilota sivupaneeli (dokumentissa on pienoiskuvat/sisällys/liitteitä/tasoja) +pdfjs-toggle-views-manager-button1-label = Hallitse sivuja pdfjs-toggle-views-manager-button-label = Näytä/piilota sivupaneeli pdfjs-views-manager-sidebar = .aria-label = Sivupaneeli +pdfjs-views-manager-sidebar-resizer = + .aria-label = Sivupaneelin koon muuttaja pdfjs-views-manager-view-selector-button = .title = Näkymät pdfjs-views-manager-view-selector-button-label = Näkymät @@ -706,6 +722,9 @@ pdfjs-views-manager-status-undo-button-label = Kumoa pdfjs-views-manager-status-close-button = .title = Sulje pdfjs-views-manager-status-close-button-label = Sulje +pdfjs-views-manager-paste-button-label = Liitä +pdfjs-toggle-views-manager-button1 = + .title = Hallitse sivuja ## Main menu for adding/removing signatures diff --git a/l10n/fr/viewer.ftl b/l10n/fr/viewer.ftl index 446bb3d56174f..2c40fce744c3e 100644 --- a/l10n/fr/viewer.ftl +++ b/l10n/fr/viewer.ftl @@ -715,10 +715,17 @@ pdfjs-views-manager-status-warning-copy-label = Copie impossible. Actualisez la pdfjs-views-manager-status-warning-delete-label = Suppression impossible. Actualisez la page et essayez à nouveau. pdfjs-views-manager-status-warning-save-label = Enregistrement impossible. Actualisez la page et essayez à nouveau. pdfjs-views-manager-status-undo-button-label = Annuler +pdfjs-views-manager-status-done-button-label = Terminé pdfjs-views-manager-status-close-button = .title = Fermer pdfjs-views-manager-status-close-button-label = Fermer pdfjs-views-manager-paste-button-label = Coller +pdfjs-views-manager-paste-button-before = + .title = Coller avant la première page +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Coller après la page { $page } pdfjs-toggle-views-manager-button1 = .title = Gérer les pages diff --git a/l10n/hu/viewer.ftl b/l10n/hu/viewer.ftl index e1536f92a4cb3..45136c334f0cc 100644 --- a/l10n/hu/viewer.ftl +++ b/l10n/hu/viewer.ftl @@ -201,6 +201,19 @@ pdfjs-thumb-page-title = # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = { $page }. oldal bélyegképe +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = { $page }. oldal kiválasztása +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox = + .aria-label = { $page }. oldal kiválasztása +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = { $page }. / { $total } oldal ## Find panel button title and messages @@ -645,9 +658,12 @@ pdfjs-toggle-views-manager-button = .title = Oldalsáv be/ki pdfjs-toggle-views-manager-notification-button = .title = Oldalsáv be/ki (a dokumentum bélyegképeket/vázlatot/mellékleteket/rétegeket tartalmaz) +pdfjs-toggle-views-manager-button1-label = Oldalak kezelése pdfjs-toggle-views-manager-button-label = Oldalsáv be/ki pdfjs-views-manager-sidebar = .aria-label = Oldalsáv +pdfjs-views-manager-sidebar-resizer = + .aria-label = Oldalsáv-átméretező pdfjs-views-manager-view-selector-button = .title = Nézetek pdfjs-views-manager-view-selector-button-label = Nézetek @@ -706,6 +722,9 @@ pdfjs-views-manager-status-undo-button-label = Visszavonás pdfjs-views-manager-status-close-button = .title = Bezárás pdfjs-views-manager-status-close-button-label = Bezárás +pdfjs-views-manager-paste-button-label = Beillesztés +pdfjs-toggle-views-manager-button1 = + .title = Oldalak kezelése ## Main menu for adding/removing signatures diff --git a/l10n/hy-AM/viewer.ftl b/l10n/hy-AM/viewer.ftl index 91bee636331d3..71aa8b305414f 100644 --- a/l10n/hy-AM/viewer.ftl +++ b/l10n/hy-AM/viewer.ftl @@ -370,6 +370,17 @@ pdfjs-editor-add-saved-signature-button = pdfjs-free-text2 = .aria-label = Գրվածքի խմբագիր .default-content = Սկսեք մուտքագրել... +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Մեկնաբանություն + *[other] Մեկնաբանություններ + } +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Տեսնո՞ւմ եք ինչ-որ ուշագրավ բան։ Գունանշեք այն և թողեք մեկնաբանություն։ +pdfjs-editor-comments-sidebar-no-comments-link = Իմանալ ավելին ## Alt-text dialog @@ -548,8 +559,8 @@ pdfjs-editor-add-signature-image-button = Պատկեր ## Tab panels pdfjs-editor-add-signature-type-input = - .aria-label = Մուտքագրեք ձեր ստորագրությունը - .placeholder = Մուտքագրեք ձեր ստորագրությունը + .aria-label = Մուտքագրել ստորագրություն + .placeholder = Մուտքագրել ստորագրություն pdfjs-editor-add-signature-draw-placeholder = Նկարեք ձեր ստորագրությունը pdfjs-editor-add-signature-draw-thickness-range-label = Հաստություն # Variables: @@ -586,6 +597,31 @@ pdfjs-editor-add-signature-cancel-button = Չեղարկել pdfjs-editor-add-signature-add-button = Ավելացնել pdfjs-editor-edit-signature-update-button = Թարմացնել +## Edit a comment dialog + +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Ավելացնել մեկնաբանություն +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Ավելացնել +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Մուտքագրեք այստեղ… +pdfjs-editor-edit-comment-dialog-cancel-button = Չեղարկել + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Ավելացնել մեկնաբանություն + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-views-manager-add-file-button = + .title = Ավելացնել ֆայլ +pdfjs-views-manager-add-file-button-label = Ավելացնել ֆայլ + ## Main menu for adding/removing signatures pdfjs-editor-delete-signature-button1 = diff --git a/l10n/it/viewer.ftl b/l10n/it/viewer.ftl index b61cc47ccc4e6..6b1fa31195ff1 100644 --- a/l10n/it/viewer.ftl +++ b/l10n/it/viewer.ftl @@ -719,10 +719,17 @@ pdfjs-views-manager-status-warning-copy-label = Copia non riuscita. Ricarica la pdfjs-views-manager-status-warning-delete-label = Eliminazione non riuscita. Ricarica la pagina e riprova. pdfjs-views-manager-status-warning-save-label = Salvataggio non riuscito. Ricarica la pagina e prova di nuovo. pdfjs-views-manager-status-undo-button-label = Annulla +pdfjs-views-manager-status-done-button-label = Fatto pdfjs-views-manager-status-close-button = .title = Chiudi pdfjs-views-manager-status-close-button-label = Chiudi pdfjs-views-manager-paste-button-label = Incolla +pdfjs-views-manager-paste-button-before = + .title = Incolla dopo la prima pagina +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Incolla dopo pagina { $page } pdfjs-toggle-views-manager-button1 = .title = Gestisci pagine @@ -739,4 +746,3 @@ pdfjs-editor-add-signature-edit-button-label = Modifica descrizione ## Edit signature description dialog pdfjs-editor-edit-signature-dialog-title = Modifica descrizione - diff --git a/l10n/ja/viewer.ftl b/l10n/ja/viewer.ftl index 23abbd5cc2140..8d92c15977aa9 100644 --- a/l10n/ja/viewer.ftl +++ b/l10n/ja/viewer.ftl @@ -201,6 +201,19 @@ pdfjs-thumb-page-title = # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = { $page } ページの縮小版 +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = { $page } ページを選択します +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox = + .aria-label = { $page } ページを選択します +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = { $page } / { $total } ページ ## Find panel button title and messages @@ -629,9 +642,12 @@ pdfjs-toggle-views-manager-button = .title = サイドバーを切り替えます pdfjs-toggle-views-manager-notification-button = .title = サイドバーを切り替えます (文書に含まれるサムネイル、アウトライン、添付データ、レイヤー) +pdfjs-toggle-views-manager-button1-label = ページを管理 pdfjs-toggle-views-manager-button-label = サイドバーを切り替え pdfjs-views-manager-sidebar = .aria-label = サイドバー +pdfjs-views-manager-sidebar-resizer = + .aria-label = サイドバーの幅変更 pdfjs-views-manager-view-selector-button = .title = ビュー pdfjs-views-manager-view-selector-button-label = ビュー @@ -674,6 +690,9 @@ pdfjs-views-manager-status-undo-button-label = 元に戻す pdfjs-views-manager-status-close-button = .title = 閉じる pdfjs-views-manager-status-close-button-label = 閉じる +pdfjs-views-manager-paste-button-label = 貼り付け +pdfjs-toggle-views-manager-button1 = + .title = ページを管理 ## Main menu for adding/removing signatures diff --git a/l10n/ka/viewer.ftl b/l10n/ka/viewer.ftl index 796dd175b21f4..eccb0bc18fedd 100644 --- a/l10n/ka/viewer.ftl +++ b/l10n/ka/viewer.ftl @@ -201,6 +201,19 @@ pdfjs-thumb-page-title = # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = გვერდის შეთვალიერება { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = მონიშნეთ { $page } გვერდი +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox = + .aria-label = მონიშნეთ { $page } გვერდი +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = გვერდი { $page }, სულ { $total } ## Find panel button title and messages @@ -649,6 +662,8 @@ pdfjs-toggle-views-manager-button1-label = გვერდების მარ pdfjs-toggle-views-manager-button-label = გვერდითა ზოლის გამოჩენა/დამალვა pdfjs-views-manager-sidebar = .aria-label = გვერდითი ზოლი +pdfjs-views-manager-sidebar-resizer = + .aria-label = გვერდითი ზოლის ზომაცვლა pdfjs-views-manager-view-selector-button = .title = ხედები pdfjs-views-manager-view-selector-button-label = ხედები @@ -707,6 +722,7 @@ pdfjs-views-manager-status-undo-button-label = დაბრუნება pdfjs-views-manager-status-close-button = .title = დახურვა pdfjs-views-manager-status-close-button-label = დახურვა +pdfjs-views-manager-paste-button-label = ჩასმა pdfjs-toggle-views-manager-button1 = .title = გვერდების მართვა diff --git a/l10n/sq/viewer.ftl b/l10n/sq/viewer.ftl index 2fb77a50f5bb9..a7636ef16df60 100644 --- a/l10n/sq/viewer.ftl +++ b/l10n/sq/viewer.ftl @@ -194,8 +194,17 @@ pdfjs-thumb-page-canvas = .aria-label = Miniaturë e Faqes { $page } # Variables: # $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Përzgjidhni faqen { $page } +# Variables: +# $page (Number) - the page number pdfjs-thumb-page-checkbox = .aria-label = Përzgjidhni faqen { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Faqja { $page } nga { $total } gjithsej ## Find panel button title and messages @@ -638,16 +647,21 @@ pdfjs-editor-add-comment-button = pdfjs-toggle-views-manager-button = .title = Shfaq/Fshih Anështyllën +pdfjs-toggle-views-manager-button1-label = Administroni faqe pdfjs-toggle-views-manager-button-label = Shfaq/Fshih Anështyllën pdfjs-views-manager-sidebar = .aria-label = Anështyllë +pdfjs-views-manager-sidebar-resizer = + .aria-label = Ripërmasues anështylle pdfjs-views-manager-view-selector-button = .title = Pamje pdfjs-views-manager-view-selector-button-label = Pamje pdfjs-views-manager-pages-title = Faqe +pdfjs-views-manager-outlines-title = Përvijim dokumenti pdfjs-views-manager-attachments-title = Bashkëngjitje pdfjs-views-manager-layers-title = Shtresa pdfjs-views-manager-pages-option-label = Faqe +pdfjs-views-manager-outlines-option-label = Përvijim dokumenti pdfjs-views-manager-attachments-option-label = Bashkëngjitje pdfjs-views-manager-layers-option-label = Shtresa pdfjs-views-manager-add-file-button = @@ -691,6 +705,8 @@ pdfjs-views-manager-status-close-button = .title = Mbylle pdfjs-views-manager-status-close-button-label = Mbylle pdfjs-views-manager-paste-button-label = Ngjite +pdfjs-toggle-views-manager-button1 = + .title = Administroni faqe ## Main menu for adding/removing signatures diff --git a/l10n/sv-SE/viewer.ftl b/l10n/sv-SE/viewer.ftl index 5820374d69d9f..4f97004a8762b 100644 --- a/l10n/sv-SE/viewer.ftl +++ b/l10n/sv-SE/viewer.ftl @@ -719,10 +719,17 @@ pdfjs-views-manager-status-warning-copy-label = Det gick inte att kopiera. Uppda pdfjs-views-manager-status-warning-delete-label = Det gick inte att ta bort. Uppdatera sidan och försök igen. pdfjs-views-manager-status-warning-save-label = Det gick inte att spara. Uppdatera sidan och försök igen. pdfjs-views-manager-status-undo-button-label = Ångra +pdfjs-views-manager-status-done-button-label = Klar pdfjs-views-manager-status-close-button = .title = Stäng pdfjs-views-manager-status-close-button-label = Stäng pdfjs-views-manager-paste-button-label = Klistra in +pdfjs-views-manager-paste-button-before = + .title = Klistra in före den första sidan +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Klistra in efter sida { $page } pdfjs-toggle-views-manager-button1 = .title = Hantera sidor diff --git a/l10n/tg/viewer.ftl b/l10n/tg/viewer.ftl index 52ae39105a5f7..baee9da510ebd 100644 --- a/l10n/tg/viewer.ftl +++ b/l10n/tg/viewer.ftl @@ -645,6 +645,7 @@ pdfjs-toggle-views-manager-button = .title = Фаъол кардани навори ҷонибӣ pdfjs-toggle-views-manager-notification-button = .title = Фаъол кардани навори ҷонибӣ (ҳуҷҷат дорои тасвирчаҳо/сохтор/замимаҳо/қабатҳо мебошад) +pdfjs-toggle-views-manager-button1-label = Идоракунии саҳифаҳо pdfjs-toggle-views-manager-button-label = Фаъол кардани навори ҷонибӣ pdfjs-views-manager-sidebar = .aria-label = Навори ҷонибӣ @@ -706,6 +707,9 @@ pdfjs-views-manager-status-undo-button-label = Бекор кардан pdfjs-views-manager-status-close-button = .title = Пӯшидан pdfjs-views-manager-status-close-button-label = Пӯшидан +pdfjs-views-manager-paste-button-label = Гузоштан +pdfjs-toggle-views-manager-button1 = + .title = Идоракунии саҳифаҳо ## Main menu for adding/removing signatures diff --git a/test/integration/reorganize_pages_spec.mjs b/test/integration/reorganize_pages_spec.mjs index 7dba627d6dc00..2e1b874b985ed 100644 --- a/test/integration/reorganize_pages_spec.mjs +++ b/test/integration/reorganize_pages_spec.mjs @@ -967,6 +967,42 @@ describe("Reorganize Pages View", () => { }) ); }); + + it("should disable delete and cut entries when all pages are selected", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForThumbnailVisible(page, 1); + + // Select all pages. + const totalPages = await page.evaluate( + () => + document.querySelectorAll("#thumbnailsView .thumbnail input") + .length + ); + for (let i = 1; i <= totalPages; i++) { + await waitAndClick( + page, + `.thumbnail:has(${getThumbnailSelector(i)}) input` + ); + } + + await waitAndClick(page, "#viewsManagerStatusActionButton"); + + await page.waitForSelector( + "#viewsManagerStatusActionDelete:disabled" + ); + await page.waitForSelector("#viewsManagerStatusActionCut:disabled"); + await page.waitForSelector( + "#viewsManagerStatusActionCopy:not(:disabled)" + ); + await page.waitForSelector( + "#viewsManagerStatusActionSaveAs:not(:disabled)" + ); + + await page.keyboard.press("Escape"); + }) + ); + }); }); describe("Keyboard shortcuts for cut and copy (bug 2018139)", () => { @@ -1746,4 +1782,148 @@ describe("Reorganize Pages View", () => { ); }); }); + + describe("Context menu triggers editingstateschanged event (bug 2021828)", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "page_with_number.pdf", + "#viewsManagerToggleButton", + "1", + null, + { enableSplitMerge: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + function getContextMenuPromise(page) { + return createPromise(page, resolve => { + window.addEventListener( + "contextmenu", + e => { + e.preventDefault(); + resolve(); + }, + { once: true } + ); + }); + } + + it("should dispatch editingstateschanged with correct payload on right-click with no selection", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForThumbnailVisible(page, 1); + + const handleEditingStatesChanged = await createPromise( + page, + resolve => { + window.PDFViewerApplication.eventBus.on( + "editingstateschanged", + ({ details }) => resolve(details), + { once: true } + ); + } + ); + + const contextMenuPromise = await getContextMenuPromise(page); + await page.click(getThumbnailSelector(1), { button: "right" }); + await awaitPromise(contextMenuPromise); + + const details = await awaitPromise(handleEditingStatesChanged); + expect(details.thumbnailId).withContext(`In ${browserName}`).toBe(1); + expect(details.hasSelectedPages) + .withContext(`In ${browserName}`) + .toBeFalse(); + expect(details.canDeletePages) + .withContext(`In ${browserName}`) + .toBeFalse(); + }) + ); + }); + + it("should dispatch editingstateschanged with correct payload on right-click with some pages selected", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForThumbnailVisible(page, 1); + await waitAndClick( + page, + `.thumbnail:has(${getThumbnailSelector(1)}) input` + ); + + const handleEditingStatesChanged = await createPromise( + page, + resolve => { + window.PDFViewerApplication.eventBus.on( + "editingstateschanged", + ({ details }) => resolve(details), + { once: true } + ); + } + ); + + const contextMenuPromise = await getContextMenuPromise(page); + await page.click(getThumbnailSelector(1), { button: "right" }); + await awaitPromise(contextMenuPromise); + + const details = await awaitPromise(handleEditingStatesChanged); + expect(details.thumbnailId).withContext(`In ${browserName}`).toBe(1); + expect(details.hasSelectedPages) + .withContext(`In ${browserName}`) + .toBeTrue(); + expect(details.canDeletePages) + .withContext(`In ${browserName}`) + .toBeTrue(); + }) + ); + }); + + it("should dispatch editingstateschanged with canDeletePages false when all pages are selected", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForThumbnailVisible(page, 1); + + // Select all 17 pages. + const totalPages = await page.evaluate( + () => + document.querySelectorAll("#thumbnailsView .thumbnail input") + .length + ); + for (let i = 1; i <= totalPages; i++) { + await waitAndClick( + page, + `.thumbnail:has(${getThumbnailSelector(i)}) input` + ); + } + + const handleEditingStatesChanged = await createPromise( + page, + resolve => { + window.PDFViewerApplication.eventBus.on( + "editingstateschanged", + ({ details }) => resolve(details), + { once: true } + ); + } + ); + + const contextMenuPromise = await getContextMenuPromise(page); + await page.click(getThumbnailSelector(1), { button: "right" }); + await awaitPromise(contextMenuPromise); + + const details = await awaitPromise(handleEditingStatesChanged); + expect(details.thumbnailId).withContext(`In ${browserName}`).toBe(1); + expect(details.hasSelectedPages) + .withContext(`In ${browserName}`) + .toBeTrue(); + expect(details.canDeletePages) + .withContext(`In ${browserName}`) + .toBeFalse(); + }) + ); + }); + }); }); diff --git a/web/pdf_thumbnail_viewer.js b/web/pdf_thumbnail_viewer.js index f2d821cd1460a..2a7b5838ae608 100644 --- a/web/pdf_thumbnail_viewer.js +++ b/web/pdf_thumbnail_viewer.js @@ -141,10 +141,6 @@ class PDFThumbnailViewer { #scrollableContainerHeight = 0; - #previousStates = { - hasSelectedPages: false, - }; - #statusLabel = null; #statusBar = null; @@ -236,6 +232,29 @@ class PDFThumbnailViewer { } }); + this.container.addEventListener( + "contextmenu", + e => { + this.eventBus.dispatch("editingstateschanged", { + source: this, + details: { + thumbnailId: + parseInt( + e.target + .closest(".thumbnailImageContainer") + ?.parentElement.getAttribute("page-number") + ) ?? -1, + hasSelectedPages: !!this.#selectedPages?.size, + canDeletePages: this.#canDelete(), + }, + }); + }, + { + signal: abortSignal, + passive: true, + } + ); + this.#undoButton?.addEventListener("click", this.#undo.bind(this)); this.#undoCloseButton?.addEventListener( "click", @@ -254,24 +273,6 @@ class PDFThumbnailViewer { this.#addEventListeners(); } - /** - * Update the different possible states of this manager, e.g. is there - * something to copy, paste, ... - * @param {Object} details - */ - #dispatchUpdateStates(details) { - const hasChanged = Object.entries(details).some( - ([key, value]) => this.#previousStates[key] !== value - ); - - if (hasChanged) { - this.eventBus.dispatch("editingstateschanged", { - source: this, - details: Object.assign(this.#previousStates, details), - }); - } - } - #scrollUpdated() { this.renderingQueue.renderHighestPriority(); } @@ -759,6 +760,11 @@ class PDFThumbnailViewer { }); } + #canDelete() { + const size = this.#selectedPages?.size || 0; + return size > 0 && size < this._thumbnails.length; + } + #togglePasteMode(enable) { this.#isInPasteMode = enable; if (enable) { @@ -808,6 +814,10 @@ class PDFThumbnailViewer { } #cutPages() { + if (!this.#canDelete()) { + return; + } + this.#isCut = true; this.#copyPages(false); this.#deletePages(/* type = */ "cut"); @@ -839,10 +849,11 @@ class PDFThumbnailViewer { } #deletePages(type = "delete") { - const selectedPages = this.#selectedPages; - if (selectedPages.size === 0) { + if (!this.#canDelete()) { return; } + + const selectedPages = this.#selectedPages; if (type === "delete") { this.#updateStatus("delete"); } @@ -868,14 +879,10 @@ class PDFThumbnailViewer { } #updateMenuEntries() { - this.#manageSaveAsButton.disabled = - this.#manageDeleteButton.disabled = - this.#manageCopyButton.disabled = - this.#manageCutButton.disabled = - !this.#selectedPages?.size; - this.#dispatchUpdateStates({ - hasSelectedPages: !!this.#selectedPages?.size, - }); + const size = this.#selectedPages?.size || 0; + this.#manageSaveAsButton.disabled = this.#manageCopyButton.disabled = !size; + this.#manageDeleteButton.disabled = this.#manageCutButton.disabled = + !this.#canDelete(); } #toggleMenuEntries(enable) { @@ -884,9 +891,6 @@ class PDFThumbnailViewer { this.#manageCopyButton.disabled = this.#manageCutButton.disabled = !enable; - this.#dispatchUpdateStates({ - hasSelectedPages: false, - }); } #updateStatus(type) { @@ -1102,16 +1106,6 @@ class PDFThumbnailViewer { this.#computeThumbnailsPosition(); } }); - this.container.addEventListener("focusout", () => { - this.#dispatchUpdateStates({ - hasSelectedPages: false, - }); - }); - this.container.addEventListener("focusin", () => { - this.#dispatchUpdateStates({ - hasSelectedPages: !!this.#selectedPages?.size, - }); - }); this.container.addEventListener("keydown", e => { const { target } = e; const isCheckbox = @@ -1218,6 +1212,7 @@ class PDFThumbnailViewer { if ( e.button !== 0 || // Skip right click. this.#isInPasteMode || + this._thumbnails.length === 1 || !isNaN(this.#lastDraggedOverIndex) || !draggedImage.classList.contains("thumbnailImageContainer") ) {