Skip to content

Commit 2367196

Browse files
committed
Change the sidebar for a views manager
Update the styles and HTML to reflect the new views manager concept. For now, nothing about split/merge functionality is implemented or visible. The new styles for the outline, attachments, and layers will be added later. The thumbnail view is now accessible with the keyboard.
1 parent 6517ded commit 2367196

23 files changed

Lines changed: 1355 additions & 471 deletions

gulpfile.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,13 +211,13 @@ function createWebpackAlias(defines) {
211211
"web-pdf_layer_viewer": "web/pdf_layer_viewer.js",
212212
"web-pdf_outline_viewer": "web/pdf_outline_viewer.js",
213213
"web-pdf_presentation_mode": "web/pdf_presentation_mode.js",
214-
"web-pdf_sidebar": "web/pdf_sidebar.js",
215214
"web-pdf_thumbnail_viewer": "web/pdf_thumbnail_viewer.js",
216215
"web-preferences": "",
217216
"web-print_service": "",
218217
"web-secondary_toolbar": "web/secondary_toolbar.js",
219218
"web-signature_manager": "web/signature_manager.js",
220219
"web-toolbar": "web/toolbar.js",
220+
"web-views_manager": "web/views_manager.js",
221221
};
222222

223223
if (defines.CHROME) {

l10n/en-US/viewer.ftl

Lines changed: 82 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -180,23 +180,6 @@ pdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing.
180180
181181
## Tooltips and alt text for side panel toolbar buttons
182182

183-
pdfjs-toggle-sidebar-button =
184-
.title = Toggle Sidebar
185-
pdfjs-toggle-sidebar-notification-button =
186-
.title = Toggle Sidebar (document contains outline/attachments/layers)
187-
pdfjs-toggle-sidebar-button-label = Toggle Sidebar
188-
pdfjs-document-outline-button =
189-
.title = Show Document Outline (double-click to expand/collapse all items)
190-
pdfjs-document-outline-button-label = Document Outline
191-
pdfjs-attachments-button =
192-
.title = Show Attachments
193-
pdfjs-attachments-button-label = Attachments
194-
pdfjs-layers-button =
195-
.title = Show Layers (double-click to reset all layers to the default state)
196-
pdfjs-layers-button-label = Layers
197-
pdfjs-thumbs-button =
198-
.title = Show Thumbnails
199-
pdfjs-thumbs-button-label = Thumbnails
200183
pdfjs-current-outline-item-button =
201184
.title = Find Current Outline Item
202185
pdfjs-current-outline-item-button-label = Current Outline Item
@@ -702,3 +685,85 @@ pdfjs-editor-edit-comment-dialog-cancel-button = Cancel
702685

703686
pdfjs-editor-add-comment-button =
704687
.title = Add comment
688+
689+
## The view manager is a sidebar displaying different views:
690+
## - thumbnails;
691+
## - outline;
692+
## - attachments;
693+
## - layers.
694+
## The thumbnails view is used to edit the pdf: remove/insert pages, ...
695+
696+
pdfjs-toggle-views-manager-button =
697+
.title = Toggle Sidebar
698+
pdfjs-toggle-views-manager-notification-button =
699+
.title = Toggle Sidebar (document contains thumbnails/outline/attachments/layers)
700+
pdfjs-toggle-views-manager-button-label = Toggle Sidebar
701+
702+
pdfjs-views-manager-sidebar =
703+
.aria-label = Sidebar
704+
pdfjs-views-manager-view-selector-button =
705+
.title = Views
706+
pdfjs-views-manager-view-selector-button-label = Views
707+
pdfjs-views-manager-pages-title = Pages
708+
pdfjs-views-manager-outlines-title = Document outline
709+
pdfjs-views-manager-attachments-title = Attachments
710+
pdfjs-views-manager-layers-title = Layers
711+
712+
pdfjs-views-manager-pages-option-label = Pages
713+
pdfjs-views-manager-outlines-option-label = Document outline
714+
pdfjs-views-manager-attachments-option-label = Attachments
715+
pdfjs-views-manager-layers-option-label = Layers
716+
717+
pdfjs-views-manager-add-file-button =
718+
.title = Add file
719+
pdfjs-views-manager-add-file-button-label = Add file
720+
721+
# Variables:
722+
# $count (Number) - the number of selected pages.
723+
pdfjs-views-manager-pages-status-action-label =
724+
{ $count ->
725+
[one] { $count } selected
726+
*[other] { $count } selected
727+
}
728+
pdfjs-views-manager-pages-status-none-action-label = Select pages
729+
pdfjs-views-manager-pages-status-action-button-label = Manage
730+
pdfjs-views-manager-pages-status-copy-button-label = Copy
731+
pdfjs-views-manager-pages-status-cut-button-label = Cut
732+
pdfjs-views-manager-pages-status-delete-button-label = Delete
733+
pdfjs-views-manager-pages-status-save-as-button-label = Save as…
734+
735+
# Variables:
736+
# $count (Number) - the number of selected pages to be cut.
737+
pdfjs-views-manager-status-undo-cut-label =
738+
{ $count ->
739+
[one] 1 page cut
740+
*[other] { $count } pages cut
741+
}
742+
743+
# Variables:
744+
# $count (Number) - the number of selected pages to be copied.
745+
pdfjs-views-manager-pages-status-undo-copy-label =
746+
{ $count ->
747+
[one] 1 page copied
748+
*[other] { $count } pages copied
749+
}
750+
751+
# Variables:
752+
# $count (Number) - the number of selected pages to be deleted.
753+
pdfjs-views-manager-pages-status-undo-delete-label =
754+
{ $count ->
755+
[one] 1 page deleted
756+
*[other] { $count } pages deleted
757+
}
758+
759+
pdfjs-views-manager-pages-status-waiting-ready-label = Getting your file ready…
760+
pdfjs-views-manager-pages-status-waiting-uploading-label = Uploading file…
761+
762+
pdfjs-views-manager-status-warning-cut-label = Couldn’t cut. Refresh page and try again.
763+
pdfjs-views-manager-status-warning-copy-label = Couldn’t copy. Refresh page and try again.
764+
pdfjs-views-manager-status-warning-delete-label = Couldn’t delete. Refresh page and try again.
765+
pdfjs-views-manager-status-warning-save-label = Couldn’t save. Refresh page and try again.
766+
pdfjs-views-manager-status-undo-button-label = Undo
767+
pdfjs-views-manager-status-close-button =
768+
.title = Close
769+
pdfjs-views-manager-status-close-button-label = Close

test/integration/thumbnail_view_spec.mjs

Lines changed: 125 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,23 @@
1-
import { awaitPromise, closePages, loadAndWait } from "./test_utils.mjs";
1+
import {
2+
awaitPromise,
3+
closePages,
4+
kbFocusNext,
5+
loadAndWait,
6+
} from "./test_utils.mjs";
7+
8+
function waitForThumbnailVisible(page, pageNum) {
9+
return page.waitForSelector(
10+
`.thumbnailImage[data-l10n-args='{"page":${pageNum}}']`,
11+
{ visible: true }
12+
);
13+
}
214

315
describe("PDF Thumbnail View", () => {
416
describe("Works without errors", () => {
517
let pages;
618

719
beforeEach(async () => {
8-
pages = await loadAndWait("tracemonkey.pdf", "#sidebarToggleButton");
20+
pages = await loadAndWait("tracemonkey.pdf", "#viewsManagerToggleButton");
921
});
1022

1123
afterEach(async () => {
@@ -15,14 +27,12 @@ describe("PDF Thumbnail View", () => {
1527
it("should render thumbnails without errors", async () => {
1628
await Promise.all(
1729
pages.map(async ([browserName, page]) => {
18-
await page.click("#sidebarToggleButton");
30+
await page.click("#viewsManagerToggleButton");
1931

20-
const thumbSelector = "#thumbnailView .thumbnailImage";
32+
const thumbSelector = "#thumbnailsView .thumbnailImage";
2133
await page.waitForSelector(thumbSelector, { visible: true });
2234

23-
await page.waitForSelector(
24-
"#thumbnailView .thumbnail:not(.missingThumbnailImage)"
25-
);
35+
await waitForThumbnailVisible(page, 1);
2636

2737
const src = await page.$eval(thumbSelector, el => el.src);
2838
expect(src)
@@ -37,7 +47,7 @@ describe("PDF Thumbnail View", () => {
3747
let pages;
3848

3949
beforeEach(async () => {
40-
pages = await loadAndWait("tracemonkey.pdf", "#sidebarToggleButton");
50+
pages = await loadAndWait("tracemonkey.pdf", "#viewsManagerToggleButton");
4151
});
4252

4353
afterEach(async () => {
@@ -48,7 +58,7 @@ describe("PDF Thumbnail View", () => {
4858
const handle = await page.evaluateHandle(
4959
num => [
5060
new Promise(resolve => {
51-
const container = document.getElementById("thumbnailView");
61+
const container = document.getElementById("viewsManagerContent");
5262
container.addEventListener("scrollend", resolve, { once: true });
5363
// eslint-disable-next-line no-undef
5464
PDFViewerApplication.pdfLinkService.goToPage(num);
@@ -62,13 +72,15 @@ describe("PDF Thumbnail View", () => {
6272
it("should scroll the view", async () => {
6373
await Promise.all(
6474
pages.map(async ([browserName, page]) => {
65-
await page.click("#sidebarToggleButton");
75+
await page.click("#viewsManagerToggleButton");
76+
77+
await waitForThumbnailVisible(page, 1);
6678

6779
for (const pageNum of [14, 1, 13, 2]) {
6880
await goToPage(page, pageNum);
6981
const thumbSelector = `.thumbnailImage[data-l10n-args='{"page":${pageNum}}']`;
7082
await page.waitForSelector(
71-
`.thumbnail:has(${thumbSelector}).selected`,
83+
`.thumbnail ${thumbSelector}[aria-current="page"]`,
7284
{ visible: true }
7385
);
7486
const src = await page.$eval(thumbSelector, el => el.src);
@@ -80,4 +92,106 @@ describe("PDF Thumbnail View", () => {
8092
);
8193
});
8294
});
95+
96+
describe("The view is accessible with the keyboard", () => {
97+
let pages;
98+
99+
beforeEach(async () => {
100+
pages = await loadAndWait("tracemonkey.pdf", "#viewsManagerToggleButton");
101+
});
102+
103+
afterEach(async () => {
104+
await closePages(pages);
105+
});
106+
107+
async function isElementFocused(page, selector) {
108+
await page.waitForSelector(selector, { visible: true });
109+
110+
return page.$eval(selector, el => el === document.activeElement);
111+
}
112+
113+
it("should navigate with the keyboard", async () => {
114+
await Promise.all(
115+
pages.map(async ([browserName, page]) => {
116+
await page.click("#viewsManagerToggleButton");
117+
118+
await waitForThumbnailVisible(page, 1);
119+
await waitForThumbnailVisible(page, 2);
120+
await waitForThumbnailVisible(page, 3);
121+
122+
await kbFocusNext(page);
123+
expect(await isElementFocused(page, "#viewsManagerSelectorButton"))
124+
.withContext(`In ${browserName}`)
125+
.toBe(true);
126+
127+
await kbFocusNext(page);
128+
expect(
129+
await isElementFocused(
130+
page,
131+
`#thumbnailsView .thumbnailImage[data-l10n-args='{"page":1}']`
132+
)
133+
)
134+
.withContext(`In ${browserName}`)
135+
.toBe(true);
136+
137+
await page.keyboard.press("ArrowDown");
138+
expect(
139+
await isElementFocused(
140+
page,
141+
`#thumbnailsView .thumbnailImage[data-l10n-args='{"page":2}']`
142+
)
143+
)
144+
.withContext(`In ${browserName}`)
145+
.toBe(true);
146+
147+
await page.keyboard.press("ArrowUp");
148+
expect(
149+
await isElementFocused(
150+
page,
151+
`#thumbnailsView .thumbnailImage[data-l10n-args='{"page":1}']`
152+
)
153+
)
154+
.withContext(`In ${browserName}`)
155+
.toBe(true);
156+
157+
await page.keyboard.press("ArrowDown");
158+
await page.keyboard.press("ArrowDown");
159+
expect(
160+
await isElementFocused(
161+
page,
162+
`#thumbnailsView .thumbnailImage[data-l10n-args='{"page":3}']`
163+
)
164+
)
165+
.withContext(`In ${browserName}`)
166+
.toBe(true);
167+
await page.keyboard.press("Enter");
168+
const currentPage = await page.$eval(
169+
"#pageNumber",
170+
el => el.valueAsNumber
171+
);
172+
expect(currentPage).withContext(`In ${browserName}`).toBe(3);
173+
174+
await page.keyboard.press("End");
175+
expect(
176+
await isElementFocused(
177+
page,
178+
`#thumbnailsView .thumbnailImage[data-l10n-args='{"page":14}']`
179+
)
180+
)
181+
.withContext(`In ${browserName}`)
182+
.toBe(true);
183+
184+
await page.keyboard.press("Home");
185+
expect(
186+
await isElementFocused(
187+
page,
188+
`#thumbnailsView .thumbnailImage[data-l10n-args='{"page":1}']`
189+
)
190+
)
191+
.withContext(`In ${browserName}`)
192+
.toBe(true);
193+
})
194+
);
195+
});
196+
});
83197
});

test/unit/unit_test.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@
4040
"web-pdf_layer_viewer": "../../web/pdf_layer_viewer.js",
4141
"web-pdf_outline_viewer": "../../web/pdf_outline_viewer.js",
4242
"web-pdf_presentation_mode": "../../web/pdf_presentation_mode.js",
43-
"web-pdf_sidebar": "../../web/pdf_sidebar.js",
4443
"web-pdf_thumbnail_viewer": "../../web/pdf_thumbnail_viewer.js",
4544
"web-preferences": "../../web/genericcom.js",
4645
"web-print_service": "../../web/pdf_print_service.js",
4746
"web-secondary_toolbar": "../../web/secondary_toolbar.js",
4847
"web-toolbar": "../../web/toolbar.js"
48+
"web-views_manager": "../../web/views_manager.js"
4949
}
5050
}
5151
</script>

0 commit comments

Comments
 (0)