Enhancement: Add support for arrow key navigation in document-detail view

This commit is contained in:
Panagiotis Doulgeris 2023-08-27 22:06:49 +02:00
parent fe7fb488c0
commit 635efdbd7b
3 changed files with 82 additions and 2 deletions

View File

@ -47,12 +47,12 @@
</button>
<div class="button-group">
<button type="button" class="btn btn-sm btn-outline-primary me-2" i18n-title title="Previous" (click)="previousDoc()" [disabled]="!hasPrevious()">
<button type="button" class="btn btn-sm btn-outline-primary me-2" i18n-title title="Previous" (click)="previousDoc()" [disabled]="!hasPrevious()" (keyup)="onLeftArrowKeyUp($event)">
<svg class="buttonicon" fill="currentColor">
<use xlink:href="assets/bootstrap-icons.svg#arrow-left" />
</svg>
</button>
<button type="button" class="btn btn-sm btn-outline-primary" i18n-title title="Next" (click)="nextDoc()" [disabled]="!hasNext()">
<button type="button" class="btn btn-sm btn-outline-primary" i18n-title title="Next" (click)="nextDoc()" [disabled]="!hasNext()" (keyup)="onRightArrowKeyUp($event)">
<svg class="buttonicon" fill="currentColor">
<use xlink:href="assets/bootstrap-icons.svg#arrow-right" />
</svg>

View File

@ -643,6 +643,74 @@ describe('DocumentDetailComponent', () => {
expect(component.password).toEqual('foobar')
})
it('should support Left Arrow key for previous page', () => {
initNormally()
const previousMock = jest.spyOn(component, "hasPrevious")
previousMock.mockReturnValue(true)
const previousSpy = jest.spyOn(documentListViewService, 'getPrevious')
previousSpy.mockReturnValue(of(100))
fixture.detectChanges()
const prevBtn = fixture.debugElement.query(
By.css('button[title="Previous"]')
)
expect(prevBtn).toBeDefined()
prevBtn.nativeElement.dispatchEvent(
new KeyboardEvent('keyup', { code: 'ArrowLeft' })
)
expect(previousSpy).toHaveBeenCalled()
})
it('should not support Left Arrow key for previous page if no page exists', () => {
initNormally()
const previousMock = jest.spyOn(component, "hasPrevious")
previousMock.mockReturnValue(false)
const previousSpy = jest.spyOn(documentListViewService, 'getPrevious')
previousSpy.mockReturnValue(of(100))
fixture.detectChanges()
const prevBtn = fixture.debugElement.query(
By.css('button[title="Previous"]')
)
expect(prevBtn).toBeDefined()
prevBtn.nativeElement.dispatchEvent(
new KeyboardEvent('keyup', { code: 'ArrowLeft' })
)
expect(previousSpy).not.toHaveBeenCalled()
})
it('should support Right Arrow key for next page', () => {
initNormally()
const nextMock = jest.spyOn(component, "hasNext")
nextMock.mockReturnValue(true)
const nextSpy = jest.spyOn(documentListViewService, 'getNext')
nextSpy.mockReturnValue(of(100))
fixture.detectChanges()
const nextBtn = fixture.debugElement.query(
By.css('button[title="Next"]')
)
expect(nextBtn).toBeDefined()
nextBtn.nativeElement.dispatchEvent(
new KeyboardEvent('keyup', { code: 'ArrowRight' })
)
expect(nextSpy).toHaveBeenCalled()
})
it('should not support Right Arrow key for next page if no page exists', () => {
initNormally()
const nextMock = jest.spyOn(component, "hasNext")
nextMock.mockReturnValue(false)
const nextSpy = jest.spyOn(documentListViewService, 'getNext')
nextSpy.mockReturnValue(of(100))
fixture.detectChanges()
const nextBtn = fixture.debugElement.query(
By.css('button[title="Next"]')
)
expect(nextBtn).toBeDefined()
nextBtn.nativeElement.dispatchEvent(
new KeyboardEvent('keyup', { code: 'ArrowRight' })
)
expect(nextSpy).not.toHaveBeenCalled()
})
it('should update n pages after pdf loaded', () => {
initNormally()
component.pdfPreviewLoaded({ numPages: 1000 } as any)

View File

@ -731,6 +731,18 @@ export class DocumentDetailComponent
}
}
onLeftArrowKeyUp(event: KeyboardEvent) {
if ('ArrowLeft' == event.code && this.hasPrevious()) {
this.previousDoc()
}
}
onRightArrowKeyUp(event: KeyboardEvent) {
if ('ArrowRight' == event.code && this.hasNext()) {
this.nextDoc()
}
}
onPasswordKeyUp(event: KeyboardEvent) {
if ('Enter' == event.key) {
this.password = (event.target as HTMLInputElement).value