UNPKG

@hmcts/annotation-ui-lib

Version:

PDF Viewer and ability to highlight text with and comment tracking

198 lines 18.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ChangeDetectorRef, Output, EventEmitter } from '@angular/core'; import { Comment } from '../../../data/annotation-set.model'; import { AnnotationStoreService } from '../../../data/annotation-store.service'; import { PdfService } from '../../../data/pdf.service'; import { EmLoggerService } from '../../../logging/em-logger.service'; import { PdfRenderService } from '../../../data/pdf-render.service'; export class ContextualToolbarComponent { /** * @param {?} annotationStoreService * @param {?} ref * @param {?} pdfRenderService * @param {?} pdfService * @param {?} log */ constructor(annotationStoreService, ref, pdfRenderService, pdfService, log) { this.annotationStoreService = annotationStoreService; this.ref = ref; this.pdfRenderService = pdfRenderService; this.pdfService = pdfService; this.log = log; this.deletedAnnotation = new EventEmitter(); this.log.setClass('ContextualToolbarComponent'); this.toolPos = { left: 0, top: 0 }; } /** * @return {?} */ ngOnInit() { this.contextualToolBarOptions = this.annotationStoreService.getToolbarUpdate() .subscribe(contextualOptions => { if (contextualOptions.annotation != null) { this.showToolBar(contextualOptions.annotation, contextualOptions.showDelete); } else { this.hideToolBar(); } }); this.isShowToolbar = false; } /** * @return {?} */ ngOnDestroy() { this.ref.detach(); if (this.contextualToolBarOptions) { this.contextualToolBarOptions.unsubscribe(); } } /** * @param {?} annotation * @param {?=} showDelete * @return {?} */ showToolBar(annotation, showDelete) { this.annotation = annotation; this.showDelete = showDelete; this.toolPos = this.getRelativePosition(annotation.id); this.isShowToolbar = true; if (!this.ref['destroyed']) { this.ref.detectChanges(); } } /** * @param {?} annotationId * @return {?} */ getRelativePosition(annotationId) { /** @type {?} */ const svgSelector = this.pdfRenderService.getViewerElementRef().nativeElement .querySelector(`g[data-pdf-annotate-id="${annotationId}"]`); /** @type {?} */ const highlightRect = (/** @type {?} */ (svgSelector.getBoundingClientRect())); /** @type {?} */ const wrapper = this.pdfService.getAnnotationWrapper().nativeElement; /** @type {?} */ const wrapperRect = (/** @type {?} */ (wrapper.getBoundingClientRect())); /** @type {?} */ const left = ((highlightRect.x - wrapperRect.left) - 175) + highlightRect.width / 2; // Minus half the toolbar width + half the length of the highlight /** @type {?} */ const top = ((highlightRect.y - wrapperRect.top) - 59) - 5; return { left, top }; } /** * @return {?} */ hideToolBar() { this.annotation = null; this.isShowToolbar = false; this.showDelete = false; if (!this.ref['destroyed']) { this.ref.detectChanges(); } } /** * @return {?} */ handleCommentBtnClick() { if (this.annotation.comments.length === 0) { this.annotationStoreService.addComment(new Comment(null, this.annotation.id, null, null, null, null, null, null, null)); } setTimeout(() => { /** @type {?} */ const tempAnnotation = this.annotation; this.hideToolBar(); this.annotationStoreService.setCommentFocusSubject(tempAnnotation, true); }, 10); } /** * @return {?} */ handleHighlightBtnClick() { this.hideToolBar(); } /** * @return {?} */ handleDeleteBtnClick() { return tslib_1.__awaiter(this, void 0, void 0, function* () { yield this.annotationStoreService.deleteAnnotationById(this.annotation.id, this.annotation.page); this.hideToolBar(); this.deletedAnnotation.emit('deleted annotation'); }); } } ContextualToolbarComponent.decorators = [ { type: Component, args: [{ selector: 'app-contextual-toolbar', template: "<div [hidden]=\"!isShowToolbar\" class=\"toolbar\"\n [style.left.px]=\"toolPos.left\"\n [style.top.px]=\"toolPos.top\">\n\n <button\n [hidden]=\"showDelete\"\n type=\"button\" class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn leftButton\"\n title=\"Highlight\"\n (click)=\"handleHighlightBtnClick()\"\n ><span>Add Highlight</span></button>\n\n <button\n [hidden]=\"!showDelete\"\n type=\"button\"\n title=\"Delete\" class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn leftButton\"\n (click)=\"handleDeleteBtnClick()\"\n ><span>Remove Highlight</span></button>\n\n <button type=\"button\" title=\"Comment\" class=\"aui__toolbar-button aui__toolbar-button--comments contextual-btn rightButton\"\n (click)=\"handleCommentBtnClick()\"\n ><span>Comment</span></button>\n\n\n <div class=\"arrow-down\">\n <div class=\"inner-triangle\"></div>\n </div>\n\n</div>\n", styles: [".toolbar{position:absolute;background-color:#fff;height:52px;width:350px;margin:0 auto;text-shadow:1px 1px 0 #fff;z-index:1;border:1px solid #c1c1c1;box-shadow:0 2px #c1c1c1}.toolbar .spacer{display:inline-block;border-left:1px solid #c1c1c1;height:34px;margin:0 5px -11px}.toolbar button span{margin-left:20px}.toolbar button{padding:0;margin-left:2.5%;margin-right:2.5%;margin-top:6px;height:40px;border:0}.toolbar button:hover{border:1px solid #000}.contextual-btn{font-size:16px;background:5px 50%/20px 20px no-repeat #fff}.rightButton{width:124px;background-image:url(/assets/images/icon-document-comments.svg)}.leftButton{background-image:url(/assets/images/annotate-highlight.svg);width:190px}.arrow-down{margin:53px auto 0;width:0;height:0;border-left:12px solid transparent;border-right:12px solid transparent;border-top:12px solid #c1c1c1}.inner-triangle{position:relative;top:-13px;left:-10px;width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid #fff}"] }] } ]; ContextualToolbarComponent.ctorParameters = () => [ { type: AnnotationStoreService }, { type: ChangeDetectorRef }, { type: PdfRenderService }, { type: PdfService }, { type: EmLoggerService } ]; ContextualToolbarComponent.propDecorators = { deletedAnnotation: [{ type: Output }] }; if (false) { /** @type {?} */ ContextualToolbarComponent.prototype.toolPos; /** @type {?} */ ContextualToolbarComponent.prototype.isShowToolbar; /** @type {?} */ ContextualToolbarComponent.prototype.showDelete; /** @type {?} */ ContextualToolbarComponent.prototype.annotation; /** * @type {?} * @private */ ContextualToolbarComponent.prototype.contextualToolBarOptions; /** @type {?} */ ContextualToolbarComponent.prototype.deletedAnnotation; /** * @type {?} * @private */ ContextualToolbarComponent.prototype.annotationStoreService; /** * @type {?} * @private */ ContextualToolbarComponent.prototype.ref; /** * @type {?} * @private */ ContextualToolbarComponent.prototype.pdfRenderService; /** * @type {?} * @private */ ContextualToolbarComponent.prototype.pdfService; /** * @type {?} * @private */ ContextualToolbarComponent.prototype.log; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dHVhbC10b29sYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BobWN0cy9hbm5vdGF0aW9uLXVpLWxpYi8iLCJzb3VyY2VzIjpbImxpYi92aWV3ZXJzL2Fubm90YXRpb24tcGRmLXZpZXdlci9jb250ZXh0dWFsLXRvb2xiYXIvY29udGV4dHVhbC10b29sYmFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQVUsaUJBQWlCLEVBQWEsTUFBTSxFQUFFLFlBQVksRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVwRyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDekUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQU9wRSxNQUFNOzs7Ozs7OztJQVVKLFlBQW9CLHNCQUE4QyxFQUM5QyxHQUFzQixFQUN0QixnQkFBa0MsRUFDbEMsVUFBc0IsRUFDdEIsR0FBb0I7UUFKcEIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBaUI7UUFOOUIsc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQU92RCxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixJQUFJLEVBQUUsQ0FBQztZQUNQLEdBQUcsRUFBRSxD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OztJQUUvQyx1REFBeUQ7Ozs7O0lBRTdDLDREQUFzRDs7Ozs7SUFDdEQseUNBQThCOzs7OztJQUM5QixzREFBMEM7Ozs7O0lBQzFDLGdEQUE4Qjs7Ozs7SUFDOUIseUNBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIE9uSW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uRGVzdHJveSwgT3V0cHV0LCBFdmVudEVtaXR0ZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBbm5vdGF0aW9uLCBDb21tZW50IH0gZnJvbSAnLi4vLi4vLi4vZGF0YS9hbm5vdGF0aW9uLXNldC5tb2RlbCc7XG5pbXBvcnQgeyBBbm5vdGF0aW9uU3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS9hbm5vdGF0aW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGRmU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2RhdGEvcGRmLnNlcnZpY2UnO1xuaW1wb3J0IHsgRW1Mb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vbG9nZ2luZy9lbS1sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQZGZSZW5kZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS9wZGYtcmVuZGVyLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtY29udGV4dHVhbC10b29sYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbnRleHR1YWwtdG9vbGJhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbnRleHR1YWwtdG9vbGJhci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENvbnRleHR1YWxUb29sYmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIHRvb2xQb3M6IHtsZWZ0LCB0b3B9O1xuICBpc1Nob3dUb29sYmFyOiBib29sZWFuO1xuICBzaG93RGVsZXRlOiBib29sZWFuO1xuICBhbm5vdGF0aW9uOiBBbm5vdGF0aW9uO1xuICBwcml2YXRlIGNvbnRleHR1YWxUb29sQmFyT3B0aW9uczogU3Vic2NyaXB0aW9uO1xuXG4gIEBPdXRwdXQoKSBkZWxldGVkQW5ub3RhdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYW5ub3RhdGlvblN0b3JlU2VydmljZTogQW5ub3RhdGlvblN0b3JlU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICAgICAgICBwcml2YXRlIHBkZlJlbmRlclNlcnZpY2U6IFBkZlJlbmRlclNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgcGRmU2VydmljZTogUGRmU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBsb2c6IEVtTG9nZ2VyU2VydmljZSkge1xuICAgIHRoaXMubG9nLnNldENsYXNzKCdDb250ZXh0dWFsVG9vbGJhckNvbXBvbmVudCcpO1xuICAgIHRoaXMudG9vbFBvcyA9IHtcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB0b3A6IDBcbiAgICB9O1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jb250ZXh0dWFsVG9vbEJhck9wdGlvbnMgPSB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZ2V0VG9vbGJhclVwZGF0ZSgpXG4gICAgICAuc3Vic2NyaWJlKGNvbnRleHR1YWxPcHRpb25zID0+IHtcbiAgICAgICAgaWYgKGNvbnRleHR1YWxPcHRpb25zLmFubm90YXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuc2hvd1Rvb2xCYXIoY29udGV4dHVhbE9wdGlvbnMuYW5ub3RhdGlvbiwgY29udGV4dHVhbE9wdGlvbnMuc2hvd0RlbGV0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5oaWRlVG9vbEJhcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB0aGlzLmlzU2hvd1Rvb2xiYXIgPSBmYWxzZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmVmLmRldGFjaCgpO1xuICAgIGlmICh0aGlzLmNvbnRleHR1YWxUb29sQmFyT3B0aW9ucykge1xuICAgICAgdGhpcy5jb250ZXh0dWFsVG9vbEJhck9wdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBzaG93VG9vbEJhcihhbm5vdGF0aW9uOiBBbm5vdGF0aW9uLCBzaG93RGVsZXRlPzogYm9vbGVhbikge1xuICAgIHRoaXMuYW5ub3RhdGlvbiA9IGFubm90YXRpb247XG4gICAgdGhpcy5zaG93RGVsZXRlID0gc2hvd0RlbGV0ZTtcblxuICAgIHRoaXMudG9vbFBvcyA9IHRoaXMuZ2V0UmVsYXRpdmVQb3NpdGlvbihhbm5vdGF0aW9uLmlkKTtcbiAgICB0aGlzLmlzU2hvd1Rvb2xiYXIgPSB0cnVlO1xuXG4gICAgaWYgKCF0aGlzLnJlZlsnZGVzdHJveWVkJ10pIHtcbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBnZXRSZWxhdGl2ZVBvc2l0aW9uKGFubm90YXRpb25JZDogc3RyaW5nKToge2xlZnQ6IG51bWJlcjsgdG9wOiBudW1iZXJ9IHtcbiAgICBjb25zdCBzdmdTZWxlY3RvciA9IHRoaXMucGRmUmVuZGVyU2VydmljZS5nZXRWaWV3ZXJFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAucXVlcnlTZWxlY3RvcihgZ1tkYXRhLXBkZi1hbm5vdGF0ZS1pZD1cIiR7YW5ub3RhdGlvbklkfVwiXWApO1xuICAgIGNvbnN0IGhpZ2hsaWdodFJlY3QgPSA8RE9NUmVjdD5zdmdTZWxlY3Rvci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLnBkZlNlcnZpY2UuZ2V0QW5ub3RhdGlvbldyYXBwZXIoKS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHdyYXBwZXJSZWN0ID0gPERPTVJlY3Q+d3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IGxlZnQgPSAoKGhpZ2hsaWdodFJlY3QueCAtIHdyYXBwZXJSZWN0LmxlZnQpXG4gICAgICAtIDE3NSkgKyBoaWdobGlnaHRSZWN0LndpZHRoIC8gMjsgLy8gTWludXMgaGFsZiB0aGUgdG9vbGJhciB3aWR0aCArIGhhbGYgdGhlIGxlbmd0aCBvZiB0aGUgaGlnaGxpZ2h0XG4gICAgY29uc3QgdG9wID0gKChoaWdobGlnaHRSZWN0LnkgLSB3cmFwcGVyUmVjdC50b3ApXG4gICAgICAtIDU5KSAtIDU7IC8vIE1pbnVzIGhlaWdodCBvZiB0b29sYmFyICsgNXB4XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGVmdCxcbiAgICAgIHRvcFxuICAgIH07XG4gIH1cblxuICBoaWRlVG9vbEJhcigpIHtcbiAgICAgIHRoaXMuYW5ub3RhdGlvbiA9IG51bGw7XG4gICAgICB0aGlzLmlzU2hvd1Rvb2xiYXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2hvd0RlbGV0ZSA9IGZhbHNlO1xuXG4gICAgICBpZiAoIXRoaXMucmVmWydkZXN0cm95ZWQnXSkge1xuICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gIH1cblxuICBoYW5kbGVDb21tZW50QnRuQ2xpY2soKSB7XG4gICAgaWYgKHRoaXMuYW5ub3RhdGlvbi5jb21tZW50cy5sZW5ndGggPT09IDAgKSB7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JlU2VydmljZS5hZGRDb21tZW50KG5ldyBDb21tZW50KG51bGwsIHRoaXMuYW5ub3RhdGlvbi5pZCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgdGVtcEFubm90YXRpb24gPSB0aGlzLmFubm90YXRpb247XG4gICAgICAgIHRoaXMuaGlkZVRvb2xCYXIoKTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldENvbW1lbnRGb2N1c1N1YmplY3QodGVtcEFubm90YXRpb24sIHRydWUpO1xuICAgICAgICB9LCAxMCk7XG4gIH1cblxuICBoYW5kbGVIaWdobGlnaHRCdG5DbGljaygpIHtcbiAgICB0aGlzLmhpZGVUb29sQmFyKCk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVEZWxldGVCdG5DbGljaygpIHtcbiAgICBhd2FpdCB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZGVsZXRlQW5ub3RhdGlvbkJ5SWQodGhpcy5hbm5vdGF0aW9uLmlkLCB0aGlzLmFubm90YXRpb24ucGFnZSk7XG4gICAgdGhpcy5oaWRlVG9vbEJhcigpO1xuICAgIHRoaXMuZGVsZXRlZEFubm90YXRpb24uZW1pdCgnZGVsZXRlZCBhbm5vdGF0aW9uJyk7XG4gIH1cbn1cbiJdfQ==