RED-7605: fixed search again.
This commit is contained in:
parent
7edfec222b
commit
0cb4ffd8b4
@ -347,7 +347,7 @@ export class FilePreviewScreenComponent
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@HostListener('window:keyup', ['$event'])
|
@HostListener('document:keyup', ['$event'])
|
||||||
handleKeyEvent($event: KeyboardEvent) {
|
handleKeyEvent($event: KeyboardEvent) {
|
||||||
if (this._router.url.indexOf('/file/') < 0) {
|
if (this._router.url.indexOf('/file/') < 0) {
|
||||||
return;
|
return;
|
||||||
@ -361,17 +361,14 @@ export class FilePreviewScreenComponent
|
|||||||
$event.preventDefault();
|
$event.preventDefault();
|
||||||
this.fullScreen = false;
|
this.fullScreen = false;
|
||||||
this.closeFullScreen();
|
this.closeFullScreen();
|
||||||
this.pdf.deactivateSearch();
|
|
||||||
this.pdf.focusViewer();
|
|
||||||
this._changeRef.markForCheck();
|
this._changeRef.markForCheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (['f', 'F'].includes($event.key) && !$event.ctrlKey) {
|
if (!$event.ctrlKey && !$event.metaKey && ['f', 'F'].includes($event.key)) {
|
||||||
// if you type in an input, don't toggle full-screen
|
// if you type in an input, don't toggle full-screen
|
||||||
if ($event.target instanceof HTMLInputElement || $event.target instanceof HTMLTextAreaElement) {
|
if ($event.target instanceof HTMLInputElement || $event.target instanceof HTMLTextAreaElement) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.toggleFullScreen();
|
this.toggleFullScreen();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import { map, startWith } from 'rxjs/operators';
|
|||||||
import { BehaviorSubject, combineLatest, fromEvent, Observable, switchMap } from 'rxjs';
|
import { BehaviorSubject, combineLatest, fromEvent, Observable, switchMap } from 'rxjs';
|
||||||
import { ConfigService } from '@services/config.service';
|
import { ConfigService } from '@services/config.service';
|
||||||
import { NGXLogger } from 'ngx-logger';
|
import { NGXLogger } from 'ngx-logger';
|
||||||
import { DISABLED_HOTKEYS, DOCUMENT_LOADING_ERROR, SEARCH_OPTIONS, USELESS_ELEMENTS } from '../utils/constants';
|
import { DISABLED_HOTKEYS, DOCUMENT_LOADING_ERROR, USELESS_ELEMENTS } from '../utils/constants';
|
||||||
import { Rgb } from '../utils/types';
|
import { Rgb } from '../utils/types';
|
||||||
import { asList } from '../utils/functions';
|
import { asList } from '../utils/functions';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
@ -43,6 +43,15 @@ export class PdfViewer {
|
|||||||
compareMode$: Observable<boolean>;
|
compareMode$: Observable<boolean>;
|
||||||
totalPages$: Observable<number>;
|
totalPages$: Observable<number>;
|
||||||
|
|
||||||
|
searchOptions = {
|
||||||
|
caseSensitive: true, // match case
|
||||||
|
wholeWord: true, // match whole words only
|
||||||
|
wildcard: false, // allow using '*' as a wildcard value
|
||||||
|
regex: false, // string is treated as a regular expression
|
||||||
|
searchUp: false, // search from the end of the document upwards
|
||||||
|
ambientString: true, // return ambient string as part of the result
|
||||||
|
};
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private readonly _logger: NGXLogger,
|
private readonly _logger: NGXLogger,
|
||||||
private readonly _injector: Injector,
|
private readonly _injector: Injector,
|
||||||
@ -103,18 +112,15 @@ export class PdfViewer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
activateSearch() {
|
activateSearch() {
|
||||||
this.#instance.UI.openElements(['searchPanel']);
|
this.#instance.UI.searchTextFull('', this.searchOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
deactivateSearch() {
|
deactivateSearch() {
|
||||||
this.#clearSearchResultsWhenVisibilityChanged();
|
this.instance.UI.iframeWindow.document.getElementById('SearchPanel__input').blur();
|
||||||
|
this.#updateSearchOptions();
|
||||||
this.#instance.UI.closeElements(['searchPanel']);
|
this.#instance.UI.closeElements(['searchPanel']);
|
||||||
}
|
}
|
||||||
|
|
||||||
focusViewer() {
|
|
||||||
this.instance.UI.iframeWindow.focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
resetAnnotationActions() {
|
resetAnnotationActions() {
|
||||||
if (this.#instance.UI.annotationPopup.getItems().length) {
|
if (this.#instance.UI.annotationPopup.getItems().length) {
|
||||||
this.#instance.UI.annotationPopup.update([]);
|
this.#instance.UI.annotationPopup.update([]);
|
||||||
@ -163,8 +169,9 @@ export class PdfViewer {
|
|||||||
this.#setSelectionMode();
|
this.#setSelectionMode();
|
||||||
this.#configureElements();
|
this.#configureElements();
|
||||||
this.#disableHotkeys();
|
this.#disableHotkeys();
|
||||||
this.#clearSearchResultsWhenVisibilityChanged();
|
|
||||||
this.#listenForCommandF();
|
this.#listenForCommandF();
|
||||||
|
this.#listenForEsc();
|
||||||
|
this.#clearSearchResultsWhenVisibilityChanged();
|
||||||
|
|
||||||
return this.#instance;
|
return this.#instance;
|
||||||
}
|
}
|
||||||
@ -241,6 +248,42 @@ export class PdfViewer {
|
|||||||
this.#instance.UI.textPopup.update([...popups, this.#searchButton, { dataElement: 'copyTextButton' }]);
|
this.#instance.UI.textPopup.update([...popups, this.#searchButton, { dataElement: 'copyTextButton' }]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#listenForCommandF() {
|
||||||
|
this.#instance.UI.hotkeys.on('command+f, ctrl+f', e => {
|
||||||
|
e.preventDefault();
|
||||||
|
if (!this.#isElementActive('searchPanel')) {
|
||||||
|
this.activateSearch();
|
||||||
|
}
|
||||||
|
if (this.documentViewer.getSelectedText()) {
|
||||||
|
this.#updateSearchOptions();
|
||||||
|
this.#searchForSelectedText();
|
||||||
|
}
|
||||||
|
setTimeout(() => this.#focusSearch(), 30);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#listenForEsc() {
|
||||||
|
this.#instance.UI.hotkeys.on('esc', e => {
|
||||||
|
e.preventDefault();
|
||||||
|
if (this.#isElementActive('searchPanel')) {
|
||||||
|
this.#focusViewer();
|
||||||
|
this.deactivateSearch();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#getSearchOption(optionId: string): boolean {
|
||||||
|
const iframeWindow = this.#instance.UI.iframeWindow;
|
||||||
|
const checkbox = iframeWindow.document.getElementById(optionId) as HTMLInputElement;
|
||||||
|
return checkbox.checked;
|
||||||
|
}
|
||||||
|
|
||||||
|
#updateSearchOptions() {
|
||||||
|
const wholeWord = this.#getSearchOption('whole-word-option');
|
||||||
|
const caseSensitive = this.#getSearchOption('case-sensitive-option');
|
||||||
|
this.searchOptions = { ...this.searchOptions, wholeWord: wholeWord, caseSensitive: caseSensitive };
|
||||||
|
}
|
||||||
|
|
||||||
#adjustPage(page: number) {
|
#adjustPage(page: number) {
|
||||||
if (this.isCompare) {
|
if (this.isCompare) {
|
||||||
if (page % 2 === 1) {
|
if (page % 2 === 1) {
|
||||||
@ -255,7 +298,7 @@ export class PdfViewer {
|
|||||||
|
|
||||||
#searchForSelectedText() {
|
#searchForSelectedText() {
|
||||||
const selected = [...new Set(this.documentViewer.getSelectedText().split('\n'))].join('\n');
|
const selected = [...new Set(this.documentViewer.getSelectedText().split('\n'))].join('\n');
|
||||||
this.#instance.UI.searchTextFull(selected, SEARCH_OPTIONS);
|
this.#instance.UI.searchTextFull(selected, this.searchOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
#clearSearchResultsWhenVisibilityChanged() {
|
#clearSearchResultsWhenVisibilityChanged() {
|
||||||
@ -267,7 +310,9 @@ export class PdfViewer {
|
|||||||
|
|
||||||
const inputElement = iframeWindow.document.getElementById('SearchPanel__input') as HTMLInputElement;
|
const inputElement = iframeWindow.document.getElementById('SearchPanel__input') as HTMLInputElement;
|
||||||
|
|
||||||
setTimeout(() => (inputElement.value = ''), 0);
|
if (inputElement) {
|
||||||
|
setTimeout(() => (inputElement.value = ''), 0);
|
||||||
|
}
|
||||||
|
|
||||||
if (!event.detail.isVisible) {
|
if (!event.detail.isVisible) {
|
||||||
this.documentViewer.clearSearchResults();
|
this.documentViewer.clearSearchResults();
|
||||||
@ -275,19 +320,6 @@ export class PdfViewer {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
#listenForCommandF() {
|
|
||||||
this.#instance.UI.hotkeys.on('command+f, ctrl+f', e => {
|
|
||||||
e.preventDefault();
|
|
||||||
if (!this.#isElementActive('searchPanel')) {
|
|
||||||
this.activateSearch();
|
|
||||||
}
|
|
||||||
if (this.documentViewer.getSelectedText()) {
|
|
||||||
this.#searchForSelectedText();
|
|
||||||
}
|
|
||||||
setTimeout(() => this.#focusSearch(), 250);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
#navigateTo(pageNumber: number) {
|
#navigateTo(pageNumber: number) {
|
||||||
if (this.#currentInternalPage !== pageNumber) {
|
if (this.#currentInternalPage !== pageNumber) {
|
||||||
this.documentViewer.displayPageLocation(pageNumber, 0, 0);
|
this.documentViewer.displayPageLocation(pageNumber, 0, 0);
|
||||||
@ -337,4 +369,9 @@ export class PdfViewer {
|
|||||||
input.select();
|
input.select();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#focusViewer() {
|
||||||
|
this.instance.UI.iframeWindow.document.getElementById('SearchPanel__input').blur();
|
||||||
|
this.instance.UI.iframeWindow.focus();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,15 +19,6 @@ export const ALLOWED_KEYBOARD_SHORTCUTS: List = ['+', '-', 'p', 'r', 'Escape'] a
|
|||||||
|
|
||||||
export const DOCUMENT_LOADING_ERROR = new CustomError(_('error.file-preview.label'), _('error.file-preview.action'), 'iqser:refresh');
|
export const DOCUMENT_LOADING_ERROR = new CustomError(_('error.file-preview.label'), _('error.file-preview.action'), 'iqser:refresh');
|
||||||
|
|
||||||
export const SEARCH_OPTIONS = {
|
|
||||||
caseSensitive: true, // match case
|
|
||||||
wholeWord: true, // match whole words only
|
|
||||||
wildcard: false, // allow using '*' as a wildcard value
|
|
||||||
regex: false, // string is treated as a regular expression
|
|
||||||
searchUp: false, // search from the end of the document upwards
|
|
||||||
ambientString: true, // return ambient string as part of the result
|
|
||||||
};
|
|
||||||
|
|
||||||
export const ViewerEvents = {
|
export const ViewerEvents = {
|
||||||
LOAD_ALL_ANNOTATIONS: 'LOAD_ALL_ANNOTATIONS',
|
LOAD_ALL_ANNOTATIONS: 'LOAD_ALL_ANNOTATIONS',
|
||||||
} as const;
|
} as const;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user