@hmcts/annotation-ui-lib
Version:
PDF Viewer and ability to highlight text with and comment tracking
198 lines • 18.3 kB
JavaScript
/**
* @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==