@hmcts/media-viewer 2.9.4-RC.8 → 2.9.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/sass/toolbar/main-toolbar.scss +7 -6
- package/bundles/hmcts-media-viewer.umd.js +17 -4
- package/bundles/hmcts-media-viewer.umd.js.map +1 -1
- package/bundles/hmcts-media-viewer.umd.min.js +1 -1
- package/bundles/hmcts-media-viewer.umd.min.js.map +1 -1
- package/esm2015/lib/print.service.js +5 -2
- package/esm2015/lib/store/effects/annotation.effects.js +4 -1
- package/esm2015/lib/store/selectors/bookmark.selectors.js +4 -2
- package/esm2015/lib/toolbar/main-toolbar/main-toolbar.component.js +8 -3
- package/fesm2015/hmcts-media-viewer.js +17 -4
- package/fesm2015/hmcts-media-viewer.js.map +1 -1
- package/hmcts-media-viewer.metadata.json +1 -1
- package/lib/print.service.d.ts.map +1 -1
- package/lib/store/effects/annotation.effects.d.ts.map +1 -1
- package/lib/store/selectors/bookmark.selectors.d.ts.map +1 -1
- package/lib/toolbar/main-toolbar/main-toolbar.component.d.ts +1 -0
- package/lib/toolbar/main-toolbar/main-toolbar.component.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__decorate","decorators","target","key","desc","c","arguments","length","r","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","__metadata","metadataKey","metadataValue","metadata","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","this","n","v","op","TypeError","pop","push","create","__values","o","s","m","__read","ar","error","__spread","concat","FindState","pdfjsLib","GlobalWorkerOptions","workerSrc","PdfJsWrapper","pdfViewer","downloadManager","toolbarEvents","documentLoadInit","documentLoadProgress","documentLoaded","outlineLoaded","documentLoadFailed","pageRendered","positionUpdated","_this","eventBus","on","setCurrentPageInputValueSubject","pageNumber","currentScaleValue","emitDocumentInfo","event","sendSearchDetails","searchResultsCountSubject","matchesCount","zoomValue","state","PENDING","_b","_a","source","selected","pageIdx","total","redactionSerachSubject","page","_d","_c","matchedIndex","_f","_e","matchIdx","allPages","_pages","map","div","scale","rotation","id","viewportScale","viewport","loadDocument","documentUrl","loadingTask","createLoadingTask","onProgress","_g","loaded","promise","pdfDocument","pageCountSubject","numPages","setDocument","linkService","getOutline","outline","setOutlinePageNumbers","documentOutline","getMetadata","pdfMetaData","setCurrentPDFTitle","info","Title","e_1","getDocument","url","cMapUrl","cMapPacked","withCredentials","outlineArray","forEach","setNestedOutlinePageNumbers","getOutlinePageNumber","_h","items","outlineItem","dest","getPageIndex","pageIndex","Number","downloadFile","filename","downloadUrl","setPageNumber","currentPageNumber","getPageNumber","changePageNumber","search","operation","command","reset","findController","executeCommand","query","searchTerm","phraseSearch","caseSensitive","matchCase","entireWord","wholeWord","highlightAll","findPrevious","previous","clearSearch","dispatch","navigateTo","destination","name","includes","setZoom","getZoomValue","zoomValueSubject","stepZoom","isNaN","toFixed","rotate","pagesRotation","resetRotation","getNormalisedPagesRotation","getCurrentPDFZoomValue","title","documentTitle","getCurrentPDFTitle","enabled","BehaviorSubject","sessionLaunch","Subject","becomingPresenter","stoppingPresenting","leavingSession","sessionExitConfirmed","participantsListVisible","launchSession","ToolbarEventService","highlightModeSubject","drawModeSubject","rotateSubject","searchSubject","zoomSubject","stepZoomSubject","printSubject","downloadSubject","setCurrentPageSubject","changePageByDeltaSubject","showCommentSummary","grabNDrag","saveRotationSubject","redactionMode","redactionPreview","applyRedactToDocument","clearAllRedactMarkers","redactWholePage","redactAllInProgressSubject","openRedactionSearch","sidebarOpen","sidebarOutlineView","searchBarHidden","commentsPanelVisible","icp","icpEvents","toggleHighlightMode","getValue","toggleDrawMode","angle","phrase","getSearchResultsCount","asObservable","zoom","getPageCount","print","download","setPage","incrementPage","getCurrentPageNumber","getShowCommentSummary","toggleCommentsSummary","saveRotation","toggleGrabNDrag","toggleSideBar","toggle","toggleSideBarView","toggleRedactionMode","toggleRedactionPreview","viewMode","unmarkAll","applyRedactionToDocument","redactPage","toggleCommentsPanel","isVisible","toggleParticipantsList","type","Injectable","args","providedIn","PdfJsWrapperFactory","pdfjsViewer","PDFLinkService","EventBus","container","pdfFindController","PDFFindController","PDFViewer","nativeElement","imageResourcesPath","textLayerMode","setViewer","pdfJsWrapper","DownloadManager","pdfWrapper","ResponseType","PrintService","printDocumentNatively","window","open","printElementNatively","element","width","height","printWindow","documentHead","document","head","appendChild","cloneNode","close","focus","ViewerException","exceptionType","detail","ToolbarButtonVisibilityService","showPrint","showDownload","showNavigation","showZoom","showRotate","showPresentationMode","showRedact","showOpenFile","showBookmark","showHighlightButton","showDrawButton","showSearchBar","showSidebar","showGrabNDragButton","showSaveRotationButton","setup","options","defaultPdfOptions","defaultImageOptions","defaultMultimediaOptions","defaultUnsupportedOptions","SET_DOCUMENT_ID","POSITION_UPDATED","ADD_PAGES","CONVERT","CONVERT_SUCCESS","CONVERT_FAIL","CLEAR_CONVERT_DOC_URL","LOAD_ROTATION","LOAD_ROTATION_SUCCESS","LOAD_ROTATION_FAIL","SAVE_ROTATION","SAVE_ROTATION_SUCCESS","SetDocumentId","payload","AddPages","PdfPositionUpdate","Convert","ConvertSuccess","ConvertFailure","ClearConvertDocUrl","LoadRotation","LoadRotationSuccess","LoadRotationFailure","SaveRotation","SaveRotationSuccess","SaveRotationFailure","ADD_FILTER_TAGS","CLEAR_FILTER_TAGS","AddFilterTags","ClearFilterTags","SET_CASE_ID","LOAD_ICP_SESSION","JOIN_ICP_SOCKET_SESSION","ICP_SOCKET_SESSION_JOINED","LEAVE_ICP_SOCKET_SESSION","ICP_PRESENTER_UPDATED","ICP_PARTICIPANT_LIST_UPDATED","SetCaseId","LoadIcpSession","LoadIcpSessionFailure","JoinIcpSocketSession","IcpSocketSessionJoined","LeaveIcpSocketSession","IcpPresenterUpdated","IcpParticipantListUpdated","initialDocumentState","convertedDocument","undefined","documentId","pdfPosition","pages","hasDifferentPageSize","rotationLoaded","loading","docReducer","action","fromActions.CONVERT_SUCCESS","assign","fromActions.CONVERT_FAIL","fromActions.CLEAR_CONVERT_DOC_URL","fromActions.LOAD_ROTATION","fromActions.LOAD_ROTATION_SUCCESS","rotationAngle","fromActions.LOAD_ROTATION_FAIL","fromActions.SAVE_ROTATION_SUCCESS","fromActions.SET_DOCUMENT_ID","fromActions.ADD_PAGES","pageHeight_1","pageWidth_1","pages_1","hasDifferentPageSize_1","styles","left","scaleRotation","fromActions.POSITION_UPDATED","getDocPages","LOAD_ANNOTATION_SET","LOAD_ANNOTATION_SET_SUCCESS","LOAD_ANNOTATION_SET_FAIL","SAVE_ANNOTATION","SAVE_ANNOTATION_SUCCESS","SAVE_ANNOTATION_FAIL","ADD_OR_EDIT_COMMENT","DELETE_ANNOTATION","DELETE_ANNOTATION_SUCCESS","DELETE_ANNOTATION_FAIL","SELECT_ANNOTATION","SEARCH_COMMENT","APPLY_COMMENT_SUMMARY_FILTER","CLEAR_COMMENT_SUMMARY_FILTER","LoadAnnotationSet","LoadAnnotationSetSucess","LoadAnnotationSetFail","SaveAnnotation","SaveAnnotationSuccess","SaveAnnotationFail","AddOrEditComment","DeleteAnnotation","DeleteAnnotationSuccess","DeleteAnnotationFail","SelectedAnnotation","SearchComment","ApplyCommentSymmaryFilter","ClearCommentSummaryFilters","StoreUtils","groupByKeyEntities","annotations","reduce","h","obj","generateCommentsEntities","commentEntities","annotation","comments","comment","tags","genTagNameEntities","groupedByName","filter","a","anno","tagEntitiy","tagItem","genNameEnt","annos","keys","tagNameEnt","readyAnno","find","tag","generateAnnotationEntities","annoEntities","annot","positionTop","rectangles","generateRedactionEntities","redactions","redactEntities","redaction","redactionId","resetCommentEntSelect","ent","object","editable","filterCommentsSummary","filters","tagFilterApplied","tagFilters","dateFilterApplied_1","dateRangeFrom","dateRangeTo","filteredComments","hasTagFilter","hasDateFilter","commentDate","moment","lastModifiedDate","dateFrom","dateTo","initialState","annotationSet","annotationEntities","annotationPageEntities","selectedAnnotation","commentSearchQueries","commentSearch","commentSummaryFilters","hasFilter","reducer","isFiltered","fromAnnotations.LOAD_ANNOTATION_SET","fromAnnotations.LOAD_ANNOTATION_SET_SUCCESS","fromAnnotations.LOAD_ANNOTATION_SET_FAIL","status","uuid","fromAnnotations.SAVE_ANNOTATION_SUCCESS","annEntities_1","annotArray","annotationId","fromAnnotations.DELETE_ANNOTATION_SUCCESS","id_1","pageAnnotationsRemoved","fromAnnotations.ADD_OR_EDIT_COMMENT","fromAnnotations.SELECT_ANNOTATION","commentEntity","fromAnnotations.SEARCH_COMMENT","fromAnnotations.APPLY_COMMENT_SUMMARY_FILTER","payload_1","fromAnnotations.CLEAR_COMMENT_SUMMARY_FILTER","getAnnoSet","getCommentEnts","getAnnoPageEnt","getAnnoEnt","getSelectedAnno","commentSearchQ","getSummaryFilters","initialTagState","filteredPageEntities","formFilterState","tagsReducer","fromTags.ADD_FILTER_TAGS","formFilterState_1","arr","fromTags.CLEAR_FILTER_TAGS","getFilteredComments","getFilteredPageEnt","LOAD_BOOKMARKS","LOAD_BOOKMARKS_SUCCESS","LOAD_BOOKMARKS_FAIL","CREATE_BOOKMARK","CREATE_BOOKMARK_SUCCESS","DELETE_BOOKMARK","DELETE_BOOKMARK_SUCCESS","MOVE_BOOKMARK","MOVE_BOOKMARK_SUCCESS","UPDATE_BOOKMARK","UPDATE_BOOKMARK_SUCCESS","LoadBookmarks","LoadBookmarksSuccess","LoadBookmarksFailure","CreateBookmark","CreateBookmarkSuccess","CreateBookmarkFailure","DeleteBookmark","DeleteBookmarkSuccess","DeleteBookmarkFailure","MoveBookmark","MoveBookmarkSuccess","MoveBookmarkFailure","UpdateBookmark","UpdateBookmarkSuccess","UpdateBookmarkFailure","getBookmarkChildren","bookmarks","childIds","bookmark","children","generateBookmarkEntities","bookmarkEntities","indexEntities","entities","entityIds","index","keysToRemove","toString","splice","indexOf","initialBookmarksState","bookmarkPageEntities","editableBookmark","bookmarksReducer","fromBookmarks.LOAD_BOOKMARKS","fromBookmarks.LOAD_BOOKMARKS_SUCCESS","fromBookmarks.LOAD_BOOKMARKS_FAIL","fromBookmarks.CREATE_BOOKMARK_SUCCESS","bookmarkEntities_1","bookmarkArray","fromBookmarks.MOVE_BOOKMARK_SUCCESS","movedBookmarks","fromBookmarks.DELETE_BOOKMARK_SUCCESS","bookmarkIds","bookmarkEntities_2","bookmarkPageEntities_1","removeBookmarksByPage_1","bookmarkId","entries","bmrkIds","fromBookmarks.UPDATE_BOOKMARK_SUCCESS","bookmarkEntities_3","LOAD_REDACTIONS","LOAD_REDACTION_SUCCESS","SAVE_REDACTION","SAVE_REDACTION_SUCCESS","SAVE_BULK_REDACTION","SAVE_BULK_REDACTION_SUCCESS","DELETE_REDACTION","DELETE_REDACTION_SUCCESS","SELECT_REDACTION","REDACT","REDACT_SUCCESS","RESET_REDACTED_DOCUMENT","UNMARK_ALL","UNMARK_ALL_SUCCESS","LoadRedactions","LoadRedactionSuccess","LoadRedactionFailure","SaveRedaction","SaveRedactionSuccess","SaveRedactionFailure","SaveBulkRedactionFailure","SaveBulkRedaction","SaveBulkRedactionSuccess","DeleteRedaction","DeleteRedactionSuccess","DeleteRedactionFailure","SelectRedaction","Redact","RedactSuccess","RedactFailure","ResetRedactedDocument","UnmarkAll","UnmarkAllSuccess","initialRedactionState","redactionEntities","redactionPageEntities","selectedRedaction","redactedDocumentInfo","redactionReducer","fromRedaction.LOAD_REDACTIONS","fromRedaction.LOAD_REDACTION_SUCCESS","fromRedaction.SAVE_REDACTION_SUCCESS","redactionEntities_1","redactionArray","fromRedaction.SAVE_BULK_REDACTION_SUCCESS","payloadResult","searchRedactions","x","redactionEntities_2","fromRedaction.SELECT_REDACTION","fromRedaction.DELETE_REDACTION_SUCCESS","pageRedactionRemoved","fromRedaction.REDACT_SUCCESS","fromRedaction.RESET_REDACTED_DOCUMENT","fromRedaction.UNMARK_ALL_SUCCESS","initialIcpSessionState","session","presenter","client","participants","icpReducer","fromIcpActions.SET_CASE_ID","caseId","fromIcpActions.ICP_SOCKET_SESSION_JOINED","participantInfo","fromIcpActions.ICP_PARTICIPANT_LIST_UPDATED","updatedParticipants_1","username","fromIcpActions.ICP_PRESENTER_UPDATED","fromIcpActions.LEAVE_ICP_SOCKET_SESSION","IcpEvents","reducers","fromDocument.docReducer","fromAnnotation.reducer","fromTags.tagsReducer","fromBookmarks.bookmarksReducer","fromRedaction.redactionReducer","fromIcp.icpReducer","getMVState","createFeatureSelector","getDocumentState","createSelector","fromFeature.getMVState","getPages","fromDocument.getDocPages","getDocumentId","values","getPdfPosition","getPageDifference","getConvertedDocument","getRotation","ViewerEventService","textHighlight","boxHighlight","ctxToolbarCleared","navigationEvent","textSelected","selectionData","boxSelected","clearCtxToolbar","goToDestination","SocketService","connected$","sessionJoined$","presenterUpdated$","clientDisconnected$","participantUpdated$","newParticipantJoined$","screenUpdated$","ngOnDestroy","subscription","unsubscribe","connect","getSocketClient","subscribe","socket","onopen","onmessage","console","log","eventData","JSON","parse","data","eventName","messageEventHandller","onerror","onclose","connected","join","emit","SESSION_JOIN","leave","SESSION_LEAVE","send","stringify","listen","SESSION_JOINED","PRESENTER_UPDATED","CLIENT_DISCONNECTED","PARTICIPANTS_UPDATED","NEW_PARTICIPANT_JOINED","SCREEN_UPDATED","WebSocket","of","IcpUpdateService","joinSession","connectionUrl","isConnected","leaveSession","newParticipantJoined","clientDisconnected","removeParticipant","participantId","REMOVE_PARTICIPANT","participantListUpdated","updatePresenter","UPDATE_PRESENTER","presenterId","presenterName","presenterUpdated","updateScreen","screen","update","UPDATE_SCREEN","screenUpdated","getIcpState","getIcpSession","getCaseId","getPresenter","getPresenterName","getClient","isPresenter","getParticipants","IcpPresenterService","socketService","store","$subscription","pipe","select","fromDocSelectors.getPdfPosition","onPositionUpdate","add","fromIcpSelectors.getPresenter","onNewParticipantJoined","Store","IcpFollowerService","viewerEvents","isFollower","followScreenUpdate","top","take","position","rotationDelta","IcpService","presenterSubscriptions","followerSubscriptions","fromIcpSelectors.getCaseId","unsubscribeSession","fromIcpActions.LoadIcpSession","fromIcpSelectors.getIcpSession","setUpSessionSubscriptions","sessionSubscription","becomePresenter","stopPresenting","leavePresentation","fromIcpSelectors.getClient","fromIcpSelectors.isPresenter","cli","pres","fromIcpActions.IcpPresenterUpdated","fromIcpActions.IcpParticipantListUpdated","fromIcpActions.LeaveIcpSocketSession","PdfViewerComponent","icpStore","pdfJsWrapperFactory","printService","icpService","toolbarButtons","mediaLoadStatus","EventEmitter","pdfViewerException","pageHeights","loadingDocument","enableGrabNDrag","highlightMode","tap","fromTagActions.ClearFilterTags","drawMode","ngAfterContentInit","onDocumentLoadProgress","onDocumentLoaded","onDocumentLoadFailed","updatePages","downloadFileName","rotateDocument","showCommentsPanel","showIcpParticipantsList","throttleTime","asyncScheduler","leading","trailing","location","ngOnChanges","changes","viewerContainer","enableRedactions","initDocumentProgress","setPageHeights","fromDocumentsSelector.getPageDifference","hasDifferentPageSie","progress","loadingDocumentProgress","Math","min","ceil","SUCCESS","viewerException","message","errorMessage","FAILURE","enableAnnotations","fromDocumentActions.AddPages","set","hidden","zoomFactor","calculateZoomValue","pdfViewerChildren","clientHeight","increment","newZoomValue","Component","selector","template","encapsulation","ViewEncapsulation","None","Output","Input","ViewChild","static","ViewerUtilService","http","validateFile","HttpClient","ImageViewerComponent","viewerUtilService","imageViewerException","subscriptions","ngOnInit","rotateImage","onImageViewerClick","className","startsWith","fromAnnotationActions.SelectedAnnotation","closed","response","initAnnoPage","img","setZoomValue","naturalWidth","createElement","setAttribute","href","click","remove","onLoadError","httpResponseCode","onLoad","imageHeight","offsetWidth","offsetHeight","imageWidth","imageLeft","offsetTop","offsetLeft","imageTop","scrollHeight","scrollWidth","fromDocument.AddPages","HostListener","UnsupportedViewerComponent","loadStatus","unsupportedViewerException","downloadLink","UNSUPPORTED","typeException","AnnotationApiService","httpClient","annotationApiUrl","annotationSetBaseUrl","annotationBaseUrl","getAnnotationSet","fixedUrl","annotationSetsFullUrl","get","observe","postAnnotationSet","post","catchError","getComments","sortAnnotations","extractComments","sort","deleteAnnotation","annotationFullsUrl","delete","postAnnotation","CommentService","unsavedChanges","marginToCommentEmitter","setCommentSet","commentSetComponent","onCommentChange","getUnsavedChanges","hasUnsavedComments","getComment","hasUnsavedChanges","updateUnsavedCommentsStatus","allCommentsSaved","commentComponents","resetCommentSet","some","createMarginToCommentEvent","margin","CoreContentTypes","MultimediaContentTypes","ConvertibleContentTypes","getTagsRootState","getTagEntities","getTagFilters","getTagFiltered","fromTags.getFilteredComments","getFilteredPageEntities","fromTags.getFilteredPageEnt","getAllTagsArr","tagEnt","ɵ0","getAnnotationsSetState","getAnnotationEntities","fromAnnotations.getAnnoEnt","getSet","fromAnnotations.getAnnoSet","annoSet","annotationSetId","getDocumentIdSetId","ɵ2","getSelectedAnnotation","fromAnnotations.getSelectedAnno","getCommentEntities","fromAnnotations.getCommentEnts","getPageEntities","fromAnnotations.getAnnoPageEnt","getComponentSearchQueries","fromAnnotations.commentSearchQ","ɵ3","queries","getComponentSearchText","getCommentSummaryFilters","fromAnnotations.getSummaryFilters","pageEnt","filteredPageEnt","arr_1","getAnnoPerPage","fromDocument.getPages","fromTags.getFilteredPageEntities","commentEnts","annoEnts","filtered","com","getCommentsArray","fromTags.getTagFiltered","commentSummary","createdByDetails","user","forename","surname","date","format","content","getCommentSummary","annoEnt","getFilteredAnnotations","MediaViewerComponent","api","commentService","elRef","cdr","showToolbar","toolbarButtonOverrides","toolbarEventsOutput","enableICP","multimediaPlayerEnabled","enableRedactSearch","multimediaContent","convertibleContent","unsupportedContent","annotationSet$","fromAnnoSelectors.getAnnotationSet","hasDifferentPageSize$","setToolbarButtons","$subscriptions","ngAfterViewChecked","viewerHeight","detectChanges","offset","getBoundingClientRect","viewerRef","prevOffset","extractDMStoreDocId","fromDocumentActions.SetDocumentId","fromAnnoActions.LoadAnnotationSet","fromRedactActions.LoadRedactions","contentType","needsConverting","isMultimedia","isSupported","detectOs","toUpperCase","supportedTypes","onMediaLoad","PDF","IMAGE","onLoadException","exception","onDocumentTitleChange","split","replace","hasScrollBar","navigator","userAgent","ElementRef","ChangeDetectorRef","HighlightCreateService","toolBarEvents","saveAnnotation","fromSelectors.getDocumentIdSetId","anoSetDocId","color","createdBy","createdDate","utc","tz","toISOString","lastModifiedBy","lastModifiedByDetails","fromActions.SaveAnnotation","applyRotation","pageHeight","pageWidth","rectangle","resetHighlight","getSelection","removeAllRanges","RedactionSearchBarComponent","highlightService","resultsText","searchText","resultCount","redactElements","advancedSearchVisible","results","redactAllSearched","fromDocument.getDocumentId","docId","setSearchResultsCount","isOpen","openSearchModal","inProgress","redactAllInProgress","onWindowKeyDown","code","ctrlKey","preventDefault","setTimeout","findInput","redactAll","saveRedaction","redactRectangle","ele","fromRedactionActions.SaveBulkRedaction","existInRedactElements","matechedIndex","pagesFound","re","pageRectangles","matchesRectangles","rectIndx","onCloseSearchModal","$this","intervalId","setInterval","highlightElement","getElementsByClassName","clearInterval","redactAllSearchedTick","getRectangles","CreateRedactAllText","redactAllText","onEscapeKeyPress","onEnterKeyPress","toggleSearchBar","parseFloat","parseInt","selectedHighLightedElements","docRange","createRange","selectNodeContents","selection","addRange","rangeCount","isCollapsed","clientRects","getRangeAt","cloneRange","getClientRects","parentRect","parentElement","selectionRectangles","selectionRectangle","this_1","createTextRectangle","rect","bottom","right","NumberHelperService","isNumber","MainToolbarComponent","numberHelper","icpEnabled","redactionEnabled","pageCount","isDropdownMenuOpen","dropdownMenuPositions","ConnectionPositionPair","originX","originY","overlayX","overlayY","zoomScales","allButtonsWidth","widthRequiredForBtn","setCurrentPage","count","disable","ngAfterViewInit","from","mvToolbarMain","button","onResize","onClickHighlightToggle","onClickDrawToggle","toggleIndexSideBar","sidebarView","toggleBookmarksSideBar","togglePresentBar","enable","increasePageNumber","decreasePageNumber","onPageNumberInputChange","printFile","zoomSelect","toggleRedactBar","isPdf","toggleMoreOptions","mvMenuItems","SearchBarComponent","searchNext","searchPrev","current","findNext","toggleAdvancedSearch","getRedactionState","getRedactionPages","getSelected","getRedactedDocumentInfo","getRedactionEnt","getRedactionArray","getRedactionsPerPage","RedactionToolbarComponent","toolbarEventService","preview","hasRedactions","fromRedactSelectors.getRedactionArray","inprogress","redactionAllInProgress","onRedactAllSearch","toggleTextRedactionMode","togglePreview","redact","IcpToolbarComponent","fromIcpSelectors.getPresenterName","present","leaveIcpSession","showParticipantsList","ToolbarModule","NgModule","declarations","providers","exports","imports","CommonModule","FormsModule","OverlayModule","RouterModule","AnnotationViewComponent","annotationClick","selectedId","onSelect","onRectangleUpdate","deleteHighlight","addOrEditComment","fromActions.AddOrEditComment","AnnotationSetComponent","selectedAnnotation$","fromSelectors.getSelectedAnnotation","onAnnotationUpdate","onAnnotationDelete","fromActions.DeleteAnnotation","selectAnnotation","fromActions.SelectedAnnotation","RectangleComponent","_annoRect","annoRect","adjustForRotation","_selected","viewRect","onClick","onUpdate","hasRectangleChanged","TagsServices","snakeCase","string","word","toLowerCase","getAllTags","getNewTags","annoid","tagItems","updateTagItems","annoId","snakeCased","item","CommentComponent","tagsServices","CHAR_LIMIT","totalPrevPagesHeight","commentClick","renderComments","updated","fromSelector.getComponentSearchText","distinctUntilChanged","searchString","reRenderComments","marginToComment$","_comment","lastUpdate","author","editor","originalComment","fullComment","_editable","_rectangle","prev","actualHeight","rectTop","rectLeft","updatedComment","substring","deleteOrCancel","editOrSave","onCommentClick","form","editableComment","CtxToolbarComponent","createHighlightEvent","deleteHighlightEvent","addOrEditCommentEvent","createBookmarkEvent","defaultHeight","defaultWidth","setRectangle","popupTop","popupLeft","_rectangles","createHighlight","hash","getElementById","scrollBy","createBookmark","CommentSetRenderService","redrawComponents","prevComment","sortComponents","adjustIfOverlapping","processSort","endOfPrevComment","commentTop","onSameLine","difference","abs","CommentSetComponent","renderService","clearSelection","comments$","fromSelectors.getCommentsArray","annoEntities$","fromSelectors.getAnnotationEntities","redrawComments","contentScrollTop","scrollTo","onCommentDelete","componentList","panel","style","onCommentUpdate","onContainerClick","path","ViewChildren","TextareaAutoExpandDirective","el","ngAfterContentChecked","adjustHeight","onMouseDown","overflow","Directive","CommentsSummaryComponent","fb","showFilters","filtersFg","group","FormGroup","day","FormControl","month","year","fromSelectors.getCommentSummary","buildCheckBoxForm","checkboxes","filters$","fromSelectors.getCommentSummaryFilters","allTags$","fromTagSelectors.getAllTagsArr","combineLatest","val","checkBoxValue","addControl","updateValueAndValidity","onClearFilters","fromAnnoActions.ClearCommentSummaryFilters","onFilter","hasDateFrom","hasDateTo","Date","getTime","fromAnnoActions.ApplyCommentSymmaryFilter","onFiltersToggle","onClose","onPrint","commentsTable","navigateToPage","FormBuilder","BoxHighlightCreateComponent","saveSelection","drawStartX","drawStartY","backgroundColor","wholePage","initHighlight","offsetX","offsetY","highlightPage","display","updateHighlight","currentTarget","clientX","clientY","highlight","CommentSetHeaderComponent","showCommentSummaryDialog","tabs","tabSelected","tagFilter$","fromTagSelectors.getTagFilters","filteredAnnotation$","fromAnnoSelector.getFilteredAnnotations","formData","filteredAnno","navigationList","tab","selectTab","marginToComment","CommentSearchComponent","searchResults","searchIndex","searchInput","fromActions.SearchComment","searchComments","TextHighlightDirective","textToHighlight","highlightInputText","searchPattern","RegExp","hostElement","innerHTML","match","highlightPattern","matchGroups","exec","dynamicText","TagsComponent","validators","minLength","maxLength20","errorMessages","requestAutocompleteItems","text","userId","onUpdateTags","control","CommentsNavigateComponent","autoSelect","annotationList","initNavigationList","upperRectangle","sortComments","mappedCommentA","mappedCommentB","rectA","rectB","nextItem","prevItem","rect1","rect2","CommentFilterComponent","isPreview","tagGroup","filter$","fromSelectors.getTagFilters","valueChanges","auditTime","fromActions.AddFilterTags","buildFrom","fromSelectors.getAllTagsArr","fromActions.ClearFilterTags","onRemoveFilter","tagName","controls","setValue","onToggleFilterView","MomentDatePipe","_super","String","__","constructor","__extends","transform","timezone","timezoneOffset","DatePipe","Pipe","BookmarksApiService","ANNOTATIONS_API","getBookmarks","updateBookmark","put","updateMultipleBookmarks","deleteBookmark","deleteMultipleBookmarks","request","FilterPipe","fieldName","UnsnakePipe","GovUkDateComponent","GovUkErrorMessageComponent","HtmlTemplatesHelper","setDescribedBy","config","isInvalid","hint","GovUkFieldsetComponent","GovUkLabelComponent","SharedModule","ReactiveFormsModule","getBookmarkState","getBookmarkPages","getBookmarkEntities","getBookmarkNodes","nodes","bookmarkEntity","parent","parentEntity","generateBookmarkNodes","getEditableBookmark","getBookmarkInfo","fromDocument.getPdfPosition","bookmarkNodes","xCoordinate","yCoordinate","getBookmarksPerPage","thisPage","MetadataLayerComponent","annoPages$","fromSelectors.getPageEntities","showContextToolbar","clearContextToolbar","fromBookmarks.getBookmarkInfo","bookmarkInfo","substr","AnnotationsModule","A11yModule","HttpClientModule","MutableDivModule","TagInputModule","NgxDatatableModule","entryComponents","GrabNDragDirective","pointerDown","dragEnabled","onPointerDown","originalPosition","scrollLeft","scrollTop","onPointerMove","scrollDiff","dragX","onWindowPointerUp","BookmarksComponent","pageLookup","BOOKMARK_CHAR_LIMIT","allowDrag","allowDrop","_customSort","_positionSort","sortMode","customSort","bookmarksSelectors.getEditableBookmark","editableId","sortBookmarks","editBookmark","onAddBookmarkClick","bookmarksSelectors.getBookmarkInfo","onBookmarkMove","node","to","fromNext","getSibling","toNext","customSortBookmarks","tree","treeModel","getNodeById","virtualRoot","siblings","deleted","editedBookmark","goToBookmark","defaultScaleY","scaledY","mode","positionSort","positionSortBookmarks","setDragNDrop","TreeComponent","SideBarComponent","selectedView","bookmarkNodes$","bookmarksSelectors.getBookmarkNodes","toggleSidebarView","isViewedItem","findEndPage","MAX_SAFE_INTEGER","OutlineItemComponent","showOutlineItems","toggleOutline","endPage","showHighlightOutlineCss","isCurrentSection","RedactionComponent","redactionsPerPage$","fromSelectors.getRedactionsPerPage","selectedRedaction$","fromSelectors.getSelected","fromSelectors.getRedactedDocumentInfo","redactedDocInfo","downloadDocument","markTextRedaction","fromRedaSelectors.getRedactionArray","fromRedaActions.Redact","fromRedaActions.UnmarkAll","redactionHighlight","markBoxRedaction","fromRedactionActions.SaveRedaction","onMarkerDelete","fromActions.DeleteRedaction","selectRedaction","fromActions.SelectRedaction","onMarkerUpdate","fromActions.SaveRedaction","blob","msSaveBlob","URL","createObjectURL","revokeObjectURL","fromRedactionActions.ResetRedactedDocument","IcpSessionApiService","ICP_SESSION_API","loadSession","AnnotationEffects","actions$","annotationApiService","loadAnnotation$","ofType","annotationsActions.LOAD_ANNOTATION_SET","switchMap","res","annotationsActions.LoadAnnotationSetSucess","annotationsActions.LoadAnnotationSetFail","postAnnotation$","annotationsActions.SAVE_ANNOTATION","exhaustMap","annotationsActions.SaveAnnotationSuccess","deleteAnnotation$","annotationsActions.DELETE_ANNOTATION","annotationsActions.DeleteAnnotationSuccess","annotationsActions.DeleteAnnotationFail","Actions","Effect","BookmarksEffects","bookmarksApiService","loadBookmarks$","bookmarksActions.LOAD_BOOKMARKS","withLatestFrom","bookmarksActions.LoadBookmarksSuccess","err","bookmarksActions.LoadBookmarksFailure","createBookmark$","bookmarksActions.CREATE_BOOKMARK","bmrk","bookmarksActions.CreateBookmarkSuccess","bookmarksActions.CreateBookmarkFailure","moveBookmark$","bookmarksActions.MOVE_BOOKMARK","bmrks","bookmarksActions.MoveBookmarkSuccess","bookmarksActions.MoveBookmarkFailure","deleteBookmark$","bookmarksActions.DELETE_BOOKMARK","bookmarksActions.DeleteBookmarkSuccess","bookmarksActions.UpdateBookmarkSuccess","bookmarksActions.DeleteBookmarkFailure","updateBookmark$","bookmarksActions.UPDATE_BOOKMARK","bookmarksActions.UpdateBookmarkFailure","RedactionApiService","markupsApiUrl","redactApiUrl","markupsSearchApiUrl","getRedactions","saveBulkRedaction","deleteRedaction","deleteAllMarkers","responseType","RedactionEffects","redactionApiService","loadRedactions$","redactionActions.LOAD_REDACTIONS","resp","redactionActions.LoadRedactionSuccess","redactionActions.LoadRedactionFailure","saveRedaction$","redactionActions.SAVE_REDACTION","redactionActions.SaveRedactionSuccess","redactionActions.SaveRedactionFailure","saveBulkRedaction$","redactionActions.SAVE_BULK_REDACTION","redactionActions.SaveBulkRedactionSuccess","redactionActions.SaveBulkRedactionFailure","deleteRedaction$","redactionActions.DELETE_REDACTION","redactionPayload","redactionActions.DeleteRedactionSuccess","redactionActions.DeleteRedactionFailure","redact$","redactionActions.REDACT","header","headers","redactionActions.RedactSuccess","redactionActions.RedactFailure","unmarkAll$","redactionActions.UNMARK_ALL","redactionActions.UnmarkAllSuccess","DocumentConversionApiService","documentConversionUrl","convert","RotationApiService","rotationApiUrl","DocumentEffects","documentConversionService","rotationApiService","convert$","documentActions.CONVERT","documentActions.ConvertSuccess","documentActions.ConvertFailure","loadRotation$","documentActions.LOAD_ROTATION","documentActions.LoadRotationSuccess","documentActions.LoadRotationFailure","saveRotation$","documentActions.SAVE_ROTATION","documentActions.SaveRotationSuccess","documentActions.SaveRotationFailure","IcpEffects","icpApiService","icpUpdateService","loadIcpSession$","icpActions.LOAD_ICP_SESSION","icpActions.JoinIcpSocketSession","icpActions.LoadIcpSessionFailure","joinIcpSocketSession$","icpActions.JOIN_ICP_SOCKET_SESSION","icpActions.IcpSocketSessionJoined","effects","ConvertibleContentViewerComponent","fromDocumentActions.Convert","originalUrl","fromSelectors.getConvertedDocument","docInfo","convertedUrl","fromDocumentActions.ClearConvertDocUrl","ConfirmActionDialogComponent","onCancel","onConfirm","confirmExit","BookmarkIconsComponent","bookmarksPerPage$","fromSelectors.getBookmarksPerPage","RotationPersistDirective","savedRotation","onRotate","fromDocuments.getRotation","fromDocuments.getDocumentId","fromDocumentActions.LoadRotation","fromDocuments.rotationLoaded","fromDocumentActions.SaveRotation","ParticipantsListComponent","participants$","fromSelectors.getParticipants","presenter$","fromSelectors.getPresenter","isPresenter$","fromSelectors.isPresenter","HighlightCreateDirective","onMouseUp","mouseEvent","pageElement","offsetParent","getAttribute","onPdfViewerClick","localElement","removeEnhancedTextModeStyling","child","padding","trim","MultimediaPlayerComponent","playbackMsg","reloadVideo","videoPlayer","load","onSuccess","onError","MediaViewerModule","StoreModule","forFeature","EffectsModule","TreeModule"],"sources":["../../../node_modules/tslib/tslib.es6.js","../../../projects/media-viewer/src/lib/viewers/pdf-viewer/pdf-js/pdf-js-wrapper.ts","../../../projects/media-viewer/src/lib/toolbar/icp-event.service.ts","../../../projects/media-viewer/src/lib/toolbar/toolbar-event.service.ts","../../../projects/media-viewer/src/lib/viewers/pdf-viewer/pdf-js/pdf-js-wrapper.provider.ts","../../../projects/media-viewer/src/lib/print.service.ts","../../../projects/media-viewer/src/lib/viewers/viewer-exception.model.ts","../../../projects/media-viewer/src/lib/toolbar/toolbar-button-visibility.service.ts","../../../projects/media-viewer/src/lib/store/actions/document.actions.ts","../../../projects/media-viewer/src/lib/store/actions/tag.actions.ts","../../../projects/media-viewer/src/lib/store/actions/icp.actions.ts","../../../projects/media-viewer/src/lib/store/reducers/document.reducer.ts","../../../projects/media-viewer/src/lib/store/actions/annotation.actions.ts","../../../projects/media-viewer/src/lib/store/store-utils.ts","../../../projects/media-viewer/src/lib/store/reducers/annotations.reducer.ts","../../../projects/media-viewer/src/lib/store/reducers/tags.reducer.ts","../../../projects/media-viewer/src/lib/store/actions/bookmark.actions.ts","../../../projects/media-viewer/src/lib/store/bookmarks-store-utils.ts","../../../projects/media-viewer/src/lib/store/reducers/bookmarks.reducer.ts","../../../projects/media-viewer/src/lib/store/actions/redaction.actions.ts","../../../projects/media-viewer/src/lib/store/reducers/redaction.reducer.ts","../../../projects/media-viewer/src/lib/store/reducers/icp.reducer.ts","../../../projects/media-viewer/src/lib/icp/icp.events.ts","../../../projects/media-viewer/src/lib/store/reducers/reducers.ts","../../../projects/media-viewer/src/lib/store/selectors/document.selectors.ts","../../../projects/media-viewer/src/lib/viewers/viewer-event.service.ts","../../../projects/media-viewer/src/lib/icp/socket.service.ts","../../../projects/media-viewer/src/lib/icp/icp-update.service.ts","../../../projects/media-viewer/src/lib/store/selectors/icp.selectors.ts","../../../projects/media-viewer/src/lib/icp/icp-presenter.service.ts","../../../projects/media-viewer/src/lib/icp/icp-follower.service.ts","../../../projects/media-viewer/src/lib/icp/icp.service.ts","../../../projects/media-viewer/src/lib/viewers/pdf-viewer/pdf-viewer.component.ts","../../../projects/media-viewer/src/lib/viewers/viewer-util.service.ts","../../../projects/media-viewer/src/lib/viewers/image-viewer/image-viewer.component.ts","../../../projects/media-viewer/src/lib/viewers/unsupported-viewer/unsupported-viewer.component.ts","../../../projects/media-viewer/src/lib/annotations/services/annotation-api/annotation-api.service.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment/comment.service.ts","../../../projects/media-viewer/src/lib/store/selectors/tag.selectors.ts","../../../projects/media-viewer/src/lib/media-viewer.component.ts","../../../projects/media-viewer/src/lib/store/selectors/annotation.selectors.ts","../../../projects/media-viewer/src/lib/annotations/annotation-set/annotation-create/highlight-create/highlight-create.service.ts","../../../projects/media-viewer/src/lib/toolbar/redaction-search-bar/redaction-search-bar.component.ts","../../../projects/media-viewer/src/lib/shared/util/services/number.helper.service.ts","../../../projects/media-viewer/src/lib/toolbar/main-toolbar/main-toolbar.component.ts","../../../projects/media-viewer/src/lib/toolbar/search-bar/search-bar.component.ts","../../../projects/media-viewer/src/lib/store/selectors/redaction.selectors.ts","../../../projects/media-viewer/src/lib/toolbar/redaction-toolbar/redaction-toolbar.component.ts","../../../projects/media-viewer/src/lib/toolbar/icp-toolbar/icp-toolbar.component.ts","../../../projects/media-viewer/src/lib/toolbar/toolbar.module.ts","../../../projects/media-viewer/src/lib/annotations/annotation-set/annotation-view/annotation-view.component.ts","../../../projects/media-viewer/src/lib/annotations/annotation-set/annotation-set.component.ts","../../../projects/media-viewer/src/lib/annotations/annotation-set/annotation-view/rectangle/rectangle.component.ts","../../../projects/media-viewer/src/lib/annotations/services/tags/tags.services.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment/comment.component.ts","../../../projects/media-viewer/src/lib/annotations/annotation-set/ctx-toolbar/ctx-toolbar.component.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment-set-render.service.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment-set.component.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment/textarea-auto-expand/textarea-auto-expand.directive.ts","../../../projects/media-viewer/src/lib/annotations/comments-summary/comments-summary.component.ts","../../../projects/media-viewer/src/lib/annotations/annotation-set/annotation-create/box-highlight-create/box-highlight-create.component.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment-set-header/comment-set-header.component.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment-set-header/comment-search/comment-search.component.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment/text-highlight/text-highlight.directive.ts","../../../projects/media-viewer/src/lib/annotations/tags/tags.component.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment-navigate/comments-navigate.component.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment-set-header/comment-filter/comment-filter.component.ts","../../../projects/media-viewer/src/lib/annotations/pipes/date/date.pipe.ts","../../../projects/media-viewer/src/lib/annotations/services/bookmarks-api/bookmarks-api.service.ts","../../../projects/media-viewer/src/lib/annotations/pipes/filter/filter.pipe.ts","../../../projects/media-viewer/src/lib/annotations/pipes/unsnake/unsnake.pipe.ts","../../../projects/media-viewer/src/lib/shared/gov-uk-date/gov-uk-date.component.ts","../../../projects/media-viewer/src/lib/shared/gov-uk-error-message/gov-uk-error-message.component.ts","../../../projects/media-viewer/src/lib/shared/util/helpers/html-templates.helper.ts","../../../projects/media-viewer/src/lib/shared/gov-uk-fieldset/gov-uk-fieldset.component.ts","../../../projects/media-viewer/src/lib/shared/gov-uk-label/gov-uk-label.component.ts","../../../projects/media-viewer/src/lib/shared/shared.module.ts","../../../projects/media-viewer/src/lib/store/selectors/bookmark.selectors.ts","../../../projects/media-viewer/src/lib/annotations/annotation-set/metadata-layer/metadata-layer.component.ts","../../../projects/media-viewer/src/lib/annotations/annotations.module.ts","../../../projects/media-viewer/src/lib/viewers/grab-n-drag.directive.ts","../../../projects/media-viewer/src/lib/viewers/pdf-viewer/side-bar/bookmarks/bookmarks.component.ts","../../../projects/media-viewer/src/lib/viewers/pdf-viewer/side-bar/side-bar.component.ts","../../../projects/media-viewer/src/lib/viewers/pdf-viewer/side-bar/outline-item/outline-item.component.ts","../../../projects/media-viewer/src/lib/redaction/components/redaction.component.ts","../../../projects/media-viewer/src/lib/icp/icp-session-api.service.ts","../../../projects/media-viewer/src/lib/store/effects/annotation.effects.ts","../../../projects/media-viewer/src/lib/store/effects/bookmarks.effects.ts","../../../projects/media-viewer/src/lib/redaction/services/redaction-api.service.ts","../../../projects/media-viewer/src/lib/store/effects/redaction.effects.ts","../../../projects/media-viewer/src/lib/viewers/convertible-content-viewer/document-conversion-api.service.ts","../../../projects/media-viewer/src/lib/viewers/rotation-persist/rotation-api.service.ts","../../../projects/media-viewer/src/lib/store/effects/document.effects.ts","../../../projects/media-viewer/src/lib/store/effects/icp.effects.ts","../../../projects/media-viewer/src/lib/store/effects/index.ts","../../../projects/media-viewer/src/lib/viewers/convertible-content-viewer/convertible-content-viewer.component.ts","../../../projects/media-viewer/src/lib/icp/confirm-exit/confirm-action-dialog.component.ts","../../../projects/media-viewer/src/lib/bookmark/components/bookmark-icons.component.ts","../../../projects/media-viewer/src/lib/viewers/rotation-persist/rotation-persist.directive.ts","../../../projects/media-viewer/src/lib/icp/participants-list/participants-list.component.ts","../../../projects/media-viewer/src/lib/annotations/annotation-set/annotation-create/highlight-create/highlight-create.directive.ts","../../../projects/media-viewer/src/lib/viewers/multimedia-player/multimedia-player.component.ts","../../../projects/media-viewer/src/lib/media-viewer.module.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import { RedactionSearch } from './../../../toolbar/redaction-search-bar/redaction-search.model';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport { DownloadManager, PDFViewer } from 'pdfjs-dist/web/pdf_viewer';\nimport 'pdfjs-dist/build/pdf.worker';\nimport { Subject } from 'rxjs';\nimport { SearchOperation, ToolbarEventService } from '../../../toolbar/toolbar-event.service';\nimport { Outline } from '../side-bar/outline-item/outline.model';\nimport { PdfPosition } from '../../../store/reducers/document.reducer';\n\npdfjsLib.GlobalWorkerOptions.workerSrc = '/assets/build/pdf.worker.min.js';\n\n/**\n * Values of the state field returned by the find events\n */\nenum FindState {\n FOUND = 0,\n NOT_FOUND = 1,\n WRAPPED = 2,\n PENDING = 3,\n}\n\nexport class PdfJsWrapper {\n\n private zoomValue: number;\n private documentTitle: string;\n private documentOutline: Outline;\n\n constructor(\n private readonly pdfViewer: PDFViewer,\n private readonly downloadManager: DownloadManager,\n private readonly toolbarEvents: ToolbarEventService,\n public readonly documentLoadInit: Subject<string>,\n public readonly documentLoadProgress: Subject<DocumentLoadProgress>,\n public readonly documentLoaded: Subject<any>,\n public readonly outlineLoaded: Subject<Outline>,\n public readonly documentLoadFailed: Subject<Error>,\n public readonly pageRendered: Subject<PageEvent[]>,\n public readonly positionUpdated: Subject<{ location: PdfPosition }>\n ) {\n this.pdfViewer.eventBus.on('updateviewarea', e => positionUpdated.next(e));\n this.pdfViewer.eventBus.on('pagechanging', e => this.toolbarEvents.setCurrentPageInputValueSubject.next(e.pageNumber));\n this.pdfViewer.eventBus.on('pagesinit', () => this.pdfViewer.currentScaleValue = '1');\n\n this.pdfViewer.eventBus.on('pagerendered', e => { }); // not used left for future convenience\n this.pdfViewer.eventBus.on('pagesloaded', (e) => this.emitDocumentInfo(e));\n this.pdfViewer.eventBus.on('scalechanging', (e) => this.emitDocumentInfo(e));\n this.pdfViewer.eventBus.on('rotationchanging', (e) => this.emitDocumentInfo(e));\n\n this.pdfViewer.eventBus.on('updatefindcontrolstate', event => {\n this.sendSearchDetails(event);\n });\n this.pdfViewer.eventBus.on('updatefindmatchescount', event => {\n this.toolbarEvents.searchResultsCountSubject.next(event.matchesCount);\n });\n this.zoomValue = 1;\n }\n\n sendSearchDetails(event: any) {\n if (event.state !== FindState.PENDING) {\n this.toolbarEvents.searchResultsCountSubject.next(event.matchesCount);\n if (event?.source?.selected?.pageIdx !== -1 && event.matchesCount.total > 0) {\n this.toolbarEvents.redactionSerachSubject.next({\n page: event?.source?.selected?.pageIdx,\n matchedIndex: event?.source?.selected?.matchIdx,\n matchesCount: event.matchesCount.total\n } as RedactionSearch\n );\n }\n }\n }\n\n private emitDocumentInfo(e) {\n const allPages: PageEvent[] = [...this.pdfViewer._pages].map(page => {\n return {\n div: page.div,\n scale: page.scale,\n rotation: page.rotation,\n id: page.id,\n viewportScale: page.viewport.scale\n };\n });\n this.pageRendered.next(allPages);\n }\n\n public async loadDocument(documentUrl: string) {\n const loadingTask = this.createLoadingTask(documentUrl);\n\n loadingTask.onProgress = ({ loaded, total }) => {\n this.documentLoadProgress.next({ loaded, total });\n };\n\n this.documentLoadInit.next(documentUrl);\n\n try {\n const pdfDocument = await loadingTask.promise;\n this.documentLoaded.next(pdfDocument);\n this.toolbarEvents.pageCountSubject.next(pdfDocument.numPages);\n\n this.pdfViewer.setDocument(pdfDocument);\n this.pdfViewer.linkService.setDocument(pdfDocument, null);\n\n const outline = await pdfDocument.getOutline();\n\n if (outline) {\n await this.setOutlinePageNumbers(pdfDocument, outline);\n }\n\n this.documentOutline = outline;\n this.outlineLoaded.next(this.documentOutline);\n const pdfMetaData = await pdfDocument.getMetadata();\n this.setCurrentPDFTitle(pdfMetaData.info.Title);\n } catch (e) {\n this.documentLoadFailed.next(e);\n }\n }\n\n private createLoadingTask(documentUrl: string) {\n return pdfjsLib.getDocument({\n url: documentUrl,\n cMapUrl: 'assets/minified/cmaps',\n cMapPacked: true,\n withCredentials: true\n });\n }\n\n private async setOutlinePageNumbers(pdfDocument, outlineArray: Outline[]) {\n outlineArray.forEach(async (outline: Outline) => {\n await this.setNestedOutlinePageNumbers(pdfDocument, outline);\n });\n }\n\n private async setNestedOutlinePageNumbers(pdfDocument, outline: Outline) {\n outline.pageNumber = await this.getOutlinePageNumber(pdfDocument, outline);\n outline.items.forEach(async (outlineItem: Outline) => {\n outlineItem.pageNumber = await this.getOutlinePageNumber(pdfDocument, outlineItem);\n this.setNestedOutlinePageNumbers(pdfDocument, outlineItem);\n });\n }\n\n private async getOutlinePageNumber(pdfDocument, outline: Outline): Promise<number> {\n const dest = outline.dest;\n const pageIndex = await pdfDocument.getPageIndex(dest[0]);\n return Number(pageIndex) + 1;\n }\n\n public downloadFile(url: string, filename: string): void {\n this.downloadManager.downloadUrl(url, filename);\n }\n\n public setPageNumber(pageNumber: number): void {\n this.pdfViewer.currentPageNumber = pageNumber;\n }\n public getPageNumber(): number {\n return this.pdfViewer.currentPageNumber;\n }\n public changePageNumber(numPages: number): void {\n this.pdfViewer.currentPageNumber += numPages;\n }\n\n public search(operation: SearchOperation): void {\n const command = operation.reset ? 'find' : 'findagain';\n\n this.pdfViewer.findController.executeCommand(command, {\n query: operation.searchTerm,\n phraseSearch: true,\n caseSensitive: operation.matchCase,\n entireWord: operation.wholeWord,\n highlightAll: operation.highlightAll,\n findPrevious: operation.previous,\n });\n }\n\n public clearSearch(): void {\n this.pdfViewer.eventBus.dispatch('findbarclose');\n }\n\n public navigateTo(destination: object | number) {\n if (destination instanceof Object) {\n if (!destination[1].name.includes('XYZ')) {\n destination[1] = { name: 'XYZ' };\n destination[2] = destination[2] || null;\n destination[3] = destination[3] || null;\n }\n destination[4] = this.zoomValue;\n }\n this.pdfViewer.linkService.navigateTo(destination);\n }\n\n public setZoom(zoomValue: number): void {\n this.pdfViewer.currentScaleValue = this.getZoomValue(zoomValue);\n this.zoomValue = this.pdfViewer.currentScaleValue;\n this.toolbarEvents.zoomValueSubject.next(this.pdfViewer.currentScaleValue);\n }\n\n public stepZoom(zoomValue: number): void {\n this.pdfViewer.currentScaleValue = +this.getZoomValue((+this.pdfViewer.currentScaleValue) + zoomValue);\n this.zoomValue = this.pdfViewer.currentScaleValue;\n this.toolbarEvents.zoomValueSubject.next(this.pdfViewer.currentScaleValue);\n }\n\n private getZoomValue(zoomValue: number): number {\n if (isNaN(zoomValue)) { return this.zoomValue; }\n if (zoomValue > 5) { return 5; }\n if (zoomValue < 0.1) { return 0.1; }\n\n return +zoomValue.toFixed(2);\n }\n\n public rotate(rotation: number): number {\n return this.pdfViewer.pagesRotation = (this.pdfViewer.pagesRotation + rotation) % 360;\n }\n\n public resetRotation(rotation: number): number {\n return this.pdfViewer.pagesRotation = rotation;\n }\n\n public getNormalisedPagesRotation(): number {\n return this.pdfViewer.pagesRotation;\n }\n\n public getCurrentPDFZoomValue(): number {\n return this.pdfViewer.currentScaleValue;\n }\n\n public setCurrentPDFTitle(title: string) {\n this.documentTitle = title;\n }\n\n public getCurrentPDFTitle(): string {\n return this.documentTitle;\n }\n}\n\nexport interface DocumentLoadProgress {\n loaded: number;\n total: number;\n}\n\nexport interface PageEvent {\n div: object;\n scale: number;\n rotation: number;\n id: string;\n viewportScale: number;\n}\n","import { BehaviorSubject, Subject } from 'rxjs';\n\n export const enabled = new BehaviorSubject(false);\n export const sessionLaunch = new Subject();\n export const becomingPresenter = new Subject();\n export const stoppingPresenting = new Subject();\n export const leavingSession = new BehaviorSubject(false);\n export const sessionExitConfirmed = new Subject();\n export const participantsListVisible = new BehaviorSubject(false);\n\nexport const launchSession = () => {\n sessionLaunch.next();\n};\n\nexport const enable = () => {\n enabled.next(true);\n launchSession();\n};\n\nexport const becomePresenter = () => {\n becomingPresenter.next();\n};\n\nexport const stopPresenting = () => {\n stoppingPresenting.next();\n};\n\nexport const leaveSession = () => {\n leavingSession.next(true);\n};\n\nexport const confirmExit = () => {\n sessionExitConfirmed.next();\n participantsListVisible.next(false);\n enabled.next(false);\n};\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport * as icpEvents from './icp-event.service';\nimport { participantsListVisible } from './icp-event.service';\nimport { RedactionSearch } from './redaction-search-bar/redaction-search.model';\n\n// Toolbar Custom-Event Types\nexport type HighlightMode = boolean;\nexport type DrawMode = boolean;\nexport interface SearchOperation {\n searchTerm: string;\n highlightAll: boolean;\n matchCase: boolean;\n wholeWord: boolean;\n previous: boolean;\n reset: boolean;\n}\nexport interface SearchResultsCount {\n current: number;\n total: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ToolbarEventService {\n\n public readonly highlightModeSubject = new BehaviorSubject<HighlightMode>(false);\n public readonly drawModeSubject = new BehaviorSubject<DrawMode>(false);\n public readonly rotateSubject = new Subject<number>();\n public readonly searchSubject = new Subject<SearchOperation>();\n public readonly searchResultsCountSubject = new Subject<SearchResultsCount>();\n public readonly zoomSubject = new Subject<number>();\n public readonly stepZoomSubject = new Subject<number>();\n public readonly zoomValueSubject = new BehaviorSubject<number>(1);\n public readonly pageCountSubject = new Subject<number>();\n public readonly printSubject = new Subject();\n public readonly downloadSubject = new Subject();\n public readonly setCurrentPageSubject = new Subject<number>();\n public readonly setCurrentPageInputValueSubject = new Subject<number>();\n public readonly changePageByDeltaSubject = new Subject<number>();\n public readonly showCommentSummary = new BehaviorSubject<boolean>(false);\n public readonly grabNDrag = new BehaviorSubject<boolean>(false);\n public readonly saveRotationSubject = new Subject();\n\n public readonly redactionMode = new BehaviorSubject(false);\n public readonly redactionPreview = new Subject<boolean>();\n public readonly applyRedactToDocument = new Subject();\n public readonly clearAllRedactMarkers = new Subject();\n public readonly redactWholePage = new Subject();\n public readonly redactionSerachSubject = new Subject<RedactionSearch>();\n public readonly redactAllInProgressSubject = new BehaviorSubject(false);\n public readonly openRedactionSearch = new Subject<boolean>();\n\n public readonly sidebarOpen = new BehaviorSubject(false);\n public readonly sidebarOutlineView = new BehaviorSubject(true);\n\n public readonly searchBarHidden = new BehaviorSubject(true);\n public readonly commentsPanelVisible = new BehaviorSubject(false);\n\n public readonly icp = icpEvents;\n\n\n /**\n * Reset the stateful behaviour subjects\n */\n public reset(): void {\n this.setCurrentPageSubject.next(1);\n this.zoomValueSubject.next(1);\n this.highlightModeSubject.next(false);\n this.drawModeSubject.next(false);\n this.showCommentSummary.next(false);\n this.grabNDrag.next(false);\n }\n\n // Function to inform Observers that highlightMode has been enabled\n public toggleHighlightMode(): void {\n // Highlight and Draw states are mutually exclusive\n if (this.highlightModeSubject.getValue() === false) {\n this.drawModeSubject.next(false);\n this.grabNDrag.next(false);\n this.highlightModeSubject.next(true);\n } else {\n this.highlightModeSubject.next(false);\n }\n }\n\n // Function to inform Observers that ToggleMode has been enabled\n public toggleDrawMode(): void {\n if (this.drawModeSubject.getValue() === false) {\n this.highlightModeSubject.next(false);\n this.grabNDrag.next(false);\n this.drawModeSubject.next(true);\n } else {\n this.drawModeSubject.next(false);\n }\n }\n\n public rotate(angle: number): void {\n this.rotateSubject.next(angle);\n }\n\n public search(phrase: SearchOperation): void {\n this.searchSubject.next(phrase);\n }\n\n public getSearchResultsCount(): Observable<SearchResultsCount> {\n return this.searchResultsCountSubject.asObservable();\n }\n\n public zoom(value: number): void {\n this.zoomSubject.next(value);\n }\n\n public stepZoom(value: number): void {\n this.stepZoomSubject.next(value);\n }\n\n public getZoomValue(): Observable<number> {\n return this.zoomValueSubject.asObservable();\n }\n\n public getPageCount(): Observable<number> {\n return this.pageCountSubject.asObservable();\n }\n\n public print(): void {\n this.printSubject.next();\n }\n\n public download(): void {\n this.downloadSubject.next();\n }\n\n public setPage(value: number): void {\n this.setCurrentPageSubject.next(value);\n }\n\n public incrementPage(value: number): void {\n this.changePageByDeltaSubject.next(value);\n }\n\n public getCurrentPageNumber(): Observable<number> {\n return this.setCurrentPageInputValueSubject.asObservable();\n }\n\n public getShowCommentSummary(): Observable<boolean> {\n return this.showCommentSummary.asObservable();\n }\n\n public toggleCommentsSummary(value: boolean): void {\n this.showCommentSummary.next(value);\n }\n\n public saveRotation(): void {\n this.saveRotationSubject.next();\n }\n\n public toggleGrabNDrag(): void {\n this.grabNDrag.next(!this.grabNDrag.getValue());\n }\n\n toggleSideBar(toggle: boolean) {\n this.sidebarOpen.next(toggle);\n }\n\n toggleSideBarView(toggle: boolean) {\n this.sidebarOutlineView.next(toggle);\n }\n\n public toggleRedactionMode(): void {\n if (this.redactionMode.getValue() === false) {\n this.drawModeSubject.next(false);\n this.grabNDrag.next(false);\n this.redactionMode.next(true);\n } else {\n this.redactionMode.next(false);\n }\n this.openRedactionSearch.next(false);\n }\n\n public toggleRedactionPreview(viewMode: boolean): void {\n this.redactionPreview.next(viewMode);\n }\n\n public unmarkAll(): void {\n this.clearAllRedactMarkers.next();\n }\n\n public applyRedactionToDocument(): void {\n this.applyRedactToDocument.next();\n }\n\n public redactPage(): void {\n this.redactWholePage.next();\n }\n\n public toggleCommentsPanel(isVisible: boolean) {\n if (isVisible) {\n this.toggleParticipantsList(!isVisible);\n }\n this.commentsPanelVisible.next(isVisible);\n }\n\n public toggleParticipantsList(isVisible: boolean) {\n if (isVisible) {\n this.toggleCommentsPanel(!isVisible);\n }\n this.icp.participantsListVisible.next(isVisible);\n }\n}\n","import * as pdfjsViewer from 'pdfjs-dist/web/pdf_viewer';\nimport { ElementRef, Injectable } from '@angular/core';\nimport {DocumentLoadProgress, PageEvent, PdfJsWrapper} from './pdf-js-wrapper';\nimport { Subject } from 'rxjs';\nimport { ToolbarEventService } from '../../../toolbar/toolbar-event.service';\nimport { Outline } from '../side-bar/outline-item/outline.model';\nimport { PdfPosition } from '../../../store/reducers/document.reducer';\n\n@Injectable({providedIn: 'root'})\nexport class PdfJsWrapperFactory {\n\n private linkService: pdfjsViewer.PDFLinkService;\n private eventBus: pdfjsViewer.EventBus;\n private pdfJsWrapper: PdfJsWrapper;\n\n constructor(private readonly toolbarEvents: ToolbarEventService) {\n this.linkService = new pdfjsViewer.PDFLinkService();\n this.eventBus = new pdfjsViewer.EventBus();\n }\n\n public create(container: ElementRef): PdfJsWrapper {\n const pdfFindController = new pdfjsViewer.PDFFindController({\n linkService: this.linkService,\n eventBus: this.eventBus\n });\n\n const pdfViewer = new pdfjsViewer.PDFViewer({\n container: container.nativeElement,\n linkService: this.linkService,\n findController: pdfFindController,\n eventBus: this.eventBus,\n imageResourcesPath: '/assets/images/',\n textLayerMode: 2\n });\n\n this.linkService.setViewer(pdfViewer);\n\n this.pdfJsWrapper = new PdfJsWrapper(\n pdfViewer,\n new pdfjsViewer.DownloadManager({}),\n this.toolbarEvents,\n new Subject<string>(),\n new Subject<DocumentLoadProgress>(),\n new Subject<any>(),\n new Subject<Outline>(),\n new Subject(),\n new Subject<PageEvent[]>(),\n new Subject<{ location: PdfPosition }>()\n );\n\n return this.pdfJsWrapper;\n }\n\n pdfWrapper() {\n return this.pdfJsWrapper;\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PrintService {\n\n printDocumentNatively(url: string): void {\n const printWindow = window.open(url);\n printWindow.print();\n }\n\n printElementNatively(element: HTMLElement, width: number, height: number): void {\n const printWindow = window.open('', '', `left=0,top=0,width=${width},height=${height},toolbar=0,scrollbars=0,status=0`);\n const documentHead = document.head;\n printWindow.document.body.appendChild(documentHead.cloneNode(true));\n printWindow.document.body.appendChild(element.cloneNode(true));\n printWindow.document.close();\n printWindow.focus();\n printWindow.print();\n printWindow.close();\n }\n}\n","export enum ResponseType {\n SUCCESS = 'SUCCESS',\n FAILURE = 'FAILURE',\n UNSUPPORTED = 'UNSUPPORTED'\n}\n\nexport interface ExceptionDetail {\n httpResponseCode?: string;\n message?: string;\n}\n\nexport class ViewerException {\n exceptionType?: string;\n detail?: ExceptionDetail;\n\n constructor(exceptionType?: string, detail?: ExceptionDetail) {\n this.exceptionType = exceptionType;\n this.detail = detail;\n }\n}\n","import { BehaviorSubject } from 'rxjs';\nimport { Injectable } from '@angular/core';\n\n@Injectable({providedIn: 'root'})\nexport class ToolbarButtonVisibilityService {\n\n public showPrint = false;\n public showDownload = false;\n public showNavigation = false;\n public showZoom = false;\n public showRotate = false;\n public showPresentationMode = false;\n public showRedact = false;\n public showOpenFile = false;\n public showBookmark = false;\n public showHighlightButton = false;\n public showDrawButton = false;\n public showSearchBar = false;\n public showSidebar = false;\n public showCommentSummary = false;\n public showGrabNDragButton = false;\n public showSaveRotationButton = false;\n\n /**\n * Reset the visibility of all buttons to false then set the value from the options\n */\n public setup(options: Partial<ToolbarButtonVisibilityService>): void {\n this.showPrint = false;\n this.showDownload = false;\n this.showNavigation = false;\n this.showZoom = false;\n this.showRotate = false;\n this.showPresentationMode = false;\n this.showRedact = false;\n this.showOpenFile = false;\n this.showBookmark = false;\n this.showHighlightButton = false;\n this.showDrawButton = false;\n this.showSearchBar = false;\n this.showSidebar = false;\n this.showCommentSummary = false;\n this.showGrabNDragButton = false;\n this.showSaveRotationButton = false;\n\n for (const key in options) {\n this[key] = options[key];\n }\n }\n}\n\n/**\n * Default toolbar state for the PDF viewer\n */\nexport const defaultPdfOptions = {\n showPrint: true,\n showDownload: true,\n showNavigation: true,\n showZoom: true,\n showRotate: true,\n showSearchBar: true,\n showSidebar: true,\n showGrabNDragButton: true,\n showCommentSummary: true,\n showPresentationMode: true,\n showRedact: true\n};\n\n/**\n * Default toolbar state for the image viewer\n */\nexport const defaultImageOptions = {\n showPrint: true,\n showDownload: true,\n showZoom: true,\n showRotate: true,\n showGrabNDragButton: true,\n showCommentSummary: true,\n showRedact: true\n};\n\n/**\n * Default toolbar state for multimedia\n */\nexport const defaultMultimediaOptions = {\n showDownload: true\n};\n\n/**\n * Default toolbar state for unsupported media\n */\nexport const defaultUnsupportedOptions = {\n showDownload: true,\n showPrint: true\n};\n","import { Action } from '@ngrx/store';\nimport { PageEvent } from '../../viewers/pdf-viewer/pdf-js/pdf-js-wrapper';\nimport { Rotation } from '../../viewers/rotation-persist/rotation.model';\nimport { PdfPosition } from '../reducers/document.reducer';\n\nexport const SET_DOCUMENT_ID = '[Document] Set Document Id';\nexport const POSITION_UPDATED = '[Document] Position Updated';\nexport const ADD_PAGES = '[Document] Add Pages';\nexport const CONVERT = '[Document] Convert';\nexport const CONVERT_SUCCESS = '[Document] Convert Success';\nexport const CONVERT_FAIL = '[Document] Convert Fail';\nexport const CLEAR_CONVERT_DOC_URL = '[Document] Clear Convert Doc Url';\n\nexport const LOAD_ROTATION = '[Document] Load Rotation';\nexport const LOAD_ROTATION_SUCCESS = '[Document] Load Rotation Success';\nexport const LOAD_ROTATION_FAIL = '[Document] Load Rotation Fail';\nexport const SAVE_ROTATION = '[Document] Save Rotation';\nexport const SAVE_ROTATION_SUCCESS = '[Document] Save Rotation Success';\nexport const SAVE_ROTATION_FAIL = '[Document] Save Rotation Fail';\n\nexport class SetDocumentId implements Action {\n readonly type = SET_DOCUMENT_ID;\n constructor(public payload: string) { }\n}\n\nexport class AddPages implements Action {\n readonly type = ADD_PAGES;\n constructor(public payload: PageEvent[]) { }\n}\n\nexport class PdfPositionUpdate implements Action {\n readonly type = POSITION_UPDATED;\n constructor(public payload: PdfPosition) {}\n}\n\nexport class Convert implements Action {\n readonly type = CONVERT;\n constructor(public payload: string ) {}\n}\n\nexport class ConvertSuccess implements Action {\n readonly type = CONVERT_SUCCESS;\n constructor(public payload: string ) {}\n}\n\nexport class ConvertFailure implements Action {\n readonly type = CONVERT_FAIL;\n constructor(public payload: string) {}\n}\n\nexport class ClearConvertDocUrl implements Action {\n readonly type = CLEAR_CONVERT_DOC_URL;\n}\n\nexport class LoadRotation implements Action {\n readonly type = LOAD_ROTATION;\n constructor(public payload: string) {\n }\n}\n\nexport class LoadRotationSuccess implements Action {\n readonly type = LOAD_ROTATION_SUCCESS;\n constructor(public payload: { rotationAngle: number }) {\n }\n}\n\nexport class LoadRotationFailure implements Action {\n readonly type = LOAD_ROTATION_FAIL;\n constructor(public payload: Error) {\n }\n}\n\nexport class SaveRotation implements Action {\n readonly type = SAVE_ROTATION;\n constructor(public payload: Rotation) {\n }\n}\n\nexport class SaveRotationSuccess implements Action {\n readonly type = SAVE_ROTATION_SUCCESS;\n constructor(public payload: { rotationAngle: number }) {\n }\n}\n\nexport class SaveRotationFailure implements Action {\n readonly type = SAVE_ROTATION_FAIL;\n constructor(public payload: Error) {\n }\n}\n\nexport type DocumentActions =\n | AddPages | SetDocumentId | Convert\n | ConvertSuccess | ConvertFailure | ClearConvertDocUrl\n | PdfPositionUpdate | LoadRotation | LoadRotationSuccess\n | LoadRotationFailure | SaveRotation | SaveRotationSuccess\n | SaveRotationFailure;\n","import { Action } from '@ngrx/store';\nimport {TagsModel} from '../../annotations/models/tags.model';\nexport const UPDATE_TAGS = '[Tags] Update Tags';\nexport const ADD_FILTER_TAGS = '[Tags] Add Filter Tags';\nexport const CLEAR_FILTER_TAGS = '[Tags] Clear Filter Tags';\n\nexport class UpdateTags implements Action {\n readonly type = UPDATE_TAGS;\n constructor(public payload: {tags: TagsModel[]; annoId: string}) {}\n}\n\nexport class AddFilterTags implements Action {\n readonly type = ADD_FILTER_TAGS;\n constructor(public payload: {[id: string]: boolean}) {}\n}\n\nexport class ClearFilterTags implements Action {\n readonly type = CLEAR_FILTER_TAGS;\n}\n\n\nexport type TagsActions =\n | UpdateTags\n | AddFilterTags\n | ClearFilterTags;\n","import { Action } from '@ngrx/store';\nimport { IcpParticipant, IcpSession } from '../../icp/icp.interfaces';\n\nexport const SET_CASE_ID = '[Icp] Set Case Id';\nexport const LOAD_ICP_SESSION = '[Icp] Load Session';\nexport const LOAD_ICP_SESSION_FAIL = '[Icp] Load Session Failure';\nexport const JOIN_ICP_SOCKET_SESSION = '[Icp] Join Socket Session';\nexport const ICP_SOCKET_SESSION_JOINED = '[Icp] Socket Session Joined';\nexport const LEAVE_ICP_SOCKET_SESSION = '[Icp] Leave Socket Session';\nexport const ICP_PRESENTER_UPDATED = '[Icp] Presenter Updated';\nexport const ICP_PARTICIPANT_LIST_UPDATED = '[Icp] Participant List Updated';\n\nexport class SetCaseId implements Action {\n readonly type = SET_CASE_ID;\n constructor(public payload: string) {}\n}\n\nexport class LoadIcpSession implements Action {\n readonly type = LOAD_ICP_SESSION;\n constructor(public payload: string) {}\n}\n\nexport class LoadIcpSessionFailure implements Action {\n readonly type = LOAD_ICP_SESSION_FAIL;\n constructor(public payload: Error) {}\n}\n\nexport class JoinIcpSocketSession implements Action {\n readonly type = JOIN_ICP_SOCKET_SESSION;\n constructor(public payload: { username: string, session: IcpSession }) {}\n}\n\nexport class IcpSocketSessionJoined implements Action {\n readonly type = ICP_SOCKET_SESSION_JOINED;\n constructor(public payload: { session: IcpSession, participantInfo: { client: IcpParticipant, presenter: IcpParticipant } }) {}\n}\n\nexport class LeaveIcpSocketSession implements Action {\n readonly type = LEAVE_ICP_SOCKET_SESSION;\n constructor() {}\n}\n\nexport class IcpPresenterUpdated implements Action {\n readonly type = ICP_PRESENTER_UPDATED;\n constructor(public payload: IcpParticipant) {}\n}\n\nexport class IcpParticipantListUpdated implements Action {\n readonly type = ICP_PARTICIPANT_LIST_UPDATED;\n constructor(public payload: any) {}\n}\n\nexport type IcpActions =\n | SetCaseId\n | LoadIcpSession\n | LoadIcpSessionFailure\n | JoinIcpSocketSession\n | IcpSocketSessionJoined\n | LeaveIcpSocketSession\n | IcpPresenterUpdated\n | IcpParticipantListUpdated;\n","import * as fromActions from '../actions/document.actions';\n\nexport interface DocumentState {\n convertedDocument: {\n url: string;\n error: string;\n };\n documentId: string;\n pdfPosition: PdfPosition;\n pages: {[id: string]: DocumentPages};\n hasDifferentPageSize: boolean;\n rotation: number;\n rotationLoaded: boolean;\n loaded: boolean;\n loading: boolean;\n}\n\nexport interface DocumentPages {\n numberOfPages: number;\n styles: { left: number, height: number, width: number };\n scaleRotation: { scale: string; rotation: string };\n viewportScale: number;\n}\n\nexport interface PdfPosition {\n pageNumber: number;\n scale: number;\n top: number;\n left: number;\n rotation: number;\n}\n\nexport const initialDocumentState: DocumentState = {\n convertedDocument: undefined,\n documentId: undefined,\n pdfPosition: undefined,\n pages: {},\n hasDifferentPageSize: false,\n rotation: undefined,\n rotationLoaded: false,\n loading: false,\n loaded: false\n};\n\nexport function docReducer (state = initialDocumentState,\n action: fromActions.DocumentActions): DocumentState {\n\n switch (action.type) {\n\n case fromActions.CONVERT_SUCCESS: {\n const convertedDocument = {\n url: action.payload,\n error: undefined\n };\n return {\n ...state,\n convertedDocument\n };\n }\n\n case fromActions.CONVERT_FAIL: {\n const convertedDocument = {\n url: undefined,\n error: action.payload\n };\n return {\n ...state,\n convertedDocument\n };\n }\n\n case fromActions.CLEAR_CONVERT_DOC_URL: {\n const convertedDocument = undefined;\n return {\n ...state,\n convertedDocument\n };\n }\n\n case fromActions.LOAD_ROTATION: {\n return {\n ...state,\n rotationLoaded: false\n };\n }\n\n case fromActions.LOAD_ROTATION_SUCCESS: {\n const metadata = action.payload;\n const rotation = metadata ? metadata.rotationAngle : 0;\n return {\n ...state,\n rotation,\n rotationLoaded: true\n };\n }\n\n case fromActions.LOAD_ROTATION_FAIL: {\n return {\n ...state,\n rotation: 0,\n rotationLoaded: true\n };\n }\n\n case fromActions.SAVE_ROTATION_SUCCESS: {\n const metadata = action.payload;\n const rotation = metadata.rotationAngle;\n return {\n ...state,\n rotation\n };\n }\n\n case fromActions.SET_DOCUMENT_ID : {\n return {\n ...state,\n documentId: action.payload\n };\n }\n\n case fromActions.ADD_PAGES: {\n const payload = action.payload;\n let pages = {};\n let pageHeight;\n let pageWidth;\n let hasDifferentPageSize = state.hasDifferentPageSize;\n payload.forEach(page => {\n if (!hasDifferentPageSize && pageHeight && pageWidth &&\n (pageHeight !== page.div['scrollHeight'] || pageWidth !== page.div['scrollWidth'])) {\n hasDifferentPageSize = true;\n } else {\n pageHeight = page.div['scrollHeight'];\n pageWidth = page.div['scrollWidth'];\n }\n const styles = {\n left: page.div['offsetLeft'],\n height: page.div['scrollHeight'],\n width: page.div['scrollWidth']\n };\n\n const scaleRotation = {\n scale: page.scale,\n rotation: page.rotation\n };\n\n const p = {\n styles,\n scaleRotation,\n viewportScale: page.viewportScale\n };\n\n pages = {\n ...pages,\n [page.id]: p\n };\n\n });\n return {\n ...state,\n pages,\n hasDifferentPageSize\n };\n }\n\n case fromActions.POSITION_UPDATED: {\n const pdfPosition = action.payload;\n return {\n ...state,\n pdfPosition\n };\n }\n }\n return state;\n}\nexport const getDocPages = (state: DocumentState) => state.pages;\nexport const getDocId = (state: DocumentState) => state.documentId;\nexport const getPdfPos = (state: DocumentState) => state.pdfPosition;\nexport const getHasDifferentPageSizes = (state: DocumentState) => state.hasDifferentPageSize;\nexport const getRotation = (state: DocumentState) => state.rotation;\nexport const rotationLoaded = (state: DocumentState) => state.rotationLoaded;\nexport const getConvertedDocument = (state: DocumentState) => state.convertedDocument;\n","import { Action } from '@ngrx/store';\nimport { Annotation } from '../../annotations/annotation-set/annotation-view/annotation.model';\nimport { SelectionAnnotation } from '../../annotations/models/event-select.model';\nimport { AnnotationSet } from '../../annotations/annotation-set/annotation-set.model';\nimport { Filters } from '../models/filters.interface';\nimport { Comment } from '../../annotations/comment-set/comment/comment.model';\n\nexport const LOAD_ANNOTATION_SET = '[Annotations] Load Annotation Set';\nexport const LOAD_ANNOTATION_SET_SUCCESS = '[Annotations] Load Annotation Set Success';\nexport const LOAD_ANNOTATION_SET_FAIL = '[Annotations] Load Annotation Set Fail';\n\nexport const SAVE_ANNOTATION = '[Annotations] Save Annotation';\nexport const SAVE_ANNOTATION_SUCCESS = '[Annotations] Save Annotation Success';\nexport const SAVE_ANNOTATION_FAIL = '[Annotations] Save Annotation Fail';\nexport const ADD_OR_EDIT_COMMENT = '[Annotations] Add or Edit Comment';\n\nexport const DELETE_ANNOTATION = '[Annotations] Delete Annotation';\nexport const DELETE_ANNOTATION_SUCCESS = '[Annotations] Delete Annotation Success';\nexport const DELETE_ANNOTATION_FAIL = '[Annotations] Delete Annotation Fail';\n\nexport const SELECT_ANNOTATION = '[Annotations] Select Annotation';\nexport const SEARCH_COMMENT = '[Comments] Search Comments';\nexport const APPLY_COMMENT_SUMMARY_FILTER = '[Comments] Apply Comment Summary Filter';\nexport const CLEAR_COMMENT_SUMMARY_FILTER = '[Comments] Clear Comment Summary Filter';\n\nexport class LoadAnnotationSet implements Action {\n readonly type = LOAD_ANNOTATION_SET;\n constructor(public payload: string) { }\n}\n\nexport class LoadAnnotationSetSucess implements Action {\n readonly type = LOAD_ANNOTATION_SET_SUCCESS;\n constructor(public payload: { status: number, body: AnnotationSet }) { }\n}\n\nexport class LoadAnnotationSetFail implements Action {\n readonly type = LOAD_ANNOTATION_SET_FAIL;\n constructor(public payload: { status: number, body: any }) { }\n}\n\nexport class SaveAnnotation implements Action {\n readonly type = SAVE_ANNOTATION;\n constructor(public payload: Annotation) { }\n}\n\nexport class SaveAnnotationSuccess implements Action {\n readonly type = SAVE_ANNOTATION_SUCCESS;\n constructor(public payload: any) { }\n}\n\nexport class SaveAnnotationFail implements Action {\n readonly type = SAVE_ANNOTATION_FAIL;\n constructor(public payload: Error) { }\n}\n\nexport class AddOrEditComment implements Action {\n readonly type = ADD_OR_EDIT_COMMENT;\n constructor(public payload: Comment) { }\n}\n\nexport class DeleteAnnotation implements Action {\n readonly type = DELETE_ANNOTATION;\n constructor(public payload: string) { }\n}\n\nexport class DeleteAnnotationSuccess implements Action {\n readonly type = DELETE_ANNOTATION_SUCCESS;\n constructor(public payload: string) { }\n}\n\nexport class DeleteAnnotationFail implements Action {\n readonly type = DELETE_ANNOTATION_FAIL;\n constructor(public payload: Error) {}\n}\n\nexport class SelectedAnnotation implements Action {\n readonly type = SELECT_ANNOTATION;\n constructor(public payload: SelectionAnnotation) {}\n}\n\nexport class SearchComment implements Action {\n readonly type = SEARCH_COMMENT;\n constructor(public payload: string) {}\n}\n\nexport class ApplyCommentSymmaryFilter implements Action {\n readonly type = APPLY_COMMENT_SUMMARY_FILTER;\n constructor(public payload: Filters) {}\n}\n\nexport class ClearCommentSummaryFilters implements Action {\n readonly type = CLEAR_COMMENT_SUMMARY_FILTER;\n}\n\nexport type AnnotationsActions =\n | LoadAnnotationSet\n | LoadAnnotationSetSucess\n | LoadAnnotationSetFail\n | SaveAnnotation\n | SaveAnnotationSuccess\n | SaveAnnotationFail\n | AddOrEditComment\n | DeleteAnnotation\n | DeleteAnnotationSuccess\n | DeleteAnnotationFail\n | SelectedAnnotation\n | SearchComment\n | ApplyCommentSymmaryFilter\n | ClearCommentSummaryFilters;\n","import { Annotation } from '../annotations/annotation-set/annotation-view/annotation.model';\nimport moment from 'moment-timezone';\nimport { Redaction } from '../redaction/services/redaction.model';\nimport { Filters } from './models/filters.interface';\nimport { Comment } from '../annotations/comment-set/comment/comment.model';\n\n/*\n @dynamic\n marking class as dynamic to stop compiler throwing error for lambda in static function\n see https://github.com/angular/angular/issues/19698#issuecomment-338340211\n */\nexport class StoreUtils {\n\n static groupByKeyEntities(annotations, key): {[id: string]: any[]} {\n return annotations.reduce((h, obj) =>\n Object.assign(h, { [obj[key]]: ( h[obj[key]] || [] ).concat(obj) }), {});\n }\n\n static generateCommentsEntities(annotations): {[id: string]: Comment} {\n return annotations.reduce(\n (commentEntities: { [id: string]: Annotation }, annotation: Annotation) => {\n if (annotation.comments.length) {\n const comment = {\n ...annotation.comments[0] || '',\n tags: [...annotation.tags || []]\n };\n return {\n ...commentEntities,\n [annotation.id]: comment\n };\n }\n return {\n ...commentEntities\n };\n }, {});\n }\n\n static genTagNameEntities(annotations) {\n const filterAnnoWithoutCommentsTags = annotations.filter(a => (a.comments.length && a.tags.length));\n const allTags = filterAnnoWithoutCommentsTags.map(anno => this.groupByKeyEntities(anno.tags, 'name'));\n const groupedByName = allTags.reduce(\n (tagEntitiy: { [id: string]: Annotation }, tagItem) => {\n return {\n ...tagEntitiy,\n ...tagItem\n };\n }, {});\n\n return this.genNameEnt(annotations, groupedByName);\n }\n\n static genNameEnt(annos, groupedByName) {\n return Object.keys(groupedByName).reduce(\n (tagNameEnt, key) => {\n const readyAnno = annos.filter(anno => anno.tags.find(tag => tag.name === key))\n .map(anno => anno.id)\n .reduce((obj: {[id: string]: string}, anno: string) => ({ ...obj, [anno]: anno }), {});\n\n return {\n ...tagNameEnt,\n [key]: readyAnno\n };\n }, {});\n\n }\n\n static generateAnnotationEntities(anno): {[id: string]: Annotation} {\n return anno.reduce(\n (annoEntities: { [id: string]: Annotation }, annotation: Annotation) => {\n const annot = {\n ...annotation,\n positionTop: annotation.rectangles[0].y // todo remove this\n };\n return {\n ...annoEntities,\n [annotation.id]: annot\n };\n }, {});\n }\n\n static generateRedactionEntities(redactions: Redaction[]): { [id: string]: Redaction } {\n return redactions.reduce(\n (redactEntities: { [id: string]: Redaction }, redaction: Redaction) => {\n return {\n ...redactEntities,\n [redaction.redactionId]: redaction\n };\n }, {});\n }\n\n static resetCommentEntSelect(ent: { [id: string]: Comment }) {\n return Object.keys(ent).reduce((object, key) => {\n object[key] = {\n ...ent[key],\n editable: false,\n selected: false\n };\n return object;\n }, {});\n }\n\n static filterCommentsSummary(comments: Array<Comment>, filters: Filters) {\n if (Object.keys(filters).length) {\n const tagFilterApplied = Object.keys(filters.tagFilters)\n .filter(key => filters.tagFilters[key] === true).length;\n const dateFilterApplied = (filters.dateRangeFrom || filters.dateRangeTo);\n const filteredComments = comments.filter(comment => {\n let hasTagFilter = false;\n let hasDateFilter = false;\n // check tags\n if (filters.hasOwnProperty('tagFilters')) {\n Object.keys(filters.tagFilters).forEach(filter => {\n const label = filters.tagFilters[filter];\n if (label) {\n return comment.tags.forEach(tag => {\n if (tag.name === filter && !hasTagFilter) {\n hasTagFilter = true;\n }\n });\n }});\n }\n // check for dates\n if (dateFilterApplied) {\n const commentDate = moment(comment.lastModifiedDate);\n const dateFrom = filters.dateRangeFrom !== null ? moment(filters.dateRangeFrom) : undefined;\n const dateTo = filters.dateRangeTo !== null ? moment(filters.dateRangeTo) : undefined;\n\n if (dateTo && dateFrom) {\n if (commentDate > dateFrom && commentDate < dateTo) {\n hasDateFilter = true;\n }\n }\n if (dateTo && !dateFrom) {\n if (commentDate <= dateTo) {\n hasDateFilter = true;\n }\n }\n if (dateFrom && !dateTo) {\n if (commentDate > dateFrom) {\n hasDateFilter = true;\n }\n }\n }\n\n return (hasTagFilter || hasDateFilter);\n });\n return (tagFilterApplied || dateFilterApplied) ? filteredComments : comments;\n } else {\n return comments;\n }\n }\n}\n","import uuid from 'uuid/v4';\nimport * as fromAnnotations from '../actions/annotation.actions';\nimport { Annotation } from '../../annotations/annotation-set/annotation-view/annotation.model';\nimport { Comment } from '../../annotations/comment-set/comment/comment.model';\nimport { StoreUtils } from '../store-utils';\nimport { SelectionAnnotation } from '../../annotations/models/event-select.model';\nimport { Filters } from '../models/filters.interface';\n\nexport interface AnnotationSetState {\n annotationSet: any;\n annotationEntities: {[id: string]: any};\n annotationPageEntities: {[id: string]: Annotation[]};\n commentEntities: {[id: string]: Comment};\n selectedAnnotation: SelectionAnnotation;\n commentSearchQueries: { commentSearch: string };\n commentSummaryFilters: {hasFilter: boolean; filters: Filters};\n loaded: boolean;\n loading: boolean;\n}\n\nexport const initialState: AnnotationSetState = {\n annotationSet: {},\n annotationEntities: {},\n commentEntities: {},\n annotationPageEntities: {},\n selectedAnnotation: null,\n commentSearchQueries: {commentSearch: ''},\n commentSummaryFilters: {hasFilter: false, filters: {}},\n loading: false,\n loaded: false,\n};\n\nexport function reducer (\n state = initialState,\n action: fromAnnotations.AnnotationsActions\n): AnnotationSetState {\n switch (action.type) {\n\n case fromAnnotations.LOAD_ANNOTATION_SET: {\n const annotationSet = {\n ...state.annotationSet,\n documentId: action.payload\n };\n return {\n ...initialState,\n annotationSet,\n loading: true\n };\n }\n case fromAnnotations.LOAD_ANNOTATION_SET_SUCCESS:\n case fromAnnotations.LOAD_ANNOTATION_SET_FAIL: {\n const annotationSet = action.payload.status === 200 ? action.payload.body :\n {\n ...state.annotationSet,\n annotations: [],\n id: uuid()\n };\n const annotationEntities = StoreUtils.generateAnnotationEntities(annotationSet.annotations);\n const annotationPageEntities = StoreUtils.groupByKeyEntities(annotationSet.annotations, 'page');\n const commentEntities = StoreUtils.generateCommentsEntities(annotationSet.annotations);\n return {\n ...state,\n annotationSet,\n annotationEntities,\n annotationPageEntities,\n commentEntities,\n loading: false,\n loaded: true\n };\n }\n\n case fromAnnotations.SAVE_ANNOTATION_SUCCESS: {\n const anno = action.payload;\n const annEntities = {\n ...state.annotationEntities,\n [anno.id]: anno\n };\n const annotArray = Object.keys(annEntities).map(key => annEntities[key]);\n const annotationEntities = StoreUtils.generateAnnotationEntities(annotArray);\n const annotationPageEntities = StoreUtils.groupByKeyEntities(annotArray, 'page');\n const commentEntities = StoreUtils.generateCommentsEntities(annotArray);\n const selectedAnnotation = {\n ...state.selectedAnnotation,\n annotationId : anno.id,\n editable: false\n };\n return {\n ...state,\n annotationEntities,\n annotationPageEntities,\n commentEntities,\n selectedAnnotation,\n loading: false,\n loaded: true\n };\n }\n\n case fromAnnotations.DELETE_ANNOTATION_SUCCESS: {\n const id = action.payload;\n const page = state.annotationEntities[id].page;\n const annotationEntities = {\n ...state.annotationEntities\n };\n delete annotationEntities[id];\n const pageAnnotationsRemoved = [\n ...state.annotationPageEntities[page].filter(anno => anno.id !== id)\n ];\n const annotationPageEntities = {\n ...state.annotationPageEntities,\n [page]: pageAnnotationsRemoved\n };\n const commentEntities = {\n ...state.commentEntities\n };\n if (state.commentEntities[id]) {\n delete commentEntities[id];\n }\n return {\n ...state,\n annotationEntities,\n annotationPageEntities,\n commentEntities\n };\n }\n\n case fromAnnotations.ADD_OR_EDIT_COMMENT: {\n const comment = {\n [action.payload.annotationId]: action.payload\n };\n const comments = {\n ...state.commentEntities,\n ...comment\n };\n return {\n ...state,\n commentEntities: comments\n };\n }\n\n case fromAnnotations.SELECT_ANNOTATION: {\n const payload = action.payload;\n const commentEntity = {\n ...state.commentEntities[payload.annotationId],\n editable: payload.editable,\n selected: payload.selected\n };\n\n const resetCommentEntSelect = StoreUtils.resetCommentEntSelect({...state.commentEntities});\n\n const commentEntities = payload.annotationId && state.commentEntities[payload.annotationId] ? {\n ...resetCommentEntSelect,\n [payload.annotationId]: commentEntity\n } : {...resetCommentEntSelect};\n\n return {\n ...state,\n commentEntities,\n selectedAnnotation: action.payload\n };\n }\n\n case fromAnnotations.SEARCH_COMMENT: {\n const commentSearchQueries = {\n ...state.commentSearchQueries,\n commentSearch: action.payload\n };\n\n const commentEntities = StoreUtils.resetCommentEntSelect({...state.commentEntities});\n return {\n ...state,\n commentEntities,\n commentSearchQueries\n };\n }\n\n case fromAnnotations.APPLY_COMMENT_SUMMARY_FILTER: {\n const payload = action.payload;\n const hasTagFilter = () => {\n let isFiltered = false;\n if (payload.tagFilters) {\n Object.keys(payload.tagFilters).map(filter => {\n if (payload.tagFilters[filter] && !isFiltered) {\n isFiltered = true;\n }\n });\n }\n return isFiltered;\n };\n const hasFilter = (hasTagFilter() || !!payload.dateRangeFrom || !!payload.dateRangeTo);\n const commentSummaryFilters = {\n hasFilter,\n filters: payload\n };\n return {\n ...state,\n commentSummaryFilters: commentSummaryFilters\n };\n }\n\n case fromAnnotations.CLEAR_COMMENT_SUMMARY_FILTER: {\n\n return {\n ...state,\n commentSummaryFilters : {...initialState.commentSummaryFilters}\n };\n }\n }\n\n\n return state;\n}\n\nexport const getAnnoSet = (state: AnnotationSetState) => state.annotationSet;\nexport const getCommentEnts = (state: AnnotationSetState) => state.commentEntities;\nexport const getAnnoPageEnt = (state: AnnotationSetState) => state.annotationPageEntities;\nexport const getAnnoEnt = (state: AnnotationSetState) => state.annotationEntities;\nexport const getSelectedAnno = (state: AnnotationSetState) => state.selectedAnnotation;\nexport const commentSearchQ = (state: AnnotationSetState) => state.commentSearchQueries;\nexport const getSummaryFilters = (state: AnnotationSetState) => state.commentSummaryFilters;\n","import * as fromAnnotations from '../actions/annotation.actions';\nimport * as fromTags from '../actions/tag.actions';\nimport {StoreUtils} from '../store-utils';\nimport {Annotation} from '../../annotations/annotation-set/annotation-view/annotation.model';\n\nexport interface TagsState {\n tagNameEnt: {[id: string]: string[]};\n filteredComments: {[id: string]: string[]};\n filteredPageEntities: {[id: string]: Annotation[]};\n annotations: Annotation[];\n formFilterState: {[id: string]: boolean};\n filters: string[];\n}\n\nexport const initialTagState: TagsState = {\n tagNameEnt: {},\n annotations: [],\n filteredPageEntities: {},\n filteredComments: {},\n formFilterState: {},\n filters: []\n};\n\nexport function tagsReducer (\n state = initialTagState,\n action: fromAnnotations.AnnotationsActions | fromTags.TagsActions\n): TagsState {\n switch (action.type) {\n case fromAnnotations.LOAD_ANNOTATION_SET: {\n\n return {\n ...state,\n ...initialTagState\n };\n }\n case fromAnnotations.LOAD_ANNOTATION_SET_SUCCESS: {\n const annotations = action.payload.body.annotations;\n const tagNameEnt = StoreUtils.genTagNameEntities(annotations);\n return {\n ...state,\n tagNameEnt,\n annotations\n };\n }\n\n case fromAnnotations.SAVE_ANNOTATION_SUCCESS: {\n const payload = action.payload;\n\n const anno = [...state.annotations].filter(a => a.id !== payload.id) || [];\n const annotations = [...anno, payload];\n const tagNameEnt = StoreUtils.genTagNameEntities(annotations);\n return {\n ...state,\n annotations,\n tagNameEnt\n };\n }\n\n case fromAnnotations.DELETE_ANNOTATION_SUCCESS: {\n const id = action.payload;\n const annotations = [...state.annotations].filter(a => a.id !== id);\n const tagNameEnt = StoreUtils.genTagNameEntities(annotations);\n const filteredPageEntities = StoreUtils.groupByKeyEntities(annotations, 'page');\n const filteredComments = {\n ...state.filteredComments\n };\n delete filteredComments[id];\n return {\n ...state,\n annotations,\n tagNameEnt,\n filteredComments,\n filteredPageEntities,\n filters: []\n };\n }\n\n\n case fromTags.ADD_FILTER_TAGS: {\n const formFilterState = action.payload;\n\n const filters = Object.keys(formFilterState).reduce((arr: string[], key: string) => {\n return formFilterState[key] ? [...arr, key] : arr;\n }, []);\n\n const filteredComments = filters.reduce((obj: {[id: string]: any}, f) => {\n return {\n ...obj,\n ...state.tagNameEnt[f]\n };\n }, {});\n\n const annotations = Object.keys(filteredComments).map(key => state.annotations.filter(a => a.id === key)[0]);\n const filteredPageEntities = StoreUtils.groupByKeyEntities(annotations, 'page');\n return {\n ...state,\n filters,\n filteredComments,\n filteredPageEntities,\n };\n }\n\n case fromTags.CLEAR_FILTER_TAGS: {\n return {\n ...state,\n filters: [],\n filteredComments: {},\n filteredPageEntities: {},\n };\n }\n\n }\n\n return state;\n}\n\nexport const getTagNameEnt = (state: TagsState) => state.tagNameEnt;\nexport const getFilters = (state: TagsState) => state.filters;\nexport const getFilteredComments = (state: TagsState) => state.filteredComments;\nexport const getFilteredPageEnt = (state: TagsState) => state.filteredPageEntities;\n","import { Action } from '@ngrx/store';\nimport { Bookmark } from '../../viewers/pdf-viewer/side-bar/bookmarks/bookmarks.interfaces';\n\nexport const LOAD_BOOKMARKS = '[Bookmarks] Load Bookmarks';\nexport const LOAD_BOOKMARKS_SUCCESS = '[Bookmarks] Load Bookmarks Success';\nexport const LOAD_BOOKMARKS_FAIL = '[Bookmarks] Load Bookmarks Failure';\nexport const CREATE_BOOKMARK = '[Bookmarks] Create Bookmark';\nexport const CREATE_BOOKMARK_SUCCESS = '[Bookmarks] Create Bookmark Success';\nexport const CREATE_BOOKMARK_FAIL = '[Bookmarks] Create Bookmark Failure';\nexport const DELETE_BOOKMARK = '[Bookmarks] Delete Bookmark';\nexport const DELETE_BOOKMARK_SUCCESS = '[Bookmarks] Delete Bookmark Success';\nexport const DELETE_BOOKMARK_FAIL = '[Bookmarks] Delete Bookmark Failure';\nexport const MOVE_BOOKMARK = '[Bookmarks] Move Bookmark';\nexport const MOVE_BOOKMARK_SUCCESS = '[Bookmarks] Move Bookmark Success';\nexport const MOVE_BOOKMARK_FAIL = '[Bookmarks] Move Bookmark Failure';\nexport const UPDATE_BOOKMARK = '[Bookmarks] Update Bookmark';\nexport const UPDATE_BOOKMARK_SUCCESS = '[Bookmarks] Update Bookmark Success';\nexport const UPDATE_BOOKMARK_FAIL = '[Bookmarks] Update Bookmark Failure';\n\nexport class LoadBookmarks implements Action {\n readonly type = LOAD_BOOKMARKS;\n constructor() {}\n}\n\nexport class LoadBookmarksSuccess implements Action {\n readonly type = LOAD_BOOKMARKS_SUCCESS;\n constructor(public payload: { body: Bookmark[], status: number}) { }\n}\n\nexport class LoadBookmarksFailure implements Action {\n readonly type = LOAD_BOOKMARKS_FAIL;\n constructor(public payload: { body: any, status: number }) { }\n}\n\nexport class CreateBookmark implements Action {\n readonly type = CREATE_BOOKMARK;\n constructor(public payload: Bookmark) { }\n}\n\nexport class CreateBookmarkSuccess implements Action {\n readonly type = CREATE_BOOKMARK_SUCCESS;\n constructor(public payload: Bookmark) {}\n}\n\nexport class CreateBookmarkFailure implements Action {\n readonly type = CREATE_BOOKMARK_FAIL;\n constructor(public payload: Bookmark) {}\n}\n\nexport class DeleteBookmark implements Action {\n readonly type = DELETE_BOOKMARK;\n constructor(public payload: { deleted: string[], updated: Bookmark }) {}\n}\n\nexport class DeleteBookmarkSuccess implements Action {\n readonly type = DELETE_BOOKMARK_SUCCESS;\n constructor(public payload: string[]) {}\n}\n\nexport class DeleteBookmarkFailure implements Action {\n readonly type = DELETE_BOOKMARK_FAIL;\n constructor(public payload: string) {}\n}\n\nexport class MoveBookmark implements Action {\n readonly type = MOVE_BOOKMARK;\n constructor(public payload: Bookmark[]) {}\n}\n\nexport class MoveBookmarkSuccess implements Action {\n readonly type = MOVE_BOOKMARK_SUCCESS;\n constructor(public payload: Bookmark[]) { }\n}\n\nexport class MoveBookmarkFailure implements Action {\n readonly type = MOVE_BOOKMARK_FAIL;\n constructor(public payload: string) {}\n}\n\nexport class UpdateBookmark implements Action {\n readonly type = UPDATE_BOOKMARK;\n constructor(public payload: Bookmark) {}\n}\n\nexport class UpdateBookmarkSuccess implements Action {\n readonly type = UPDATE_BOOKMARK_SUCCESS;\n constructor(public payload: Bookmark) {}\n}\n\nexport class UpdateBookmarkFailure implements Action {\n readonly type = UPDATE_BOOKMARK_FAIL;\n constructor(public payload: Bookmark) {}\n}\n\n\nexport type BookmarksActions =\n | LoadBookmarks | LoadBookmarksSuccess | LoadBookmarksFailure\n | CreateBookmark | CreateBookmarkSuccess | CreateBookmarkFailure\n | DeleteBookmark | DeleteBookmarkSuccess | DeleteBookmarkFailure\n | UpdateBookmark | UpdateBookmarkSuccess | UpdateBookmarkFailure\n | MoveBookmark | MoveBookmarkSuccess | MoveBookmarkFailure;\n","import { Bookmark } from '../viewers/pdf-viewer/side-bar/bookmarks/bookmarks.interfaces';\n\nexport const getBookmarkChildren = (bookmarks: Bookmark[]) => {\n if (bookmarks) {\n return bookmarks.reduce((childIds, bookmark) => {\n if (bookmark.children && bookmark.children.length > 0) {\n return [...childIds, bookmark.id, ...getBookmarkChildren(bookmark.children)];\n }\n return [...childIds, bookmark.id];\n }, []);\n } else {\n return [];\n }\n};\n\nexport const generateBookmarkEntities = (bookmarks: Bookmark[]): {[id: string]: Bookmark} => {\n return bookmarks.reduce(\n (bookmarkEntities, bookmark) =>\n Object.assign(bookmarkEntities, { [bookmark.id]: bookmark }),\n {});\n};\n\nconst indexEntities = (entities: { [id: string]: Bookmark }) => {\n const entityIds = Object.keys(entities);\n for (let index = 0; entityIds.length > 0; index++) {\n let keysToRemove = [];\n entityIds.forEach(key => {\n if (!entities[key].previous || !entityIds.includes(entities[key].previous.toString())) {\n entities[key].index = index;\n keysToRemove.push(key);\n }\n });\n keysToRemove.forEach(key => entityIds.splice(entityIds.indexOf(key), 1));\n keysToRemove = [];\n }\n};\n\nexport const generateBookmarkNodes = (entities: { [id: string]: Bookmark }) => {\n const bookmarkEntities = JSON.parse(JSON.stringify(entities));\n indexEntities(bookmarkEntities);\n return Object.keys(bookmarkEntities).reduce((nodes, bookmarkId) => {\n const bookmarkEntity = bookmarkEntities[bookmarkId];\n if (bookmarkEntity.parent) {\n const parentEntity = bookmarkEntities[bookmarkEntity.parent];\n if (!parentEntity.children) {\n parentEntity.children = [];\n }\n parentEntity.children[bookmarkEntity.index] = bookmarkEntity;\n } else {\n nodes[bookmarkEntity.index] = bookmarkEntity;\n }\n return nodes;\n }, []);\n};\n","import * as fromBookmarks from '../actions/bookmark.actions';\nimport { Bookmark } from '../../viewers/pdf-viewer/side-bar/bookmarks/bookmarks.interfaces';\nimport { StoreUtils } from '../store-utils';\nimport { generateBookmarkEntities } from '../bookmarks-store-utils';\n\nexport interface BookmarksState {\n bookmarks: Bookmark[];\n bookmarkEntities: { [id: string]: Bookmark };\n bookmarkPageEntities: {[id: string]: any};\n editableBookmark: string;\n loaded: boolean;\n loading: boolean;\n}\n\nexport const initialBookmarksState: BookmarksState = {\n bookmarks: [],\n bookmarkEntities: {},\n bookmarkPageEntities: {},\n editableBookmark: undefined,\n loaded: false,\n loading: false\n};\n\nexport function bookmarksReducer (state = initialBookmarksState,\n action: fromBookmarks.BookmarksActions): BookmarksState {\n\n switch (action.type) {\n\n case fromBookmarks.LOAD_BOOKMARKS: {\n return {\n ...state,\n loading: true\n };\n }\n\n case fromBookmarks.LOAD_BOOKMARKS_SUCCESS:\n case fromBookmarks.LOAD_BOOKMARKS_FAIL: {\n const bookmarks = action.payload.status === 200 ? action.payload.body : [];\n const bookmarkEntities = generateBookmarkEntities(bookmarks);\n const bookmarkPageEntities = StoreUtils.groupByKeyEntities(bookmarks, 'pageNumber');\n\n return {\n ...state,\n bookmarks,\n bookmarkEntities,\n bookmarkPageEntities,\n loaded: true\n };\n }\n\n case fromBookmarks.CREATE_BOOKMARK_SUCCESS: {\n const bookmark: Bookmark = action.payload;\n const bookmarkEntities = {\n ...state.bookmarkEntities,\n [bookmark.id]: bookmark,\n };\n const bookmarkArray = Object.keys(bookmarkEntities).map(key => bookmarkEntities[key]);\n const bookmarkPageEntities = StoreUtils.groupByKeyEntities(bookmarkArray, 'pageNumber');\n const editableBookmark = bookmark.id;\n return {\n ...state,\n bookmarkEntities,\n editableBookmark,\n bookmarkPageEntities,\n loading: false,\n loaded: true\n };\n }\n\n case fromBookmarks.MOVE_BOOKMARK_SUCCESS: {\n const movedBookmarks = generateBookmarkEntities(action.payload);\n const bookmarkEntities = {\n ...state.bookmarkEntities,\n ...movedBookmarks\n };\n return {\n ...state,\n bookmarkEntities,\n loading: false,\n loaded: true\n };\n }\n\n case fromBookmarks.DELETE_BOOKMARK_SUCCESS: {\n const bookmarkIds: string[] = action.payload;\n const bookmarkEntities = { ...state.bookmarkEntities };\n const bookmarkPageEntities = { ...state.bookmarkPageEntities };\n const removeBookmarksByPage: {[pageNumber: number]: string[]} = {};\n bookmarkIds.forEach(bookmarkId => {\n if (removeBookmarksByPage[bookmarkEntities[bookmarkId].pageNumber] !== undefined &&\n removeBookmarksByPage[bookmarkEntities[bookmarkId].pageNumber].length > 0) {\n removeBookmarksByPage[bookmarkEntities[bookmarkId].pageNumber].push(bookmarkId);\n } else {\n removeBookmarksByPage[bookmarkEntities[bookmarkId].pageNumber] = [bookmarkId];\n }\n delete bookmarkEntities[bookmarkId];\n });\n\n Object.entries(removeBookmarksByPage).forEach(\n ([pageNumber, bmrkIds]) => {\n bookmarkPageEntities[pageNumber]\n = bookmarkPageEntities[pageNumber].filter(bookmark => !bmrkIds.includes(bookmark.id));\n }\n );\n\n return {\n ...state,\n bookmarkEntities,\n bookmarkPageEntities,\n loading: false,\n loaded: true\n };\n }\n\n case fromBookmarks.UPDATE_BOOKMARK_SUCCESS: {\n const bookmark: Bookmark = action.payload;\n const bookmarkEntities = {\n ...state.bookmarkEntities,\n [bookmark.id]: { ...bookmark }\n };\n const bookmarkArray = Object.keys(bookmarkEntities).map(key => bookmarkEntities[key]);\n const bookmarkPageEntities = StoreUtils.groupByKeyEntities(bookmarkArray, 'pageNumber');\n const editableBookmark = undefined;\n return {\n ...state,\n bookmarkEntities,\n editableBookmark,\n bookmarkPageEntities,\n loading: false,\n loaded: true\n };\n }\n }\n return state;\n}\n\nexport const getBookmarks = (state: BookmarksState) => state.bookmarks;\nexport const getBookmarkEnts = (state: BookmarksState) => state.bookmarkEntities;\nexport const getBookmarkPageEnt = (state: BookmarksState) => state.bookmarkPageEntities;\nexport const getEditBookmark = (state: BookmarksState) => state.editableBookmark;\n","import { Action } from '@ngrx/store';\nimport { BulkRedaction, Redaction } from '../../redaction/services/redaction.model';\nimport { Annotation } from '../../annotations/annotation-set/annotation-view/annotation.model';\n\nexport const LOAD_REDACTIONS = '[Redaction] Load Redaction';\nexport const LOAD_REDACTION_SUCCESS = '[Redaction] Load Redaction Success';\nexport const LOAD_REDACTION_FAIL = '[Redaction] Load Redaction Fail';\n\nexport const SAVE_REDACTION = '[Redaction] Save Redaction';\nexport const SAVE_REDACTION_SUCCESS = '[Redaction] Save Redaction Success';\nexport const SAVE_REDACTION_FAIL = '[Redaction] Save Redaction Fail';\n\nexport const SAVE_BULK_REDACTION = '[Redaction] Save bulk Redaction';\nexport const SAVE_BULK_REDACTION_SUCCESS = '[Redaction] Save bulk Redaction Success';\nexport const SAVE_BULK_REDACTION_FAIL = '[Redaction] Save bulk Redaction Fail';\n\nexport const DELETE_REDACTION = '[Redaction] Delete Redaction';\nexport const DELETE_REDACTION_SUCCESS = '[Redaction] Delete Redaction Success';\nexport const DELETE_REDACTION_FAIL = '[Redaction] Delete Redaction Fail';\n\nexport const SELECT_REDACTION = '[Redaction] Select Redaction';\n\nexport const REDACT = '[Redaction] Redact';\nexport const REDACT_SUCCESS = '[Redaction] Redact Success';\nexport const REDACT_FAIL = '[Redaction] Redact Fail';\nexport const RESET_REDACTED_DOCUMENT = '[Redaction] Reset Redacted Document';\n\nexport const UNMARK_ALL = '[Redaction] Unmark All';\nexport const UNMARK_ALL_SUCCESS = '[Redaction] Unmark All Success';\n\n\nexport class LoadRedactions implements Action {\n readonly type = LOAD_REDACTIONS;\n constructor(public payload: any) { }\n}\n\nexport class LoadRedactionSuccess implements Action {\n readonly type = LOAD_REDACTION_SUCCESS;\n constructor(public payload: Redaction[]) { }\n}\n\nexport class LoadRedactionFailure implements Action {\n readonly type = LOAD_REDACTION_FAIL;\n constructor(public payload: any) { }\n}\n\nexport class SaveRedaction implements Action {\n readonly type = SAVE_REDACTION;\n constructor(public payload: Redaction) { }\n}\n\nexport class SaveRedactionSuccess implements Action {\n readonly type = SAVE_REDACTION_SUCCESS;\n constructor(public payload: Redaction) { }\n}\n\nexport class SaveRedactionFailure implements Action {\n readonly type = SAVE_REDACTION_FAIL;\n constructor(public payload: any) { }\n}\n\nexport class SaveBulkRedactionFailure implements Action {\n readonly type = SAVE_BULK_REDACTION_FAIL;\n constructor(public payload: any) { }\n}\n\nexport class SaveBulkRedaction implements Action {\n readonly type = SAVE_BULK_REDACTION;\n constructor(public payload: BulkRedaction) { }\n}\n\nexport class SaveBulkRedactionSuccess implements Action {\n readonly type = SAVE_BULK_REDACTION_SUCCESS;\n constructor(public payload: BulkRedaction) { }\n}\n\nexport class DeleteRedaction implements Action {\n readonly type = DELETE_REDACTION;\n constructor(public payload: Annotation) { }\n}\n\nexport class DeleteRedactionSuccess implements Action {\n readonly type = DELETE_REDACTION_SUCCESS;\n constructor(public payload: any) { }\n}\n\nexport class DeleteRedactionFailure implements Action {\n readonly type = DELETE_REDACTION_FAIL;\n constructor(public payload: any) { }\n}\n\nexport class SelectRedaction implements Action {\n readonly type = SELECT_REDACTION;\n constructor(public payload: any) { }\n}\n\nexport class Redact implements Action {\n readonly type = REDACT;\n constructor(public payload: { redactions: Redaction[], documentId: string }) { }\n}\n\nexport class RedactSuccess implements Action {\n readonly type = REDACT_SUCCESS;\n constructor(public payload: { blob: Blob, filename: string }) { }\n}\n\nexport class RedactFailure implements Action {\n readonly type = REDACT_FAIL;\n constructor(public payload: any) { }\n}\n\nexport class ResetRedactedDocument implements Action {\n readonly type = RESET_REDACTED_DOCUMENT;\n}\n\n\nexport class UnmarkAll implements Action {\n readonly type = UNMARK_ALL;\n constructor(public payload: string) { }\n}\n\nexport class UnmarkAllSuccess implements Action {\n readonly type = UNMARK_ALL_SUCCESS;\n}\n\nexport type RedactionActions =\n | LoadRedactions | LoadRedactionSuccess | LoadRedactionFailure\n | SaveRedaction | SaveRedactionSuccess | SaveRedactionFailure\n | DeleteRedaction | DeleteRedactionSuccess | DeleteRedactionFailure\n | SelectRedaction\n | Redact | RedactSuccess | RedactFailure | ResetRedactedDocument\n | UnmarkAll | UnmarkAllSuccess | SaveBulkRedactionSuccess;\n","import { map } from 'rxjs/operators';\nimport * as fromRedaction from '../actions/redaction.actions';\nimport * as fromAnnotations from '../actions/annotation.actions';\nimport { StoreUtils } from '../store-utils';\nimport { SelectionAnnotation } from '../../annotations/models/event-select.model';\nimport { Redaction } from '../../redaction/services/redaction.model'; // todo rename\n\n\nexport interface RedactionState {\n redactionEntities: { [id: string]: Redaction };\n redactionPageEntities: { [id: string]: any };\n selectedRedaction: SelectionAnnotation | {};\n redactedDocumentInfo: { blob: Blob, filename: string };\n documentId: string;\n}\n\nexport const initialRedactionState: RedactionState = {\n redactionEntities: {},\n redactionPageEntities: {},\n selectedRedaction: {},\n redactedDocumentInfo: undefined,\n documentId: undefined\n};\n\nexport function redactionReducer(\n state = initialRedactionState,\n action: fromRedaction.RedactionActions | fromAnnotations.AnnotationsActions\n): RedactionState {\n switch (action.type) {\n\n case fromRedaction.LOAD_REDACTIONS: {\n return {\n ...state,\n ...initialRedactionState\n };\n }\n\n case fromRedaction.LOAD_REDACTION_SUCCESS: {\n const payload = action.payload;\n if (payload) {\n const redactionEntities = StoreUtils.generateRedactionEntities(payload);\n const redactionPageEntities = StoreUtils.groupByKeyEntities(payload, 'page');\n return {\n ...state,\n redactionEntities,\n redactionPageEntities\n };\n }\n return {\n ...state\n };\n }\n\n case fromRedaction.SAVE_REDACTION_SUCCESS: {\n const { payload } = action;\n const redactionEntities = {\n ...state.redactionEntities,\n [payload.redactionId]: payload\n };\n const redactionArray = Object.keys(redactionEntities).map(key => redactionEntities[key]);\n const redactionPageEntities = StoreUtils.groupByKeyEntities(redactionArray, 'page');\n return {\n ...state,\n redactionEntities,\n redactionPageEntities\n };\n }\n case fromRedaction.SAVE_BULK_REDACTION_SUCCESS: {\n const payloadResult = Object.assign({}, ...action.payload.searchRedactions.map((x) => ({ [x.redactionId]: x })));\n const redactionEntities = {\n ...state.redactionEntities,\n ...payloadResult\n };\n const redactionArray = Object.keys(redactionEntities).map(key => redactionEntities[key]);\n const redactionPageEntities = StoreUtils.groupByKeyEntities(redactionArray, 'page');\n return {\n ...state,\n redactionEntities,\n redactionPageEntities\n };\n }\n case fromRedaction.SELECT_REDACTION:\n case fromAnnotations.SELECT_ANNOTATION: {\n return {\n ...state,\n selectedRedaction: action.payload\n };\n }\n\n case fromRedaction.DELETE_REDACTION_SUCCESS: {\n const page = action.payload.page;\n const id = action.payload.redactionId;\n const redactionEntities = {\n ...state.redactionEntities\n };\n delete redactionEntities[id];\n const pageRedactionRemoved = [\n ...state.redactionPageEntities[page].filter(redaction => redaction.redactionId !== id)\n ];\n const redactionPageEntities = {\n ...state.redactionPageEntities,\n [page]: pageRedactionRemoved\n };\n\n return {\n ...state,\n redactionPageEntities,\n redactionEntities,\n };\n }\n\n case fromRedaction.REDACT_SUCCESS: {\n const redactedDocumentInfo = action.payload;\n return {\n ...state,\n ...initialRedactionState,\n redactedDocumentInfo\n };\n }\n\n case fromRedaction.RESET_REDACTED_DOCUMENT: {\n return {\n ...state,\n redactedDocumentInfo: undefined\n };\n }\n\n case fromRedaction.UNMARK_ALL_SUCCESS: {\n return {\n ...state,\n ...initialRedactionState\n };\n }\n }\n\n return state;\n}\n\n\nexport const getRedactionEnt = (state: RedactionState) => state.redactionEntities;\nexport const getPageEnt = (state: RedactionState) => state.redactionPageEntities;\nexport const getSelectedRedaction = (state: RedactionState) => state.selectedRedaction;\nexport const getRedactedDocInfo = (state: RedactionState) => state.redactedDocumentInfo;\n","import * as fromIcpActions from '../actions/icp.actions';\nimport { IcpSession, IcpState } from '../../icp/icp.interfaces';\n\nexport const initialIcpSessionState: IcpState = {\n session: null,\n presenter: null,\n client: null,\n participants: []\n};\n\nexport function icpReducer (state = initialIcpSessionState,\n action: fromIcpActions.IcpActions): IcpState {\n\n switch (action.type) {\n\n case fromIcpActions.SET_CASE_ID: {\n const caseId = action.payload;\n const session = {...state.session, caseId};\n return {\n ...state,\n session\n };\n }\n\n case fromIcpActions.ICP_SOCKET_SESSION_JOINED: {\n const session: IcpSession = action.payload.session;\n const participantInfo = action.payload.participantInfo;\n return {\n ...state,\n session,\n client: participantInfo.client,\n presenter: participantInfo.presenter,\n };\n }\n\n case fromIcpActions.ICP_PARTICIPANT_LIST_UPDATED: {\n const updatedParticipants: any = action.payload;\n const participants = Object.keys(updatedParticipants)\n .map(id => ({ id: id, username: updatedParticipants[id] }));\n return {\n ...state,\n participants\n };\n }\n\n case fromIcpActions.ICP_PRESENTER_UPDATED: {\n const presenter = action.payload;\n return {\n ...state, presenter\n };\n }\n\n case fromIcpActions.LEAVE_ICP_SOCKET_SESSION: {\n return {\n ...state,\n ...initialIcpSessionState\n };\n }\n }\n return state;\n}\n\nexport const getIcpSession = (state: IcpState) => state.session;\nexport const getPresenter = (state: IcpState) => state.presenter;\nexport const getClient = (state: IcpState) => state.client;\nexport const getParticipants = (state: IcpState) => state.participants;\n","export enum IcpEvents {\n SESSION_JOINED = 'IcpClientJoinedSession',\n CLIENT_DISCONNECTED = 'IcpClientDisconnectedFromSession',\n NEW_PARTICIPANT_JOINED = 'IcpNewParticipantJoinedSession',\n REMOVE_PARTICIPANT = 'IcpRemoveParticipantFromList',\n PARTICIPANTS_UPDATED = 'IcpParticipantsListUpdated',\n UPDATE_PRESENTER = 'IcpNewPresenterStartsPresenting',\n PRESENTER_UPDATED = 'IcpPresenterUpdated',\n UPDATE_SCREEN = 'IcpUpdateScreen',\n SCREEN_UPDATED = 'IcpScreenUpdated',\n SESSION_JOIN = 'IcpClientJoinSession',\n SESSION_LEAVE = 'IcpClientLeaveSession',\n}\n","import { ActionReducerMap, createFeatureSelector } from '@ngrx/store';\nimport * as fromDocument from './document.reducer';\nimport * as fromAnnotation from './annotations.reducer';\nimport * as fromTags from './tags.reducer';\nimport * as fromBookmarks from './bookmarks.reducer';\nimport * as fromRedaction from './redaction.reducer';\nimport * as fromIcp from './icp.reducer';\nimport { IcpState } from '../../icp/icp.interfaces';\n\nexport interface State {\n document: fromDocument.DocumentState;\n annotations: fromAnnotation.AnnotationSetState;\n tags: fromTags.TagsState;\n bookmarks: fromBookmarks.BookmarksState;\n redactions: fromRedaction.RedactionState;\n icp: IcpState;\n}\n\nexport const reducers: ActionReducerMap<State> = {\n document: fromDocument.docReducer,\n annotations: fromAnnotation.reducer,\n tags: fromTags.tagsReducer,\n bookmarks: fromBookmarks.bookmarksReducer,\n redactions: fromRedaction.redactionReducer,\n icp: fromIcp.icpReducer,\n};\n\nexport const getMVState = createFeatureSelector<State>('media-viewer');\n\nexport * from './document.reducer';\nexport * from './annotations.reducer';\nexport * from './tags.reducer';\nexport * from './bookmarks.reducer';\nexport * from './redaction.reducer';\nexport * from './icp.reducer';\n","import { createSelector } from '@ngrx/store';\n\nimport * as fromFeature from '../reducers/reducers';\nimport * as fromDocument from '../reducers/document.reducer';\n\nexport const getDocumentState = createSelector(\n fromFeature.getMVState,\n (state: fromFeature.State) => state.document\n);\n\nexport const getPages = createSelector(\n getDocumentState,\n fromDocument.getDocPages\n);\n\nexport const getPageList = createSelector(\n getPages,\n (pages) => Object.values(pages)\n);\n\nexport const getDocumentId = createSelector(\n getDocumentState,\n fromDocument.getDocId\n);\n\nexport const getPdfPosition = createSelector(\n getDocumentState,\n fromDocument.getPdfPos\n);\n\nexport const getPageDifference = createSelector(\n getDocumentState,\n fromDocument.getHasDifferentPageSizes\n);\n\nexport const getConvertedDocument = createSelector(\n getDocumentState,\n fromDocument.getConvertedDocument\n);\n\nexport const getRotation = createSelector(\n getDocumentState,\n fromDocument.getRotation\n);\n\nexport const rotationLoaded = createSelector(\n getDocumentState,\n fromDocument.rotationLoaded\n);\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { Rectangle } from '../annotations/annotation-set/annotation-view/rectangle/rectangle.model';\n\nexport interface Highlight {\n page: number;\n rectangles: Rectangle[];\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ViewerEventService {\n\n public readonly textHighlight = new Subject<Highlight>();\n public readonly boxHighlight = new Subject<Highlight>();\n public readonly ctxToolbarCleared = new Subject();\n public readonly navigationEvent = new Subject<any[]>();\n\n constructor() {}\n\n public textSelected(selectionData: Highlight): void {\n this.textHighlight.next(selectionData);\n }\n\n public boxSelected(selectionData: Highlight): void {\n this.boxHighlight.next(selectionData);\n }\n\n public clearCtxToolbar(): void {\n this.ctxToolbarCleared.next();\n }\n\n\n public goToDestination(destination: any[]) {\n this.navigationEvent.next(destination);\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, from, Observable, of, Subject, Subscription } from 'rxjs';\nimport { IcpEvents } from './icp.events';\nimport { IcpParticipant } from './icp.interfaces';\n\n@Injectable()\nexport class SocketService implements OnDestroy {\n\n private socket: WebSocket;\n subscription: Subscription;\n connected$ = new BehaviorSubject<boolean>(false);\n sessionJoined$ = new Subject();\n presenterUpdated$ = new Subject();\n clientDisconnected$ = new Subject();\n participantUpdated$ = new Subject();\n newParticipantJoined$ = new Subject();\n screenUpdated$ = new Subject();\n\n constructor() { }\n\n ngOnDestroy() {\n this.subscription.unsubscribe();\n }\n\n connect(url: string) {\n return this.getSocketClient(url).subscribe((socket: WebSocket) => {\n\n socket.onopen = (event: Event) => {\n this.connected$.next(true);\n };\n\n socket.onmessage = (event: MessageEvent) => {\n console.log('onmessage');\n const eventData = JSON.parse(event.data);\n if (eventData.data && eventData.data.eventName) {\n this.messageEventHandller(eventData.data.eventName, eventData.data.data);\n }\n };\n\n socket.onerror = (event: Event) => {\n console.log('onerror');\n };\n\n socket.onclose = (event: CloseEvent) => {\n console.log('onclose');\n };\n });\n }\n\n connected(): Observable<boolean> {\n return this.connected$.asObservable();\n }\n\n join(session) {\n this.emit(IcpEvents.SESSION_JOIN, session);\n }\n\n leave(session) {\n this.emit(IcpEvents.SESSION_LEAVE, session);\n this.subscription.unsubscribe();\n }\n\n emit(event: string, data: any) {\n this.socket.send(JSON.stringify({\n type: 'event',\n event,\n data\n }));\n }\n\n listen(event: IcpEvents): Observable<any> {\n switch (event) {\n case IcpEvents.SESSION_JOINED: {\n return this.sessionJoined$.asObservable();\n }\n case IcpEvents.PRESENTER_UPDATED: {\n return this.presenterUpdated$.asObservable();\n }\n case IcpEvents.CLIENT_DISCONNECTED: {\n return this.clientDisconnected$.asObservable();\n }\n case IcpEvents.PARTICIPANTS_UPDATED: {\n return this.participantUpdated$.asObservable();\n }\n case IcpEvents.NEW_PARTICIPANT_JOINED: {\n return this.newParticipantJoined$.asObservable();\n }\n case IcpEvents.SCREEN_UPDATED: {\n return this.screenUpdated$.asObservable();\n }\n default: {\n break;\n }\n }\n }\n\n messageEventHandller(eventName: string, data: any) {\n switch (eventName) {\n case IcpEvents.SESSION_JOINED: {\n this.sessionJoined$.next(data);\n break;\n }\n case IcpEvents.PRESENTER_UPDATED: {\n this.presenterUpdated$.next(data);\n break;\n }\n case IcpEvents.CLIENT_DISCONNECTED: {\n this.clientDisconnected$.next();\n break;\n }\n case IcpEvents.PARTICIPANTS_UPDATED: {\n this.participantUpdated$.next(data);\n break;\n }\n case IcpEvents.NEW_PARTICIPANT_JOINED: {\n this.newParticipantJoined$.next();\n break;\n }\n case IcpEvents.SCREEN_UPDATED: {\n this.screenUpdated$.next(data);\n break;\n }\n }\n }\n\n getSocketClient(url: string): Observable<WebSocket> {\n this.socket = new WebSocket(url, 'json.webpubsub.azure.v1');\n return of(this.socket);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { SocketService } from './socket.service';\nimport { IcpParticipant, IcpScreenUpdate, IcpSession } from './icp.interfaces';\nimport { IcpEvents } from './icp.events';\n\n@Injectable()\nexport class IcpUpdateService {\n\n session: IcpSession;\n\n constructor(private socket: SocketService) { }\n\n joinSession(username: string, session: IcpSession) {\n this.session = session;\n this.socket.connect(session.connectionUrl);\n this.socket.connected().subscribe(isConnected => {\n if (isConnected) {\n this.socket.join({ ...this.session, username });\n }\n });\n return this.socket.listen(IcpEvents.SESSION_JOINED);\n }\n\n leaveSession() {\n this.socket.leave(this.session);\n }\n\n newParticipantJoined() {\n return this.socket.listen(IcpEvents.NEW_PARTICIPANT_JOINED);\n }\n\n clientDisconnected() {\n return this.socket.listen(IcpEvents.CLIENT_DISCONNECTED);\n }\n\n removeParticipant(participantId) {\n this.socket.emit(IcpEvents.REMOVE_PARTICIPANT, {\n participantId: participantId, caseId: this.session.caseId\n });\n }\n\n participantListUpdated() {\n return this.socket.listen(IcpEvents.PARTICIPANTS_UPDATED);\n }\n\n updatePresenter(presenter: IcpParticipant) {\n this.socket.emit(IcpEvents.UPDATE_PRESENTER, {\n ...this.session, presenterId: presenter.id, presenterName: presenter.username\n });\n }\n\n presenterUpdated() {\n return this.socket.listen(IcpEvents.PRESENTER_UPDATED);\n }\n\n updateScreen(screen: IcpScreenUpdate) {\n const update = { body: screen, caseId: this.session.caseId };\n this.socket.emit(IcpEvents.UPDATE_SCREEN, update);\n }\n\n screenUpdated() {\n return this.socket.listen(IcpEvents.SCREEN_UPDATED);\n }\n}\n","import { createSelector } from '@ngrx/store';\nimport * as fromFeature from '../reducers/reducers';\nimport * as fromIcp from '../reducers/icp.reducer';\n\nexport const getIcpState = createSelector(\n fromFeature.getMVState,\n (state: fromFeature.State) => state.icp\n);\n\nexport const getIcpSession = createSelector(\n getIcpState,\n fromIcp.getIcpSession\n);\n\nexport const getCaseId = createSelector(\n getIcpSession,\n session => session === null ? null : session.caseId\n);\n\nexport const getPresenter = createSelector(\n getIcpState,\n fromIcp.getPresenter\n);\n\nexport const getPresenterName = createSelector(\n getPresenter,\n presenter => presenter === null ? null : presenter.username\n);\n\nexport const getClient = createSelector(\n getIcpState,\n fromIcp.getClient\n);\n\nexport const isPresenter = createSelector(\n getPresenter,\n getClient,\n (presenter, client) => presenter === null ? undefined : presenter.id === client.id // isPresenter is called when = false.\n);\n\nexport const getParticipants = createSelector(\n getIcpState,\n fromIcp.getParticipants\n);\n","import { Injectable } from '@angular/core';\nimport { ToolbarEventService } from '../toolbar/toolbar-event.service';\nimport { select, Store } from '@ngrx/store';\nimport * as fromDocSelectors from '../store/selectors/document.selectors';\nimport { Subscription } from 'rxjs';\nimport { IcpUpdateService } from './icp-update.service';\nimport { IcpState, IcpScreenUpdate, IcpSession, IcpParticipant } from './icp.interfaces';\nimport * as fromIcpSelectors from '../store/selectors/icp.selectors';\nimport { PdfPosition } from '../store/reducers/document.reducer';\n\n@Injectable()\nexport class IcpPresenterService {\n\n session: IcpSession;\n presenter: IcpParticipant;\n pdfPosition: PdfPosition;\n\n $subscription: Subscription;\n\n constructor(private readonly toolbarEvents: ToolbarEventService,\n private readonly socketService: IcpUpdateService,\n private store: Store<IcpState>) {}\n\n update(isPresenter: boolean) {\n if (isPresenter) {\n this.subscribe();\n } else {\n this.unsubscribe();\n }\n }\n\n subscribe() {\n if (!this.$subscription) {\n this.$subscription = this.store.pipe(select(fromDocSelectors.getPdfPosition)).subscribe(pdfPosition => {\n this.pdfPosition = pdfPosition;\n this.onPositionUpdate(pdfPosition);\n });\n this.$subscription.add(this.store.pipe(select(fromIcpSelectors.getPresenter)).subscribe(presenter => {\n this.presenter = presenter;\n }));\n this.$subscription.add(this.socketService.newParticipantJoined().subscribe(() => this.onNewParticipantJoined()));\n }\n }\n\n unsubscribe() {\n if (this.$subscription) {\n this.$subscription.unsubscribe();\n this.$subscription = undefined;\n }\n }\n\n onPositionUpdate(pdfPosition: PdfPosition) {\n const screen: IcpScreenUpdate = { pdfPosition, document: undefined };\n this.socketService.updateScreen(screen);\n }\n\n onNewParticipantJoined() {\n this.onPositionUpdate(this.pdfPosition);\n this.socketService.updatePresenter(this.presenter);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ToolbarEventService } from '../toolbar/toolbar-event.service';\nimport { select, Store } from '@ngrx/store';\nimport { Subscription } from 'rxjs';\nimport { IcpUpdateService } from './icp-update.service';\nimport { ViewerEventService } from '../viewers/viewer-event.service';\nimport { take } from 'rxjs/operators';\nimport { IcpState, IcpSession } from './icp.interfaces';\nimport * as fromDocSelectors from '../store/selectors/document.selectors';\n\n@Injectable()\nexport class IcpFollowerService {\n\n session: IcpSession;\n\n $subscription: Subscription;\n\n constructor(private readonly toolbarEvents: ToolbarEventService,\n private readonly viewerEvents: ViewerEventService,\n private readonly socketService: IcpUpdateService,\n private store: Store<IcpState>) {}\n\n\n update(isFollower: boolean) {\n if (isFollower) {\n this.subscribe();\n } else {\n this.unsubscribe();\n }\n }\n\n subscribe() {\n if (!this.$subscription) {\n this.$subscription = this.socketService.screenUpdated()\n .subscribe(screen => this.followScreenUpdate(screen));\n }\n }\n\n unsubscribe() {\n if (this.$subscription) {\n this.$subscription.unsubscribe();\n this.$subscription = undefined;\n }\n }\n\n followScreenUpdate({ pdfPosition }) {\n if (pdfPosition) {\n this.viewerEvents.goToDestination([\n pdfPosition.pageNumber - 1,\n { 'name': 'XYZ' },\n pdfPosition.left,\n pdfPosition.top\n ]);\n }\n this.store.pipe(select(fromDocSelectors.getPdfPosition), take(1))\n .subscribe(position => {\n const rotationDelta = (pdfPosition.rotation - position.rotation) % 360;\n if (rotationDelta !== 0) {\n this.toolbarEvents.rotate(rotationDelta);\n }\n });\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { IcpParticipant, IcpState } from './icp.interfaces';\nimport { Subscription } from 'rxjs';\nimport { ToolbarEventService } from '../toolbar/toolbar-event.service';\nimport { ViewerEventService } from '../viewers/viewer-event.service';\nimport { IcpUpdateService } from './icp-update.service';\nimport { IcpPresenterService } from './icp-presenter.service';\nimport { IcpFollowerService } from './icp-follower.service';\nimport { select, Store } from '@ngrx/store';\nimport * as fromIcpActions from '../store/actions/icp.actions';\nimport * as fromIcpSelectors from '../store/selectors/icp.selectors';\nimport { filter, take } from 'rxjs/operators';\n\n@Injectable()\nexport class IcpService implements OnDestroy {\n\n caseId: string;\n client: IcpParticipant;\n presenter: IcpParticipant;\n isPresenter: boolean;\n\n subscription: Subscription;\n sessionSubscription: Subscription;\n\n constructor(private readonly toolbarEvents: ToolbarEventService,\n private readonly viewerEvents: ViewerEventService,\n private readonly socketService: IcpUpdateService,\n private readonly presenterSubscriptions: IcpPresenterService,\n private readonly followerSubscriptions: IcpFollowerService,\n private store: Store<IcpState>) {\n this.subscription = this.store.pipe(select(fromIcpSelectors.getCaseId), filter(value => !!value)).subscribe(caseId => {\n this.caseId = caseId;\n });\n this.subscription.add(this.toolbarEvents.icp.sessionLaunch.subscribe(() => {\n if (this.caseId) { this.launchSession(); }\n }));\n }\n\n ngOnDestroy() {\n this.unsubscribeSession();\n this.subscription.unsubscribe();\n }\n\n launchSession() {\n this.store.dispatch(new fromIcpActions.LoadIcpSession(this.caseId));\n this.subscription.add(this.store.pipe(select(fromIcpSelectors.getIcpSession),\n filter(value => !!value && Object.keys(value).length > 1 ),\n take(1)).subscribe(() => { this.setUpSessionSubscriptions(); }));\n }\n\n setUpSessionSubscriptions() {\n this.sessionSubscription = this.toolbarEvents.icp.becomingPresenter.subscribe(() => this.becomePresenter());\n this.sessionSubscription.add(this.toolbarEvents.icp.stoppingPresenting.subscribe(() => this.stopPresenting()));\n this.sessionSubscription.add(this.toolbarEvents.icp.sessionExitConfirmed.subscribe(() => this.leavePresentation()));\n this.sessionSubscription.add(\n this.store.pipe(select(fromIcpSelectors.getPresenter)).subscribe(presenter => this.presenter = presenter )\n );\n this.sessionSubscription.add(this.store.pipe(select(fromIcpSelectors.getClient)).subscribe(client => this.client = client));\n this.sessionSubscription.add(this.store.pipe(select(fromIcpSelectors.isPresenter)).subscribe(isPresenter => {\n this.isPresenter = isPresenter;\n this.presenterSubscriptions.update(isPresenter);\n this.followerSubscriptions.update(!isPresenter);\n }));\n this.sessionSubscription.add(this.socketService.clientDisconnected().subscribe(cli => this.clientDisconnected(cli)));\n this.sessionSubscription.add(this.socketService.presenterUpdated().subscribe(pres => {\n this.store.dispatch(new fromIcpActions.IcpPresenterUpdated(pres));\n }));\n this.sessionSubscription.add(this.socketService.participantListUpdated().subscribe(participants => {\n this.store.dispatch(new fromIcpActions.IcpParticipantListUpdated(participants));\n }));\n }\n\n unsubscribeSession() {\n this.presenterSubscriptions.update(false);\n this.followerSubscriptions.update(false);\n this.sessionSubscription.unsubscribe();\n }\n\n leavePresentation() {\n if (this.isPresenter) {\n this.stopPresenting();\n }\n this.removeParticipant(this.client.id);\n this.socketService.leaveSession();\n this.store.dispatch(new fromIcpActions.LeaveIcpSocketSession());\n this.unsubscribeSession();\n }\n\n stopPresenting() {\n const presenter: IcpParticipant = {username: '', id: ''};\n this.socketService.updatePresenter(presenter);\n }\n\n becomePresenter() {\n this.socketService.updatePresenter(this.client);\n }\n\n clientDisconnected(client) {\n if (client === this.presenter.id) {\n this.stopPresenting();\n }\n this.removeParticipant(client);\n }\n\n removeParticipant(participantId) {\n this.socketService.removeParticipant(participantId);\n }\n}\n","import {\n AfterContentInit,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { asyncScheduler, BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { filter, tap, throttleTime } from 'rxjs/operators';\nimport { select, Store } from '@ngrx/store';\n\nimport { DocumentLoadProgress, PageEvent, PdfJsWrapper } from './pdf-js/pdf-js-wrapper';\nimport { PdfJsWrapperFactory } from './pdf-js/pdf-js-wrapper.provider';\nimport { AnnotationSet } from '../../annotations/annotation-set/annotation-set.model';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\nimport { PrintService } from '../../print.service';\nimport { ResponseType, ViewerException } from '../viewer-exception.model';\nimport { ToolbarButtonVisibilityService } from '../../toolbar/toolbar-button-visibility.service';\nimport { CommentSetComponent } from '../../annotations/comment-set/comment-set.component';\nimport { Outline } from './side-bar/outline-item/outline.model';\nimport * as fromStore from '../../store/reducers/reducers';\nimport * as fromDocumentActions from '../../store/actions/document.actions';\nimport { PdfPositionUpdate } from '../../store/actions/document.actions';\nimport * as fromTagActions from '../../store/actions/tag.actions';\nimport { SetCaseId } from '../../store/actions/icp.actions';\nimport * as fromDocumentsSelector from '../../store/selectors/document.selectors';\nimport { IcpState } from '../../icp/icp.interfaces';\nimport { ViewerEventService } from '../viewer-event.service';\nimport { IcpService } from '../../icp/icp.service';\n\n@Component({\n selector: 'mv-pdf-viewer',\n templateUrl: './pdf-viewer.component.html',\n encapsulation: ViewEncapsulation.None\n})\nexport class PdfViewerComponent implements AfterContentInit, OnChanges, OnDestroy {\n\n @Output() mediaLoadStatus = new EventEmitter<ResponseType>();\n @Output() pdfViewerException = new EventEmitter<ViewerException>();\n @Output() documentTitle = new EventEmitter<string>();\n\n @Input() downloadUrl: string;\n @Input() url: string;\n @Input() downloadFileName: string;\n\n @Input() enableAnnotations: boolean;\n @Input() enableRedactions: boolean;\n @Input() enableICP: boolean;\n @Input() annotationSet: AnnotationSet | null;\n @Input() enableRedactSearch: AnnotationSet | null;\n\n @Input() height: string;\n pageHeights = [];\n rotation = 0;\n zoom = 1;\n\n @Input() caseId: string;\n\n highlightMode: Observable<boolean>;\n drawMode: BehaviorSubject<boolean>;\n\n documentOutline: Outline;\n loadingDocument = false;\n loadingDocumentProgress: number;\n errorMessage: string;\n hasDifferentPageSize = false;\n\n @ViewChild('viewerContainer', {static: true}) viewerContainer: ElementRef<HTMLDivElement>;\n @ViewChild('pdfViewer', {static: false}) pdfViewer: ElementRef<HTMLDivElement>;\n\n private pdfWrapper: PdfJsWrapper;\n private $subscription: Subscription;\n private viewerException: ViewerException;\n showCommentsPanel: boolean;\n showIcpParticipantsList: boolean;\n enableGrabNDrag = false;\n\n constructor(\n private store: Store<fromStore.AnnotationSetState>,\n private icpStore: Store<IcpState>,\n private readonly pdfJsWrapperFactory: PdfJsWrapperFactory,\n private readonly printService: PrintService,\n public readonly toolbarEvents: ToolbarEventService,\n private readonly viewerEvents: ViewerEventService,\n private icpService: IcpService,\n public readonly toolbarButtons: ToolbarButtonVisibilityService,\n ) {\n this.highlightMode = toolbarEvents.highlightModeSubject.pipe(tap(() => {\n this.store.dispatch(new fromTagActions.ClearFilterTags());\n }));\n this.drawMode = toolbarEvents.drawModeSubject;\n }\n\n async ngAfterContentInit(): Promise<void> {\n this.pdfWrapper.documentLoadProgress.subscribe(v => this.onDocumentLoadProgress(v));\n this.pdfWrapper.documentLoaded.subscribe(() => this.onDocumentLoaded());\n this.pdfWrapper.documentLoadFailed.subscribe((error) => this.onDocumentLoadFailed(error));\n this.pdfWrapper.outlineLoaded.subscribe(outline => this.documentOutline = outline);\n this.pdfWrapper.pageRendered.subscribe((event) => this.updatePages(event));\n this.$subscription = this.toolbarEvents.printSubject\n .subscribe(() => this.printService.printDocumentNatively(this.url));\n this.$subscription.add(this.toolbarEvents.downloadSubject.subscribe(() =>\n this.pdfWrapper.downloadFile(this.downloadUrl || this.url, this.downloadFileName)\n ));\n this.$subscription.add(this.toolbarEvents.rotateSubject.subscribe(rotate => this.rotateDocument(rotate)));\n this.$subscription.add(this.toolbarEvents.zoomSubject.subscribe(zoom => this.setZoom(zoom)));\n this.$subscription.add(this.toolbarEvents.stepZoomSubject.subscribe(zoom => this.stepZoom(zoom)));\n this.$subscription.add(this.toolbarEvents.searchSubject.subscribe(search => this.pdfWrapper.search(search)));\n this.$subscription.add(\n this.toolbarEvents.setCurrentPageSubject.subscribe(pageNumber => this.pdfWrapper.setPageNumber(pageNumber))\n );\n this.$subscription.add(\n this.toolbarEvents.changePageByDeltaSubject.subscribe(pageNumber => this.pdfWrapper.changePageNumber(pageNumber))\n );\n this.$subscription.add(this.toolbarEvents.grabNDrag.subscribe(grabNDrag => this.enableGrabNDrag = grabNDrag));\n this.$subscription.add(this.toolbarEvents.commentsPanelVisible.subscribe(toggle => {\n this.showCommentsPanel = toggle;\n })\n );\n this.$subscription.add(this.viewerEvents.navigationEvent.subscribe(dest => this.goToDestination(dest)));\n this.$subscription.add(\n this.toolbarEvents.icp.participantsListVisible.subscribe(toggle => this.showIcpParticipantsList = toggle)\n );\n this.$subscription.add(this.pdfWrapper.positionUpdated.asObservable()\n .pipe(throttleTime(500, asyncScheduler, { leading: true, trailing: true }))\n .subscribe(event => this.store.dispatch(new PdfPositionUpdate(event.location)))\n );\n }\n\n async ngOnChanges(changes: SimpleChanges) {\n if (!this.pdfWrapper) {\n this.pdfWrapper = this.pdfJsWrapperFactory.create(this.viewerContainer);\n }\n if (changes.url && this.pdfWrapper) {\n await this.loadDocument();\n if (this.enableRedactions) {\n this.toolbarEvents.redactionMode.pipe(filter(value => !!value))\n .subscribe(() => this.resetRotation());\n }\n }\n if (changes.caseId) {\n this.icpStore.dispatch(new SetCaseId(this.caseId));\n }\n }\n\n resetRotation() {\n if (this.hasDifferentPageSize) {\n this.pdfWrapper.resetRotation(0);\n this.rotation = 0;\n }\n }\n\n ngOnDestroy(): void {\n this.$subscription.unsubscribe();\n }\n\n private async loadDocument() {\n this.initDocumentProgress();\n await this.pdfWrapper.loadDocument(this.url);\n this.documentTitle.emit(this.pdfWrapper.getCurrentPDFTitle());\n this.setPageHeights();\n this.$subscription.add(this.store.pipe(select(fromDocumentsSelector.getPageDifference))\n .subscribe(hasDifferentPageSie => this.hasDifferentPageSize = hasDifferentPageSie));\n }\n\n private onDocumentLoadProgress(progress: DocumentLoadProgress) {\n if (progress.total) {\n this.loadingDocumentProgress = Math.min(100, Math.ceil(progress.loaded / progress.total * 100));\n }\n }\n\n private onDocumentLoaded() {\n this.loadingDocument = false;\n this.mediaLoadStatus.emit(ResponseType.SUCCESS);\n }\n\n private onDocumentLoadFailed(error: Error) {\n this.loadingDocument = false;\n this.viewerException = new ViewerException(error.name, { message: error.message });\n this.errorMessage = `Could not load the document \"${this.url}\"`;\n\n this.mediaLoadStatus.emit(ResponseType.FAILURE);\n this.pdfViewerException.emit(this.viewerException);\n }\n\n private updatePages(event: PageEvent[]) {\n if (this.enableAnnotations) {\n this.store.dispatch(new fromDocumentActions.AddPages(event));\n }\n }\n\n @Input()\n set searchBarHidden(hidden: boolean) {\n if (this.pdfWrapper && hidden) {\n this.pdfWrapper.clearSearch();\n }\n }\n\n toggleCommentsSummary() {\n this.toolbarEvents.toggleCommentsSummary(!this.toolbarEvents.showCommentSummary.getValue());\n }\n\n private rotateDocument(rotation: number) {\n const pageNumber = this.pdfWrapper.getPageNumber();\n this.pdfWrapper.rotate(rotation);\n this.pdfWrapper.setPageNumber(pageNumber);\n this.rotation = (this.rotation + rotation) % 360;\n\n this.setPageHeights();\n }\n\n private initDocumentProgress() {\n this.loadingDocument = true;\n this.loadingDocumentProgress = null;\n this.errorMessage = null;\n }\n\n private setZoom(zoomFactor: number) {\n if (!isNaN(zoomFactor)) {\n this.pdfWrapper.setZoom(zoomFactor);\n this.zoom = this.calculateZoomValue(zoomFactor);\n this.setPageHeights();\n }\n }\n\n private stepZoom(zoomFactor: number) {\n if (!isNaN(zoomFactor)) {\n this.pdfWrapper.stepZoom(zoomFactor);\n this.zoom = this.calculateZoomValue(this.zoom, zoomFactor);\n this.setPageHeights();\n }\n }\n\n setPageHeights() {\n this.pageHeights = [];\n const pdfViewerChildren = this.pdfViewer.nativeElement.children;\n for (let i = 0; i < pdfViewerChildren.length; i++) {\n this.pageHeights.push(pdfViewerChildren[i].clientHeight);\n }\n }\n\n calculateZoomValue(zoomValue, increment = 0) {\n const newZoomValue = zoomValue + increment;\n if (newZoomValue > 5) {\n return 5;\n }\n if (newZoomValue < 0.1) {\n return 0.1;\n }\n return +newZoomValue.toFixed(2);\n }\n\n private goToDestination(destination: any[]) {\n this.pdfWrapper.navigateTo(destination);\n }\n\n getCurrentPageNumber(): number {\n return this.pdfWrapper.getPageNumber();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ViewerUtilService {\n constructor(\n private http: HttpClient) {\n }\n\n public validateFile(url: string) {\n return this.http.head(url);\n }\n}\n","import {\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { PrintService } from '../../print.service';\nimport { AnnotationSet } from '../../annotations/annotation-set/annotation-set.model';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\nimport { ResponseType, ViewerException } from '../viewer-exception.model';\nimport { ViewerUtilService } from '../viewer-util.service';\nimport { ToolbarButtonVisibilityService } from '../../toolbar/toolbar-button-visibility.service';\nimport { Store } from '@ngrx/store';\nimport * as fromStore from '../../store/reducers/reducers';\nimport * as fromDocument from '../../store/actions/document.actions';\nimport * as fromAnnotationActions from '../../store/actions/annotation.actions';\nimport { ViewerEventService } from '../viewer-event.service';\n\n@Component({\n selector: 'mv-image-viewer',\n templateUrl: './image-viewer.component.html'\n})\nexport class ImageViewerComponent implements OnInit, OnDestroy, OnChanges {\n\n @Input() url: string;\n @Input() downloadFileName: string;\n\n @Input() enableAnnotations: boolean;\n @Input() annotationSet: AnnotationSet | null;\n\n @Input() height: string;\n\n @Output() mediaLoadStatus = new EventEmitter<ResponseType>();\n @Output() imageViewerException = new EventEmitter<ViewerException>();\n\n errorMessage: string;\n\n @ViewChild('img', {static: false}) img: ElementRef;\n rotation = 0;\n zoom = 1;\n\n private subscriptions: Subscription[] = [];\n private viewerException: ViewerException;\n private response: Subscription;\n\n showCommentsPanel: boolean;\n enableGrabNDrag = false;\n imageHeight: number;\n imageWidth: number;\n imageLeft: number;\n imageTop: number;\n\n constructor(\n private store: Store<fromStore.AnnotationSetState>,\n private readonly printService: PrintService,\n private readonly viewerUtilService: ViewerUtilService,\n public readonly toolbarEvents: ToolbarEventService,\n public readonly toolbarButtons: ToolbarButtonVisibilityService,\n private viewerEvents: ViewerEventService,\n ) { }\n\n ngOnInit(): void {\n this.subscriptions.push(\n this.toolbarEvents.rotateSubject.subscribe(rotation => this.rotateImage(rotation)),\n this.toolbarEvents.zoomSubject.subscribe(zoom => this.setZoom(zoom)),\n this.toolbarEvents.stepZoomSubject.subscribe(zoom => this.stepZoom(zoom)),\n this.toolbarEvents.printSubject.subscribe(() => this.printService.printDocumentNatively(this.url)),\n this.toolbarEvents.downloadSubject.subscribe(() => this.download()),\n this.toolbarEvents.grabNDrag.subscribe(grabNDrag => this.enableGrabNDrag = grabNDrag),\n this.toolbarEvents.commentsPanelVisible.subscribe(toggle => this.showCommentsPanel = toggle)\n );\n }\n\n @HostListener('mousedown', ['$event'])\n onImageViewerClick(event: MouseEvent) {\n const classNme = (event.target as Element).className;\n if (classNme.startsWith('pageContainer')) {\n this.store.dispatch(\n new fromAnnotationActions.SelectedAnnotation({\n annotationId: '',\n selected: false,\n editable: false,\n })\n );\n this.viewerEvents.clearCtxToolbar();\n }\n }\n\n ngOnDestroy(): void {\n this.subscriptions.filter(subscription => !subscription.closed)\n .forEach(subscription => subscription.unsubscribe());\n if (this.response) {\n this.response.unsubscribe();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.url) {\n this.errorMessage = null;\n this.toolbarEvents.reset();\n }\n }\n\n private rotateImage(rotation: number) {\n this.rotation = (this.rotation + rotation) % 360;\n this.initAnnoPage(this.img.nativeElement);\n }\n\n private async setZoom(zoomFactor: number) {\n if (!isNaN(zoomFactor)) {\n await this.setZoomValue(this.calculateZoomValue(zoomFactor));\n this.img.nativeElement.width = this.img.nativeElement.naturalWidth * this.zoom;\n this.initAnnoPage(this.img.nativeElement);\n }\n }\n\n private async stepZoom(zoomFactor: number) {\n if (!isNaN(zoomFactor)) {\n await this.setZoomValue(this.calculateZoomValue(this.zoom, zoomFactor));\n this.img.nativeElement.width = this.img.nativeElement.naturalWidth * this.zoom;\n this.initAnnoPage(this.img.nativeElement);\n }\n }\n\n private download() {\n const a = document.createElement('a');\n document.body.appendChild(a);\n a.setAttribute('style', 'display: none');\n a.href = this.url;\n a.download = this.downloadFileName;\n a.click();\n a.remove();\n }\n\n // the returned promise is a work-around\n setZoomValue(zoomValue) {\n return new Promise((resolve) => {\n this.zoom = zoomValue;\n this.toolbarEvents.zoomValueSubject.next(zoomValue);\n resolve(true);\n });\n }\n\n calculateZoomValue(zoomValue, increment = 0) {\n const newZoomValue = zoomValue + increment;\n if (newZoomValue > 5) { return 5; }\n if (newZoomValue < 0.1) { return 0.1; }\n return +newZoomValue.toFixed(2);\n }\n\n onLoadError(url) {\n this.response = this.viewerUtilService.validateFile(url)\n .subscribe(\n next => next,\n error => {\n this.viewerException = new ViewerException(error.name,\n { httpResponseCode: error.status, message: error.message });\n });\n\n this.errorMessage = `Could not load the image \"${this.url}\"`;\n this.mediaLoadStatus.emit(ResponseType.FAILURE);\n this.imageViewerException.emit(this.viewerException);\n }\n\n onLoad(img: any) {\n this.mediaLoadStatus.emit(ResponseType.SUCCESS);\n this.initAnnoPage(img);\n }\n\n initAnnoPage(img: any) {\n this.imageHeight = this.rotation % 180 !== 0 ? img.offsetWidth : img.offsetHeight;\n this.imageWidth = this.rotation % 180 !== 0 ? img.offsetHeight : img.offsetWidth;\n this.imageLeft = this.rotation % 180 !== 0 ? img.offsetTop : img.offsetLeft;\n this.imageTop = this.rotation % 180 !== 0 ? img.offsetLeft : img.offsetTop;\n const payload: any = [{\n div: {\n scrollHeight: this.imageHeight,\n scrollWidth: this.imageWidth,\n offsetLeft: this.imageLeft,\n },\n pageNumber: 1,\n scale: this.zoom,\n rotation: this.rotation,\n id: 1\n }];\n\n this.store.dispatch(new fromDocument.AddPages(payload));\n }\n\n toggleCommentsSummary() {\n this.toolbarEvents.toggleCommentsSummary(!this.toolbarEvents.showCommentSummary.getValue());\n }\n}\n","import { Component, ElementRef, Input, OnInit, ViewChild, OnDestroy, Output, EventEmitter } from '@angular/core';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\nimport { Subscription } from 'rxjs';\nimport { ResponseType, ViewerException } from '../viewer-exception.model';\nimport { ViewerUtilService } from '../viewer-util.service';\n\n@Component({\n selector: 'mv-unsupported-viewer',\n templateUrl: './unsupported-viewer.component.html'\n})\nexport class UnsupportedViewerComponent implements OnInit, OnDestroy {\n\n @Input() url: string;\n @Input() downloadFileName: string;\n @Input() typeException: boolean;\n\n @Output() loadStatus = new EventEmitter<ResponseType>();\n @Output() unsupportedViewerException = new EventEmitter<ViewerException>();\n\n @ViewChild('downloadLink', {static: false}) downloadLink: ElementRef;\n\n private subscriptions: Subscription[] = [];\n private viewerException: ViewerException;\n\n constructor(\n public readonly toolbarEvents: ToolbarEventService,\n private readonly viewerUtilService: ViewerUtilService,\n ) {}\n\n public ngOnInit(): void {\n this.subscriptions.push(\n this.toolbarEvents.downloadSubject.subscribe(() => this.downloadLink.nativeElement.click()),\n this.viewerUtilService.validateFile(this.url).subscribe(\n next => next,\n error => {\n this.viewerException = new ViewerException(error.name,\n { httpResponseCode: error.status, message: error.message });\n }\n )\n );\n\n this.loadStatus.emit(ResponseType.UNSUPPORTED);\n\n if (!this.typeException) {\n this.unsupportedViewerException.emit(this.viewerException);\n }\n }\n\n ngOnDestroy(): void {\n for (const subscription of this.subscriptions) {\n subscription.unsubscribe();\n }\n }\n\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\n\nimport { AnnotationSet } from '../../annotation-set/annotation-set.model';\nimport { Annotation } from '../../annotation-set/annotation-view/annotation.model';\nimport { Comment } from '../../comment-set/comment/comment.model';\n\n@Injectable()\nexport class AnnotationApiService {\n\n public annotationApiUrl = '/em-anno';\n\n private annotationSetBaseUrl = '/annotation-sets';\n private annotationBaseUrl = '/annotations';\n\n constructor(\n private readonly httpClient: HttpClient\n ) {}\n\n public getAnnotationSet(documentId: string): Observable<any> { // todo add model\n const fixedUrl = `${this.annotationSetsFullUrl}/filter?documentId=${documentId}`;\n return this.httpClient\n .get<AnnotationSet>(fixedUrl, { observe: 'response' , withCredentials: true });\n }\n\n public postAnnotationSet(body: Partial<AnnotationSet>): Observable<AnnotationSet> {\n return this.httpClient\n .post<AnnotationSet>(this.annotationSetsFullUrl, body, { observe: 'response' , withCredentials: true })\n .pipe(\n map(response => response.body),\n catchError(() => [])\n );\n }\n\n public getComments(annotationSet: Observable<AnnotationSet>): Observable<Comment[]> {\n return annotationSet\n .pipe(\n map(this.sortAnnotations),\n map(this.extractComments)\n );\n }\n\n /**\n * Sort the annotations in the response by page and then y position of their first rectangle\n */\n private sortAnnotations(r: AnnotationSet): Annotation[] {\n return r.annotations.sort((a, b) => a.page !== b.page ? a.page - b.page : a.rectangles[0].y - b.rectangles[0].y);\n }\n\n private extractComments(annotations: Annotation[]) {\n return [].concat(...annotations.map(a => a.comments));\n }\n\n public deleteAnnotation(annotationId: string): Observable<null> {\n const url = `${this.annotationFullsUrl}/${annotationId}`;\n\n return this.httpClient\n .delete<null>(url, { observe: 'response' , withCredentials: true })\n .pipe(map(response => response.body));\n }\n\n public postAnnotation(annotation: Partial<Annotation>): Observable<Annotation> {\n return this.httpClient\n .post<Annotation>(this.annotationFullsUrl, annotation, { observe: 'response' , withCredentials: true })\n .pipe(map(response => response.body));\n }\n\n get annotationSetsFullUrl() {\n return this.annotationApiUrl + this.annotationSetBaseUrl;\n }\n\n get annotationFullsUrl() {\n return this.annotationApiUrl + this.annotationBaseUrl;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { CommentSetComponent } from '../comment-set.component';\nimport { Annotation } from '../../annotation-set/annotation-view/annotation.model';\nimport { CommentComponent } from './comment.component';\n\n// TODO: replace by NgRx\n@Injectable()\nexport class CommentService {\n\n public readonly unsavedChanges = new Subject<boolean>();\n public readonly marginToCommentEmitter = new BehaviorSubject<boolean>(false);\n commentSetComponent: CommentSetComponent;\n\n setCommentSet(commentSetComponent) {\n this.commentSetComponent = commentSetComponent;\n }\n\n onCommentChange(changes: boolean): void {\n this.unsavedChanges.next(changes);\n }\n\n getUnsavedChanges(): Observable<boolean> {\n return this.unsavedChanges.asObservable();\n }\n\n hasUnsavedComments(annotation: Annotation): boolean {\n if (annotation.comments.length > 0) {\n const comment = this.getComment(annotation);\n return comment.hasUnsavedChanges;\n }\n return false;\n }\n\n updateUnsavedCommentsStatus(annotation: Annotation, hasUnsavedChanges: boolean): void {\n const comment = this.getComment(annotation);\n comment.hasUnsavedChanges = hasUnsavedChanges;\n this.allCommentsSaved();\n }\n\n getComment(annotation: Annotation): CommentComponent {\n return this.commentSetComponent.commentComponents\n .find(c => c.comment.annotationId === annotation.comments[0].annotationId);\n }\n\n resetCommentSet(): void {\n this.commentSetComponent = null;\n }\n\n allCommentsSaved(): void {\n this.onCommentChange(this.commentSetComponent.commentComponents.some(comment => comment.hasUnsavedChanges === true));\n }\n\n createMarginToCommentEvent(margin: boolean) {\n this.marginToCommentEmitter.next(margin);\n }\n}\n","import {createSelector} from '@ngrx/store';\nimport * as fromFeature from '../reducers/reducers';\nimport * as fromTags from '../reducers/tags.reducer';\n\nexport const getTagsRootState = createSelector(\n fromFeature.getMVState,\n (state: fromFeature.State) => state.tags\n);\n\nexport const getTagEntities = createSelector(\n getTagsRootState,\n fromTags.getTagNameEnt\n);\n\nexport const getTagFilters = createSelector(\n getTagsRootState,\n fromTags.getFilters\n);\n\nexport const getTagFiltered = createSelector(\n getTagsRootState,\n fromTags.getFilteredComments\n);\n\nexport const getFilteredPageEntities = createSelector(\n getTagsRootState,\n fromTags.getFilteredPageEnt\n);\n\nexport const getAllTagsArr = createSelector(\n getTagEntities,\n (tagEnt) => Object.keys(tagEnt).map(key => {\n return {\n key,\n length: Object.keys(tagEnt[key]).length\n };\n })\n);\n","import {\n AfterContentInit, AfterViewChecked,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport {\n defaultImageOptions, defaultMultimediaOptions,\n defaultPdfOptions,\n defaultUnsupportedOptions,\n ToolbarButtonVisibilityService\n} from './toolbar/toolbar-button-visibility.service';\nimport { AnnotationSet } from './annotations/annotation-set/annotation-set.model';\nimport { ToolbarEventService } from './toolbar/toolbar-event.service';\nimport { AnnotationApiService } from './annotations/services/annotation-api/annotation-api.service';\nimport { ResponseType, ViewerException } from './viewers/viewer-exception.model';\nimport { CommentService } from './annotations/comment-set/comment/comment.service';\nimport 'hammerjs';\nimport { select, Store } from '@ngrx/store';\nimport * as fromStore from './store/reducers/reducers';\nimport * as fromAnnoSelectors from './store/selectors/annotation.selectors';\nimport * as fromDocumentsSelector from './store/selectors/document.selectors';\nimport * as fromAnnoActions from './store/actions/annotation.actions';\nimport * as fromRedactActions from './store/actions/redaction.actions';\nimport * as fromDocumentActions from './store/actions/document.actions';\n\nenum CoreContentTypes {\n PDF = 'pdf',\n IMAGE = 'image'\n}\n\nenum MultimediaContentTypes {\n MP4 = 'mp4',\n MP3 = 'mp3',\n}\n\nenum ConvertibleContentTypes {\n EXCEL = 'excel',\n WORD = 'word',\n POWERPOINT = 'powerpoint',\n TXT = 'txt',\n RTF = 'rtf'\n}\n\n@Component({\n selector: 'mv-media-viewer',\n templateUrl: './media-viewer.component.html',\n encapsulation: ViewEncapsulation.None\n})\nexport class MediaViewerComponent implements OnChanges, OnDestroy, AfterContentInit, AfterViewChecked {\n\n @ViewChild('viewerRef', {static: false}) viewerRef: ElementRef;\n\n @Input() url;\n @Input() downloadFileName: string;\n @Input() contentType: string;\n\n @Input() showToolbar = true;\n @Input() toolbarButtonOverrides: any = {};\n\n @Input()\n public height: string;\n public viewerHeight: string;\n\n @Input() width = '100%';\n\n @Output() mediaLoadStatus = new EventEmitter<ResponseType>();\n @Output() viewerException = new EventEmitter<ViewerException>();\n @Output() toolbarEventsOutput = new EventEmitter<ToolbarEventService>();\n @Output() unsavedChanges = new EventEmitter<boolean>();\n\n @Input() enableAnnotations = false;\n @Input() annotationApiUrl;\n\n @Input() enableRedactions = false;\n @Input() enableICP = false;\n @Input() multimediaPlayerEnabled = false;\n @Input() enableRedactSearch = false;\n\n\n @Input() caseId: string;\n\n multimediaContent = false;\n convertibleContent = false;\n unsupportedContent = false;\n\n documentTitle: string;\n showCommentSummary: boolean;\n annotationSet$: Observable<AnnotationSet | {}>;\n hasScrollBar: boolean;\n typeException = false;\n hasDifferentPageSize$: Observable<boolean>;\n documentId: string;\n\n private $subscriptions: Subscription;\n private prevOffset: number;\n\n constructor(\n private store: Store<fromStore.AnnotationSetState>,\n public readonly toolbarButtons: ToolbarButtonVisibilityService,\n public readonly toolbarEvents: ToolbarEventService,\n private readonly api: AnnotationApiService,\n private readonly commentService: CommentService,\n private elRef: ElementRef,\n private cdr: ChangeDetectorRef\n ) {\n if (this.annotationApiUrl) {\n api.annotationApiUrl = this.annotationApiUrl;\n }\n }\n\n ngAfterContentInit() {\n this.annotationSet$ = this.store.pipe(select(fromAnnoSelectors.getAnnotationSet));\n this.hasDifferentPageSize$ = this.store.pipe(select(fromDocumentsSelector.getPageDifference));\n this.setToolbarButtons();\n this.toolbarEventsOutput.emit(this.toolbarEvents);\n this.$subscriptions = this.commentService.getUnsavedChanges()\n .subscribe(changes => this.onCommentChange(changes));\n this.$subscriptions.add(this.toolbarEvents.getShowCommentSummary()\n .subscribe(changes => this.showCommentSummary = changes));\n }\n\n ngAfterViewChecked(): void {\n if (this.height && this.viewerHeight !== this.height) {\n this.viewerHeight = this.height;\n this.cdr.detectChanges();\n return;\n }\n\n if (!this.height) {\n const compOffsetTop = this.elRef.nativeElement.getBoundingClientRect().top;\n const viewerOffsetTop = this.viewerRef.nativeElement.offsetTop;\n const offset = compOffsetTop + viewerOffsetTop;\n\n if (this.prevOffset !== offset) {\n this.viewerHeight = `calc(100vh - ${offset}px)`;\n this.prevOffset = offset;\n this.cdr.detectChanges();\n }\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.annotationApiUrl) {\n this.api.annotationApiUrl = this.annotationApiUrl;\n }\n\n if (changes.url) {\n this.toolbarEvents.reset();\n this.commentService.resetCommentSet();\n this.documentId = this.extractDMStoreDocId(this.url);\n this.store.dispatch(new fromDocumentActions.SetDocumentId(this.documentId));\n if (this.enableAnnotations && !(this.multimediaContent || this.unsupportedContent)) {\n this.store.dispatch(new fromAnnoActions.LoadAnnotationSet(this.documentId));\n }\n if (this.enableRedactions && !(this.multimediaContent || this.unsupportedContent) && this.documentId) {\n this.store.dispatch(new fromRedactActions.LoadRedactions(this.documentId));\n }\n if (this.contentType === 'image') {\n this.documentTitle = null;\n }\n }\n\n if (changes.contentType) {\n this.convertibleContent = this.needsConverting();\n this.multimediaContent = this.isMultimedia();\n this.unsupportedContent = !this.isSupported();\n }\n\n this.setToolbarButtons();\n this.detectOs();\n this.typeException = false;\n }\n\n ngOnDestroy() {\n this.$subscriptions.unsubscribe();\n }\n\n needsConverting(): boolean {\n return this.contentType !== null && Object.keys(ConvertibleContentTypes).includes(this.contentType.toUpperCase());\n }\n\n isMultimedia(): boolean {\n return this.contentType !== null && Object.keys(MultimediaContentTypes).includes(this.contentType.toUpperCase());\n }\n\n isSupported(): boolean {\n const supportedTypes = Object.assign({}, MultimediaContentTypes, ConvertibleContentTypes, CoreContentTypes);\n return this.contentType !== null && Object.keys(supportedTypes).includes(this.contentType.toUpperCase());\n }\n\n onMediaLoad(status: ResponseType) {\n this.mediaLoadStatus.emit(status);\n }\n\n setToolbarButtons() {\n if (this.contentType === CoreContentTypes.PDF || this.needsConverting()) {\n this.toolbarButtons.setup({\n ...defaultPdfOptions, showHighlightButton: this.enableAnnotations, showDrawButton: this.enableAnnotations,\n ...this.toolbarButtonOverrides\n });\n } else if (this.contentType === CoreContentTypes.IMAGE) {\n this.toolbarButtons.setup({\n ...defaultImageOptions, showDrawButton: this.enableAnnotations,\n ...this.toolbarButtonOverrides\n });\n } else if (this.isMultimedia()) {\n this.toolbarButtons.setup({\n ...defaultMultimediaOptions,\n ...this.toolbarButtonOverrides\n });\n } else {\n this.toolbarButtons.setup({\n ...defaultUnsupportedOptions,\n ...this.toolbarButtonOverrides\n });\n }\n }\n\n onLoadException(exception: ViewerException) {\n this.viewerException.emit(exception);\n if (!this.isSupported()) {\n this.typeException = false;\n } else {\n this.typeException = true;\n this.contentType = null;\n this.setToolbarButtons();\n }\n }\n\n onCommentChange(changes: boolean) {\n this.unsavedChanges.emit(changes);\n }\n\n onDocumentTitleChange(title: string) {\n this.documentTitle = title;\n }\n\n // If secure mode is enabled (which adds \"documentsv2\" to the documentId), get rid of it\n private extractDMStoreDocId(url: string): string {\n url = url.includes('/documents/') ? url.split('/documents/')[1] : url;\n url = url.includes('/documentsv2/') ? url.split('/documentsv2/')[1] : url;\n return url.replace('/binary', '');\n }\n\n detectOs() {\n this.hasScrollBar = window.navigator.userAgent.indexOf('Win') !== -1;\n }\n}\n","import {createSelector} from '@ngrx/store';\n\nimport * as fromFeature from '../reducers/reducers';\nimport * as fromAnnotations from '../reducers/annotations.reducer';\nimport * as fromTags from './tag.selectors';\nimport * as fromDocument from './document.selectors';\nimport {StoreUtils} from '../store-utils';\nimport moment from 'moment-timezone';\nexport const getAnnotationsSetState = createSelector(\n fromFeature.getMVState,\n (state: fromFeature.State) => state.annotations\n);\n\nexport const getAnnotationEntities = createSelector(\n getAnnotationsSetState,\n fromAnnotations.getAnnoEnt\n);\n\nexport const getSet = createSelector(\n getAnnotationsSetState,\n fromAnnotations.getAnnoSet\n);\n\nexport const getDocumentIdSetId = createSelector(\n getSet,\n (annoSet) => {\n return {\n documentId: annoSet.documentId,\n annotationSetId: annoSet.id\n };\n }\n);\n\nexport const getAnnotationSet = createSelector(\n getAnnotationEntities,\n getSet,\n (entities, set) => {\n return {\n ...set,\n annotations: Object.keys(entities).map(key => entities[key])\n };\n }\n);\n\nexport const getSelectedAnnotation = createSelector(\n getAnnotationsSetState,\n fromAnnotations.getSelectedAnno\n);\n\nexport const getCommentEntities = createSelector(\n getAnnotationsSetState,\n fromAnnotations.getCommentEnts\n);\n\n\nexport const getPageEntities = createSelector(\n getAnnotationsSetState,\n fromAnnotations.getAnnoPageEnt\n);\n\nexport const getComponentSearchQueries = createSelector(\n getAnnotationsSetState,\n fromAnnotations.commentSearchQ\n);\n\nexport const getComponentSearchText = createSelector(\n getComponentSearchQueries,\n (queries) => queries.commentSearch\n);\n\nexport const getCommentSummaryFilters = createSelector(\n getAnnotationsSetState,\n fromAnnotations.getSummaryFilters\n);\n\nexport const getAnnoPerPage = createSelector(\n fromDocument.getPages,\n getPageEntities,\n fromTags.getFilteredPageEntities,\n (pages, pageEnt, filteredPageEnt) => {\n const isFiltered: boolean = !!Object.keys(filteredPageEnt).length;\n const entities = isFiltered ? filteredPageEnt : pageEnt;\n if (pages) {\n const arr = [];\n Object.keys(pages).forEach(key => {\n arr.push({\n anno: entities[key] ? entities[key] : [],\n styles: pages[key].styles\n });\n });\n return arr;\n }\n }\n);\n\nexport const getCommentsArray = createSelector(\n getCommentEntities,\n fromDocument.getPages,\n getAnnotationEntities,\n fromTags.getTagFiltered,\n (commentEnts, pages, annoEnts, filtered) => {\n if (commentEnts && annoEnts && pages[1]) {\n const isFiltered: boolean = !!Object.keys(filtered).length;\n const com = isFiltered ? filtered : commentEnts;\n return Object.keys(com).map(key => {\n const page = annoEnts[key].page;\n return {\n ...commentEnts[key],\n page,\n pages\n };\n });\n }\n }\n);\n\nexport const getCommentSummary = createSelector(\n getCommentsArray,\n getCommentSummaryFilters,\n (commentSummary = [], filters) => {\n const comments = StoreUtils.filterCommentsSummary(commentSummary, filters.filters);\n if (comments.length) {\n const savedComments = comments.filter((comment) => {\n return comment.createdByDetails !== undefined;\n }\n );\n return savedComments.map((comment) => {\n return {\n page: comment.page,\n user: comment.createdByDetails.forename.concat(' ').concat(comment.createdByDetails.surname),\n date: moment(comment.lastModifiedDate).format('D MMMM YYYY'),\n tags: comment.tags,\n comment: comment.content\n };\n });\n }\n return [''];\n }\n);\n\n\nexport const getFilteredAnnotations = createSelector(\n getAnnotationEntities,\n fromTags.getTagFiltered,\n (annoEnt, filters) => {\n const isFiltered: boolean = !!Object.keys(filters).length;\n const anno = isFiltered ? filters : annoEnt;\n return Object.keys(anno).map(key => annoEnt[key])\n .filter(annotation => annotation.comments && annotation.comments.length > 0);\n }\n);\n","import { Injectable } from '@angular/core';\nimport { take } from 'rxjs/operators';\nimport { select, Store } from '@ngrx/store';\nimport { v4 as uuid } from 'uuid';\nimport moment from 'moment-timezone';\n\n\nimport { Rectangle } from '../../annotation-view/rectangle/rectangle.model';\nimport { ToolbarEventService } from '../../../../toolbar/toolbar.module';\nimport * as fromStore from '../../../../store/reducers/reducers';\nimport * as fromSelectors from '../../../../store/selectors/annotation.selectors';\nimport * as fromActions from '../../../../store/actions/annotation.actions';\nimport { Annotation } from '../../annotation-view/annotation.model';\n\n@Injectable()\nexport class HighlightCreateService {\n\n constructor(private toolBarEvents: ToolbarEventService,\n private store: Store<fromStore.AnnotationSetState>) { }\n\n saveAnnotation(rectangles: Rectangle[], page: number) {\n this.store.pipe(select(fromSelectors.getDocumentIdSetId), take(1)).subscribe(anoSetDocId => {\n const anno: Annotation = {\n id: uuid(),\n color: 'FFFF00',\n comments: [],\n page: page,\n rectangles: rectangles,\n type: 'highlight',\n ...anoSetDocId,\n createdBy: '',\n createdByDetails: undefined,\n createdDate: moment.utc().tz('Europe/London').toISOString(),\n lastModifiedBy: '',\n lastModifiedByDetails: undefined,\n lastModifiedDate: '',\n tags: [],\n };\n this.store.dispatch(new fromActions.SaveAnnotation(anno));\n });\n }\n\n applyRotation(pageHeight, pageWidth, offsetHeight, offsetWidth, offsetTop, offsetLeft, rotate, zoom) {\n const { x, y, width, height } = {\n x: +(offsetLeft / zoom).toFixed(2),\n y: +(offsetTop / zoom).toFixed(2),\n width: +(offsetWidth / zoom).toFixed(2),\n height: +(offsetHeight / zoom).toFixed(2)\n };\n const rectangle = { x, y, width, height };\n switch (rotate) {\n case 90:\n rectangle.width = height;\n rectangle.height = width;\n rectangle.x = y;\n rectangle.y = +(pageWidth / zoom - x - width).toFixed(2);\n break;\n case 180:\n rectangle.x = +(pageWidth / zoom - x - width).toFixed(2);\n rectangle.y = +(pageHeight / zoom - y - height).toFixed(2);\n break;\n case 270:\n rectangle.width = height;\n rectangle.height = width;\n rectangle.x = +(pageHeight / zoom - y - height).toFixed(2);\n rectangle.y = x;\n break;\n }\n return rectangle as any;\n }\n\n resetHighlight() {\n window.getSelection().removeAllRanges();\n this.toolBarEvents.highlightModeSubject.next(false);\n }\n}\n","import { BulkRedaction, Redaction } from './../../redaction/services/redaction.model';\nimport { SearchResultsCount } from './../toolbar-event.service';\nimport { RedactionSearch, RedactRectangle } from './redaction-search.model';\nimport { Component, ElementRef, HostListener, Inject, OnInit, ViewChild } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ToolbarButtonVisibilityService } from '../toolbar-button-visibility.service';\nimport { ToolbarEventService } from '../toolbar-event.service';\nimport { Store, select } from '@ngrx/store';\nimport * as fromStore from '../../store/reducers/reducers';\nimport { Rectangle } from '../../annotations/annotation-set/annotation-view/rectangle/rectangle.model';\nimport * as fromDocument from '../../store/selectors/document.selectors';\nimport * as fromRedactionActions from '../../store/actions/redaction.actions';\nimport uuid from 'uuid';\nimport { HighlightCreateService } from '../../annotations/annotation-set/annotation-create/highlight-create/highlight-create.service';\n\n@Component({\n selector: 'mv-redaction-search-bar',\n templateUrl: './redaction-search-bar.component.html',\n styleUrls: ['./redaction-search-bar.component.scss']\n})\nexport class RedactionSearchBarComponent implements OnInit {\n\n @ViewChild('findInput', { static: true }) findInput: ElementRef<HTMLInputElement>;\n\n highlightAll = true;\n matchCase = false;\n wholeWord = false;\n resultsText = '';\n searchText = '';\n resultCount = 0;\n redactElements: RedactRectangle[] = [];\n pageHeight: number;\n pageWidth: number;\n zoom: number;\n rotate: number;\n allPages: object;\n redactAll: boolean;\n openSearchModal: boolean;\n redactAllInProgress: boolean;\n redactAllText?: string;\n\n\n private subscription: Subscription;\n private documentId: string;\n public advancedSearchVisible = false;\n\n constructor(\n private store: Store<fromStore.State>,\n public readonly toolbarButtons: ToolbarButtonVisibilityService,\n public readonly toolbarEvents: ToolbarEventService,\n public readonly highlightService: HighlightCreateService,\n ) { }\n\n public ngOnInit(): void {\n this.subscription = this.toolbarEvents.redactionSerachSubject.subscribe((results: RedactionSearch) => this.redactAllSearched(results));\n this.subscription.add(this.store.pipe(select(fromDocument.getDocumentId)).subscribe(docId => this.documentId = docId));\n this.subscription.add(this.store.pipe(select(fromDocument.getPages)).subscribe((pages) => {\n if (pages[1]) {\n this.allPages = pages;\n }\n }));\n this.subscription.add(\n this.toolbarEvents.searchResultsCountSubject.subscribe(results => this.setSearchResultsCount(results))\n );\n this.subscription.add(this.toolbarEvents.openRedactionSearch.subscribe(isOpen => this.openSearchModal = isOpen));\n this.subscription.add(this.toolbarEvents.redactAllInProgressSubject\n .subscribe(inProgress => this.redactAllInProgress = inProgress));\n }\n\n ngOnDestroy(): void {\n this.subscription.unsubscribe();\n }\n\n @HostListener('window:keydown', ['$event'])\n public onWindowKeyDown(e: KeyboardEvent): void {\n if (e.code === 'F3' || (e.ctrlKey && e.code === 'KeyF')) {\n e.preventDefault();\n this.toolbarEvents.searchBarHidden.next(false);\n setTimeout(() => this.findInput.nativeElement.focus(), 200);\n }\n }\n\n search(reset: boolean = true): void {\n this.redactAll = !reset;\n if (this.redactAll) {\n this.toolbarEvents.redactAllInProgressSubject.next(true);\n }\n if (reset) {\n this.redactElements = [];\n }\n this.toolbarEvents.search({\n searchTerm: this.searchText,\n highlightAll: this.highlightAll,\n matchCase: this.matchCase,\n wholeWord: this.wholeWord,\n previous: false,\n reset\n });\n }\n\n private saveRedaction(redactRectangle: RedactRectangle[]) {\n const redaction = redactRectangle.map(ele => {\n return { page: ele.page, rectangles: ele.rectangles, redactionId: uuid(), documentId: this.documentId } as Redaction;\n });\n this.store.dispatch(new fromRedactionActions.SaveBulkRedaction({ searchRedactions: redaction } as BulkRedaction));\n }\n\n private existInRedactElements(pageNumber: number, matechedIndex: number, rectangles: Rectangle[]): boolean {\n if (this.redactElements && this.redactElements.length > 0) {\n const pagesFound = this.redactElements.find(re => re.page === pageNumber && re.matchedIndex === matechedIndex);\n const pageRectangles = pagesFound?.rectangles;\n if (!pageRectangles || pageRectangles.length <= 0) {\n return false;\n }\n let matchesRectangles = 0;\n for (let rectIndx = 0; rectIndx < pageRectangles.length; rectIndx++) {\n const rectangle = pageRectangles[rectIndx];\n const foundRectangle = rectangles.find(re => re.width === rectangle.width &&\n re.height === rectangle.height && re.x === rectangle.x && re.y === rectangle.y);\n if (foundRectangle) {\n matchesRectangles++;\n }\n }\n return pageRectangles.length === matchesRectangles;\n }\n return false;\n }\n\n onCloseSearchModal() {\n this.toolbarEvents.openRedactionSearch.next(false);\n }\n\n\n private setSearchResultsCount(results: SearchResultsCount): void {\n this.resultCount = results.total;\n this.resultsText = this.resultCount > 0\n ? `${results.total} results founds`\n : 'No results found';\n }\n\n private redactAllSearched(results: RedactionSearch): void {\n const $this = this;\n const intervalId = setInterval(() => {\n const highlightElement = document.getElementsByClassName('highlight selected');\n if (highlightElement && highlightElement.length > 0) {\n clearInterval(intervalId);\n $this.redactAllSearchedTick(results);\n }\n }, 100);\n }\n\n\n private redactAllSearchedTick(results: RedactionSearch): void {\n const highlightElement = document.getElementsByClassName('highlight selected');\n if (highlightElement && highlightElement.length > 0) {\n this.resultCount = results.matchesCount;\n const pageNumber = results.page + 1;\n const rectangles = this.getRectangles(pageNumber);\n if (rectangles && this.redactElements.length <= this.resultCount\n && !this.existInRedactElements(pageNumber, results.matchedIndex, rectangles)) {\n this.redactElements.push({ page: pageNumber, matchedIndex: results?.matchedIndex, rectangles } as RedactRectangle);\n this.CreateRedactAllText();\n }\n if (this.redactAll && this.resultCount && this.resultCount > 0\n && rectangles && this.redactElements.length < this.resultCount) {\n this.search(false);\n }\n\n if (this.redactAll && this.resultCount && this.redactElements.length === this.resultCount) {\n this.redactAll = false;\n this.redactAllText = null;\n this.saveRedaction(this.redactElements);\n }\n }\n }\n\n private CreateRedactAllText() {\n this.redactAllText = `${this.redactElements.length} of ${this.resultCount}`;\n }\n\n public onEscapeKeyPress(e: KeyboardEvent): void {\n this.toolbarEvents.searchBarHidden.next(true);\n }\n\n public onEnterKeyPress(e: KeyboardEvent): void {\n this.search();\n }\n\n public toggleSearchBar() {\n this.toolbarEvents.searchBarHidden.next(!this.toolbarEvents.searchBarHidden.getValue());\n }\n\n private getRectangles(page: number): Rectangle[] {\n this.pageHeight = this.allPages[page].styles.height;\n this.pageWidth = this.allPages[page].styles.width;\n this.zoom = parseFloat(this.allPages[page].scaleRotation.scale);\n this.rotate = parseInt(this.allPages[page].scaleRotation.rotation, 10);\n const selectedHighLightedElements = document.getElementsByClassName('highlight selected');\n if (selectedHighLightedElements && selectedHighLightedElements.length > 0) {\n const docRange = document.createRange();\n docRange.selectNodeContents(selectedHighLightedElements[0] as HTMLElement);\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(docRange);\n if (selection.rangeCount && !selection.isCollapsed) {\n const range = selection.getRangeAt(0).cloneRange();\n const clientRects = range.getClientRects();\n\n if (clientRects) {\n const parentRect = selectedHighLightedElements[0].parentElement.parentElement.getBoundingClientRect();\n const selectionRectangles: Rectangle[] = [];\n for (let i = 0; i < clientRects.length; i++) {\n const selectionRectangle = this.createTextRectangle(clientRects[i], parentRect);\n const findSelecttionRectangle = selectionRectangles.find(\n (rect) => rect.width === selectionRectangle.width && rect.x === selectionRectangle.x\n );\n if (!findSelecttionRectangle) {\n selectionRectangles.push(selectionRectangle);\n }\n }\n\n return selectionRectangles;\n }\n }\n }\n }\n\n private createTextRectangle(rect: DOMRect, parentRect: any): Rectangle {\n const height = rect.bottom - rect.top;\n const width = rect.right - rect.left;\n const top = rect.top - parentRect.top;\n const left = rect.left - parentRect.left;\n\n let rectangle = this.highlightService.applyRotation(\n this.pageHeight,\n this.pageWidth,\n height,\n width,\n top,\n left,\n this.rotate,\n this.zoom\n );\n rectangle = { id: uuid(), ...rectangle };\n\n return rectangle as Rectangle;\n }\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * Number Helper Service\n * */\n@Injectable({\n providedIn: 'root'\n})\n\nexport class NumberHelperService {\n constructor() { }\n\n public isNumber(value: string | number): boolean {\n return (\n value !== null\n && value !== undefined\n && value !== ''\n && !isNaN(Number(value.toString()))\n );\n }\n }\n","import { ConnectionPositionPair } from '@angular/cdk/overlay';\nimport {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n HostListener,\n Input,\n OnDestroy,\n OnInit,\n ViewChild\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ToolbarEventService } from '../toolbar-event.service';\nimport { ToolbarButtonVisibilityService } from '../toolbar-button-visibility.service';\nimport { NumberHelperService } from '../../../lib/shared/util/services/number.helper.service';\n\n@Component({\n selector: 'mv-main-toolbar',\n templateUrl: './main-toolbar.component.html'\n})\nexport class MainToolbarComponent implements OnInit, OnDestroy, AfterViewInit {\n\n @Input() enableAnnotations = false;\n @Input() enableRedactions = false;\n @Input() enableICP = false;\n @Input() contentType = null;\n\n @ViewChild('zoomSelect', { static: false }) public zoomSelect: ElementRef;\n @ViewChild('mvToolbarMain', { static: false }) public mvToolbarMain: ElementRef<HTMLElement>;\n @ViewChild('dropdownMenu', { static: false }) public mvMenuItems: ElementRef<HTMLElement>;\n\n private readonly subscriptions: Subscription[] = [];\n\n public icpEnabled = false;\n public redactionEnabled = false;\n public showCommentsPanel: boolean;\n public redactAllInProgress: boolean;\n\n public pageNumber = 1;\n public pageCount = 0;\n public isDropdownMenuOpen = false;\n public dropdownMenuPositions = [\n new ConnectionPositionPair(\n {\n originX: 'end',\n originY: 'bottom'\n },\n {\n overlayX: 'end',\n overlayY: 'top'\n },\n 0,\n 3)\n ];\n\n public zoomScales = [0.1, 0.25, 0.5, 0.75, 1, 1.25, 1.5, 2.5, 3, 5];\n\n allButtonsWidth = 0;\n widthRequiredForBtn: { [id: string]: number } = {};\n\n public constructor(\n public readonly toolbarEvents: ToolbarEventService,\n public readonly toolbarButtons: ToolbarButtonVisibilityService,\n private readonly cdr: ChangeDetectorRef,\n private readonly numberHelper: NumberHelperService\n ) {\n }\n\n public ngOnInit() {\n this.subscriptions.push(\n this.toolbarEvents.setCurrentPageSubject.subscribe(pageNumber => this.setCurrentPage(pageNumber)),\n this.toolbarEvents.setCurrentPageInputValueSubject.subscribe(pageNumber => this.pageNumber = pageNumber),\n this.toolbarEvents.getPageCount().subscribe(count => this.pageCount = count),\n this.toolbarEvents.icp.enabled.subscribe(enabled => {\n this.icpEnabled = enabled;\n if (this.icpEnabled) {\n this.toolbarEvents.toggleCommentsPanel(!enabled);\n this.toolbarEvents.sidebarOpen.next(false);\n }\n }),\n this.toolbarEvents.redactionMode.subscribe(enabled => {\n this.redactionEnabled = enabled;\n }),\n this.toolbarEvents.redactAllInProgressSubject.subscribe(disable => {\n this.redactAllInProgress = disable;\n }),\n );\n }\n\n public ngOnDestroy(): void {\n for (const subscription of this.subscriptions) {\n subscription.unsubscribe();\n }\n }\n\n public ngAfterViewInit() {\n Array.from(this.mvToolbarMain.nativeElement.children).forEach(button => {\n this.allButtonsWidth += button.getBoundingClientRect().width;\n this.widthRequiredForBtn[button.id] = this.allButtonsWidth;\n });\n this.cdr.detectChanges();\n }\n\n @HostListener('window:resize', [])\n public onResize() {\n this.cdr.detectChanges();\n }\n\n public onClickHighlightToggle() {\n this.toolbarEvents.toggleHighlightMode();\n }\n public onClickDrawToggle() {\n this.toolbarEvents.toggleDrawMode();\n }\n\n public toggleIndexSideBar() {\n const sidebarOpen = this.toolbarEvents.sidebarOpen.getValue();\n const sidebarView = this.toolbarEvents.sidebarOutlineView.getValue();\n if (!(sidebarOpen && !sidebarView)) {\n this.toolbarEvents.toggleSideBar(!sidebarOpen);\n }\n this.toolbarEvents.toggleSideBarView(true);\n }\n\n public toggleBookmarksSideBar() {\n const sidebarOpen = this.toolbarEvents.sidebarOpen.getValue();\n const sidebarView = this.toolbarEvents.sidebarOutlineView.getValue();\n if (!(sidebarOpen && sidebarView)) {\n this.toolbarEvents.toggleSideBar(!sidebarOpen);\n }\n this.toolbarEvents.toggleSideBarView(false);\n }\n\n public togglePresentBar() {\n this.toolbarEvents.searchBarHidden.next(true);\n this.toolbarEvents.icp.enable();\n }\n\n public increasePageNumber() {\n this.toolbarEvents.incrementPage(1);\n }\n\n public decreasePageNumber() {\n this.toolbarEvents.incrementPage(-1);\n }\n\n public onPageNumberInputChange(pageNumber: string) {\n if (Number(pageNumber) < 1) {\n pageNumber = '1';\n }\n if (Number(pageNumber) > this.pageCount) {\n pageNumber = this.pageCount.toString();\n }\n\n this.toolbarEvents.setPage(Number.parseInt(pageNumber, 10));\n }\n\n private setCurrentPage(pageNumber: number) {\n this.pageNumber = pageNumber;\n }\n\n public rotate(rotation: number) {\n this.toolbarEvents.rotate(rotation);\n }\n\n public printFile() {\n this.toolbarEvents.print();\n }\n\n public downloadFile() {\n this.toolbarEvents.download();\n }\n\n public zoom(zoomFactor: string) {\n this.toolbarEvents.zoom(+zoomFactor);\n }\n\n public stepZoom(zoomFactor: number) {\n this.toolbarEvents.stepZoom(zoomFactor);\n this.zoomSelect.nativeElement.selected = 'selected';\n }\n\n public toggleCommentsPanel() {\n this.toolbarEvents.toggleCommentsPanel(!this.toolbarEvents.commentsPanelVisible.getValue());\n }\n\n public toggleRedactBar() {\n this.toolbarEvents.toggleRedactionMode();\n }\n\n public toggleGrabNDrag() {\n this.toolbarEvents.toggleGrabNDrag();\n }\n\n public isPdf() {\n return this.contentType === 'pdf';\n }\n\n public toggleSearchBar() {\n this.toolbarEvents.searchBarHidden.next(!this.toolbarEvents.searchBarHidden.getValue());\n }\n\n public toggleMoreOptions() {\n this.isDropdownMenuOpen = !this.isDropdownMenuOpen;\n setTimeout(() => {\n if (this.mvMenuItems) {\n this.mvMenuItems.nativeElement.focus();\n }\n }, 100);\n }\n}\n","import { Component, ElementRef, HostListener, OnInit, ViewChild, OnDestroy } from '@angular/core';\nimport { ToolbarButtonVisibilityService } from '../toolbar-button-visibility.service';\nimport { SearchResultsCount, ToolbarEventService } from '../toolbar-event.service';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'mv-search-bar',\n templateUrl: './search-bar.component.html'\n})\nexport class SearchBarComponent implements OnInit, OnDestroy {\n\n @ViewChild('findInput', { static: true }) findInput: ElementRef<HTMLInputElement>;\n @ViewChild('findNext', { static: false }) findNext: ElementRef<HTMLAnchorElement>;\n\n highlightAll = true;\n matchCase = false;\n wholeWord = false;\n resultsText = '';\n searchText = '';\n resultCount = 0;\n\n private subscriptions: Subscription[] = [];\n\n public advancedSearchVisible = false;\n\n constructor(\n public readonly toolbarButtons: ToolbarButtonVisibilityService,\n public readonly toolbarEvents: ToolbarEventService\n ) { }\n\n public ngOnInit(): void {\n this.subscriptions.push(\n this.toolbarEvents.searchResultsCountSubject.subscribe(results => this.setSearchResultsCount(results))\n );\n }\n\n ngOnDestroy(): void {\n for (const subscription of this.subscriptions) {\n subscription.unsubscribe();\n }\n }\n\n @HostListener('window:keydown', ['$event'])\n public onWindowKeyDown(e: KeyboardEvent): void {\n if (e.code === 'F3' || (e.ctrlKey && e.code === 'KeyF')) {\n e.preventDefault();\n\n this.toolbarEvents.searchBarHidden.next(false);\n setTimeout(() => this.findInput.nativeElement.focus(), 200);\n }\n }\n\n public searchNext(): void {\n this.toolbarEvents.search({\n searchTerm: this.searchText,\n highlightAll: this.highlightAll,\n matchCase: this.matchCase,\n wholeWord: this.wholeWord,\n previous: false,\n reset: false\n });\n }\n\n public searchPrev(): void {\n this.toolbarEvents.search({\n searchTerm: this.searchText,\n highlightAll: this.highlightAll,\n matchCase: this.matchCase,\n wholeWord: this.wholeWord,\n previous: true,\n reset: false\n });\n }\n\n public search(): void {\n this.toolbarEvents.search({\n searchTerm: this.searchText,\n highlightAll: this.highlightAll,\n matchCase: this.matchCase,\n wholeWord: this.wholeWord,\n previous: false,\n reset: true\n });\n }\n\n private setSearchResultsCount(results: SearchResultsCount): void {\n this.resultCount = results.total;\n this.resultsText = this.resultCount > 0\n ? `Found ${results.current} of ${results.total}`\n : 'No results found';\n if (this.resultCount && this.resultCount > 0) {\n setTimeout(() => {\n this.findNext.nativeElement.focus();\n }, 1000);\n }\n }\n\n public onEscapeKeyPress(e: KeyboardEvent): void {\n this.toolbarEvents.searchBarHidden.next(true);\n }\n\n public onEnterKeyPress(e: KeyboardEvent): void {\n this.search();\n }\n\n\n public toggleAdvancedSearch(): void {\n this.advancedSearchVisible = !this.advancedSearchVisible;\n }\n\n public toggleSearchBar() {\n this.toolbarEvents.searchBarHidden.next(!this.toolbarEvents.searchBarHidden.getValue());\n }\n}\n","import {createSelector} from '@ngrx/store';\nimport * as fromFeature from '../reducers/reducers';\nimport * as fromRedactions from '../reducers/redaction.reducer';\nimport * as fromDocument from './document.selectors';\n\nexport const getRedactionState = createSelector(\n fromFeature.getMVState,\n (state: fromFeature.State) => state.redactions\n);\n\nexport const getRedactionPages = createSelector(\n getRedactionState,\n fromRedactions.getPageEnt\n);\n\nexport const getSelected = createSelector(\n getRedactionState,\n fromRedactions.getSelectedRedaction\n);\n\nexport const getRedactedDocumentInfo = createSelector(\n getRedactionState,\n fromRedactions.getRedactedDocInfo\n);\n\nexport const getRedactionEnt = createSelector(\n getRedactionState,\n fromRedactions.getRedactionEnt\n);\n\nexport const getRedactionArray = createSelector(\n getRedactionEnt,\n fromDocument.getDocumentId,\n (ent, documentId) => {\n const redactions = Object.keys(ent).map(key => ent[key]);\n return { redactions, documentId };\n }\n);\n\nexport const getRedactionsPerPage = createSelector(\n fromDocument.getPages,\n getRedactionPages,\n (pages, pageEnt) => {\n if (pages && pageEnt) {\n const arr = [];\n Object.keys(pages).forEach(key => {\n arr.push({\n anno: pageEnt[key] ? pageEnt[key] : [],\n styles: pages[key].styles\n });\n });\n\n return arr;\n }\n }\n);\n\n","import { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { ToolbarEventService } from '../toolbar-event.service';\nimport { select, Store } from '@ngrx/store';\nimport * as fromRedactSelectors from '../../store/selectors/redaction.selectors';\nimport * as fromStore from '../../store/reducers/reducers';\nimport { Subscription } from 'rxjs';\nimport { ToolbarButtonVisibilityService } from '../toolbar-button-visibility.service';\nimport { ThisReceiver } from '@angular/compiler';\n\n@Component({\n selector: 'mv-redaction-toolbar',\n templateUrl: './redaction-toolbar.component.html'\n})\nexport class RedactionToolbarComponent implements OnInit, OnDestroy {\n\n @Input() showRedactSearch: boolean;\n\n preview = false;\n hasRedactions = false;\n\n private subscriptions: Subscription[] = [];\n redactionAllInProgress: boolean;\n\n constructor(public readonly toolbarEventService: ToolbarEventService,\n public readonly toolbarButtons: ToolbarButtonVisibilityService,\n private store: Store<fromStore.AnnotationSetState>) { }\n\n ngOnInit(): void {\n this.subscriptions.push(this.store.pipe(select(fromRedactSelectors.getRedactionArray)).subscribe(redactions => {\n this.hasRedactions = !!redactions.redactions.length;\n }));\n this.subscriptions.push(this.toolbarEventService.redactAllInProgressSubject.subscribe(inprogress => {\n this.redactionAllInProgress = inprogress;\n }));\n }\n\n onRedactAllSearch() {\n this.toolbarEventService.openRedactionSearch.next(true);\n }\n\n toggleTextRedactionMode() {\n this.toolbarEventService.highlightModeSubject.next(true);\n }\n\n toggleDrawMode() {\n this.toolbarEventService.drawModeSubject.next(true);\n }\n\n togglePreview() {\n this.preview = !this.preview;\n this.toolbarEventService.toggleRedactionPreview(this.preview);\n }\n\n unmarkAll() {\n this.toolbarEventService.unmarkAll();\n }\n\n redact() {\n this.toolbarEventService.applyRedactionToDocument();\n }\n\n toggleRedactBar() {\n this.toolbarEventService.toggleRedactionMode();\n }\n\n redactPage() {\n this.toolbarEventService.drawModeSubject.next(true);\n this.toolbarEventService.redactPage();\n }\n\n ngOnDestroy(): void {\n for (const subscription of this.subscriptions) {\n subscription.unsubscribe();\n }\n }\n}\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { ToolbarEventService } from '../toolbar-event.service';\nimport { select, Store } from '@ngrx/store';\nimport * as fromIcpSelectors from '../../store/selectors/icp.selectors';\nimport { Subscription } from 'rxjs';\nimport { IcpState } from '../../icp/icp.interfaces';\n\n@Component({\n selector: 'mv-icp-toolbar',\n templateUrl: './icp-toolbar.component.html'\n})\nexport class IcpToolbarComponent implements OnInit, OnDestroy {\n\n presenterName: string;\n isPresenter: boolean;\n\n private $subscription: Subscription;\n\n constructor(public readonly toolbarEventService: ToolbarEventService,\n private store: Store<IcpState>) {}\n\n ngOnInit() {\n this.$subscription = this.store.pipe(select(fromIcpSelectors.isPresenter))\n .subscribe(isPresenter => this.isPresenter = isPresenter);\n this.$subscription.add(this.store.pipe(select(fromIcpSelectors.getPresenterName))\n .subscribe(name => this.presenterName = name));\n }\n\n ngOnDestroy() {\n this.$subscription.unsubscribe();\n }\n\n present() {\n this.toolbarEventService.icp.becomePresenter();\n }\n\n stopPresenting() {\n this.toolbarEventService.icp.stopPresenting();\n }\n\n leaveIcpSession() {\n this.toolbarEventService.icp.leaveSession();\n }\n\n showParticipantsList() {\n this.toolbarEventService.toggleParticipantsList(!this.toolbarEventService.icp.participantsListVisible.getValue());\n }\n}\n","import { RedactionSearchBarComponent } from './redaction-search-bar/redaction-search-bar.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MainToolbarComponent } from './main-toolbar/main-toolbar.component';\nimport { SearchBarComponent } from './search-bar/search-bar.component';\nimport { FormsModule } from '@angular/forms';\nimport { ToolbarButtonVisibilityService } from './toolbar-button-visibility.service';\nimport { ToolbarEventService } from './toolbar-event.service';\nimport { RedactionToolbarComponent } from './redaction-toolbar/redaction-toolbar.component';\nimport { IcpToolbarComponent } from './icp-toolbar/icp-toolbar.component';\nexport { ToolbarButtonVisibilityService } from './toolbar-button-visibility.service';\nexport { ToolbarEventService } from './toolbar-event.service';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { RouterModule } from '@angular/router';\n\n\n@NgModule({\n declarations: [\n SearchBarComponent,\n MainToolbarComponent,\n RedactionToolbarComponent,\n IcpToolbarComponent,\n RedactionSearchBarComponent\n ],\n providers: [\n ToolbarButtonVisibilityService,\n ToolbarEventService\n ],\n exports: [\n MainToolbarComponent,\n SearchBarComponent,\n RedactionToolbarComponent,\n IcpToolbarComponent,\n RedactionSearchBarComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n OverlayModule,\n RouterModule\n ]\n})\nexport class ToolbarModule { }\n","import { Component, EventEmitter, Input, Output, ViewChild, ElementRef } from '@angular/core';\nimport { v4 as uuid } from 'uuid';\nimport { Annotation } from './annotation.model';\nimport { Rectangle } from './rectangle/rectangle.model';\nimport moment from 'moment-timezone';\nimport { Store } from '@ngrx/store';\nimport * as fromStore from '../../../store/reducers/reducers';\nimport * as fromActions from '../../../store/actions/annotation.actions';\nimport { SelectionAnnotation } from '../../models/event-select.model';\nimport { ToolbarEventService } from '../../../toolbar/toolbar-event.service';\nimport { Comment } from '../../comment-set/comment/comment.model';\n\n@Component({\n selector: 'mv-annotation',\n templateUrl: './annotation-view.component.html'\n})\nexport class AnnotationViewComponent { // todo rename this to selection vew c\n\n @Input() set annotation(value) {\n this.anno = { ...value };\n }\n anno: Annotation;\n selected: boolean;\n @Input() zoom: number;\n @Input() rotate: number;\n @Input() set selectedAnnoId(selectedId: { annotationId: string }) {\n if (selectedId) {\n const id = this.anno.id || this.anno.redactionId; // todo make it unique\n this.selected = selectedId.annotationId ? (selectedId.annotationId === id) : false;\n }\n }\n @Input() pageHeight: number;\n @Input() pageWidth: number;\n @Output() update = new EventEmitter<Annotation>();\n @Output() delete = new EventEmitter<Annotation>();\n @Output() annotationClick = new EventEmitter<SelectionAnnotation>();\n\n @ViewChild('container', { static: false }) container: ElementRef;\n\n constructor(\n private readonly toolbarEvents: ToolbarEventService,\n private store: Store<fromStore.AnnotationSetState>\n ) { }\n\n public onSelect() {\n const annotationId = this.anno.id || this.anno.redactionId;\n this.annotationClick.emit({ annotationId, editable: false, selected: true });\n }\n\n public onRectangleUpdate(rectangle: Rectangle) {\n const annotation = { ...this.anno };\n annotation.rectangles = annotation.rectangles.filter(r => r.id !== rectangle.id);\n annotation.rectangles.push(rectangle);\n this.update.emit(annotation);\n }\n\n public deleteHighlight() {\n this.delete.emit(this.anno);\n }\n\n public addOrEditComment() {\n if (this.anno.comments.length === 0) {\n const comment: Comment = {\n annotationId: this.anno.id,\n content: '',\n createdBy: this.anno.createdBy,\n createdByDetails: undefined,\n createdDate: moment.utc().tz('Europe/London').toISOString(),\n id: uuid(),\n lastModifiedBy: '',\n lastModifiedByDetails: undefined,\n lastModifiedDate: '',\n tags: [],\n page: null,\n pages: {},\n pageHeight: null,\n selected: false,\n editable: false\n };\n this.store.dispatch(new fromActions.AddOrEditComment(comment));\n\n }\n this.selected = true;\n this.annotationClick.emit({ annotationId: this.anno.id, editable: true, selected: true });\n this.toolbarEvents.toggleCommentsPanel(true);\n }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { Annotation } from './annotation-view/annotation.model';\nimport { Observable } from 'rxjs';\nimport { SelectionAnnotation } from '../models/event-select.model';\nimport { CommentService } from '../comment-set/comment/comment.service';\nimport { select, Store } from '@ngrx/store';\nimport * as fromStore from '../../store/reducers/reducers';\nimport * as fromActions from '../../store/actions/annotation.actions';\nimport * as fromSelectors from '../../store/selectors/annotation.selectors';\n\n@Component({\n selector: 'mv-annotation-set',\n templateUrl: './annotation-set.component.html'\n})\nexport class AnnotationSetComponent implements OnInit {\n\n @Input() page: number;\n @Input() annotations: Annotation[] = [];\n @Input() zoom: number;\n @Input() rotate: number;\n @Input() pageHeight: number;\n @Input() pageWidth: number;\n\n selectedAnnotation$: Observable<SelectionAnnotation>;\n\n constructor(\n private store: Store<fromStore.AnnotationSetState>,\n private readonly commentService: CommentService\n ) {}\n\n ngOnInit(): void {\n this.selectedAnnotation$ = this.store.pipe(select(fromSelectors.getSelectedAnnotation));\n }\n\n public onAnnotationUpdate(annotation: Annotation) {\n this.store.dispatch(new fromActions.SaveAnnotation(annotation));\n }\n\n public onAnnotationDelete(annotation: Annotation) {\n if (annotation.comments.length > 0) {\n this.commentService.updateUnsavedCommentsStatus(annotation, false);\n }\n this.store.dispatch(new fromActions.DeleteAnnotation(annotation.id));\n }\n\n selectAnnotation(selectedAnnotation: SelectionAnnotation) {\n this.store.dispatch(new fromActions.SelectedAnnotation(selectedAnnotation));\n }\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild\n} from '@angular/core';\nimport { Rectangle } from './rectangle.model';\nimport { Subscription } from 'rxjs';\nimport { ToolbarEventService } from '../../../../toolbar/toolbar-event.service';\nimport { HighlightCreateService } from '../../annotation-create/highlight-create/highlight-create.service';\n\n@Component({\n selector: 'mv-anno-rectangle',\n templateUrl: './rectangle.component.html'\n})\nexport class RectangleComponent implements OnChanges, AfterViewInit, OnDestroy {\n\n @Input() color: String;\n @Input() zoom: number;\n @Input() rotate: number;\n @Input() editable: boolean;\n @Input() pageHeight: number;\n @Input() pageWidth: number;\n\n @Output() select = new EventEmitter<Rectangle>();\n @Output() update = new EventEmitter<Rectangle>();\n\n @ViewChild('rectElement', {static: false}) viewRect: ElementRef;\n\n private subscriptions: Subscription[] = [];\n _selected: boolean;\n enableGrabNDrag = false;\n\n height: number;\n width: number;\n top: number;\n left: number;\n\n _annoRect: Rectangle;\n @Input()\n set annoRect(annoRect: Rectangle) {\n this._annoRect = { ...annoRect };\n this.height = +(annoRect.height * this.zoom).toFixed(2);\n this.width = +(annoRect.width * this.zoom).toFixed(2);\n this.left = +(annoRect.x * this.zoom).toFixed(2);\n this.top = +(annoRect.y * this.zoom).toFixed(2);\n }\n\n get annoRect() {\n return this._annoRect;\n }\n\n\n constructor(private readonly toolbarEvents: ToolbarEventService,\n private readonly highlightService: HighlightCreateService) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.rotate) {\n this.adjustForRotation(this.rotate);\n }\n }\n\n ngAfterViewInit() {\n this.subscriptions.push(\n this.toolbarEvents.grabNDrag.subscribe(grabNDrag => this.enableGrabNDrag = grabNDrag)\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.filter(subscription => !subscription.closed)\n .forEach(subscription => subscription.unsubscribe());\n }\n\n @Input()\n set selected(selected: boolean) {\n this._selected = selected;\n if (this._selected && this.viewRect) {\n this.viewRect.nativeElement.focus();\n }\n }\n\n get selected() {\n return this._selected;\n }\n\n onClick() {\n this.select.emit(this.annoRect);\n }\n\n onUpdate(viewRect: any) {\n const { offsetHeight, offsetWidth, offsetTop, offsetLeft } = viewRect;\n if (this.hasRectangleChanged(viewRect)) {\n let rectangle = this.highlightService\n .applyRotation(this.pageHeight, this.pageWidth, offsetHeight, offsetWidth, offsetTop, offsetLeft, this.rotate, this.zoom);\n rectangle = { ...this.annoRect, ...rectangle };\n this.update.emit({ ...rectangle });\n }\n }\n\n adjustForRotation(rotation: number) {\n const { top, left, height, width } = this;\n switch (rotation) {\n case 90:\n this.width = height;\n this.height = width;\n this.left = this.pageWidth - top - height;\n this.top = left;\n break;\n case 180:\n this.left = this.pageWidth - left - width;\n this.top = this.pageHeight - top - height;\n break;\n case 270:\n this.width = height;\n this.height = width;\n this.left = top;\n this.top = this.pageHeight - left - width;\n break;\n }\n }\n\n hasRectangleChanged(viewRect): boolean {\n return this.left !== viewRect.offsetLeft ||\n this.top !== viewRect.offsetTop ||\n this.width !== viewRect.offsetWidth ||\n this.height !== viewRect.offsetHeight;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { TagsModel } from '../../models/tags.model';\n\n@Injectable()\nexport class TagsServices {\n\n public tagItems: {[id: string]: TagsModel[]};\n\n constructor(private http: HttpClient) {}\n\n public getAllTags(createdBy: string): Observable<TagsModel[]> {\n const url = `/em-anno/tags/${createdBy}`;\n return this.http.get<TagsModel[]>(url);\n }\n\n // @TODO: Move everything below this to NgRx store\n getNewTags(annoid: string): TagsModel[] {\n return this.tagItems ? this.tagItems[annoid] : [];\n }\n\n updateTagItems(items: Array<TagsModel>, annoId: string) {\n const snakeCased = items.map(item => {\n return {\n ...item,\n name: this.snakeCase(item.name)\n };\n });\n\n this.tagItems = {\n ...this.tagItems,\n [annoId]: snakeCased\n };\n }\n\n private snakeCase = string => {\n // transform string_to_snake_case\n return string.replace(/ +/g, ' ') // find space\n .split(/ |\\B(?=[A-Z])/) // split it into array\n .map(word => word.toLowerCase()) // transform to lover case\n .join('_'); // trun array into sting using _\n }\n}\n","import {\n AfterContentInit,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild\n} from '@angular/core';\nimport {Comment} from './comment.model';\nimport {User} from '../../models/user.model';\nimport {Rectangle} from '../../annotation-set/annotation-view/rectangle/rectangle.model';\nimport {SelectionAnnotation} from '../../models/event-select.model';\nimport {CommentService} from './comment.service';\nimport {TagsModel} from '../../models/tags.model';\nimport {TagsServices} from '../../services/tags/tags.services';\nimport { Observable, Subscription } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport {Store} from '@ngrx/store';\nimport * as fromStore from '../../../store/reducers/reducers';\nimport * as fromSelector from '../../../store/selectors/annotation.selectors';\nimport { AnnotationSet } from '../../annotation-set/annotation-set.model';\nimport { Annotation } from '../../annotation-set/annotation-view/annotation.model';\n\n@Component({\n selector: 'mv-anno-comment',\n templateUrl: './comment.component.html'\n})\nexport class CommentComponent implements OnInit, OnDestroy, AfterContentInit {\n\n CHAR_LIMIT = 5000;\n lastUpdate: string;\n originalComment: string;\n fullComment: string;\n author: User;\n createdBy: string;\n editor: User;\n _comment: Comment;\n _editable: boolean;\n _rectangle;\n totalPrevPagesHeight = 0;\n rectTop;\n rectLeft;\n pageHeight: number;\n hasUnsavedChanges = false;\n selected: boolean;\n searchString: string;\n public tagItems: TagsModel[];\n marginToComment$: Observable<boolean> ;\n\n\n\n @Output() commentClick = new EventEmitter<SelectionAnnotation>();\n @Output() renderComments = new EventEmitter<Comment>();\n @Output() delete = new EventEmitter<Comment>();\n @Output() updated = new EventEmitter<{comment: Comment, tags: TagsModel[]}>();\n @Output() changes = new EventEmitter<boolean>();\n @Input() rotate = 0;\n @Input() zoom = 1;\n @Input() index: number;\n @Input() page: number;\n\n @ViewChild('form', {static: false}) form: ElementRef;\n @ViewChild('editableComment', {static: false}) editableComment: ElementRef<HTMLElement>;\n\n private subscriptions: Subscription;\n\n constructor(\n private store: Store<fromStore.AnnotationSetState>,\n private readonly commentService: CommentService,\n private tagsServices: TagsServices\n ) {}\n\n\n ngOnInit(): void {\n this.subscriptions = this.store.select(fromSelector.getComponentSearchText)\n .pipe(distinctUntilChanged()).subscribe(searchString => this.searchString = searchString);\n this.reRenderComments();\n this.marginToComment$ = this.commentService.marginToCommentEmitter.asObservable();\n }\n\n ngAfterContentInit(): void {\n if (this.tagItems && this.tagItems.length) {\n this.tagsServices.updateTagItems(this.tagItems, this._comment.annotationId);\n }\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n @Input()\n set comment(comment: Comment) {\n this._comment = {...comment};\n this.page = this._comment.page;\n this.lastUpdate = comment.lastModifiedDate ? comment.lastModifiedDate : comment.createdDate;\n this.author = comment.createdByDetails;\n this.createdBy = comment.createdBy;\n this.editor = comment.lastModifiedByDetails;\n this.originalComment = comment.content;\n this.fullComment = this.originalComment;\n this.selected = this._comment.selected;\n this._editable = this._comment.editable;\n this.tagItems = this._comment.tags;\n const pageMarginBottom = 10;\n this.totalPrevPagesHeight = 0;\n for (let i = 0; i < this.page - 1; i++) {\n const height = this._comment.pages[i + 1] ? this._comment.pages[i + 1].styles.height : undefined;\n if (height) {\n this.totalPrevPagesHeight += height + pageMarginBottom;\n }\n }\n\n }\n\n get comment() {\n return this._comment;\n }\n\n @Input()\n set annotation(annotation: Annotation) {\n this._rectangle = annotation.rectangles\n .reduce((prev, current) => prev.y < current.y ? prev : current);\n const actualHeight = this._comment.pages[this.page].styles.height / this.zoom;\n switch (this.rotate) {\n case 90: this.rectTop = this._rectangle.x;\n break;\n case 180: this.rectTop = actualHeight - (this._rectangle.y + this._rectangle.height);\n break;\n case 270: this.rectTop = actualHeight - (this._rectangle.x + this._rectangle.width);\n break;\n default: this.rectTop = this._rectangle.y;\n }\n this.rectLeft = this._rectangle.x;\n }\n\n get editable(): boolean {\n return this._editable;\n }\n\n onCommentChange(updatedComment) {\n this.hasUnsavedChanges =\n this.originalComment.substring(0, this.CHAR_LIMIT) !== updatedComment.substring(0, this.CHAR_LIMIT);\n this.commentService.onCommentChange(this.hasUnsavedChanges);\n }\n\n deleteOrCancel() {\n if (!this.editable) {\n this.delete.emit(this._comment);\n } else {\n this.hasUnsavedChanges = false;\n this._editable = false;\n this.fullComment = this.originalComment;\n this.changes.emit(false);\n if (!this.author && !this.fullComment) {\n this.delete.emit(this._comment);\n }\n }\n }\n\n public editOrSave() {\n if (!this.editable) {\n this._editable = true;\n } else {\n this._comment.content = this.fullComment.substring(0, this.CHAR_LIMIT);\n const tags = this.tagsServices.getNewTags(this._comment.annotationId);\n const payload = {\n comment: this._comment,\n tags\n };\n this.updated.emit(payload);\n this.hasUnsavedChanges = false;\n this._editable = false;\n this.changes.emit(false);\n }\n }\n\n onCommentClick() {\n if (!this.selected) {\n this.selected = true;\n this._editable = false;\n this.commentClick.emit({ annotationId: this._comment.annotationId, editable: this._editable, selected: true });\n }\n }\n\n reRenderComments() {\n this.renderComments.emit(this._comment);\n }\n\n get commentTop(): number {\n return this.totalPrevPagesHeight + (this.rectTop * this.zoom);\n }\n\n\n get height() {\n return this.form.nativeElement.getBoundingClientRect().height / this.zoom;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges\n} from '@angular/core';\nimport { Rectangle } from '../annotation-view/rectangle/rectangle.model';\n\n@Component({\n selector: 'mv-ctx-toolbar',\n templateUrl: './ctx-toolbar.component.html'\n})\nexport class CtxToolbarComponent implements OnChanges {\n\n readonly defaultHeight;\n readonly defaultWidth;\n\n @Input() zoom;\n @Input() rotate;\n @Input() pageHeight: number;\n @Input() pageWidth: number;\n\n @Input() canHighlight: boolean;\n @Input() canBookmark: boolean;\n @Input() canComment: boolean;\n @Input() canDelete: boolean;\n\n @Output() createHighlightEvent = new EventEmitter();\n @Output() deleteHighlightEvent = new EventEmitter();\n @Output() addOrEditCommentEvent = new EventEmitter();\n @Output() createBookmarkEvent = new EventEmitter<Rectangle>();\n\n rectangle: Rectangle;\n _rectangles: Rectangle[];\n top: number;\n left: number;\n\n constructor() {\n this.defaultHeight = 70;\n this.defaultWidth = 300;\n }\n\n ngOnChanges(changes: SimpleChanges) {\n this.setRectangle();\n this.top = this.popupTop();\n this.left = this.popupLeft();\n }\n\n @Input() set rectangles(rectangles: Rectangle[]) {\n if (rectangles) {\n this._rectangles = rectangles;\n this.setRectangle();\n }\n }\n\n get rectangles() {\n return this._rectangles;\n }\n\n createHighlight() {\n this.createHighlightEvent.emit();\n this.rectangle = undefined;\n }\n\n deleteHighlight() {\n this.deleteHighlightEvent.emit();\n }\n\n addOrEditComment() {\n this.addOrEditCommentEvent.emit();\n setTimeout(() => {\n if (!location.hash) {\n document.getElementById('viewerContainer').scrollBy(0, 1);\n }\n }, 10);\n }\n\n createBookmark() {\n this.createBookmarkEvent.emit(this.rectangle);\n this.rectangle = undefined;\n }\n\n setRectangle() {\n const rectangle = this.rectangles\n .reduce((prev, current) => prev.y < current.y ? prev : current);\n this.rectangle = { ...rectangle };\n switch (this.rotate) {\n case 90:\n this.rectangle.width = rectangle.height;\n this.rectangle.height = rectangle.width;\n this.rectangle.x = (this.pageWidth / this.zoom) - rectangle.y - rectangle.height;\n this.rectangle.y = rectangle.x;\n break;\n case 180:\n this.rectangle.x = (this.pageWidth / this.zoom) - rectangle.x - rectangle.width;\n this.rectangle.y = (this.pageHeight / this.zoom) - rectangle.y - rectangle.height;\n break;\n case 270:\n this.rectangle.width = rectangle.height;\n this.rectangle.height = rectangle.width;\n this.rectangle.x = rectangle.y;\n this.rectangle.y = (this.pageHeight / this.zoom) - rectangle.x - rectangle.width;\n break;\n }\n }\n\n popupTop() {\n const popupTop = this.rectangle.y * this.zoom - this.defaultHeight;\n return popupTop <= 0 ? this.defaultHeight : popupTop;\n }\n\n popupLeft() {\n const popupLeft = (this.rectangle.x + (this.rectangle.width / 2)) * this.zoom - (this.defaultWidth / 2);\n if (popupLeft <= 0) {\n return 0;\n } else if (popupLeft >= this.pageWidth - this.defaultWidth) {\n return this.pageWidth - this.defaultWidth;\n } else {\n return popupLeft;\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CommentComponent } from './comment/comment.component';\n\n@Injectable()\nexport class CommentSetRenderService {\n\n redrawComponents(commentComponents: CommentComponent[], pageHeights: any[], rotate: number, zoom: number) {\n let prevComment: CommentComponent;\n this.sortComponents(commentComponents, pageHeights, rotate, zoom).forEach((comment: CommentComponent) => {\n this.adjustIfOverlapping(comment, prevComment, zoom);\n prevComment = comment;\n });\n }\n\n sortComponents(commentComponents: CommentComponent[], pageHeights: any[], rotate: number, zoom: number) {\n return commentComponents.sort((a: CommentComponent, b: CommentComponent) => {\n a.rectTop = this.top(a._rectangle, pageHeights[a.page - 1], rotate, zoom);\n b.rectTop = this.top(b._rectangle, pageHeights[b.page - 1], rotate, zoom);\n return this.processSort(a, b);\n });\n }\n\n private adjustIfOverlapping(comment: CommentComponent, prevComment: CommentComponent, zoom: number): void {\n if (prevComment) {\n const endOfPrevComment = prevComment.commentTop + this.height(prevComment);\n if (comment.commentTop <= endOfPrevComment) {\n comment.rectTop = (endOfPrevComment - comment.totalPrevPagesHeight) / zoom;\n }\n }\n }\n\n private processSort(a: CommentComponent, b: CommentComponent): number {\n if (this.onSameLine(a, b)) {\n return a.rectLeft >= b.rectLeft ? 1 : -1;\n }\n return a.commentTop >= b.commentTop ? 1 : -1;\n }\n\n private onSameLine(a: CommentComponent, b: CommentComponent): boolean {\n return this.difference(a.commentTop, b.commentTop) === 0;\n }\n\n private top(rectangle: { x, y, height, width }, height: number, rotate: number, zoom: number) {\n const actualHeight = height / zoom;\n switch (rotate) {\n case 90: return rectangle.x;\n case 180: return actualHeight - (rectangle.y + rectangle.height);\n case 270: return actualHeight - (rectangle.x + rectangle.width);\n default: return rectangle.y;\n }\n }\n\n private height(element: any) {\n return element.form.nativeElement.getBoundingClientRect().height;\n }\n\n private difference(a: number, b: number): number { return Math.abs(a - b); }\n}\n","import {\n Component,\n ElementRef,\n Input, OnChanges,\n OnDestroy,\n OnInit,\n QueryList, SimpleChanges,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { select, Store } from '@ngrx/store';\n\nimport { AnnotationSet } from '../annotation-set/annotation-set.model';\nimport { Annotation } from '../annotation-set/annotation-view/annotation.model';\nimport { Comment } from './comment/comment.model';\nimport { CommentComponent } from './comment/comment.component';\nimport { CommentService } from './comment/comment.service';\nimport { CommentSetRenderService } from './comment-set-render.service';\nimport * as fromStore from '../../store/reducers/reducers';\nimport * as fromActions from '../../store/actions/annotation.actions';\nimport * as fromSelectors from '../../store/selectors/annotation.selectors';\nimport { TagsModel } from '../models/tags.model';\nimport { SelectionAnnotation } from '../models/event-select.model';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\n\n@Component({\n selector: 'mv-comment-set',\n templateUrl: './comment-set.component.html',\n })\nexport class CommentSetComponent implements OnInit, OnDestroy, OnChanges {\n\n @Input() annotationSet: AnnotationSet;\n @Input() zoom: number;\n @Input() rotate: number;\n @Input() height: number;\n @Input() pageHeights = [];\n @Input() contentScrollTop: number;\n\n comments: Comment[];\n tags: TagsModel[];\n private subscriptions: Subscription[] = [];\n public comments$: Observable<Annotation[]>;\n public annoEntities$: Observable<{ [id: string]: Annotation }>;\n\n @ViewChild('container', {static: false}) container: ElementRef<HTMLDivElement>;\n @ViewChild('panel', {static: false}) panel: ElementRef<HTMLDivElement>;\n @ViewChildren('commentComponent') commentComponents: QueryList<CommentComponent>;\n\n showCommentsPanel: boolean;\n\n constructor(private store: Store<fromStore.AnnotationSetState>,\n private readonly commentService: CommentService,\n private readonly renderService: CommentSetRenderService,\n private readonly toolbarEvents: ToolbarEventService) {\n this.clearSelection();\n }\n\n ngOnInit() {\n this.comments$ = this.store.pipe(select(fromSelectors.getCommentsArray));\n this.annoEntities$ = this.store.pipe(select(fromSelectors.getAnnotationEntities));\n this.subscriptions.push(\n this.toolbarEvents.commentsPanelVisible.subscribe(toggle => {\n this.redrawComments();\n this.showCommentsPanel = toggle;\n })\n );\n this.subscriptions.push(this.toolbarEvents.rotateSubject.subscribe(rotate => this.rotateDocument()));\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.annotationSet) {\n this.commentService.setCommentSet(this);\n }\n if (changes.contentScrollTop) {\n if (this.container) {\n this.container.nativeElement.scrollTo(0, this.contentScrollTop);\n }\n }\n }\n\n ngOnDestroy() {\n if (this.subscriptions.length > 0) {\n this.subscriptions.forEach(subscription => subscription.unsubscribe());\n }\n }\n\n public onSelect(annotationId: SelectionAnnotation) {\n this.store.dispatch(new fromActions.SelectedAnnotation(annotationId));\n }\n\n public onCommentDelete(comment: Comment) {\n const annotation = this.annotationSet.annotations.find(anno => anno.id === comment.annotationId);\n const comments = [];\n const annot = {\n ...annotation,\n comments\n };\n this.onAnnotationUpdate(annot);\n this.redrawComments();\n }\n\n redrawComments() {\n setTimeout(() => {\n const componentList: CommentComponent[] = this.commentComponents.map(comment => comment);\n this.renderService.redrawComponents(componentList, this.pageHeights, this.rotate, this.zoom);\n }, 0);\n }\n\n private rotateDocument() {\n if (this.panel) {\n this.panel.nativeElement.style.height = '0';\n }\n }\n\n public onCommentUpdate(payload: {comment: Comment, tags: TagsModel[]} ) {\n const annotation = this.annotationSet.annotations.find(anno => anno.id === payload.comment.annotationId);\n const comments = [payload.comment];\n const tags = payload.tags;\n const annot = {\n ...annotation,\n comments,\n tags\n };\n this.onAnnotationUpdate(annot);\n }\n\n public onAnnotationUpdate(annotation: Annotation) {\n this.store.dispatch(new fromActions.SaveAnnotation(annotation));\n }\n\n onContainerClick(e) {\n if (e.path && e.path[0] === this.panel.nativeElement) {\n this.clearSelection();\n }\n }\n\n clearSelection() {\n this.store.dispatch(new fromActions.SelectedAnnotation({ annotationId: '', editable: false, selected: false}));\n }\n\n allCommentsSaved() {\n this.commentService.allCommentsSaved();\n }\n}\n","import { AfterContentChecked, Directive, ElementRef, HostListener } from '@angular/core';\n\n@Directive({\n selector: '[mvTextAreaAutoExpand]'\n})\nexport class TextareaAutoExpandDirective implements AfterContentChecked {\n\n constructor(private el: ElementRef) {\n }\n\n ngAfterContentChecked(): void {\n this.adjustHeight();\n }\n\n @HostListener('input') onMouseDown() {\n this.adjustHeight();\n }\n\n adjustHeight(): void {\n const nativeElement = this.el.nativeElement;\n nativeElement.style.overflow = 'hidden';\n nativeElement.style.height = 'auto';\n nativeElement.style.height = nativeElement.scrollHeight - 5 + 'px';\n }\n\n}\n","import {Component, Input, ViewChild, ElementRef, OnInit, OnDestroy} from '@angular/core';\nimport { FormBuilder, FormControl, FormGroup } from '@angular/forms';\nimport { combineLatest, Observable, Subscription } from 'rxjs';\nimport {select, Store} from '@ngrx/store';\n\nimport { PrintService } from '../../print.service';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\nimport * as fromSelectors from '../../store/selectors/annotation.selectors';\nimport * as fromStore from '../../store/reducers/reducers';\nimport * as fromAnnoActions from '../../store/actions/annotation.actions';\nimport * as fromTagSelectors from '../../store/selectors/tag.selectors';\n\n@Component({\n selector: 'mv-comments-summary',\n templateUrl: './comments-summary.component.html',\n})\nexport class CommentsSummaryComponent implements OnInit, OnDestroy {\n\n @Input() title: string;\n @Input() contentType: string;\n @ViewChild('outerContainer', {static: true}) container: ElementRef;\n @ViewChild('commentContainer', {static: false}) commentsTable: ElementRef;\n public comments$: Observable<any>;\n public filtersFg: FormGroup;\n private $subscriptions: Subscription;\n allTags$: Observable<{key: string; length: number}[]>;\n showFilters = false;\n hasFilter = false;\n\n constructor(\n private store: Store<fromStore.AnnotationSetState>,\n private readonly printService: PrintService,\n private readonly toolbarEvents: ToolbarEventService,\n private fb: FormBuilder\n ) {}\n\n ngOnInit(): void {\n this.filtersFg = this.fb.group({\n dateRangeFrom: new FormGroup({\n day: new FormControl(''),\n month: new FormControl(''),\n year: new FormControl('')\n }),\n dateRangeTo: new FormGroup({\n day: new FormControl(''),\n month: new FormControl(''),\n year: new FormControl('')\n }),\n tagFilters: this.fb.group({}),\n });\n this.comments$ = this.store.pipe(select(fromSelectors.getCommentSummary));\n this.buildCheckBoxForm();\n this.container.nativeElement.focus();\n }\n\n buildCheckBoxForm() {\n this.filtersFg.reset();\n const checkboxes = <FormGroup>this.filtersFg.get('tagFilters');\n const filters$ = this.store.pipe(select(fromSelectors.getCommentSummaryFilters));\n this.allTags$ = this.store.pipe(select(fromTagSelectors.getAllTagsArr));\n this.$subscriptions = combineLatest([this.allTags$, filters$]).subscribe(([tags, filters]) => {\n this.hasFilter = filters.hasFilter;\n tags.forEach((val) => {\n const checkBoxValue = (filters.filters.tagFilters &&\n filters.filters.tagFilters.hasOwnProperty(val.key)) ?\n filters.filters.tagFilters[val.key] : false;\n checkboxes.addControl(val.key, new FormControl(checkBoxValue));\n });\n this.filtersFg.updateValueAndValidity();\n });\n }\n\n onClearFilters() {\n this.store.dispatch(new fromAnnoActions.ClearCommentSummaryFilters());\n this.buildCheckBoxForm();\n }\n\n onFilter() {\n const { value } = this.filtersFg;\n const hasDateFrom = (value.dateRangeFrom.year && value.dateRangeFrom.month && value.dateRangeFrom.day);\n const hasDateTo = (value.dateRangeTo.year && value.dateRangeTo.month && value.dateRangeTo.day);\n const dateRangeFrom = hasDateFrom ?\n new Date(value.dateRangeFrom.year, value.dateRangeFrom.month - 1, value.dateRangeFrom.day).getTime() : null;\n const dateRangeTo = hasDateTo ?\n new Date(value.dateRangeTo.year, value.dateRangeTo.month - 1, value.dateRangeTo.day).getTime() : null;\n this.store.dispatch(new fromAnnoActions.ApplyCommentSymmaryFilter({...value, dateRangeFrom, dateRangeTo}));\n }\n\n onFiltersToggle() {\n this.showFilters = !this.showFilters;\n }\n\n public onClose(): void {\n this.toolbarEvents.toggleCommentsSummary(false);\n }\n\n public onPrint(): void {\n this.printService.printElementNatively(this.commentsTable.nativeElement, 1000, 900);\n }\n\n navigateToPage(pageNumber: number) {\n if (this.contentType === 'pdf') {\n this.toolbarEvents.setPage(pageNumber);\n }\n this.toolbarEvents.toggleCommentsSummary(false);\n this.toolbarEvents.toggleCommentsPanel(true);\n }\n\n ngOnDestroy(): void {\n this.$subscriptions.unsubscribe();\n }\n}\n","import { Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';\nimport { v4 as uuid } from 'uuid';\nimport { Subscription } from 'rxjs';\nimport { ToolbarEventService } from '../../../../toolbar/toolbar.module';\nimport { Rectangle } from '../../annotation-view/rectangle/rectangle.model';\nimport { HighlightCreateService } from '../highlight-create/highlight-create.service';\n\n@Component({\n selector: 'mv-box-highlight-create',\n templateUrl: './box-highlight-create.component.html',\n})\nexport class BoxHighlightCreateComponent implements OnInit, OnDestroy {\n\n @Input() page: number;\n @Input() pageHeight: number;\n @Input() pageWidth: number;\n @Input() rotate: number;\n @Input() zoom: number;\n @Input() container: { top: number, left: number };\n\n @Output() saveSelection = new EventEmitter<{ rectangles: Rectangle[], page: number }>();\n\n @ViewChild('boxHighlight', { static: false }) highlight: ElementRef;\n\n drawStartX = -1;\n drawStartY = -1;\n top: number;\n left: number;\n height: number;\n width: number;\n display: string;\n drawMode: boolean;\n defaultHeight: string;\n defaultWidth: string;\n position: string;\n backgroundColor = 'none';\n wholePage: boolean;\n\n private subscriptions: Subscription[] = [];\n\n constructor(private readonly toolbarEvents: ToolbarEventService,\n private readonly highlightService: HighlightCreateService) { }\n\n ngOnInit(): void {\n this.subscriptions = [\n this.toolbarEvents.drawModeSubject.subscribe(drawMode => {\n this.defaultHeight = drawMode ? '100%' : '0px';\n this.defaultWidth = drawMode ? '100%' : '0px';\n }),\n this.toolbarEvents.redactWholePage.subscribe(() => {\n this.wholePage = true;\n })\n ];\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach(subscription => {\n subscription.unsubscribe();\n });\n }\n\n initHighlight({ offsetX, offsetY }) {\n if (this.wholePage) {\n this.highlightPage();\n return;\n }\n this.position = 'absolute';\n this.backgroundColor = 'yellow';\n this.drawStartX = offsetX;\n this.drawStartY = offsetY;\n\n this.display = 'block';\n this.height = 50;\n this.width = 50;\n\n this.top = this.drawStartY;\n this.left = this.drawStartX;\n\n switch (this.rotate) {\n case 90:\n this.top = this.drawStartY - this.height;\n break;\n case 180:\n this.top = this.drawStartY - this.height;\n this.left = this.drawStartX - this.width;\n break;\n case 270:\n this.left = this.drawStartX - this.width;\n break;\n }\n }\n\n updateHighlight({ currentTarget, clientX, clientY }) {\n const rect = currentTarget.getBoundingClientRect(),\n offsetX = clientX - rect.left,\n offsetY = clientY - rect.top;\n if (this.drawStartX > 0 && this.drawStartY > 0) {\n this.height = Math.abs(offsetY - this.drawStartY);\n this.width = Math.abs(offsetX - this.drawStartX);\n this.top = Math.min(offsetY, this.drawStartY);\n this.left = Math.min(offsetX, this.drawStartX);\n }\n }\n\n createHighlight() {\n if (this.height / this.zoom > 5 || this.width / this.zoom > 5) {\n let rectangle = this.highlightService\n .applyRotation(this.pageHeight, this.pageWidth, this.height, this.width, this.top, this.left, this.rotate, this.zoom);\n rectangle = { id: uuid(), ...rectangle } as any;\n this.saveSelection.emit({ rectangles: [rectangle], page: this.page });\n this.resetHighlight();\n }\n }\n\n private resetHighlight() {\n this.drawStartX = -1;\n this.drawStartY = -1;\n this.display = 'none';\n this.width = 0;\n this.height = 0;\n this.wholePage = false;\n }\n\n private highlightPage() {\n this.height = this.pageHeight;\n this.width = this.pageWidth;\n this.top = 0;\n this.left = 0;\n this.createHighlight();\n }\n}\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewEncapsulation } from '@angular/core';\nimport { Annotation } from '../../annotation-set/annotation-view/annotation.model';\nimport { select, Store } from '@ngrx/store';\nimport * as fromStore from '../../../store/reducers/reducers';\nimport * as fromTagSelectors from '../../../store/selectors/tag.selectors';\nimport * as fromAnnoSelector from '../../../store/selectors/annotation.selectors';\nimport { combineLatest, Subscription } from 'rxjs';\nimport { ToolbarEventService } from '../../../toolbar/toolbar-event.service';\nimport { CommentService } from '../comment/comment.service';\n\n@Component({\n selector: 'mv-comment-set-header',\n templateUrl: './comment-set-header.component.html',\n encapsulation: ViewEncapsulation.None,\n})\nexport class CommentSetHeaderComponent implements OnInit, OnDestroy {\n\n @Input() public showCommentSummary: boolean;\n @Output() public readonly showCommentSummaryDialog = new EventEmitter();\n\n marginToComment: boolean;\n tabs: {isFiltered?: boolean; label: string}[] = [];\n tabSelected = '';\n isFiltered: boolean;\n navigationList: Annotation[];\n $subscriptions: Subscription;\n\n constructor(private store: Store<fromStore.State>,\n private commentService: CommentService,\n public toolbarEvents: ToolbarEventService) {}\n\n ngOnInit(): void {\n const tagFilter$ = this.store.pipe(select(fromTagSelectors.getTagFilters));\n const filteredAnnotation$ = this.store.pipe(select(fromAnnoSelector.getFilteredAnnotations));\n\n this.$subscriptions = combineLatest([tagFilter$, filteredAnnotation$]).subscribe(([formData, filteredAnno]) => {\n this.navigationList = filteredAnno;\n this.tabs = this.navigationList.length > 0 ?\n [{label: 'comments'}, {label: 'filter'}, {label: 'search'}] : [{label: 'comments'}];\n this.isFiltered = !formData.length;\n this.tabs = [...this.tabs].map((tab) => {\n return !this.isFiltered && tab.label === 'filter' ? {...tab, isFiltered: true} : {...tab, isFiltered: false};\n });\n });\n }\n\n public toggleCommentsSummary(): void {\n this.showCommentSummaryDialog.emit();\n }\n\n selectTab(tab: string) {\n this.tabSelected = tab !== this.tabSelected ? tab : undefined;\n if (this.tabSelected) {\n this.marginToComment = true;\n this.commentService.createMarginToCommentEvent(this.marginToComment);\n } else {\n this.marginToComment = false;\n this.commentService.createMarginToCommentEvent(this.marginToComment);\n }\n }\n\n public toggleCommentsPanel() {\n this.toolbarEvents.toggleCommentsPanel(!this.toolbarEvents.commentsPanelVisible.getValue());\n }\n\n ngOnDestroy(): void {\n this.$subscriptions.unsubscribe();\n }\n}\n","import { AfterViewInit, Component, ElementRef, Input, OnDestroy, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { Annotation } from '../../../annotation-set/annotation-view/annotation.model';\nimport { Store } from '@ngrx/store';\nimport * as fromStore from '../../../../store/reducers/reducers';\nimport * as fromActions from '../../../../store/actions/annotation.actions';\n\n@Component({\n selector: 'mv-comment-search',\n templateUrl: './comment-search.component.html',\n encapsulation: ViewEncapsulation.None\n})\nexport class CommentSearchComponent implements AfterViewInit, OnDestroy {\n\n @Input() public readonly annotations: Annotation[];\n\n @ViewChild('searchInput', {static: false}) searchInput: ElementRef<HTMLInputElement>;\n\n searchString: string;\n searchResults: Annotation[] = [];\n searchIndex = 0;\n\n constructor(private store: Store<fromStore.AnnotationSetState>) {}\n\n ngAfterViewInit(): void {\n if (this.searchInput) {\n this.searchInput.nativeElement.focus();\n }\n }\n\n ngOnDestroy(): void {\n // TODO workaround for tab error\n setTimeout(() => {this.store.dispatch(new fromActions.SearchComment('')); }, 250);\n }\n\n searchComments(searchText: string): void {\n this.clearSearch();\n if (searchText.length > 2) {\n this.searchString = searchText;\n this.searchResults = this.annotations\n .filter(annotation => annotation.comments.length > 0)\n .filter(annotation =>\n annotation.comments[0].content.toLowerCase().includes(this.searchString.toLowerCase()));\n if (this.searchResults.length > 0) {\n this.store.dispatch(new fromActions.SearchComment(searchText));\n }\n }\n }\n\n clearSearch() {\n this.searchString = undefined;\n this.searchResults = [];\n this.searchIndex = 0;\n this.store.dispatch(new fromActions.SearchComment(''));\n }\n}\n","import { AfterViewChecked, Directive, ElementRef, Input } from '@angular/core';\n\n@Directive({\n selector: '[mvTextHighlight]'\n})\nexport class TextHighlightDirective implements AfterViewChecked {\n\n @Input() textToHighlight: string;\n\n constructor(private element: ElementRef<HTMLElement>) {}\n\n ngAfterViewChecked(): void {\n if (this.textToHighlight) {\n this.highlightInputText(this.textToHighlight);\n }\n }\n\n highlightInputText(textToHighlight: string) {\n this.resetHighlight();\n this.textToHighlight = textToHighlight;\n const searchPattern = new RegExp(textToHighlight, 'gi');\n const hostElement = this.element.nativeElement;\n if (hostElement.innerHTML.match(searchPattern)) {\n hostElement.innerHTML = hostElement.innerHTML\n .replace(searchPattern, this.highlightPattern('$&'));\n }\n this.textToHighlight = undefined;\n }\n\n resetHighlight() {\n const hostElement = this.element.nativeElement;\n const searchPattern = new RegExp(this.highlightPattern('(.*?)'), 'gi');\n while (hostElement.innerHTML.match(searchPattern)) {\n const matchGroups = searchPattern.exec(hostElement.innerHTML);\n if (matchGroups) {\n hostElement.innerHTML = hostElement.innerHTML.replace(matchGroups[0], matchGroups[1]);\n }\n }\n }\n\n private highlightPattern(dynamicText: string) {\n return '<span class=\"mvTextHighlight\">' + dynamicText + '</span>';\n }\n}\n","import {Component, Input, ViewEncapsulation} from '@angular/core';\nimport {TagsModel} from '../models/tags.model';\nimport {TagsServices} from '../services/tags/tags.services';\nimport {FormControl} from '@angular/forms';\nimport {Observable} from 'rxjs';\n\n@Component({\n selector: 'mv-tags',\n templateUrl: './tags.component.html',\n encapsulation: ViewEncapsulation.None\n})\nexport class TagsComponent {\n @Input() tagItems: TagsModel[];\n @Input() userId: string;\n @Input() editable: boolean;\n @Input() annoId: string;\n\n public validators = [this.minLength, this.maxLength20];\n public errorMessages: {[id: string]: string} = {\n 'minLength': 'Minimum of 2 characters',\n 'maxLength20': 'Maximum of 20 characters'\n };\n\n constructor(private tagsServices: TagsServices) {}\n\n onUpdateTags(value) {\n this.tagsServices.updateTagItems(value, this.annoId);\n }\n\n public requestAutocompleteItems = (text: string): Observable<any[]> => {\n return this.tagsServices.getAllTags(this.userId);\n }\n\n private minLength(control: FormControl) {\n if (control.value.length < 2) {\n return {\n 'minLength': true\n };\n }\n return null;\n }\n\n private maxLength20(control: FormControl) {\n if (control.value.length >= 20) {\n return {\n 'maxLength20': true\n };\n }\n return null;\n }\n}\n","import { Component, Input, OnChanges, SimpleChanges, ViewEncapsulation } from '@angular/core';\nimport { Rectangle } from '../../annotation-set/annotation-view/rectangle/rectangle.model';\nimport { Annotation } from '../../annotation-set/annotation-view/annotation.model';\nimport {Store} from '@ngrx/store';\nimport * as fromStore from '../../../store/reducers/reducers';\nimport * as fromActions from '../../../store/actions/annotation.actions';\nimport {ToolbarEventService} from '../../../toolbar/toolbar-event.service';\n\n@Component({\n selector: 'mv-comments-navigate',\n templateUrl: './comments-navigate.component.html',\n encapsulation: ViewEncapsulation.None\n})\nexport class CommentsNavigateComponent implements OnChanges {\n\n @Input() public annotationList: Annotation[];\n @Input() autoSelect = false;\n\n navigationList: any[] = [];\n index = 0;\n\n constructor(private store: Store<fromStore.AnnotationSetState>, public readonly toolbarEvents: ToolbarEventService) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.annotationList) {\n this.initNavigationList();\n }\n }\n\n initNavigationList(): void {\n this.index = 0;\n this.navigationList = [...this.annotationList || []]\n .map(annotation => ({\n content: annotation.comments[0].content,\n annotationId: annotation.id,\n page: annotation.page,\n rectangle: this.upperRectangle(annotation.rectangles),\n }))\n .sort(this.sortComments);\n\n if (this.autoSelect) {\n this.toolbarEvents.setPage(Number.parseInt(this.navigationList[0].page, 0));\n this.store.dispatch(new fromActions.SelectedAnnotation({\n annotationId: this.navigationList[0].annotationId,\n editable: false,\n selected: true\n }));\n }\n }\n\n sortComments(mappedCommentA, mappedCommentB) {\n if (mappedCommentA.page !== mappedCommentB.page) {\n return mappedCommentA.page - mappedCommentB.page;\n } else {\n const rectA = mappedCommentA.rectangle;\n const rectB = mappedCommentB.rectangle;\n if (rectA.y !== rectB.y) {\n return rectA.y - rectB.y;\n } else {\n return rectA.x - rectB.x;\n }\n }\n }\n\n nextItem() {\n this.index += 1;\n if (this.index === this.annotationList.length) {\n this.index = 0;\n }\n\n this.toolbarEvents.setPage(Number.parseInt(this.navigationList[this.index].page, 0));\n this.store.dispatch(new fromActions.SelectedAnnotation({\n annotationId: this.navigationList[this.index].annotationId, editable: false, selected: true\n }));\n }\n\n\n prevItem() {\n this.index -= 1;\n if (this.index < 0) {\n this.index = this.navigationList.length - 1;\n }\n this.toolbarEvents.setPage(Number.parseInt(this.navigationList[this.index].page, 0));\n this.store.dispatch(new fromActions.SelectedAnnotation({\n annotationId: this.navigationList[this.index].annotationId,\n editable: false,\n selected: true\n }));\n }\n\n upperRectangle(rectangles: Rectangle[]) {\n [...rectangles].sort((rect1, rect2) => rect1.y - rect2.y);\n return { x: rectangles[0].x, y: rectangles[0].y };\n }\n}\n","import {Component, OnDestroy, OnInit, ViewEncapsulation} from '@angular/core';\n\nimport {select, Store} from '@ngrx/store';\nimport * as fromStore from '../../../../store/reducers/reducers';\nimport * as fromSelectors from '../../../../store/selectors/tag.selectors';\nimport * as fromActions from '../../../../store/actions/tag.actions';\nimport {Observable, Subscription} from 'rxjs';\nimport {FormGroup, FormBuilder, FormControl} from '@angular/forms';\nimport {auditTime, tap} from 'rxjs/operators';\n\n\n@Component({\n selector: 'mv-comment-filter',\n templateUrl: './comment-filter.component.html',\n encapsulation: ViewEncapsulation.None\n})\nexport class CommentFilterComponent implements OnInit, OnDestroy {\n tagGroup: FormGroup;\n $subscriptions: Subscription;\n filter$: Observable<string[]>;\n allTags$: Observable<any>;\n searchValue: string;\n isPreview = false;\n constructor(\n private store: Store<fromStore.State>,\n private fb: FormBuilder) {}\n\n ngOnInit(): void {\n this.tagGroup = this.fb.group({\n 'tagFilters': this.fb.group({}),\n });\n this.filter$ = this.store.pipe(select(fromSelectors.getTagFilters));\n this.$subscriptions = this.tagGroup.valueChanges.pipe(auditTime(5)).subscribe(value => {\n const tagFilters = value['tagFilters'];\n this.store.dispatch(new fromActions.AddFilterTags(tagFilters));\n });\n this.buildFrom();\n\n }\n\n buildFrom() {\n const checkboxes = <FormGroup>this.tagGroup.get('tagFilters');\n this.allTags$ = this.store.pipe(select(fromSelectors.getAllTagsArr)).pipe(tap(tags => {\n this.tagGroup.reset();\n tags.forEach((value) => {\n checkboxes.addControl(value.key, new FormControl(false));\n });\n }));\n }\n\n onClearFilters() {\n this.tagGroup.reset();\n this.store.dispatch(new fromActions.ClearFilterTags());\n }\n\n ngOnDestroy(): void {\n this.$subscriptions.unsubscribe();\n }\n\n onRemoveFilter(tagName) {\n const checkboxes = <FormGroup>this.tagGroup.get('tagFilters');\n checkboxes.controls[tagName].setValue(false);\n }\n\n onToggleFilterView() {\n this.isPreview = !this.isPreview;\n }\n\n\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport moment from 'moment-timezone';\n/**\n * A moment timezone pipe to support parsing based on time zone abbreviations\n * covers all cases of offset variation due to daylight saving.\n *\n * Same API as DatePipe with additional timezone abbreviation support\n * Official date pipe dropped support for abbreviations names from Angular V5\n */\n@Pipe({\n name: 'momentDate'\n})\nexport class MomentDatePipe extends DatePipe implements PipeTransform {\n\n transform(\n value: string | Date,\n format: string = 'mediumDate',\n timezone: string = 'Europe/London'\n ): any {\n const timezoneOffset = moment(value).tz(timezone).format('Z');\n return super.transform(value, format, timezoneOffset);\n }\n}\n","import { Observable } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { map } from 'rxjs/operators';\nimport { Bookmark } from '../../../viewers/pdf-viewer/side-bar/bookmarks/bookmarks.interfaces';\n\n@Injectable()\nexport class BookmarksApiService {\n\n private readonly ANNOTATIONS_API = '/em-anno';\n\n constructor(\n private readonly httpClient: HttpClient\n ) {}\n\n public getBookmarks(documentId: string): Observable<any> {\n return this.httpClient\n .get(`${this.ANNOTATIONS_API}/${documentId}/bookmarks`,\n { observe: 'response' , withCredentials: true });\n }\n\n public createBookmark(bookmark: Partial<Bookmark>): Observable<Bookmark> {\n return this.httpClient\n .post<Bookmark>(`${this.ANNOTATIONS_API}/bookmarks`,\n bookmark, { observe: 'response' , withCredentials: true })\n .pipe(map(response => response.body));\n }\n\n public updateBookmark(bookmark: Partial<Bookmark>): Observable<Bookmark> {\n return this.httpClient\n .put<Bookmark>(`${this.ANNOTATIONS_API}/bookmarks`,\n bookmark, { observe: 'response' , withCredentials: true })\n .pipe(map(response => response.body));\n }\n\n public updateMultipleBookmarks(bookmarks: Partial<Bookmark[]>): Observable<Bookmark[]> {\n return this.httpClient\n .put<Bookmark[]>(`${this.ANNOTATIONS_API}/bookmarks_multiple`,\n bookmarks, { observe: 'response' , withCredentials: true })\n .pipe(map(response => response.body));\n }\n\n public deleteBookmark(bookmarkId: string): Observable<void> {\n return this.httpClient\n .delete<void>(`${this.ANNOTATIONS_API}/bookmarks/${bookmarkId}`,\n { observe: 'response' , withCredentials: true })\n .pipe(map(response => response.body));\n }\n\n public deleteMultipleBookmarks(payload: { deleted: string[], updated: Bookmark }): Observable<void> {\n return this.httpClient\n .request<void>('DELETE', `${this.ANNOTATIONS_API}/bookmarks_multiple`,\n { body: payload, observe: 'response' , withCredentials: true })\n .pipe(map(response => response.body));\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'filter'\n})\nexport class FilterPipe implements PipeTransform {\n\n transform(items: any[], searchText: string, fieldName: string): any[] {\n\n if (!items) {\n return [];\n }\n\n if (!searchText) {\n return items;\n }\n\n return items.filter(item => {\n if (item) {\n if (item[fieldName]) {\n return item[fieldName].toLowerCase().includes(searchText.toLowerCase());\n } else {\n return item.toLowerCase().includes(searchText.toLowerCase());\n }\n }\n return false;\n });\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'unsnake'\n})\nexport class UnsnakePipe implements PipeTransform {\n\n transform(items: string): string {\n return items.split('_').join(' ');\n }\n\n}\n","import {Component, Input} from '@angular/core';\n/*\n* Gov UK Date Component\n* Responsible for displaying 3 input fields:\n* day / month / year\n* displaying errorMessage messages\n* */\n@Component({\n selector: 'mv-gov-uk-date',\ntemplateUrl: './gov-uk-date.component.html'\n})\nexport class GovUkDateComponent {\n @Input() config: { id: string; legend: string };\n @Input() errorMessage: {isInvalid: boolean; messages: string[]};\n @Input() formGroup;\n}\n","import {Component, Directive, Input} from '@angular/core';\n/*\n* Gov UK Error Message\n* Responsible for displaying in-line error messages\n* @prop config - obj with properties\n* @prop errorMessage - all error bject with messages property that is arry of strings.\n* */\n@Component({\n selector: ' mv-gov-uk-error-message',\n template: `\n <span class=\"govuk-error-message\" [id]=\"config.id + '-error'\" *ngFor=\"let message of errorMessage?.messages\">\n <span class=\"govuk-visually-hidden\">Error:</span>{{message}}\n </span>\n `\n})\nexport class GovUkErrorMessageComponent {\n constructor () { }\n @Input() config: { id: string };\n @Input() errorMessage;\n}\n","/**\n * Helper Class\n * Used for dynamic templates manipulation\n * */\n\nexport class HtmlTemplatesHelper {\n\n static setDescribedBy(errorMessage, config) {\n if (!errorMessage) {\n return config.hint ? `${config.id}-hint` : null;\n } else if (errorMessage && errorMessage.isInvalid) {\n return config.hint ? `${config.id}-hint ${config.id}-error` : `${config.id}-error`;\n } else {\n return config.hint ? `${config.id}-hint` : null;\n }\n }\n}\n","import {Component, Input} from '@angular/core';\nimport {HtmlTemplatesHelper} from '../util/helpers/html-templates.helper';\n/*\n* Gov Uk Fieldset Component\n* Used to wrap group fieldset elements\n* it can conditionally display h1 tag\n* @param config\n* @param isHeading\n* @param errorMessage - used for aria tag\n* */\n@Component({\n selector: 'mv-gov-uk-fieldset',\n template: `\n <fieldset class=\"govuk-fieldset\" [attr.aria-describedby]=\"setDescribedBy()\">\n <legend [class]=\"config.classes + ' govuk-fieldset__legend'\" *ngIf=\"!isHeading\">\n {{config.legend}}\n </legend>\n\n <legend [class]=\"config.classes + ' govuk-fieldset__legend'\" *ngIf=\"isHeading\">\n <h1>{{config.legend}}</h1>\n </legend>\n\n <span [id]=\"config.id+'-hint'\" class=\"govuk-hint\" *ngIf=\"config.hint\">\n {{config.hint}}\n </span>\n <ng-content></ng-content>\n </fieldset>\n `\n})\nexport class GovUkFieldsetComponent {\n @Input() config: {legend: string; classes: string, id: string, hint: string, key: string};\n @Input() isHeading: boolean;\n @Input() errorMessage: string[];\n\n setDescribedBy(): string {\n return HtmlTemplatesHelper.setDescribedBy(this.errorMessage, this.config);\n }\n}\n","import {Component, Input} from '@angular/core';\n\n/*\n* Gov UK Label component\n* Responsible for displaying label tag\n* @prop isPageHading - boolean to display h1\n* @prop config - obj with properties\n* */\n@Component({\n selector: 'mv-gov-label',\n template: `<h1 *ngIf=\"config.isPageHeading else noHeading\">\n <label *ngIf=\"config.label\" [class]=\"config.classes + ' govuk-label'\"\n [for]=\"config.id\" [innerHTML]=\"config.label\">\n </label>\n </h1>\n <ng-template #noHeading>\n <label *ngIf=\"config.label\" [class]=\"config.classes + ' govuk-label'\"\n [for]=\"config.id\" [innerHTML]=\"config.label\">\n </label>\n </ng-template>\n `\n})\nexport class GovUkLabelComponent {\n constructor () { }\n @Input() config: { label: string, name: string; id: string, isPageHeading, classes: string };\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {GovUkDateComponent} from './gov-uk-date/gov-uk-date.component';\nimport {GovUkErrorMessageComponent} from './gov-uk-error-message/gov-uk-error-message.component';\nimport {GovUkFieldsetComponent} from './gov-uk-fieldset/gov-uk-fieldset.component';\nimport {GovUkLabelComponent} from './gov-uk-label/gov-uk-label.component';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {RouterModule} from '@angular/router';\n\n\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n RouterModule\n ],\n declarations: [\n GovUkDateComponent,\n GovUkErrorMessageComponent,\n GovUkFieldsetComponent,\n GovUkLabelComponent\n\n ],\n exports: [\n GovUkDateComponent,\n GovUkErrorMessageComponent,\n GovUkFieldsetComponent,\n GovUkLabelComponent\n ]\n})\nexport class SharedModule {}\n","import {createSelector} from '@ngrx/store';\n\nimport * as fromFeature from '../reducers/reducers';\nimport * as fromBookmarks from '../reducers/bookmarks.reducer';\nimport { generateBookmarkNodes } from '../bookmarks-store-utils';\nimport * as fromDocument from './document.selectors';\n\nexport const getBookmarkState = createSelector(\n fromFeature.getMVState,\n (state: fromFeature.State) => state.bookmarks\n);\n\nexport const getBookmarkPages = createSelector(\n getBookmarkState,\n fromBookmarks.getBookmarkPageEnt\n);\n\nexport const getBookmarkEntities = createSelector(\n getBookmarkState,\n fromBookmarks.getBookmarkEnts\n);\n\nexport const getBookmarkNodes = createSelector(\n getBookmarkEntities,\n (entities) => generateBookmarkNodes(entities)\n);\n\nexport const getEditableBookmark = createSelector(\n getBookmarkState,\n fromBookmarks.getEditBookmark\n);\n\nexport const getBookmarkInfo = createSelector(\n getBookmarkNodes,\n fromDocument.getDocumentId,\n fromDocument.getPdfPosition,\n fromDocument.getPages,\n (bookmarkNodes, docId, pdfPosition, pages) => {\n return {\n pageNumber: pdfPosition.pageNumber - 1,\n xCoordinate: pdfPosition.left,\n yCoordinate: pages[pdfPosition.pageNumber].styles.height - (pdfPosition.top * pages[pdfPosition.pageNumber].viewportScale),\n previous: bookmarkNodes.length > 0 ? bookmarkNodes.sort((a, b) => a.index - b.index)[bookmarkNodes.length - 1].id : undefined,\n documentId: docId\n };\n }\n);\n\nexport const getBookmarksPerPage = createSelector(\n fromDocument.getPages,\n getBookmarkPages,\n (pages, pageEnt) => {\n if (pages && pageEnt) {\n const arr = [];\n Object.keys(pages).forEach(key => {\n const pageIdx = Number(key) - 1; // -1 as the thisPages array is 0 indexed\n const thisPage = pageEnt[pageIdx];\n arr.push({\n bookmark: thisPage ? thisPage : [],\n styles: pages[key].styles\n });\n });\n return arr;\n }\n }\n);\n","import { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { select, Store } from '@ngrx/store';\nimport { v4 as uuid } from 'uuid';\n\nimport * as fromStore from '../../../store/reducers/reducers';\nimport * as fromDocument from '../../../store/selectors/document.selectors';\nimport * as fromSelectors from '../../../store/selectors/annotation.selectors';\nimport { HighlightCreateService } from '../annotation-create/highlight-create/highlight-create.service';\nimport { Rectangle } from '../annotation-view/rectangle/rectangle.model';\nimport { CreateBookmark } from '../../../store/actions/bookmark.actions';\nimport * as fromBookmarks from '../../../store/selectors/bookmark.selectors';\nimport { ToolbarEventService } from '../../../toolbar/toolbar-event.service';\nimport { Highlight, ViewerEventService } from '../../../viewers/viewer-event.service';\n\n@Component({\n selector: 'mv-metadata-layer',\n templateUrl: './metadata-layer.component.html'\n})\nexport class MetadataLayerComponent implements OnInit, OnDestroy {\n\n @Input() zoom: number;\n @Input() rotate: number;\n\n pages: any[] = []; // todo add type\n annoPages$: Observable<any>; // todo add type\n\n drawMode = false;\n highlightPage: number;\n rectangles: Rectangle[];\n\n private $subscriptions: Subscription;\n\n constructor(\n private store: Store<fromStore.AnnotationSetState>,\n private readonly highlightService: HighlightCreateService,\n private readonly toolbarEvents: ToolbarEventService,\n private readonly viewerEvents: ViewerEventService) { }\n\n ngOnInit(): void {\n this.$subscriptions = this.store.pipe(select(fromDocument.getPages))\n .subscribe(pages => this.pages = Object.values(pages));\n this.annoPages$ = this.store.pipe(select(fromSelectors.getPageEntities));\n\n this.$subscriptions\n .add(this.toolbarEvents.drawModeSubject.subscribe(drawMode => this.drawMode = drawMode))\n .add(this.viewerEvents.textHighlight.subscribe(highlight => this.showContextToolbar(highlight)))\n .add(this.viewerEvents.ctxToolbarCleared.subscribe(() => this.clearContextToolbar()));\n }\n\n ngOnDestroy(): void {\n this.$subscriptions.unsubscribe();\n }\n\n showContextToolbar(highlight: Highlight) {\n this.highlightPage = highlight.page;\n this.rectangles = highlight.rectangles;\n if (this.rectangles) {\n this.toolbarEvents.highlightModeSubject.next(false);\n }\n }\n\n clearContextToolbar() {\n this.rectangles = undefined;\n }\n\n createHighlight() {\n this.highlightService.saveAnnotation(this.rectangles, this.highlightPage);\n this.highlightService.resetHighlight();\n this.rectangles = undefined;\n }\n\n createBookmark(rectangle: Rectangle) {\n this.store.pipe(select(fromBookmarks.getBookmarkInfo), take(1))\n .subscribe((bookmarkInfo) => {\n const selection = window.getSelection().toString();\n this.store.dispatch(new CreateBookmark({\n ...bookmarkInfo,\n name: selection.length > 0 ? selection.substr(0, 30) : 'new bookmark',\n id: uuid(),\n pageNumber: this.highlightPage - 1,\n xCoordinate: rectangle.x,\n yCoordinate: rectangle.y\n } as any));\n this.toolbarEvents.toggleSideBar(true);\n this.toolbarEvents.toggleSideBarView(false);\n this.highlightService.resetHighlight();\n this.rectangles = undefined;\n\n });\n }\n\n saveAnnotation({ rectangles, page }: { rectangles: Rectangle[], page: any }) {\n this.highlightService.saveAnnotation(rectangles, page);\n this.toolbarEvents.drawModeSubject.next(false);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport { HttpClientModule } from '@angular/common/http';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport { RouterModule } from '@angular/router';\n\nimport { MutableDivModule } from 'mutable-div';\nimport { TagInputModule } from 'ngx-chips';\nimport {NgxDatatableModule} from '@swimlane/ngx-datatable';\n\nimport { AnnotationApiService } from './services/annotation-api/annotation-api.service';\nimport { AnnotationViewComponent } from './annotation-set/annotation-view/annotation-view.component';\nimport { AnnotationSetComponent } from './annotation-set/annotation-set.component';\nimport { RectangleComponent } from './annotation-set/annotation-view/rectangle/rectangle.component';\nimport { CommentComponent } from './comment-set/comment/comment.component';\nimport { CtxToolbarComponent } from './annotation-set/ctx-toolbar/ctx-toolbar.component';\nimport { CommentSetComponent } from './comment-set/comment-set.component';\nimport { TextareaAutoExpandDirective } from './comment-set/comment/textarea-auto-expand/textarea-auto-expand.directive';\nimport { CommentsSummaryComponent } from './comments-summary/comments-summary.component';\nimport { CommentSetRenderService } from './comment-set/comment-set-render.service';\nimport { BoxHighlightCreateComponent } from './annotation-set/annotation-create/box-highlight-create/box-highlight-create.component';\nimport { HighlightCreateService } from './annotation-set/annotation-create/highlight-create/highlight-create.service';\nimport { CommentSetHeaderComponent } from './comment-set/comment-set-header/comment-set-header.component';\nimport { CommentSearchComponent } from './comment-set/comment-set-header/comment-search/comment-search.component';\nimport { TextHighlightDirective } from './comment-set/comment/text-highlight/text-highlight.directive';\nimport { TagsComponent } from './tags/tags.component';\nimport { TagsServices } from './services/tags/tags.services';\nimport { CommentsNavigateComponent } from './comment-set/comment-navigate/comments-navigate.component';\nimport {CommentFilterComponent} from './comment-set/comment-set-header/comment-filter/comment-filter.component';\nimport {MomentDatePipe} from './pipes/date/date.pipe';\nimport { BookmarksApiService } from './services/bookmarks-api/bookmarks-api.service';\nimport {FilterPipe} from './pipes/filter/filter.pipe';\nimport {UnsnakePipe} from './pipes/unsnake/unsnake.pipe';\nimport {SharedModule} from '../shared/shared.module';\nimport { MetadataLayerComponent } from './annotation-set/metadata-layer/metadata-layer.component';\nimport { CommentService } from './comment-set/comment/comment.service';\n\n@NgModule({\n imports: [\n A11yModule,\n CommonModule,\n FormsModule,\n HttpClientModule,\n MutableDivModule,\n TagInputModule,\n RouterModule,\n ReactiveFormsModule,\n NgxDatatableModule,\n SharedModule\n ],\n declarations: [\n MetadataLayerComponent,\n AnnotationViewComponent,\n BoxHighlightCreateComponent,\n AnnotationSetComponent,\n RectangleComponent,\n CommentComponent,\n CommentSetHeaderComponent,\n CommentSearchComponent,\n TextHighlightDirective,\n CtxToolbarComponent,\n CommentSetComponent,\n CommentsNavigateComponent,\n TextareaAutoExpandDirective,\n CommentsSummaryComponent,\n TagsComponent,\n MomentDatePipe,\n CommentFilterComponent,\n FilterPipe,\n UnsnakePipe\n ],\n entryComponents: [\n AnnotationViewComponent,\n AnnotationSetComponent,\n CommentSetComponent\n ],\n providers: [\n AnnotationApiService,\n BookmarksApiService,\n CommentSetRenderService,\n HighlightCreateService,\n CommentService,\n TagsServices\n ],\n exports: [\n AnnotationViewComponent,\n BoxHighlightCreateComponent,\n AnnotationSetComponent,\n CommentSetComponent,\n CommentSetHeaderComponent,\n CommentSearchComponent,\n CommentsSummaryComponent,\n TagsComponent,\n CommentFilterComponent,\n MomentDatePipe,\n FilterPipe,\n UnsnakePipe,\n MetadataLayerComponent\n ]\n})\nexport class AnnotationsModule { }\n","import { Directive, ElementRef, HostListener, Input } from '@angular/core';\n\n\n@Directive({\n selector: '[mvGrabNDrag]'\n})\nexport class GrabNDragDirective {\n\n originalPosition: { left: number; top: number };\n private pointerDown = false;\n\n @Input() dragEnabled = false;\n @Input() dragX: Element;\n\n constructor(private el: ElementRef) {\n }\n\n @HostListener('pointerdown', ['$event'])\n onPointerDown(event: PointerEvent) {\n if (this.dragEnabled) {\n event.preventDefault();\n this.pointerDown = true;\n this.originalPosition = {\n left: event.clientX + this.el.nativeElement.scrollLeft,\n top: event.clientY + this.el.nativeElement.scrollTop,\n };\n }\n }\n\n @HostListener('window:pointermove', ['$event'])\n onPointerMove(event: PointerEvent) {\n if (this.pointerDown && this.dragEnabled) {\n event.preventDefault();\n const scrollDiff = {\n left: this.originalPosition.left - (event.clientX + this.el.nativeElement.scrollLeft),\n top: this.originalPosition.top - (event.clientY + this.el.nativeElement.scrollTop)\n };\n if (this.dragEnabled) {\n this.dragX.scrollLeft += scrollDiff.left;\n this.el.nativeElement.scrollTop += scrollDiff.top;\n }\n }\n }\n\n @HostListener('window:pointerup') onWindowPointerUp() {\n this.pointerDown = false;\n }\n}\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core';\nimport { select, Store } from '@ngrx/store';\nimport { Subscription } from 'rxjs';\nimport { TreeComponent, TreeNode } from '@circlon/angular-tree-component';\n\nimport { CreateBookmark, DeleteBookmark, MoveBookmark, UpdateBookmark } from '../../../../store/actions/bookmark.actions';\nimport { Bookmark } from '../../../../store/models/bookmarks.interface';\nimport * as bookmarksSelectors from '../../../../store/selectors/bookmark.selectors';\nimport { AnnotationSetState } from '../../../../store/reducers/annotations.reducer';\nimport { DocumentPages } from '../../../../store/reducers/document.reducer';\nimport * as fromDocument from '../../../../store/selectors/document.selectors';\nimport * as fromBookmarks from '../../../../store/reducers/bookmarks.reducer';\nimport { getBookmarkChildren } from '../../../../store/bookmarks-store-utils';\nimport { take } from 'rxjs/operators';\nimport uuid from 'uuid';\n\n@Component({\n selector: 'mv-bookmarks',\n templateUrl: './bookmarks.component.html'\n})\nexport class BookmarksComponent implements OnInit, OnDestroy {\n\n @Input() bookmarkNodes: Bookmark[];\n @Input() zoom: number;\n @Input() rotate: number;\n @Output() goToDestination = new EventEmitter<any[]>();\n\n pageLookup: { [pageId: number]: DocumentPages } = {};\n editableBookmark: string;\n BOOKMARK_CHAR_LIMIT = 30;\n\n options = {\n allowDrag: true,\n allowDrop: true\n };\n\n $subscription: Subscription;\n\n @ViewChild(TreeComponent)\n tree: TreeComponent;\n\n private sortMode: string;\n\n private readonly _customSort = 'CUSTOM';\n private readonly _positionSort = 'POSITION';\n\n constructor(private store: Store<fromBookmarks.BookmarksState | AnnotationSetState>) { }\n\n ngOnInit(): void {\n this.sortMode = this.customSort;\n this.$subscription = this.store.pipe(select(bookmarksSelectors.getEditableBookmark))\n .subscribe(editableId => this.editableBookmark = editableId);\n this.$subscription.add(this.store.select(fromDocument.getPages)\n .subscribe(pages => {\n\n Object.keys(pages).map(key => {\n this.pageLookup[key] = pages[key];\n });\n\n }));\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.bookmarkNodes && this.sortMode !== this.customSort) {\n this.sortBookmarks();\n }\n }\n\n ngOnDestroy(): void {\n this.$subscription.unsubscribe();\n }\n\n editBookmark(id) {\n this.editableBookmark = id;\n }\n\n onAddBookmarkClick() {\n this.store.pipe(select(bookmarksSelectors.getBookmarkInfo), take(1))\n .subscribe((bookmarkInfo) => {\n this.store.dispatch(new CreateBookmark({\n ...bookmarkInfo, name: '', id: uuid()\n } as any));\n });\n }\n\n onBookmarkMove({ node, from, to }: any) {\n let movedBookmarks = [{\n ...node,\n previous: to.index > 0 ? to.parent.children[to.index - 1].id : undefined,\n parent: to.parent.documentId ? to.parent.id : undefined\n }];\n let fromNext = this.getSibling(from, from.index);\n fromNext = fromNext && fromNext.id === node.previous ? this.getSibling(from, from.index + 1) : fromNext;\n if (fromNext) {\n movedBookmarks = [...movedBookmarks, { ...fromNext, previous: node.previous }];\n }\n const toNext = this.getSibling(to, to.index + 1);\n if (toNext) {\n movedBookmarks = [...movedBookmarks, { ...toNext, previous: node.id }];\n }\n this.store.dispatch(new MoveBookmark(movedBookmarks));\n }\n\n deleteBookmark(node: TreeNode) {\n this.customSortBookmarks();\n let next: Bookmark;\n node = this.tree.treeModel.getNodeById(node.id);\n if (!node.parent) {\n node.parent = this.tree.treeModel.virtualRoot;\n }\n const siblings = node.parent.children;\n if (siblings.length > node.index + 1) {\n next = siblings[node.index + 1].data;\n next.previous = node.data.previous;\n }\n this.store.dispatch(new DeleteBookmark({\n deleted: [node.data.id, ...getBookmarkChildren(node.data.children)], updated: next\n }));\n }\n\n updateBookmark(bookmark: Bookmark, name) {\n const editedBookmark = {\n ...bookmark,\n name\n };\n if (name) {\n this.store.dispatch(new UpdateBookmark(editedBookmark));\n this.editableBookmark = undefined;\n }\n }\n\n goToBookmark(bookmark: Bookmark) {\n const thisPage = this.pageLookup[bookmark.pageNumber + 1];\n const defaultHeight = thisPage.styles.height;\n const defaultScaleY = this.scaledY(bookmark.yCoordinate, defaultHeight, thisPage);\n\n let top = 0, left = 0;\n switch (this.rotate) {\n case 90:\n left = - defaultScaleY;\n break;\n case 180:\n top = this.scaledY(bookmark.yCoordinate, (defaultHeight - (24 * this.zoom)), thisPage);\n break;\n case 270:\n left = defaultScaleY;\n break;\n default:\n top = defaultScaleY;\n }\n\n this.goToDestination.emit([\n bookmark.pageNumber,\n { 'name': 'XYZ' },\n left,\n top\n ]);\n }\n\n get customSort() {\n return this._customSort;\n }\n\n get positionSort() {\n return this._positionSort;\n }\n\n sort(mode: string) {\n this.sortMode = mode;\n this.sortBookmarks();\n }\n\n private sortBookmarks() {\n switch (this.sortMode) {\n case this.customSort: {\n this.customSortBookmarks();\n break;\n }\n case this.positionSort: {\n this.positionSortBookmarks();\n break;\n }\n default: {\n this.customSortBookmarks();\n break;\n }\n }\n }\n\n private positionSortBookmarks() {\n this.bookmarkNodes.sort((a, b) => a.pageNumber === b.pageNumber ? a.yCoordinate - b.yCoordinate : a.pageNumber - b.pageNumber);\n this.tree.treeModel.update();\n this.setDragNDrop(false);\n }\n\n private customSortBookmarks() {\n this.bookmarkNodes.sort((a, b) => a.index - b.index);\n this.tree.treeModel.update();\n this.setDragNDrop(true);\n }\n\n private setDragNDrop(enabled: boolean) {\n this.options = {\n allowDrag: enabled,\n allowDrop: enabled\n };\n }\n\n\n private getSibling(node, index) {\n return node.parent.children.length > index ? node.parent.children[index] : undefined;\n }\n\n private scaledY(yCoordinate: number, height: number, page: DocumentPages): number {\n const viewportScale = page.viewportScale / this.zoom;\n return ((height / this.zoom) - yCoordinate) / viewportScale;\n }\n}\n","import { Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, ViewChild } from '@angular/core';\nimport { Outline } from './outline-item/outline.model';\nimport { Observable, Subscription } from 'rxjs';\nimport { select, Store } from '@ngrx/store';\nimport * as bookmarksSelectors from '../../../store/selectors/bookmark.selectors';\nimport { BookmarkNode } from '../../../store/models/bookmarks.interface';\nimport { CreateBookmark, LoadBookmarks } from '../../../store/actions/bookmark.actions';\nimport { take } from 'rxjs/operators';\nimport { v4 as uuid } from 'uuid';\nimport { ViewerEventService } from '../../viewer-event.service';\nimport { BookmarksState } from '../../../store/reducers/bookmarks.reducer';\nimport { ToolbarEventService } from '../../../toolbar/toolbar-event.service';\nimport { BookmarksComponent } from './bookmarks/bookmarks.component';\n\n@Component({\n selector: 'mv-side-bar',\n templateUrl: './side-bar.component.html'\n})\nexport class SideBarComponent implements OnInit, OnChanges, OnDestroy {\n\n @Input() annotationsEnabled: boolean;\n @Input() outline: Outline;\n @Input() url: string;\n @Input() zoom: number;\n @Input() rotate: number;\n @Input() currentPageNumber: number;\n\n @ViewChild(BookmarksComponent)\n bookmarks: BookmarksComponent;\n\n selectedView = 'outline';\n bookmarkNodes$: Observable<BookmarkNode[]>;\n\n private subscriptions: Subscription[] = [];\n\n constructor(private viewerEvents: ViewerEventService,\n private store: Store<BookmarksState>,\n private readonly toolbarEvents: ToolbarEventService\n ) { }\n\n ngOnInit(): void {\n this.bookmarkNodes$ = this.store.pipe(select(bookmarksSelectors.getBookmarkNodes));\n this.subscriptions.push(this.store.pipe(select(bookmarksSelectors.getEditableBookmark))\n .subscribe(editable => this.selectedView = editable ? 'bookmarks' : this.selectedView));\n this.subscriptions.push(\n this.toolbarEvents.sidebarOutlineView.subscribe(toggle => {\n this.selectedView = toggle ? 'outline' : 'bookmarks';\n })\n ); }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.url && this.url) {\n this.store.dispatch(new LoadBookmarks());\n }\n }\n\n ngOnDestroy(): void {\n if (this.subscriptions.length > 0) {\n this.subscriptions.forEach(subscription => subscription.unsubscribe());\n }\n }\n\n goToDestination(destination: any[]) {\n this.viewerEvents.goToDestination(destination);\n }\n\n toggleSidebarView(sidebarView: string) {\n this.selectedView = sidebarView;\n }\n\n isViewedItem(current: Outline, next: Outline): boolean {\n if (current.pageNumber === this.currentPageNumber) {\n return true;\n }\n return next === undefined ? current.pageNumber <= this.currentPageNumber :\n current.pageNumber <= this.currentPageNumber && (next.pageNumber > this.currentPageNumber);\n }\n\n findEndPage(next: Outline): number {\n return next === undefined ? Number.MAX_SAFE_INTEGER : next.pageNumber;\n }\n}\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { Outline } from './outline.model';\n\n@Component({\n selector: 'mv-outline-item',\n templateUrl: './outline-item.component.html'\n})\nexport class OutlineItemComponent implements OnInit {\n\n @Input() outline: Outline;\n @Input() currentPageNumber: Number;\n @Input() isCurrentSection: boolean;\n @Input() endPage: Number;\n @Output() navigationEvent = new EventEmitter();\n\n showOutlineItems: boolean;\n\n ngOnInit() {\n this.showOutlineItems = true;\n }\n\n goToDestination(destination: any) {\n if (destination) {\n this.navigationEvent.emit(destination);\n }\n }\n\n toggleOutline() {\n this.showOutlineItems = !this.showOutlineItems;\n }\n\n isViewedItem(current: Outline, next: Outline): boolean {\n if (current.pageNumber === this.currentPageNumber) {\n return true;\n }\n return next === undefined ? current.pageNumber <= this.currentPageNumber && this.endPage > this.currentPageNumber :\n current.pageNumber <= this.currentPageNumber && (next.pageNumber > this.currentPageNumber);\n }\n\n findEndPage(next: Outline): number {\n return next === undefined ? Number.MAX_SAFE_INTEGER : next.pageNumber;\n }\n\n showHighlightOutlineCss() {\n return this.isCurrentSection ? 'highlightedOutlineItem' : 'outlineItem';\n }\n}\n","import { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { select, Store } from '@ngrx/store';\nimport { v4 as uuid } from 'uuid';\nimport { filter, take } from 'rxjs/operators';\n\nimport { Rectangle } from '../../annotations/annotation-set/annotation-view/rectangle/rectangle.model';\nimport * as fromStore from '../../store/reducers/reducers';\nimport * as fromSelectors from '../../store/selectors/redaction.selectors';\nimport * as fromRedaSelectors from '../../store/selectors/redaction.selectors';\nimport * as fromDocument from '../../store/selectors/document.selectors';\nimport * as fromActions from '../../store/actions/redaction.actions';\nimport * as fromRedactionActions from '../../store/actions/redaction.actions';\nimport * as fromRedaActions from '../../store/actions/redaction.actions';\nimport { SelectionAnnotation } from '../../annotations/models/event-select.model';\nimport { ToolbarEventService } from '../../toolbar/toolbar.module';\nimport { ViewerEventService } from '../../viewers/viewer-event.service';\nimport { Redaction } from '../services/redaction.model';\n\n@Component({\n selector: 'mv-redactions',\n templateUrl: './redaction.component.html'\n})\nexport class RedactionComponent implements OnInit, OnDestroy {\n\n @Input() zoom: number;\n @Input() rotate: number;\n\n redactionsPerPage$: Observable<any>; // todo add type\n selectedRedaction$: Observable<SelectionAnnotation | {}>;\n rectangles: Rectangle[];\n drawMode: boolean;\n documentId: string;\n\n private $subscription: Subscription;\n\n constructor(private store: Store<fromStore.State>,\n private readonly viewerEvents: ViewerEventService,\n private toolbarEvents: ToolbarEventService) { }\n\n ngOnInit(): void {\n this.redactionsPerPage$ = this.store.pipe(select(fromSelectors.getRedactionsPerPage));\n this.selectedRedaction$ = this.store.pipe(select(fromSelectors.getSelected));\n this.$subscription = this.toolbarEvents.drawModeSubject.subscribe(drawMode => this.drawMode = drawMode);\n this.$subscription.add(this.store.pipe(select(fromSelectors.getRedactedDocumentInfo), filter(value => !!value))\n .subscribe(redactedDocInfo => this.downloadDocument(redactedDocInfo)));\n this.$subscription.add(this.store.pipe(select(fromDocument.getDocumentId)).subscribe(docId => this.documentId = docId));\n this.$subscription.add(this.viewerEvents.textHighlight.subscribe(highlight => this.markTextRedaction(highlight)));\n this.toolbarEvents.applyRedactToDocument.subscribe(() => {\n this.store.pipe(select(fromRedaSelectors.getRedactionArray), take(1)).subscribe(redactions => {\n this.store.dispatch(new fromRedaActions.Redact(redactions));\n });\n });\n this.toolbarEvents.clearAllRedactMarkers.subscribe(() => {\n this.store.dispatch(new fromRedaActions.UnmarkAll(this.documentId));\n });\n }\n\n ngOnDestroy(): void {\n this.$subscription.unsubscribe();\n }\n\n markTextRedaction(highlight) {\n const redactionHighlight = highlight.rectangles;\n if (redactionHighlight && redactionHighlight.length) {\n this.saveRedaction(highlight.page, [...redactionHighlight]);\n }\n this.toolbarEvents.highlightModeSubject.next(false);\n }\n\n markBoxRedaction({ rectangles, page }) {\n this.saveRedaction(page, rectangles);\n this.toolbarEvents.drawModeSubject.next(false);\n }\n\n saveRedaction(page: number, rectangles: Rectangle[]) {\n const redaction = { page, rectangles, redactionId: uuid(), documentId: this.documentId };\n this.store.dispatch(new fromRedactionActions.SaveRedaction(redaction));\n }\n\n onMarkerDelete(event) {\n this.store.dispatch(new fromActions.DeleteRedaction(event));\n }\n\n selectRedaction(event) {\n this.store.dispatch(new fromActions.SelectRedaction(event));\n }\n\n onMarkerUpdate(redaction: Redaction) {\n this.store.dispatch(new fromActions.SaveRedaction(redaction));\n }\n\n downloadDocument({ blob, filename }) {\n if (navigator && navigator.msSaveBlob) {\n navigator.msSaveBlob(blob, filename);\n } else {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n document.body.appendChild(a);\n a.setAttribute('style', 'display: none');\n a.href = url;\n a.download = filename;\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n }\n this.store.dispatch(new fromRedactionActions.ResetRedactedDocument());\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { map } from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { IcpSession } from './icp.interfaces';\n\n@Injectable()\nexport class IcpSessionApiService {\n\n public ICP_SESSION_API = '/icp/sessions';\n\n constructor(private readonly httpClient: HttpClient) {}\n\n public loadSession(caseId: string): Observable<any> {\n return this.httpClient\n .get<{username: string, session: IcpSession}>(`${this.ICP_SESSION_API}/${caseId}`,\n { observe: 'response' , withCredentials: true })\n .pipe(map(response => response.body));\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Actions, Effect, ofType } from '@ngrx/effects';\nimport {catchError, exhaustMap, map, switchMap} from 'rxjs/operators';\nimport { of } from 'rxjs';\nimport {AnnotationApiService} from '../../annotations/services/annotation-api/annotation-api.service';\nimport * as annotationsActions from '../actions/annotation.actions';\n\n@Injectable()\nexport class AnnotationEffects {\n constructor(\n private actions$: Actions,\n private annotationApiService: AnnotationApiService,\n ) { }\n\n @Effect()\n loadAnnotation$ = this.actions$.pipe(\n ofType(annotationsActions.LOAD_ANNOTATION_SET),\n map((action: annotationsActions.LoadAnnotationSet) => action.payload),\n switchMap((documentId) => {\n return this.annotationApiService.getAnnotationSet(documentId).pipe(\n map(res => {\n return new annotationsActions.LoadAnnotationSetSucess(res);\n }),\n catchError(error => {\n return of(new annotationsActions.LoadAnnotationSetFail(error));\n }));\n }));\n\n @Effect()\n postAnnotation$ = this.actions$.pipe(\n ofType(annotationsActions.SAVE_ANNOTATION),\n map((action: annotationsActions.SaveAnnotation) => action.payload),\n exhaustMap((annotation) => {\n return this.annotationApiService.postAnnotation(annotation).pipe(\n map(annotations => {\n return new annotationsActions.SaveAnnotationSuccess(annotations);\n }),\n catchError(error => {\n return of(new annotationsActions.LoadAnnotationSetFail(error));\n }));\n }));\n\n @Effect()\n deleteAnnotation$ = this.actions$.pipe(\n ofType(annotationsActions.DELETE_ANNOTATION),\n map((action: annotationsActions.DeleteAnnotation) => action.payload),\n exhaustMap((annotation) => {\n return this.annotationApiService.deleteAnnotation(annotation).pipe(\n map(result => {\n return new annotationsActions.DeleteAnnotationSuccess(annotation);\n }),\n catchError(error => {\n return of(new annotationsActions.DeleteAnnotationFail(error));\n }));\n }));\n}\n","import { Injectable } from '@angular/core';\nimport { Actions, Effect, ofType } from '@ngrx/effects';\nimport { catchError, exhaustMap, map, switchMap, withLatestFrom } from 'rxjs/operators';\nimport { of } from 'rxjs';\nimport { BookmarksApiService } from '../../annotations/services/bookmarks-api/bookmarks-api.service';\nimport * as bookmarksActions from '../actions/bookmark.actions';\nimport { select, Store } from '@ngrx/store';\nimport * as fromDocument from '../selectors/document.selectors';\nimport * as fromBookmarks from '../reducers/bookmarks.reducer';\nimport * as fromStore from '../reducers/reducers';\n\n@Injectable()\nexport class BookmarksEffects {\n\n constructor(private actions$: Actions,\n private store: Store<fromStore.AnnotationSetState|fromBookmarks.BookmarksState>,\n private bookmarksApiService: BookmarksApiService) {}\n\n @Effect()\n loadBookmarks$ = this.actions$.pipe(\n ofType(bookmarksActions.LOAD_BOOKMARKS),\n withLatestFrom(this.store.pipe(select(fromDocument.getDocumentId))),\n map(([, documentId]) => documentId),\n exhaustMap((documentId) =>\n this.bookmarksApiService.getBookmarks(documentId)\n .pipe(\n map(res => new bookmarksActions.LoadBookmarksSuccess(res)),\n catchError(err => of(new bookmarksActions.LoadBookmarksFailure(err)))\n )\n ));\n\n @Effect()\n createBookmark$ = this.actions$.pipe(\n ofType(bookmarksActions.CREATE_BOOKMARK),\n map((action: bookmarksActions.CreateBookmark) => action.payload),\n exhaustMap((bookmark) =>\n this.bookmarksApiService.createBookmark(bookmark)\n .pipe(\n map(bmrk => new bookmarksActions.CreateBookmarkSuccess(bmrk)),\n catchError(error => of(new bookmarksActions.CreateBookmarkFailure(error)))\n )\n ));\n\n @Effect()\n moveBookmark$ = this.actions$.pipe(\n ofType(bookmarksActions.MOVE_BOOKMARK),\n map((action: bookmarksActions.MoveBookmark) => action.payload),\n exhaustMap((bookmarks) =>\n this.bookmarksApiService.updateMultipleBookmarks(bookmarks)\n .pipe(\n map(bmrks => new bookmarksActions.MoveBookmarkSuccess(bmrks)),\n catchError(error => of(new bookmarksActions.MoveBookmarkFailure(error)))\n )\n ));\n\n @Effect()\n deleteBookmark$ = this.actions$.pipe(\n ofType(bookmarksActions.DELETE_BOOKMARK),\n map((action: bookmarksActions.DeleteBookmark) => action.payload),\n exhaustMap(({ deleted, updated }) =>\n this.bookmarksApiService.deleteMultipleBookmarks({ deleted, updated })\n .pipe(\n switchMap(() => {\n if (updated) {\n return [\n new bookmarksActions.DeleteBookmarkSuccess(deleted),\n new bookmarksActions.UpdateBookmarkSuccess(updated)\n ];\n } else {\n return [new bookmarksActions.DeleteBookmarkSuccess(deleted)];\n }\n }),\n catchError(error => of(new bookmarksActions.DeleteBookmarkFailure(error)))\n )\n ));\n\n @Effect()\n updateBookmark$ = this.actions$.pipe(\n ofType(bookmarksActions.UPDATE_BOOKMARK),\n map((action: bookmarksActions.UpdateBookmark) => action.payload),\n switchMap((bookmark) =>\n this.bookmarksApiService.updateBookmark(bookmark)\n .pipe(\n map(bmrk => new bookmarksActions.UpdateBookmarkSuccess(bmrk)),\n catchError(error => of(new bookmarksActions.UpdateBookmarkFailure(error)))\n )\n ));\n}\n","import { Observable } from 'rxjs';\nimport { HttpClient, HttpResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { catchError, map } from 'rxjs/operators';\nimport { BulkRedaction, Redaction } from './redaction.model';\n\n@Injectable()\nexport class RedactionApiService {\n\n private markupsApiUrl = '/api/markups';\n private redactApiUrl = '/api/redaction';\n private markupsSearchApiUrl = '/api/markups/search';\n constructor(\n private readonly httpClient: HttpClient\n ) { }\n\n public getRedactions(documentId: string): Observable<HttpResponse<Redaction[]>> {\n const fixedUrl = `${this.markupsApiUrl}/${documentId}`;\n return this.httpClient\n .get<Redaction[]>(fixedUrl, { observe: 'response', withCredentials: true });\n }\n\n public saveRedaction(body): Observable<Redaction> {\n return this.httpClient\n .post<Redaction>(this.markupsApiUrl, body, { observe: 'response', withCredentials: true })\n .pipe(\n map(response => response.body),\n catchError(() => [])\n );\n }\n\n public saveBulkRedaction(body): Observable<BulkRedaction> {\n return this.httpClient\n .post<BulkRedaction>(this.markupsSearchApiUrl, body, { observe: 'response', withCredentials: true })\n .pipe(\n map(response => response.body),\n catchError(() => [])\n );\n }\n\n public deleteRedaction(payload): Observable<null> {\n const url = `${this.markupsApiUrl}/${payload.documentId}/${payload.redactionId}`;\n return this.httpClient\n .delete<null>(url, { observe: 'response', withCredentials: true })\n .pipe(map(response => response.body));\n }\n\n public deleteAllMarkers(documentId): Observable<null> {\n const url = `${this.markupsApiUrl}/${documentId}`;\n\n return this.httpClient\n .delete<null>(url, { observe: 'response', withCredentials: true })\n .pipe(map(response => response.body));\n }\n\n public redact(payload): Observable<HttpResponse<Blob>> {\n return this.httpClient\n .post<Blob>(this.redactApiUrl, payload, { observe: 'response', withCredentials: true, responseType: 'blob' as 'json' })\n .pipe(\n map(response => response),\n catchError(() => [])\n );\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { Actions, Effect, ofType } from '@ngrx/effects';\nimport { catchError, exhaustMap, map, switchMap, tap } from 'rxjs/operators';\nimport { of } from 'rxjs';\nimport { RedactionApiService } from '../../redaction/services/redaction-api.service';\nimport * as redactionActions from '../actions/redaction.actions';\nimport { HttpResponse } from '@angular/common/http';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\n\n@Injectable()\nexport class RedactionEffects {\n constructor(\n private actions$: Actions,\n private redactionApiService: RedactionApiService,\n private toolbarEvents: ToolbarEventService\n ) { }\n\n @Effect()\n loadRedactions$ = this.actions$.pipe(\n ofType(redactionActions.LOAD_REDACTIONS),\n map((action: redactionActions.LoadRedactions) => action.payload),\n switchMap((documentId) => {\n return this.redactionApiService.getRedactions(documentId).pipe(\n map(resp => {\n return new redactionActions.LoadRedactionSuccess(resp.body);\n }),\n catchError(error => {\n return of(new redactionActions.LoadRedactionFailure(error));\n }));\n }));\n\n @Effect()\n saveRedaction$ = this.actions$.pipe(\n ofType(redactionActions.SAVE_REDACTION),\n map((action: redactionActions.SaveRedaction) => action.payload),\n exhaustMap((redaction) => {\n return this.redactionApiService.saveRedaction(redaction).pipe(\n map(resp => {\n return new redactionActions.SaveRedactionSuccess(resp);\n }),\n catchError(error => {\n return of(new redactionActions.SaveRedactionFailure(error));\n }));\n }));\n\n @Effect()\n saveBulkRedaction$ = this.actions$.pipe(\n ofType(redactionActions.SAVE_BULK_REDACTION),\n map((action: redactionActions.SaveRedaction) => action.payload),\n exhaustMap((redaction) => {\n return this.redactionApiService.saveBulkRedaction(redaction).pipe(\n tap(() => this.toolbarEvents.redactAllInProgressSubject.next(false))).pipe(map(resp => {\n return new redactionActions.SaveBulkRedactionSuccess(resp);\n }),\n catchError(error => {\n return of(new redactionActions.SaveBulkRedactionFailure(error));\n }));\n }));\n\n @Effect()\n deleteRedaction$ = this.actions$.pipe(\n ofType(redactionActions.DELETE_REDACTION),\n map((action: redactionActions.DeleteRedaction) => action.payload),\n exhaustMap((redactionPayload) => {\n return this.redactionApiService.deleteRedaction(redactionPayload).pipe(\n map(() => {\n return new redactionActions.DeleteRedactionSuccess(redactionPayload);\n }),\n catchError(error => {\n return of(new redactionActions.DeleteRedactionFailure(error));\n }));\n }));\n\n @Effect()\n redact$ = this.actions$.pipe(\n ofType(redactionActions.REDACT),\n map((action: redactionActions.Redact) => action.payload),\n exhaustMap((redactionPayload) => {\n return this.redactionApiService.redact(redactionPayload).pipe(\n map((result: HttpResponse<Blob>) => {\n const header = result.headers.get('content-disposition').split('filename=');\n const filename = header.length > 1 ? header[1].replace(/\"/g, '')\n : `redacted-document-${redactionPayload.documentId}`;\n return new redactionActions.RedactSuccess({ blob: result.body, filename });\n }),\n catchError(error => {\n return of(new redactionActions.RedactFailure(error));\n }));\n }));\n\n @Effect()\n unmarkAll$ = this.actions$.pipe(\n ofType(redactionActions.UNMARK_ALL),\n map((action: redactionActions.UnmarkAll) => action.payload),\n exhaustMap((documentId) => {\n return this.redactionApiService.deleteAllMarkers(documentId).pipe(\n map(result => {\n return new redactionActions.UnmarkAllSuccess();\n }),\n catchError(error => {\n return of(new redactionActions.DeleteRedactionFailure(error));\n }));\n }));\n}\n\n","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpResponse } from '@angular/common/http';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\n\n@Injectable()\nexport class DocumentConversionApiService {\n\n private documentConversionUrl = '/doc-assembly/convert';\n\n constructor(private readonly httpClient: HttpClient) {}\n\n public convert(documentId): Observable<HttpResponse<Blob>> {\n return this.httpClient\n .post<Blob>(`${this.documentConversionUrl}/${documentId}`, {},\n { observe: 'response' , withCredentials: true, responseType: 'blob' as 'json' })\n .pipe(\n map(response => response),\n catchError(error => of(error))\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpResponse } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { Rotation } from './rotation.model';\n\n@Injectable()\nexport class RotationApiService {\n\n public rotationApiUrl = '/em-anno/metadata';\n\n constructor(\n private readonly httpClient: HttpClient\n ) {}\n\n public getRotation(documentId: string): Observable<HttpResponse<Rotation>> {\n const fixedUrl = `${this.rotationApiUrl}/${documentId}`;\n return this.httpClient\n .get<Rotation>(fixedUrl, { observe: 'response' , withCredentials: true });\n }\n\n public saveRotation(payload: Rotation): Observable<HttpResponse<Rotation>> {\n const fixedUrl = `${this.rotationApiUrl}/`;\n return this.httpClient\n .post<any>(fixedUrl, payload, { observe: 'response' , withCredentials: true })\n .pipe(\n map(response => response),\n catchError(() => [])\n );\n }\n\n}\n","import { Actions, Effect, ofType } from '@ngrx/effects';\nimport { Injectable } from '@angular/core';\nimport { HttpResponse } from '@angular/common/http';\nimport { catchError, exhaustMap, map, switchMap } from 'rxjs/operators';\nimport { DocumentConversionApiService } from '../../viewers/convertible-content-viewer/document-conversion-api.service';\nimport { RotationApiService } from '../../viewers/rotation-persist/rotation-api.service';\nimport { of } from 'rxjs';\nimport * as documentActions from '../actions/document.actions';\n\n@Injectable()\nexport class DocumentEffects {\n constructor(\n private actions$: Actions,\n private documentConversionService: DocumentConversionApiService,\n private rotationApiService: RotationApiService,\n ) { }\n\n @Effect()\n convert$ = this.actions$.pipe(\n ofType(documentActions.CONVERT),\n map((action: documentActions.Convert) => action.payload),\n exhaustMap((documentId) => {\n return this.documentConversionService.convert(documentId).pipe(\n map((result: HttpResponse<Blob>) => {\n const url = URL.createObjectURL(result.body);\n return new documentActions.ConvertSuccess(url);\n }),\n catchError(error => {\n return of(new documentActions.ConvertFailure(error));\n }));\n }));\n\n @Effect()\n loadRotation$ = this.actions$.pipe(\n ofType(documentActions.LOAD_ROTATION),\n map((action: documentActions.LoadRotation) => action.payload),\n switchMap((documentId) => {\n return this.rotationApiService.getRotation(documentId).pipe(\n map(resp => {\n return new documentActions.LoadRotationSuccess(resp.body);\n }),\n catchError(error => {\n return of(new documentActions.LoadRotationFailure(error));\n }));\n }));\n\n @Effect()\n saveRotation$ = this.actions$.pipe(\n ofType(documentActions.SAVE_ROTATION),\n map((action: documentActions.SaveRotation) => action.payload),\n switchMap((payload) => {\n return this.rotationApiService.saveRotation(payload).pipe(\n map(resp => {\n return new documentActions.SaveRotationSuccess(resp.body);\n }),\n catchError(error => {\n return of(new documentActions.SaveRotationFailure(error));\n }));\n }));\n}\n","import { Injectable } from '@angular/core';\nimport { Actions, Effect, ofType } from '@ngrx/effects';\nimport { catchError, exhaustMap, map, switchMap } from 'rxjs/operators';\nimport { of } from 'rxjs';\nimport { IcpSessionApiService } from '../../icp/icp-session-api.service';\nimport { IcpUpdateService } from '../../icp/icp-update.service';\nimport * as icpActions from '../actions/icp.actions' ;\nimport { IcpSession } from '../../icp/icp.interfaces';\n\n@Injectable()\nexport class IcpEffects {\n\n constructor(private actions$: Actions,\n private icpApiService: IcpSessionApiService,\n private icpUpdateService: IcpUpdateService) {}\n\n @Effect()\n loadIcpSession$ = this.actions$.pipe(\n ofType(icpActions.LOAD_ICP_SESSION),\n map((action: icpActions.LoadIcpSession) => action.payload),\n exhaustMap((caseId: string) =>\n this.icpApiService.loadSession(caseId)\n .pipe(\n map(res => new icpActions.JoinIcpSocketSession(res)),\n catchError(error => of(new icpActions.LoadIcpSessionFailure(error)))\n )\n ));\n\n\n @Effect()\n joinIcpSocketSession$ = this.actions$.pipe(\n ofType(icpActions.JOIN_ICP_SOCKET_SESSION),\n map((action: icpActions.JoinIcpSocketSession) => action.payload),\n switchMap((res: {username: string, session: IcpSession}) =>\n this.icpUpdateService.joinSession(res.username, res.session)\n .pipe(map(participants => new icpActions.IcpSocketSessionJoined({session: res.session, participantInfo: participants})))\n ));\n}\n","import { AnnotationEffects } from './annotation.effects';\nimport { BookmarksEffects } from './bookmarks.effects';\nimport { RedactionEffects } from './redaction.effects';\nimport { DocumentEffects } from './document.effects';\nimport { IcpEffects } from './icp.effects';\n\nexport const effects: any[] = [AnnotationEffects, BookmarksEffects, RedactionEffects, DocumentEffects, IcpEffects];\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewEncapsulation } from '@angular/core';\nimport { ResponseType, ViewerException } from '../viewer-exception.model';\nimport { select, Store } from '@ngrx/store';\nimport * as fromStore from '../../store/reducers/document.reducer';\nimport * as fromDocumentActions from '../../store/actions/document.actions';\nimport { Subscription } from 'rxjs';\nimport * as fromSelectors from '../../store/selectors/document.selectors';\nimport { AnnotationSet } from '../../annotations/annotation-set/annotation-set.model';\nimport { filter } from 'rxjs/operators';\n\n@Component({\n selector: 'mv-conversion-viewer',\n templateUrl: './convertible-content-viewer.component.html',\n encapsulation: ViewEncapsulation.None\n})\nexport class ConvertibleContentViewerComponent implements OnInit, OnDestroy {\n\n @Input() originalUrl;\n @Input() downloadFileName: string;\n\n @Input() height;\n\n @Input() enableAnnotations: boolean;\n @Input() enableRedactions: boolean;\n @Input() annotationSet: AnnotationSet | null;\n\n\n @Output() mediaLoadStatus = new EventEmitter<ResponseType>();\n @Output() viewerException = new EventEmitter<ViewerException>();\n @Output() documentTitle = new EventEmitter<string>();\n\n private $subscription: Subscription;\n convertedUrl: string;\n\n constructor(private store: Store<fromStore.DocumentState>) {\n }\n\n ngOnInit(): void {\n this.store.dispatch(new fromDocumentActions.Convert(this.extractDMStoreDocId(this.originalUrl)));\n this.$subscription = this.store.pipe(select(fromSelectors.getConvertedDocument), filter(value => !!value))\n .subscribe((docInfo) => {\n if (docInfo.url) {\n this.convertedUrl = docInfo.url;\n this.store.dispatch(new fromDocumentActions.ClearConvertDocUrl());\n } else {\n this.onLoadException(new ViewerException(docInfo.error));\n }\n });\n }\n\n ngOnDestroy(): void {\n this.$subscription.unsubscribe();\n }\n\n onMediaLoad(status: ResponseType) {\n this.mediaLoadStatus.emit(status);\n }\n\n onLoadException(exception: ViewerException) {\n this.viewerException.emit(exception);\n }\n\n onDocumentTitleChange(title: string) {\n this.documentTitle.emit(title);\n }\n\n // todo move this to common place for media viewer and pdf\n private extractDMStoreDocId(url: string): string {\n\n if (url.includes('/documents/')) {\n url = url.split('/documents/')[1];\n } else if (url.includes('/documentsv2/')) {\n url = url.split('/documentsv2/')[1];\n }\n return url.replace('/binary', '');\n }\n}\n","import { Component } from '@angular/core';\nimport { ToolbarEventService } from '../../toolbar/toolbar.module';\n\n@Component({\n selector: 'mv-confirm-action',\n templateUrl: './confirm-action-dialog.component.html',\n})\nexport class ConfirmActionDialogComponent {\n\n constructor(private toolbarEvents: ToolbarEventService) {}\n\n onCancel() {\n this.toolbarEvents.icp.leavingSession.next(false);\n }\n\n onConfirm() {\n this.toolbarEvents.icp.confirmExit();\n this.toolbarEvents.icp.leavingSession.next(false);\n }\n}\n","import {Bookmark, BookmarksPerPage} from '../../viewers/pdf-viewer/side-bar/bookmarks/bookmarks.interfaces';\nimport {Component, Input, OnInit} from '@angular/core';\nimport { select, Store } from '@ngrx/store';\nimport * as fromStore from '../../store/reducers/reducers';\nimport * as fromSelectors from '../../store/selectors/bookmark.selectors';\nimport { Observable } from 'rxjs';\n\n@Component({\n selector: 'mv-bookmark-icons',\n templateUrl: './bookmark-icons.component.html'\n})\nexport class BookmarkIconsComponent implements OnInit {\n\n @Input() zoom: number;\n @Input() rotate: number;\n bookmarksPerPage$: Observable<BookmarksPerPage[]>;\n bookmarks: Bookmark[];\n documentId: string;\n\n constructor(private store: Store<fromStore.State>) {}\n\n ngOnInit(): void {\n this.bookmarksPerPage$ = this.store.pipe(select(fromSelectors.getBookmarksPerPage));\n }\n\n}\n","import { Directive, ElementRef, HostListener, OnDestroy, OnInit } from '@angular/core';\nimport * as fromDocumentActions from '../../store/actions/document.actions';\nimport { select, Store } from '@ngrx/store';\nimport * as fromDocuments from '../../store/selectors/document.selectors';\nimport { filter, take } from 'rxjs/operators';\nimport { Rotation } from './rotation.model';\nimport { ResponseType } from '../viewer-exception.model';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\nimport * as fromStore from '../../store/reducers/reducers';\nimport { ToolbarButtonVisibilityService } from '../../toolbar/toolbar-button-visibility.service';\nimport { Subscription } from 'rxjs';\n\n\n@Directive({\n selector: '[mvRotationPersist]'\n})\nexport class RotationPersistDirective implements OnInit, OnDestroy {\n\n documentId: string;\n rotation = 0;\n savedRotation = 0;\n\n $subscriptions: Subscription;\n\n constructor(private el: ElementRef,\n private store: Store<fromStore.DocumentState>,\n public readonly toolbarButtons: ToolbarButtonVisibilityService,\n private toolbarEvents: ToolbarEventService) {\n }\n\n ngOnInit() {\n this.$subscriptions = this.toolbarEvents.rotateSubject.subscribe(rotation => this.onRotate(rotation));\n this.$subscriptions\n .add(this.toolbarEvents.saveRotationSubject.subscribe(() => this.saveRotation()))\n .add(this.store.pipe(select(fromDocuments.getRotation))\n .subscribe(rotation => this.savedRotation = rotation))\n .add(this.store.pipe(select(fromDocuments.getDocumentId))\n .subscribe(documentId => this.documentId = documentId));\n }\n\n ngOnDestroy() {\n this.$subscriptions.unsubscribe();\n }\n\n @HostListener('mediaLoadStatus', ['$event'])\n onMediaLoad(status: ResponseType) {\n this.rotation = 0;\n this.store.dispatch(new fromDocumentActions.LoadRotation(this.documentId));\n this.store.pipe(select(fromDocuments.rotationLoaded),\n filter(value => !!value),\n take(1))\n .subscribe(() => {\n if (this.savedRotation) {\n this.toolbarEvents.rotateSubject.next(this.savedRotation);\n }\n });\n }\n\n private onRotate(rotation: number) {\n this.rotation = (this.rotation + rotation) % 360;\n this.toolbarButtons.showSaveRotationButton = this.savedRotation !== this.rotation;\n }\n\n private saveRotation() {\n const payload: Rotation = {\n documentId: this.documentId,\n rotationAngle: this.rotation\n };\n this.store.dispatch(new fromDocumentActions.SaveRotation(payload));\n }\n}\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\nimport { IcpParticipant, IcpState } from '../icp.interfaces';\nimport { select, Store } from '@ngrx/store';\nimport * as fromSelectors from '../../store/selectors/icp.selectors';\n\n@Component({\n selector: 'mv-participants-list',\n templateUrl: './participants-list.component.html'\n})\nexport class ParticipantsListComponent implements OnInit, OnDestroy {\n\n subscription: Subscription;\n participants$: Observable<IcpParticipant[]>;\n presenter$: Observable<IcpParticipant>;\n isPresenter$: Observable<boolean>;\n\n showParticipantsList = false;\n\n constructor(private readonly toolbarEvents: ToolbarEventService,\n private store: Store<IcpState>) {}\n\n ngOnInit() {\n this.participants$ = this.store.pipe(select(fromSelectors.getParticipants));\n this.presenter$ = this.store.pipe(select(fromSelectors.getPresenter));\n this.isPresenter$ = this.store.pipe(select(fromSelectors.isPresenter));\n\n this.subscription = this.toolbarEvents.icp.participantsListVisible.subscribe(isVisible => this.showParticipantsList = isVisible);\n }\n\n ngOnDestroy() {\n this.subscription.unsubscribe();\n }\n}\n","import { Directive, ElementRef, HostListener, OnDestroy, OnInit } from '@angular/core';\nimport { v4 as uuid } from 'uuid';\nimport { Store } from '@ngrx/store';\nimport { Subscription } from 'rxjs';\n\nimport { Rectangle } from '../../annotation-view/rectangle/rectangle.model';\nimport { ToolbarEventService } from '../../../../toolbar/toolbar.module';\nimport * as fromStore from '../../../../store/reducers/reducers';\nimport * as fromDocument from '../../../../store/selectors/document.selectors';\nimport { ViewerEventService } from '../../../../viewers/viewer-event.service';\nimport * as fromAnnotationActions from '../../../../store/actions/annotation.actions';\nimport { HighlightCreateService } from './highlight-create.service';\n\n@Directive({\n selector: '[mvCreateTextHighlight]'\n})\nexport class HighlightCreateDirective implements OnInit, OnDestroy {\n pageHeight: number;\n pageWidth: number;\n zoom: number;\n rotate: number;\n allPages: object;\n\n $subscription: Subscription;\n\n constructor(\n private element: ElementRef<HTMLElement>,\n private toolbarEvents: ToolbarEventService,\n private viewerEvents: ViewerEventService,\n private highlightService: HighlightCreateService,\n private store: Store<fromStore.AnnotationSetState>\n ) { }\n\n ngOnInit() {\n this.$subscription = this.store.select(fromDocument.getPages).subscribe((pages) => {\n if (pages[1]) {\n this.allPages = pages;\n }\n });\n }\n\n ngOnDestroy() {\n if (this.$subscription) {\n this.$subscription.unsubscribe();\n }\n }\n\n @HostListener('mouseup', ['$event'])\n onMouseUp(mouseEvent: MouseEvent) {\n const pageElement = (<HTMLElement>(mouseEvent.target as HTMLElement).offsetParent).offsetParent;\n const page = parseInt(pageElement.getAttribute('data-page-number'), 10);\n if (this.toolbarEvents.highlightModeSubject.getValue()) {\n const rectangles = this.getRectangles(mouseEvent, page);\n this.viewerEvents.textSelected({ page, rectangles });\n }\n }\n\n @HostListener('mousedown', ['$event'])\n onPdfViewerClick(event: MouseEvent) {\n this.store.dispatch(\n new fromAnnotationActions.SelectedAnnotation({\n annotationId: '',\n selected: false,\n editable: false,\n })\n );\n this.viewerEvents.clearCtxToolbar();\n }\n\n private getRectangles(event: MouseEvent, page) {\n this.pageHeight = this.allPages[page].styles.height;\n this.pageWidth = this.allPages[page].styles.width;\n this.zoom = parseFloat(this.allPages[page].scaleRotation.scale);\n this.rotate = parseInt(this.allPages[page].scaleRotation.rotation, 10);\n const selection = window.getSelection();\n if (selection) {\n const localElement = <HTMLElement>event.target;\n\n this.removeEnhancedTextModeStyling(localElement);\n\n if (selection.rangeCount && !selection.isCollapsed) {\n const range = selection.getRangeAt(0).cloneRange();\n const clientRects = range.getClientRects();\n\n if (clientRects) {\n\n const parentRect = localElement.parentElement.getBoundingClientRect();\n const selectionRectangles: Rectangle[] = [];\n for (let i = 0; i < clientRects.length; i++) {\n const selectionRectangle = this.createTextRectangle(clientRects[i], parentRect);\n const findSelecttionRectangle = selectionRectangles.find(\n (rect) => rect.width === selectionRectangle.width && rect.x === selectionRectangle.x\n );\n if (!findSelecttionRectangle) {\n selectionRectangles.push(selectionRectangle);\n }\n }\n return selectionRectangles;\n }\n }\n }\n }\n\n private createTextRectangle(rect: any, parentRect: any): Rectangle {\n const height = rect.bottom - rect.top;\n const width = rect.right - rect.left;\n const top = rect.top - parentRect.top;\n const left = rect.left - parentRect.left;\n\n let rectangle = this.highlightService.applyRotation(\n this.pageHeight,\n this.pageWidth,\n height,\n width,\n top,\n left,\n this.rotate,\n this.zoom\n );\n rectangle = { id: uuid(), ...rectangle };\n\n return rectangle as Rectangle;\n }\n\n private removeEnhancedTextModeStyling(element: HTMLElement) {\n if (element.parentElement.children) {\n for (let i = 0; i < element.parentElement.children.length; i++) {\n const child = <HTMLElement>element.parentElement.children[i];\n\n child.style.padding = '0';\n // regex will be targeting the translate style in string\n // e.g. scaleX(0.969918) translateX(-110.684px) translateY(-105.274px) will become scaleX(0.969918)\n const translateCSSRegex = /translate[XYZ]\\(-?\\d*(\\.\\d+)?(px)?\\)/g;\n child.style.transform = child.style.transform.replace(translateCSSRegex, '').trim();\n }\n }\n }\n}\n","import {\n Component,\n ElementRef,\n Input,\n OnInit,\n ViewChild,\n OnDestroy,\n Output,\n EventEmitter,\n OnChanges,\n SimpleChanges\n} from '@angular/core';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\nimport { Subscription } from 'rxjs';\nimport { ResponseType } from '../viewer-exception.model';\n\n@Component({\n selector: 'mv-multimedia-player',\n templateUrl: './multimedia-player.component.html'\n})\nexport class MultimediaPlayerComponent implements OnInit, OnChanges, OnDestroy {\n\n @Input() url: string;\n @Input() downloadFileName: string;\n @Input() multimediaOn: boolean;\n\n @Output() loadStatus = new EventEmitter<ResponseType>();\n\n @ViewChild('downloadLink', {static: false}) downloadLink: ElementRef;\n @ViewChild('videoPlayer', {static: false}) videoPlayer: ElementRef;\n\n playbackMsg = 'loading';\n\n private subscription: Subscription;\n\n constructor(\n public readonly toolbarEvents: ToolbarEventService,\n ) {}\n\n public ngOnInit(): void {\n this.subscription = this.toolbarEvents.downloadSubject\n .subscribe(() => this.downloadLink.nativeElement.click());\n this.loadStatus.emit(ResponseType.SUCCESS);\n }\n\n public ngOnChanges(changes: SimpleChanges) {\n if (changes.url) {\n this.reloadVideo();\n }\n }\n\n ngOnDestroy(): void {\n this.subscription.unsubscribe();\n }\n\n reloadVideo() {\n if (this.videoPlayer) {\n this.playbackMsg = 'loading';\n this.videoPlayer.nativeElement.load();\n }\n }\n\n onSuccess() {\n this.playbackMsg = 'success';\n }\n\n onError() {\n this.playbackMsg = 'error';\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { HttpClientModule } from '@angular/common/http';\nimport { PdfViewerComponent } from './viewers/pdf-viewer/pdf-viewer.component';\nimport { ImageViewerComponent } from './viewers/image-viewer/image-viewer.component';\nimport { UnsupportedViewerComponent } from './viewers/unsupported-viewer/unsupported-viewer.component';\nimport { MediaViewerComponent } from './media-viewer.component';\nimport { ToolbarModule } from './toolbar/toolbar.module';\nimport { PdfJsWrapperFactory } from './viewers/pdf-viewer/pdf-js/pdf-js-wrapper.provider';\nimport { AnnotationsModule } from './annotations/annotations.module';\nimport { CommentService } from './annotations/comment-set/comment/comment.service';\nimport { GrabNDragDirective } from './viewers/grab-n-drag.directive';\nimport { SideBarComponent } from './viewers/pdf-viewer/side-bar/side-bar.component';\nimport { OutlineItemComponent } from './viewers/pdf-viewer/side-bar/outline-item/outline-item.component';\nimport { TagInputModule } from 'ngx-chips';\nimport { RouterModule } from '@angular/router';\nimport { EffectsModule } from '@ngrx/effects';\nimport { StoreModule} from '@ngrx/store';\nimport { RedactionComponent } from './redaction/components/redaction.component';\nimport { IcpSessionApiService } from './icp/icp-session-api.service';\nimport { IcpUpdateService } from './icp/icp-update.service';\nimport { IcpService } from './icp/icp.service';\nimport { SocketService } from './icp/socket.service';\nimport { reducers} from './store/reducers/reducers';\nimport { effects } from './store/effects/index';\nimport { BookmarksComponent } from './viewers/pdf-viewer/side-bar/bookmarks/bookmarks.component';\nimport { RedactionApiService } from './redaction/services/redaction-api.service';\nimport { MutableDivModule } from 'mutable-div';\nimport { ConvertibleContentViewerComponent } from './viewers/convertible-content-viewer/convertible-content-viewer.component';\nimport { DocumentConversionApiService } from './viewers/convertible-content-viewer/document-conversion-api.service';\nimport { IcpPresenterService } from './icp/icp-presenter.service';\nimport { IcpFollowerService } from './icp/icp-follower.service';\nimport { ConfirmActionDialogComponent } from './icp/confirm-exit/confirm-action-dialog.component';\nimport { TreeModule } from '@circlon/angular-tree-component';\nimport { BookmarkIconsComponent } from './bookmark/components/bookmark-icons.component';\nimport { RotationApiService } from './viewers/rotation-persist/rotation-api.service';\nimport { RotationPersistDirective } from './viewers/rotation-persist/rotation-persist.directive';\nimport { ParticipantsListComponent } from './icp/participants-list/participants-list.component';\nimport { HighlightCreateDirective } from './annotations/annotation-set/annotation-create/highlight-create/highlight-create.directive';\nimport {MultimediaPlayerComponent} from './viewers/multimedia-player/multimedia-player.component';\n\n@NgModule({\n imports: [\n CommonModule,\n HttpClientModule,\n ToolbarModule,\n AnnotationsModule,\n TagInputModule,\n FormsModule,\n ReactiveFormsModule,\n RouterModule,\n StoreModule.forFeature('media-viewer', reducers),\n EffectsModule.forFeature(effects),\n TreeModule,\n MutableDivModule\n ],\n declarations: [\n PdfViewerComponent,\n SideBarComponent,\n BookmarksComponent,\n OutlineItemComponent,\n ImageViewerComponent,\n UnsupportedViewerComponent,\n MultimediaPlayerComponent,\n MediaViewerComponent,\n ConvertibleContentViewerComponent,\n GrabNDragDirective,\n RotationPersistDirective,\n HighlightCreateDirective,\n ConfirmActionDialogComponent,\n RedactionComponent, // todo made put this into module\n BookmarkIconsComponent,\n ParticipantsListComponent\n ],\n entryComponents: [\n PdfViewerComponent,\n ImageViewerComponent,\n UnsupportedViewerComponent\n ],\n providers: [\n PdfJsWrapperFactory,\n CommentService,\n RedactionApiService,\n IcpSessionApiService,\n IcpUpdateService,\n SocketService,\n IcpService,\n IcpPresenterService,\n IcpFollowerService,\n RedactionApiService,\n DocumentConversionApiService,\n RotationApiService,\n ],\n exports: [\n MediaViewerComponent\n ]\n})\nexport class MediaViewerModule { }\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__decorate","decorators","target","key","desc","c","arguments","length","r","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","__metadata","metadataKey","metadataValue","metadata","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","this","n","v","op","TypeError","pop","push","create","__values","o","s","m","__read","ar","error","__spread","concat","FindState","pdfjsLib","GlobalWorkerOptions","workerSrc","PdfJsWrapper","pdfViewer","downloadManager","toolbarEvents","documentLoadInit","documentLoadProgress","documentLoaded","outlineLoaded","documentLoadFailed","pageRendered","positionUpdated","_this","eventBus","on","setCurrentPageInputValueSubject","pageNumber","currentScaleValue","emitDocumentInfo","event","sendSearchDetails","searchResultsCountSubject","matchesCount","zoomValue","state","PENDING","_b","_a","source","selected","pageIdx","total","redactionSerachSubject","page","_d","_c","matchedIndex","_f","_e","matchIdx","allPages","_pages","map","div","scale","rotation","id","viewportScale","viewport","loadDocument","documentUrl","loadingTask","createLoadingTask","onProgress","_g","loaded","promise","pdfDocument","pageCountSubject","numPages","setDocument","linkService","getOutline","outline","setOutlinePageNumbers","documentOutline","getMetadata","pdfMetaData","setCurrentPDFTitle","info","Title","e_1","getDocument","url","cMapUrl","cMapPacked","withCredentials","outlineArray","forEach","setNestedOutlinePageNumbers","getOutlinePageNumber","_h","items","outlineItem","dest","getPageIndex","pageIndex","Number","downloadFile","filename","downloadUrl","setPageNumber","currentPageNumber","getPageNumber","changePageNumber","search","operation","command","reset","findController","executeCommand","query","searchTerm","phraseSearch","caseSensitive","matchCase","entireWord","wholeWord","highlightAll","findPrevious","previous","clearSearch","dispatch","navigateTo","destination","name","includes","setZoom","getZoomValue","zoomValueSubject","stepZoom","isNaN","toFixed","rotate","pagesRotation","resetRotation","getNormalisedPagesRotation","getCurrentPDFZoomValue","title","documentTitle","getCurrentPDFTitle","enabled","BehaviorSubject","sessionLaunch","Subject","becomingPresenter","stoppingPresenting","leavingSession","sessionExitConfirmed","participantsListVisible","launchSession","ToolbarEventService","highlightModeSubject","drawModeSubject","rotateSubject","searchSubject","zoomSubject","stepZoomSubject","printSubject","downloadSubject","setCurrentPageSubject","changePageByDeltaSubject","showCommentSummary","grabNDrag","saveRotationSubject","redactionMode","redactionPreview","applyRedactToDocument","clearAllRedactMarkers","redactWholePage","redactAllInProgressSubject","openRedactionSearch","sidebarOpen","sidebarOutlineView","searchBarHidden","commentsPanelVisible","icp","icpEvents","toggleHighlightMode","getValue","toggleDrawMode","angle","phrase","getSearchResultsCount","asObservable","zoom","getPageCount","print","download","setPage","incrementPage","getCurrentPageNumber","getShowCommentSummary","toggleCommentsSummary","saveRotation","toggleGrabNDrag","toggleSideBar","toggle","toggleSideBarView","toggleRedactionMode","toggleRedactionPreview","viewMode","unmarkAll","applyRedactionToDocument","redactPage","toggleCommentsPanel","isVisible","toggleParticipantsList","type","Injectable","args","providedIn","PdfJsWrapperFactory","pdfjsViewer","PDFLinkService","EventBus","container","pdfFindController","PDFFindController","PDFViewer","nativeElement","imageResourcesPath","textLayerMode","setViewer","pdfJsWrapper","DownloadManager","pdfWrapper","ResponseType","PrintService","printDocumentNatively","printWindow","window","open","focus","setTimeout","printer","printElementNatively","element","width","height","documentHead","document","head","appendChild","cloneNode","close","ViewerException","exceptionType","detail","ToolbarButtonVisibilityService","showPrint","showDownload","showNavigation","showZoom","showRotate","showPresentationMode","showRedact","showOpenFile","showBookmark","showHighlightButton","showDrawButton","showSearchBar","showSidebar","showGrabNDragButton","showSaveRotationButton","setup","options","defaultPdfOptions","defaultImageOptions","defaultMultimediaOptions","defaultUnsupportedOptions","SET_DOCUMENT_ID","POSITION_UPDATED","ADD_PAGES","CONVERT","CONVERT_SUCCESS","CONVERT_FAIL","CLEAR_CONVERT_DOC_URL","LOAD_ROTATION","LOAD_ROTATION_SUCCESS","LOAD_ROTATION_FAIL","SAVE_ROTATION","SAVE_ROTATION_SUCCESS","SetDocumentId","payload","AddPages","PdfPositionUpdate","Convert","ConvertSuccess","ConvertFailure","ClearConvertDocUrl","LoadRotation","LoadRotationSuccess","LoadRotationFailure","SaveRotation","SaveRotationSuccess","SaveRotationFailure","ADD_FILTER_TAGS","CLEAR_FILTER_TAGS","AddFilterTags","ClearFilterTags","SET_CASE_ID","LOAD_ICP_SESSION","JOIN_ICP_SOCKET_SESSION","ICP_SOCKET_SESSION_JOINED","LEAVE_ICP_SOCKET_SESSION","ICP_PRESENTER_UPDATED","ICP_PARTICIPANT_LIST_UPDATED","SetCaseId","LoadIcpSession","LoadIcpSessionFailure","JoinIcpSocketSession","IcpSocketSessionJoined","LeaveIcpSocketSession","IcpPresenterUpdated","IcpParticipantListUpdated","initialDocumentState","convertedDocument","undefined","documentId","pdfPosition","pages","hasDifferentPageSize","rotationLoaded","loading","docReducer","action","fromActions.CONVERT_SUCCESS","assign","fromActions.CONVERT_FAIL","fromActions.CLEAR_CONVERT_DOC_URL","fromActions.LOAD_ROTATION","fromActions.LOAD_ROTATION_SUCCESS","rotationAngle","fromActions.LOAD_ROTATION_FAIL","fromActions.SAVE_ROTATION_SUCCESS","fromActions.SET_DOCUMENT_ID","fromActions.ADD_PAGES","pageHeight_1","pageWidth_1","pages_1","hasDifferentPageSize_1","styles","left","scaleRotation","fromActions.POSITION_UPDATED","getDocPages","LOAD_ANNOTATION_SET","LOAD_ANNOTATION_SET_SUCCESS","LOAD_ANNOTATION_SET_FAIL","SAVE_ANNOTATION","SAVE_ANNOTATION_SUCCESS","SAVE_ANNOTATION_FAIL","ADD_OR_EDIT_COMMENT","DELETE_ANNOTATION","DELETE_ANNOTATION_SUCCESS","DELETE_ANNOTATION_FAIL","SELECT_ANNOTATION","SEARCH_COMMENT","APPLY_COMMENT_SUMMARY_FILTER","CLEAR_COMMENT_SUMMARY_FILTER","LoadAnnotationSet","LoadAnnotationSetSucess","LoadAnnotationSetFail","SaveAnnotation","SaveAnnotationSuccess","SaveAnnotationFail","AddOrEditComment","DeleteAnnotation","DeleteAnnotationSuccess","DeleteAnnotationFail","SelectedAnnotation","SearchComment","ApplyCommentSymmaryFilter","ClearCommentSummaryFilters","StoreUtils","groupByKeyEntities","annotations","reduce","h","obj","generateCommentsEntities","commentEntities","annotation","comments","comment","tags","genTagNameEntities","groupedByName","filter","a","anno","tagEntitiy","tagItem","genNameEnt","annos","keys","tagNameEnt","readyAnno","find","tag","generateAnnotationEntities","annoEntities","annot","positionTop","rectangles","generateRedactionEntities","redactions","redactEntities","redaction","redactionId","resetCommentEntSelect","ent","object","editable","filterCommentsSummary","filters","tagFilterApplied","tagFilters","dateFilterApplied_1","dateRangeFrom","dateRangeTo","filteredComments","hasTagFilter","hasDateFilter","commentDate","moment","lastModifiedDate","dateFrom","dateTo","initialState","annotationSet","annotationEntities","annotationPageEntities","selectedAnnotation","commentSearchQueries","commentSearch","commentSummaryFilters","hasFilter","reducer","isFiltered","fromAnnotations.LOAD_ANNOTATION_SET","fromAnnotations.LOAD_ANNOTATION_SET_SUCCESS","fromAnnotations.LOAD_ANNOTATION_SET_FAIL","status","uuid","fromAnnotations.SAVE_ANNOTATION_SUCCESS","annEntities_1","annotArray","annotationId","fromAnnotations.DELETE_ANNOTATION_SUCCESS","id_1","pageAnnotationsRemoved","fromAnnotations.ADD_OR_EDIT_COMMENT","fromAnnotations.SELECT_ANNOTATION","commentEntity","fromAnnotations.SEARCH_COMMENT","fromAnnotations.APPLY_COMMENT_SUMMARY_FILTER","payload_1","fromAnnotations.CLEAR_COMMENT_SUMMARY_FILTER","getAnnoSet","getCommentEnts","getAnnoPageEnt","getAnnoEnt","getSelectedAnno","commentSearchQ","getSummaryFilters","initialTagState","filteredPageEntities","formFilterState","tagsReducer","fromTags.ADD_FILTER_TAGS","formFilterState_1","arr","fromTags.CLEAR_FILTER_TAGS","getFilteredComments","getFilteredPageEnt","LOAD_BOOKMARKS","LOAD_BOOKMARKS_SUCCESS","LOAD_BOOKMARKS_FAIL","CREATE_BOOKMARK","CREATE_BOOKMARK_SUCCESS","DELETE_BOOKMARK","DELETE_BOOKMARK_SUCCESS","MOVE_BOOKMARK","MOVE_BOOKMARK_SUCCESS","UPDATE_BOOKMARK","UPDATE_BOOKMARK_SUCCESS","LoadBookmarks","LoadBookmarksSuccess","LoadBookmarksFailure","CreateBookmark","CreateBookmarkSuccess","CreateBookmarkFailure","DeleteBookmark","DeleteBookmarkSuccess","DeleteBookmarkFailure","MoveBookmark","MoveBookmarkSuccess","MoveBookmarkFailure","UpdateBookmark","UpdateBookmarkSuccess","UpdateBookmarkFailure","getBookmarkChildren","bookmarks","childIds","bookmark","children","generateBookmarkEntities","bookmarkEntities","indexEntities","entities","entityIds","index","keysToRemove","toString","splice","indexOf","initialBookmarksState","bookmarkPageEntities","editableBookmark","bookmarksReducer","fromBookmarks.LOAD_BOOKMARKS","fromBookmarks.LOAD_BOOKMARKS_SUCCESS","fromBookmarks.LOAD_BOOKMARKS_FAIL","fromBookmarks.CREATE_BOOKMARK_SUCCESS","bookmarkEntities_1","bookmarkArray","fromBookmarks.MOVE_BOOKMARK_SUCCESS","movedBookmarks","fromBookmarks.DELETE_BOOKMARK_SUCCESS","bookmarkIds","bookmarkEntities_2","bookmarkPageEntities_1","removeBookmarksByPage_1","bookmarkId","entries","bmrkIds","fromBookmarks.UPDATE_BOOKMARK_SUCCESS","bookmarkEntities_3","LOAD_REDACTIONS","LOAD_REDACTION_SUCCESS","SAVE_REDACTION","SAVE_REDACTION_SUCCESS","SAVE_BULK_REDACTION","SAVE_BULK_REDACTION_SUCCESS","DELETE_REDACTION","DELETE_REDACTION_SUCCESS","SELECT_REDACTION","REDACT","REDACT_SUCCESS","RESET_REDACTED_DOCUMENT","UNMARK_ALL","UNMARK_ALL_SUCCESS","LoadRedactions","LoadRedactionSuccess","LoadRedactionFailure","SaveRedaction","SaveRedactionSuccess","SaveRedactionFailure","SaveBulkRedactionFailure","SaveBulkRedaction","SaveBulkRedactionSuccess","DeleteRedaction","DeleteRedactionSuccess","DeleteRedactionFailure","SelectRedaction","Redact","RedactSuccess","RedactFailure","ResetRedactedDocument","UnmarkAll","UnmarkAllSuccess","initialRedactionState","redactionEntities","redactionPageEntities","selectedRedaction","redactedDocumentInfo","redactionReducer","fromRedaction.LOAD_REDACTIONS","fromRedaction.LOAD_REDACTION_SUCCESS","fromRedaction.SAVE_REDACTION_SUCCESS","redactionEntities_1","redactionArray","fromRedaction.SAVE_BULK_REDACTION_SUCCESS","payloadResult","searchRedactions","x","redactionEntities_2","fromRedaction.SELECT_REDACTION","fromRedaction.DELETE_REDACTION_SUCCESS","pageRedactionRemoved","fromRedaction.REDACT_SUCCESS","fromRedaction.RESET_REDACTED_DOCUMENT","fromRedaction.UNMARK_ALL_SUCCESS","initialIcpSessionState","session","presenter","client","participants","icpReducer","fromIcpActions.SET_CASE_ID","caseId","fromIcpActions.ICP_SOCKET_SESSION_JOINED","participantInfo","fromIcpActions.ICP_PARTICIPANT_LIST_UPDATED","updatedParticipants_1","username","fromIcpActions.ICP_PRESENTER_UPDATED","fromIcpActions.LEAVE_ICP_SOCKET_SESSION","IcpEvents","reducers","fromDocument.docReducer","fromAnnotation.reducer","fromTags.tagsReducer","fromBookmarks.bookmarksReducer","fromRedaction.redactionReducer","fromIcp.icpReducer","getMVState","createFeatureSelector","getDocumentState","createSelector","fromFeature.getMVState","getPages","fromDocument.getDocPages","getDocumentId","values","getPdfPosition","getPageDifference","getConvertedDocument","getRotation","ViewerEventService","textHighlight","boxHighlight","ctxToolbarCleared","navigationEvent","textSelected","selectionData","boxSelected","clearCtxToolbar","goToDestination","SocketService","connected$","sessionJoined$","presenterUpdated$","clientDisconnected$","participantUpdated$","newParticipantJoined$","screenUpdated$","ngOnDestroy","subscription","unsubscribe","connect","getSocketClient","subscribe","socket","onopen","onmessage","console","log","eventData","JSON","parse","data","eventName","messageEventHandller","onerror","onclose","connected","join","emit","SESSION_JOIN","leave","SESSION_LEAVE","send","stringify","listen","SESSION_JOINED","PRESENTER_UPDATED","CLIENT_DISCONNECTED","PARTICIPANTS_UPDATED","NEW_PARTICIPANT_JOINED","SCREEN_UPDATED","WebSocket","of","IcpUpdateService","joinSession","connectionUrl","isConnected","leaveSession","newParticipantJoined","clientDisconnected","removeParticipant","participantId","REMOVE_PARTICIPANT","participantListUpdated","updatePresenter","UPDATE_PRESENTER","presenterId","presenterName","presenterUpdated","updateScreen","screen","update","UPDATE_SCREEN","screenUpdated","getIcpState","getIcpSession","getCaseId","getPresenter","getPresenterName","getClient","isPresenter","getParticipants","IcpPresenterService","socketService","store","$subscription","pipe","select","fromDocSelectors.getPdfPosition","onPositionUpdate","add","fromIcpSelectors.getPresenter","onNewParticipantJoined","Store","IcpFollowerService","viewerEvents","isFollower","followScreenUpdate","top","take","position","rotationDelta","IcpService","presenterSubscriptions","followerSubscriptions","fromIcpSelectors.getCaseId","unsubscribeSession","fromIcpActions.LoadIcpSession","fromIcpSelectors.getIcpSession","setUpSessionSubscriptions","sessionSubscription","becomePresenter","stopPresenting","leavePresentation","fromIcpSelectors.getClient","fromIcpSelectors.isPresenter","cli","pres","fromIcpActions.IcpPresenterUpdated","fromIcpActions.IcpParticipantListUpdated","fromIcpActions.LeaveIcpSocketSession","PdfViewerComponent","icpStore","pdfJsWrapperFactory","printService","icpService","toolbarButtons","mediaLoadStatus","EventEmitter","pdfViewerException","pageHeights","loadingDocument","enableGrabNDrag","highlightMode","tap","fromTagActions.ClearFilterTags","drawMode","ngAfterContentInit","onDocumentLoadProgress","onDocumentLoaded","onDocumentLoadFailed","updatePages","downloadFileName","rotateDocument","showCommentsPanel","showIcpParticipantsList","throttleTime","asyncScheduler","leading","trailing","location","ngOnChanges","changes","viewerContainer","enableRedactions","initDocumentProgress","setPageHeights","fromDocumentsSelector.getPageDifference","hasDifferentPageSie","progress","loadingDocumentProgress","Math","min","ceil","SUCCESS","viewerException","message","errorMessage","FAILURE","enableAnnotations","fromDocumentActions.AddPages","set","hidden","zoomFactor","calculateZoomValue","pdfViewerChildren","clientHeight","increment","newZoomValue","Component","selector","template","encapsulation","ViewEncapsulation","None","Output","Input","ViewChild","static","ViewerUtilService","http","validateFile","HttpClient","ImageViewerComponent","viewerUtilService","imageViewerException","subscriptions","ngOnInit","rotateImage","onImageViewerClick","className","startsWith","fromAnnotationActions.SelectedAnnotation","closed","response","initAnnoPage","img","setZoomValue","naturalWidth","createElement","setAttribute","href","click","remove","onLoadError","httpResponseCode","onLoad","imageHeight","offsetWidth","offsetHeight","imageWidth","imageLeft","offsetTop","offsetLeft","imageTop","scrollHeight","scrollWidth","fromDocument.AddPages","HostListener","UnsupportedViewerComponent","loadStatus","unsupportedViewerException","downloadLink","UNSUPPORTED","typeException","AnnotationApiService","httpClient","annotationApiUrl","annotationSetBaseUrl","annotationBaseUrl","getAnnotationSet","fixedUrl","annotationSetsFullUrl","get","observe","postAnnotationSet","post","catchError","getComments","sortAnnotations","extractComments","sort","deleteAnnotation","annotationFullsUrl","delete","postAnnotation","CommentService","unsavedChanges","marginToCommentEmitter","setCommentSet","commentSetComponent","onCommentChange","getUnsavedChanges","hasUnsavedComments","getComment","hasUnsavedChanges","updateUnsavedCommentsStatus","allCommentsSaved","commentComponents","resetCommentSet","some","createMarginToCommentEvent","margin","CoreContentTypes","MultimediaContentTypes","ConvertibleContentTypes","getTagsRootState","getTagEntities","getTagFilters","getTagFiltered","fromTags.getFilteredComments","getFilteredPageEntities","fromTags.getFilteredPageEnt","getAllTagsArr","tagEnt","ɵ0","getAnnotationsSetState","getAnnotationEntities","fromAnnotations.getAnnoEnt","getSet","fromAnnotations.getAnnoSet","annoSet","annotationSetId","getDocumentIdSetId","ɵ2","getSelectedAnnotation","fromAnnotations.getSelectedAnno","getCommentEntities","fromAnnotations.getCommentEnts","getPageEntities","fromAnnotations.getAnnoPageEnt","getComponentSearchQueries","fromAnnotations.commentSearchQ","ɵ3","queries","getComponentSearchText","getCommentSummaryFilters","fromAnnotations.getSummaryFilters","pageEnt","filteredPageEnt","arr_1","getAnnoPerPage","fromDocument.getPages","fromTags.getFilteredPageEntities","commentEnts","annoEnts","filtered","com","getCommentsArray","fromTags.getTagFiltered","commentSummary","createdByDetails","user","forename","surname","date","format","content","getCommentSummary","annoEnt","getFilteredAnnotations","MediaViewerComponent","api","commentService","elRef","cdr","showToolbar","toolbarButtonOverrides","toolbarEventsOutput","enableICP","multimediaPlayerEnabled","enableRedactSearch","multimediaContent","convertibleContent","unsupportedContent","annotationSet$","fromAnnoSelectors.getAnnotationSet","hasDifferentPageSize$","setToolbarButtons","$subscriptions","ngAfterViewChecked","viewerHeight","detectChanges","offset","getBoundingClientRect","viewerRef","prevOffset","extractDMStoreDocId","fromDocumentActions.SetDocumentId","fromAnnoActions.LoadAnnotationSet","fromRedactActions.LoadRedactions","contentType","needsConverting","isMultimedia","isSupported","detectOs","toUpperCase","supportedTypes","onMediaLoad","PDF","IMAGE","onLoadException","exception","onDocumentTitleChange","split","replace","hasScrollBar","navigator","userAgent","ElementRef","ChangeDetectorRef","HighlightCreateService","toolBarEvents","saveAnnotation","fromSelectors.getDocumentIdSetId","anoSetDocId","color","createdBy","createdDate","utc","tz","toISOString","lastModifiedBy","lastModifiedByDetails","fromActions.SaveAnnotation","applyRotation","pageHeight","pageWidth","rectangle","resetHighlight","getSelection","removeAllRanges","RedactionSearchBarComponent","highlightService","resultsText","searchText","resultCount","redactElements","advancedSearchVisible","results","redactAllSearched","fromDocument.getDocumentId","docId","setSearchResultsCount","isOpen","openSearchModal","inProgress","redactAllInProgress","onWindowKeyDown","code","ctrlKey","preventDefault","findInput","redactAll","saveRedaction","redactRectangle","ele","fromRedactionActions.SaveBulkRedaction","existInRedactElements","matechedIndex","pagesFound","re","pageRectangles","matchesRectangles","rectIndx","onCloseSearchModal","$this","intervalId","setInterval","highlightElement","getElementsByClassName","clearInterval","redactAllSearchedTick","getRectangles","CreateRedactAllText","redactAllText","onEscapeKeyPress","onEnterKeyPress","toggleSearchBar","parseFloat","parseInt","selectedHighLightedElements","docRange","createRange","selectNodeContents","selection","addRange","rangeCount","isCollapsed","clientRects","getRangeAt","cloneRange","getClientRects","parentRect","parentElement","selectionRectangles","selectionRectangle","this_1","createTextRectangle","rect","bottom","right","NumberHelperService","isNumber","MainToolbarComponent","numberHelper","icpEnabled","redactionEnabled","pageCount","isDropdownMenuOpen","dropdownMenuPositions","ConnectionPositionPair","originX","originY","overlayX","overlayY","zoomScales","allButtonsWidth","widthRequiredForBtn","setCurrentPage","count","disable","ngAfterViewInit","from","mvToolbarMain","button","onResize","onControlPrint","printFile","onClickHighlightToggle","onClickDrawToggle","toggleIndexSideBar","sidebarView","toggleBookmarksSideBar","togglePresentBar","enable","increasePageNumber","decreasePageNumber","onPageNumberInputChange","zoomSelect","toggleRedactBar","isPdf","toggleMoreOptions","mvMenuItems","SearchBarComponent","searchNext","searchPrev","current","findNext","toggleAdvancedSearch","getRedactionState","getRedactionPages","getSelected","getRedactedDocumentInfo","getRedactionEnt","getRedactionArray","getRedactionsPerPage","RedactionToolbarComponent","toolbarEventService","preview","hasRedactions","fromRedactSelectors.getRedactionArray","inprogress","redactionAllInProgress","onRedactAllSearch","toggleTextRedactionMode","togglePreview","redact","IcpToolbarComponent","fromIcpSelectors.getPresenterName","present","leaveIcpSession","showParticipantsList","ToolbarModule","NgModule","declarations","providers","exports","imports","CommonModule","FormsModule","OverlayModule","RouterModule","AnnotationViewComponent","annotationClick","selectedId","onSelect","onRectangleUpdate","deleteHighlight","addOrEditComment","fromActions.AddOrEditComment","AnnotationSetComponent","selectedAnnotation$","fromSelectors.getSelectedAnnotation","onAnnotationUpdate","onAnnotationDelete","fromActions.DeleteAnnotation","selectAnnotation","fromActions.SelectedAnnotation","RectangleComponent","_annoRect","annoRect","adjustForRotation","_selected","viewRect","onClick","onUpdate","hasRectangleChanged","TagsServices","snakeCase","string","word","toLowerCase","getAllTags","getNewTags","annoid","tagItems","updateTagItems","annoId","snakeCased","item","CommentComponent","tagsServices","CHAR_LIMIT","totalPrevPagesHeight","commentClick","renderComments","updated","fromSelector.getComponentSearchText","distinctUntilChanged","searchString","reRenderComments","marginToComment$","_comment","lastUpdate","author","editor","originalComment","fullComment","_editable","_rectangle","prev","actualHeight","rectTop","rectLeft","updatedComment","substring","deleteOrCancel","editOrSave","onCommentClick","form","editableComment","CtxToolbarComponent","createHighlightEvent","deleteHighlightEvent","addOrEditCommentEvent","createBookmarkEvent","defaultHeight","defaultWidth","setRectangle","popupTop","popupLeft","_rectangles","createHighlight","hash","getElementById","scrollBy","createBookmark","CommentSetRenderService","redrawComponents","prevComment","sortComponents","adjustIfOverlapping","processSort","endOfPrevComment","commentTop","onSameLine","difference","abs","CommentSetComponent","renderService","clearSelection","comments$","fromSelectors.getCommentsArray","annoEntities$","fromSelectors.getAnnotationEntities","redrawComments","contentScrollTop","scrollTo","onCommentDelete","componentList","panel","style","onCommentUpdate","onContainerClick","path","ViewChildren","TextareaAutoExpandDirective","el","ngAfterContentChecked","adjustHeight","onMouseDown","overflow","Directive","CommentsSummaryComponent","fb","showFilters","filtersFg","group","FormGroup","day","FormControl","month","year","fromSelectors.getCommentSummary","buildCheckBoxForm","checkboxes","filters$","fromSelectors.getCommentSummaryFilters","allTags$","fromTagSelectors.getAllTagsArr","combineLatest","val","checkBoxValue","addControl","updateValueAndValidity","onClearFilters","fromAnnoActions.ClearCommentSummaryFilters","onFilter","hasDateFrom","hasDateTo","Date","getTime","fromAnnoActions.ApplyCommentSymmaryFilter","onFiltersToggle","onClose","onPrint","commentsTable","navigateToPage","FormBuilder","BoxHighlightCreateComponent","saveSelection","drawStartX","drawStartY","backgroundColor","wholePage","initHighlight","offsetX","offsetY","highlightPage","display","updateHighlight","currentTarget","clientX","clientY","highlight","CommentSetHeaderComponent","showCommentSummaryDialog","tabs","tabSelected","tagFilter$","fromTagSelectors.getTagFilters","filteredAnnotation$","fromAnnoSelector.getFilteredAnnotations","formData","filteredAnno","navigationList","tab","selectTab","marginToComment","CommentSearchComponent","searchResults","searchIndex","searchInput","fromActions.SearchComment","searchComments","TextHighlightDirective","textToHighlight","highlightInputText","searchPattern","RegExp","hostElement","innerHTML","match","highlightPattern","matchGroups","exec","dynamicText","TagsComponent","validators","minLength","maxLength20","errorMessages","requestAutocompleteItems","text","userId","onUpdateTags","control","CommentsNavigateComponent","autoSelect","annotationList","initNavigationList","upperRectangle","sortComments","mappedCommentA","mappedCommentB","rectA","rectB","nextItem","prevItem","rect1","rect2","CommentFilterComponent","isPreview","tagGroup","filter$","fromSelectors.getTagFilters","valueChanges","auditTime","fromActions.AddFilterTags","buildFrom","fromSelectors.getAllTagsArr","fromActions.ClearFilterTags","onRemoveFilter","tagName","controls","setValue","onToggleFilterView","MomentDatePipe","_super","String","__","constructor","__extends","transform","timezone","timezoneOffset","DatePipe","Pipe","BookmarksApiService","ANNOTATIONS_API","getBookmarks","updateBookmark","put","updateMultipleBookmarks","deleteBookmark","deleteMultipleBookmarks","request","FilterPipe","fieldName","UnsnakePipe","GovUkDateComponent","GovUkErrorMessageComponent","HtmlTemplatesHelper","setDescribedBy","config","isInvalid","hint","GovUkFieldsetComponent","GovUkLabelComponent","SharedModule","ReactiveFormsModule","getBookmarkState","getBookmarkPages","getBookmarkEntities","getBookmarkNodes","nodes","bookmarkEntity","parent","parentEntity","generateBookmarkNodes","getEditableBookmark","getBookmarkInfo","fromDocument.getPdfPosition","bookmarkNodes","xCoordinate","yCoordinate","getBookmarksPerPage","thisPage","MetadataLayerComponent","annoPages$","fromSelectors.getPageEntities","showContextToolbar","clearContextToolbar","fromBookmarks.getBookmarkInfo","bookmarkInfo","substr","AnnotationsModule","A11yModule","HttpClientModule","MutableDivModule","TagInputModule","NgxDatatableModule","entryComponents","GrabNDragDirective","pointerDown","dragEnabled","onPointerDown","originalPosition","scrollLeft","scrollTop","onPointerMove","scrollDiff","dragX","onWindowPointerUp","BookmarksComponent","pageLookup","BOOKMARK_CHAR_LIMIT","allowDrag","allowDrop","_customSort","_positionSort","sortMode","customSort","bookmarksSelectors.getEditableBookmark","editableId","sortBookmarks","editBookmark","onAddBookmarkClick","bookmarksSelectors.getBookmarkInfo","onBookmarkMove","node","to","fromNext","getSibling","toNext","customSortBookmarks","tree","treeModel","getNodeById","virtualRoot","siblings","deleted","editedBookmark","goToBookmark","defaultScaleY","scaledY","mode","positionSort","positionSortBookmarks","setDragNDrop","TreeComponent","SideBarComponent","selectedView","bookmarkNodes$","bookmarksSelectors.getBookmarkNodes","toggleSidebarView","isViewedItem","findEndPage","MAX_SAFE_INTEGER","OutlineItemComponent","showOutlineItems","toggleOutline","endPage","showHighlightOutlineCss","isCurrentSection","RedactionComponent","redactionsPerPage$","fromSelectors.getRedactionsPerPage","selectedRedaction$","fromSelectors.getSelected","fromSelectors.getRedactedDocumentInfo","redactedDocInfo","downloadDocument","markTextRedaction","fromRedaSelectors.getRedactionArray","fromRedaActions.Redact","fromRedaActions.UnmarkAll","redactionHighlight","markBoxRedaction","fromRedactionActions.SaveRedaction","onMarkerDelete","fromActions.DeleteRedaction","selectRedaction","fromActions.SelectRedaction","onMarkerUpdate","fromActions.SaveRedaction","blob","msSaveBlob","URL","createObjectURL","revokeObjectURL","fromRedactionActions.ResetRedactedDocument","IcpSessionApiService","ICP_SESSION_API","loadSession","AnnotationEffects","actions$","annotationApiService","loadAnnotation$","ofType","annotationsActions.LOAD_ANNOTATION_SET","switchMap","res","annotationsActions.LoadAnnotationSetFail","annotationsActions.LoadAnnotationSetSucess","postAnnotation$","annotationsActions.SAVE_ANNOTATION","exhaustMap","annotationsActions.SaveAnnotationSuccess","deleteAnnotation$","annotationsActions.DELETE_ANNOTATION","annotationsActions.DeleteAnnotationSuccess","annotationsActions.DeleteAnnotationFail","Actions","Effect","BookmarksEffects","bookmarksApiService","loadBookmarks$","bookmarksActions.LOAD_BOOKMARKS","withLatestFrom","bookmarksActions.LoadBookmarksSuccess","err","bookmarksActions.LoadBookmarksFailure","createBookmark$","bookmarksActions.CREATE_BOOKMARK","bmrk","bookmarksActions.CreateBookmarkSuccess","bookmarksActions.CreateBookmarkFailure","moveBookmark$","bookmarksActions.MOVE_BOOKMARK","bmrks","bookmarksActions.MoveBookmarkSuccess","bookmarksActions.MoveBookmarkFailure","deleteBookmark$","bookmarksActions.DELETE_BOOKMARK","bookmarksActions.DeleteBookmarkSuccess","bookmarksActions.UpdateBookmarkSuccess","bookmarksActions.DeleteBookmarkFailure","updateBookmark$","bookmarksActions.UPDATE_BOOKMARK","bookmarksActions.UpdateBookmarkFailure","RedactionApiService","markupsApiUrl","redactApiUrl","markupsSearchApiUrl","getRedactions","saveBulkRedaction","deleteRedaction","deleteAllMarkers","responseType","RedactionEffects","redactionApiService","loadRedactions$","redactionActions.LOAD_REDACTIONS","resp","redactionActions.LoadRedactionSuccess","redactionActions.LoadRedactionFailure","saveRedaction$","redactionActions.SAVE_REDACTION","redactionActions.SaveRedactionSuccess","redactionActions.SaveRedactionFailure","saveBulkRedaction$","redactionActions.SAVE_BULK_REDACTION","redactionActions.SaveBulkRedactionSuccess","redactionActions.SaveBulkRedactionFailure","deleteRedaction$","redactionActions.DELETE_REDACTION","redactionPayload","redactionActions.DeleteRedactionSuccess","redactionActions.DeleteRedactionFailure","redact$","redactionActions.REDACT","header","headers","redactionActions.RedactSuccess","redactionActions.RedactFailure","unmarkAll$","redactionActions.UNMARK_ALL","redactionActions.UnmarkAllSuccess","DocumentConversionApiService","documentConversionUrl","convert","RotationApiService","rotationApiUrl","DocumentEffects","documentConversionService","rotationApiService","convert$","documentActions.CONVERT","documentActions.ConvertSuccess","documentActions.ConvertFailure","loadRotation$","documentActions.LOAD_ROTATION","documentActions.LoadRotationSuccess","documentActions.LoadRotationFailure","saveRotation$","documentActions.SAVE_ROTATION","documentActions.SaveRotationSuccess","documentActions.SaveRotationFailure","IcpEffects","icpApiService","icpUpdateService","loadIcpSession$","icpActions.LOAD_ICP_SESSION","icpActions.JoinIcpSocketSession","icpActions.LoadIcpSessionFailure","joinIcpSocketSession$","icpActions.JOIN_ICP_SOCKET_SESSION","icpActions.IcpSocketSessionJoined","effects","ConvertibleContentViewerComponent","fromDocumentActions.Convert","originalUrl","fromSelectors.getConvertedDocument","docInfo","convertedUrl","fromDocumentActions.ClearConvertDocUrl","ConfirmActionDialogComponent","onCancel","onConfirm","confirmExit","BookmarkIconsComponent","bookmarksPerPage$","fromSelectors.getBookmarksPerPage","RotationPersistDirective","savedRotation","onRotate","fromDocuments.getRotation","fromDocuments.getDocumentId","fromDocumentActions.LoadRotation","fromDocuments.rotationLoaded","fromDocumentActions.SaveRotation","ParticipantsListComponent","participants$","fromSelectors.getParticipants","presenter$","fromSelectors.getPresenter","isPresenter$","fromSelectors.isPresenter","HighlightCreateDirective","onMouseUp","mouseEvent","pageElement","offsetParent","getAttribute","onPdfViewerClick","localElement","removeEnhancedTextModeStyling","child","padding","trim","MultimediaPlayerComponent","playbackMsg","reloadVideo","videoPlayer","load","onSuccess","onError","MediaViewerModule","StoreModule","forFeature","EffectsModule","TreeModule"],"sources":["../../../node_modules/tslib/tslib.es6.js","../../../projects/media-viewer/src/lib/viewers/pdf-viewer/pdf-js/pdf-js-wrapper.ts","../../../projects/media-viewer/src/lib/toolbar/icp-event.service.ts","../../../projects/media-viewer/src/lib/toolbar/toolbar-event.service.ts","../../../projects/media-viewer/src/lib/viewers/pdf-viewer/pdf-js/pdf-js-wrapper.provider.ts","../../../projects/media-viewer/src/lib/print.service.ts","../../../projects/media-viewer/src/lib/viewers/viewer-exception.model.ts","../../../projects/media-viewer/src/lib/toolbar/toolbar-button-visibility.service.ts","../../../projects/media-viewer/src/lib/store/actions/document.actions.ts","../../../projects/media-viewer/src/lib/store/actions/tag.actions.ts","../../../projects/media-viewer/src/lib/store/actions/icp.actions.ts","../../../projects/media-viewer/src/lib/store/reducers/document.reducer.ts","../../../projects/media-viewer/src/lib/store/actions/annotation.actions.ts","../../../projects/media-viewer/src/lib/store/store-utils.ts","../../../projects/media-viewer/src/lib/store/reducers/annotations.reducer.ts","../../../projects/media-viewer/src/lib/store/reducers/tags.reducer.ts","../../../projects/media-viewer/src/lib/store/actions/bookmark.actions.ts","../../../projects/media-viewer/src/lib/store/bookmarks-store-utils.ts","../../../projects/media-viewer/src/lib/store/reducers/bookmarks.reducer.ts","../../../projects/media-viewer/src/lib/store/actions/redaction.actions.ts","../../../projects/media-viewer/src/lib/store/reducers/redaction.reducer.ts","../../../projects/media-viewer/src/lib/store/reducers/icp.reducer.ts","../../../projects/media-viewer/src/lib/icp/icp.events.ts","../../../projects/media-viewer/src/lib/store/reducers/reducers.ts","../../../projects/media-viewer/src/lib/store/selectors/document.selectors.ts","../../../projects/media-viewer/src/lib/viewers/viewer-event.service.ts","../../../projects/media-viewer/src/lib/icp/socket.service.ts","../../../projects/media-viewer/src/lib/icp/icp-update.service.ts","../../../projects/media-viewer/src/lib/store/selectors/icp.selectors.ts","../../../projects/media-viewer/src/lib/icp/icp-presenter.service.ts","../../../projects/media-viewer/src/lib/icp/icp-follower.service.ts","../../../projects/media-viewer/src/lib/icp/icp.service.ts","../../../projects/media-viewer/src/lib/viewers/pdf-viewer/pdf-viewer.component.ts","../../../projects/media-viewer/src/lib/viewers/viewer-util.service.ts","../../../projects/media-viewer/src/lib/viewers/image-viewer/image-viewer.component.ts","../../../projects/media-viewer/src/lib/viewers/unsupported-viewer/unsupported-viewer.component.ts","../../../projects/media-viewer/src/lib/annotations/services/annotation-api/annotation-api.service.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment/comment.service.ts","../../../projects/media-viewer/src/lib/store/selectors/tag.selectors.ts","../../../projects/media-viewer/src/lib/media-viewer.component.ts","../../../projects/media-viewer/src/lib/store/selectors/annotation.selectors.ts","../../../projects/media-viewer/src/lib/annotations/annotation-set/annotation-create/highlight-create/highlight-create.service.ts","../../../projects/media-viewer/src/lib/toolbar/redaction-search-bar/redaction-search-bar.component.ts","../../../projects/media-viewer/src/lib/shared/util/services/number.helper.service.ts","../../../projects/media-viewer/src/lib/toolbar/main-toolbar/main-toolbar.component.ts","../../../projects/media-viewer/src/lib/toolbar/search-bar/search-bar.component.ts","../../../projects/media-viewer/src/lib/store/selectors/redaction.selectors.ts","../../../projects/media-viewer/src/lib/toolbar/redaction-toolbar/redaction-toolbar.component.ts","../../../projects/media-viewer/src/lib/toolbar/icp-toolbar/icp-toolbar.component.ts","../../../projects/media-viewer/src/lib/toolbar/toolbar.module.ts","../../../projects/media-viewer/src/lib/annotations/annotation-set/annotation-view/annotation-view.component.ts","../../../projects/media-viewer/src/lib/annotations/annotation-set/annotation-set.component.ts","../../../projects/media-viewer/src/lib/annotations/annotation-set/annotation-view/rectangle/rectangle.component.ts","../../../projects/media-viewer/src/lib/annotations/services/tags/tags.services.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment/comment.component.ts","../../../projects/media-viewer/src/lib/annotations/annotation-set/ctx-toolbar/ctx-toolbar.component.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment-set-render.service.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment-set.component.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment/textarea-auto-expand/textarea-auto-expand.directive.ts","../../../projects/media-viewer/src/lib/annotations/comments-summary/comments-summary.component.ts","../../../projects/media-viewer/src/lib/annotations/annotation-set/annotation-create/box-highlight-create/box-highlight-create.component.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment-set-header/comment-set-header.component.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment-set-header/comment-search/comment-search.component.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment/text-highlight/text-highlight.directive.ts","../../../projects/media-viewer/src/lib/annotations/tags/tags.component.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment-navigate/comments-navigate.component.ts","../../../projects/media-viewer/src/lib/annotations/comment-set/comment-set-header/comment-filter/comment-filter.component.ts","../../../projects/media-viewer/src/lib/annotations/pipes/date/date.pipe.ts","../../../projects/media-viewer/src/lib/annotations/services/bookmarks-api/bookmarks-api.service.ts","../../../projects/media-viewer/src/lib/annotations/pipes/filter/filter.pipe.ts","../../../projects/media-viewer/src/lib/annotations/pipes/unsnake/unsnake.pipe.ts","../../../projects/media-viewer/src/lib/shared/gov-uk-date/gov-uk-date.component.ts","../../../projects/media-viewer/src/lib/shared/gov-uk-error-message/gov-uk-error-message.component.ts","../../../projects/media-viewer/src/lib/shared/util/helpers/html-templates.helper.ts","../../../projects/media-viewer/src/lib/shared/gov-uk-fieldset/gov-uk-fieldset.component.ts","../../../projects/media-viewer/src/lib/shared/gov-uk-label/gov-uk-label.component.ts","../../../projects/media-viewer/src/lib/shared/shared.module.ts","../../../projects/media-viewer/src/lib/store/selectors/bookmark.selectors.ts","../../../projects/media-viewer/src/lib/annotations/annotation-set/metadata-layer/metadata-layer.component.ts","../../../projects/media-viewer/src/lib/annotations/annotations.module.ts","../../../projects/media-viewer/src/lib/viewers/grab-n-drag.directive.ts","../../../projects/media-viewer/src/lib/viewers/pdf-viewer/side-bar/bookmarks/bookmarks.component.ts","../../../projects/media-viewer/src/lib/viewers/pdf-viewer/side-bar/side-bar.component.ts","../../../projects/media-viewer/src/lib/viewers/pdf-viewer/side-bar/outline-item/outline-item.component.ts","../../../projects/media-viewer/src/lib/redaction/components/redaction.component.ts","../../../projects/media-viewer/src/lib/icp/icp-session-api.service.ts","../../../projects/media-viewer/src/lib/store/effects/annotation.effects.ts","../../../projects/media-viewer/src/lib/store/effects/bookmarks.effects.ts","../../../projects/media-viewer/src/lib/redaction/services/redaction-api.service.ts","../../../projects/media-viewer/src/lib/store/effects/redaction.effects.ts","../../../projects/media-viewer/src/lib/viewers/convertible-content-viewer/document-conversion-api.service.ts","../../../projects/media-viewer/src/lib/viewers/rotation-persist/rotation-api.service.ts","../../../projects/media-viewer/src/lib/store/effects/document.effects.ts","../../../projects/media-viewer/src/lib/store/effects/icp.effects.ts","../../../projects/media-viewer/src/lib/store/effects/index.ts","../../../projects/media-viewer/src/lib/viewers/convertible-content-viewer/convertible-content-viewer.component.ts","../../../projects/media-viewer/src/lib/icp/confirm-exit/confirm-action-dialog.component.ts","../../../projects/media-viewer/src/lib/bookmark/components/bookmark-icons.component.ts","../../../projects/media-viewer/src/lib/viewers/rotation-persist/rotation-persist.directive.ts","../../../projects/media-viewer/src/lib/icp/participants-list/participants-list.component.ts","../../../projects/media-viewer/src/lib/annotations/annotation-set/annotation-create/highlight-create/highlight-create.directive.ts","../../../projects/media-viewer/src/lib/viewers/multimedia-player/multimedia-player.component.ts","../../../projects/media-viewer/src/lib/media-viewer.module.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import { RedactionSearch } from './../../../toolbar/redaction-search-bar/redaction-search.model';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport { DownloadManager, PDFViewer } from 'pdfjs-dist/web/pdf_viewer';\nimport 'pdfjs-dist/build/pdf.worker';\nimport { Subject } from 'rxjs';\nimport { SearchOperation, ToolbarEventService } from '../../../toolbar/toolbar-event.service';\nimport { Outline } from '../side-bar/outline-item/outline.model';\nimport { PdfPosition } from '../../../store/reducers/document.reducer';\n\npdfjsLib.GlobalWorkerOptions.workerSrc = '/assets/build/pdf.worker.min.js';\n\n/**\n * Values of the state field returned by the find events\n */\nenum FindState {\n FOUND = 0,\n NOT_FOUND = 1,\n WRAPPED = 2,\n PENDING = 3,\n}\n\nexport class PdfJsWrapper {\n\n private zoomValue: number;\n private documentTitle: string;\n private documentOutline: Outline;\n\n constructor(\n private readonly pdfViewer: PDFViewer,\n private readonly downloadManager: DownloadManager,\n private readonly toolbarEvents: ToolbarEventService,\n public readonly documentLoadInit: Subject<string>,\n public readonly documentLoadProgress: Subject<DocumentLoadProgress>,\n public readonly documentLoaded: Subject<any>,\n public readonly outlineLoaded: Subject<Outline>,\n public readonly documentLoadFailed: Subject<Error>,\n public readonly pageRendered: Subject<PageEvent[]>,\n public readonly positionUpdated: Subject<{ location: PdfPosition }>\n ) {\n this.pdfViewer.eventBus.on('updateviewarea', e => positionUpdated.next(e));\n this.pdfViewer.eventBus.on('pagechanging', e => this.toolbarEvents.setCurrentPageInputValueSubject.next(e.pageNumber));\n this.pdfViewer.eventBus.on('pagesinit', () => this.pdfViewer.currentScaleValue = '1');\n\n this.pdfViewer.eventBus.on('pagerendered', e => { }); // not used left for future convenience\n this.pdfViewer.eventBus.on('pagesloaded', (e) => this.emitDocumentInfo(e));\n this.pdfViewer.eventBus.on('scalechanging', (e) => this.emitDocumentInfo(e));\n this.pdfViewer.eventBus.on('rotationchanging', (e) => this.emitDocumentInfo(e));\n\n this.pdfViewer.eventBus.on('updatefindcontrolstate', event => {\n this.sendSearchDetails(event);\n });\n this.pdfViewer.eventBus.on('updatefindmatchescount', event => {\n this.toolbarEvents.searchResultsCountSubject.next(event.matchesCount);\n });\n this.zoomValue = 1;\n }\n\n sendSearchDetails(event: any) {\n if (event.state !== FindState.PENDING) {\n this.toolbarEvents.searchResultsCountSubject.next(event.matchesCount);\n if (event?.source?.selected?.pageIdx !== -1 && event.matchesCount.total > 0) {\n this.toolbarEvents.redactionSerachSubject.next({\n page: event?.source?.selected?.pageIdx,\n matchedIndex: event?.source?.selected?.matchIdx,\n matchesCount: event.matchesCount.total\n } as RedactionSearch\n );\n }\n }\n }\n\n private emitDocumentInfo(e) {\n const allPages: PageEvent[] = [...this.pdfViewer._pages].map(page => {\n return {\n div: page.div,\n scale: page.scale,\n rotation: page.rotation,\n id: page.id,\n viewportScale: page.viewport.scale\n };\n });\n this.pageRendered.next(allPages);\n }\n\n public async loadDocument(documentUrl: string) {\n const loadingTask = this.createLoadingTask(documentUrl);\n\n loadingTask.onProgress = ({ loaded, total }) => {\n this.documentLoadProgress.next({ loaded, total });\n };\n\n this.documentLoadInit.next(documentUrl);\n\n try {\n const pdfDocument = await loadingTask.promise;\n this.documentLoaded.next(pdfDocument);\n this.toolbarEvents.pageCountSubject.next(pdfDocument.numPages);\n\n this.pdfViewer.setDocument(pdfDocument);\n this.pdfViewer.linkService.setDocument(pdfDocument, null);\n\n const outline = await pdfDocument.getOutline();\n\n if (outline) {\n await this.setOutlinePageNumbers(pdfDocument, outline);\n }\n\n this.documentOutline = outline;\n this.outlineLoaded.next(this.documentOutline);\n const pdfMetaData = await pdfDocument.getMetadata();\n this.setCurrentPDFTitle(pdfMetaData.info.Title);\n } catch (e) {\n this.documentLoadFailed.next(e);\n }\n }\n\n private createLoadingTask(documentUrl: string) {\n return pdfjsLib.getDocument({\n url: documentUrl,\n cMapUrl: 'assets/minified/cmaps',\n cMapPacked: true,\n withCredentials: true\n });\n }\n\n private async setOutlinePageNumbers(pdfDocument, outlineArray: Outline[]) {\n outlineArray.forEach(async (outline: Outline) => {\n await this.setNestedOutlinePageNumbers(pdfDocument, outline);\n });\n }\n\n private async setNestedOutlinePageNumbers(pdfDocument, outline: Outline) {\n outline.pageNumber = await this.getOutlinePageNumber(pdfDocument, outline);\n outline.items.forEach(async (outlineItem: Outline) => {\n outlineItem.pageNumber = await this.getOutlinePageNumber(pdfDocument, outlineItem);\n this.setNestedOutlinePageNumbers(pdfDocument, outlineItem);\n });\n }\n\n private async getOutlinePageNumber(pdfDocument, outline: Outline): Promise<number> {\n const dest = outline.dest;\n const pageIndex = await pdfDocument.getPageIndex(dest[0]);\n return Number(pageIndex) + 1;\n }\n\n public downloadFile(url: string, filename: string): void {\n this.downloadManager.downloadUrl(url, filename);\n }\n\n public setPageNumber(pageNumber: number): void {\n this.pdfViewer.currentPageNumber = pageNumber;\n }\n public getPageNumber(): number {\n return this.pdfViewer.currentPageNumber;\n }\n public changePageNumber(numPages: number): void {\n this.pdfViewer.currentPageNumber += numPages;\n }\n\n public search(operation: SearchOperation): void {\n const command = operation.reset ? 'find' : 'findagain';\n\n this.pdfViewer.findController.executeCommand(command, {\n query: operation.searchTerm,\n phraseSearch: true,\n caseSensitive: operation.matchCase,\n entireWord: operation.wholeWord,\n highlightAll: operation.highlightAll,\n findPrevious: operation.previous,\n });\n }\n\n public clearSearch(): void {\n this.pdfViewer.eventBus.dispatch('findbarclose');\n }\n\n public navigateTo(destination: object | number) {\n if (destination instanceof Object) {\n if (!destination[1].name.includes('XYZ')) {\n destination[1] = { name: 'XYZ' };\n destination[2] = destination[2] || null;\n destination[3] = destination[3] || null;\n }\n destination[4] = this.zoomValue;\n }\n this.pdfViewer.linkService.navigateTo(destination);\n }\n\n public setZoom(zoomValue: number): void {\n this.pdfViewer.currentScaleValue = this.getZoomValue(zoomValue);\n this.zoomValue = this.pdfViewer.currentScaleValue;\n this.toolbarEvents.zoomValueSubject.next(this.pdfViewer.currentScaleValue);\n }\n\n public stepZoom(zoomValue: number): void {\n this.pdfViewer.currentScaleValue = +this.getZoomValue((+this.pdfViewer.currentScaleValue) + zoomValue);\n this.zoomValue = this.pdfViewer.currentScaleValue;\n this.toolbarEvents.zoomValueSubject.next(this.pdfViewer.currentScaleValue);\n }\n\n private getZoomValue(zoomValue: number): number {\n if (isNaN(zoomValue)) { return this.zoomValue; }\n if (zoomValue > 5) { return 5; }\n if (zoomValue < 0.1) { return 0.1; }\n\n return +zoomValue.toFixed(2);\n }\n\n public rotate(rotation: number): number {\n return this.pdfViewer.pagesRotation = (this.pdfViewer.pagesRotation + rotation) % 360;\n }\n\n public resetRotation(rotation: number): number {\n return this.pdfViewer.pagesRotation = rotation;\n }\n\n public getNormalisedPagesRotation(): number {\n return this.pdfViewer.pagesRotation;\n }\n\n public getCurrentPDFZoomValue(): number {\n return this.pdfViewer.currentScaleValue;\n }\n\n public setCurrentPDFTitle(title: string) {\n this.documentTitle = title;\n }\n\n public getCurrentPDFTitle(): string {\n return this.documentTitle;\n }\n}\n\nexport interface DocumentLoadProgress {\n loaded: number;\n total: number;\n}\n\nexport interface PageEvent {\n div: object;\n scale: number;\n rotation: number;\n id: string;\n viewportScale: number;\n}\n","import { BehaviorSubject, Subject } from 'rxjs';\n\n export const enabled = new BehaviorSubject(false);\n export const sessionLaunch = new Subject();\n export const becomingPresenter = new Subject();\n export const stoppingPresenting = new Subject();\n export const leavingSession = new BehaviorSubject(false);\n export const sessionExitConfirmed = new Subject();\n export const participantsListVisible = new BehaviorSubject(false);\n\nexport const launchSession = () => {\n sessionLaunch.next();\n};\n\nexport const enable = () => {\n enabled.next(true);\n launchSession();\n};\n\nexport const becomePresenter = () => {\n becomingPresenter.next();\n};\n\nexport const stopPresenting = () => {\n stoppingPresenting.next();\n};\n\nexport const leaveSession = () => {\n leavingSession.next(true);\n};\n\nexport const confirmExit = () => {\n sessionExitConfirmed.next();\n participantsListVisible.next(false);\n enabled.next(false);\n};\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport * as icpEvents from './icp-event.service';\nimport { participantsListVisible } from './icp-event.service';\nimport { RedactionSearch } from './redaction-search-bar/redaction-search.model';\n\n// Toolbar Custom-Event Types\nexport type HighlightMode = boolean;\nexport type DrawMode = boolean;\nexport interface SearchOperation {\n searchTerm: string;\n highlightAll: boolean;\n matchCase: boolean;\n wholeWord: boolean;\n previous: boolean;\n reset: boolean;\n}\nexport interface SearchResultsCount {\n current: number;\n total: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ToolbarEventService {\n\n public readonly highlightModeSubject = new BehaviorSubject<HighlightMode>(false);\n public readonly drawModeSubject = new BehaviorSubject<DrawMode>(false);\n public readonly rotateSubject = new Subject<number>();\n public readonly searchSubject = new Subject<SearchOperation>();\n public readonly searchResultsCountSubject = new Subject<SearchResultsCount>();\n public readonly zoomSubject = new Subject<number>();\n public readonly stepZoomSubject = new Subject<number>();\n public readonly zoomValueSubject = new BehaviorSubject<number>(1);\n public readonly pageCountSubject = new Subject<number>();\n public readonly printSubject = new Subject();\n public readonly downloadSubject = new Subject();\n public readonly setCurrentPageSubject = new Subject<number>();\n public readonly setCurrentPageInputValueSubject = new Subject<number>();\n public readonly changePageByDeltaSubject = new Subject<number>();\n public readonly showCommentSummary = new BehaviorSubject<boolean>(false);\n public readonly grabNDrag = new BehaviorSubject<boolean>(false);\n public readonly saveRotationSubject = new Subject();\n\n public readonly redactionMode = new BehaviorSubject(false);\n public readonly redactionPreview = new Subject<boolean>();\n public readonly applyRedactToDocument = new Subject();\n public readonly clearAllRedactMarkers = new Subject();\n public readonly redactWholePage = new Subject();\n public readonly redactionSerachSubject = new Subject<RedactionSearch>();\n public readonly redactAllInProgressSubject = new BehaviorSubject(false);\n public readonly openRedactionSearch = new Subject<boolean>();\n\n public readonly sidebarOpen = new BehaviorSubject(false);\n public readonly sidebarOutlineView = new BehaviorSubject(true);\n\n public readonly searchBarHidden = new BehaviorSubject(true);\n public readonly commentsPanelVisible = new BehaviorSubject(false);\n\n public readonly icp = icpEvents;\n\n\n /**\n * Reset the stateful behaviour subjects\n */\n public reset(): void {\n this.setCurrentPageSubject.next(1);\n this.zoomValueSubject.next(1);\n this.highlightModeSubject.next(false);\n this.drawModeSubject.next(false);\n this.showCommentSummary.next(false);\n this.grabNDrag.next(false);\n }\n\n // Function to inform Observers that highlightMode has been enabled\n public toggleHighlightMode(): void {\n // Highlight and Draw states are mutually exclusive\n if (this.highlightModeSubject.getValue() === false) {\n this.drawModeSubject.next(false);\n this.grabNDrag.next(false);\n this.highlightModeSubject.next(true);\n } else {\n this.highlightModeSubject.next(false);\n }\n }\n\n // Function to inform Observers that ToggleMode has been enabled\n public toggleDrawMode(): void {\n if (this.drawModeSubject.getValue() === false) {\n this.highlightModeSubject.next(false);\n this.grabNDrag.next(false);\n this.drawModeSubject.next(true);\n } else {\n this.drawModeSubject.next(false);\n }\n }\n\n public rotate(angle: number): void {\n this.rotateSubject.next(angle);\n }\n\n public search(phrase: SearchOperation): void {\n this.searchSubject.next(phrase);\n }\n\n public getSearchResultsCount(): Observable<SearchResultsCount> {\n return this.searchResultsCountSubject.asObservable();\n }\n\n public zoom(value: number): void {\n this.zoomSubject.next(value);\n }\n\n public stepZoom(value: number): void {\n this.stepZoomSubject.next(value);\n }\n\n public getZoomValue(): Observable<number> {\n return this.zoomValueSubject.asObservable();\n }\n\n public getPageCount(): Observable<number> {\n return this.pageCountSubject.asObservable();\n }\n\n public print(): void {\n this.printSubject.next();\n }\n\n public download(): void {\n this.downloadSubject.next();\n }\n\n public setPage(value: number): void {\n this.setCurrentPageSubject.next(value);\n }\n\n public incrementPage(value: number): void {\n this.changePageByDeltaSubject.next(value);\n }\n\n public getCurrentPageNumber(): Observable<number> {\n return this.setCurrentPageInputValueSubject.asObservable();\n }\n\n public getShowCommentSummary(): Observable<boolean> {\n return this.showCommentSummary.asObservable();\n }\n\n public toggleCommentsSummary(value: boolean): void {\n this.showCommentSummary.next(value);\n }\n\n public saveRotation(): void {\n this.saveRotationSubject.next();\n }\n\n public toggleGrabNDrag(): void {\n this.grabNDrag.next(!this.grabNDrag.getValue());\n }\n\n toggleSideBar(toggle: boolean) {\n this.sidebarOpen.next(toggle);\n }\n\n toggleSideBarView(toggle: boolean) {\n this.sidebarOutlineView.next(toggle);\n }\n\n public toggleRedactionMode(): void {\n if (this.redactionMode.getValue() === false) {\n this.drawModeSubject.next(false);\n this.grabNDrag.next(false);\n this.redactionMode.next(true);\n } else {\n this.redactionMode.next(false);\n }\n this.openRedactionSearch.next(false);\n }\n\n public toggleRedactionPreview(viewMode: boolean): void {\n this.redactionPreview.next(viewMode);\n }\n\n public unmarkAll(): void {\n this.clearAllRedactMarkers.next();\n }\n\n public applyRedactionToDocument(): void {\n this.applyRedactToDocument.next();\n }\n\n public redactPage(): void {\n this.redactWholePage.next();\n }\n\n public toggleCommentsPanel(isVisible: boolean) {\n if (isVisible) {\n this.toggleParticipantsList(!isVisible);\n }\n this.commentsPanelVisible.next(isVisible);\n }\n\n public toggleParticipantsList(isVisible: boolean) {\n if (isVisible) {\n this.toggleCommentsPanel(!isVisible);\n }\n this.icp.participantsListVisible.next(isVisible);\n }\n}\n","import * as pdfjsViewer from 'pdfjs-dist/web/pdf_viewer';\nimport { ElementRef, Injectable } from '@angular/core';\nimport {DocumentLoadProgress, PageEvent, PdfJsWrapper} from './pdf-js-wrapper';\nimport { Subject } from 'rxjs';\nimport { ToolbarEventService } from '../../../toolbar/toolbar-event.service';\nimport { Outline } from '../side-bar/outline-item/outline.model';\nimport { PdfPosition } from '../../../store/reducers/document.reducer';\n\n@Injectable({providedIn: 'root'})\nexport class PdfJsWrapperFactory {\n\n private linkService: pdfjsViewer.PDFLinkService;\n private eventBus: pdfjsViewer.EventBus;\n private pdfJsWrapper: PdfJsWrapper;\n\n constructor(private readonly toolbarEvents: ToolbarEventService) {\n this.linkService = new pdfjsViewer.PDFLinkService();\n this.eventBus = new pdfjsViewer.EventBus();\n }\n\n public create(container: ElementRef): PdfJsWrapper {\n const pdfFindController = new pdfjsViewer.PDFFindController({\n linkService: this.linkService,\n eventBus: this.eventBus\n });\n\n const pdfViewer = new pdfjsViewer.PDFViewer({\n container: container.nativeElement,\n linkService: this.linkService,\n findController: pdfFindController,\n eventBus: this.eventBus,\n imageResourcesPath: '/assets/images/',\n textLayerMode: 2\n });\n\n this.linkService.setViewer(pdfViewer);\n\n this.pdfJsWrapper = new PdfJsWrapper(\n pdfViewer,\n new pdfjsViewer.DownloadManager({}),\n this.toolbarEvents,\n new Subject<string>(),\n new Subject<DocumentLoadProgress>(),\n new Subject<any>(),\n new Subject<Outline>(),\n new Subject(),\n new Subject<PageEvent[]>(),\n new Subject<{ location: PdfPosition }>()\n );\n\n return this.pdfJsWrapper;\n }\n\n pdfWrapper() {\n return this.pdfJsWrapper;\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PrintService {\n\n printDocumentNatively(url: string): void {\n const printWindow = window.open(url);\n printWindow.focus();\n setTimeout((printer) => {\n printer.print();\n }, 3000, printWindow);\n }\n\n printElementNatively(element: HTMLElement, width: number, height: number): void {\n const printWindow = window.open('', '', `left=0,top=0,width=${width},height=${height},toolbar=0,scrollbars=0,status=0`);\n const documentHead = document.head;\n printWindow.document.body.appendChild(documentHead.cloneNode(true));\n printWindow.document.body.appendChild(element.cloneNode(true));\n printWindow.document.close();\n printWindow.focus();\n printWindow.print();\n printWindow.close();\n }\n}\n","export enum ResponseType {\n SUCCESS = 'SUCCESS',\n FAILURE = 'FAILURE',\n UNSUPPORTED = 'UNSUPPORTED'\n}\n\nexport interface ExceptionDetail {\n httpResponseCode?: string;\n message?: string;\n}\n\nexport class ViewerException {\n exceptionType?: string;\n detail?: ExceptionDetail;\n\n constructor(exceptionType?: string, detail?: ExceptionDetail) {\n this.exceptionType = exceptionType;\n this.detail = detail;\n }\n}\n","import { BehaviorSubject } from 'rxjs';\nimport { Injectable } from '@angular/core';\n\n@Injectable({providedIn: 'root'})\nexport class ToolbarButtonVisibilityService {\n\n public showPrint = false;\n public showDownload = false;\n public showNavigation = false;\n public showZoom = false;\n public showRotate = false;\n public showPresentationMode = false;\n public showRedact = false;\n public showOpenFile = false;\n public showBookmark = false;\n public showHighlightButton = false;\n public showDrawButton = false;\n public showSearchBar = false;\n public showSidebar = false;\n public showCommentSummary = false;\n public showGrabNDragButton = false;\n public showSaveRotationButton = false;\n\n /**\n * Reset the visibility of all buttons to false then set the value from the options\n */\n public setup(options: Partial<ToolbarButtonVisibilityService>): void {\n this.showPrint = false;\n this.showDownload = false;\n this.showNavigation = false;\n this.showZoom = false;\n this.showRotate = false;\n this.showPresentationMode = false;\n this.showRedact = false;\n this.showOpenFile = false;\n this.showBookmark = false;\n this.showHighlightButton = false;\n this.showDrawButton = false;\n this.showSearchBar = false;\n this.showSidebar = false;\n this.showCommentSummary = false;\n this.showGrabNDragButton = false;\n this.showSaveRotationButton = false;\n\n for (const key in options) {\n this[key] = options[key];\n }\n }\n}\n\n/**\n * Default toolbar state for the PDF viewer\n */\nexport const defaultPdfOptions = {\n showPrint: true,\n showDownload: true,\n showNavigation: true,\n showZoom: true,\n showRotate: true,\n showSearchBar: true,\n showSidebar: true,\n showGrabNDragButton: true,\n showCommentSummary: true,\n showPresentationMode: true,\n showRedact: true\n};\n\n/**\n * Default toolbar state for the image viewer\n */\nexport const defaultImageOptions = {\n showPrint: true,\n showDownload: true,\n showZoom: true,\n showRotate: true,\n showGrabNDragButton: true,\n showCommentSummary: true,\n showRedact: true\n};\n\n/**\n * Default toolbar state for multimedia\n */\nexport const defaultMultimediaOptions = {\n showDownload: true\n};\n\n/**\n * Default toolbar state for unsupported media\n */\nexport const defaultUnsupportedOptions = {\n showDownload: true,\n showPrint: true\n};\n","import { Action } from '@ngrx/store';\nimport { PageEvent } from '../../viewers/pdf-viewer/pdf-js/pdf-js-wrapper';\nimport { Rotation } from '../../viewers/rotation-persist/rotation.model';\nimport { PdfPosition } from '../reducers/document.reducer';\n\nexport const SET_DOCUMENT_ID = '[Document] Set Document Id';\nexport const POSITION_UPDATED = '[Document] Position Updated';\nexport const ADD_PAGES = '[Document] Add Pages';\nexport const CONVERT = '[Document] Convert';\nexport const CONVERT_SUCCESS = '[Document] Convert Success';\nexport const CONVERT_FAIL = '[Document] Convert Fail';\nexport const CLEAR_CONVERT_DOC_URL = '[Document] Clear Convert Doc Url';\n\nexport const LOAD_ROTATION = '[Document] Load Rotation';\nexport const LOAD_ROTATION_SUCCESS = '[Document] Load Rotation Success';\nexport const LOAD_ROTATION_FAIL = '[Document] Load Rotation Fail';\nexport const SAVE_ROTATION = '[Document] Save Rotation';\nexport const SAVE_ROTATION_SUCCESS = '[Document] Save Rotation Success';\nexport const SAVE_ROTATION_FAIL = '[Document] Save Rotation Fail';\n\nexport class SetDocumentId implements Action {\n readonly type = SET_DOCUMENT_ID;\n constructor(public payload: string) { }\n}\n\nexport class AddPages implements Action {\n readonly type = ADD_PAGES;\n constructor(public payload: PageEvent[]) { }\n}\n\nexport class PdfPositionUpdate implements Action {\n readonly type = POSITION_UPDATED;\n constructor(public payload: PdfPosition) {}\n}\n\nexport class Convert implements Action {\n readonly type = CONVERT;\n constructor(public payload: string ) {}\n}\n\nexport class ConvertSuccess implements Action {\n readonly type = CONVERT_SUCCESS;\n constructor(public payload: string ) {}\n}\n\nexport class ConvertFailure implements Action {\n readonly type = CONVERT_FAIL;\n constructor(public payload: string) {}\n}\n\nexport class ClearConvertDocUrl implements Action {\n readonly type = CLEAR_CONVERT_DOC_URL;\n}\n\nexport class LoadRotation implements Action {\n readonly type = LOAD_ROTATION;\n constructor(public payload: string) {\n }\n}\n\nexport class LoadRotationSuccess implements Action {\n readonly type = LOAD_ROTATION_SUCCESS;\n constructor(public payload: { rotationAngle: number }) {\n }\n}\n\nexport class LoadRotationFailure implements Action {\n readonly type = LOAD_ROTATION_FAIL;\n constructor(public payload: Error) {\n }\n}\n\nexport class SaveRotation implements Action {\n readonly type = SAVE_ROTATION;\n constructor(public payload: Rotation) {\n }\n}\n\nexport class SaveRotationSuccess implements Action {\n readonly type = SAVE_ROTATION_SUCCESS;\n constructor(public payload: { rotationAngle: number }) {\n }\n}\n\nexport class SaveRotationFailure implements Action {\n readonly type = SAVE_ROTATION_FAIL;\n constructor(public payload: Error) {\n }\n}\n\nexport type DocumentActions =\n | AddPages | SetDocumentId | Convert\n | ConvertSuccess | ConvertFailure | ClearConvertDocUrl\n | PdfPositionUpdate | LoadRotation | LoadRotationSuccess\n | LoadRotationFailure | SaveRotation | SaveRotationSuccess\n | SaveRotationFailure;\n","import { Action } from '@ngrx/store';\nimport {TagsModel} from '../../annotations/models/tags.model';\nexport const UPDATE_TAGS = '[Tags] Update Tags';\nexport const ADD_FILTER_TAGS = '[Tags] Add Filter Tags';\nexport const CLEAR_FILTER_TAGS = '[Tags] Clear Filter Tags';\n\nexport class UpdateTags implements Action {\n readonly type = UPDATE_TAGS;\n constructor(public payload: {tags: TagsModel[]; annoId: string}) {}\n}\n\nexport class AddFilterTags implements Action {\n readonly type = ADD_FILTER_TAGS;\n constructor(public payload: {[id: string]: boolean}) {}\n}\n\nexport class ClearFilterTags implements Action {\n readonly type = CLEAR_FILTER_TAGS;\n}\n\n\nexport type TagsActions =\n | UpdateTags\n | AddFilterTags\n | ClearFilterTags;\n","import { Action } from '@ngrx/store';\nimport { IcpParticipant, IcpSession } from '../../icp/icp.interfaces';\n\nexport const SET_CASE_ID = '[Icp] Set Case Id';\nexport const LOAD_ICP_SESSION = '[Icp] Load Session';\nexport const LOAD_ICP_SESSION_FAIL = '[Icp] Load Session Failure';\nexport const JOIN_ICP_SOCKET_SESSION = '[Icp] Join Socket Session';\nexport const ICP_SOCKET_SESSION_JOINED = '[Icp] Socket Session Joined';\nexport const LEAVE_ICP_SOCKET_SESSION = '[Icp] Leave Socket Session';\nexport const ICP_PRESENTER_UPDATED = '[Icp] Presenter Updated';\nexport const ICP_PARTICIPANT_LIST_UPDATED = '[Icp] Participant List Updated';\n\nexport class SetCaseId implements Action {\n readonly type = SET_CASE_ID;\n constructor(public payload: string) {}\n}\n\nexport class LoadIcpSession implements Action {\n readonly type = LOAD_ICP_SESSION;\n constructor(public payload: string) {}\n}\n\nexport class LoadIcpSessionFailure implements Action {\n readonly type = LOAD_ICP_SESSION_FAIL;\n constructor(public payload: Error) {}\n}\n\nexport class JoinIcpSocketSession implements Action {\n readonly type = JOIN_ICP_SOCKET_SESSION;\n constructor(public payload: { username: string, session: IcpSession }) {}\n}\n\nexport class IcpSocketSessionJoined implements Action {\n readonly type = ICP_SOCKET_SESSION_JOINED;\n constructor(public payload: { session: IcpSession, participantInfo: { client: IcpParticipant, presenter: IcpParticipant } }) {}\n}\n\nexport class LeaveIcpSocketSession implements Action {\n readonly type = LEAVE_ICP_SOCKET_SESSION;\n constructor() {}\n}\n\nexport class IcpPresenterUpdated implements Action {\n readonly type = ICP_PRESENTER_UPDATED;\n constructor(public payload: IcpParticipant) {}\n}\n\nexport class IcpParticipantListUpdated implements Action {\n readonly type = ICP_PARTICIPANT_LIST_UPDATED;\n constructor(public payload: any) {}\n}\n\nexport type IcpActions =\n | SetCaseId\n | LoadIcpSession\n | LoadIcpSessionFailure\n | JoinIcpSocketSession\n | IcpSocketSessionJoined\n | LeaveIcpSocketSession\n | IcpPresenterUpdated\n | IcpParticipantListUpdated;\n","import * as fromActions from '../actions/document.actions';\n\nexport interface DocumentState {\n convertedDocument: {\n url: string;\n error: string;\n };\n documentId: string;\n pdfPosition: PdfPosition;\n pages: {[id: string]: DocumentPages};\n hasDifferentPageSize: boolean;\n rotation: number;\n rotationLoaded: boolean;\n loaded: boolean;\n loading: boolean;\n}\n\nexport interface DocumentPages {\n numberOfPages: number;\n styles: { left: number, height: number, width: number };\n scaleRotation: { scale: string; rotation: string };\n viewportScale: number;\n}\n\nexport interface PdfPosition {\n pageNumber: number;\n scale: number;\n top: number;\n left: number;\n rotation: number;\n}\n\nexport const initialDocumentState: DocumentState = {\n convertedDocument: undefined,\n documentId: undefined,\n pdfPosition: undefined,\n pages: {},\n hasDifferentPageSize: false,\n rotation: undefined,\n rotationLoaded: false,\n loading: false,\n loaded: false\n};\n\nexport function docReducer (state = initialDocumentState,\n action: fromActions.DocumentActions): DocumentState {\n\n switch (action.type) {\n\n case fromActions.CONVERT_SUCCESS: {\n const convertedDocument = {\n url: action.payload,\n error: undefined\n };\n return {\n ...state,\n convertedDocument\n };\n }\n\n case fromActions.CONVERT_FAIL: {\n const convertedDocument = {\n url: undefined,\n error: action.payload\n };\n return {\n ...state,\n convertedDocument\n };\n }\n\n case fromActions.CLEAR_CONVERT_DOC_URL: {\n const convertedDocument = undefined;\n return {\n ...state,\n convertedDocument\n };\n }\n\n case fromActions.LOAD_ROTATION: {\n return {\n ...state,\n rotationLoaded: false\n };\n }\n\n case fromActions.LOAD_ROTATION_SUCCESS: {\n const metadata = action.payload;\n const rotation = metadata ? metadata.rotationAngle : 0;\n return {\n ...state,\n rotation,\n rotationLoaded: true\n };\n }\n\n case fromActions.LOAD_ROTATION_FAIL: {\n return {\n ...state,\n rotation: 0,\n rotationLoaded: true\n };\n }\n\n case fromActions.SAVE_ROTATION_SUCCESS: {\n const metadata = action.payload;\n const rotation = metadata.rotationAngle;\n return {\n ...state,\n rotation\n };\n }\n\n case fromActions.SET_DOCUMENT_ID : {\n return {\n ...state,\n documentId: action.payload\n };\n }\n\n case fromActions.ADD_PAGES: {\n const payload = action.payload;\n let pages = {};\n let pageHeight;\n let pageWidth;\n let hasDifferentPageSize = state.hasDifferentPageSize;\n payload.forEach(page => {\n if (!hasDifferentPageSize && pageHeight && pageWidth &&\n (pageHeight !== page.div['scrollHeight'] || pageWidth !== page.div['scrollWidth'])) {\n hasDifferentPageSize = true;\n } else {\n pageHeight = page.div['scrollHeight'];\n pageWidth = page.div['scrollWidth'];\n }\n const styles = {\n left: page.div['offsetLeft'],\n height: page.div['scrollHeight'],\n width: page.div['scrollWidth']\n };\n\n const scaleRotation = {\n scale: page.scale,\n rotation: page.rotation\n };\n\n const p = {\n styles,\n scaleRotation,\n viewportScale: page.viewportScale\n };\n\n pages = {\n ...pages,\n [page.id]: p\n };\n\n });\n return {\n ...state,\n pages,\n hasDifferentPageSize\n };\n }\n\n case fromActions.POSITION_UPDATED: {\n const pdfPosition = action.payload;\n return {\n ...state,\n pdfPosition\n };\n }\n }\n return state;\n}\nexport const getDocPages = (state: DocumentState) => state.pages;\nexport const getDocId = (state: DocumentState) => state.documentId;\nexport const getPdfPos = (state: DocumentState) => state.pdfPosition;\nexport const getHasDifferentPageSizes = (state: DocumentState) => state.hasDifferentPageSize;\nexport const getRotation = (state: DocumentState) => state.rotation;\nexport const rotationLoaded = (state: DocumentState) => state.rotationLoaded;\nexport const getConvertedDocument = (state: DocumentState) => state.convertedDocument;\n","import { Action } from '@ngrx/store';\nimport { Annotation } from '../../annotations/annotation-set/annotation-view/annotation.model';\nimport { SelectionAnnotation } from '../../annotations/models/event-select.model';\nimport { AnnotationSet } from '../../annotations/annotation-set/annotation-set.model';\nimport { Filters } from '../models/filters.interface';\nimport { Comment } from '../../annotations/comment-set/comment/comment.model';\n\nexport const LOAD_ANNOTATION_SET = '[Annotations] Load Annotation Set';\nexport const LOAD_ANNOTATION_SET_SUCCESS = '[Annotations] Load Annotation Set Success';\nexport const LOAD_ANNOTATION_SET_FAIL = '[Annotations] Load Annotation Set Fail';\n\nexport const SAVE_ANNOTATION = '[Annotations] Save Annotation';\nexport const SAVE_ANNOTATION_SUCCESS = '[Annotations] Save Annotation Success';\nexport const SAVE_ANNOTATION_FAIL = '[Annotations] Save Annotation Fail';\nexport const ADD_OR_EDIT_COMMENT = '[Annotations] Add or Edit Comment';\n\nexport const DELETE_ANNOTATION = '[Annotations] Delete Annotation';\nexport const DELETE_ANNOTATION_SUCCESS = '[Annotations] Delete Annotation Success';\nexport const DELETE_ANNOTATION_FAIL = '[Annotations] Delete Annotation Fail';\n\nexport const SELECT_ANNOTATION = '[Annotations] Select Annotation';\nexport const SEARCH_COMMENT = '[Comments] Search Comments';\nexport const APPLY_COMMENT_SUMMARY_FILTER = '[Comments] Apply Comment Summary Filter';\nexport const CLEAR_COMMENT_SUMMARY_FILTER = '[Comments] Clear Comment Summary Filter';\n\nexport class LoadAnnotationSet implements Action {\n readonly type = LOAD_ANNOTATION_SET;\n constructor(public payload: string) { }\n}\n\nexport class LoadAnnotationSetSucess implements Action {\n readonly type = LOAD_ANNOTATION_SET_SUCCESS;\n constructor(public payload: { status: number, body: AnnotationSet }) { }\n}\n\nexport class LoadAnnotationSetFail implements Action {\n readonly type = LOAD_ANNOTATION_SET_FAIL;\n constructor(public payload: { status: number, body: any }) { }\n}\n\nexport class SaveAnnotation implements Action {\n readonly type = SAVE_ANNOTATION;\n constructor(public payload: Annotation) { }\n}\n\nexport class SaveAnnotationSuccess implements Action {\n readonly type = SAVE_ANNOTATION_SUCCESS;\n constructor(public payload: any) { }\n}\n\nexport class SaveAnnotationFail implements Action {\n readonly type = SAVE_ANNOTATION_FAIL;\n constructor(public payload: Error) { }\n}\n\nexport class AddOrEditComment implements Action {\n readonly type = ADD_OR_EDIT_COMMENT;\n constructor(public payload: Comment) { }\n}\n\nexport class DeleteAnnotation implements Action {\n readonly type = DELETE_ANNOTATION;\n constructor(public payload: string) { }\n}\n\nexport class DeleteAnnotationSuccess implements Action {\n readonly type = DELETE_ANNOTATION_SUCCESS;\n constructor(public payload: string) { }\n}\n\nexport class DeleteAnnotationFail implements Action {\n readonly type = DELETE_ANNOTATION_FAIL;\n constructor(public payload: Error) {}\n}\n\nexport class SelectedAnnotation implements Action {\n readonly type = SELECT_ANNOTATION;\n constructor(public payload: SelectionAnnotation) {}\n}\n\nexport class SearchComment implements Action {\n readonly type = SEARCH_COMMENT;\n constructor(public payload: string) {}\n}\n\nexport class ApplyCommentSymmaryFilter implements Action {\n readonly type = APPLY_COMMENT_SUMMARY_FILTER;\n constructor(public payload: Filters) {}\n}\n\nexport class ClearCommentSummaryFilters implements Action {\n readonly type = CLEAR_COMMENT_SUMMARY_FILTER;\n}\n\nexport type AnnotationsActions =\n | LoadAnnotationSet\n | LoadAnnotationSetSucess\n | LoadAnnotationSetFail\n | SaveAnnotation\n | SaveAnnotationSuccess\n | SaveAnnotationFail\n | AddOrEditComment\n | DeleteAnnotation\n | DeleteAnnotationSuccess\n | DeleteAnnotationFail\n | SelectedAnnotation\n | SearchComment\n | ApplyCommentSymmaryFilter\n | ClearCommentSummaryFilters;\n","import { Annotation } from '../annotations/annotation-set/annotation-view/annotation.model';\nimport moment from 'moment-timezone';\nimport { Redaction } from '../redaction/services/redaction.model';\nimport { Filters } from './models/filters.interface';\nimport { Comment } from '../annotations/comment-set/comment/comment.model';\n\n/*\n @dynamic\n marking class as dynamic to stop compiler throwing error for lambda in static function\n see https://github.com/angular/angular/issues/19698#issuecomment-338340211\n */\nexport class StoreUtils {\n\n static groupByKeyEntities(annotations, key): {[id: string]: any[]} {\n return annotations.reduce((h, obj) =>\n Object.assign(h, { [obj[key]]: ( h[obj[key]] || [] ).concat(obj) }), {});\n }\n\n static generateCommentsEntities(annotations): {[id: string]: Comment} {\n return annotations.reduce(\n (commentEntities: { [id: string]: Annotation }, annotation: Annotation) => {\n if (annotation.comments.length) {\n const comment = {\n ...annotation.comments[0] || '',\n tags: [...annotation.tags || []]\n };\n return {\n ...commentEntities,\n [annotation.id]: comment\n };\n }\n return {\n ...commentEntities\n };\n }, {});\n }\n\n static genTagNameEntities(annotations) {\n const filterAnnoWithoutCommentsTags = annotations.filter(a => (a.comments.length && a.tags.length));\n const allTags = filterAnnoWithoutCommentsTags.map(anno => this.groupByKeyEntities(anno.tags, 'name'));\n const groupedByName = allTags.reduce(\n (tagEntitiy: { [id: string]: Annotation }, tagItem) => {\n return {\n ...tagEntitiy,\n ...tagItem\n };\n }, {});\n\n return this.genNameEnt(annotations, groupedByName);\n }\n\n static genNameEnt(annos, groupedByName) {\n return Object.keys(groupedByName).reduce(\n (tagNameEnt, key) => {\n const readyAnno = annos.filter(anno => anno.tags.find(tag => tag.name === key))\n .map(anno => anno.id)\n .reduce((obj: {[id: string]: string}, anno: string) => ({ ...obj, [anno]: anno }), {});\n\n return {\n ...tagNameEnt,\n [key]: readyAnno\n };\n }, {});\n\n }\n\n static generateAnnotationEntities(anno): {[id: string]: Annotation} {\n return anno.reduce(\n (annoEntities: { [id: string]: Annotation }, annotation: Annotation) => {\n const annot = {\n ...annotation,\n positionTop: annotation.rectangles[0].y // todo remove this\n };\n return {\n ...annoEntities,\n [annotation.id]: annot\n };\n }, {});\n }\n\n static generateRedactionEntities(redactions: Redaction[]): { [id: string]: Redaction } {\n return redactions.reduce(\n (redactEntities: { [id: string]: Redaction }, redaction: Redaction) => {\n return {\n ...redactEntities,\n [redaction.redactionId]: redaction\n };\n }, {});\n }\n\n static resetCommentEntSelect(ent: { [id: string]: Comment }) {\n return Object.keys(ent).reduce((object, key) => {\n object[key] = {\n ...ent[key],\n editable: false,\n selected: false\n };\n return object;\n }, {});\n }\n\n static filterCommentsSummary(comments: Array<Comment>, filters: Filters) {\n if (Object.keys(filters).length) {\n const tagFilterApplied = Object.keys(filters.tagFilters)\n .filter(key => filters.tagFilters[key] === true).length;\n const dateFilterApplied = (filters.dateRangeFrom || filters.dateRangeTo);\n const filteredComments = comments.filter(comment => {\n let hasTagFilter = false;\n let hasDateFilter = false;\n // check tags\n if (filters.hasOwnProperty('tagFilters')) {\n Object.keys(filters.tagFilters).forEach(filter => {\n const label = filters.tagFilters[filter];\n if (label) {\n return comment.tags.forEach(tag => {\n if (tag.name === filter && !hasTagFilter) {\n hasTagFilter = true;\n }\n });\n }});\n }\n // check for dates\n if (dateFilterApplied) {\n const commentDate = moment(comment.lastModifiedDate);\n const dateFrom = filters.dateRangeFrom !== null ? moment(filters.dateRangeFrom) : undefined;\n const dateTo = filters.dateRangeTo !== null ? moment(filters.dateRangeTo) : undefined;\n\n if (dateTo && dateFrom) {\n if (commentDate > dateFrom && commentDate < dateTo) {\n hasDateFilter = true;\n }\n }\n if (dateTo && !dateFrom) {\n if (commentDate <= dateTo) {\n hasDateFilter = true;\n }\n }\n if (dateFrom && !dateTo) {\n if (commentDate > dateFrom) {\n hasDateFilter = true;\n }\n }\n }\n\n return (hasTagFilter || hasDateFilter);\n });\n return (tagFilterApplied || dateFilterApplied) ? filteredComments : comments;\n } else {\n return comments;\n }\n }\n}\n","import uuid from 'uuid/v4';\nimport * as fromAnnotations from '../actions/annotation.actions';\nimport { Annotation } from '../../annotations/annotation-set/annotation-view/annotation.model';\nimport { Comment } from '../../annotations/comment-set/comment/comment.model';\nimport { StoreUtils } from '../store-utils';\nimport { SelectionAnnotation } from '../../annotations/models/event-select.model';\nimport { Filters } from '../models/filters.interface';\n\nexport interface AnnotationSetState {\n annotationSet: any;\n annotationEntities: {[id: string]: any};\n annotationPageEntities: {[id: string]: Annotation[]};\n commentEntities: {[id: string]: Comment};\n selectedAnnotation: SelectionAnnotation;\n commentSearchQueries: { commentSearch: string };\n commentSummaryFilters: {hasFilter: boolean; filters: Filters};\n loaded: boolean;\n loading: boolean;\n}\n\nexport const initialState: AnnotationSetState = {\n annotationSet: {},\n annotationEntities: {},\n commentEntities: {},\n annotationPageEntities: {},\n selectedAnnotation: null,\n commentSearchQueries: {commentSearch: ''},\n commentSummaryFilters: {hasFilter: false, filters: {}},\n loading: false,\n loaded: false,\n};\n\nexport function reducer (\n state = initialState,\n action: fromAnnotations.AnnotationsActions\n): AnnotationSetState {\n switch (action.type) {\n\n case fromAnnotations.LOAD_ANNOTATION_SET: {\n const annotationSet = {\n ...state.annotationSet,\n documentId: action.payload\n };\n return {\n ...initialState,\n annotationSet,\n loading: true\n };\n }\n case fromAnnotations.LOAD_ANNOTATION_SET_SUCCESS:\n case fromAnnotations.LOAD_ANNOTATION_SET_FAIL: {\n const annotationSet = action.payload.status === 200 ? action.payload.body :\n {\n ...state.annotationSet,\n annotations: [],\n id: uuid()\n };\n const annotationEntities = StoreUtils.generateAnnotationEntities(annotationSet.annotations);\n const annotationPageEntities = StoreUtils.groupByKeyEntities(annotationSet.annotations, 'page');\n const commentEntities = StoreUtils.generateCommentsEntities(annotationSet.annotations);\n return {\n ...state,\n annotationSet,\n annotationEntities,\n annotationPageEntities,\n commentEntities,\n loading: false,\n loaded: true\n };\n }\n\n case fromAnnotations.SAVE_ANNOTATION_SUCCESS: {\n const anno = action.payload;\n const annEntities = {\n ...state.annotationEntities,\n [anno.id]: anno\n };\n const annotArray = Object.keys(annEntities).map(key => annEntities[key]);\n const annotationEntities = StoreUtils.generateAnnotationEntities(annotArray);\n const annotationPageEntities = StoreUtils.groupByKeyEntities(annotArray, 'page');\n const commentEntities = StoreUtils.generateCommentsEntities(annotArray);\n const selectedAnnotation = {\n ...state.selectedAnnotation,\n annotationId : anno.id,\n editable: false\n };\n return {\n ...state,\n annotationEntities,\n annotationPageEntities,\n commentEntities,\n selectedAnnotation,\n loading: false,\n loaded: true\n };\n }\n\n case fromAnnotations.DELETE_ANNOTATION_SUCCESS: {\n const id = action.payload;\n const page = state.annotationEntities[id].page;\n const annotationEntities = {\n ...state.annotationEntities\n };\n delete annotationEntities[id];\n const pageAnnotationsRemoved = [\n ...state.annotationPageEntities[page].filter(anno => anno.id !== id)\n ];\n const annotationPageEntities = {\n ...state.annotationPageEntities,\n [page]: pageAnnotationsRemoved\n };\n const commentEntities = {\n ...state.commentEntities\n };\n if (state.commentEntities[id]) {\n delete commentEntities[id];\n }\n return {\n ...state,\n annotationEntities,\n annotationPageEntities,\n commentEntities\n };\n }\n\n case fromAnnotations.ADD_OR_EDIT_COMMENT: {\n const comment = {\n [action.payload.annotationId]: action.payload\n };\n const comments = {\n ...state.commentEntities,\n ...comment\n };\n return {\n ...state,\n commentEntities: comments\n };\n }\n\n case fromAnnotations.SELECT_ANNOTATION: {\n const payload = action.payload;\n const commentEntity = {\n ...state.commentEntities[payload.annotationId],\n editable: payload.editable,\n selected: payload.selected\n };\n\n const resetCommentEntSelect = StoreUtils.resetCommentEntSelect({...state.commentEntities});\n\n const commentEntities = payload.annotationId && state.commentEntities[payload.annotationId] ? {\n ...resetCommentEntSelect,\n [payload.annotationId]: commentEntity\n } : {...resetCommentEntSelect};\n\n return {\n ...state,\n commentEntities,\n selectedAnnotation: action.payload\n };\n }\n\n case fromAnnotations.SEARCH_COMMENT: {\n const commentSearchQueries = {\n ...state.commentSearchQueries,\n commentSearch: action.payload\n };\n\n const commentEntities = StoreUtils.resetCommentEntSelect({...state.commentEntities});\n return {\n ...state,\n commentEntities,\n commentSearchQueries\n };\n }\n\n case fromAnnotations.APPLY_COMMENT_SUMMARY_FILTER: {\n const payload = action.payload;\n const hasTagFilter = () => {\n let isFiltered = false;\n if (payload.tagFilters) {\n Object.keys(payload.tagFilters).map(filter => {\n if (payload.tagFilters[filter] && !isFiltered) {\n isFiltered = true;\n }\n });\n }\n return isFiltered;\n };\n const hasFilter = (hasTagFilter() || !!payload.dateRangeFrom || !!payload.dateRangeTo);\n const commentSummaryFilters = {\n hasFilter,\n filters: payload\n };\n return {\n ...state,\n commentSummaryFilters: commentSummaryFilters\n };\n }\n\n case fromAnnotations.CLEAR_COMMENT_SUMMARY_FILTER: {\n\n return {\n ...state,\n commentSummaryFilters : {...initialState.commentSummaryFilters}\n };\n }\n }\n\n\n return state;\n}\n\nexport const getAnnoSet = (state: AnnotationSetState) => state.annotationSet;\nexport const getCommentEnts = (state: AnnotationSetState) => state.commentEntities;\nexport const getAnnoPageEnt = (state: AnnotationSetState) => state.annotationPageEntities;\nexport const getAnnoEnt = (state: AnnotationSetState) => state.annotationEntities;\nexport const getSelectedAnno = (state: AnnotationSetState) => state.selectedAnnotation;\nexport const commentSearchQ = (state: AnnotationSetState) => state.commentSearchQueries;\nexport const getSummaryFilters = (state: AnnotationSetState) => state.commentSummaryFilters;\n","import * as fromAnnotations from '../actions/annotation.actions';\nimport * as fromTags from '../actions/tag.actions';\nimport {StoreUtils} from '../store-utils';\nimport {Annotation} from '../../annotations/annotation-set/annotation-view/annotation.model';\n\nexport interface TagsState {\n tagNameEnt: {[id: string]: string[]};\n filteredComments: {[id: string]: string[]};\n filteredPageEntities: {[id: string]: Annotation[]};\n annotations: Annotation[];\n formFilterState: {[id: string]: boolean};\n filters: string[];\n}\n\nexport const initialTagState: TagsState = {\n tagNameEnt: {},\n annotations: [],\n filteredPageEntities: {},\n filteredComments: {},\n formFilterState: {},\n filters: []\n};\n\nexport function tagsReducer (\n state = initialTagState,\n action: fromAnnotations.AnnotationsActions | fromTags.TagsActions\n): TagsState {\n switch (action.type) {\n case fromAnnotations.LOAD_ANNOTATION_SET: {\n\n return {\n ...state,\n ...initialTagState\n };\n }\n case fromAnnotations.LOAD_ANNOTATION_SET_SUCCESS: {\n const annotations = action.payload.body.annotations;\n const tagNameEnt = StoreUtils.genTagNameEntities(annotations);\n return {\n ...state,\n tagNameEnt,\n annotations\n };\n }\n\n case fromAnnotations.SAVE_ANNOTATION_SUCCESS: {\n const payload = action.payload;\n\n const anno = [...state.annotations].filter(a => a.id !== payload.id) || [];\n const annotations = [...anno, payload];\n const tagNameEnt = StoreUtils.genTagNameEntities(annotations);\n return {\n ...state,\n annotations,\n tagNameEnt\n };\n }\n\n case fromAnnotations.DELETE_ANNOTATION_SUCCESS: {\n const id = action.payload;\n const annotations = [...state.annotations].filter(a => a.id !== id);\n const tagNameEnt = StoreUtils.genTagNameEntities(annotations);\n const filteredPageEntities = StoreUtils.groupByKeyEntities(annotations, 'page');\n const filteredComments = {\n ...state.filteredComments\n };\n delete filteredComments[id];\n return {\n ...state,\n annotations,\n tagNameEnt,\n filteredComments,\n filteredPageEntities,\n filters: []\n };\n }\n\n\n case fromTags.ADD_FILTER_TAGS: {\n const formFilterState = action.payload;\n\n const filters = Object.keys(formFilterState).reduce((arr: string[], key: string) => {\n return formFilterState[key] ? [...arr, key] : arr;\n }, []);\n\n const filteredComments = filters.reduce((obj: {[id: string]: any}, f) => {\n return {\n ...obj,\n ...state.tagNameEnt[f]\n };\n }, {});\n\n const annotations = Object.keys(filteredComments).map(key => state.annotations.filter(a => a.id === key)[0]);\n const filteredPageEntities = StoreUtils.groupByKeyEntities(annotations, 'page');\n return {\n ...state,\n filters,\n filteredComments,\n filteredPageEntities,\n };\n }\n\n case fromTags.CLEAR_FILTER_TAGS: {\n return {\n ...state,\n filters: [],\n filteredComments: {},\n filteredPageEntities: {},\n };\n }\n\n }\n\n return state;\n}\n\nexport const getTagNameEnt = (state: TagsState) => state.tagNameEnt;\nexport const getFilters = (state: TagsState) => state.filters;\nexport const getFilteredComments = (state: TagsState) => state.filteredComments;\nexport const getFilteredPageEnt = (state: TagsState) => state.filteredPageEntities;\n","import { Action } from '@ngrx/store';\nimport { Bookmark } from '../../viewers/pdf-viewer/side-bar/bookmarks/bookmarks.interfaces';\n\nexport const LOAD_BOOKMARKS = '[Bookmarks] Load Bookmarks';\nexport const LOAD_BOOKMARKS_SUCCESS = '[Bookmarks] Load Bookmarks Success';\nexport const LOAD_BOOKMARKS_FAIL = '[Bookmarks] Load Bookmarks Failure';\nexport const CREATE_BOOKMARK = '[Bookmarks] Create Bookmark';\nexport const CREATE_BOOKMARK_SUCCESS = '[Bookmarks] Create Bookmark Success';\nexport const CREATE_BOOKMARK_FAIL = '[Bookmarks] Create Bookmark Failure';\nexport const DELETE_BOOKMARK = '[Bookmarks] Delete Bookmark';\nexport const DELETE_BOOKMARK_SUCCESS = '[Bookmarks] Delete Bookmark Success';\nexport const DELETE_BOOKMARK_FAIL = '[Bookmarks] Delete Bookmark Failure';\nexport const MOVE_BOOKMARK = '[Bookmarks] Move Bookmark';\nexport const MOVE_BOOKMARK_SUCCESS = '[Bookmarks] Move Bookmark Success';\nexport const MOVE_BOOKMARK_FAIL = '[Bookmarks] Move Bookmark Failure';\nexport const UPDATE_BOOKMARK = '[Bookmarks] Update Bookmark';\nexport const UPDATE_BOOKMARK_SUCCESS = '[Bookmarks] Update Bookmark Success';\nexport const UPDATE_BOOKMARK_FAIL = '[Bookmarks] Update Bookmark Failure';\n\nexport class LoadBookmarks implements Action {\n readonly type = LOAD_BOOKMARKS;\n constructor() {}\n}\n\nexport class LoadBookmarksSuccess implements Action {\n readonly type = LOAD_BOOKMARKS_SUCCESS;\n constructor(public payload: { body: Bookmark[], status: number}) { }\n}\n\nexport class LoadBookmarksFailure implements Action {\n readonly type = LOAD_BOOKMARKS_FAIL;\n constructor(public payload: { body: any, status: number }) { }\n}\n\nexport class CreateBookmark implements Action {\n readonly type = CREATE_BOOKMARK;\n constructor(public payload: Bookmark) { }\n}\n\nexport class CreateBookmarkSuccess implements Action {\n readonly type = CREATE_BOOKMARK_SUCCESS;\n constructor(public payload: Bookmark) {}\n}\n\nexport class CreateBookmarkFailure implements Action {\n readonly type = CREATE_BOOKMARK_FAIL;\n constructor(public payload: Bookmark) {}\n}\n\nexport class DeleteBookmark implements Action {\n readonly type = DELETE_BOOKMARK;\n constructor(public payload: { deleted: string[], updated: Bookmark }) {}\n}\n\nexport class DeleteBookmarkSuccess implements Action {\n readonly type = DELETE_BOOKMARK_SUCCESS;\n constructor(public payload: string[]) {}\n}\n\nexport class DeleteBookmarkFailure implements Action {\n readonly type = DELETE_BOOKMARK_FAIL;\n constructor(public payload: string) {}\n}\n\nexport class MoveBookmark implements Action {\n readonly type = MOVE_BOOKMARK;\n constructor(public payload: Bookmark[]) {}\n}\n\nexport class MoveBookmarkSuccess implements Action {\n readonly type = MOVE_BOOKMARK_SUCCESS;\n constructor(public payload: Bookmark[]) { }\n}\n\nexport class MoveBookmarkFailure implements Action {\n readonly type = MOVE_BOOKMARK_FAIL;\n constructor(public payload: string) {}\n}\n\nexport class UpdateBookmark implements Action {\n readonly type = UPDATE_BOOKMARK;\n constructor(public payload: Bookmark) {}\n}\n\nexport class UpdateBookmarkSuccess implements Action {\n readonly type = UPDATE_BOOKMARK_SUCCESS;\n constructor(public payload: Bookmark) {}\n}\n\nexport class UpdateBookmarkFailure implements Action {\n readonly type = UPDATE_BOOKMARK_FAIL;\n constructor(public payload: Bookmark) {}\n}\n\n\nexport type BookmarksActions =\n | LoadBookmarks | LoadBookmarksSuccess | LoadBookmarksFailure\n | CreateBookmark | CreateBookmarkSuccess | CreateBookmarkFailure\n | DeleteBookmark | DeleteBookmarkSuccess | DeleteBookmarkFailure\n | UpdateBookmark | UpdateBookmarkSuccess | UpdateBookmarkFailure\n | MoveBookmark | MoveBookmarkSuccess | MoveBookmarkFailure;\n","import { Bookmark } from '../viewers/pdf-viewer/side-bar/bookmarks/bookmarks.interfaces';\n\nexport const getBookmarkChildren = (bookmarks: Bookmark[]) => {\n if (bookmarks) {\n return bookmarks.reduce((childIds, bookmark) => {\n if (bookmark.children && bookmark.children.length > 0) {\n return [...childIds, bookmark.id, ...getBookmarkChildren(bookmark.children)];\n }\n return [...childIds, bookmark.id];\n }, []);\n } else {\n return [];\n }\n};\n\nexport const generateBookmarkEntities = (bookmarks: Bookmark[]): {[id: string]: Bookmark} => {\n return bookmarks.reduce(\n (bookmarkEntities, bookmark) =>\n Object.assign(bookmarkEntities, { [bookmark.id]: bookmark }),\n {});\n};\n\nconst indexEntities = (entities: { [id: string]: Bookmark }) => {\n const entityIds = Object.keys(entities);\n for (let index = 0; entityIds.length > 0; index++) {\n let keysToRemove = [];\n entityIds.forEach(key => {\n if (!entities[key].previous || !entityIds.includes(entities[key].previous.toString())) {\n entities[key].index = index;\n keysToRemove.push(key);\n }\n });\n keysToRemove.forEach(key => entityIds.splice(entityIds.indexOf(key), 1));\n keysToRemove = [];\n }\n};\n\nexport const generateBookmarkNodes = (entities: { [id: string]: Bookmark }) => {\n const bookmarkEntities = JSON.parse(JSON.stringify(entities));\n indexEntities(bookmarkEntities);\n return Object.keys(bookmarkEntities).reduce((nodes, bookmarkId) => {\n const bookmarkEntity = bookmarkEntities[bookmarkId];\n if (bookmarkEntity.parent) {\n const parentEntity = bookmarkEntities[bookmarkEntity.parent];\n if (!parentEntity.children) {\n parentEntity.children = [];\n }\n parentEntity.children[bookmarkEntity.index] = bookmarkEntity;\n } else {\n nodes[bookmarkEntity.index] = bookmarkEntity;\n }\n return nodes;\n }, []);\n};\n","import * as fromBookmarks from '../actions/bookmark.actions';\nimport { Bookmark } from '../../viewers/pdf-viewer/side-bar/bookmarks/bookmarks.interfaces';\nimport { StoreUtils } from '../store-utils';\nimport { generateBookmarkEntities } from '../bookmarks-store-utils';\n\nexport interface BookmarksState {\n bookmarks: Bookmark[];\n bookmarkEntities: { [id: string]: Bookmark };\n bookmarkPageEntities: {[id: string]: any};\n editableBookmark: string;\n loaded: boolean;\n loading: boolean;\n}\n\nexport const initialBookmarksState: BookmarksState = {\n bookmarks: [],\n bookmarkEntities: {},\n bookmarkPageEntities: {},\n editableBookmark: undefined,\n loaded: false,\n loading: false\n};\n\nexport function bookmarksReducer (state = initialBookmarksState,\n action: fromBookmarks.BookmarksActions): BookmarksState {\n\n switch (action.type) {\n\n case fromBookmarks.LOAD_BOOKMARKS: {\n return {\n ...state,\n loading: true\n };\n }\n\n case fromBookmarks.LOAD_BOOKMARKS_SUCCESS:\n case fromBookmarks.LOAD_BOOKMARKS_FAIL: {\n const bookmarks = action.payload.status === 200 ? action.payload.body : [];\n const bookmarkEntities = generateBookmarkEntities(bookmarks);\n const bookmarkPageEntities = StoreUtils.groupByKeyEntities(bookmarks, 'pageNumber');\n\n return {\n ...state,\n bookmarks,\n bookmarkEntities,\n bookmarkPageEntities,\n loaded: true\n };\n }\n\n case fromBookmarks.CREATE_BOOKMARK_SUCCESS: {\n const bookmark: Bookmark = action.payload;\n const bookmarkEntities = {\n ...state.bookmarkEntities,\n [bookmark.id]: bookmark,\n };\n const bookmarkArray = Object.keys(bookmarkEntities).map(key => bookmarkEntities[key]);\n const bookmarkPageEntities = StoreUtils.groupByKeyEntities(bookmarkArray, 'pageNumber');\n const editableBookmark = bookmark.id;\n return {\n ...state,\n bookmarkEntities,\n editableBookmark,\n bookmarkPageEntities,\n loading: false,\n loaded: true\n };\n }\n\n case fromBookmarks.MOVE_BOOKMARK_SUCCESS: {\n const movedBookmarks = generateBookmarkEntities(action.payload);\n const bookmarkEntities = {\n ...state.bookmarkEntities,\n ...movedBookmarks\n };\n return {\n ...state,\n bookmarkEntities,\n loading: false,\n loaded: true\n };\n }\n\n case fromBookmarks.DELETE_BOOKMARK_SUCCESS: {\n const bookmarkIds: string[] = action.payload;\n const bookmarkEntities = { ...state.bookmarkEntities };\n const bookmarkPageEntities = { ...state.bookmarkPageEntities };\n const removeBookmarksByPage: {[pageNumber: number]: string[]} = {};\n bookmarkIds.forEach(bookmarkId => {\n if (removeBookmarksByPage[bookmarkEntities[bookmarkId].pageNumber] !== undefined &&\n removeBookmarksByPage[bookmarkEntities[bookmarkId].pageNumber].length > 0) {\n removeBookmarksByPage[bookmarkEntities[bookmarkId].pageNumber].push(bookmarkId);\n } else {\n removeBookmarksByPage[bookmarkEntities[bookmarkId].pageNumber] = [bookmarkId];\n }\n delete bookmarkEntities[bookmarkId];\n });\n\n Object.entries(removeBookmarksByPage).forEach(\n ([pageNumber, bmrkIds]) => {\n bookmarkPageEntities[pageNumber]\n = bookmarkPageEntities[pageNumber].filter(bookmark => !bmrkIds.includes(bookmark.id));\n }\n );\n\n return {\n ...state,\n bookmarkEntities,\n bookmarkPageEntities,\n loading: false,\n loaded: true\n };\n }\n\n case fromBookmarks.UPDATE_BOOKMARK_SUCCESS: {\n const bookmark: Bookmark = action.payload;\n const bookmarkEntities = {\n ...state.bookmarkEntities,\n [bookmark.id]: { ...bookmark }\n };\n const bookmarkArray = Object.keys(bookmarkEntities).map(key => bookmarkEntities[key]);\n const bookmarkPageEntities = StoreUtils.groupByKeyEntities(bookmarkArray, 'pageNumber');\n const editableBookmark = undefined;\n return {\n ...state,\n bookmarkEntities,\n editableBookmark,\n bookmarkPageEntities,\n loading: false,\n loaded: true\n };\n }\n }\n return state;\n}\n\nexport const getBookmarks = (state: BookmarksState) => state.bookmarks;\nexport const getBookmarkEnts = (state: BookmarksState) => state.bookmarkEntities;\nexport const getBookmarkPageEnt = (state: BookmarksState) => state.bookmarkPageEntities;\nexport const getEditBookmark = (state: BookmarksState) => state.editableBookmark;\n","import { Action } from '@ngrx/store';\nimport { BulkRedaction, Redaction } from '../../redaction/services/redaction.model';\nimport { Annotation } from '../../annotations/annotation-set/annotation-view/annotation.model';\n\nexport const LOAD_REDACTIONS = '[Redaction] Load Redaction';\nexport const LOAD_REDACTION_SUCCESS = '[Redaction] Load Redaction Success';\nexport const LOAD_REDACTION_FAIL = '[Redaction] Load Redaction Fail';\n\nexport const SAVE_REDACTION = '[Redaction] Save Redaction';\nexport const SAVE_REDACTION_SUCCESS = '[Redaction] Save Redaction Success';\nexport const SAVE_REDACTION_FAIL = '[Redaction] Save Redaction Fail';\n\nexport const SAVE_BULK_REDACTION = '[Redaction] Save bulk Redaction';\nexport const SAVE_BULK_REDACTION_SUCCESS = '[Redaction] Save bulk Redaction Success';\nexport const SAVE_BULK_REDACTION_FAIL = '[Redaction] Save bulk Redaction Fail';\n\nexport const DELETE_REDACTION = '[Redaction] Delete Redaction';\nexport const DELETE_REDACTION_SUCCESS = '[Redaction] Delete Redaction Success';\nexport const DELETE_REDACTION_FAIL = '[Redaction] Delete Redaction Fail';\n\nexport const SELECT_REDACTION = '[Redaction] Select Redaction';\n\nexport const REDACT = '[Redaction] Redact';\nexport const REDACT_SUCCESS = '[Redaction] Redact Success';\nexport const REDACT_FAIL = '[Redaction] Redact Fail';\nexport const RESET_REDACTED_DOCUMENT = '[Redaction] Reset Redacted Document';\n\nexport const UNMARK_ALL = '[Redaction] Unmark All';\nexport const UNMARK_ALL_SUCCESS = '[Redaction] Unmark All Success';\n\n\nexport class LoadRedactions implements Action {\n readonly type = LOAD_REDACTIONS;\n constructor(public payload: any) { }\n}\n\nexport class LoadRedactionSuccess implements Action {\n readonly type = LOAD_REDACTION_SUCCESS;\n constructor(public payload: Redaction[]) { }\n}\n\nexport class LoadRedactionFailure implements Action {\n readonly type = LOAD_REDACTION_FAIL;\n constructor(public payload: any) { }\n}\n\nexport class SaveRedaction implements Action {\n readonly type = SAVE_REDACTION;\n constructor(public payload: Redaction) { }\n}\n\nexport class SaveRedactionSuccess implements Action {\n readonly type = SAVE_REDACTION_SUCCESS;\n constructor(public payload: Redaction) { }\n}\n\nexport class SaveRedactionFailure implements Action {\n readonly type = SAVE_REDACTION_FAIL;\n constructor(public payload: any) { }\n}\n\nexport class SaveBulkRedactionFailure implements Action {\n readonly type = SAVE_BULK_REDACTION_FAIL;\n constructor(public payload: any) { }\n}\n\nexport class SaveBulkRedaction implements Action {\n readonly type = SAVE_BULK_REDACTION;\n constructor(public payload: BulkRedaction) { }\n}\n\nexport class SaveBulkRedactionSuccess implements Action {\n readonly type = SAVE_BULK_REDACTION_SUCCESS;\n constructor(public payload: BulkRedaction) { }\n}\n\nexport class DeleteRedaction implements Action {\n readonly type = DELETE_REDACTION;\n constructor(public payload: Annotation) { }\n}\n\nexport class DeleteRedactionSuccess implements Action {\n readonly type = DELETE_REDACTION_SUCCESS;\n constructor(public payload: any) { }\n}\n\nexport class DeleteRedactionFailure implements Action {\n readonly type = DELETE_REDACTION_FAIL;\n constructor(public payload: any) { }\n}\n\nexport class SelectRedaction implements Action {\n readonly type = SELECT_REDACTION;\n constructor(public payload: any) { }\n}\n\nexport class Redact implements Action {\n readonly type = REDACT;\n constructor(public payload: { redactions: Redaction[], documentId: string }) { }\n}\n\nexport class RedactSuccess implements Action {\n readonly type = REDACT_SUCCESS;\n constructor(public payload: { blob: Blob, filename: string }) { }\n}\n\nexport class RedactFailure implements Action {\n readonly type = REDACT_FAIL;\n constructor(public payload: any) { }\n}\n\nexport class ResetRedactedDocument implements Action {\n readonly type = RESET_REDACTED_DOCUMENT;\n}\n\n\nexport class UnmarkAll implements Action {\n readonly type = UNMARK_ALL;\n constructor(public payload: string) { }\n}\n\nexport class UnmarkAllSuccess implements Action {\n readonly type = UNMARK_ALL_SUCCESS;\n}\n\nexport type RedactionActions =\n | LoadRedactions | LoadRedactionSuccess | LoadRedactionFailure\n | SaveRedaction | SaveRedactionSuccess | SaveRedactionFailure\n | DeleteRedaction | DeleteRedactionSuccess | DeleteRedactionFailure\n | SelectRedaction\n | Redact | RedactSuccess | RedactFailure | ResetRedactedDocument\n | UnmarkAll | UnmarkAllSuccess | SaveBulkRedactionSuccess;\n","import { map } from 'rxjs/operators';\nimport * as fromRedaction from '../actions/redaction.actions';\nimport * as fromAnnotations from '../actions/annotation.actions';\nimport { StoreUtils } from '../store-utils';\nimport { SelectionAnnotation } from '../../annotations/models/event-select.model';\nimport { Redaction } from '../../redaction/services/redaction.model'; // todo rename\n\n\nexport interface RedactionState {\n redactionEntities: { [id: string]: Redaction };\n redactionPageEntities: { [id: string]: any };\n selectedRedaction: SelectionAnnotation | {};\n redactedDocumentInfo: { blob: Blob, filename: string };\n documentId: string;\n}\n\nexport const initialRedactionState: RedactionState = {\n redactionEntities: {},\n redactionPageEntities: {},\n selectedRedaction: {},\n redactedDocumentInfo: undefined,\n documentId: undefined\n};\n\nexport function redactionReducer(\n state = initialRedactionState,\n action: fromRedaction.RedactionActions | fromAnnotations.AnnotationsActions\n): RedactionState {\n switch (action.type) {\n\n case fromRedaction.LOAD_REDACTIONS: {\n return {\n ...state,\n ...initialRedactionState\n };\n }\n\n case fromRedaction.LOAD_REDACTION_SUCCESS: {\n const payload = action.payload;\n if (payload) {\n const redactionEntities = StoreUtils.generateRedactionEntities(payload);\n const redactionPageEntities = StoreUtils.groupByKeyEntities(payload, 'page');\n return {\n ...state,\n redactionEntities,\n redactionPageEntities\n };\n }\n return {\n ...state\n };\n }\n\n case fromRedaction.SAVE_REDACTION_SUCCESS: {\n const { payload } = action;\n const redactionEntities = {\n ...state.redactionEntities,\n [payload.redactionId]: payload\n };\n const redactionArray = Object.keys(redactionEntities).map(key => redactionEntities[key]);\n const redactionPageEntities = StoreUtils.groupByKeyEntities(redactionArray, 'page');\n return {\n ...state,\n redactionEntities,\n redactionPageEntities\n };\n }\n case fromRedaction.SAVE_BULK_REDACTION_SUCCESS: {\n const payloadResult = Object.assign({}, ...action.payload.searchRedactions.map((x) => ({ [x.redactionId]: x })));\n const redactionEntities = {\n ...state.redactionEntities,\n ...payloadResult\n };\n const redactionArray = Object.keys(redactionEntities).map(key => redactionEntities[key]);\n const redactionPageEntities = StoreUtils.groupByKeyEntities(redactionArray, 'page');\n return {\n ...state,\n redactionEntities,\n redactionPageEntities\n };\n }\n case fromRedaction.SELECT_REDACTION:\n case fromAnnotations.SELECT_ANNOTATION: {\n return {\n ...state,\n selectedRedaction: action.payload\n };\n }\n\n case fromRedaction.DELETE_REDACTION_SUCCESS: {\n const page = action.payload.page;\n const id = action.payload.redactionId;\n const redactionEntities = {\n ...state.redactionEntities\n };\n delete redactionEntities[id];\n const pageRedactionRemoved = [\n ...state.redactionPageEntities[page].filter(redaction => redaction.redactionId !== id)\n ];\n const redactionPageEntities = {\n ...state.redactionPageEntities,\n [page]: pageRedactionRemoved\n };\n\n return {\n ...state,\n redactionPageEntities,\n redactionEntities,\n };\n }\n\n case fromRedaction.REDACT_SUCCESS: {\n const redactedDocumentInfo = action.payload;\n return {\n ...state,\n ...initialRedactionState,\n redactedDocumentInfo\n };\n }\n\n case fromRedaction.RESET_REDACTED_DOCUMENT: {\n return {\n ...state,\n redactedDocumentInfo: undefined\n };\n }\n\n case fromRedaction.UNMARK_ALL_SUCCESS: {\n return {\n ...state,\n ...initialRedactionState\n };\n }\n }\n\n return state;\n}\n\n\nexport const getRedactionEnt = (state: RedactionState) => state.redactionEntities;\nexport const getPageEnt = (state: RedactionState) => state.redactionPageEntities;\nexport const getSelectedRedaction = (state: RedactionState) => state.selectedRedaction;\nexport const getRedactedDocInfo = (state: RedactionState) => state.redactedDocumentInfo;\n","import * as fromIcpActions from '../actions/icp.actions';\nimport { IcpSession, IcpState } from '../../icp/icp.interfaces';\n\nexport const initialIcpSessionState: IcpState = {\n session: null,\n presenter: null,\n client: null,\n participants: []\n};\n\nexport function icpReducer (state = initialIcpSessionState,\n action: fromIcpActions.IcpActions): IcpState {\n\n switch (action.type) {\n\n case fromIcpActions.SET_CASE_ID: {\n const caseId = action.payload;\n const session = {...state.session, caseId};\n return {\n ...state,\n session\n };\n }\n\n case fromIcpActions.ICP_SOCKET_SESSION_JOINED: {\n const session: IcpSession = action.payload.session;\n const participantInfo = action.payload.participantInfo;\n return {\n ...state,\n session,\n client: participantInfo.client,\n presenter: participantInfo.presenter,\n };\n }\n\n case fromIcpActions.ICP_PARTICIPANT_LIST_UPDATED: {\n const updatedParticipants: any = action.payload;\n const participants = Object.keys(updatedParticipants)\n .map(id => ({ id: id, username: updatedParticipants[id] }));\n return {\n ...state,\n participants\n };\n }\n\n case fromIcpActions.ICP_PRESENTER_UPDATED: {\n const presenter = action.payload;\n return {\n ...state, presenter\n };\n }\n\n case fromIcpActions.LEAVE_ICP_SOCKET_SESSION: {\n return {\n ...state,\n ...initialIcpSessionState\n };\n }\n }\n return state;\n}\n\nexport const getIcpSession = (state: IcpState) => state.session;\nexport const getPresenter = (state: IcpState) => state.presenter;\nexport const getClient = (state: IcpState) => state.client;\nexport const getParticipants = (state: IcpState) => state.participants;\n","export enum IcpEvents {\n SESSION_JOINED = 'IcpClientJoinedSession',\n CLIENT_DISCONNECTED = 'IcpClientDisconnectedFromSession',\n NEW_PARTICIPANT_JOINED = 'IcpNewParticipantJoinedSession',\n REMOVE_PARTICIPANT = 'IcpRemoveParticipantFromList',\n PARTICIPANTS_UPDATED = 'IcpParticipantsListUpdated',\n UPDATE_PRESENTER = 'IcpNewPresenterStartsPresenting',\n PRESENTER_UPDATED = 'IcpPresenterUpdated',\n UPDATE_SCREEN = 'IcpUpdateScreen',\n SCREEN_UPDATED = 'IcpScreenUpdated',\n SESSION_JOIN = 'IcpClientJoinSession',\n SESSION_LEAVE = 'IcpClientLeaveSession',\n}\n","import { ActionReducerMap, createFeatureSelector } from '@ngrx/store';\nimport * as fromDocument from './document.reducer';\nimport * as fromAnnotation from './annotations.reducer';\nimport * as fromTags from './tags.reducer';\nimport * as fromBookmarks from './bookmarks.reducer';\nimport * as fromRedaction from './redaction.reducer';\nimport * as fromIcp from './icp.reducer';\nimport { IcpState } from '../../icp/icp.interfaces';\n\nexport interface State {\n document: fromDocument.DocumentState;\n annotations: fromAnnotation.AnnotationSetState;\n tags: fromTags.TagsState;\n bookmarks: fromBookmarks.BookmarksState;\n redactions: fromRedaction.RedactionState;\n icp: IcpState;\n}\n\nexport const reducers: ActionReducerMap<State> = {\n document: fromDocument.docReducer,\n annotations: fromAnnotation.reducer,\n tags: fromTags.tagsReducer,\n bookmarks: fromBookmarks.bookmarksReducer,\n redactions: fromRedaction.redactionReducer,\n icp: fromIcp.icpReducer,\n};\n\nexport const getMVState = createFeatureSelector<State>('media-viewer');\n\nexport * from './document.reducer';\nexport * from './annotations.reducer';\nexport * from './tags.reducer';\nexport * from './bookmarks.reducer';\nexport * from './redaction.reducer';\nexport * from './icp.reducer';\n","import { createSelector } from '@ngrx/store';\n\nimport * as fromFeature from '../reducers/reducers';\nimport * as fromDocument from '../reducers/document.reducer';\n\nexport const getDocumentState = createSelector(\n fromFeature.getMVState,\n (state: fromFeature.State) => state.document\n);\n\nexport const getPages = createSelector(\n getDocumentState,\n fromDocument.getDocPages\n);\n\nexport const getPageList = createSelector(\n getPages,\n (pages) => Object.values(pages)\n);\n\nexport const getDocumentId = createSelector(\n getDocumentState,\n fromDocument.getDocId\n);\n\nexport const getPdfPosition = createSelector(\n getDocumentState,\n fromDocument.getPdfPos\n);\n\nexport const getPageDifference = createSelector(\n getDocumentState,\n fromDocument.getHasDifferentPageSizes\n);\n\nexport const getConvertedDocument = createSelector(\n getDocumentState,\n fromDocument.getConvertedDocument\n);\n\nexport const getRotation = createSelector(\n getDocumentState,\n fromDocument.getRotation\n);\n\nexport const rotationLoaded = createSelector(\n getDocumentState,\n fromDocument.rotationLoaded\n);\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { Rectangle } from '../annotations/annotation-set/annotation-view/rectangle/rectangle.model';\n\nexport interface Highlight {\n page: number;\n rectangles: Rectangle[];\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ViewerEventService {\n\n public readonly textHighlight = new Subject<Highlight>();\n public readonly boxHighlight = new Subject<Highlight>();\n public readonly ctxToolbarCleared = new Subject();\n public readonly navigationEvent = new Subject<any[]>();\n\n constructor() {}\n\n public textSelected(selectionData: Highlight): void {\n this.textHighlight.next(selectionData);\n }\n\n public boxSelected(selectionData: Highlight): void {\n this.boxHighlight.next(selectionData);\n }\n\n public clearCtxToolbar(): void {\n this.ctxToolbarCleared.next();\n }\n\n\n public goToDestination(destination: any[]) {\n this.navigationEvent.next(destination);\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, from, Observable, of, Subject, Subscription } from 'rxjs';\nimport { IcpEvents } from './icp.events';\nimport { IcpParticipant } from './icp.interfaces';\n\n@Injectable()\nexport class SocketService implements OnDestroy {\n\n private socket: WebSocket;\n subscription: Subscription;\n connected$ = new BehaviorSubject<boolean>(false);\n sessionJoined$ = new Subject();\n presenterUpdated$ = new Subject();\n clientDisconnected$ = new Subject();\n participantUpdated$ = new Subject();\n newParticipantJoined$ = new Subject();\n screenUpdated$ = new Subject();\n\n constructor() { }\n\n ngOnDestroy() {\n this.subscription.unsubscribe();\n }\n\n connect(url: string) {\n return this.getSocketClient(url).subscribe((socket: WebSocket) => {\n\n socket.onopen = (event: Event) => {\n this.connected$.next(true);\n };\n\n socket.onmessage = (event: MessageEvent) => {\n console.log('onmessage');\n const eventData = JSON.parse(event.data);\n if (eventData.data && eventData.data.eventName) {\n this.messageEventHandller(eventData.data.eventName, eventData.data.data);\n }\n };\n\n socket.onerror = (event: Event) => {\n console.log('onerror');\n };\n\n socket.onclose = (event: CloseEvent) => {\n console.log('onclose');\n };\n });\n }\n\n connected(): Observable<boolean> {\n return this.connected$.asObservable();\n }\n\n join(session) {\n this.emit(IcpEvents.SESSION_JOIN, session);\n }\n\n leave(session) {\n this.emit(IcpEvents.SESSION_LEAVE, session);\n this.subscription.unsubscribe();\n }\n\n emit(event: string, data: any) {\n this.socket.send(JSON.stringify({\n type: 'event',\n event,\n data\n }));\n }\n\n listen(event: IcpEvents): Observable<any> {\n switch (event) {\n case IcpEvents.SESSION_JOINED: {\n return this.sessionJoined$.asObservable();\n }\n case IcpEvents.PRESENTER_UPDATED: {\n return this.presenterUpdated$.asObservable();\n }\n case IcpEvents.CLIENT_DISCONNECTED: {\n return this.clientDisconnected$.asObservable();\n }\n case IcpEvents.PARTICIPANTS_UPDATED: {\n return this.participantUpdated$.asObservable();\n }\n case IcpEvents.NEW_PARTICIPANT_JOINED: {\n return this.newParticipantJoined$.asObservable();\n }\n case IcpEvents.SCREEN_UPDATED: {\n return this.screenUpdated$.asObservable();\n }\n default: {\n break;\n }\n }\n }\n\n messageEventHandller(eventName: string, data: any) {\n switch (eventName) {\n case IcpEvents.SESSION_JOINED: {\n this.sessionJoined$.next(data);\n break;\n }\n case IcpEvents.PRESENTER_UPDATED: {\n this.presenterUpdated$.next(data);\n break;\n }\n case IcpEvents.CLIENT_DISCONNECTED: {\n this.clientDisconnected$.next();\n break;\n }\n case IcpEvents.PARTICIPANTS_UPDATED: {\n this.participantUpdated$.next(data);\n break;\n }\n case IcpEvents.NEW_PARTICIPANT_JOINED: {\n this.newParticipantJoined$.next();\n break;\n }\n case IcpEvents.SCREEN_UPDATED: {\n this.screenUpdated$.next(data);\n break;\n }\n }\n }\n\n getSocketClient(url: string): Observable<WebSocket> {\n this.socket = new WebSocket(url, 'json.webpubsub.azure.v1');\n return of(this.socket);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { SocketService } from './socket.service';\nimport { IcpParticipant, IcpScreenUpdate, IcpSession } from './icp.interfaces';\nimport { IcpEvents } from './icp.events';\n\n@Injectable()\nexport class IcpUpdateService {\n\n session: IcpSession;\n\n constructor(private socket: SocketService) { }\n\n joinSession(username: string, session: IcpSession) {\n this.session = session;\n this.socket.connect(session.connectionUrl);\n this.socket.connected().subscribe(isConnected => {\n if (isConnected) {\n this.socket.join({ ...this.session, username });\n }\n });\n return this.socket.listen(IcpEvents.SESSION_JOINED);\n }\n\n leaveSession() {\n this.socket.leave(this.session);\n }\n\n newParticipantJoined() {\n return this.socket.listen(IcpEvents.NEW_PARTICIPANT_JOINED);\n }\n\n clientDisconnected() {\n return this.socket.listen(IcpEvents.CLIENT_DISCONNECTED);\n }\n\n removeParticipant(participantId) {\n this.socket.emit(IcpEvents.REMOVE_PARTICIPANT, {\n participantId: participantId, caseId: this.session.caseId\n });\n }\n\n participantListUpdated() {\n return this.socket.listen(IcpEvents.PARTICIPANTS_UPDATED);\n }\n\n updatePresenter(presenter: IcpParticipant) {\n this.socket.emit(IcpEvents.UPDATE_PRESENTER, {\n ...this.session, presenterId: presenter.id, presenterName: presenter.username\n });\n }\n\n presenterUpdated() {\n return this.socket.listen(IcpEvents.PRESENTER_UPDATED);\n }\n\n updateScreen(screen: IcpScreenUpdate) {\n const update = { body: screen, caseId: this.session.caseId };\n this.socket.emit(IcpEvents.UPDATE_SCREEN, update);\n }\n\n screenUpdated() {\n return this.socket.listen(IcpEvents.SCREEN_UPDATED);\n }\n}\n","import { createSelector } from '@ngrx/store';\nimport * as fromFeature from '../reducers/reducers';\nimport * as fromIcp from '../reducers/icp.reducer';\n\nexport const getIcpState = createSelector(\n fromFeature.getMVState,\n (state: fromFeature.State) => state.icp\n);\n\nexport const getIcpSession = createSelector(\n getIcpState,\n fromIcp.getIcpSession\n);\n\nexport const getCaseId = createSelector(\n getIcpSession,\n session => session === null ? null : session.caseId\n);\n\nexport const getPresenter = createSelector(\n getIcpState,\n fromIcp.getPresenter\n);\n\nexport const getPresenterName = createSelector(\n getPresenter,\n presenter => presenter === null ? null : presenter.username\n);\n\nexport const getClient = createSelector(\n getIcpState,\n fromIcp.getClient\n);\n\nexport const isPresenter = createSelector(\n getPresenter,\n getClient,\n (presenter, client) => presenter === null ? undefined : presenter.id === client.id // isPresenter is called when = false.\n);\n\nexport const getParticipants = createSelector(\n getIcpState,\n fromIcp.getParticipants\n);\n","import { Injectable } from '@angular/core';\nimport { ToolbarEventService } from '../toolbar/toolbar-event.service';\nimport { select, Store } from '@ngrx/store';\nimport * as fromDocSelectors from '../store/selectors/document.selectors';\nimport { Subscription } from 'rxjs';\nimport { IcpUpdateService } from './icp-update.service';\nimport { IcpState, IcpScreenUpdate, IcpSession, IcpParticipant } from './icp.interfaces';\nimport * as fromIcpSelectors from '../store/selectors/icp.selectors';\nimport { PdfPosition } from '../store/reducers/document.reducer';\n\n@Injectable()\nexport class IcpPresenterService {\n\n session: IcpSession;\n presenter: IcpParticipant;\n pdfPosition: PdfPosition;\n\n $subscription: Subscription;\n\n constructor(private readonly toolbarEvents: ToolbarEventService,\n private readonly socketService: IcpUpdateService,\n private store: Store<IcpState>) {}\n\n update(isPresenter: boolean) {\n if (isPresenter) {\n this.subscribe();\n } else {\n this.unsubscribe();\n }\n }\n\n subscribe() {\n if (!this.$subscription) {\n this.$subscription = this.store.pipe(select(fromDocSelectors.getPdfPosition)).subscribe(pdfPosition => {\n this.pdfPosition = pdfPosition;\n this.onPositionUpdate(pdfPosition);\n });\n this.$subscription.add(this.store.pipe(select(fromIcpSelectors.getPresenter)).subscribe(presenter => {\n this.presenter = presenter;\n }));\n this.$subscription.add(this.socketService.newParticipantJoined().subscribe(() => this.onNewParticipantJoined()));\n }\n }\n\n unsubscribe() {\n if (this.$subscription) {\n this.$subscription.unsubscribe();\n this.$subscription = undefined;\n }\n }\n\n onPositionUpdate(pdfPosition: PdfPosition) {\n const screen: IcpScreenUpdate = { pdfPosition, document: undefined };\n this.socketService.updateScreen(screen);\n }\n\n onNewParticipantJoined() {\n this.onPositionUpdate(this.pdfPosition);\n this.socketService.updatePresenter(this.presenter);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ToolbarEventService } from '../toolbar/toolbar-event.service';\nimport { select, Store } from '@ngrx/store';\nimport { Subscription } from 'rxjs';\nimport { IcpUpdateService } from './icp-update.service';\nimport { ViewerEventService } from '../viewers/viewer-event.service';\nimport { take } from 'rxjs/operators';\nimport { IcpState, IcpSession } from './icp.interfaces';\nimport * as fromDocSelectors from '../store/selectors/document.selectors';\n\n@Injectable()\nexport class IcpFollowerService {\n\n session: IcpSession;\n\n $subscription: Subscription;\n\n constructor(private readonly toolbarEvents: ToolbarEventService,\n private readonly viewerEvents: ViewerEventService,\n private readonly socketService: IcpUpdateService,\n private store: Store<IcpState>) {}\n\n\n update(isFollower: boolean) {\n if (isFollower) {\n this.subscribe();\n } else {\n this.unsubscribe();\n }\n }\n\n subscribe() {\n if (!this.$subscription) {\n this.$subscription = this.socketService.screenUpdated()\n .subscribe(screen => this.followScreenUpdate(screen));\n }\n }\n\n unsubscribe() {\n if (this.$subscription) {\n this.$subscription.unsubscribe();\n this.$subscription = undefined;\n }\n }\n\n followScreenUpdate({ pdfPosition }) {\n if (pdfPosition) {\n this.viewerEvents.goToDestination([\n pdfPosition.pageNumber - 1,\n { 'name': 'XYZ' },\n pdfPosition.left,\n pdfPosition.top\n ]);\n }\n this.store.pipe(select(fromDocSelectors.getPdfPosition), take(1))\n .subscribe(position => {\n const rotationDelta = (pdfPosition.rotation - position.rotation) % 360;\n if (rotationDelta !== 0) {\n this.toolbarEvents.rotate(rotationDelta);\n }\n });\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { IcpParticipant, IcpState } from './icp.interfaces';\nimport { Subscription } from 'rxjs';\nimport { ToolbarEventService } from '../toolbar/toolbar-event.service';\nimport { ViewerEventService } from '../viewers/viewer-event.service';\nimport { IcpUpdateService } from './icp-update.service';\nimport { IcpPresenterService } from './icp-presenter.service';\nimport { IcpFollowerService } from './icp-follower.service';\nimport { select, Store } from '@ngrx/store';\nimport * as fromIcpActions from '../store/actions/icp.actions';\nimport * as fromIcpSelectors from '../store/selectors/icp.selectors';\nimport { filter, take } from 'rxjs/operators';\n\n@Injectable()\nexport class IcpService implements OnDestroy {\n\n caseId: string;\n client: IcpParticipant;\n presenter: IcpParticipant;\n isPresenter: boolean;\n\n subscription: Subscription;\n sessionSubscription: Subscription;\n\n constructor(private readonly toolbarEvents: ToolbarEventService,\n private readonly viewerEvents: ViewerEventService,\n private readonly socketService: IcpUpdateService,\n private readonly presenterSubscriptions: IcpPresenterService,\n private readonly followerSubscriptions: IcpFollowerService,\n private store: Store<IcpState>) {\n this.subscription = this.store.pipe(select(fromIcpSelectors.getCaseId), filter(value => !!value)).subscribe(caseId => {\n this.caseId = caseId;\n });\n this.subscription.add(this.toolbarEvents.icp.sessionLaunch.subscribe(() => {\n if (this.caseId) { this.launchSession(); }\n }));\n }\n\n ngOnDestroy() {\n this.unsubscribeSession();\n this.subscription.unsubscribe();\n }\n\n launchSession() {\n this.store.dispatch(new fromIcpActions.LoadIcpSession(this.caseId));\n this.subscription.add(this.store.pipe(select(fromIcpSelectors.getIcpSession),\n filter(value => !!value && Object.keys(value).length > 1 ),\n take(1)).subscribe(() => { this.setUpSessionSubscriptions(); }));\n }\n\n setUpSessionSubscriptions() {\n this.sessionSubscription = this.toolbarEvents.icp.becomingPresenter.subscribe(() => this.becomePresenter());\n this.sessionSubscription.add(this.toolbarEvents.icp.stoppingPresenting.subscribe(() => this.stopPresenting()));\n this.sessionSubscription.add(this.toolbarEvents.icp.sessionExitConfirmed.subscribe(() => this.leavePresentation()));\n this.sessionSubscription.add(\n this.store.pipe(select(fromIcpSelectors.getPresenter)).subscribe(presenter => this.presenter = presenter )\n );\n this.sessionSubscription.add(this.store.pipe(select(fromIcpSelectors.getClient)).subscribe(client => this.client = client));\n this.sessionSubscription.add(this.store.pipe(select(fromIcpSelectors.isPresenter)).subscribe(isPresenter => {\n this.isPresenter = isPresenter;\n this.presenterSubscriptions.update(isPresenter);\n this.followerSubscriptions.update(!isPresenter);\n }));\n this.sessionSubscription.add(this.socketService.clientDisconnected().subscribe(cli => this.clientDisconnected(cli)));\n this.sessionSubscription.add(this.socketService.presenterUpdated().subscribe(pres => {\n this.store.dispatch(new fromIcpActions.IcpPresenterUpdated(pres));\n }));\n this.sessionSubscription.add(this.socketService.participantListUpdated().subscribe(participants => {\n this.store.dispatch(new fromIcpActions.IcpParticipantListUpdated(participants));\n }));\n }\n\n unsubscribeSession() {\n this.presenterSubscriptions.update(false);\n this.followerSubscriptions.update(false);\n this.sessionSubscription.unsubscribe();\n }\n\n leavePresentation() {\n if (this.isPresenter) {\n this.stopPresenting();\n }\n this.removeParticipant(this.client.id);\n this.socketService.leaveSession();\n this.store.dispatch(new fromIcpActions.LeaveIcpSocketSession());\n this.unsubscribeSession();\n }\n\n stopPresenting() {\n const presenter: IcpParticipant = {username: '', id: ''};\n this.socketService.updatePresenter(presenter);\n }\n\n becomePresenter() {\n this.socketService.updatePresenter(this.client);\n }\n\n clientDisconnected(client) {\n if (client === this.presenter.id) {\n this.stopPresenting();\n }\n this.removeParticipant(client);\n }\n\n removeParticipant(participantId) {\n this.socketService.removeParticipant(participantId);\n }\n}\n","import {\n AfterContentInit,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { asyncScheduler, BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { filter, tap, throttleTime } from 'rxjs/operators';\nimport { select, Store } from '@ngrx/store';\n\nimport { DocumentLoadProgress, PageEvent, PdfJsWrapper } from './pdf-js/pdf-js-wrapper';\nimport { PdfJsWrapperFactory } from './pdf-js/pdf-js-wrapper.provider';\nimport { AnnotationSet } from '../../annotations/annotation-set/annotation-set.model';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\nimport { PrintService } from '../../print.service';\nimport { ResponseType, ViewerException } from '../viewer-exception.model';\nimport { ToolbarButtonVisibilityService } from '../../toolbar/toolbar-button-visibility.service';\nimport { CommentSetComponent } from '../../annotations/comment-set/comment-set.component';\nimport { Outline } from './side-bar/outline-item/outline.model';\nimport * as fromStore from '../../store/reducers/reducers';\nimport * as fromDocumentActions from '../../store/actions/document.actions';\nimport { PdfPositionUpdate } from '../../store/actions/document.actions';\nimport * as fromTagActions from '../../store/actions/tag.actions';\nimport { SetCaseId } from '../../store/actions/icp.actions';\nimport * as fromDocumentsSelector from '../../store/selectors/document.selectors';\nimport { IcpState } from '../../icp/icp.interfaces';\nimport { ViewerEventService } from '../viewer-event.service';\nimport { IcpService } from '../../icp/icp.service';\n\n@Component({\n selector: 'mv-pdf-viewer',\n templateUrl: './pdf-viewer.component.html',\n encapsulation: ViewEncapsulation.None\n})\nexport class PdfViewerComponent implements AfterContentInit, OnChanges, OnDestroy {\n\n @Output() mediaLoadStatus = new EventEmitter<ResponseType>();\n @Output() pdfViewerException = new EventEmitter<ViewerException>();\n @Output() documentTitle = new EventEmitter<string>();\n\n @Input() downloadUrl: string;\n @Input() url: string;\n @Input() downloadFileName: string;\n\n @Input() enableAnnotations: boolean;\n @Input() enableRedactions: boolean;\n @Input() enableICP: boolean;\n @Input() annotationSet: AnnotationSet | null;\n @Input() enableRedactSearch: AnnotationSet | null;\n\n @Input() height: string;\n pageHeights = [];\n rotation = 0;\n zoom = 1;\n\n @Input() caseId: string;\n\n highlightMode: Observable<boolean>;\n drawMode: BehaviorSubject<boolean>;\n\n documentOutline: Outline;\n loadingDocument = false;\n loadingDocumentProgress: number;\n errorMessage: string;\n hasDifferentPageSize = false;\n\n @ViewChild('viewerContainer', {static: true}) viewerContainer: ElementRef<HTMLDivElement>;\n @ViewChild('pdfViewer', {static: false}) pdfViewer: ElementRef<HTMLDivElement>;\n\n private pdfWrapper: PdfJsWrapper;\n private $subscription: Subscription;\n private viewerException: ViewerException;\n showCommentsPanel: boolean;\n showIcpParticipantsList: boolean;\n enableGrabNDrag = false;\n\n constructor(\n private store: Store<fromStore.AnnotationSetState>,\n private icpStore: Store<IcpState>,\n private readonly pdfJsWrapperFactory: PdfJsWrapperFactory,\n private readonly printService: PrintService,\n public readonly toolbarEvents: ToolbarEventService,\n private readonly viewerEvents: ViewerEventService,\n private icpService: IcpService,\n public readonly toolbarButtons: ToolbarButtonVisibilityService,\n ) {\n this.highlightMode = toolbarEvents.highlightModeSubject.pipe(tap(() => {\n this.store.dispatch(new fromTagActions.ClearFilterTags());\n }));\n this.drawMode = toolbarEvents.drawModeSubject;\n }\n\n async ngAfterContentInit(): Promise<void> {\n this.pdfWrapper.documentLoadProgress.subscribe(v => this.onDocumentLoadProgress(v));\n this.pdfWrapper.documentLoaded.subscribe(() => this.onDocumentLoaded());\n this.pdfWrapper.documentLoadFailed.subscribe((error) => this.onDocumentLoadFailed(error));\n this.pdfWrapper.outlineLoaded.subscribe(outline => this.documentOutline = outline);\n this.pdfWrapper.pageRendered.subscribe((event) => this.updatePages(event));\n this.$subscription = this.toolbarEvents.printSubject\n .subscribe(() => this.printService.printDocumentNatively(this.url));\n this.$subscription.add(this.toolbarEvents.downloadSubject.subscribe(() =>\n this.pdfWrapper.downloadFile(this.downloadUrl || this.url, this.downloadFileName)\n ));\n this.$subscription.add(this.toolbarEvents.rotateSubject.subscribe(rotate => this.rotateDocument(rotate)));\n this.$subscription.add(this.toolbarEvents.zoomSubject.subscribe(zoom => this.setZoom(zoom)));\n this.$subscription.add(this.toolbarEvents.stepZoomSubject.subscribe(zoom => this.stepZoom(zoom)));\n this.$subscription.add(this.toolbarEvents.searchSubject.subscribe(search => this.pdfWrapper.search(search)));\n this.$subscription.add(\n this.toolbarEvents.setCurrentPageSubject.subscribe(pageNumber => this.pdfWrapper.setPageNumber(pageNumber))\n );\n this.$subscription.add(\n this.toolbarEvents.changePageByDeltaSubject.subscribe(pageNumber => this.pdfWrapper.changePageNumber(pageNumber))\n );\n this.$subscription.add(this.toolbarEvents.grabNDrag.subscribe(grabNDrag => this.enableGrabNDrag = grabNDrag));\n this.$subscription.add(this.toolbarEvents.commentsPanelVisible.subscribe(toggle => {\n this.showCommentsPanel = toggle;\n })\n );\n this.$subscription.add(this.viewerEvents.navigationEvent.subscribe(dest => this.goToDestination(dest)));\n this.$subscription.add(\n this.toolbarEvents.icp.participantsListVisible.subscribe(toggle => this.showIcpParticipantsList = toggle)\n );\n this.$subscription.add(this.pdfWrapper.positionUpdated.asObservable()\n .pipe(throttleTime(500, asyncScheduler, { leading: true, trailing: true }))\n .subscribe(event => this.store.dispatch(new PdfPositionUpdate(event.location)))\n );\n }\n\n async ngOnChanges(changes: SimpleChanges) {\n if (!this.pdfWrapper) {\n this.pdfWrapper = this.pdfJsWrapperFactory.create(this.viewerContainer);\n }\n if (changes.url && this.pdfWrapper) {\n await this.loadDocument();\n if (this.enableRedactions) {\n this.toolbarEvents.redactionMode.pipe(filter(value => !!value))\n .subscribe(() => this.resetRotation());\n }\n }\n if (changes.caseId) {\n this.icpStore.dispatch(new SetCaseId(this.caseId));\n }\n }\n\n resetRotation() {\n if (this.hasDifferentPageSize) {\n this.pdfWrapper.resetRotation(0);\n this.rotation = 0;\n }\n }\n\n ngOnDestroy(): void {\n this.$subscription.unsubscribe();\n }\n\n private async loadDocument() {\n this.initDocumentProgress();\n await this.pdfWrapper.loadDocument(this.url);\n this.documentTitle.emit(this.pdfWrapper.getCurrentPDFTitle());\n this.setPageHeights();\n this.$subscription.add(this.store.pipe(select(fromDocumentsSelector.getPageDifference))\n .subscribe(hasDifferentPageSie => this.hasDifferentPageSize = hasDifferentPageSie));\n }\n\n private onDocumentLoadProgress(progress: DocumentLoadProgress) {\n if (progress.total) {\n this.loadingDocumentProgress = Math.min(100, Math.ceil(progress.loaded / progress.total * 100));\n }\n }\n\n private onDocumentLoaded() {\n this.loadingDocument = false;\n this.mediaLoadStatus.emit(ResponseType.SUCCESS);\n }\n\n private onDocumentLoadFailed(error: Error) {\n this.loadingDocument = false;\n this.viewerException = new ViewerException(error.name, { message: error.message });\n this.errorMessage = `Could not load the document \"${this.url}\"`;\n\n this.mediaLoadStatus.emit(ResponseType.FAILURE);\n this.pdfViewerException.emit(this.viewerException);\n }\n\n private updatePages(event: PageEvent[]) {\n if (this.enableAnnotations) {\n this.store.dispatch(new fromDocumentActions.AddPages(event));\n }\n }\n\n @Input()\n set searchBarHidden(hidden: boolean) {\n if (this.pdfWrapper && hidden) {\n this.pdfWrapper.clearSearch();\n }\n }\n\n toggleCommentsSummary() {\n this.toolbarEvents.toggleCommentsSummary(!this.toolbarEvents.showCommentSummary.getValue());\n }\n\n private rotateDocument(rotation: number) {\n const pageNumber = this.pdfWrapper.getPageNumber();\n this.pdfWrapper.rotate(rotation);\n this.pdfWrapper.setPageNumber(pageNumber);\n this.rotation = (this.rotation + rotation) % 360;\n\n this.setPageHeights();\n }\n\n private initDocumentProgress() {\n this.loadingDocument = true;\n this.loadingDocumentProgress = null;\n this.errorMessage = null;\n }\n\n private setZoom(zoomFactor: number) {\n if (!isNaN(zoomFactor)) {\n this.pdfWrapper.setZoom(zoomFactor);\n this.zoom = this.calculateZoomValue(zoomFactor);\n this.setPageHeights();\n }\n }\n\n private stepZoom(zoomFactor: number) {\n if (!isNaN(zoomFactor)) {\n this.pdfWrapper.stepZoom(zoomFactor);\n this.zoom = this.calculateZoomValue(this.zoom, zoomFactor);\n this.setPageHeights();\n }\n }\n\n setPageHeights() {\n this.pageHeights = [];\n const pdfViewerChildren = this.pdfViewer.nativeElement.children;\n for (let i = 0; i < pdfViewerChildren.length; i++) {\n this.pageHeights.push(pdfViewerChildren[i].clientHeight);\n }\n }\n\n calculateZoomValue(zoomValue, increment = 0) {\n const newZoomValue = zoomValue + increment;\n if (newZoomValue > 5) {\n return 5;\n }\n if (newZoomValue < 0.1) {\n return 0.1;\n }\n return +newZoomValue.toFixed(2);\n }\n\n private goToDestination(destination: any[]) {\n this.pdfWrapper.navigateTo(destination);\n }\n\n getCurrentPageNumber(): number {\n return this.pdfWrapper.getPageNumber();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ViewerUtilService {\n constructor(\n private http: HttpClient) {\n }\n\n public validateFile(url: string) {\n return this.http.head(url);\n }\n}\n","import {\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { PrintService } from '../../print.service';\nimport { AnnotationSet } from '../../annotations/annotation-set/annotation-set.model';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\nimport { ResponseType, ViewerException } from '../viewer-exception.model';\nimport { ViewerUtilService } from '../viewer-util.service';\nimport { ToolbarButtonVisibilityService } from '../../toolbar/toolbar-button-visibility.service';\nimport { Store } from '@ngrx/store';\nimport * as fromStore from '../../store/reducers/reducers';\nimport * as fromDocument from '../../store/actions/document.actions';\nimport * as fromAnnotationActions from '../../store/actions/annotation.actions';\nimport { ViewerEventService } from '../viewer-event.service';\n\n@Component({\n selector: 'mv-image-viewer',\n templateUrl: './image-viewer.component.html'\n})\nexport class ImageViewerComponent implements OnInit, OnDestroy, OnChanges {\n\n @Input() url: string;\n @Input() downloadFileName: string;\n\n @Input() enableAnnotations: boolean;\n @Input() annotationSet: AnnotationSet | null;\n\n @Input() height: string;\n\n @Output() mediaLoadStatus = new EventEmitter<ResponseType>();\n @Output() imageViewerException = new EventEmitter<ViewerException>();\n\n errorMessage: string;\n\n @ViewChild('img', {static: false}) img: ElementRef;\n rotation = 0;\n zoom = 1;\n\n private subscriptions: Subscription[] = [];\n private viewerException: ViewerException;\n private response: Subscription;\n\n showCommentsPanel: boolean;\n enableGrabNDrag = false;\n imageHeight: number;\n imageWidth: number;\n imageLeft: number;\n imageTop: number;\n\n constructor(\n private store: Store<fromStore.AnnotationSetState>,\n private readonly printService: PrintService,\n private readonly viewerUtilService: ViewerUtilService,\n public readonly toolbarEvents: ToolbarEventService,\n public readonly toolbarButtons: ToolbarButtonVisibilityService,\n private viewerEvents: ViewerEventService,\n ) { }\n\n ngOnInit(): void {\n this.subscriptions.push(\n this.toolbarEvents.rotateSubject.subscribe(rotation => this.rotateImage(rotation)),\n this.toolbarEvents.zoomSubject.subscribe(zoom => this.setZoom(zoom)),\n this.toolbarEvents.stepZoomSubject.subscribe(zoom => this.stepZoom(zoom)),\n this.toolbarEvents.printSubject.subscribe(() => this.printService.printDocumentNatively(this.url)),\n this.toolbarEvents.downloadSubject.subscribe(() => this.download()),\n this.toolbarEvents.grabNDrag.subscribe(grabNDrag => this.enableGrabNDrag = grabNDrag),\n this.toolbarEvents.commentsPanelVisible.subscribe(toggle => this.showCommentsPanel = toggle)\n );\n }\n\n @HostListener('mousedown', ['$event'])\n onImageViewerClick(event: MouseEvent) {\n const classNme = (event.target as Element).className;\n if (classNme.startsWith('pageContainer')) {\n this.store.dispatch(\n new fromAnnotationActions.SelectedAnnotation({\n annotationId: '',\n selected: false,\n editable: false,\n })\n );\n this.viewerEvents.clearCtxToolbar();\n }\n }\n\n ngOnDestroy(): void {\n this.subscriptions.filter(subscription => !subscription.closed)\n .forEach(subscription => subscription.unsubscribe());\n if (this.response) {\n this.response.unsubscribe();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.url) {\n this.errorMessage = null;\n this.toolbarEvents.reset();\n }\n }\n\n private rotateImage(rotation: number) {\n this.rotation = (this.rotation + rotation) % 360;\n this.initAnnoPage(this.img.nativeElement);\n }\n\n private async setZoom(zoomFactor: number) {\n if (!isNaN(zoomFactor)) {\n await this.setZoomValue(this.calculateZoomValue(zoomFactor));\n this.img.nativeElement.width = this.img.nativeElement.naturalWidth * this.zoom;\n this.initAnnoPage(this.img.nativeElement);\n }\n }\n\n private async stepZoom(zoomFactor: number) {\n if (!isNaN(zoomFactor)) {\n await this.setZoomValue(this.calculateZoomValue(this.zoom, zoomFactor));\n this.img.nativeElement.width = this.img.nativeElement.naturalWidth * this.zoom;\n this.initAnnoPage(this.img.nativeElement);\n }\n }\n\n private download() {\n const a = document.createElement('a');\n document.body.appendChild(a);\n a.setAttribute('style', 'display: none');\n a.href = this.url;\n a.download = this.downloadFileName;\n a.click();\n a.remove();\n }\n\n // the returned promise is a work-around\n setZoomValue(zoomValue) {\n return new Promise((resolve) => {\n this.zoom = zoomValue;\n this.toolbarEvents.zoomValueSubject.next(zoomValue);\n resolve(true);\n });\n }\n\n calculateZoomValue(zoomValue, increment = 0) {\n const newZoomValue = zoomValue + increment;\n if (newZoomValue > 5) { return 5; }\n if (newZoomValue < 0.1) { return 0.1; }\n return +newZoomValue.toFixed(2);\n }\n\n onLoadError(url) {\n this.response = this.viewerUtilService.validateFile(url)\n .subscribe(\n next => next,\n error => {\n this.viewerException = new ViewerException(error.name,\n { httpResponseCode: error.status, message: error.message });\n });\n\n this.errorMessage = `Could not load the image \"${this.url}\"`;\n this.mediaLoadStatus.emit(ResponseType.FAILURE);\n this.imageViewerException.emit(this.viewerException);\n }\n\n onLoad(img: any) {\n this.mediaLoadStatus.emit(ResponseType.SUCCESS);\n this.initAnnoPage(img);\n }\n\n initAnnoPage(img: any) {\n this.imageHeight = this.rotation % 180 !== 0 ? img.offsetWidth : img.offsetHeight;\n this.imageWidth = this.rotation % 180 !== 0 ? img.offsetHeight : img.offsetWidth;\n this.imageLeft = this.rotation % 180 !== 0 ? img.offsetTop : img.offsetLeft;\n this.imageTop = this.rotation % 180 !== 0 ? img.offsetLeft : img.offsetTop;\n const payload: any = [{\n div: {\n scrollHeight: this.imageHeight,\n scrollWidth: this.imageWidth,\n offsetLeft: this.imageLeft,\n },\n pageNumber: 1,\n scale: this.zoom,\n rotation: this.rotation,\n id: 1\n }];\n\n this.store.dispatch(new fromDocument.AddPages(payload));\n }\n\n toggleCommentsSummary() {\n this.toolbarEvents.toggleCommentsSummary(!this.toolbarEvents.showCommentSummary.getValue());\n }\n}\n","import { Component, ElementRef, Input, OnInit, ViewChild, OnDestroy, Output, EventEmitter } from '@angular/core';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\nimport { Subscription } from 'rxjs';\nimport { ResponseType, ViewerException } from '../viewer-exception.model';\nimport { ViewerUtilService } from '../viewer-util.service';\n\n@Component({\n selector: 'mv-unsupported-viewer',\n templateUrl: './unsupported-viewer.component.html'\n})\nexport class UnsupportedViewerComponent implements OnInit, OnDestroy {\n\n @Input() url: string;\n @Input() downloadFileName: string;\n @Input() typeException: boolean;\n\n @Output() loadStatus = new EventEmitter<ResponseType>();\n @Output() unsupportedViewerException = new EventEmitter<ViewerException>();\n\n @ViewChild('downloadLink', {static: false}) downloadLink: ElementRef;\n\n private subscriptions: Subscription[] = [];\n private viewerException: ViewerException;\n\n constructor(\n public readonly toolbarEvents: ToolbarEventService,\n private readonly viewerUtilService: ViewerUtilService,\n ) {}\n\n public ngOnInit(): void {\n this.subscriptions.push(\n this.toolbarEvents.downloadSubject.subscribe(() => this.downloadLink.nativeElement.click()),\n this.viewerUtilService.validateFile(this.url).subscribe(\n next => next,\n error => {\n this.viewerException = new ViewerException(error.name,\n { httpResponseCode: error.status, message: error.message });\n }\n )\n );\n\n this.loadStatus.emit(ResponseType.UNSUPPORTED);\n\n if (!this.typeException) {\n this.unsupportedViewerException.emit(this.viewerException);\n }\n }\n\n ngOnDestroy(): void {\n for (const subscription of this.subscriptions) {\n subscription.unsubscribe();\n }\n }\n\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\n\nimport { AnnotationSet } from '../../annotation-set/annotation-set.model';\nimport { Annotation } from '../../annotation-set/annotation-view/annotation.model';\nimport { Comment } from '../../comment-set/comment/comment.model';\n\n@Injectable()\nexport class AnnotationApiService {\n\n public annotationApiUrl = '/em-anno';\n\n private annotationSetBaseUrl = '/annotation-sets';\n private annotationBaseUrl = '/annotations';\n\n constructor(\n private readonly httpClient: HttpClient\n ) {}\n\n public getAnnotationSet(documentId: string): Observable<any> { // todo add model\n const fixedUrl = `${this.annotationSetsFullUrl}/filter?documentId=${documentId}`;\n return this.httpClient\n .get<AnnotationSet>(fixedUrl, { observe: 'response' , withCredentials: true });\n }\n\n public postAnnotationSet(body: Partial<AnnotationSet>): Observable<AnnotationSet> {\n return this.httpClient\n .post<AnnotationSet>(this.annotationSetsFullUrl, body, { observe: 'response' , withCredentials: true })\n .pipe(\n map(response => response.body),\n catchError(() => [])\n );\n }\n\n public getComments(annotationSet: Observable<AnnotationSet>): Observable<Comment[]> {\n return annotationSet\n .pipe(\n map(this.sortAnnotations),\n map(this.extractComments)\n );\n }\n\n /**\n * Sort the annotations in the response by page and then y position of their first rectangle\n */\n private sortAnnotations(r: AnnotationSet): Annotation[] {\n return r.annotations.sort((a, b) => a.page !== b.page ? a.page - b.page : a.rectangles[0].y - b.rectangles[0].y);\n }\n\n private extractComments(annotations: Annotation[]) {\n return [].concat(...annotations.map(a => a.comments));\n }\n\n public deleteAnnotation(annotationId: string): Observable<null> {\n const url = `${this.annotationFullsUrl}/${annotationId}`;\n\n return this.httpClient\n .delete<null>(url, { observe: 'response' , withCredentials: true })\n .pipe(map(response => response.body));\n }\n\n public postAnnotation(annotation: Partial<Annotation>): Observable<Annotation> {\n return this.httpClient\n .post<Annotation>(this.annotationFullsUrl, annotation, { observe: 'response' , withCredentials: true })\n .pipe(map(response => response.body));\n }\n\n get annotationSetsFullUrl() {\n return this.annotationApiUrl + this.annotationSetBaseUrl;\n }\n\n get annotationFullsUrl() {\n return this.annotationApiUrl + this.annotationBaseUrl;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { CommentSetComponent } from '../comment-set.component';\nimport { Annotation } from '../../annotation-set/annotation-view/annotation.model';\nimport { CommentComponent } from './comment.component';\n\n// TODO: replace by NgRx\n@Injectable()\nexport class CommentService {\n\n public readonly unsavedChanges = new Subject<boolean>();\n public readonly marginToCommentEmitter = new BehaviorSubject<boolean>(false);\n commentSetComponent: CommentSetComponent;\n\n setCommentSet(commentSetComponent) {\n this.commentSetComponent = commentSetComponent;\n }\n\n onCommentChange(changes: boolean): void {\n this.unsavedChanges.next(changes);\n }\n\n getUnsavedChanges(): Observable<boolean> {\n return this.unsavedChanges.asObservable();\n }\n\n hasUnsavedComments(annotation: Annotation): boolean {\n if (annotation.comments.length > 0) {\n const comment = this.getComment(annotation);\n return comment.hasUnsavedChanges;\n }\n return false;\n }\n\n updateUnsavedCommentsStatus(annotation: Annotation, hasUnsavedChanges: boolean): void {\n const comment = this.getComment(annotation);\n comment.hasUnsavedChanges = hasUnsavedChanges;\n this.allCommentsSaved();\n }\n\n getComment(annotation: Annotation): CommentComponent {\n return this.commentSetComponent.commentComponents\n .find(c => c.comment.annotationId === annotation.comments[0].annotationId);\n }\n\n resetCommentSet(): void {\n this.commentSetComponent = null;\n }\n\n allCommentsSaved(): void {\n this.onCommentChange(this.commentSetComponent.commentComponents.some(comment => comment.hasUnsavedChanges === true));\n }\n\n createMarginToCommentEvent(margin: boolean) {\n this.marginToCommentEmitter.next(margin);\n }\n}\n","import {createSelector} from '@ngrx/store';\nimport * as fromFeature from '../reducers/reducers';\nimport * as fromTags from '../reducers/tags.reducer';\n\nexport const getTagsRootState = createSelector(\n fromFeature.getMVState,\n (state: fromFeature.State) => state.tags\n);\n\nexport const getTagEntities = createSelector(\n getTagsRootState,\n fromTags.getTagNameEnt\n);\n\nexport const getTagFilters = createSelector(\n getTagsRootState,\n fromTags.getFilters\n);\n\nexport const getTagFiltered = createSelector(\n getTagsRootState,\n fromTags.getFilteredComments\n);\n\nexport const getFilteredPageEntities = createSelector(\n getTagsRootState,\n fromTags.getFilteredPageEnt\n);\n\nexport const getAllTagsArr = createSelector(\n getTagEntities,\n (tagEnt) => Object.keys(tagEnt).map(key => {\n return {\n key,\n length: Object.keys(tagEnt[key]).length\n };\n })\n);\n","import {\n AfterContentInit, AfterViewChecked,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport {\n defaultImageOptions, defaultMultimediaOptions,\n defaultPdfOptions,\n defaultUnsupportedOptions,\n ToolbarButtonVisibilityService\n} from './toolbar/toolbar-button-visibility.service';\nimport { AnnotationSet } from './annotations/annotation-set/annotation-set.model';\nimport { ToolbarEventService } from './toolbar/toolbar-event.service';\nimport { AnnotationApiService } from './annotations/services/annotation-api/annotation-api.service';\nimport { ResponseType, ViewerException } from './viewers/viewer-exception.model';\nimport { CommentService } from './annotations/comment-set/comment/comment.service';\nimport 'hammerjs';\nimport { select, Store } from '@ngrx/store';\nimport * as fromStore from './store/reducers/reducers';\nimport * as fromAnnoSelectors from './store/selectors/annotation.selectors';\nimport * as fromDocumentsSelector from './store/selectors/document.selectors';\nimport * as fromAnnoActions from './store/actions/annotation.actions';\nimport * as fromRedactActions from './store/actions/redaction.actions';\nimport * as fromDocumentActions from './store/actions/document.actions';\n\nenum CoreContentTypes {\n PDF = 'pdf',\n IMAGE = 'image'\n}\n\nenum MultimediaContentTypes {\n MP4 = 'mp4',\n MP3 = 'mp3',\n}\n\nenum ConvertibleContentTypes {\n EXCEL = 'excel',\n WORD = 'word',\n POWERPOINT = 'powerpoint',\n TXT = 'txt',\n RTF = 'rtf'\n}\n\n@Component({\n selector: 'mv-media-viewer',\n templateUrl: './media-viewer.component.html',\n encapsulation: ViewEncapsulation.None\n})\nexport class MediaViewerComponent implements OnChanges, OnDestroy, AfterContentInit, AfterViewChecked {\n\n @ViewChild('viewerRef', {static: false}) viewerRef: ElementRef;\n\n @Input() url;\n @Input() downloadFileName: string;\n @Input() contentType: string;\n\n @Input() showToolbar = true;\n @Input() toolbarButtonOverrides: any = {};\n\n @Input()\n public height: string;\n public viewerHeight: string;\n\n @Input() width = '100%';\n\n @Output() mediaLoadStatus = new EventEmitter<ResponseType>();\n @Output() viewerException = new EventEmitter<ViewerException>();\n @Output() toolbarEventsOutput = new EventEmitter<ToolbarEventService>();\n @Output() unsavedChanges = new EventEmitter<boolean>();\n\n @Input() enableAnnotations = false;\n @Input() annotationApiUrl;\n\n @Input() enableRedactions = false;\n @Input() enableICP = false;\n @Input() multimediaPlayerEnabled = false;\n @Input() enableRedactSearch = false;\n\n\n @Input() caseId: string;\n\n multimediaContent = false;\n convertibleContent = false;\n unsupportedContent = false;\n\n documentTitle: string;\n showCommentSummary: boolean;\n annotationSet$: Observable<AnnotationSet | {}>;\n hasScrollBar: boolean;\n typeException = false;\n hasDifferentPageSize$: Observable<boolean>;\n documentId: string;\n\n private $subscriptions: Subscription;\n private prevOffset: number;\n\n constructor(\n private store: Store<fromStore.AnnotationSetState>,\n public readonly toolbarButtons: ToolbarButtonVisibilityService,\n public readonly toolbarEvents: ToolbarEventService,\n private readonly api: AnnotationApiService,\n private readonly commentService: CommentService,\n private elRef: ElementRef,\n private cdr: ChangeDetectorRef\n ) {\n if (this.annotationApiUrl) {\n api.annotationApiUrl = this.annotationApiUrl;\n }\n }\n\n ngAfterContentInit() {\n this.annotationSet$ = this.store.pipe(select(fromAnnoSelectors.getAnnotationSet));\n this.hasDifferentPageSize$ = this.store.pipe(select(fromDocumentsSelector.getPageDifference));\n this.setToolbarButtons();\n this.toolbarEventsOutput.emit(this.toolbarEvents);\n this.$subscriptions = this.commentService.getUnsavedChanges()\n .subscribe(changes => this.onCommentChange(changes));\n this.$subscriptions.add(this.toolbarEvents.getShowCommentSummary()\n .subscribe(changes => this.showCommentSummary = changes));\n }\n\n ngAfterViewChecked(): void {\n if (this.height && this.viewerHeight !== this.height) {\n this.viewerHeight = this.height;\n this.cdr.detectChanges();\n return;\n }\n\n if (!this.height) {\n const compOffsetTop = this.elRef.nativeElement.getBoundingClientRect().top;\n const viewerOffsetTop = this.viewerRef.nativeElement.offsetTop;\n const offset = compOffsetTop + viewerOffsetTop;\n\n if (this.prevOffset !== offset) {\n this.viewerHeight = `calc(100vh - ${offset}px)`;\n this.prevOffset = offset;\n this.cdr.detectChanges();\n }\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.annotationApiUrl) {\n this.api.annotationApiUrl = this.annotationApiUrl;\n }\n\n if (changes.url) {\n this.toolbarEvents.reset();\n this.commentService.resetCommentSet();\n this.documentId = this.extractDMStoreDocId(this.url);\n this.store.dispatch(new fromDocumentActions.SetDocumentId(this.documentId));\n if (this.enableAnnotations && !(this.multimediaContent || this.unsupportedContent)) {\n this.store.dispatch(new fromAnnoActions.LoadAnnotationSet(this.documentId));\n }\n if (this.enableRedactions && !(this.multimediaContent || this.unsupportedContent) && this.documentId) {\n this.store.dispatch(new fromRedactActions.LoadRedactions(this.documentId));\n }\n if (this.contentType === 'image') {\n this.documentTitle = null;\n }\n }\n\n if (changes.contentType) {\n this.convertibleContent = this.needsConverting();\n this.multimediaContent = this.isMultimedia();\n this.unsupportedContent = !this.isSupported();\n }\n\n this.setToolbarButtons();\n this.detectOs();\n this.typeException = false;\n }\n\n ngOnDestroy() {\n this.$subscriptions.unsubscribe();\n }\n\n needsConverting(): boolean {\n return this.contentType !== null && Object.keys(ConvertibleContentTypes).includes(this.contentType.toUpperCase());\n }\n\n isMultimedia(): boolean {\n return this.contentType !== null && Object.keys(MultimediaContentTypes).includes(this.contentType.toUpperCase());\n }\n\n isSupported(): boolean {\n const supportedTypes = Object.assign({}, MultimediaContentTypes, ConvertibleContentTypes, CoreContentTypes);\n return this.contentType !== null && Object.keys(supportedTypes).includes(this.contentType.toUpperCase());\n }\n\n onMediaLoad(status: ResponseType) {\n this.mediaLoadStatus.emit(status);\n }\n\n setToolbarButtons() {\n if (this.contentType === CoreContentTypes.PDF || this.needsConverting()) {\n this.toolbarButtons.setup({\n ...defaultPdfOptions, showHighlightButton: this.enableAnnotations, showDrawButton: this.enableAnnotations,\n ...this.toolbarButtonOverrides\n });\n } else if (this.contentType === CoreContentTypes.IMAGE) {\n this.toolbarButtons.setup({\n ...defaultImageOptions, showDrawButton: this.enableAnnotations,\n ...this.toolbarButtonOverrides\n });\n } else if (this.isMultimedia()) {\n this.toolbarButtons.setup({\n ...defaultMultimediaOptions,\n ...this.toolbarButtonOverrides\n });\n } else {\n this.toolbarButtons.setup({\n ...defaultUnsupportedOptions,\n ...this.toolbarButtonOverrides\n });\n }\n }\n\n onLoadException(exception: ViewerException) {\n this.viewerException.emit(exception);\n if (!this.isSupported()) {\n this.typeException = false;\n } else {\n this.typeException = true;\n this.contentType = null;\n this.setToolbarButtons();\n }\n }\n\n onCommentChange(changes: boolean) {\n this.unsavedChanges.emit(changes);\n }\n\n onDocumentTitleChange(title: string) {\n this.documentTitle = title;\n }\n\n // If secure mode is enabled (which adds \"documentsv2\" to the documentId), get rid of it\n private extractDMStoreDocId(url: string): string {\n url = url.includes('/documents/') ? url.split('/documents/')[1] : url;\n url = url.includes('/documentsv2/') ? url.split('/documentsv2/')[1] : url;\n return url.replace('/binary', '');\n }\n\n detectOs() {\n this.hasScrollBar = window.navigator.userAgent.indexOf('Win') !== -1;\n }\n}\n","import {createSelector} from '@ngrx/store';\n\nimport * as fromFeature from '../reducers/reducers';\nimport * as fromAnnotations from '../reducers/annotations.reducer';\nimport * as fromTags from './tag.selectors';\nimport * as fromDocument from './document.selectors';\nimport {StoreUtils} from '../store-utils';\nimport moment from 'moment-timezone';\nexport const getAnnotationsSetState = createSelector(\n fromFeature.getMVState,\n (state: fromFeature.State) => state.annotations\n);\n\nexport const getAnnotationEntities = createSelector(\n getAnnotationsSetState,\n fromAnnotations.getAnnoEnt\n);\n\nexport const getSet = createSelector(\n getAnnotationsSetState,\n fromAnnotations.getAnnoSet\n);\n\nexport const getDocumentIdSetId = createSelector(\n getSet,\n (annoSet) => {\n return {\n documentId: annoSet.documentId,\n annotationSetId: annoSet.id\n };\n }\n);\n\nexport const getAnnotationSet = createSelector(\n getAnnotationEntities,\n getSet,\n (entities, set) => {\n return {\n ...set,\n annotations: Object.keys(entities).map(key => entities[key])\n };\n }\n);\n\nexport const getSelectedAnnotation = createSelector(\n getAnnotationsSetState,\n fromAnnotations.getSelectedAnno\n);\n\nexport const getCommentEntities = createSelector(\n getAnnotationsSetState,\n fromAnnotations.getCommentEnts\n);\n\n\nexport const getPageEntities = createSelector(\n getAnnotationsSetState,\n fromAnnotations.getAnnoPageEnt\n);\n\nexport const getComponentSearchQueries = createSelector(\n getAnnotationsSetState,\n fromAnnotations.commentSearchQ\n);\n\nexport const getComponentSearchText = createSelector(\n getComponentSearchQueries,\n (queries) => queries.commentSearch\n);\n\nexport const getCommentSummaryFilters = createSelector(\n getAnnotationsSetState,\n fromAnnotations.getSummaryFilters\n);\n\nexport const getAnnoPerPage = createSelector(\n fromDocument.getPages,\n getPageEntities,\n fromTags.getFilteredPageEntities,\n (pages, pageEnt, filteredPageEnt) => {\n const isFiltered: boolean = !!Object.keys(filteredPageEnt).length;\n const entities = isFiltered ? filteredPageEnt : pageEnt;\n if (pages) {\n const arr = [];\n Object.keys(pages).forEach(key => {\n arr.push({\n anno: entities[key] ? entities[key] : [],\n styles: pages[key].styles\n });\n });\n return arr;\n }\n }\n);\n\nexport const getCommentsArray = createSelector(\n getCommentEntities,\n fromDocument.getPages,\n getAnnotationEntities,\n fromTags.getTagFiltered,\n (commentEnts, pages, annoEnts, filtered) => {\n if (commentEnts && annoEnts && pages[1]) {\n const isFiltered: boolean = !!Object.keys(filtered).length;\n const com = isFiltered ? filtered : commentEnts;\n return Object.keys(com).map(key => {\n const page = annoEnts[key].page;\n return {\n ...commentEnts[key],\n page,\n pages\n };\n });\n }\n }\n);\n\nexport const getCommentSummary = createSelector(\n getCommentsArray,\n getCommentSummaryFilters,\n (commentSummary = [], filters) => {\n const comments = StoreUtils.filterCommentsSummary(commentSummary, filters.filters);\n if (comments.length) {\n const savedComments = comments.filter((comment) => {\n return comment.createdByDetails !== undefined;\n }\n );\n return savedComments.map((comment) => {\n return {\n page: comment.page,\n user: comment.createdByDetails.forename.concat(' ').concat(comment.createdByDetails.surname),\n date: moment(comment.lastModifiedDate).format('D MMMM YYYY'),\n tags: comment.tags,\n comment: comment.content\n };\n });\n }\n return [''];\n }\n);\n\n\nexport const getFilteredAnnotations = createSelector(\n getAnnotationEntities,\n fromTags.getTagFiltered,\n (annoEnt, filters) => {\n const isFiltered: boolean = !!Object.keys(filters).length;\n const anno = isFiltered ? filters : annoEnt;\n return Object.keys(anno).map(key => annoEnt[key])\n .filter(annotation => annotation.comments && annotation.comments.length > 0);\n }\n);\n","import { Injectable } from '@angular/core';\nimport { take } from 'rxjs/operators';\nimport { select, Store } from '@ngrx/store';\nimport { v4 as uuid } from 'uuid';\nimport moment from 'moment-timezone';\n\n\nimport { Rectangle } from '../../annotation-view/rectangle/rectangle.model';\nimport { ToolbarEventService } from '../../../../toolbar/toolbar.module';\nimport * as fromStore from '../../../../store/reducers/reducers';\nimport * as fromSelectors from '../../../../store/selectors/annotation.selectors';\nimport * as fromActions from '../../../../store/actions/annotation.actions';\nimport { Annotation } from '../../annotation-view/annotation.model';\n\n@Injectable()\nexport class HighlightCreateService {\n\n constructor(private toolBarEvents: ToolbarEventService,\n private store: Store<fromStore.AnnotationSetState>) { }\n\n saveAnnotation(rectangles: Rectangle[], page: number) {\n this.store.pipe(select(fromSelectors.getDocumentIdSetId), take(1)).subscribe(anoSetDocId => {\n const anno: Annotation = {\n id: uuid(),\n color: 'FFFF00',\n comments: [],\n page: page,\n rectangles: rectangles,\n type: 'highlight',\n ...anoSetDocId,\n createdBy: '',\n createdByDetails: undefined,\n createdDate: moment.utc().tz('Europe/London').toISOString(),\n lastModifiedBy: '',\n lastModifiedByDetails: undefined,\n lastModifiedDate: '',\n tags: [],\n };\n this.store.dispatch(new fromActions.SaveAnnotation(anno));\n });\n }\n\n applyRotation(pageHeight, pageWidth, offsetHeight, offsetWidth, offsetTop, offsetLeft, rotate, zoom) {\n const { x, y, width, height } = {\n x: +(offsetLeft / zoom).toFixed(2),\n y: +(offsetTop / zoom).toFixed(2),\n width: +(offsetWidth / zoom).toFixed(2),\n height: +(offsetHeight / zoom).toFixed(2)\n };\n const rectangle = { x, y, width, height };\n switch (rotate) {\n case 90:\n rectangle.width = height;\n rectangle.height = width;\n rectangle.x = y;\n rectangle.y = +(pageWidth / zoom - x - width).toFixed(2);\n break;\n case 180:\n rectangle.x = +(pageWidth / zoom - x - width).toFixed(2);\n rectangle.y = +(pageHeight / zoom - y - height).toFixed(2);\n break;\n case 270:\n rectangle.width = height;\n rectangle.height = width;\n rectangle.x = +(pageHeight / zoom - y - height).toFixed(2);\n rectangle.y = x;\n break;\n }\n return rectangle as any;\n }\n\n resetHighlight() {\n window.getSelection().removeAllRanges();\n this.toolBarEvents.highlightModeSubject.next(false);\n }\n}\n","import { BulkRedaction, Redaction } from './../../redaction/services/redaction.model';\nimport { SearchResultsCount } from './../toolbar-event.service';\nimport { RedactionSearch, RedactRectangle } from './redaction-search.model';\nimport { Component, ElementRef, HostListener, Inject, OnInit, ViewChild } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ToolbarButtonVisibilityService } from '../toolbar-button-visibility.service';\nimport { ToolbarEventService } from '../toolbar-event.service';\nimport { Store, select } from '@ngrx/store';\nimport * as fromStore from '../../store/reducers/reducers';\nimport { Rectangle } from '../../annotations/annotation-set/annotation-view/rectangle/rectangle.model';\nimport * as fromDocument from '../../store/selectors/document.selectors';\nimport * as fromRedactionActions from '../../store/actions/redaction.actions';\nimport uuid from 'uuid';\nimport { HighlightCreateService } from '../../annotations/annotation-set/annotation-create/highlight-create/highlight-create.service';\n\n@Component({\n selector: 'mv-redaction-search-bar',\n templateUrl: './redaction-search-bar.component.html',\n styleUrls: ['./redaction-search-bar.component.scss']\n})\nexport class RedactionSearchBarComponent implements OnInit {\n\n @ViewChild('findInput', { static: true }) findInput: ElementRef<HTMLInputElement>;\n\n highlightAll = true;\n matchCase = false;\n wholeWord = false;\n resultsText = '';\n searchText = '';\n resultCount = 0;\n redactElements: RedactRectangle[] = [];\n pageHeight: number;\n pageWidth: number;\n zoom: number;\n rotate: number;\n allPages: object;\n redactAll: boolean;\n openSearchModal: boolean;\n redactAllInProgress: boolean;\n redactAllText?: string;\n\n\n private subscription: Subscription;\n private documentId: string;\n public advancedSearchVisible = false;\n\n constructor(\n private store: Store<fromStore.State>,\n public readonly toolbarButtons: ToolbarButtonVisibilityService,\n public readonly toolbarEvents: ToolbarEventService,\n public readonly highlightService: HighlightCreateService,\n ) { }\n\n public ngOnInit(): void {\n this.subscription = this.toolbarEvents.redactionSerachSubject.subscribe((results: RedactionSearch) => this.redactAllSearched(results));\n this.subscription.add(this.store.pipe(select(fromDocument.getDocumentId)).subscribe(docId => this.documentId = docId));\n this.subscription.add(this.store.pipe(select(fromDocument.getPages)).subscribe((pages) => {\n if (pages[1]) {\n this.allPages = pages;\n }\n }));\n this.subscription.add(\n this.toolbarEvents.searchResultsCountSubject.subscribe(results => this.setSearchResultsCount(results))\n );\n this.subscription.add(this.toolbarEvents.openRedactionSearch.subscribe(isOpen => this.openSearchModal = isOpen));\n this.subscription.add(this.toolbarEvents.redactAllInProgressSubject\n .subscribe(inProgress => this.redactAllInProgress = inProgress));\n }\n\n ngOnDestroy(): void {\n this.subscription.unsubscribe();\n }\n\n @HostListener('window:keydown', ['$event'])\n public onWindowKeyDown(e: KeyboardEvent): void {\n if (e.code === 'F3' || (e.ctrlKey && e.code === 'KeyF')) {\n e.preventDefault();\n this.toolbarEvents.searchBarHidden.next(false);\n setTimeout(() => this.findInput.nativeElement.focus(), 200);\n }\n }\n\n search(reset: boolean = true): void {\n this.redactAll = !reset;\n if (this.redactAll) {\n this.toolbarEvents.redactAllInProgressSubject.next(true);\n }\n if (reset) {\n this.redactElements = [];\n }\n this.toolbarEvents.search({\n searchTerm: this.searchText,\n highlightAll: this.highlightAll,\n matchCase: this.matchCase,\n wholeWord: this.wholeWord,\n previous: false,\n reset\n });\n }\n\n private saveRedaction(redactRectangle: RedactRectangle[]) {\n const redaction = redactRectangle.map(ele => {\n return { page: ele.page, rectangles: ele.rectangles, redactionId: uuid(), documentId: this.documentId } as Redaction;\n });\n this.store.dispatch(new fromRedactionActions.SaveBulkRedaction({ searchRedactions: redaction } as BulkRedaction));\n }\n\n private existInRedactElements(pageNumber: number, matechedIndex: number, rectangles: Rectangle[]): boolean {\n if (this.redactElements && this.redactElements.length > 0) {\n const pagesFound = this.redactElements.find(re => re.page === pageNumber && re.matchedIndex === matechedIndex);\n const pageRectangles = pagesFound?.rectangles;\n if (!pageRectangles || pageRectangles.length <= 0) {\n return false;\n }\n let matchesRectangles = 0;\n for (let rectIndx = 0; rectIndx < pageRectangles.length; rectIndx++) {\n const rectangle = pageRectangles[rectIndx];\n const foundRectangle = rectangles.find(re => re.width === rectangle.width &&\n re.height === rectangle.height && re.x === rectangle.x && re.y === rectangle.y);\n if (foundRectangle) {\n matchesRectangles++;\n }\n }\n return pageRectangles.length === matchesRectangles;\n }\n return false;\n }\n\n onCloseSearchModal() {\n this.toolbarEvents.openRedactionSearch.next(false);\n }\n\n\n private setSearchResultsCount(results: SearchResultsCount): void {\n this.resultCount = results.total;\n this.resultsText = this.resultCount > 0\n ? `${results.total} results founds`\n : 'No results found';\n }\n\n private redactAllSearched(results: RedactionSearch): void {\n const $this = this;\n const intervalId = setInterval(() => {\n const highlightElement = document.getElementsByClassName('highlight selected');\n if (highlightElement && highlightElement.length > 0) {\n clearInterval(intervalId);\n $this.redactAllSearchedTick(results);\n }\n }, 100);\n }\n\n\n private redactAllSearchedTick(results: RedactionSearch): void {\n const highlightElement = document.getElementsByClassName('highlight selected');\n if (highlightElement && highlightElement.length > 0) {\n this.resultCount = results.matchesCount;\n const pageNumber = results.page + 1;\n const rectangles = this.getRectangles(pageNumber);\n if (rectangles && this.redactElements.length <= this.resultCount\n && !this.existInRedactElements(pageNumber, results.matchedIndex, rectangles)) {\n this.redactElements.push({ page: pageNumber, matchedIndex: results?.matchedIndex, rectangles } as RedactRectangle);\n this.CreateRedactAllText();\n }\n if (this.redactAll && this.resultCount && this.resultCount > 0\n && rectangles && this.redactElements.length < this.resultCount) {\n this.search(false);\n }\n\n if (this.redactAll && this.resultCount && this.redactElements.length === this.resultCount) {\n this.redactAll = false;\n this.redactAllText = null;\n this.saveRedaction(this.redactElements);\n }\n }\n }\n\n private CreateRedactAllText() {\n this.redactAllText = `${this.redactElements.length} of ${this.resultCount}`;\n }\n\n public onEscapeKeyPress(e: KeyboardEvent): void {\n this.toolbarEvents.searchBarHidden.next(true);\n }\n\n public onEnterKeyPress(e: KeyboardEvent): void {\n this.search();\n }\n\n public toggleSearchBar() {\n this.toolbarEvents.searchBarHidden.next(!this.toolbarEvents.searchBarHidden.getValue());\n }\n\n private getRectangles(page: number): Rectangle[] {\n this.pageHeight = this.allPages[page].styles.height;\n this.pageWidth = this.allPages[page].styles.width;\n this.zoom = parseFloat(this.allPages[page].scaleRotation.scale);\n this.rotate = parseInt(this.allPages[page].scaleRotation.rotation, 10);\n const selectedHighLightedElements = document.getElementsByClassName('highlight selected');\n if (selectedHighLightedElements && selectedHighLightedElements.length > 0) {\n const docRange = document.createRange();\n docRange.selectNodeContents(selectedHighLightedElements[0] as HTMLElement);\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(docRange);\n if (selection.rangeCount && !selection.isCollapsed) {\n const range = selection.getRangeAt(0).cloneRange();\n const clientRects = range.getClientRects();\n\n if (clientRects) {\n const parentRect = selectedHighLightedElements[0].parentElement.parentElement.getBoundingClientRect();\n const selectionRectangles: Rectangle[] = [];\n for (let i = 0; i < clientRects.length; i++) {\n const selectionRectangle = this.createTextRectangle(clientRects[i], parentRect);\n const findSelecttionRectangle = selectionRectangles.find(\n (rect) => rect.width === selectionRectangle.width && rect.x === selectionRectangle.x\n );\n if (!findSelecttionRectangle) {\n selectionRectangles.push(selectionRectangle);\n }\n }\n\n return selectionRectangles;\n }\n }\n }\n }\n\n private createTextRectangle(rect: DOMRect, parentRect: any): Rectangle {\n const height = rect.bottom - rect.top;\n const width = rect.right - rect.left;\n const top = rect.top - parentRect.top;\n const left = rect.left - parentRect.left;\n\n let rectangle = this.highlightService.applyRotation(\n this.pageHeight,\n this.pageWidth,\n height,\n width,\n top,\n left,\n this.rotate,\n this.zoom\n );\n rectangle = { id: uuid(), ...rectangle };\n\n return rectangle as Rectangle;\n }\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * Number Helper Service\n * */\n@Injectable({\n providedIn: 'root'\n})\n\nexport class NumberHelperService {\n constructor() { }\n\n public isNumber(value: string | number): boolean {\n return (\n value !== null\n && value !== undefined\n && value !== ''\n && !isNaN(Number(value.toString()))\n );\n }\n }\n","import { ConnectionPositionPair } from '@angular/cdk/overlay';\nimport {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n HostListener,\n Input,\n OnDestroy,\n OnInit,\n ViewChild\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ToolbarEventService } from '../toolbar-event.service';\nimport { ToolbarButtonVisibilityService } from '../toolbar-button-visibility.service';\nimport { NumberHelperService } from '../../../lib/shared/util/services/number.helper.service';\n\n@Component({\n selector: 'mv-main-toolbar',\n templateUrl: './main-toolbar.component.html'\n})\nexport class MainToolbarComponent implements OnInit, OnDestroy, AfterViewInit {\n\n @Input() enableAnnotations = false;\n @Input() enableRedactions = false;\n @Input() enableICP = false;\n @Input() contentType = null;\n\n @ViewChild('zoomSelect', { static: false }) public zoomSelect: ElementRef;\n @ViewChild('mvToolbarMain', { static: false }) public mvToolbarMain: ElementRef<HTMLElement>;\n @ViewChild('dropdownMenu', { static: false }) public mvMenuItems: ElementRef<HTMLElement>;\n\n private readonly subscriptions: Subscription[] = [];\n\n public icpEnabled = false;\n public redactionEnabled = false;\n public showCommentsPanel: boolean;\n public redactAllInProgress: boolean;\n\n public pageNumber = 1;\n public pageCount = 0;\n public isDropdownMenuOpen = false;\n public dropdownMenuPositions = [\n new ConnectionPositionPair(\n {\n originX: 'end',\n originY: 'bottom'\n },\n {\n overlayX: 'end',\n overlayY: 'top'\n },\n 0,\n 3)\n ];\n\n public zoomScales = [0.1, 0.25, 0.5, 0.75, 1, 1.25, 1.5, 2.5, 3, 5];\n\n allButtonsWidth = 0;\n widthRequiredForBtn: { [id: string]: number } = {};\n\n public constructor(\n public readonly toolbarEvents: ToolbarEventService,\n public readonly toolbarButtons: ToolbarButtonVisibilityService,\n private readonly cdr: ChangeDetectorRef,\n private readonly numberHelper: NumberHelperService\n ) {\n }\n\n public ngOnInit() {\n this.subscriptions.push(\n this.toolbarEvents.setCurrentPageSubject.subscribe(pageNumber => this.setCurrentPage(pageNumber)),\n this.toolbarEvents.setCurrentPageInputValueSubject.subscribe(pageNumber => this.pageNumber = pageNumber),\n this.toolbarEvents.getPageCount().subscribe(count => this.pageCount = count),\n this.toolbarEvents.icp.enabled.subscribe(enabled => {\n this.icpEnabled = enabled;\n if (this.icpEnabled) {\n this.toolbarEvents.toggleCommentsPanel(!enabled);\n this.toolbarEvents.sidebarOpen.next(false);\n }\n }),\n this.toolbarEvents.redactionMode.subscribe(enabled => {\n this.redactionEnabled = enabled;\n }),\n this.toolbarEvents.redactAllInProgressSubject.subscribe(disable => {\n this.redactAllInProgress = disable;\n }),\n );\n }\n\n public ngOnDestroy(): void {\n for (const subscription of this.subscriptions) {\n subscription.unsubscribe();\n }\n }\n\n public ngAfterViewInit() {\n Array.from(this.mvToolbarMain.nativeElement.children).forEach(button => {\n this.allButtonsWidth += button.getBoundingClientRect().width;\n this.widthRequiredForBtn[button.id] = this.allButtonsWidth;\n });\n this.cdr.detectChanges();\n }\n\n @HostListener('window:resize', [])\n public onResize() {\n this.cdr.detectChanges();\n }\n\n @HostListener('document:keydown.control.p', ['$event'])\n @HostListener('document:keydown.meta.p', ['$event'])\n public onControlPrint(event: KeyboardEvent) {\n event.preventDefault();\n this.printFile();\n }\n\n public onClickHighlightToggle() {\n this.toolbarEvents.toggleHighlightMode();\n }\n public onClickDrawToggle() {\n this.toolbarEvents.toggleDrawMode();\n }\n\n public toggleIndexSideBar() {\n const sidebarOpen = this.toolbarEvents.sidebarOpen.getValue();\n const sidebarView = this.toolbarEvents.sidebarOutlineView.getValue();\n if (!(sidebarOpen && !sidebarView)) {\n this.toolbarEvents.toggleSideBar(!sidebarOpen);\n }\n this.toolbarEvents.toggleSideBarView(true);\n }\n\n public toggleBookmarksSideBar() {\n const sidebarOpen = this.toolbarEvents.sidebarOpen.getValue();\n const sidebarView = this.toolbarEvents.sidebarOutlineView.getValue();\n if (!(sidebarOpen && sidebarView)) {\n this.toolbarEvents.toggleSideBar(!sidebarOpen);\n }\n this.toolbarEvents.toggleSideBarView(false);\n }\n\n public togglePresentBar() {\n this.toolbarEvents.searchBarHidden.next(true);\n this.toolbarEvents.icp.enable();\n }\n\n public increasePageNumber() {\n this.toolbarEvents.incrementPage(1);\n }\n\n public decreasePageNumber() {\n this.toolbarEvents.incrementPage(-1);\n }\n\n public onPageNumberInputChange(pageNumber: string) {\n if (Number(pageNumber) < 1) {\n pageNumber = '1';\n }\n if (Number(pageNumber) > this.pageCount) {\n pageNumber = this.pageCount.toString();\n }\n\n this.toolbarEvents.setPage(Number.parseInt(pageNumber, 10));\n }\n\n private setCurrentPage(pageNumber: number) {\n this.pageNumber = pageNumber;\n }\n\n public rotate(rotation: number) {\n this.toolbarEvents.rotate(rotation);\n }\n\n public printFile() {\n this.toolbarEvents.print();\n }\n\n public downloadFile() {\n this.toolbarEvents.download();\n }\n\n public zoom(zoomFactor: string) {\n this.toolbarEvents.zoom(+zoomFactor);\n }\n\n public stepZoom(zoomFactor: number) {\n this.toolbarEvents.stepZoom(zoomFactor);\n this.zoomSelect.nativeElement.selected = 'selected';\n }\n\n public toggleCommentsPanel() {\n this.toolbarEvents.toggleCommentsPanel(!this.toolbarEvents.commentsPanelVisible.getValue());\n }\n\n public toggleRedactBar() {\n this.toolbarEvents.toggleRedactionMode();\n }\n\n public toggleGrabNDrag() {\n this.toolbarEvents.toggleGrabNDrag();\n }\n\n public isPdf() {\n return this.contentType === 'pdf';\n }\n\n public toggleSearchBar() {\n this.toolbarEvents.searchBarHidden.next(!this.toolbarEvents.searchBarHidden.getValue());\n }\n\n public toggleMoreOptions() {\n this.isDropdownMenuOpen = !this.isDropdownMenuOpen;\n setTimeout(() => {\n if (this.mvMenuItems) {\n this.mvMenuItems.nativeElement.focus();\n }\n }, 100);\n }\n}\n","import { Component, ElementRef, HostListener, OnInit, ViewChild, OnDestroy } from '@angular/core';\nimport { ToolbarButtonVisibilityService } from '../toolbar-button-visibility.service';\nimport { SearchResultsCount, ToolbarEventService } from '../toolbar-event.service';\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'mv-search-bar',\n templateUrl: './search-bar.component.html'\n})\nexport class SearchBarComponent implements OnInit, OnDestroy {\n\n @ViewChild('findInput', { static: true }) findInput: ElementRef<HTMLInputElement>;\n @ViewChild('findNext', { static: false }) findNext: ElementRef<HTMLAnchorElement>;\n\n highlightAll = true;\n matchCase = false;\n wholeWord = false;\n resultsText = '';\n searchText = '';\n resultCount = 0;\n\n private subscriptions: Subscription[] = [];\n\n public advancedSearchVisible = false;\n\n constructor(\n public readonly toolbarButtons: ToolbarButtonVisibilityService,\n public readonly toolbarEvents: ToolbarEventService\n ) { }\n\n public ngOnInit(): void {\n this.subscriptions.push(\n this.toolbarEvents.searchResultsCountSubject.subscribe(results => this.setSearchResultsCount(results))\n );\n }\n\n ngOnDestroy(): void {\n for (const subscription of this.subscriptions) {\n subscription.unsubscribe();\n }\n }\n\n @HostListener('window:keydown', ['$event'])\n public onWindowKeyDown(e: KeyboardEvent): void {\n if (e.code === 'F3' || (e.ctrlKey && e.code === 'KeyF')) {\n e.preventDefault();\n\n this.toolbarEvents.searchBarHidden.next(false);\n setTimeout(() => this.findInput.nativeElement.focus(), 200);\n }\n }\n\n public searchNext(): void {\n this.toolbarEvents.search({\n searchTerm: this.searchText,\n highlightAll: this.highlightAll,\n matchCase: this.matchCase,\n wholeWord: this.wholeWord,\n previous: false,\n reset: false\n });\n }\n\n public searchPrev(): void {\n this.toolbarEvents.search({\n searchTerm: this.searchText,\n highlightAll: this.highlightAll,\n matchCase: this.matchCase,\n wholeWord: this.wholeWord,\n previous: true,\n reset: false\n });\n }\n\n public search(): void {\n this.toolbarEvents.search({\n searchTerm: this.searchText,\n highlightAll: this.highlightAll,\n matchCase: this.matchCase,\n wholeWord: this.wholeWord,\n previous: false,\n reset: true\n });\n }\n\n private setSearchResultsCount(results: SearchResultsCount): void {\n this.resultCount = results.total;\n this.resultsText = this.resultCount > 0\n ? `Found ${results.current} of ${results.total}`\n : 'No results found';\n if (this.resultCount && this.resultCount > 0) {\n setTimeout(() => {\n this.findNext.nativeElement.focus();\n }, 1000);\n }\n }\n\n public onEscapeKeyPress(e: KeyboardEvent): void {\n this.toolbarEvents.searchBarHidden.next(true);\n }\n\n public onEnterKeyPress(e: KeyboardEvent): void {\n this.search();\n }\n\n\n public toggleAdvancedSearch(): void {\n this.advancedSearchVisible = !this.advancedSearchVisible;\n }\n\n public toggleSearchBar() {\n this.toolbarEvents.searchBarHidden.next(!this.toolbarEvents.searchBarHidden.getValue());\n }\n}\n","import {createSelector} from '@ngrx/store';\nimport * as fromFeature from '../reducers/reducers';\nimport * as fromRedactions from '../reducers/redaction.reducer';\nimport * as fromDocument from './document.selectors';\n\nexport const getRedactionState = createSelector(\n fromFeature.getMVState,\n (state: fromFeature.State) => state.redactions\n);\n\nexport const getRedactionPages = createSelector(\n getRedactionState,\n fromRedactions.getPageEnt\n);\n\nexport const getSelected = createSelector(\n getRedactionState,\n fromRedactions.getSelectedRedaction\n);\n\nexport const getRedactedDocumentInfo = createSelector(\n getRedactionState,\n fromRedactions.getRedactedDocInfo\n);\n\nexport const getRedactionEnt = createSelector(\n getRedactionState,\n fromRedactions.getRedactionEnt\n);\n\nexport const getRedactionArray = createSelector(\n getRedactionEnt,\n fromDocument.getDocumentId,\n (ent, documentId) => {\n const redactions = Object.keys(ent).map(key => ent[key]);\n return { redactions, documentId };\n }\n);\n\nexport const getRedactionsPerPage = createSelector(\n fromDocument.getPages,\n getRedactionPages,\n (pages, pageEnt) => {\n if (pages && pageEnt) {\n const arr = [];\n Object.keys(pages).forEach(key => {\n arr.push({\n anno: pageEnt[key] ? pageEnt[key] : [],\n styles: pages[key].styles\n });\n });\n\n return arr;\n }\n }\n);\n\n","import { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { ToolbarEventService } from '../toolbar-event.service';\nimport { select, Store } from '@ngrx/store';\nimport * as fromRedactSelectors from '../../store/selectors/redaction.selectors';\nimport * as fromStore from '../../store/reducers/reducers';\nimport { Subscription } from 'rxjs';\nimport { ToolbarButtonVisibilityService } from '../toolbar-button-visibility.service';\nimport { ThisReceiver } from '@angular/compiler';\n\n@Component({\n selector: 'mv-redaction-toolbar',\n templateUrl: './redaction-toolbar.component.html'\n})\nexport class RedactionToolbarComponent implements OnInit, OnDestroy {\n\n @Input() showRedactSearch: boolean;\n\n preview = false;\n hasRedactions = false;\n\n private subscriptions: Subscription[] = [];\n redactionAllInProgress: boolean;\n\n constructor(public readonly toolbarEventService: ToolbarEventService,\n public readonly toolbarButtons: ToolbarButtonVisibilityService,\n private store: Store<fromStore.AnnotationSetState>) { }\n\n ngOnInit(): void {\n this.subscriptions.push(this.store.pipe(select(fromRedactSelectors.getRedactionArray)).subscribe(redactions => {\n this.hasRedactions = !!redactions.redactions.length;\n }));\n this.subscriptions.push(this.toolbarEventService.redactAllInProgressSubject.subscribe(inprogress => {\n this.redactionAllInProgress = inprogress;\n }));\n }\n\n onRedactAllSearch() {\n this.toolbarEventService.openRedactionSearch.next(true);\n }\n\n toggleTextRedactionMode() {\n this.toolbarEventService.highlightModeSubject.next(true);\n }\n\n toggleDrawMode() {\n this.toolbarEventService.drawModeSubject.next(true);\n }\n\n togglePreview() {\n this.preview = !this.preview;\n this.toolbarEventService.toggleRedactionPreview(this.preview);\n }\n\n unmarkAll() {\n this.toolbarEventService.unmarkAll();\n }\n\n redact() {\n this.toolbarEventService.applyRedactionToDocument();\n }\n\n toggleRedactBar() {\n this.toolbarEventService.toggleRedactionMode();\n }\n\n redactPage() {\n this.toolbarEventService.drawModeSubject.next(true);\n this.toolbarEventService.redactPage();\n }\n\n ngOnDestroy(): void {\n for (const subscription of this.subscriptions) {\n subscription.unsubscribe();\n }\n }\n}\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { ToolbarEventService } from '../toolbar-event.service';\nimport { select, Store } from '@ngrx/store';\nimport * as fromIcpSelectors from '../../store/selectors/icp.selectors';\nimport { Subscription } from 'rxjs';\nimport { IcpState } from '../../icp/icp.interfaces';\n\n@Component({\n selector: 'mv-icp-toolbar',\n templateUrl: './icp-toolbar.component.html'\n})\nexport class IcpToolbarComponent implements OnInit, OnDestroy {\n\n presenterName: string;\n isPresenter: boolean;\n\n private $subscription: Subscription;\n\n constructor(public readonly toolbarEventService: ToolbarEventService,\n private store: Store<IcpState>) {}\n\n ngOnInit() {\n this.$subscription = this.store.pipe(select(fromIcpSelectors.isPresenter))\n .subscribe(isPresenter => this.isPresenter = isPresenter);\n this.$subscription.add(this.store.pipe(select(fromIcpSelectors.getPresenterName))\n .subscribe(name => this.presenterName = name));\n }\n\n ngOnDestroy() {\n this.$subscription.unsubscribe();\n }\n\n present() {\n this.toolbarEventService.icp.becomePresenter();\n }\n\n stopPresenting() {\n this.toolbarEventService.icp.stopPresenting();\n }\n\n leaveIcpSession() {\n this.toolbarEventService.icp.leaveSession();\n }\n\n showParticipantsList() {\n this.toolbarEventService.toggleParticipantsList(!this.toolbarEventService.icp.participantsListVisible.getValue());\n }\n}\n","import { RedactionSearchBarComponent } from './redaction-search-bar/redaction-search-bar.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MainToolbarComponent } from './main-toolbar/main-toolbar.component';\nimport { SearchBarComponent } from './search-bar/search-bar.component';\nimport { FormsModule } from '@angular/forms';\nimport { ToolbarButtonVisibilityService } from './toolbar-button-visibility.service';\nimport { ToolbarEventService } from './toolbar-event.service';\nimport { RedactionToolbarComponent } from './redaction-toolbar/redaction-toolbar.component';\nimport { IcpToolbarComponent } from './icp-toolbar/icp-toolbar.component';\nexport { ToolbarButtonVisibilityService } from './toolbar-button-visibility.service';\nexport { ToolbarEventService } from './toolbar-event.service';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { RouterModule } from '@angular/router';\n\n\n@NgModule({\n declarations: [\n SearchBarComponent,\n MainToolbarComponent,\n RedactionToolbarComponent,\n IcpToolbarComponent,\n RedactionSearchBarComponent\n ],\n providers: [\n ToolbarButtonVisibilityService,\n ToolbarEventService\n ],\n exports: [\n MainToolbarComponent,\n SearchBarComponent,\n RedactionToolbarComponent,\n IcpToolbarComponent,\n RedactionSearchBarComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n OverlayModule,\n RouterModule\n ]\n})\nexport class ToolbarModule { }\n","import { Component, EventEmitter, Input, Output, ViewChild, ElementRef } from '@angular/core';\nimport { v4 as uuid } from 'uuid';\nimport { Annotation } from './annotation.model';\nimport { Rectangle } from './rectangle/rectangle.model';\nimport moment from 'moment-timezone';\nimport { Store } from '@ngrx/store';\nimport * as fromStore from '../../../store/reducers/reducers';\nimport * as fromActions from '../../../store/actions/annotation.actions';\nimport { SelectionAnnotation } from '../../models/event-select.model';\nimport { ToolbarEventService } from '../../../toolbar/toolbar-event.service';\nimport { Comment } from '../../comment-set/comment/comment.model';\n\n@Component({\n selector: 'mv-annotation',\n templateUrl: './annotation-view.component.html'\n})\nexport class AnnotationViewComponent { // todo rename this to selection vew c\n\n @Input() set annotation(value) {\n this.anno = { ...value };\n }\n anno: Annotation;\n selected: boolean;\n @Input() zoom: number;\n @Input() rotate: number;\n @Input() set selectedAnnoId(selectedId: { annotationId: string }) {\n if (selectedId) {\n const id = this.anno.id || this.anno.redactionId; // todo make it unique\n this.selected = selectedId.annotationId ? (selectedId.annotationId === id) : false;\n }\n }\n @Input() pageHeight: number;\n @Input() pageWidth: number;\n @Output() update = new EventEmitter<Annotation>();\n @Output() delete = new EventEmitter<Annotation>();\n @Output() annotationClick = new EventEmitter<SelectionAnnotation>();\n\n @ViewChild('container', { static: false }) container: ElementRef;\n\n constructor(\n private readonly toolbarEvents: ToolbarEventService,\n private store: Store<fromStore.AnnotationSetState>\n ) { }\n\n public onSelect() {\n const annotationId = this.anno.id || this.anno.redactionId;\n this.annotationClick.emit({ annotationId, editable: false, selected: true });\n }\n\n public onRectangleUpdate(rectangle: Rectangle) {\n const annotation = { ...this.anno };\n annotation.rectangles = annotation.rectangles.filter(r => r.id !== rectangle.id);\n annotation.rectangles.push(rectangle);\n this.update.emit(annotation);\n }\n\n public deleteHighlight() {\n this.delete.emit(this.anno);\n }\n\n public addOrEditComment() {\n if (this.anno.comments.length === 0) {\n const comment: Comment = {\n annotationId: this.anno.id,\n content: '',\n createdBy: this.anno.createdBy,\n createdByDetails: undefined,\n createdDate: moment.utc().tz('Europe/London').toISOString(),\n id: uuid(),\n lastModifiedBy: '',\n lastModifiedByDetails: undefined,\n lastModifiedDate: '',\n tags: [],\n page: null,\n pages: {},\n pageHeight: null,\n selected: false,\n editable: false\n };\n this.store.dispatch(new fromActions.AddOrEditComment(comment));\n\n }\n this.selected = true;\n this.annotationClick.emit({ annotationId: this.anno.id, editable: true, selected: true });\n this.toolbarEvents.toggleCommentsPanel(true);\n }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { Annotation } from './annotation-view/annotation.model';\nimport { Observable } from 'rxjs';\nimport { SelectionAnnotation } from '../models/event-select.model';\nimport { CommentService } from '../comment-set/comment/comment.service';\nimport { select, Store } from '@ngrx/store';\nimport * as fromStore from '../../store/reducers/reducers';\nimport * as fromActions from '../../store/actions/annotation.actions';\nimport * as fromSelectors from '../../store/selectors/annotation.selectors';\n\n@Component({\n selector: 'mv-annotation-set',\n templateUrl: './annotation-set.component.html'\n})\nexport class AnnotationSetComponent implements OnInit {\n\n @Input() page: number;\n @Input() annotations: Annotation[] = [];\n @Input() zoom: number;\n @Input() rotate: number;\n @Input() pageHeight: number;\n @Input() pageWidth: number;\n\n selectedAnnotation$: Observable<SelectionAnnotation>;\n\n constructor(\n private store: Store<fromStore.AnnotationSetState>,\n private readonly commentService: CommentService\n ) {}\n\n ngOnInit(): void {\n this.selectedAnnotation$ = this.store.pipe(select(fromSelectors.getSelectedAnnotation));\n }\n\n public onAnnotationUpdate(annotation: Annotation) {\n this.store.dispatch(new fromActions.SaveAnnotation(annotation));\n }\n\n public onAnnotationDelete(annotation: Annotation) {\n if (annotation.comments.length > 0) {\n this.commentService.updateUnsavedCommentsStatus(annotation, false);\n }\n this.store.dispatch(new fromActions.DeleteAnnotation(annotation.id));\n }\n\n selectAnnotation(selectedAnnotation: SelectionAnnotation) {\n this.store.dispatch(new fromActions.SelectedAnnotation(selectedAnnotation));\n }\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild\n} from '@angular/core';\nimport { Rectangle } from './rectangle.model';\nimport { Subscription } from 'rxjs';\nimport { ToolbarEventService } from '../../../../toolbar/toolbar-event.service';\nimport { HighlightCreateService } from '../../annotation-create/highlight-create/highlight-create.service';\n\n@Component({\n selector: 'mv-anno-rectangle',\n templateUrl: './rectangle.component.html'\n})\nexport class RectangleComponent implements OnChanges, AfterViewInit, OnDestroy {\n\n @Input() color: String;\n @Input() zoom: number;\n @Input() rotate: number;\n @Input() editable: boolean;\n @Input() pageHeight: number;\n @Input() pageWidth: number;\n\n @Output() select = new EventEmitter<Rectangle>();\n @Output() update = new EventEmitter<Rectangle>();\n\n @ViewChild('rectElement', {static: false}) viewRect: ElementRef;\n\n private subscriptions: Subscription[] = [];\n _selected: boolean;\n enableGrabNDrag = false;\n\n height: number;\n width: number;\n top: number;\n left: number;\n\n _annoRect: Rectangle;\n @Input()\n set annoRect(annoRect: Rectangle) {\n this._annoRect = { ...annoRect };\n this.height = +(annoRect.height * this.zoom).toFixed(2);\n this.width = +(annoRect.width * this.zoom).toFixed(2);\n this.left = +(annoRect.x * this.zoom).toFixed(2);\n this.top = +(annoRect.y * this.zoom).toFixed(2);\n }\n\n get annoRect() {\n return this._annoRect;\n }\n\n\n constructor(private readonly toolbarEvents: ToolbarEventService,\n private readonly highlightService: HighlightCreateService) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.rotate) {\n this.adjustForRotation(this.rotate);\n }\n }\n\n ngAfterViewInit() {\n this.subscriptions.push(\n this.toolbarEvents.grabNDrag.subscribe(grabNDrag => this.enableGrabNDrag = grabNDrag)\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.filter(subscription => !subscription.closed)\n .forEach(subscription => subscription.unsubscribe());\n }\n\n @Input()\n set selected(selected: boolean) {\n this._selected = selected;\n if (this._selected && this.viewRect) {\n this.viewRect.nativeElement.focus();\n }\n }\n\n get selected() {\n return this._selected;\n }\n\n onClick() {\n this.select.emit(this.annoRect);\n }\n\n onUpdate(viewRect: any) {\n const { offsetHeight, offsetWidth, offsetTop, offsetLeft } = viewRect;\n if (this.hasRectangleChanged(viewRect)) {\n let rectangle = this.highlightService\n .applyRotation(this.pageHeight, this.pageWidth, offsetHeight, offsetWidth, offsetTop, offsetLeft, this.rotate, this.zoom);\n rectangle = { ...this.annoRect, ...rectangle };\n this.update.emit({ ...rectangle });\n }\n }\n\n adjustForRotation(rotation: number) {\n const { top, left, height, width } = this;\n switch (rotation) {\n case 90:\n this.width = height;\n this.height = width;\n this.left = this.pageWidth - top - height;\n this.top = left;\n break;\n case 180:\n this.left = this.pageWidth - left - width;\n this.top = this.pageHeight - top - height;\n break;\n case 270:\n this.width = height;\n this.height = width;\n this.left = top;\n this.top = this.pageHeight - left - width;\n break;\n }\n }\n\n hasRectangleChanged(viewRect): boolean {\n return this.left !== viewRect.offsetLeft ||\n this.top !== viewRect.offsetTop ||\n this.width !== viewRect.offsetWidth ||\n this.height !== viewRect.offsetHeight;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { TagsModel } from '../../models/tags.model';\n\n@Injectable()\nexport class TagsServices {\n\n public tagItems: {[id: string]: TagsModel[]};\n\n constructor(private http: HttpClient) {}\n\n public getAllTags(createdBy: string): Observable<TagsModel[]> {\n const url = `/em-anno/tags/${createdBy}`;\n return this.http.get<TagsModel[]>(url);\n }\n\n // @TODO: Move everything below this to NgRx store\n getNewTags(annoid: string): TagsModel[] {\n return this.tagItems ? this.tagItems[annoid] : [];\n }\n\n updateTagItems(items: Array<TagsModel>, annoId: string) {\n const snakeCased = items.map(item => {\n return {\n ...item,\n name: this.snakeCase(item.name)\n };\n });\n\n this.tagItems = {\n ...this.tagItems,\n [annoId]: snakeCased\n };\n }\n\n private snakeCase = string => {\n // transform string_to_snake_case\n return string.replace(/ +/g, ' ') // find space\n .split(/ |\\B(?=[A-Z])/) // split it into array\n .map(word => word.toLowerCase()) // transform to lover case\n .join('_'); // trun array into sting using _\n }\n}\n","import {\n AfterContentInit,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild\n} from '@angular/core';\nimport {Comment} from './comment.model';\nimport {User} from '../../models/user.model';\nimport {Rectangle} from '../../annotation-set/annotation-view/rectangle/rectangle.model';\nimport {SelectionAnnotation} from '../../models/event-select.model';\nimport {CommentService} from './comment.service';\nimport {TagsModel} from '../../models/tags.model';\nimport {TagsServices} from '../../services/tags/tags.services';\nimport { Observable, Subscription } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport {Store} from '@ngrx/store';\nimport * as fromStore from '../../../store/reducers/reducers';\nimport * as fromSelector from '../../../store/selectors/annotation.selectors';\nimport { AnnotationSet } from '../../annotation-set/annotation-set.model';\nimport { Annotation } from '../../annotation-set/annotation-view/annotation.model';\n\n@Component({\n selector: 'mv-anno-comment',\n templateUrl: './comment.component.html'\n})\nexport class CommentComponent implements OnInit, OnDestroy, AfterContentInit {\n\n CHAR_LIMIT = 5000;\n lastUpdate: string;\n originalComment: string;\n fullComment: string;\n author: User;\n createdBy: string;\n editor: User;\n _comment: Comment;\n _editable: boolean;\n _rectangle;\n totalPrevPagesHeight = 0;\n rectTop;\n rectLeft;\n pageHeight: number;\n hasUnsavedChanges = false;\n selected: boolean;\n searchString: string;\n public tagItems: TagsModel[];\n marginToComment$: Observable<boolean> ;\n\n\n\n @Output() commentClick = new EventEmitter<SelectionAnnotation>();\n @Output() renderComments = new EventEmitter<Comment>();\n @Output() delete = new EventEmitter<Comment>();\n @Output() updated = new EventEmitter<{comment: Comment, tags: TagsModel[]}>();\n @Output() changes = new EventEmitter<boolean>();\n @Input() rotate = 0;\n @Input() zoom = 1;\n @Input() index: number;\n @Input() page: number;\n\n @ViewChild('form', {static: false}) form: ElementRef;\n @ViewChild('editableComment', {static: false}) editableComment: ElementRef<HTMLElement>;\n\n private subscriptions: Subscription;\n\n constructor(\n private store: Store<fromStore.AnnotationSetState>,\n private readonly commentService: CommentService,\n private tagsServices: TagsServices\n ) {}\n\n\n ngOnInit(): void {\n this.subscriptions = this.store.select(fromSelector.getComponentSearchText)\n .pipe(distinctUntilChanged()).subscribe(searchString => this.searchString = searchString);\n this.reRenderComments();\n this.marginToComment$ = this.commentService.marginToCommentEmitter.asObservable();\n }\n\n ngAfterContentInit(): void {\n if (this.tagItems && this.tagItems.length) {\n this.tagsServices.updateTagItems(this.tagItems, this._comment.annotationId);\n }\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n @Input()\n set comment(comment: Comment) {\n this._comment = {...comment};\n this.page = this._comment.page;\n this.lastUpdate = comment.lastModifiedDate ? comment.lastModifiedDate : comment.createdDate;\n this.author = comment.createdByDetails;\n this.createdBy = comment.createdBy;\n this.editor = comment.lastModifiedByDetails;\n this.originalComment = comment.content;\n this.fullComment = this.originalComment;\n this.selected = this._comment.selected;\n this._editable = this._comment.editable;\n this.tagItems = this._comment.tags;\n const pageMarginBottom = 10;\n this.totalPrevPagesHeight = 0;\n for (let i = 0; i < this.page - 1; i++) {\n const height = this._comment.pages[i + 1] ? this._comment.pages[i + 1].styles.height : undefined;\n if (height) {\n this.totalPrevPagesHeight += height + pageMarginBottom;\n }\n }\n\n }\n\n get comment() {\n return this._comment;\n }\n\n @Input()\n set annotation(annotation: Annotation) {\n this._rectangle = annotation.rectangles\n .reduce((prev, current) => prev.y < current.y ? prev : current);\n const actualHeight = this._comment.pages[this.page].styles.height / this.zoom;\n switch (this.rotate) {\n case 90: this.rectTop = this._rectangle.x;\n break;\n case 180: this.rectTop = actualHeight - (this._rectangle.y + this._rectangle.height);\n break;\n case 270: this.rectTop = actualHeight - (this._rectangle.x + this._rectangle.width);\n break;\n default: this.rectTop = this._rectangle.y;\n }\n this.rectLeft = this._rectangle.x;\n }\n\n get editable(): boolean {\n return this._editable;\n }\n\n onCommentChange(updatedComment) {\n this.hasUnsavedChanges =\n this.originalComment.substring(0, this.CHAR_LIMIT) !== updatedComment.substring(0, this.CHAR_LIMIT);\n this.commentService.onCommentChange(this.hasUnsavedChanges);\n }\n\n deleteOrCancel() {\n if (!this.editable) {\n this.delete.emit(this._comment);\n } else {\n this.hasUnsavedChanges = false;\n this._editable = false;\n this.fullComment = this.originalComment;\n this.changes.emit(false);\n if (!this.author && !this.fullComment) {\n this.delete.emit(this._comment);\n }\n }\n }\n\n public editOrSave() {\n if (!this.editable) {\n this._editable = true;\n } else {\n this._comment.content = this.fullComment.substring(0, this.CHAR_LIMIT);\n const tags = this.tagsServices.getNewTags(this._comment.annotationId);\n const payload = {\n comment: this._comment,\n tags\n };\n this.updated.emit(payload);\n this.hasUnsavedChanges = false;\n this._editable = false;\n this.changes.emit(false);\n }\n }\n\n onCommentClick() {\n if (!this.selected) {\n this.selected = true;\n this._editable = false;\n this.commentClick.emit({ annotationId: this._comment.annotationId, editable: this._editable, selected: true });\n }\n }\n\n reRenderComments() {\n this.renderComments.emit(this._comment);\n }\n\n get commentTop(): number {\n return this.totalPrevPagesHeight + (this.rectTop * this.zoom);\n }\n\n\n get height() {\n return this.form.nativeElement.getBoundingClientRect().height / this.zoom;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges\n} from '@angular/core';\nimport { Rectangle } from '../annotation-view/rectangle/rectangle.model';\n\n@Component({\n selector: 'mv-ctx-toolbar',\n templateUrl: './ctx-toolbar.component.html'\n})\nexport class CtxToolbarComponent implements OnChanges {\n\n readonly defaultHeight;\n readonly defaultWidth;\n\n @Input() zoom;\n @Input() rotate;\n @Input() pageHeight: number;\n @Input() pageWidth: number;\n\n @Input() canHighlight: boolean;\n @Input() canBookmark: boolean;\n @Input() canComment: boolean;\n @Input() canDelete: boolean;\n\n @Output() createHighlightEvent = new EventEmitter();\n @Output() deleteHighlightEvent = new EventEmitter();\n @Output() addOrEditCommentEvent = new EventEmitter();\n @Output() createBookmarkEvent = new EventEmitter<Rectangle>();\n\n rectangle: Rectangle;\n _rectangles: Rectangle[];\n top: number;\n left: number;\n\n constructor() {\n this.defaultHeight = 70;\n this.defaultWidth = 300;\n }\n\n ngOnChanges(changes: SimpleChanges) {\n this.setRectangle();\n this.top = this.popupTop();\n this.left = this.popupLeft();\n }\n\n @Input() set rectangles(rectangles: Rectangle[]) {\n if (rectangles) {\n this._rectangles = rectangles;\n this.setRectangle();\n }\n }\n\n get rectangles() {\n return this._rectangles;\n }\n\n createHighlight() {\n this.createHighlightEvent.emit();\n this.rectangle = undefined;\n }\n\n deleteHighlight() {\n this.deleteHighlightEvent.emit();\n }\n\n addOrEditComment() {\n this.addOrEditCommentEvent.emit();\n setTimeout(() => {\n if (!location.hash) {\n document.getElementById('viewerContainer').scrollBy(0, 1);\n }\n }, 10);\n }\n\n createBookmark() {\n this.createBookmarkEvent.emit(this.rectangle);\n this.rectangle = undefined;\n }\n\n setRectangle() {\n const rectangle = this.rectangles\n .reduce((prev, current) => prev.y < current.y ? prev : current);\n this.rectangle = { ...rectangle };\n switch (this.rotate) {\n case 90:\n this.rectangle.width = rectangle.height;\n this.rectangle.height = rectangle.width;\n this.rectangle.x = (this.pageWidth / this.zoom) - rectangle.y - rectangle.height;\n this.rectangle.y = rectangle.x;\n break;\n case 180:\n this.rectangle.x = (this.pageWidth / this.zoom) - rectangle.x - rectangle.width;\n this.rectangle.y = (this.pageHeight / this.zoom) - rectangle.y - rectangle.height;\n break;\n case 270:\n this.rectangle.width = rectangle.height;\n this.rectangle.height = rectangle.width;\n this.rectangle.x = rectangle.y;\n this.rectangle.y = (this.pageHeight / this.zoom) - rectangle.x - rectangle.width;\n break;\n }\n }\n\n popupTop() {\n const popupTop = this.rectangle.y * this.zoom - this.defaultHeight;\n return popupTop <= 0 ? this.defaultHeight : popupTop;\n }\n\n popupLeft() {\n const popupLeft = (this.rectangle.x + (this.rectangle.width / 2)) * this.zoom - (this.defaultWidth / 2);\n if (popupLeft <= 0) {\n return 0;\n } else if (popupLeft >= this.pageWidth - this.defaultWidth) {\n return this.pageWidth - this.defaultWidth;\n } else {\n return popupLeft;\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CommentComponent } from './comment/comment.component';\n\n@Injectable()\nexport class CommentSetRenderService {\n\n redrawComponents(commentComponents: CommentComponent[], pageHeights: any[], rotate: number, zoom: number) {\n let prevComment: CommentComponent;\n this.sortComponents(commentComponents, pageHeights, rotate, zoom).forEach((comment: CommentComponent) => {\n this.adjustIfOverlapping(comment, prevComment, zoom);\n prevComment = comment;\n });\n }\n\n sortComponents(commentComponents: CommentComponent[], pageHeights: any[], rotate: number, zoom: number) {\n return commentComponents.sort((a: CommentComponent, b: CommentComponent) => {\n a.rectTop = this.top(a._rectangle, pageHeights[a.page - 1], rotate, zoom);\n b.rectTop = this.top(b._rectangle, pageHeights[b.page - 1], rotate, zoom);\n return this.processSort(a, b);\n });\n }\n\n private adjustIfOverlapping(comment: CommentComponent, prevComment: CommentComponent, zoom: number): void {\n if (prevComment) {\n const endOfPrevComment = prevComment.commentTop + this.height(prevComment);\n if (comment.commentTop <= endOfPrevComment) {\n comment.rectTop = (endOfPrevComment - comment.totalPrevPagesHeight) / zoom;\n }\n }\n }\n\n private processSort(a: CommentComponent, b: CommentComponent): number {\n if (this.onSameLine(a, b)) {\n return a.rectLeft >= b.rectLeft ? 1 : -1;\n }\n return a.commentTop >= b.commentTop ? 1 : -1;\n }\n\n private onSameLine(a: CommentComponent, b: CommentComponent): boolean {\n return this.difference(a.commentTop, b.commentTop) === 0;\n }\n\n private top(rectangle: { x, y, height, width }, height: number, rotate: number, zoom: number) {\n const actualHeight = height / zoom;\n switch (rotate) {\n case 90: return rectangle.x;\n case 180: return actualHeight - (rectangle.y + rectangle.height);\n case 270: return actualHeight - (rectangle.x + rectangle.width);\n default: return rectangle.y;\n }\n }\n\n private height(element: any) {\n return element.form.nativeElement.getBoundingClientRect().height;\n }\n\n private difference(a: number, b: number): number { return Math.abs(a - b); }\n}\n","import {\n Component,\n ElementRef,\n Input, OnChanges,\n OnDestroy,\n OnInit,\n QueryList, SimpleChanges,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { select, Store } from '@ngrx/store';\n\nimport { AnnotationSet } from '../annotation-set/annotation-set.model';\nimport { Annotation } from '../annotation-set/annotation-view/annotation.model';\nimport { Comment } from './comment/comment.model';\nimport { CommentComponent } from './comment/comment.component';\nimport { CommentService } from './comment/comment.service';\nimport { CommentSetRenderService } from './comment-set-render.service';\nimport * as fromStore from '../../store/reducers/reducers';\nimport * as fromActions from '../../store/actions/annotation.actions';\nimport * as fromSelectors from '../../store/selectors/annotation.selectors';\nimport { TagsModel } from '../models/tags.model';\nimport { SelectionAnnotation } from '../models/event-select.model';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\n\n@Component({\n selector: 'mv-comment-set',\n templateUrl: './comment-set.component.html',\n })\nexport class CommentSetComponent implements OnInit, OnDestroy, OnChanges {\n\n @Input() annotationSet: AnnotationSet;\n @Input() zoom: number;\n @Input() rotate: number;\n @Input() height: number;\n @Input() pageHeights = [];\n @Input() contentScrollTop: number;\n\n comments: Comment[];\n tags: TagsModel[];\n private subscriptions: Subscription[] = [];\n public comments$: Observable<Annotation[]>;\n public annoEntities$: Observable<{ [id: string]: Annotation }>;\n\n @ViewChild('container', {static: false}) container: ElementRef<HTMLDivElement>;\n @ViewChild('panel', {static: false}) panel: ElementRef<HTMLDivElement>;\n @ViewChildren('commentComponent') commentComponents: QueryList<CommentComponent>;\n\n showCommentsPanel: boolean;\n\n constructor(private store: Store<fromStore.AnnotationSetState>,\n private readonly commentService: CommentService,\n private readonly renderService: CommentSetRenderService,\n private readonly toolbarEvents: ToolbarEventService) {\n this.clearSelection();\n }\n\n ngOnInit() {\n this.comments$ = this.store.pipe(select(fromSelectors.getCommentsArray));\n this.annoEntities$ = this.store.pipe(select(fromSelectors.getAnnotationEntities));\n this.subscriptions.push(\n this.toolbarEvents.commentsPanelVisible.subscribe(toggle => {\n this.redrawComments();\n this.showCommentsPanel = toggle;\n })\n );\n this.subscriptions.push(this.toolbarEvents.rotateSubject.subscribe(rotate => this.rotateDocument()));\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.annotationSet) {\n this.commentService.setCommentSet(this);\n }\n if (changes.contentScrollTop) {\n if (this.container) {\n this.container.nativeElement.scrollTo(0, this.contentScrollTop);\n }\n }\n }\n\n ngOnDestroy() {\n if (this.subscriptions.length > 0) {\n this.subscriptions.forEach(subscription => subscription.unsubscribe());\n }\n }\n\n public onSelect(annotationId: SelectionAnnotation) {\n this.store.dispatch(new fromActions.SelectedAnnotation(annotationId));\n }\n\n public onCommentDelete(comment: Comment) {\n const annotation = this.annotationSet.annotations.find(anno => anno.id === comment.annotationId);\n const comments = [];\n const annot = {\n ...annotation,\n comments\n };\n this.onAnnotationUpdate(annot);\n this.redrawComments();\n }\n\n redrawComments() {\n setTimeout(() => {\n const componentList: CommentComponent[] = this.commentComponents.map(comment => comment);\n this.renderService.redrawComponents(componentList, this.pageHeights, this.rotate, this.zoom);\n }, 0);\n }\n\n private rotateDocument() {\n if (this.panel) {\n this.panel.nativeElement.style.height = '0';\n }\n }\n\n public onCommentUpdate(payload: {comment: Comment, tags: TagsModel[]} ) {\n const annotation = this.annotationSet.annotations.find(anno => anno.id === payload.comment.annotationId);\n const comments = [payload.comment];\n const tags = payload.tags;\n const annot = {\n ...annotation,\n comments,\n tags\n };\n this.onAnnotationUpdate(annot);\n }\n\n public onAnnotationUpdate(annotation: Annotation) {\n this.store.dispatch(new fromActions.SaveAnnotation(annotation));\n }\n\n onContainerClick(e) {\n if (e.path && e.path[0] === this.panel.nativeElement) {\n this.clearSelection();\n }\n }\n\n clearSelection() {\n this.store.dispatch(new fromActions.SelectedAnnotation({ annotationId: '', editable: false, selected: false}));\n }\n\n allCommentsSaved() {\n this.commentService.allCommentsSaved();\n }\n}\n","import { AfterContentChecked, Directive, ElementRef, HostListener } from '@angular/core';\n\n@Directive({\n selector: '[mvTextAreaAutoExpand]'\n})\nexport class TextareaAutoExpandDirective implements AfterContentChecked {\n\n constructor(private el: ElementRef) {\n }\n\n ngAfterContentChecked(): void {\n this.adjustHeight();\n }\n\n @HostListener('input') onMouseDown() {\n this.adjustHeight();\n }\n\n adjustHeight(): void {\n const nativeElement = this.el.nativeElement;\n nativeElement.style.overflow = 'hidden';\n nativeElement.style.height = 'auto';\n nativeElement.style.height = nativeElement.scrollHeight - 5 + 'px';\n }\n\n}\n","import {Component, Input, ViewChild, ElementRef, OnInit, OnDestroy} from '@angular/core';\nimport { FormBuilder, FormControl, FormGroup } from '@angular/forms';\nimport { combineLatest, Observable, Subscription } from 'rxjs';\nimport {select, Store} from '@ngrx/store';\n\nimport { PrintService } from '../../print.service';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\nimport * as fromSelectors from '../../store/selectors/annotation.selectors';\nimport * as fromStore from '../../store/reducers/reducers';\nimport * as fromAnnoActions from '../../store/actions/annotation.actions';\nimport * as fromTagSelectors from '../../store/selectors/tag.selectors';\n\n@Component({\n selector: 'mv-comments-summary',\n templateUrl: './comments-summary.component.html',\n})\nexport class CommentsSummaryComponent implements OnInit, OnDestroy {\n\n @Input() title: string;\n @Input() contentType: string;\n @ViewChild('outerContainer', {static: true}) container: ElementRef;\n @ViewChild('commentContainer', {static: false}) commentsTable: ElementRef;\n public comments$: Observable<any>;\n public filtersFg: FormGroup;\n private $subscriptions: Subscription;\n allTags$: Observable<{key: string; length: number}[]>;\n showFilters = false;\n hasFilter = false;\n\n constructor(\n private store: Store<fromStore.AnnotationSetState>,\n private readonly printService: PrintService,\n private readonly toolbarEvents: ToolbarEventService,\n private fb: FormBuilder\n ) {}\n\n ngOnInit(): void {\n this.filtersFg = this.fb.group({\n dateRangeFrom: new FormGroup({\n day: new FormControl(''),\n month: new FormControl(''),\n year: new FormControl('')\n }),\n dateRangeTo: new FormGroup({\n day: new FormControl(''),\n month: new FormControl(''),\n year: new FormControl('')\n }),\n tagFilters: this.fb.group({}),\n });\n this.comments$ = this.store.pipe(select(fromSelectors.getCommentSummary));\n this.buildCheckBoxForm();\n this.container.nativeElement.focus();\n }\n\n buildCheckBoxForm() {\n this.filtersFg.reset();\n const checkboxes = <FormGroup>this.filtersFg.get('tagFilters');\n const filters$ = this.store.pipe(select(fromSelectors.getCommentSummaryFilters));\n this.allTags$ = this.store.pipe(select(fromTagSelectors.getAllTagsArr));\n this.$subscriptions = combineLatest([this.allTags$, filters$]).subscribe(([tags, filters]) => {\n this.hasFilter = filters.hasFilter;\n tags.forEach((val) => {\n const checkBoxValue = (filters.filters.tagFilters &&\n filters.filters.tagFilters.hasOwnProperty(val.key)) ?\n filters.filters.tagFilters[val.key] : false;\n checkboxes.addControl(val.key, new FormControl(checkBoxValue));\n });\n this.filtersFg.updateValueAndValidity();\n });\n }\n\n onClearFilters() {\n this.store.dispatch(new fromAnnoActions.ClearCommentSummaryFilters());\n this.buildCheckBoxForm();\n }\n\n onFilter() {\n const { value } = this.filtersFg;\n const hasDateFrom = (value.dateRangeFrom.year && value.dateRangeFrom.month && value.dateRangeFrom.day);\n const hasDateTo = (value.dateRangeTo.year && value.dateRangeTo.month && value.dateRangeTo.day);\n const dateRangeFrom = hasDateFrom ?\n new Date(value.dateRangeFrom.year, value.dateRangeFrom.month - 1, value.dateRangeFrom.day).getTime() : null;\n const dateRangeTo = hasDateTo ?\n new Date(value.dateRangeTo.year, value.dateRangeTo.month - 1, value.dateRangeTo.day).getTime() : null;\n this.store.dispatch(new fromAnnoActions.ApplyCommentSymmaryFilter({...value, dateRangeFrom, dateRangeTo}));\n }\n\n onFiltersToggle() {\n this.showFilters = !this.showFilters;\n }\n\n public onClose(): void {\n this.toolbarEvents.toggleCommentsSummary(false);\n }\n\n public onPrint(): void {\n this.printService.printElementNatively(this.commentsTable.nativeElement, 1000, 900);\n }\n\n navigateToPage(pageNumber: number) {\n if (this.contentType === 'pdf') {\n this.toolbarEvents.setPage(pageNumber);\n }\n this.toolbarEvents.toggleCommentsSummary(false);\n this.toolbarEvents.toggleCommentsPanel(true);\n }\n\n ngOnDestroy(): void {\n this.$subscriptions.unsubscribe();\n }\n}\n","import { Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';\nimport { v4 as uuid } from 'uuid';\nimport { Subscription } from 'rxjs';\nimport { ToolbarEventService } from '../../../../toolbar/toolbar.module';\nimport { Rectangle } from '../../annotation-view/rectangle/rectangle.model';\nimport { HighlightCreateService } from '../highlight-create/highlight-create.service';\n\n@Component({\n selector: 'mv-box-highlight-create',\n templateUrl: './box-highlight-create.component.html',\n})\nexport class BoxHighlightCreateComponent implements OnInit, OnDestroy {\n\n @Input() page: number;\n @Input() pageHeight: number;\n @Input() pageWidth: number;\n @Input() rotate: number;\n @Input() zoom: number;\n @Input() container: { top: number, left: number };\n\n @Output() saveSelection = new EventEmitter<{ rectangles: Rectangle[], page: number }>();\n\n @ViewChild('boxHighlight', { static: false }) highlight: ElementRef;\n\n drawStartX = -1;\n drawStartY = -1;\n top: number;\n left: number;\n height: number;\n width: number;\n display: string;\n drawMode: boolean;\n defaultHeight: string;\n defaultWidth: string;\n position: string;\n backgroundColor = 'none';\n wholePage: boolean;\n\n private subscriptions: Subscription[] = [];\n\n constructor(private readonly toolbarEvents: ToolbarEventService,\n private readonly highlightService: HighlightCreateService) { }\n\n ngOnInit(): void {\n this.subscriptions = [\n this.toolbarEvents.drawModeSubject.subscribe(drawMode => {\n this.defaultHeight = drawMode ? '100%' : '0px';\n this.defaultWidth = drawMode ? '100%' : '0px';\n }),\n this.toolbarEvents.redactWholePage.subscribe(() => {\n this.wholePage = true;\n })\n ];\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach(subscription => {\n subscription.unsubscribe();\n });\n }\n\n initHighlight({ offsetX, offsetY }) {\n if (this.wholePage) {\n this.highlightPage();\n return;\n }\n this.position = 'absolute';\n this.backgroundColor = 'yellow';\n this.drawStartX = offsetX;\n this.drawStartY = offsetY;\n\n this.display = 'block';\n this.height = 50;\n this.width = 50;\n\n this.top = this.drawStartY;\n this.left = this.drawStartX;\n\n switch (this.rotate) {\n case 90:\n this.top = this.drawStartY - this.height;\n break;\n case 180:\n this.top = this.drawStartY - this.height;\n this.left = this.drawStartX - this.width;\n break;\n case 270:\n this.left = this.drawStartX - this.width;\n break;\n }\n }\n\n updateHighlight({ currentTarget, clientX, clientY }) {\n const rect = currentTarget.getBoundingClientRect(),\n offsetX = clientX - rect.left,\n offsetY = clientY - rect.top;\n if (this.drawStartX > 0 && this.drawStartY > 0) {\n this.height = Math.abs(offsetY - this.drawStartY);\n this.width = Math.abs(offsetX - this.drawStartX);\n this.top = Math.min(offsetY, this.drawStartY);\n this.left = Math.min(offsetX, this.drawStartX);\n }\n }\n\n createHighlight() {\n if (this.height / this.zoom > 5 || this.width / this.zoom > 5) {\n let rectangle = this.highlightService\n .applyRotation(this.pageHeight, this.pageWidth, this.height, this.width, this.top, this.left, this.rotate, this.zoom);\n rectangle = { id: uuid(), ...rectangle } as any;\n this.saveSelection.emit({ rectangles: [rectangle], page: this.page });\n this.resetHighlight();\n }\n }\n\n private resetHighlight() {\n this.drawStartX = -1;\n this.drawStartY = -1;\n this.display = 'none';\n this.width = 0;\n this.height = 0;\n this.wholePage = false;\n }\n\n private highlightPage() {\n this.height = this.pageHeight;\n this.width = this.pageWidth;\n this.top = 0;\n this.left = 0;\n this.createHighlight();\n }\n}\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewEncapsulation } from '@angular/core';\nimport { Annotation } from '../../annotation-set/annotation-view/annotation.model';\nimport { select, Store } from '@ngrx/store';\nimport * as fromStore from '../../../store/reducers/reducers';\nimport * as fromTagSelectors from '../../../store/selectors/tag.selectors';\nimport * as fromAnnoSelector from '../../../store/selectors/annotation.selectors';\nimport { combineLatest, Subscription } from 'rxjs';\nimport { ToolbarEventService } from '../../../toolbar/toolbar-event.service';\nimport { CommentService } from '../comment/comment.service';\n\n@Component({\n selector: 'mv-comment-set-header',\n templateUrl: './comment-set-header.component.html',\n encapsulation: ViewEncapsulation.None,\n})\nexport class CommentSetHeaderComponent implements OnInit, OnDestroy {\n\n @Input() public showCommentSummary: boolean;\n @Output() public readonly showCommentSummaryDialog = new EventEmitter();\n\n marginToComment: boolean;\n tabs: {isFiltered?: boolean; label: string}[] = [];\n tabSelected = '';\n isFiltered: boolean;\n navigationList: Annotation[];\n $subscriptions: Subscription;\n\n constructor(private store: Store<fromStore.State>,\n private commentService: CommentService,\n public toolbarEvents: ToolbarEventService) {}\n\n ngOnInit(): void {\n const tagFilter$ = this.store.pipe(select(fromTagSelectors.getTagFilters));\n const filteredAnnotation$ = this.store.pipe(select(fromAnnoSelector.getFilteredAnnotations));\n\n this.$subscriptions = combineLatest([tagFilter$, filteredAnnotation$]).subscribe(([formData, filteredAnno]) => {\n this.navigationList = filteredAnno;\n this.tabs = this.navigationList.length > 0 ?\n [{label: 'comments'}, {label: 'filter'}, {label: 'search'}] : [{label: 'comments'}];\n this.isFiltered = !formData.length;\n this.tabs = [...this.tabs].map((tab) => {\n return !this.isFiltered && tab.label === 'filter' ? {...tab, isFiltered: true} : {...tab, isFiltered: false};\n });\n });\n }\n\n public toggleCommentsSummary(): void {\n this.showCommentSummaryDialog.emit();\n }\n\n selectTab(tab: string) {\n this.tabSelected = tab !== this.tabSelected ? tab : undefined;\n if (this.tabSelected) {\n this.marginToComment = true;\n this.commentService.createMarginToCommentEvent(this.marginToComment);\n } else {\n this.marginToComment = false;\n this.commentService.createMarginToCommentEvent(this.marginToComment);\n }\n }\n\n public toggleCommentsPanel() {\n this.toolbarEvents.toggleCommentsPanel(!this.toolbarEvents.commentsPanelVisible.getValue());\n }\n\n ngOnDestroy(): void {\n this.$subscriptions.unsubscribe();\n }\n}\n","import { AfterViewInit, Component, ElementRef, Input, OnDestroy, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { Annotation } from '../../../annotation-set/annotation-view/annotation.model';\nimport { Store } from '@ngrx/store';\nimport * as fromStore from '../../../../store/reducers/reducers';\nimport * as fromActions from '../../../../store/actions/annotation.actions';\n\n@Component({\n selector: 'mv-comment-search',\n templateUrl: './comment-search.component.html',\n encapsulation: ViewEncapsulation.None\n})\nexport class CommentSearchComponent implements AfterViewInit, OnDestroy {\n\n @Input() public readonly annotations: Annotation[];\n\n @ViewChild('searchInput', {static: false}) searchInput: ElementRef<HTMLInputElement>;\n\n searchString: string;\n searchResults: Annotation[] = [];\n searchIndex = 0;\n\n constructor(private store: Store<fromStore.AnnotationSetState>) {}\n\n ngAfterViewInit(): void {\n if (this.searchInput) {\n this.searchInput.nativeElement.focus();\n }\n }\n\n ngOnDestroy(): void {\n // TODO workaround for tab error\n setTimeout(() => {this.store.dispatch(new fromActions.SearchComment('')); }, 250);\n }\n\n searchComments(searchText: string): void {\n this.clearSearch();\n if (searchText.length > 2) {\n this.searchString = searchText;\n this.searchResults = this.annotations\n .filter(annotation => annotation.comments.length > 0)\n .filter(annotation =>\n annotation.comments[0].content.toLowerCase().includes(this.searchString.toLowerCase()));\n if (this.searchResults.length > 0) {\n this.store.dispatch(new fromActions.SearchComment(searchText));\n }\n }\n }\n\n clearSearch() {\n this.searchString = undefined;\n this.searchResults = [];\n this.searchIndex = 0;\n this.store.dispatch(new fromActions.SearchComment(''));\n }\n}\n","import { AfterViewChecked, Directive, ElementRef, Input } from '@angular/core';\n\n@Directive({\n selector: '[mvTextHighlight]'\n})\nexport class TextHighlightDirective implements AfterViewChecked {\n\n @Input() textToHighlight: string;\n\n constructor(private element: ElementRef<HTMLElement>) {}\n\n ngAfterViewChecked(): void {\n if (this.textToHighlight) {\n this.highlightInputText(this.textToHighlight);\n }\n }\n\n highlightInputText(textToHighlight: string) {\n this.resetHighlight();\n this.textToHighlight = textToHighlight;\n const searchPattern = new RegExp(textToHighlight, 'gi');\n const hostElement = this.element.nativeElement;\n if (hostElement.innerHTML.match(searchPattern)) {\n hostElement.innerHTML = hostElement.innerHTML\n .replace(searchPattern, this.highlightPattern('$&'));\n }\n this.textToHighlight = undefined;\n }\n\n resetHighlight() {\n const hostElement = this.element.nativeElement;\n const searchPattern = new RegExp(this.highlightPattern('(.*?)'), 'gi');\n while (hostElement.innerHTML.match(searchPattern)) {\n const matchGroups = searchPattern.exec(hostElement.innerHTML);\n if (matchGroups) {\n hostElement.innerHTML = hostElement.innerHTML.replace(matchGroups[0], matchGroups[1]);\n }\n }\n }\n\n private highlightPattern(dynamicText: string) {\n return '<span class=\"mvTextHighlight\">' + dynamicText + '</span>';\n }\n}\n","import {Component, Input, ViewEncapsulation} from '@angular/core';\nimport {TagsModel} from '../models/tags.model';\nimport {TagsServices} from '../services/tags/tags.services';\nimport {FormControl} from '@angular/forms';\nimport {Observable} from 'rxjs';\n\n@Component({\n selector: 'mv-tags',\n templateUrl: './tags.component.html',\n encapsulation: ViewEncapsulation.None\n})\nexport class TagsComponent {\n @Input() tagItems: TagsModel[];\n @Input() userId: string;\n @Input() editable: boolean;\n @Input() annoId: string;\n\n public validators = [this.minLength, this.maxLength20];\n public errorMessages: {[id: string]: string} = {\n 'minLength': 'Minimum of 2 characters',\n 'maxLength20': 'Maximum of 20 characters'\n };\n\n constructor(private tagsServices: TagsServices) {}\n\n onUpdateTags(value) {\n this.tagsServices.updateTagItems(value, this.annoId);\n }\n\n public requestAutocompleteItems = (text: string): Observable<any[]> => {\n return this.tagsServices.getAllTags(this.userId);\n }\n\n private minLength(control: FormControl) {\n if (control.value.length < 2) {\n return {\n 'minLength': true\n };\n }\n return null;\n }\n\n private maxLength20(control: FormControl) {\n if (control.value.length >= 20) {\n return {\n 'maxLength20': true\n };\n }\n return null;\n }\n}\n","import { Component, Input, OnChanges, SimpleChanges, ViewEncapsulation } from '@angular/core';\nimport { Rectangle } from '../../annotation-set/annotation-view/rectangle/rectangle.model';\nimport { Annotation } from '../../annotation-set/annotation-view/annotation.model';\nimport {Store} from '@ngrx/store';\nimport * as fromStore from '../../../store/reducers/reducers';\nimport * as fromActions from '../../../store/actions/annotation.actions';\nimport {ToolbarEventService} from '../../../toolbar/toolbar-event.service';\n\n@Component({\n selector: 'mv-comments-navigate',\n templateUrl: './comments-navigate.component.html',\n encapsulation: ViewEncapsulation.None\n})\nexport class CommentsNavigateComponent implements OnChanges {\n\n @Input() public annotationList: Annotation[];\n @Input() autoSelect = false;\n\n navigationList: any[] = [];\n index = 0;\n\n constructor(private store: Store<fromStore.AnnotationSetState>, public readonly toolbarEvents: ToolbarEventService) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.annotationList) {\n this.initNavigationList();\n }\n }\n\n initNavigationList(): void {\n this.index = 0;\n this.navigationList = [...this.annotationList || []]\n .map(annotation => ({\n content: annotation.comments[0].content,\n annotationId: annotation.id,\n page: annotation.page,\n rectangle: this.upperRectangle(annotation.rectangles),\n }))\n .sort(this.sortComments);\n\n if (this.autoSelect) {\n this.toolbarEvents.setPage(Number.parseInt(this.navigationList[0].page, 0));\n this.store.dispatch(new fromActions.SelectedAnnotation({\n annotationId: this.navigationList[0].annotationId,\n editable: false,\n selected: true\n }));\n }\n }\n\n sortComments(mappedCommentA, mappedCommentB) {\n if (mappedCommentA.page !== mappedCommentB.page) {\n return mappedCommentA.page - mappedCommentB.page;\n } else {\n const rectA = mappedCommentA.rectangle;\n const rectB = mappedCommentB.rectangle;\n if (rectA.y !== rectB.y) {\n return rectA.y - rectB.y;\n } else {\n return rectA.x - rectB.x;\n }\n }\n }\n\n nextItem() {\n this.index += 1;\n if (this.index === this.annotationList.length) {\n this.index = 0;\n }\n\n this.toolbarEvents.setPage(Number.parseInt(this.navigationList[this.index].page, 0));\n this.store.dispatch(new fromActions.SelectedAnnotation({\n annotationId: this.navigationList[this.index].annotationId, editable: false, selected: true\n }));\n }\n\n\n prevItem() {\n this.index -= 1;\n if (this.index < 0) {\n this.index = this.navigationList.length - 1;\n }\n this.toolbarEvents.setPage(Number.parseInt(this.navigationList[this.index].page, 0));\n this.store.dispatch(new fromActions.SelectedAnnotation({\n annotationId: this.navigationList[this.index].annotationId,\n editable: false,\n selected: true\n }));\n }\n\n upperRectangle(rectangles: Rectangle[]) {\n [...rectangles].sort((rect1, rect2) => rect1.y - rect2.y);\n return { x: rectangles[0].x, y: rectangles[0].y };\n }\n}\n","import {Component, OnDestroy, OnInit, ViewEncapsulation} from '@angular/core';\n\nimport {select, Store} from '@ngrx/store';\nimport * as fromStore from '../../../../store/reducers/reducers';\nimport * as fromSelectors from '../../../../store/selectors/tag.selectors';\nimport * as fromActions from '../../../../store/actions/tag.actions';\nimport {Observable, Subscription} from 'rxjs';\nimport {FormGroup, FormBuilder, FormControl} from '@angular/forms';\nimport {auditTime, tap} from 'rxjs/operators';\n\n\n@Component({\n selector: 'mv-comment-filter',\n templateUrl: './comment-filter.component.html',\n encapsulation: ViewEncapsulation.None\n})\nexport class CommentFilterComponent implements OnInit, OnDestroy {\n tagGroup: FormGroup;\n $subscriptions: Subscription;\n filter$: Observable<string[]>;\n allTags$: Observable<any>;\n searchValue: string;\n isPreview = false;\n constructor(\n private store: Store<fromStore.State>,\n private fb: FormBuilder) {}\n\n ngOnInit(): void {\n this.tagGroup = this.fb.group({\n 'tagFilters': this.fb.group({}),\n });\n this.filter$ = this.store.pipe(select(fromSelectors.getTagFilters));\n this.$subscriptions = this.tagGroup.valueChanges.pipe(auditTime(5)).subscribe(value => {\n const tagFilters = value['tagFilters'];\n this.store.dispatch(new fromActions.AddFilterTags(tagFilters));\n });\n this.buildFrom();\n\n }\n\n buildFrom() {\n const checkboxes = <FormGroup>this.tagGroup.get('tagFilters');\n this.allTags$ = this.store.pipe(select(fromSelectors.getAllTagsArr)).pipe(tap(tags => {\n this.tagGroup.reset();\n tags.forEach((value) => {\n checkboxes.addControl(value.key, new FormControl(false));\n });\n }));\n }\n\n onClearFilters() {\n this.tagGroup.reset();\n this.store.dispatch(new fromActions.ClearFilterTags());\n }\n\n ngOnDestroy(): void {\n this.$subscriptions.unsubscribe();\n }\n\n onRemoveFilter(tagName) {\n const checkboxes = <FormGroup>this.tagGroup.get('tagFilters');\n checkboxes.controls[tagName].setValue(false);\n }\n\n onToggleFilterView() {\n this.isPreview = !this.isPreview;\n }\n\n\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport moment from 'moment-timezone';\n/**\n * A moment timezone pipe to support parsing based on time zone abbreviations\n * covers all cases of offset variation due to daylight saving.\n *\n * Same API as DatePipe with additional timezone abbreviation support\n * Official date pipe dropped support for abbreviations names from Angular V5\n */\n@Pipe({\n name: 'momentDate'\n})\nexport class MomentDatePipe extends DatePipe implements PipeTransform {\n\n transform(\n value: string | Date,\n format: string = 'mediumDate',\n timezone: string = 'Europe/London'\n ): any {\n const timezoneOffset = moment(value).tz(timezone).format('Z');\n return super.transform(value, format, timezoneOffset);\n }\n}\n","import { Observable } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { map } from 'rxjs/operators';\nimport { Bookmark } from '../../../viewers/pdf-viewer/side-bar/bookmarks/bookmarks.interfaces';\n\n@Injectable()\nexport class BookmarksApiService {\n\n private readonly ANNOTATIONS_API = '/em-anno';\n\n constructor(\n private readonly httpClient: HttpClient\n ) {}\n\n public getBookmarks(documentId: string): Observable<any> {\n return this.httpClient\n .get(`${this.ANNOTATIONS_API}/${documentId}/bookmarks`,\n { observe: 'response' , withCredentials: true });\n }\n\n public createBookmark(bookmark: Partial<Bookmark>): Observable<Bookmark> {\n return this.httpClient\n .post<Bookmark>(`${this.ANNOTATIONS_API}/bookmarks`,\n bookmark, { observe: 'response' , withCredentials: true })\n .pipe(map(response => response.body));\n }\n\n public updateBookmark(bookmark: Partial<Bookmark>): Observable<Bookmark> {\n return this.httpClient\n .put<Bookmark>(`${this.ANNOTATIONS_API}/bookmarks`,\n bookmark, { observe: 'response' , withCredentials: true })\n .pipe(map(response => response.body));\n }\n\n public updateMultipleBookmarks(bookmarks: Partial<Bookmark[]>): Observable<Bookmark[]> {\n return this.httpClient\n .put<Bookmark[]>(`${this.ANNOTATIONS_API}/bookmarks_multiple`,\n bookmarks, { observe: 'response' , withCredentials: true })\n .pipe(map(response => response.body));\n }\n\n public deleteBookmark(bookmarkId: string): Observable<void> {\n return this.httpClient\n .delete<void>(`${this.ANNOTATIONS_API}/bookmarks/${bookmarkId}`,\n { observe: 'response' , withCredentials: true })\n .pipe(map(response => response.body));\n }\n\n public deleteMultipleBookmarks(payload: { deleted: string[], updated: Bookmark }): Observable<void> {\n return this.httpClient\n .request<void>('DELETE', `${this.ANNOTATIONS_API}/bookmarks_multiple`,\n { body: payload, observe: 'response' , withCredentials: true })\n .pipe(map(response => response.body));\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'filter'\n})\nexport class FilterPipe implements PipeTransform {\n\n transform(items: any[], searchText: string, fieldName: string): any[] {\n\n if (!items) {\n return [];\n }\n\n if (!searchText) {\n return items;\n }\n\n return items.filter(item => {\n if (item) {\n if (item[fieldName]) {\n return item[fieldName].toLowerCase().includes(searchText.toLowerCase());\n } else {\n return item.toLowerCase().includes(searchText.toLowerCase());\n }\n }\n return false;\n });\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'unsnake'\n})\nexport class UnsnakePipe implements PipeTransform {\n\n transform(items: string): string {\n return items.split('_').join(' ');\n }\n\n}\n","import {Component, Input} from '@angular/core';\n/*\n* Gov UK Date Component\n* Responsible for displaying 3 input fields:\n* day / month / year\n* displaying errorMessage messages\n* */\n@Component({\n selector: 'mv-gov-uk-date',\ntemplateUrl: './gov-uk-date.component.html'\n})\nexport class GovUkDateComponent {\n @Input() config: { id: string; legend: string };\n @Input() errorMessage: {isInvalid: boolean; messages: string[]};\n @Input() formGroup;\n}\n","import {Component, Directive, Input} from '@angular/core';\n/*\n* Gov UK Error Message\n* Responsible for displaying in-line error messages\n* @prop config - obj with properties\n* @prop errorMessage - all error bject with messages property that is arry of strings.\n* */\n@Component({\n selector: ' mv-gov-uk-error-message',\n template: `\n <span class=\"govuk-error-message\" [id]=\"config.id + '-error'\" *ngFor=\"let message of errorMessage?.messages\">\n <span class=\"govuk-visually-hidden\">Error:</span>{{message}}\n </span>\n `\n})\nexport class GovUkErrorMessageComponent {\n constructor () { }\n @Input() config: { id: string };\n @Input() errorMessage;\n}\n","/**\n * Helper Class\n * Used for dynamic templates manipulation\n * */\n\nexport class HtmlTemplatesHelper {\n\n static setDescribedBy(errorMessage, config) {\n if (!errorMessage) {\n return config.hint ? `${config.id}-hint` : null;\n } else if (errorMessage && errorMessage.isInvalid) {\n return config.hint ? `${config.id}-hint ${config.id}-error` : `${config.id}-error`;\n } else {\n return config.hint ? `${config.id}-hint` : null;\n }\n }\n}\n","import {Component, Input} from '@angular/core';\nimport {HtmlTemplatesHelper} from '../util/helpers/html-templates.helper';\n/*\n* Gov Uk Fieldset Component\n* Used to wrap group fieldset elements\n* it can conditionally display h1 tag\n* @param config\n* @param isHeading\n* @param errorMessage - used for aria tag\n* */\n@Component({\n selector: 'mv-gov-uk-fieldset',\n template: `\n <fieldset class=\"govuk-fieldset\" [attr.aria-describedby]=\"setDescribedBy()\">\n <legend [class]=\"config.classes + ' govuk-fieldset__legend'\" *ngIf=\"!isHeading\">\n {{config.legend}}\n </legend>\n\n <legend [class]=\"config.classes + ' govuk-fieldset__legend'\" *ngIf=\"isHeading\">\n <h1>{{config.legend}}</h1>\n </legend>\n\n <span [id]=\"config.id+'-hint'\" class=\"govuk-hint\" *ngIf=\"config.hint\">\n {{config.hint}}\n </span>\n <ng-content></ng-content>\n </fieldset>\n `\n})\nexport class GovUkFieldsetComponent {\n @Input() config: {legend: string; classes: string, id: string, hint: string, key: string};\n @Input() isHeading: boolean;\n @Input() errorMessage: string[];\n\n setDescribedBy(): string {\n return HtmlTemplatesHelper.setDescribedBy(this.errorMessage, this.config);\n }\n}\n","import {Component, Input} from '@angular/core';\n\n/*\n* Gov UK Label component\n* Responsible for displaying label tag\n* @prop isPageHading - boolean to display h1\n* @prop config - obj with properties\n* */\n@Component({\n selector: 'mv-gov-label',\n template: `<h1 *ngIf=\"config.isPageHeading else noHeading\">\n <label *ngIf=\"config.label\" [class]=\"config.classes + ' govuk-label'\"\n [for]=\"config.id\" [innerHTML]=\"config.label\">\n </label>\n </h1>\n <ng-template #noHeading>\n <label *ngIf=\"config.label\" [class]=\"config.classes + ' govuk-label'\"\n [for]=\"config.id\" [innerHTML]=\"config.label\">\n </label>\n </ng-template>\n `\n})\nexport class GovUkLabelComponent {\n constructor () { }\n @Input() config: { label: string, name: string; id: string, isPageHeading, classes: string };\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {GovUkDateComponent} from './gov-uk-date/gov-uk-date.component';\nimport {GovUkErrorMessageComponent} from './gov-uk-error-message/gov-uk-error-message.component';\nimport {GovUkFieldsetComponent} from './gov-uk-fieldset/gov-uk-fieldset.component';\nimport {GovUkLabelComponent} from './gov-uk-label/gov-uk-label.component';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {RouterModule} from '@angular/router';\n\n\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n RouterModule\n ],\n declarations: [\n GovUkDateComponent,\n GovUkErrorMessageComponent,\n GovUkFieldsetComponent,\n GovUkLabelComponent\n\n ],\n exports: [\n GovUkDateComponent,\n GovUkErrorMessageComponent,\n GovUkFieldsetComponent,\n GovUkLabelComponent\n ]\n})\nexport class SharedModule {}\n","import { createSelector } from '@ngrx/store';\n\nimport * as fromFeature from '../reducers/reducers';\nimport * as fromBookmarks from '../reducers/bookmarks.reducer';\nimport { generateBookmarkNodes } from '../bookmarks-store-utils';\nimport * as fromDocument from './document.selectors';\n\nexport const getBookmarkState = createSelector(\n fromFeature.getMVState,\n (state: fromFeature.State) => state.bookmarks\n);\n\nexport const getBookmarkPages = createSelector(\n getBookmarkState,\n fromBookmarks.getBookmarkPageEnt\n);\n\nexport const getBookmarkEntities = createSelector(\n getBookmarkState,\n fromBookmarks.getBookmarkEnts\n);\n\nexport const getBookmarkNodes = createSelector(\n getBookmarkEntities,\n (entities) => generateBookmarkNodes(entities)\n);\n\nexport const getEditableBookmark = createSelector(\n getBookmarkState,\n fromBookmarks.getEditBookmark\n);\n\nexport const getBookmarkInfo = createSelector(\n getBookmarkNodes,\n fromDocument.getDocumentId,\n fromDocument.getPdfPosition,\n fromDocument.getPages,\n (bookmarkNodes, docId, pdfPosition, pages) => {\n return {\n pageNumber: pdfPosition.pageNumber - 1,\n xCoordinate: pdfPosition.left,\n yCoordinate: ((pages[pdfPosition.pageNumber].styles.height)\n - (pdfPosition.top * (pages[pdfPosition.pageNumber].viewportScale)))\n / parseFloat(pages[pdfPosition.pageNumber].scaleRotation.scale),\n previous: bookmarkNodes.length > 0 ? bookmarkNodes.sort((a, b) => a.index - b.index)[bookmarkNodes.length - 1].id : undefined,\n documentId: docId\n };\n }\n);\n\nexport const getBookmarksPerPage = createSelector(\n fromDocument.getPages,\n getBookmarkPages,\n (pages, pageEnt) => {\n if (pages && pageEnt) {\n const arr = [];\n Object.keys(pages).forEach(key => {\n const pageIdx = Number(key) - 1; // -1 as the thisPages array is 0 indexed\n const thisPage = pageEnt[pageIdx];\n arr.push({\n bookmark: thisPage ? thisPage : [],\n styles: pages[key].styles\n });\n });\n return arr;\n }\n }\n);\n","import { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { select, Store } from '@ngrx/store';\nimport { v4 as uuid } from 'uuid';\n\nimport * as fromStore from '../../../store/reducers/reducers';\nimport * as fromDocument from '../../../store/selectors/document.selectors';\nimport * as fromSelectors from '../../../store/selectors/annotation.selectors';\nimport { HighlightCreateService } from '../annotation-create/highlight-create/highlight-create.service';\nimport { Rectangle } from '../annotation-view/rectangle/rectangle.model';\nimport { CreateBookmark } from '../../../store/actions/bookmark.actions';\nimport * as fromBookmarks from '../../../store/selectors/bookmark.selectors';\nimport { ToolbarEventService } from '../../../toolbar/toolbar-event.service';\nimport { Highlight, ViewerEventService } from '../../../viewers/viewer-event.service';\n\n@Component({\n selector: 'mv-metadata-layer',\n templateUrl: './metadata-layer.component.html'\n})\nexport class MetadataLayerComponent implements OnInit, OnDestroy {\n\n @Input() zoom: number;\n @Input() rotate: number;\n\n pages: any[] = []; // todo add type\n annoPages$: Observable<any>; // todo add type\n\n drawMode = false;\n highlightPage: number;\n rectangles: Rectangle[];\n\n private $subscriptions: Subscription;\n\n constructor(\n private store: Store<fromStore.AnnotationSetState>,\n private readonly highlightService: HighlightCreateService,\n private readonly toolbarEvents: ToolbarEventService,\n private readonly viewerEvents: ViewerEventService) { }\n\n ngOnInit(): void {\n this.$subscriptions = this.store.pipe(select(fromDocument.getPages))\n .subscribe(pages => this.pages = Object.values(pages));\n this.annoPages$ = this.store.pipe(select(fromSelectors.getPageEntities));\n\n this.$subscriptions\n .add(this.toolbarEvents.drawModeSubject.subscribe(drawMode => this.drawMode = drawMode))\n .add(this.viewerEvents.textHighlight.subscribe(highlight => this.showContextToolbar(highlight)))\n .add(this.viewerEvents.ctxToolbarCleared.subscribe(() => this.clearContextToolbar()));\n }\n\n ngOnDestroy(): void {\n this.$subscriptions.unsubscribe();\n }\n\n showContextToolbar(highlight: Highlight) {\n this.highlightPage = highlight.page;\n this.rectangles = highlight.rectangles;\n if (this.rectangles) {\n this.toolbarEvents.highlightModeSubject.next(false);\n }\n }\n\n clearContextToolbar() {\n this.rectangles = undefined;\n }\n\n createHighlight() {\n this.highlightService.saveAnnotation(this.rectangles, this.highlightPage);\n this.highlightService.resetHighlight();\n this.rectangles = undefined;\n }\n\n createBookmark(rectangle: Rectangle) {\n this.store.pipe(select(fromBookmarks.getBookmarkInfo), take(1))\n .subscribe((bookmarkInfo) => {\n const selection = window.getSelection().toString();\n this.store.dispatch(new CreateBookmark({\n ...bookmarkInfo,\n name: selection.length > 0 ? selection.substr(0, 30) : 'new bookmark',\n id: uuid(),\n pageNumber: this.highlightPage - 1,\n xCoordinate: rectangle.x,\n yCoordinate: rectangle.y\n } as any));\n this.toolbarEvents.toggleSideBar(true);\n this.toolbarEvents.toggleSideBarView(false);\n this.highlightService.resetHighlight();\n this.rectangles = undefined;\n\n });\n }\n\n saveAnnotation({ rectangles, page }: { rectangles: Rectangle[], page: any }) {\n this.highlightService.saveAnnotation(rectangles, page);\n this.toolbarEvents.drawModeSubject.next(false);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport { HttpClientModule } from '@angular/common/http';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport { RouterModule } from '@angular/router';\n\nimport { MutableDivModule } from 'mutable-div';\nimport { TagInputModule } from 'ngx-chips';\nimport {NgxDatatableModule} from '@swimlane/ngx-datatable';\n\nimport { AnnotationApiService } from './services/annotation-api/annotation-api.service';\nimport { AnnotationViewComponent } from './annotation-set/annotation-view/annotation-view.component';\nimport { AnnotationSetComponent } from './annotation-set/annotation-set.component';\nimport { RectangleComponent } from './annotation-set/annotation-view/rectangle/rectangle.component';\nimport { CommentComponent } from './comment-set/comment/comment.component';\nimport { CtxToolbarComponent } from './annotation-set/ctx-toolbar/ctx-toolbar.component';\nimport { CommentSetComponent } from './comment-set/comment-set.component';\nimport { TextareaAutoExpandDirective } from './comment-set/comment/textarea-auto-expand/textarea-auto-expand.directive';\nimport { CommentsSummaryComponent } from './comments-summary/comments-summary.component';\nimport { CommentSetRenderService } from './comment-set/comment-set-render.service';\nimport { BoxHighlightCreateComponent } from './annotation-set/annotation-create/box-highlight-create/box-highlight-create.component';\nimport { HighlightCreateService } from './annotation-set/annotation-create/highlight-create/highlight-create.service';\nimport { CommentSetHeaderComponent } from './comment-set/comment-set-header/comment-set-header.component';\nimport { CommentSearchComponent } from './comment-set/comment-set-header/comment-search/comment-search.component';\nimport { TextHighlightDirective } from './comment-set/comment/text-highlight/text-highlight.directive';\nimport { TagsComponent } from './tags/tags.component';\nimport { TagsServices } from './services/tags/tags.services';\nimport { CommentsNavigateComponent } from './comment-set/comment-navigate/comments-navigate.component';\nimport {CommentFilterComponent} from './comment-set/comment-set-header/comment-filter/comment-filter.component';\nimport {MomentDatePipe} from './pipes/date/date.pipe';\nimport { BookmarksApiService } from './services/bookmarks-api/bookmarks-api.service';\nimport {FilterPipe} from './pipes/filter/filter.pipe';\nimport {UnsnakePipe} from './pipes/unsnake/unsnake.pipe';\nimport {SharedModule} from '../shared/shared.module';\nimport { MetadataLayerComponent } from './annotation-set/metadata-layer/metadata-layer.component';\nimport { CommentService } from './comment-set/comment/comment.service';\n\n@NgModule({\n imports: [\n A11yModule,\n CommonModule,\n FormsModule,\n HttpClientModule,\n MutableDivModule,\n TagInputModule,\n RouterModule,\n ReactiveFormsModule,\n NgxDatatableModule,\n SharedModule\n ],\n declarations: [\n MetadataLayerComponent,\n AnnotationViewComponent,\n BoxHighlightCreateComponent,\n AnnotationSetComponent,\n RectangleComponent,\n CommentComponent,\n CommentSetHeaderComponent,\n CommentSearchComponent,\n TextHighlightDirective,\n CtxToolbarComponent,\n CommentSetComponent,\n CommentsNavigateComponent,\n TextareaAutoExpandDirective,\n CommentsSummaryComponent,\n TagsComponent,\n MomentDatePipe,\n CommentFilterComponent,\n FilterPipe,\n UnsnakePipe\n ],\n entryComponents: [\n AnnotationViewComponent,\n AnnotationSetComponent,\n CommentSetComponent\n ],\n providers: [\n AnnotationApiService,\n BookmarksApiService,\n CommentSetRenderService,\n HighlightCreateService,\n CommentService,\n TagsServices\n ],\n exports: [\n AnnotationViewComponent,\n BoxHighlightCreateComponent,\n AnnotationSetComponent,\n CommentSetComponent,\n CommentSetHeaderComponent,\n CommentSearchComponent,\n CommentsSummaryComponent,\n TagsComponent,\n CommentFilterComponent,\n MomentDatePipe,\n FilterPipe,\n UnsnakePipe,\n MetadataLayerComponent\n ]\n})\nexport class AnnotationsModule { }\n","import { Directive, ElementRef, HostListener, Input } from '@angular/core';\n\n\n@Directive({\n selector: '[mvGrabNDrag]'\n})\nexport class GrabNDragDirective {\n\n originalPosition: { left: number; top: number };\n private pointerDown = false;\n\n @Input() dragEnabled = false;\n @Input() dragX: Element;\n\n constructor(private el: ElementRef) {\n }\n\n @HostListener('pointerdown', ['$event'])\n onPointerDown(event: PointerEvent) {\n if (this.dragEnabled) {\n event.preventDefault();\n this.pointerDown = true;\n this.originalPosition = {\n left: event.clientX + this.el.nativeElement.scrollLeft,\n top: event.clientY + this.el.nativeElement.scrollTop,\n };\n }\n }\n\n @HostListener('window:pointermove', ['$event'])\n onPointerMove(event: PointerEvent) {\n if (this.pointerDown && this.dragEnabled) {\n event.preventDefault();\n const scrollDiff = {\n left: this.originalPosition.left - (event.clientX + this.el.nativeElement.scrollLeft),\n top: this.originalPosition.top - (event.clientY + this.el.nativeElement.scrollTop)\n };\n if (this.dragEnabled) {\n this.dragX.scrollLeft += scrollDiff.left;\n this.el.nativeElement.scrollTop += scrollDiff.top;\n }\n }\n }\n\n @HostListener('window:pointerup') onWindowPointerUp() {\n this.pointerDown = false;\n }\n}\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core';\nimport { select, Store } from '@ngrx/store';\nimport { Subscription } from 'rxjs';\nimport { TreeComponent, TreeNode } from '@circlon/angular-tree-component';\n\nimport { CreateBookmark, DeleteBookmark, MoveBookmark, UpdateBookmark } from '../../../../store/actions/bookmark.actions';\nimport { Bookmark } from '../../../../store/models/bookmarks.interface';\nimport * as bookmarksSelectors from '../../../../store/selectors/bookmark.selectors';\nimport { AnnotationSetState } from '../../../../store/reducers/annotations.reducer';\nimport { DocumentPages } from '../../../../store/reducers/document.reducer';\nimport * as fromDocument from '../../../../store/selectors/document.selectors';\nimport * as fromBookmarks from '../../../../store/reducers/bookmarks.reducer';\nimport { getBookmarkChildren } from '../../../../store/bookmarks-store-utils';\nimport { take } from 'rxjs/operators';\nimport uuid from 'uuid';\n\n@Component({\n selector: 'mv-bookmarks',\n templateUrl: './bookmarks.component.html'\n})\nexport class BookmarksComponent implements OnInit, OnDestroy {\n\n @Input() bookmarkNodes: Bookmark[];\n @Input() zoom: number;\n @Input() rotate: number;\n @Output() goToDestination = new EventEmitter<any[]>();\n\n pageLookup: { [pageId: number]: DocumentPages } = {};\n editableBookmark: string;\n BOOKMARK_CHAR_LIMIT = 30;\n\n options = {\n allowDrag: true,\n allowDrop: true\n };\n\n $subscription: Subscription;\n\n @ViewChild(TreeComponent)\n tree: TreeComponent;\n\n private sortMode: string;\n\n private readonly _customSort = 'CUSTOM';\n private readonly _positionSort = 'POSITION';\n\n constructor(private store: Store<fromBookmarks.BookmarksState | AnnotationSetState>) { }\n\n ngOnInit(): void {\n this.sortMode = this.customSort;\n this.$subscription = this.store.pipe(select(bookmarksSelectors.getEditableBookmark))\n .subscribe(editableId => this.editableBookmark = editableId);\n this.$subscription.add(this.store.select(fromDocument.getPages)\n .subscribe(pages => {\n\n Object.keys(pages).map(key => {\n this.pageLookup[key] = pages[key];\n });\n\n }));\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.bookmarkNodes && this.sortMode !== this.customSort) {\n this.sortBookmarks();\n }\n }\n\n ngOnDestroy(): void {\n this.$subscription.unsubscribe();\n }\n\n editBookmark(id) {\n this.editableBookmark = id;\n }\n\n onAddBookmarkClick() {\n this.store.pipe(select(bookmarksSelectors.getBookmarkInfo), take(1))\n .subscribe((bookmarkInfo) => {\n this.store.dispatch(new CreateBookmark({\n ...bookmarkInfo, name: '', id: uuid()\n } as any));\n });\n }\n\n onBookmarkMove({ node, from, to }: any) {\n let movedBookmarks = [{\n ...node,\n previous: to.index > 0 ? to.parent.children[to.index - 1].id : undefined,\n parent: to.parent.documentId ? to.parent.id : undefined\n }];\n let fromNext = this.getSibling(from, from.index);\n fromNext = fromNext && fromNext.id === node.previous ? this.getSibling(from, from.index + 1) : fromNext;\n if (fromNext) {\n movedBookmarks = [...movedBookmarks, { ...fromNext, previous: node.previous }];\n }\n const toNext = this.getSibling(to, to.index + 1);\n if (toNext) {\n movedBookmarks = [...movedBookmarks, { ...toNext, previous: node.id }];\n }\n this.store.dispatch(new MoveBookmark(movedBookmarks));\n }\n\n deleteBookmark(node: TreeNode) {\n this.customSortBookmarks();\n let next: Bookmark;\n node = this.tree.treeModel.getNodeById(node.id);\n if (!node.parent) {\n node.parent = this.tree.treeModel.virtualRoot;\n }\n const siblings = node.parent.children;\n if (siblings.length > node.index + 1) {\n next = siblings[node.index + 1].data;\n next.previous = node.data.previous;\n }\n this.store.dispatch(new DeleteBookmark({\n deleted: [node.data.id, ...getBookmarkChildren(node.data.children)], updated: next\n }));\n }\n\n updateBookmark(bookmark: Bookmark, name) {\n const editedBookmark = {\n ...bookmark,\n name\n };\n if (name) {\n this.store.dispatch(new UpdateBookmark(editedBookmark));\n this.editableBookmark = undefined;\n }\n }\n\n goToBookmark(bookmark: Bookmark) {\n const thisPage = this.pageLookup[bookmark.pageNumber + 1];\n const defaultHeight = thisPage.styles.height;\n const defaultScaleY = this.scaledY(bookmark.yCoordinate, defaultHeight, thisPage);\n\n let top = 0, left = 0;\n switch (this.rotate) {\n case 90:\n left = - defaultScaleY;\n break;\n case 180:\n top = this.scaledY(bookmark.yCoordinate, (defaultHeight - (24 * this.zoom)), thisPage);\n break;\n case 270:\n left = defaultScaleY;\n break;\n default:\n top = defaultScaleY;\n }\n\n this.goToDestination.emit([\n bookmark.pageNumber,\n { 'name': 'XYZ' },\n left,\n top\n ]);\n }\n\n get customSort() {\n return this._customSort;\n }\n\n get positionSort() {\n return this._positionSort;\n }\n\n sort(mode: string) {\n this.sortMode = mode;\n this.sortBookmarks();\n }\n\n private sortBookmarks() {\n switch (this.sortMode) {\n case this.customSort: {\n this.customSortBookmarks();\n break;\n }\n case this.positionSort: {\n this.positionSortBookmarks();\n break;\n }\n default: {\n this.customSortBookmarks();\n break;\n }\n }\n }\n\n private positionSortBookmarks() {\n this.bookmarkNodes.sort((a, b) => a.pageNumber === b.pageNumber ? a.yCoordinate - b.yCoordinate : a.pageNumber - b.pageNumber);\n this.tree.treeModel.update();\n this.setDragNDrop(false);\n }\n\n private customSortBookmarks() {\n this.bookmarkNodes.sort((a, b) => a.index - b.index);\n this.tree.treeModel.update();\n this.setDragNDrop(true);\n }\n\n private setDragNDrop(enabled: boolean) {\n this.options = {\n allowDrag: enabled,\n allowDrop: enabled\n };\n }\n\n\n private getSibling(node, index) {\n return node.parent.children.length > index ? node.parent.children[index] : undefined;\n }\n\n private scaledY(yCoordinate: number, height: number, page: DocumentPages): number {\n const viewportScale = page.viewportScale / this.zoom;\n return ((height / this.zoom) - yCoordinate) / viewportScale;\n }\n}\n","import { Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, ViewChild } from '@angular/core';\nimport { Outline } from './outline-item/outline.model';\nimport { Observable, Subscription } from 'rxjs';\nimport { select, Store } from '@ngrx/store';\nimport * as bookmarksSelectors from '../../../store/selectors/bookmark.selectors';\nimport { BookmarkNode } from '../../../store/models/bookmarks.interface';\nimport { CreateBookmark, LoadBookmarks } from '../../../store/actions/bookmark.actions';\nimport { take } from 'rxjs/operators';\nimport { v4 as uuid } from 'uuid';\nimport { ViewerEventService } from '../../viewer-event.service';\nimport { BookmarksState } from '../../../store/reducers/bookmarks.reducer';\nimport { ToolbarEventService } from '../../../toolbar/toolbar-event.service';\nimport { BookmarksComponent } from './bookmarks/bookmarks.component';\n\n@Component({\n selector: 'mv-side-bar',\n templateUrl: './side-bar.component.html'\n})\nexport class SideBarComponent implements OnInit, OnChanges, OnDestroy {\n\n @Input() annotationsEnabled: boolean;\n @Input() outline: Outline;\n @Input() url: string;\n @Input() zoom: number;\n @Input() rotate: number;\n @Input() currentPageNumber: number;\n\n @ViewChild(BookmarksComponent)\n bookmarks: BookmarksComponent;\n\n selectedView = 'outline';\n bookmarkNodes$: Observable<BookmarkNode[]>;\n\n private subscriptions: Subscription[] = [];\n\n constructor(private viewerEvents: ViewerEventService,\n private store: Store<BookmarksState>,\n private readonly toolbarEvents: ToolbarEventService\n ) { }\n\n ngOnInit(): void {\n this.bookmarkNodes$ = this.store.pipe(select(bookmarksSelectors.getBookmarkNodes));\n this.subscriptions.push(this.store.pipe(select(bookmarksSelectors.getEditableBookmark))\n .subscribe(editable => this.selectedView = editable ? 'bookmarks' : this.selectedView));\n this.subscriptions.push(\n this.toolbarEvents.sidebarOutlineView.subscribe(toggle => {\n this.selectedView = toggle ? 'outline' : 'bookmarks';\n })\n ); }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.url && this.url) {\n this.store.dispatch(new LoadBookmarks());\n }\n }\n\n ngOnDestroy(): void {\n if (this.subscriptions.length > 0) {\n this.subscriptions.forEach(subscription => subscription.unsubscribe());\n }\n }\n\n goToDestination(destination: any[]) {\n this.viewerEvents.goToDestination(destination);\n }\n\n toggleSidebarView(sidebarView: string) {\n this.selectedView = sidebarView;\n }\n\n isViewedItem(current: Outline, next: Outline): boolean {\n if (current.pageNumber === this.currentPageNumber) {\n return true;\n }\n return next === undefined ? current.pageNumber <= this.currentPageNumber :\n current.pageNumber <= this.currentPageNumber && (next.pageNumber > this.currentPageNumber);\n }\n\n findEndPage(next: Outline): number {\n return next === undefined ? Number.MAX_SAFE_INTEGER : next.pageNumber;\n }\n}\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { Outline } from './outline.model';\n\n@Component({\n selector: 'mv-outline-item',\n templateUrl: './outline-item.component.html'\n})\nexport class OutlineItemComponent implements OnInit {\n\n @Input() outline: Outline;\n @Input() currentPageNumber: Number;\n @Input() isCurrentSection: boolean;\n @Input() endPage: Number;\n @Output() navigationEvent = new EventEmitter();\n\n showOutlineItems: boolean;\n\n ngOnInit() {\n this.showOutlineItems = true;\n }\n\n goToDestination(destination: any) {\n if (destination) {\n this.navigationEvent.emit(destination);\n }\n }\n\n toggleOutline() {\n this.showOutlineItems = !this.showOutlineItems;\n }\n\n isViewedItem(current: Outline, next: Outline): boolean {\n if (current.pageNumber === this.currentPageNumber) {\n return true;\n }\n return next === undefined ? current.pageNumber <= this.currentPageNumber && this.endPage > this.currentPageNumber :\n current.pageNumber <= this.currentPageNumber && (next.pageNumber > this.currentPageNumber);\n }\n\n findEndPage(next: Outline): number {\n return next === undefined ? Number.MAX_SAFE_INTEGER : next.pageNumber;\n }\n\n showHighlightOutlineCss() {\n return this.isCurrentSection ? 'highlightedOutlineItem' : 'outlineItem';\n }\n}\n","import { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { select, Store } from '@ngrx/store';\nimport { v4 as uuid } from 'uuid';\nimport { filter, take } from 'rxjs/operators';\n\nimport { Rectangle } from '../../annotations/annotation-set/annotation-view/rectangle/rectangle.model';\nimport * as fromStore from '../../store/reducers/reducers';\nimport * as fromSelectors from '../../store/selectors/redaction.selectors';\nimport * as fromRedaSelectors from '../../store/selectors/redaction.selectors';\nimport * as fromDocument from '../../store/selectors/document.selectors';\nimport * as fromActions from '../../store/actions/redaction.actions';\nimport * as fromRedactionActions from '../../store/actions/redaction.actions';\nimport * as fromRedaActions from '../../store/actions/redaction.actions';\nimport { SelectionAnnotation } from '../../annotations/models/event-select.model';\nimport { ToolbarEventService } from '../../toolbar/toolbar.module';\nimport { ViewerEventService } from '../../viewers/viewer-event.service';\nimport { Redaction } from '../services/redaction.model';\n\n@Component({\n selector: 'mv-redactions',\n templateUrl: './redaction.component.html'\n})\nexport class RedactionComponent implements OnInit, OnDestroy {\n\n @Input() zoom: number;\n @Input() rotate: number;\n\n redactionsPerPage$: Observable<any>; // todo add type\n selectedRedaction$: Observable<SelectionAnnotation | {}>;\n rectangles: Rectangle[];\n drawMode: boolean;\n documentId: string;\n\n private $subscription: Subscription;\n\n constructor(private store: Store<fromStore.State>,\n private readonly viewerEvents: ViewerEventService,\n private toolbarEvents: ToolbarEventService) { }\n\n ngOnInit(): void {\n this.redactionsPerPage$ = this.store.pipe(select(fromSelectors.getRedactionsPerPage));\n this.selectedRedaction$ = this.store.pipe(select(fromSelectors.getSelected));\n this.$subscription = this.toolbarEvents.drawModeSubject.subscribe(drawMode => this.drawMode = drawMode);\n this.$subscription.add(this.store.pipe(select(fromSelectors.getRedactedDocumentInfo), filter(value => !!value))\n .subscribe(redactedDocInfo => this.downloadDocument(redactedDocInfo)));\n this.$subscription.add(this.store.pipe(select(fromDocument.getDocumentId)).subscribe(docId => this.documentId = docId));\n this.$subscription.add(this.viewerEvents.textHighlight.subscribe(highlight => this.markTextRedaction(highlight)));\n this.toolbarEvents.applyRedactToDocument.subscribe(() => {\n this.store.pipe(select(fromRedaSelectors.getRedactionArray), take(1)).subscribe(redactions => {\n this.store.dispatch(new fromRedaActions.Redact(redactions));\n });\n });\n this.toolbarEvents.clearAllRedactMarkers.subscribe(() => {\n this.store.dispatch(new fromRedaActions.UnmarkAll(this.documentId));\n });\n }\n\n ngOnDestroy(): void {\n this.$subscription.unsubscribe();\n }\n\n markTextRedaction(highlight) {\n const redactionHighlight = highlight.rectangles;\n if (redactionHighlight && redactionHighlight.length) {\n this.saveRedaction(highlight.page, [...redactionHighlight]);\n }\n this.toolbarEvents.highlightModeSubject.next(false);\n }\n\n markBoxRedaction({ rectangles, page }) {\n this.saveRedaction(page, rectangles);\n this.toolbarEvents.drawModeSubject.next(false);\n }\n\n saveRedaction(page: number, rectangles: Rectangle[]) {\n const redaction = { page, rectangles, redactionId: uuid(), documentId: this.documentId };\n this.store.dispatch(new fromRedactionActions.SaveRedaction(redaction));\n }\n\n onMarkerDelete(event) {\n this.store.dispatch(new fromActions.DeleteRedaction(event));\n }\n\n selectRedaction(event) {\n this.store.dispatch(new fromActions.SelectRedaction(event));\n }\n\n onMarkerUpdate(redaction: Redaction) {\n this.store.dispatch(new fromActions.SaveRedaction(redaction));\n }\n\n downloadDocument({ blob, filename }) {\n if (navigator && navigator.msSaveBlob) {\n navigator.msSaveBlob(blob, filename);\n } else {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n document.body.appendChild(a);\n a.setAttribute('style', 'display: none');\n a.href = url;\n a.download = filename;\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n }\n this.store.dispatch(new fromRedactionActions.ResetRedactedDocument());\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { map } from 'rxjs/operators';\nimport { Observable } from 'rxjs';\nimport { IcpSession } from './icp.interfaces';\n\n@Injectable()\nexport class IcpSessionApiService {\n\n public ICP_SESSION_API = '/icp/sessions';\n\n constructor(private readonly httpClient: HttpClient) {}\n\n public loadSession(caseId: string): Observable<any> {\n return this.httpClient\n .get<{username: string, session: IcpSession}>(`${this.ICP_SESSION_API}/${caseId}`,\n { observe: 'response' , withCredentials: true })\n .pipe(map(response => response.body));\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Actions, Effect, ofType } from '@ngrx/effects';\nimport {catchError, exhaustMap, map, switchMap} from 'rxjs/operators';\nimport { of } from 'rxjs';\nimport {AnnotationApiService} from '../../annotations/services/annotation-api/annotation-api.service';\nimport * as annotationsActions from '../actions/annotation.actions';\n\n@Injectable()\nexport class AnnotationEffects {\n constructor(\n private actions$: Actions,\n private annotationApiService: AnnotationApiService,\n ) { }\n\n @Effect()\n loadAnnotation$ = this.actions$.pipe(\n ofType(annotationsActions.LOAD_ANNOTATION_SET),\n map((action: annotationsActions.LoadAnnotationSet) => action.payload),\n switchMap((documentId) => {\n return this.annotationApiService.getAnnotationSet(documentId).pipe(\n map(res => {\n if (res.status === 204) {\n return new annotationsActions.LoadAnnotationSetFail(res);\n }\n return new annotationsActions.LoadAnnotationSetSucess(res);\n }),\n catchError(error => {\n return of(new annotationsActions.LoadAnnotationSetFail(error));\n }));\n }));\n\n @Effect()\n postAnnotation$ = this.actions$.pipe(\n ofType(annotationsActions.SAVE_ANNOTATION),\n map((action: annotationsActions.SaveAnnotation) => action.payload),\n exhaustMap((annotation) => {\n return this.annotationApiService.postAnnotation(annotation).pipe(\n map(annotations => {\n return new annotationsActions.SaveAnnotationSuccess(annotations);\n }),\n catchError(error => {\n return of(new annotationsActions.LoadAnnotationSetFail(error));\n }));\n }));\n\n @Effect()\n deleteAnnotation$ = this.actions$.pipe(\n ofType(annotationsActions.DELETE_ANNOTATION),\n map((action: annotationsActions.DeleteAnnotation) => action.payload),\n exhaustMap((annotation) => {\n return this.annotationApiService.deleteAnnotation(annotation).pipe(\n map(result => {\n return new annotationsActions.DeleteAnnotationSuccess(annotation);\n }),\n catchError(error => {\n return of(new annotationsActions.DeleteAnnotationFail(error));\n }));\n }));\n}\n","import { Injectable } from '@angular/core';\nimport { Actions, Effect, ofType } from '@ngrx/effects';\nimport { catchError, exhaustMap, map, switchMap, withLatestFrom } from 'rxjs/operators';\nimport { of } from 'rxjs';\nimport { BookmarksApiService } from '../../annotations/services/bookmarks-api/bookmarks-api.service';\nimport * as bookmarksActions from '../actions/bookmark.actions';\nimport { select, Store } from '@ngrx/store';\nimport * as fromDocument from '../selectors/document.selectors';\nimport * as fromBookmarks from '../reducers/bookmarks.reducer';\nimport * as fromStore from '../reducers/reducers';\n\n@Injectable()\nexport class BookmarksEffects {\n\n constructor(private actions$: Actions,\n private store: Store<fromStore.AnnotationSetState|fromBookmarks.BookmarksState>,\n private bookmarksApiService: BookmarksApiService) {}\n\n @Effect()\n loadBookmarks$ = this.actions$.pipe(\n ofType(bookmarksActions.LOAD_BOOKMARKS),\n withLatestFrom(this.store.pipe(select(fromDocument.getDocumentId))),\n map(([, documentId]) => documentId),\n exhaustMap((documentId) =>\n this.bookmarksApiService.getBookmarks(documentId)\n .pipe(\n map(res => new bookmarksActions.LoadBookmarksSuccess(res)),\n catchError(err => of(new bookmarksActions.LoadBookmarksFailure(err)))\n )\n ));\n\n @Effect()\n createBookmark$ = this.actions$.pipe(\n ofType(bookmarksActions.CREATE_BOOKMARK),\n map((action: bookmarksActions.CreateBookmark) => action.payload),\n exhaustMap((bookmark) =>\n this.bookmarksApiService.createBookmark(bookmark)\n .pipe(\n map(bmrk => new bookmarksActions.CreateBookmarkSuccess(bmrk)),\n catchError(error => of(new bookmarksActions.CreateBookmarkFailure(error)))\n )\n ));\n\n @Effect()\n moveBookmark$ = this.actions$.pipe(\n ofType(bookmarksActions.MOVE_BOOKMARK),\n map((action: bookmarksActions.MoveBookmark) => action.payload),\n exhaustMap((bookmarks) =>\n this.bookmarksApiService.updateMultipleBookmarks(bookmarks)\n .pipe(\n map(bmrks => new bookmarksActions.MoveBookmarkSuccess(bmrks)),\n catchError(error => of(new bookmarksActions.MoveBookmarkFailure(error)))\n )\n ));\n\n @Effect()\n deleteBookmark$ = this.actions$.pipe(\n ofType(bookmarksActions.DELETE_BOOKMARK),\n map((action: bookmarksActions.DeleteBookmark) => action.payload),\n exhaustMap(({ deleted, updated }) =>\n this.bookmarksApiService.deleteMultipleBookmarks({ deleted, updated })\n .pipe(\n switchMap(() => {\n if (updated) {\n return [\n new bookmarksActions.DeleteBookmarkSuccess(deleted),\n new bookmarksActions.UpdateBookmarkSuccess(updated)\n ];\n } else {\n return [new bookmarksActions.DeleteBookmarkSuccess(deleted)];\n }\n }),\n catchError(error => of(new bookmarksActions.DeleteBookmarkFailure(error)))\n )\n ));\n\n @Effect()\n updateBookmark$ = this.actions$.pipe(\n ofType(bookmarksActions.UPDATE_BOOKMARK),\n map((action: bookmarksActions.UpdateBookmark) => action.payload),\n switchMap((bookmark) =>\n this.bookmarksApiService.updateBookmark(bookmark)\n .pipe(\n map(bmrk => new bookmarksActions.UpdateBookmarkSuccess(bmrk)),\n catchError(error => of(new bookmarksActions.UpdateBookmarkFailure(error)))\n )\n ));\n}\n","import { Observable } from 'rxjs';\nimport { HttpClient, HttpResponse } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { catchError, map } from 'rxjs/operators';\nimport { BulkRedaction, Redaction } from './redaction.model';\n\n@Injectable()\nexport class RedactionApiService {\n\n private markupsApiUrl = '/api/markups';\n private redactApiUrl = '/api/redaction';\n private markupsSearchApiUrl = '/api/markups/search';\n constructor(\n private readonly httpClient: HttpClient\n ) { }\n\n public getRedactions(documentId: string): Observable<HttpResponse<Redaction[]>> {\n const fixedUrl = `${this.markupsApiUrl}/${documentId}`;\n return this.httpClient\n .get<Redaction[]>(fixedUrl, { observe: 'response', withCredentials: true });\n }\n\n public saveRedaction(body): Observable<Redaction> {\n return this.httpClient\n .post<Redaction>(this.markupsApiUrl, body, { observe: 'response', withCredentials: true })\n .pipe(\n map(response => response.body),\n catchError(() => [])\n );\n }\n\n public saveBulkRedaction(body): Observable<BulkRedaction> {\n return this.httpClient\n .post<BulkRedaction>(this.markupsSearchApiUrl, body, { observe: 'response', withCredentials: true })\n .pipe(\n map(response => response.body),\n catchError(() => [])\n );\n }\n\n public deleteRedaction(payload): Observable<null> {\n const url = `${this.markupsApiUrl}/${payload.documentId}/${payload.redactionId}`;\n return this.httpClient\n .delete<null>(url, { observe: 'response', withCredentials: true })\n .pipe(map(response => response.body));\n }\n\n public deleteAllMarkers(documentId): Observable<null> {\n const url = `${this.markupsApiUrl}/${documentId}`;\n\n return this.httpClient\n .delete<null>(url, { observe: 'response', withCredentials: true })\n .pipe(map(response => response.body));\n }\n\n public redact(payload): Observable<HttpResponse<Blob>> {\n return this.httpClient\n .post<Blob>(this.redactApiUrl, payload, { observe: 'response', withCredentials: true, responseType: 'blob' as 'json' })\n .pipe(\n map(response => response),\n catchError(() => [])\n );\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { Actions, Effect, ofType } from '@ngrx/effects';\nimport { catchError, exhaustMap, map, switchMap, tap } from 'rxjs/operators';\nimport { of } from 'rxjs';\nimport { RedactionApiService } from '../../redaction/services/redaction-api.service';\nimport * as redactionActions from '../actions/redaction.actions';\nimport { HttpResponse } from '@angular/common/http';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\n\n@Injectable()\nexport class RedactionEffects {\n constructor(\n private actions$: Actions,\n private redactionApiService: RedactionApiService,\n private toolbarEvents: ToolbarEventService\n ) { }\n\n @Effect()\n loadRedactions$ = this.actions$.pipe(\n ofType(redactionActions.LOAD_REDACTIONS),\n map((action: redactionActions.LoadRedactions) => action.payload),\n switchMap((documentId) => {\n return this.redactionApiService.getRedactions(documentId).pipe(\n map(resp => {\n return new redactionActions.LoadRedactionSuccess(resp.body);\n }),\n catchError(error => {\n return of(new redactionActions.LoadRedactionFailure(error));\n }));\n }));\n\n @Effect()\n saveRedaction$ = this.actions$.pipe(\n ofType(redactionActions.SAVE_REDACTION),\n map((action: redactionActions.SaveRedaction) => action.payload),\n exhaustMap((redaction) => {\n return this.redactionApiService.saveRedaction(redaction).pipe(\n map(resp => {\n return new redactionActions.SaveRedactionSuccess(resp);\n }),\n catchError(error => {\n return of(new redactionActions.SaveRedactionFailure(error));\n }));\n }));\n\n @Effect()\n saveBulkRedaction$ = this.actions$.pipe(\n ofType(redactionActions.SAVE_BULK_REDACTION),\n map((action: redactionActions.SaveRedaction) => action.payload),\n exhaustMap((redaction) => {\n return this.redactionApiService.saveBulkRedaction(redaction).pipe(\n tap(() => this.toolbarEvents.redactAllInProgressSubject.next(false))).pipe(map(resp => {\n return new redactionActions.SaveBulkRedactionSuccess(resp);\n }),\n catchError(error => {\n return of(new redactionActions.SaveBulkRedactionFailure(error));\n }));\n }));\n\n @Effect()\n deleteRedaction$ = this.actions$.pipe(\n ofType(redactionActions.DELETE_REDACTION),\n map((action: redactionActions.DeleteRedaction) => action.payload),\n exhaustMap((redactionPayload) => {\n return this.redactionApiService.deleteRedaction(redactionPayload).pipe(\n map(() => {\n return new redactionActions.DeleteRedactionSuccess(redactionPayload);\n }),\n catchError(error => {\n return of(new redactionActions.DeleteRedactionFailure(error));\n }));\n }));\n\n @Effect()\n redact$ = this.actions$.pipe(\n ofType(redactionActions.REDACT),\n map((action: redactionActions.Redact) => action.payload),\n exhaustMap((redactionPayload) => {\n return this.redactionApiService.redact(redactionPayload).pipe(\n map((result: HttpResponse<Blob>) => {\n const header = result.headers.get('content-disposition').split('filename=');\n const filename = header.length > 1 ? header[1].replace(/\"/g, '')\n : `redacted-document-${redactionPayload.documentId}`;\n return new redactionActions.RedactSuccess({ blob: result.body, filename });\n }),\n catchError(error => {\n return of(new redactionActions.RedactFailure(error));\n }));\n }));\n\n @Effect()\n unmarkAll$ = this.actions$.pipe(\n ofType(redactionActions.UNMARK_ALL),\n map((action: redactionActions.UnmarkAll) => action.payload),\n exhaustMap((documentId) => {\n return this.redactionApiService.deleteAllMarkers(documentId).pipe(\n map(result => {\n return new redactionActions.UnmarkAllSuccess();\n }),\n catchError(error => {\n return of(new redactionActions.DeleteRedactionFailure(error));\n }));\n }));\n}\n\n","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpResponse } from '@angular/common/http';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\n\n@Injectable()\nexport class DocumentConversionApiService {\n\n private documentConversionUrl = '/doc-assembly/convert';\n\n constructor(private readonly httpClient: HttpClient) {}\n\n public convert(documentId): Observable<HttpResponse<Blob>> {\n return this.httpClient\n .post<Blob>(`${this.documentConversionUrl}/${documentId}`, {},\n { observe: 'response' , withCredentials: true, responseType: 'blob' as 'json' })\n .pipe(\n map(response => response),\n catchError(error => of(error))\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpResponse } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { Rotation } from './rotation.model';\n\n@Injectable()\nexport class RotationApiService {\n\n public rotationApiUrl = '/em-anno/metadata';\n\n constructor(\n private readonly httpClient: HttpClient\n ) {}\n\n public getRotation(documentId: string): Observable<HttpResponse<Rotation>> {\n const fixedUrl = `${this.rotationApiUrl}/${documentId}`;\n return this.httpClient\n .get<Rotation>(fixedUrl, { observe: 'response' , withCredentials: true });\n }\n\n public saveRotation(payload: Rotation): Observable<HttpResponse<Rotation>> {\n const fixedUrl = `${this.rotationApiUrl}/`;\n return this.httpClient\n .post<any>(fixedUrl, payload, { observe: 'response' , withCredentials: true })\n .pipe(\n map(response => response),\n catchError(() => [])\n );\n }\n\n}\n","import { Actions, Effect, ofType } from '@ngrx/effects';\nimport { Injectable } from '@angular/core';\nimport { HttpResponse } from '@angular/common/http';\nimport { catchError, exhaustMap, map, switchMap } from 'rxjs/operators';\nimport { DocumentConversionApiService } from '../../viewers/convertible-content-viewer/document-conversion-api.service';\nimport { RotationApiService } from '../../viewers/rotation-persist/rotation-api.service';\nimport { of } from 'rxjs';\nimport * as documentActions from '../actions/document.actions';\n\n@Injectable()\nexport class DocumentEffects {\n constructor(\n private actions$: Actions,\n private documentConversionService: DocumentConversionApiService,\n private rotationApiService: RotationApiService,\n ) { }\n\n @Effect()\n convert$ = this.actions$.pipe(\n ofType(documentActions.CONVERT),\n map((action: documentActions.Convert) => action.payload),\n exhaustMap((documentId) => {\n return this.documentConversionService.convert(documentId).pipe(\n map((result: HttpResponse<Blob>) => {\n const url = URL.createObjectURL(result.body);\n return new documentActions.ConvertSuccess(url);\n }),\n catchError(error => {\n return of(new documentActions.ConvertFailure(error));\n }));\n }));\n\n @Effect()\n loadRotation$ = this.actions$.pipe(\n ofType(documentActions.LOAD_ROTATION),\n map((action: documentActions.LoadRotation) => action.payload),\n switchMap((documentId) => {\n return this.rotationApiService.getRotation(documentId).pipe(\n map(resp => {\n return new documentActions.LoadRotationSuccess(resp.body);\n }),\n catchError(error => {\n return of(new documentActions.LoadRotationFailure(error));\n }));\n }));\n\n @Effect()\n saveRotation$ = this.actions$.pipe(\n ofType(documentActions.SAVE_ROTATION),\n map((action: documentActions.SaveRotation) => action.payload),\n switchMap((payload) => {\n return this.rotationApiService.saveRotation(payload).pipe(\n map(resp => {\n return new documentActions.SaveRotationSuccess(resp.body);\n }),\n catchError(error => {\n return of(new documentActions.SaveRotationFailure(error));\n }));\n }));\n}\n","import { Injectable } from '@angular/core';\nimport { Actions, Effect, ofType } from '@ngrx/effects';\nimport { catchError, exhaustMap, map, switchMap } from 'rxjs/operators';\nimport { of } from 'rxjs';\nimport { IcpSessionApiService } from '../../icp/icp-session-api.service';\nimport { IcpUpdateService } from '../../icp/icp-update.service';\nimport * as icpActions from '../actions/icp.actions' ;\nimport { IcpSession } from '../../icp/icp.interfaces';\n\n@Injectable()\nexport class IcpEffects {\n\n constructor(private actions$: Actions,\n private icpApiService: IcpSessionApiService,\n private icpUpdateService: IcpUpdateService) {}\n\n @Effect()\n loadIcpSession$ = this.actions$.pipe(\n ofType(icpActions.LOAD_ICP_SESSION),\n map((action: icpActions.LoadIcpSession) => action.payload),\n exhaustMap((caseId: string) =>\n this.icpApiService.loadSession(caseId)\n .pipe(\n map(res => new icpActions.JoinIcpSocketSession(res)),\n catchError(error => of(new icpActions.LoadIcpSessionFailure(error)))\n )\n ));\n\n\n @Effect()\n joinIcpSocketSession$ = this.actions$.pipe(\n ofType(icpActions.JOIN_ICP_SOCKET_SESSION),\n map((action: icpActions.JoinIcpSocketSession) => action.payload),\n switchMap((res: {username: string, session: IcpSession}) =>\n this.icpUpdateService.joinSession(res.username, res.session)\n .pipe(map(participants => new icpActions.IcpSocketSessionJoined({session: res.session, participantInfo: participants})))\n ));\n}\n","import { AnnotationEffects } from './annotation.effects';\nimport { BookmarksEffects } from './bookmarks.effects';\nimport { RedactionEffects } from './redaction.effects';\nimport { DocumentEffects } from './document.effects';\nimport { IcpEffects } from './icp.effects';\n\nexport const effects: any[] = [AnnotationEffects, BookmarksEffects, RedactionEffects, DocumentEffects, IcpEffects];\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewEncapsulation } from '@angular/core';\nimport { ResponseType, ViewerException } from '../viewer-exception.model';\nimport { select, Store } from '@ngrx/store';\nimport * as fromStore from '../../store/reducers/document.reducer';\nimport * as fromDocumentActions from '../../store/actions/document.actions';\nimport { Subscription } from 'rxjs';\nimport * as fromSelectors from '../../store/selectors/document.selectors';\nimport { AnnotationSet } from '../../annotations/annotation-set/annotation-set.model';\nimport { filter } from 'rxjs/operators';\n\n@Component({\n selector: 'mv-conversion-viewer',\n templateUrl: './convertible-content-viewer.component.html',\n encapsulation: ViewEncapsulation.None\n})\nexport class ConvertibleContentViewerComponent implements OnInit, OnDestroy {\n\n @Input() originalUrl;\n @Input() downloadFileName: string;\n\n @Input() height;\n\n @Input() enableAnnotations: boolean;\n @Input() enableRedactions: boolean;\n @Input() annotationSet: AnnotationSet | null;\n\n\n @Output() mediaLoadStatus = new EventEmitter<ResponseType>();\n @Output() viewerException = new EventEmitter<ViewerException>();\n @Output() documentTitle = new EventEmitter<string>();\n\n private $subscription: Subscription;\n convertedUrl: string;\n\n constructor(private store: Store<fromStore.DocumentState>) {\n }\n\n ngOnInit(): void {\n this.store.dispatch(new fromDocumentActions.Convert(this.extractDMStoreDocId(this.originalUrl)));\n this.$subscription = this.store.pipe(select(fromSelectors.getConvertedDocument), filter(value => !!value))\n .subscribe((docInfo) => {\n if (docInfo.url) {\n this.convertedUrl = docInfo.url;\n this.store.dispatch(new fromDocumentActions.ClearConvertDocUrl());\n } else {\n this.onLoadException(new ViewerException(docInfo.error));\n }\n });\n }\n\n ngOnDestroy(): void {\n this.$subscription.unsubscribe();\n }\n\n onMediaLoad(status: ResponseType) {\n this.mediaLoadStatus.emit(status);\n }\n\n onLoadException(exception: ViewerException) {\n this.viewerException.emit(exception);\n }\n\n onDocumentTitleChange(title: string) {\n this.documentTitle.emit(title);\n }\n\n // todo move this to common place for media viewer and pdf\n private extractDMStoreDocId(url: string): string {\n\n if (url.includes('/documents/')) {\n url = url.split('/documents/')[1];\n } else if (url.includes('/documentsv2/')) {\n url = url.split('/documentsv2/')[1];\n }\n return url.replace('/binary', '');\n }\n}\n","import { Component } from '@angular/core';\nimport { ToolbarEventService } from '../../toolbar/toolbar.module';\n\n@Component({\n selector: 'mv-confirm-action',\n templateUrl: './confirm-action-dialog.component.html',\n})\nexport class ConfirmActionDialogComponent {\n\n constructor(private toolbarEvents: ToolbarEventService) {}\n\n onCancel() {\n this.toolbarEvents.icp.leavingSession.next(false);\n }\n\n onConfirm() {\n this.toolbarEvents.icp.confirmExit();\n this.toolbarEvents.icp.leavingSession.next(false);\n }\n}\n","import {Bookmark, BookmarksPerPage} from '../../viewers/pdf-viewer/side-bar/bookmarks/bookmarks.interfaces';\nimport {Component, Input, OnInit} from '@angular/core';\nimport { select, Store } from '@ngrx/store';\nimport * as fromStore from '../../store/reducers/reducers';\nimport * as fromSelectors from '../../store/selectors/bookmark.selectors';\nimport { Observable } from 'rxjs';\n\n@Component({\n selector: 'mv-bookmark-icons',\n templateUrl: './bookmark-icons.component.html'\n})\nexport class BookmarkIconsComponent implements OnInit {\n\n @Input() zoom: number;\n @Input() rotate: number;\n bookmarksPerPage$: Observable<BookmarksPerPage[]>;\n bookmarks: Bookmark[];\n documentId: string;\n\n constructor(private store: Store<fromStore.State>) {}\n\n ngOnInit(): void {\n this.bookmarksPerPage$ = this.store.pipe(select(fromSelectors.getBookmarksPerPage));\n }\n\n}\n","import { Directive, ElementRef, HostListener, OnDestroy, OnInit } from '@angular/core';\nimport * as fromDocumentActions from '../../store/actions/document.actions';\nimport { select, Store } from '@ngrx/store';\nimport * as fromDocuments from '../../store/selectors/document.selectors';\nimport { filter, take } from 'rxjs/operators';\nimport { Rotation } from './rotation.model';\nimport { ResponseType } from '../viewer-exception.model';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\nimport * as fromStore from '../../store/reducers/reducers';\nimport { ToolbarButtonVisibilityService } from '../../toolbar/toolbar-button-visibility.service';\nimport { Subscription } from 'rxjs';\n\n\n@Directive({\n selector: '[mvRotationPersist]'\n})\nexport class RotationPersistDirective implements OnInit, OnDestroy {\n\n documentId: string;\n rotation = 0;\n savedRotation = 0;\n\n $subscriptions: Subscription;\n\n constructor(private el: ElementRef,\n private store: Store<fromStore.DocumentState>,\n public readonly toolbarButtons: ToolbarButtonVisibilityService,\n private toolbarEvents: ToolbarEventService) {\n }\n\n ngOnInit() {\n this.$subscriptions = this.toolbarEvents.rotateSubject.subscribe(rotation => this.onRotate(rotation));\n this.$subscriptions\n .add(this.toolbarEvents.saveRotationSubject.subscribe(() => this.saveRotation()))\n .add(this.store.pipe(select(fromDocuments.getRotation))\n .subscribe(rotation => this.savedRotation = rotation))\n .add(this.store.pipe(select(fromDocuments.getDocumentId))\n .subscribe(documentId => this.documentId = documentId));\n }\n\n ngOnDestroy() {\n this.$subscriptions.unsubscribe();\n }\n\n @HostListener('mediaLoadStatus', ['$event'])\n onMediaLoad(status: ResponseType) {\n this.rotation = 0;\n this.store.dispatch(new fromDocumentActions.LoadRotation(this.documentId));\n this.store.pipe(select(fromDocuments.rotationLoaded),\n filter(value => !!value),\n take(1))\n .subscribe(() => {\n if (this.savedRotation) {\n this.toolbarEvents.rotateSubject.next(this.savedRotation);\n }\n });\n }\n\n private onRotate(rotation: number) {\n this.rotation = (this.rotation + rotation) % 360;\n this.toolbarButtons.showSaveRotationButton = this.savedRotation !== this.rotation;\n }\n\n private saveRotation() {\n const payload: Rotation = {\n documentId: this.documentId,\n rotationAngle: this.rotation\n };\n this.store.dispatch(new fromDocumentActions.SaveRotation(payload));\n }\n}\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\nimport { IcpParticipant, IcpState } from '../icp.interfaces';\nimport { select, Store } from '@ngrx/store';\nimport * as fromSelectors from '../../store/selectors/icp.selectors';\n\n@Component({\n selector: 'mv-participants-list',\n templateUrl: './participants-list.component.html'\n})\nexport class ParticipantsListComponent implements OnInit, OnDestroy {\n\n subscription: Subscription;\n participants$: Observable<IcpParticipant[]>;\n presenter$: Observable<IcpParticipant>;\n isPresenter$: Observable<boolean>;\n\n showParticipantsList = false;\n\n constructor(private readonly toolbarEvents: ToolbarEventService,\n private store: Store<IcpState>) {}\n\n ngOnInit() {\n this.participants$ = this.store.pipe(select(fromSelectors.getParticipants));\n this.presenter$ = this.store.pipe(select(fromSelectors.getPresenter));\n this.isPresenter$ = this.store.pipe(select(fromSelectors.isPresenter));\n\n this.subscription = this.toolbarEvents.icp.participantsListVisible.subscribe(isVisible => this.showParticipantsList = isVisible);\n }\n\n ngOnDestroy() {\n this.subscription.unsubscribe();\n }\n}\n","import { Directive, ElementRef, HostListener, OnDestroy, OnInit } from '@angular/core';\nimport { v4 as uuid } from 'uuid';\nimport { Store } from '@ngrx/store';\nimport { Subscription } from 'rxjs';\n\nimport { Rectangle } from '../../annotation-view/rectangle/rectangle.model';\nimport { ToolbarEventService } from '../../../../toolbar/toolbar.module';\nimport * as fromStore from '../../../../store/reducers/reducers';\nimport * as fromDocument from '../../../../store/selectors/document.selectors';\nimport { ViewerEventService } from '../../../../viewers/viewer-event.service';\nimport * as fromAnnotationActions from '../../../../store/actions/annotation.actions';\nimport { HighlightCreateService } from './highlight-create.service';\n\n@Directive({\n selector: '[mvCreateTextHighlight]'\n})\nexport class HighlightCreateDirective implements OnInit, OnDestroy {\n pageHeight: number;\n pageWidth: number;\n zoom: number;\n rotate: number;\n allPages: object;\n\n $subscription: Subscription;\n\n constructor(\n private element: ElementRef<HTMLElement>,\n private toolbarEvents: ToolbarEventService,\n private viewerEvents: ViewerEventService,\n private highlightService: HighlightCreateService,\n private store: Store<fromStore.AnnotationSetState>\n ) { }\n\n ngOnInit() {\n this.$subscription = this.store.select(fromDocument.getPages).subscribe((pages) => {\n if (pages[1]) {\n this.allPages = pages;\n }\n });\n }\n\n ngOnDestroy() {\n if (this.$subscription) {\n this.$subscription.unsubscribe();\n }\n }\n\n @HostListener('mouseup', ['$event'])\n onMouseUp(mouseEvent: MouseEvent) {\n const pageElement = (<HTMLElement>(mouseEvent.target as HTMLElement).offsetParent).offsetParent;\n const page = parseInt(pageElement.getAttribute('data-page-number'), 10);\n if (this.toolbarEvents.highlightModeSubject.getValue()) {\n const rectangles = this.getRectangles(mouseEvent, page);\n this.viewerEvents.textSelected({ page, rectangles });\n }\n }\n\n @HostListener('mousedown', ['$event'])\n onPdfViewerClick(event: MouseEvent) {\n this.store.dispatch(\n new fromAnnotationActions.SelectedAnnotation({\n annotationId: '',\n selected: false,\n editable: false,\n })\n );\n this.viewerEvents.clearCtxToolbar();\n }\n\n private getRectangles(event: MouseEvent, page) {\n this.pageHeight = this.allPages[page].styles.height;\n this.pageWidth = this.allPages[page].styles.width;\n this.zoom = parseFloat(this.allPages[page].scaleRotation.scale);\n this.rotate = parseInt(this.allPages[page].scaleRotation.rotation, 10);\n const selection = window.getSelection();\n if (selection) {\n const localElement = <HTMLElement>event.target;\n\n this.removeEnhancedTextModeStyling(localElement);\n\n if (selection.rangeCount && !selection.isCollapsed) {\n const range = selection.getRangeAt(0).cloneRange();\n const clientRects = range.getClientRects();\n\n if (clientRects) {\n\n const parentRect = localElement.parentElement.getBoundingClientRect();\n const selectionRectangles: Rectangle[] = [];\n for (let i = 0; i < clientRects.length; i++) {\n const selectionRectangle = this.createTextRectangle(clientRects[i], parentRect);\n const findSelecttionRectangle = selectionRectangles.find(\n (rect) => rect.width === selectionRectangle.width && rect.x === selectionRectangle.x\n );\n if (!findSelecttionRectangle) {\n selectionRectangles.push(selectionRectangle);\n }\n }\n return selectionRectangles;\n }\n }\n }\n }\n\n private createTextRectangle(rect: any, parentRect: any): Rectangle {\n const height = rect.bottom - rect.top;\n const width = rect.right - rect.left;\n const top = rect.top - parentRect.top;\n const left = rect.left - parentRect.left;\n\n let rectangle = this.highlightService.applyRotation(\n this.pageHeight,\n this.pageWidth,\n height,\n width,\n top,\n left,\n this.rotate,\n this.zoom\n );\n rectangle = { id: uuid(), ...rectangle };\n\n return rectangle as Rectangle;\n }\n\n private removeEnhancedTextModeStyling(element: HTMLElement) {\n if (element.parentElement.children) {\n for (let i = 0; i < element.parentElement.children.length; i++) {\n const child = <HTMLElement>element.parentElement.children[i];\n\n child.style.padding = '0';\n // regex will be targeting the translate style in string\n // e.g. scaleX(0.969918) translateX(-110.684px) translateY(-105.274px) will become scaleX(0.969918)\n const translateCSSRegex = /translate[XYZ]\\(-?\\d*(\\.\\d+)?(px)?\\)/g;\n child.style.transform = child.style.transform.replace(translateCSSRegex, '').trim();\n }\n }\n }\n}\n","import {\n Component,\n ElementRef,\n Input,\n OnInit,\n ViewChild,\n OnDestroy,\n Output,\n EventEmitter,\n OnChanges,\n SimpleChanges\n} from '@angular/core';\nimport { ToolbarEventService } from '../../toolbar/toolbar-event.service';\nimport { Subscription } from 'rxjs';\nimport { ResponseType } from '../viewer-exception.model';\n\n@Component({\n selector: 'mv-multimedia-player',\n templateUrl: './multimedia-player.component.html'\n})\nexport class MultimediaPlayerComponent implements OnInit, OnChanges, OnDestroy {\n\n @Input() url: string;\n @Input() downloadFileName: string;\n @Input() multimediaOn: boolean;\n\n @Output() loadStatus = new EventEmitter<ResponseType>();\n\n @ViewChild('downloadLink', {static: false}) downloadLink: ElementRef;\n @ViewChild('videoPlayer', {static: false}) videoPlayer: ElementRef;\n\n playbackMsg = 'loading';\n\n private subscription: Subscription;\n\n constructor(\n public readonly toolbarEvents: ToolbarEventService,\n ) {}\n\n public ngOnInit(): void {\n this.subscription = this.toolbarEvents.downloadSubject\n .subscribe(() => this.downloadLink.nativeElement.click());\n this.loadStatus.emit(ResponseType.SUCCESS);\n }\n\n public ngOnChanges(changes: SimpleChanges) {\n if (changes.url) {\n this.reloadVideo();\n }\n }\n\n ngOnDestroy(): void {\n this.subscription.unsubscribe();\n }\n\n reloadVideo() {\n if (this.videoPlayer) {\n this.playbackMsg = 'loading';\n this.videoPlayer.nativeElement.load();\n }\n }\n\n onSuccess() {\n this.playbackMsg = 'success';\n }\n\n onError() {\n this.playbackMsg = 'error';\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { HttpClientModule } from '@angular/common/http';\nimport { PdfViewerComponent } from './viewers/pdf-viewer/pdf-viewer.component';\nimport { ImageViewerComponent } from './viewers/image-viewer/image-viewer.component';\nimport { UnsupportedViewerComponent } from './viewers/unsupported-viewer/unsupported-viewer.component';\nimport { MediaViewerComponent } from './media-viewer.component';\nimport { ToolbarModule } from './toolbar/toolbar.module';\nimport { PdfJsWrapperFactory } from './viewers/pdf-viewer/pdf-js/pdf-js-wrapper.provider';\nimport { AnnotationsModule } from './annotations/annotations.module';\nimport { CommentService } from './annotations/comment-set/comment/comment.service';\nimport { GrabNDragDirective } from './viewers/grab-n-drag.directive';\nimport { SideBarComponent } from './viewers/pdf-viewer/side-bar/side-bar.component';\nimport { OutlineItemComponent } from './viewers/pdf-viewer/side-bar/outline-item/outline-item.component';\nimport { TagInputModule } from 'ngx-chips';\nimport { RouterModule } from '@angular/router';\nimport { EffectsModule } from '@ngrx/effects';\nimport { StoreModule} from '@ngrx/store';\nimport { RedactionComponent } from './redaction/components/redaction.component';\nimport { IcpSessionApiService } from './icp/icp-session-api.service';\nimport { IcpUpdateService } from './icp/icp-update.service';\nimport { IcpService } from './icp/icp.service';\nimport { SocketService } from './icp/socket.service';\nimport { reducers} from './store/reducers/reducers';\nimport { effects } from './store/effects/index';\nimport { BookmarksComponent } from './viewers/pdf-viewer/side-bar/bookmarks/bookmarks.component';\nimport { RedactionApiService } from './redaction/services/redaction-api.service';\nimport { MutableDivModule } from 'mutable-div';\nimport { ConvertibleContentViewerComponent } from './viewers/convertible-content-viewer/convertible-content-viewer.component';\nimport { DocumentConversionApiService } from './viewers/convertible-content-viewer/document-conversion-api.service';\nimport { IcpPresenterService } from './icp/icp-presenter.service';\nimport { IcpFollowerService } from './icp/icp-follower.service';\nimport { ConfirmActionDialogComponent } from './icp/confirm-exit/confirm-action-dialog.component';\nimport { TreeModule } from '@circlon/angular-tree-component';\nimport { BookmarkIconsComponent } from './bookmark/components/bookmark-icons.component';\nimport { RotationApiService } from './viewers/rotation-persist/rotation-api.service';\nimport { RotationPersistDirective } from './viewers/rotation-persist/rotation-persist.directive';\nimport { ParticipantsListComponent } from './icp/participants-list/participants-list.component';\nimport { HighlightCreateDirective } from './annotations/annotation-set/annotation-create/highlight-create/highlight-create.directive';\nimport {MultimediaPlayerComponent} from './viewers/multimedia-player/multimedia-player.component';\n\n@NgModule({\n imports: [\n CommonModule,\n HttpClientModule,\n ToolbarModule,\n AnnotationsModule,\n TagInputModule,\n FormsModule,\n ReactiveFormsModule,\n RouterModule,\n StoreModule.forFeature('media-viewer', reducers),\n EffectsModule.forFeature(effects),\n TreeModule,\n MutableDivModule\n ],\n declarations: [\n PdfViewerComponent,\n SideBarComponent,\n BookmarksComponent,\n OutlineItemComponent,\n ImageViewerComponent,\n UnsupportedViewerComponent,\n MultimediaPlayerComponent,\n MediaViewerComponent,\n ConvertibleContentViewerComponent,\n GrabNDragDirective,\n RotationPersistDirective,\n HighlightCreateDirective,\n ConfirmActionDialogComponent,\n RedactionComponent, // todo made put this into module\n BookmarkIconsComponent,\n ParticipantsListComponent\n ],\n entryComponents: [\n PdfViewerComponent,\n ImageViewerComponent,\n UnsupportedViewerComponent\n ],\n providers: [\n PdfJsWrapperFactory,\n CommentService,\n RedactionApiService,\n IcpSessionApiService,\n IcpUpdateService,\n SocketService,\n IcpService,\n IcpPresenterService,\n IcpFollowerService,\n RedactionApiService,\n DocumentConversionApiService,\n RotationApiService,\n ],\n exports: [\n MediaViewerComponent\n ]\n})\nexport class MediaViewerModule { }\n"],"mappings":"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"}
|