UNPKG

@hmcts/annotation-ui-lib

Version:

PDF Viewer and ability to highlight text with and comment tracking

229 lines 19.7 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'; var ContextualToolbarComponent = /** @class */ (function () { function ContextualToolbarComponent(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 {?} */ ContextualToolbarComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.contextualToolBarOptions = this.annotationStoreService.getToolbarUpdate() .subscribe(function (contextualOptions) { if (contextualOptions.annotation != null) { _this.showToolBar(contextualOptions.annotation, contextualOptions.showDelete); } else { _this.hideToolBar(); } }); this.isShowToolbar = false; }; /** * @return {?} */ ContextualToolbarComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.ref.detach(); if (this.contextualToolBarOptions) { this.contextualToolBarOptions.unsubscribe(); } }; /** * @param {?} annotation * @param {?=} showDelete * @return {?} */ ContextualToolbarComponent.prototype.showToolBar = /** * @param {?} annotation * @param {?=} showDelete * @return {?} */ function (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 {?} */ ContextualToolbarComponent.prototype.getRelativePosition = /** * @param {?} annotationId * @return {?} */ function (annotationId) { /** @type {?} */ var svgSelector = this.pdfRenderService.getViewerElementRef().nativeElement .querySelector("g[data-pdf-annotate-id=\"" + annotationId + "\"]"); /** @type {?} */ var highlightRect = (/** @type {?} */ (svgSelector.getBoundingClientRect())); /** @type {?} */ var wrapper = this.pdfService.getAnnotationWrapper().nativeElement; /** @type {?} */ var wrapperRect = (/** @type {?} */ (wrapper.getBoundingClientRect())); /** @type {?} */ var left = ((highlightRect.x - wrapperRect.left) - 175) + highlightRect.width / 2; // Minus half the toolbar width + half the length of the highlight /** @type {?} */ var top = ((highlightRect.y - wrapperRect.top) - 59) - 5; return { left: left, top: top }; }; /** * @return {?} */ ContextualToolbarComponent.prototype.hideToolBar = /** * @return {?} */ function () { this.annotation = null; this.isShowToolbar = false; this.showDelete = false; if (!this.ref['destroyed']) { this.ref.detectChanges(); } }; /** * @return {?} */ ContextualToolbarComponent.prototype.handleCommentBtnClick = /** * @return {?} */ function () { var _this = this; if (this.annotation.comments.length === 0) { this.annotationStoreService.addComment(new Comment(null, this.annotation.id, null, null, null, null, null, null, null)); } setTimeout(function () { /** @type {?} */ var tempAnnotation = _this.annotation; _this.hideToolBar(); _this.annotationStoreService.setCommentFocusSubject(tempAnnotation, true); }, 10); }; /** * @return {?} */ ContextualToolbarComponent.prototype.handleHighlightBtnClick = /** * @return {?} */ function () { this.hideToolBar(); }; /** * @return {?} */ ContextualToolbarComponent.prototype.handleDeleteBtnClick = /** * @return {?} */ function () { return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.annotationStoreService.deleteAnnotationById(this.annotation.id, this.annotation.page)]; case 1: _a.sent(); this.hideToolBar(); this.deletedAnnotation.emit('deleted annotation'); return [2 /*return*/]; } }); }); }; 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 = function () { return [ { type: AnnotationStoreService }, { type: ChangeDetectorRef }, { type: PdfRenderService }, { type: PdfService }, { type: EmLoggerService } ]; }; ContextualToolbarComponent.propDecorators = { deletedAnnotation: [{ type: Output }] }; return ContextualToolbarComponent; }()); export { ContextualToolbarComponent }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dHVhbC10b29sYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BobWN0cy9hbm5vdGF0aW9uLXVpLWxpYi8iLCJzb3VyY2VzIjpbImxpYi92aWV3ZXJzL2Fubm90YXRpb24tcGRmLXZpZXdlci9jb250ZXh0dWFsLXRvb2xiYXIvY29udGV4dHVhbC10b29sYmFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQVUsaUJBQWlCLEVBQWEsTUFBTSxFQUFFLFlBQVksRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVwRyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDekUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVwRTtJQWVFLG9DQUFvQixzQkFBOEMsRUFDOUMsR0FBc0IsRUFDdEIsZ0JBQWtDLEVBQ2xDLFVBQXNCLEVBQ3RCLEdBQW9CO1FBSnBCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFFBQUcsR0FBSCxHQUFHLENBQWlCO1FBTjlCLHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFPdkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsSUFBSSxFQUFFLENBQUM7WUFDUCxHQUFHLEVBQUUsQ0FBQztTQUNQLENB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Q1YsZUFBZTs7O29DQWdCckIsTUFBTTs7SUE4RlQsaUNBQUM7Q0FBQSxBQTNHRCxJQTJHQztTQXRHWSwwQkFBMEI7OztJQUVyQyw2Q0FBcUI7O0lBQ3JCLG1EQUF1Qjs7SUFDdkIsZ0RBQW9COztJQUNwQixnREFBdUI7Ozs7O0lBQ3ZCLDhEQUErQzs7SUFFL0MsdURBQXlEOzs7OztJQUU3Qyw0REFBc0Q7Ozs7O0lBQ3RELHlDQUE4Qjs7Ozs7SUFDOUIsc0RBQTBDOzs7OztJQUMxQyxnREFBOEI7Ozs7O0lBQzlCLHlDQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBPbkluaXQsIENoYW5nZURldGVjdG9yUmVmLCBPbkRlc3Ryb3ksIE91dHB1dCwgRXZlbnRFbWl0dGVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQW5ub3RhdGlvbiwgQ29tbWVudCB9IGZyb20gJy4uLy4uLy4uL2RhdGEvYW5ub3RhdGlvbi1zZXQubW9kZWwnO1xuaW1wb3J0IHsgQW5ub3RhdGlvblN0b3JlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2RhdGEvYW5ub3RhdGlvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFBkZlNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9kYXRhL3BkZi5zZXJ2aWNlJztcbmltcG9ydCB7IEVtTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2xvZ2dpbmcvZW0tbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGRmUmVuZGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2RhdGEvcGRmLXJlbmRlci5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWNvbnRleHR1YWwtdG9vbGJhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb250ZXh0dWFsLXRvb2xiYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb250ZXh0dWFsLXRvb2xiYXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDb250ZXh0dWFsVG9vbGJhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICB0b29sUG9zOiB7bGVmdCwgdG9wfTtcbiAgaXNTaG93VG9vbGJhcjogYm9vbGVhbjtcbiAgc2hvd0RlbGV0ZTogYm9vbGVhbjtcbiAgYW5ub3RhdGlvbjogQW5ub3RhdGlvbjtcbiAgcHJpdmF0ZSBjb250ZXh0dWFsVG9vbEJhck9wdGlvbnM6IFN1YnNjcmlwdGlvbjtcblxuICBAT3V0cHV0KCkgZGVsZXRlZEFubm90YXRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFubm90YXRpb25TdG9yZVNlcnZpY2U6IEFubm90YXRpb25TdG9yZVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBwZGZSZW5kZXJTZXJ2aWNlOiBQZGZSZW5kZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHBkZlNlcnZpY2U6IFBkZlNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgbG9nOiBFbUxvZ2dlclNlcnZpY2UpIHtcbiAgICB0aGlzLmxvZy5zZXRDbGFzcygnQ29udGV4dHVhbFRvb2xiYXJDb21wb25lbnQnKTtcbiAgICB0aGlzLnRvb2xQb3MgPSB7XG4gICAgICBsZWZ0OiAwLFxuICAgICAgdG9wOiAwXG4gICAgfTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29udGV4dHVhbFRvb2xCYXJPcHRpb25zID0gdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLmdldFRvb2xiYXJVcGRhdGUoKVxuICAgICAgLnN1YnNjcmliZShjb250ZXh0dWFsT3B0aW9ucyA9PiB7XG4gICAgICAgIGlmIChjb250ZXh0dWFsT3B0aW9ucy5hbm5vdGF0aW9uICE9IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnNob3dUb29sQmFyKGNvbnRleHR1YWxPcHRpb25zLmFubm90YXRpb24sIGNvbnRleHR1YWxPcHRpb25zLnNob3dEZWxldGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaGlkZVRvb2xCYXIoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgdGhpcy5pc1Nob3dUb29sYmFyID0gZmFsc2U7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZi5kZXRhY2goKTtcbiAgICBpZiAodGhpcy5jb250ZXh0dWFsVG9vbEJhck9wdGlvbnMpIHtcbiAgICAgIHRoaXMuY29udGV4dHVhbFRvb2xCYXJPcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgc2hvd1Rvb2xCYXIoYW5ub3RhdGlvbjogQW5ub3RhdGlvbiwgc2hvd0RlbGV0ZT86IGJvb2xlYW4pIHtcbiAgICB0aGlzLmFubm90YXRpb24gPSBhbm5vdGF0aW9uO1xuICAgIHRoaXMuc2hvd0RlbGV0ZSA9IHNob3dEZWxldGU7XG5cbiAgICB0aGlzLnRvb2xQb3MgPSB0aGlzLmdldFJlbGF0aXZlUG9zaXRpb24oYW5ub3RhdGlvbi5pZCk7XG4gICAgdGhpcy5pc1Nob3dUb29sYmFyID0gdHJ1ZTtcblxuICAgIGlmICghdGhpcy5yZWZbJ2Rlc3Ryb3llZCddKSB7XG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UmVsYXRpdmVQb3NpdGlvbihhbm5vdGF0aW9uSWQ6IHN0cmluZyk6IHtsZWZ0OiBudW1iZXI7IHRvcDogbnVtYmVyfSB7XG4gICAgY29uc3Qgc3ZnU2VsZWN0b3IgPSB0aGlzLnBkZlJlbmRlclNlcnZpY2UuZ2V0Vmlld2VyRWxlbWVudFJlZigpLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoYGdbZGF0YS1wZGYtYW5ub3RhdGUtaWQ9XCIke2Fubm90YXRpb25JZH1cIl1gKTtcbiAgICBjb25zdCBoaWdobGlnaHRSZWN0ID0gPERPTVJlY3Q+c3ZnU2VsZWN0b3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5wZGZTZXJ2aWNlLmdldEFubm90YXRpb25XcmFwcGVyKCkubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCB3cmFwcGVyUmVjdCA9IDxET01SZWN0PndyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBjb25zdCBsZWZ0ID0gKChoaWdobGlnaHRSZWN0LnggLSB3cmFwcGVyUmVjdC5sZWZ0KVxuICAgICAgLSAxNzUpICsgaGlnaGxpZ2h0UmVjdC53aWR0aCAvIDI7IC8vIE1pbnVzIGhhbGYgdGhlIHRvb2xiYXIgd2lkdGggKyBoYWxmIHRoZSBsZW5ndGggb2YgdGhlIGhpZ2hsaWdodFxuICAgIGNvbnN0IHRvcCA9ICgoaGlnaGxpZ2h0UmVjdC55IC0gd3JhcHBlclJlY3QudG9wKVxuICAgICAgLSA1OSkgLSA1OyAvLyBNaW51cyBoZWlnaHQgb2YgdG9vbGJhciArIDVweFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQsXG4gICAgICB0b3BcbiAgICB9O1xuICB9XG5cbiAgaGlkZVRvb2xCYXIoKSB7XG4gICAgICB0aGlzLmFubm90YXRpb24gPSBudWxsO1xuICAgICAgdGhpcy5pc1Nob3dUb29sYmFyID0gZmFsc2U7XG4gICAgICB0aGlzLnNob3dEZWxldGUgPSBmYWxzZTtcblxuICAgICAgaWYgKCF0aGlzLnJlZlsnZGVzdHJveWVkJ10pIHtcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICB9XG5cbiAgaGFuZGxlQ29tbWVudEJ0bkNsaWNrKCkge1xuICAgIGlmICh0aGlzLmFubm90YXRpb24uY29tbWVudHMubGVuZ3RoID09PSAwICkge1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuYWRkQ29tbWVudChuZXcgQ29tbWVudChudWxsLCB0aGlzLmFubm90YXRpb24uaWQsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRlbXBBbm5vdGF0aW9uID0gdGhpcy5hbm5vdGF0aW9uO1xuICAgICAgICB0aGlzLmhpZGVUb29sQmFyKCk7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JlU2VydmljZS5zZXRDb21tZW50Rm9jdXNTdWJqZWN0KHRlbXBBbm5vdGF0aW9uLCB0cnVlKTtcbiAgICAgICAgfSwgMTApO1xuICB9XG5cbiAgaGFuZGxlSGlnaGxpZ2h0QnRuQ2xpY2soKSB7XG4gICAgdGhpcy5oaWRlVG9vbEJhcigpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlRGVsZXRlQnRuQ2xpY2soKSB7XG4gICAgYXdhaXQgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLmRlbGV0ZUFubm90YXRpb25CeUlkKHRoaXMuYW5ub3RhdGlvbi5pZCwgdGhpcy5hbm5vdGF0aW9uLnBhZ2UpO1xuICAgIHRoaXMuaGlkZVRvb2xCYXIoKTtcbiAgICB0aGlzLmRlbGV0ZWRBbm5vdGF0aW9uLmVtaXQoJ2RlbGV0ZWQgYW5ub3RhdGlvbicpO1xuICB9XG59XG4iXX0=