{"version":3,"sources":["modules/home.js","modules/search.js","modules/annotationViewer.js","modules/textEditor.js","modules/folders.js","modules/documentGrid.js","modules/canvasEditor.js","modules/fetch.js","modules/constants.js","modules/project.js","modules/index.js","store.js","modules/redux-token-auth-config.js","LoginRegistrationDialog.js","AdminDialog.js","SearchBar.js","Navigation.js","Home.js","ProjectSettingsDialog.js","AddDocumentButton.js","AddFolderButton.js","LinkableSummary.js","DocumentFolder.js","modules/iiif.js","ListDropTarget.js","LinkableList.js","TableOfContents.js","icons/PageMargins.js","TextSchema.js","TextCommands.js","TextTableCommands.js","HighlightColorSelect.js","ProseMirrorEditorView.js","TextLinkTooltipPlugin.js","TextImageTooltipPlugin.js","TextResource.js","icons/RemoveFromPhotos.js","AddImageLayer.js","CanvasResource.js","DocumentStatusBar.js","DocumentViewer.js","DraggableLinkIcon.js","LinkInspector.js","LinkInspectorPopup.js","LinkInspectorPopupLayer.js","SearchResultsPopup.js","SearchResultsPopupLayer.js","BatchImagePrompt.js","Project.js","App.js","registerServiceWorker.js","index.js"],"names":["LOADING","ERRORED","FETCH_SUCCESS","LOGIN_SHOWN","LOGIN_HIDDEN","REGISTRATION_SHOWN","REGISTRATION_HIDDEN","APPROVAL_PENDING_SHOWN","APPROVAL_PENDING_HIDDEN","USER_EMAIL_CHANGED","USER_NAME_CHANGED","USER_PASSWORD_CHANGED","USER_PASSWORD_CONFIRMATION_CHANGED","USER_AUTH_ERRORED","AUTH_MENU_TOGGLED","AUTH_MENU_HIDDEN","ADMIN_DIALOG_SHOWN","ADMIN_DIALOG_HIDDEN","USER_ADMIN_LIST_LOADING","USER_ADMIN_LIST_ERRORED","USER_ADMIN_LIST_SUCCESS","UPDATE_USER_LOADING","UPDATE_USER_ERRORED","UPDATE_USER_SUCCESS","DELETE_USER_LOADING","DELETE_USER_ERRORED","DELETE_USER_SUCCESS","CONFIRM_USER_SUCCESS","CONFIRM_USER_ERRORED","CONFIRM_USER_SUCCESS_DIALOG_CLOSED","RESEND_CONFIRMATION_STARTED","RESEND_CONFIRMATION_SUCCESS","RESEND_CONFIRMATION_ERRORED","initialState","projects","loading","errored","loginShown","registrationShown","approvalPendingShown","userEmail","userName","userPassword","userPasswordConfirmation","userAuthError","authMenuShown","authMenuAnchor","adminDialogShown","userAdminList","userAdminListLoading","userAdminListErrored","confirmUserSuccessDialogShown","confirmUserErrored","confirmUserErroredDialogShown","confirmationEmailResent","confirmationEmailErrored","confirmationResendButtonDisabled","confirmationEmailErrorMsg","load","dispatch","type","fetch","headers","localStorage","getItem","then","response","ok","Error","statusText","json","field","sort","a","b","nameA","toUpperCase","nameB","catch","showLogin","hideLogin","showRegistration","hideRegistration","showApprovalPending","hideApprovalPending","userEmailChanged","event","value","target","userNameChanged","userPasswordChanged","userPasswordConfirmationChanged","userAuthErrored","error","toggleAuthMenu","anchor","hideAuthMenu","showAdminDialog","users","hideAdminDialog","updateUser","userId","attributes","method","body","JSON","stringify","deleteUser","confirmUser","token","res","account_confirmation_success","resendConfirmationEmail","getState","email","home","errors","length","err","closeConfirmDialog","START_SEARCH","SEARCH_SUCCESS","SEARCH_ERRORED","UPDATE_SEARCH_PHRASE_BUFFER","CLOSE_SEARCH_POPUP","searchPhrase","searchPhraseBuffer","searchResults","popupOpen","startSearch","projectID","encodeURI","closeSearchPopup","updateSearchPhraseBuffer","SELECT_TARGET","SELECT_LOAD_SUCCESS","SELECT_SIDEBAR_TARGET","SELECT_SIDEBAR_LOAD_SUCCESS","SELECT_LOAD_ERRORED","REFRESH_TARGET","REFRESH_SUCCESS","REFRESH_ERRORED","CLOSE_TARGET","CLOSE_TARGET_ROLLOVER","CLOSE_SIDEBAR_TARGET","CLOSE_DOCUMENT_TARGETS","PROMOTE_TARGET","CLEAR_SELECTION","DELETE_LINK_SUCCESS","ADD_LINK_SUCCESS","MOVE_LINK","MOVE_LINK_SUCCESS","MOVE_LINK_ERRORED","selectedTargets","sidebarTarget","sidebarLoading","addedLink","selectTarget","document_id","highlight_id","targetUrl","loadedTarget","refreshTargetByDocumentID","annotationViewer","forEach","targetIndex","links_to","find","link","refreshTarget","index","existingTarget","selectSidebarTarget","closeTargetRollover","highlight_uid","closeTarget","closeDocumentTargets","promoteTarget","clearSelection","addLink","origin","linked","newLinkPosition","listType","linkable_a_id","linkable_id","linkable_a_type","linkable_type","linkable_b_id","linkable_b_type","newLink","payload","id","linkable_a","linkable_b","position","deleteLink","doomedLinkID","link_id","moveLink","linkId","targetId","targetParentType","UPDATE_EDITOR_STATE","CLOSE_EDITOR","SET_HIGHLIGHT_COLOR","HIDE_COLOR_PICKER","TOGGLE_COLOR_PICKER","SET_HIGHLIGHT_SELECT_MODE","SELECT_HIGHLIGHT","TOGGLE_HIGHLIGHTS","editorStates","highlightColors","displayColorPickers","highlightSelectModes","selectedHighlights","highlightsHidden","updateEditorState","editorKey","editorState","closeEditor","setTextHighlightColor","highlightColor","toggleTextColorPicker","setHighlightSelectMode","highlightKey","window","setTimeout","textEditor","selectHighlight","toggleTextHighlights","NEW_FOLDER","POST_SUCCESS","POST_ERRORED","FOLDER_OPENED","OPEN_SUCCESS","OPEN_ERRORED","FOLDER_CLOSED","UPDATE_FOLDER","PATCH_SUCCESS","PATCH_ERRORED","DELETE_FOLDER","DELETE_SUCCESS","DELETE_ERRORED","MOVE_FOLDER_SUCCESS","MOVE_FOLDER_ERRORED","ADD_TREE","ADD_TREE_SUCCESS","ADD_TREE_ERRORED","openFolderContents","createFolder","parentId","parentType","title","project_id","project","parent_id","parent_type","folder","moveBody","document_folder","destination_id","openFolder","loadProject","contentsChildren","contents_children","folders","Object","hasOwn","closeFolder","moveFolder","folderID","destinationParentType","updateFolder","deleteFolder","folderId","descendants","documentGrid","openDocuments","document","closeDocument","timeOpened","addTree","tree","SET_ADD_TILE_SOURCE_MODE","SET_IS_PENCIL_MODE","SET_GLOBAL_CANVAS_DISPLAY","SET_IMAGE_URL","IIIF_TILE_SOURCE_TYPE","IMAGE_URL_SOURCE_TYPE","UPLOAD_SOURCE_TYPE","PAGE_TO_CHANGE","RENAME_LAYER_SUCCESS","TOGGLE_EDIT_LAYER_NAME","addTileSourceMode","imageURLs","isPencilMode","globalCanvasDisplay","pageToChange","editingLayerName","setCanvasHighlightColor","toggleCanvasColorPicker","setAddTileSourceMode","mode","setImageUrl","url","setIsPencilMode","toggleCanvasHighlights","setGlobalCanvasDisplay","changePage","page","toggleEditLayerName","fetchWithTimeout","resource","options","retryDelay","timeout","controller","AbortController","abort","signal","clearTimeout","defaultRequestTimeout","TEXT_HIGHLIGHT_DELETE","CANVAS_HIGHLIGHT_DELETE","DOCUMENT_DELETE","FOLDER_DELETE","OPEN_DOCUMENT","OPEN_DOCUMENT_SUCCESS","OPEN_DOCUMENT_ERRORED","CLOSE_DOCUMENT","REPLACE_DOCUMENT","CLEAR_RESOURCES","ADD_HIGHLIGHT","ADD_HIGHLIGHT_SUCCESS","ADD_HIGHLIGHT_ERRORED","DELETE_HIGHLIGHT_ERRORED","DELETE_HIGHLIGHT_SUCCESS","UPDATE_HIGHLIGHT","UPDATE_HIGHLIGHT_ERRORED","UPDATE_HIGHLIGHT_SUCCESS","DUPLICATE_HIGHLIGHTS","DUPLICATE_HIGHLIGHTS_SUCCESS","DUPLICATE_HIGHLIGHTS_ERRORED","MOVE_DOCUMENT","MOVE_DOCUMENT_SUCCESS","MOVE_DOCUMENT_ERRORED","UPDATE_DOCUMENT","CHECK_IN_DOCS","UPDATE_SNACK_BAR","NEW_DOCUMENT","DELETE_DOCUMENT","OPEN_DELETE_DIALOG","CLOSE_DELETE_DIALOG","SET_CURRENT_LAYOUT","MOVE_DOCUMENT_WINDOW","CANVAS_LAYER_DELETE","REFRESH_DOCUMENTS","GET_CURRENT_DOC_CONTENT","GET_CURRENT_DOC_CONTENT_ERRORED","FETCH_LOCK_SUCCESS","FETCH_LOCK_ERRORED","FROM_IMAGE_SUCCESS","OPEN_INITIAL_DOCS_STARTED","OPEN_INITIAL_DOCS_SUCCESS","OPEN_INITIAL_DOCS_ERRORED","layoutOptions","rows","cols","description","MAX_EXCERPT_LENGTH","layout","highlightsLoading","deleteDialogOpen","deleteDialogTitle","deleteDialogBody","deleteDialogSubmit","deleteDialogPayload","deleteDialogKind","snackBarOpen","snackBarMessage","currentLayout","loadingInitialDocs","openDocument","documentId","firstTarget","inContents","pos","documentPosition","closeAllResources","addHighlight","highlightTarget","color","excerpt","callback","uid","savedHighlight","deleteHighlights","highlights","highlight","reduce","matched","updateHighlight","shouldStartLoading","prototype","hasOwnProperty","call","duplicateHighlights","newHighlights","createTextDocument","Array","isArray","document_title","document_kind","TEXT_RESOURCE_TYPE","content","createTextDocumentWithLink","moveDocument","updateDocument","adjustLock","shouldSkipReplacement","refreshDocumentContent","locked","instanceKey","replaceThisDocument","refreshLists","map","child","includes","refreshDocuments","setDocumentThumbnail","image_url","status","setHighlightThumbnail","highlightId","coords","svg_string","createCanvasDocument","CANVAS_RESOURCE_TYPE","tileSources","replaceDocument","openDeleteDialog","submit","kind","closeDeleteDialog","confirmDeleteDialog","transaction","newState","apply","doc","highlightsToDuplicate","alteredHighlights","canvas","fabricObjects","object","remove","layer","firstTileSource","imageUrlForThumbnail","replace","deleteLayer","setCurrentLayout","moveDocumentWindow","dragIndex","moveIndex","updateSnackBar","moveLayer","direction","renameLayer","name","fetchLock","locked_by_me","locked_by_user_name","createCanvasDocWithImage","signedId","filename","images","queuedJob","IMAGE_UPLOAD_DOC_CREATED","errMsg","message","IMAGE_UPLOAD_ERRORED","createFolderForBatch","projectId","newFolderName","createMultipleCanvasDocs","signedIds","Promise","allSettled","retryFetch","retries","image","blob","substring","lastIndexOf","IMAGE_UPLOAD_TO_RAILS_SUCCESS","resolve","reject","jobsQueue","jobs","filter","jobPromise","job","signed_id","retryOn","attempt","finishedStatuses","IMAGE_UPLOAD_COMPLETE","IMAGE_UPLOAD_TIMEOUT","unfinished","some","console","createBatchImages","inFolder","existingFolder","IMAGE_UPLOAD_STARTED","parseInt","openInitialDocs","docIds","all","idx","toString","parentDoc","parentLink","LOAD_PROJECT","GET_SUCCESS","GET_ERRORED","CLEAR_PROJECT","NEW_PROJECT","UPDATE_PROJECT","DELETE_PROJECT","OPEN_DOCUMENT_POPOVER","CLOSE_DOCUMENT_POPOVER","SETTINGS_SHOWN","SETTINGS_HIDDEN","NEW_PERMISSION_LEVEL_CHANGE","NEW_PERMISSION_USER_CHANGE","CREATE_PERMISSION_LOADING","CREATE_PERMISSION_ERRORED","CREATE_PERMISSION_SUCCESS","TOGGLE_DELETE_CONFIRMATION","TOGGLE_SIDEBAR","HIDE_BATCH_IMAGE_PROMPT","SHOW_BATCH_IMAGE_PROMPT","SET_UPLOADING_TRUE","KILL_UPLOADING","ADD_FOLDER_DATA","SHOW_CLOSE_DIALOG","HIDE_CLOSE_DIALOG","GET_EXPORTS_LOADING","GET_EXPORTS_SUCCESS","GET_EXPORTS_ERRORED","CREATE_EXPORT_LOADING","CREATE_EXPORT_SUCCESS","CREATE_EXPORT_ERRORED","userProjectPermissions","public","currentUserPermissions","documentPopoverOpenFor","settingsShown","newPermissionLoading","newPermissionUser","newPermissionLevel","newPermissionError","deleteConfirmed","sidebarWidth","sidebarOpen","batchImagePromptShown","uploads","uploading","folderData","closeDialogShown","uploadError","exports","exportsError","exportsLoading","exportJobId","clearProject","forbidden","push","projectTitle","projectDescription","loadExports","newProject","showSettings","updateProject","openDocumentPopover","closeDocumentPopover","hideSettings","setNewPermissionUser","user","setNewPermissionLevel","level","createNewPermission","permission","deletePermission","updatePermission","permissionLevel","checkInAll","docIDs","checked_in_docs","toggleDeleteConfirmation","toggleSidebar","deleteProject","hideBatchImagePrompt","showBatchImagePrompt","folderIds","descendant_folder_ids","descendant","folder_ids","getFolderDataFromIds","getFolderData","startUploading","killUploading","showCloseDialog","hideCloseDialog","data","createExport","jobId","combineReducers","routing","routerReducer","reduxTokenAuth","reduxTokenAuthReducer","state","action","log","uploadsWithFilename","upload","createdUploads","newUploads","stillUploadingComplete","uploadsWithError","stillUploadingErrored","uploadsWithTimeout","stillUploadingTimeout","loadingOpenFolderContents","assign","successOpenFolderContents","erroredOpenFolderContents","closeOpenFolderContents","openDocumentsCopy","slice","splice","positionToSplice","Date","now","nextOpenDocs","docID","numDocs","preRefreshDocumentsCopy","preReplaceDocumentsCopy","preCloseDocumentsCopy","toCloseIndex","findIndex","targetID","resourceIndex","updatedopenDocuments","updatedResource","highlight_map","links","duplicatesUpdatedOpenDocuments","hResourceIndex","hUpdatedOpenDocuments","hUpdatedResource","draggedDocument","openDocumentsMoveCopy","openDocumentsFetchUpdated","concat","opened","preUpdateTargetsCopy","toUpdateIndex","updatedTarget","preRefreshTargetsCopy","refreshingTarget","preReplaceTargetsCopy","refreshedTarget","preCloseTargetsCopy","rollover","newSelectedTargets","prePromoteTargetsCopy","toPromoteIndex","targetToPromote","nextSelectedTargets","nextSidebarTarget","updatedStates","cleanedStates","updatedHighlightColors","updatedDisplayColorPickers","updatedToggleDisplayColorPickers","updatedHighlightSelectModes","updatedSelectedHighlights","canvasEditor","updatedAddTileSourceMode","updatedPencilMode","updatedPageToChange","updatedEditingLayerName","search","history","createBrowserHistory","middleware","thunk","routerMiddleware","composedEnhancers","compose","applyMiddleware","store","createStore","rootReducer","currentUser","isLoading","isSignedIn","config","authUrl","userAttributes","approved","admin","confirmed","userRegistrationAttributes","password_confirmation","generateAuthActions","registerUser","signInUser","signOutUser","verifyCredentials","LoginRegistrationDialog","actions","open","requestedClose","showNameField","showEmailField","showPasswordField","showPasswordConfirmationField","location","this","props","label","primary","onClick","password","pathname","modal","onRequestClose","autoScrollBodyContent","style","red500","bind","disabled","green400","full_messages","blue900","floatingLabelText","hintText","onChange","autoComplete","errorText","Component","connect","bindActionCreators","withRouter","AdminDialog","contentStyle","width","maxWidth","Table","selectable","displaySelectAll","adjustForCheckbox","displayRowCheckbox","key","background","lightBlue50","red50","toggled","onToggle","isInputChecked","backgroundColor","red400","hoverColor","red600","grey200","SearchBar","onSearch","e","onKeypress","keyCode","which","display","marginRight","inputStyle","hintStyle","grey500","onKeyPress","marginTop","LoginMenuBody","primaryText","returnHome","Navigation","onCloseProject","layoutTooltipOpen","layoutTooltipAnchor","persist","currentTarget","preventDefault","setState","prevState","userMenuLabel","fontSize","top","left","showMenuIconButton","isHome","iconElementLeft","tooltip","tooltipPosition","iconElementRight","inputId","height","labelStyle","lineHeight","menuStyle","onMouseOver","onTooltipOpen","onMouseOut","onTooltipClose","option","minWidth","icon","labelPosition","zIndex","anchorEl","anchorOrigin","horizontal","vertical","targetOrigin","zDepth","className","useLayerForClickAway","autoCloseWhenOffScreen","Home","confirmationToken","maxHeight","margin","overflowY","List","padding","secondaryText","secondaryTextLines","projectClick","bottom","borderRadius","fullWidth","ownProps","split","slug","ProjectSettingsDialog","newValue","renderAddButtonLabel","validateAddCollab","lightBlue100","lightBlue200","userProjectPermission","user_email","red100","red200","renderCollabTableRow","renderAddCollabRow","defaultValue","scheduleProjectTitleUpdate","scheduleProjectDescriptionUpdate","multiLine","rowsMax","exportsTable","createStatus","exportRows","exp","updatedAt","updated_at","exportLink","href","error_class","disableFocusRipple","disableTouchRipple","toLocaleString","overflow","alignItems","iconStyle","gap","checked","onCheck","transform","transition","Tabs","tabItemContainerStyle","grey600","renderProjectTab","renderCollaboratorsTab","renderExportsTab","renderDeleteTab","scheduledProjectTitleUpdate","scheduledProjectDescriptionUpdate","AddDocumentButton","addType","connectDragPreview","dragIcon","Image","src","connectDragSource","DragSource","beginDrag","monitor","dragSource","dragPreview","isDragging","AddFolderButton","_props","Summary","singleClickTimeout","doubleClickCutoffMs","defaultBgColor","item","linkItem","grey100","isOpen","grey800","prevProps","isDraggable","white","black","writeEnabled","removeLinkCallback","thumbnail_url","onMouseEnter","grey300","onMouseLeave","leftAvatar","leftIcon","rightIcon","renderRightIcon","rightIconButton","renderRightButton","borderStyle","borderWidth","borderBold","borderColor","grey400","cursor","innerDivStyle","paddingLeft","stopPropagation","handleClick","onDoubleClick","handleDoubleClick","children","DraggableSummary","linkDragIcon","isFolder","isLinkItem","existingParentId","existingParentType","LinkableSummary","ListItem","defaultProps","FolderContents","contents","red800","items","openDocumentIds","adminEnabled","allDraggable","insideFolder","parentFolderId","DocumentFolder","isOver","noMargin","grey900","underlineShow","MAX_IIIF_CANVASES","ListTargetInner","itemType","isNewItem","shouldShowOver","borderTop","handleFileSystemDrop","monitorItem","targetParentId","buoyancyTarget","droppedFile","files","droppedFileName","reader","FileReader","onload","sequences","manifestJSON","manifest","parse","canvasCount","sequence","newSequence","canvases","service","canvasLabel","image_info_uri","parseIIIFManifest","result","readAsText","listDropTarget","canDrop","getItemType","drop","didDrop","handler","idToPass","handleDMItemDrop","ListDropTarget","connectDropTarget","DropTarget","NativeTypes","FILE","dropTarget","LinkableList","itemKey","originKey","originId","originTimeOpened","paddingTop","renderFolder","renderItem","TableOfContents","containerStyle","overflowX","minHeight","flexGrow","noGutter","marginLeft","boxShadow","faintBlack","checkInAllClick","settingsClick","PageMargins","size","xmlns","fill","viewBox","d","stroke","strokeDasharray","blockquoteDOM","hrDOM","preDOM","brDOM","nodes","paragraph","group","parseDOM","tag","getAttrs","node","indentLevel","lineHeightParsed","parseFloat","isNaN","indented","attrs","default","toDOM","textIndent","blockquote","defining","horizontal_rule","heading","code_block","marks","code","preserveWhitespace","text","inline","alt","draggable","dom","getAttribute","hard_break","emDOM","strongDOM","codeDOM","inclusive","em","underline","strikethrough","styleValue","mark","fontFamily","strong","fontWeight","test","schema","Schema","markApplies","ranges","i","$from","$to","can","depth","allowsMarkType","nodesBetween","inlineContent","addMark","markType","selection","empty","$cursor","tr","addStoredMark","create","has","rangeHasMark","removeMark","highlightUid","nodeSize","removeStoredMark","scrollIntoView","replaceNodeWith","nodeType","canReplaceWith","canInsert","replaceSelectionWith","increaseIndent","withHanging","newNode","step","ReplaceAroundStep","Slice","Fragment","from","docChanged","decreaseIndent","removedFromList","liftListItem","cmd","addTable","rowsCount","colsCount","withHeaderRow","cellContent","end","$head","resolvedEnd","types","tableNodeTypes","headerCells","cells","createCell","cellType","createChecked","createAndFill","cell","headerCell","header_cell","row","table","createTable","setSelection","TextSelection","near","offset","resolvedPos","HighlightColorSelect","toggleColorPicker","displayColorPicker","colors","yellow500","orange300","redA100","purpleA100","blueA100","cyanA100","lightGreenA700","lightGreenA200","setHighlightColor","hex","ProseMirrorEditorView","editorView","focus","destroy","nextProps","columnCount","ref","createEditorView","LinkTooltip","view","createElement","parentNode","appendChild","update","lastState","eq","to","insideLink","start","coordsAtPos","box","offsetParent","getBoundingClientRect","scrollTop","origTooltipLeft","tooltipBottom","innerHTML","tooltipRect","right","diff","ImageTooltip","buttons","tooltipImageSmall","innerText","tooltipImageMedium","tooltipImageLarge","tooltipImageOrig","button","tooltipDiv","onclick","setNodeMarkup","nodeSelection","NodeSelection","imageSelected","Math","max","newTooltipLeft","fontFamilies","lineHeights","buttonWidth","validURLRegex","validImageRegex","TextResource","renderTool","toolName","getInstanceKey","selectedHighlight","documentSchema","createDocumentSchema","createEditorState","onMouseDown","onHighlight","hiddenTools","undefined","onColorPickerOpen","textColor","onBold","onItalic","onUnderline","onStrikethrough","renderFontSizeDropDown","renderFontFamilyDropDown","onHyperLink","onImage","renderTableMenu","renderLineSpacingMenu","renderColumnsMenu","onBulletList","onOrderedList","onDecreaseIndent","onIncreaseIndent","onBlockquote","onHR","onHighlightSelectMode","onMarginClick","onDeleteHighlight","getEditorState","uuidv4","onChangeTextColor","colorMarkType","toggleMark","onUnderlineByKey","preventDefaultKeymaps","metaKey","ctrlKey","onStrikethroughByKey","onIncreaseIndentByKey","onDecreaseIndentByKey","linkDialogOpen","createHyperlink","imageDialogOpen","createImage","imageNodeType","onLineSpacingChange","setNodeAttributes","isEditable","lockedByMe","element","EditorView","dispatchTransaction","handlePaste","editable","targetHighlight","currentHighlight","targetPosition","domNode","nodeDOM","block","scrollTo","execCommand","targetHighlights","createHighlight","serializer","div","serializeFragment","textContent","pastedMarks","markEntry","tx","processAndConfirmTransaction","nextEditorState","updateState","setSaving","doneSaving","postponeCallback","postContentChanges","DOMSerializer","fromSchema","steps","effectedMarks","every","AddMarkStep","curSelection","ReplaceStep","RemoveMarkStep","parentOffset","collectHighlights","additionTo","before","newHighlightUid","removedMarks","effectedIndex","indexOf","serializeNode","toRemoveUids","scheduleContentUpdate","onCancelHyperlinkDialog","initialLinkDialogState","onSubmitHyperlinkDialog","linkDialogBuffer","linkDialogBufferInvalid","onCancelImageDialog","initialImageDialogState","onSubmitImageDialog","imageDialogBuffer","uploadedImage","imageDialogBufferInvalid","onCancelTableDialog","initialTableDialogState","onSubmitTableDialog","tableDialogRows","tableDialogCols","tableDialogHeader","tableDialogRowsInvalid","tableDialogColsInvalid","onCancelMarginDialog","marginDialogOpen","priorMargins","onSubmitMarginDialog","marginBottom","setPageMargin","marginTopInvalid","marginBottomInvalid","marginLeftInvalid","marginRightInvalid","scheduledContentUpdate","editorViewWrapper","React","createRef","tools","tool","tableTools","addColumnBefore","addColumnAfter","deleteColumn","addRowBefore","addRowAfter","deleteRow","toggleHeaderColumn","toggleHeaderRow","mergeCells","deleteTable","uploadingImage","imageUploadText","tableDialogOpen","initialMarginDialogState","marginLefttInvalid","currentScrollTop","toolbarWidth","hiddenToolsOpen","hiddenToolsAnchor","colorPickerOpen","colorPickerAnchor","tooltipOpen","tooltipAnchor","tableMenuOpen","tableMenuAnchor","current","setLastSaved","offsetWidth","sumWidths","hidingBegan","refs","filteredRefs","Boolean","inst","highlightSpec","tempColor","highlightInfo","getHighlightMap","properties","class","onmouseenter","onmouseleave","spec","addBefore","addListNodes","append","tableNodes","tableGroup","cellAttributes","getFromDOM","setDOMAttr","existingEditorState","dmSchema","plugins","exampleSetup","menuBar","columnResizing","tableEditing","keymap","undo","redo","handleTab","handleShiftTab","highlightSelectPlugin","Plugin","decorations","getSelectedHighlight","Decoration","DecorationSet","highlightTargetPlugin","linkPreviewPlugin","imageResizePlugin","nodeFromJSON","EditorState","textBetween","orderedListNodeType","ordered_list","wrapInList","bulletListNodeType","bullet_list","blockquoteNodeType","wrapIn","hrNodeType","fontSizeMarkType","fontFamilyMarkType","onTableClick","isInTable","goToNextCell","startNode","search_text","toSearchText","onColorPickerClose","animated","onChangeComplete","onFontSizeChange","autoWidth","keys","onFontFamilyChange","family","iconButtonElement","openTableMenu","closeTableMenu","onTableMenuChange","onItemClick","onColumnsChange","onToolbarWidthChange","Toolbar","onHiddenToolsOpen","onHiddenToolsClose","renderTooltipFromHidden","renderColorPicker","onSuccess","finishedUpload","render","handleUpload","ready","file","progress","progressString","toFixed","min","flexDirection","renderToolbar","mergeRefs","onScrollChange","onKeyDown","thickness","renderLinkDialog","renderImageDialog","renderTableDialog","renderMarginDialog","RemoveFromPhotos","displayName","muiName","tileSourceTypeLabels","select","textField","AddImageLayer","addTileSource","newContent","existingTileSources","existingIiifTileNames","iiifTileNames","shouldSetThumbnail","newTileSources","image_urls","newImageUrls","decodeURIComponent","newTileSourceValue","onIIIFLink","uploadErrorMessage","linkError","onWebLink","onLinkSubmit","tileSource","tileSourceMode","validateTileSource","onCancel","addingNewLayers","deepEqual","buttonStyle","allowNewLayers","endpoint","path","model","attribute","protocol","multiple","onSubmit","onError","containerElement","accept","textStyle","renderUploadButton","floatingLabelStyle","verticalAlign","openSeaDragonFabricOverlay","OpenSeadragon","fabric","_renderStroke","ctx","strokeWidth","shadow","affectStroke","_removeShadow","save","scale","scaleX","scaleY","_setLineDash","strokeDashArray","_renderDashedStroke","_applyPatternGradientTransform","restore","CanvasResource","osdId","osdViewer","upButton","downButton","layerSelect","imageLayerControls","viewportUpdatedYet","currentMode","hasOpenedOnce","currentPage","totalPages","layerName","zoomLevel","maxZoom","minZoom","openTileSources","goToPage","hasLayerControls","controls","ctrl","hasLayers","addControl","ControlAnchor","TOP_LEFT","autoFade","removeControl","refreshLayerSelect","raiseEvent","initialColor","iOS","navigator","userAgent","platform","maxTouchPoints","containsImageFile","source","viewer","prefixUrl","showNavigationControl","maxZoomPixelRatio","navigatorSizeRatio","gestureSettingsMouse","clickToZoom","showNavigator","sequenceMode","showSequenceControl","preserveViewport","preserveImageSizeOnResize","useCanvas","Button","srcRest","srcGroup","srcHover","srcDown","onRelease","prevPage","makeNeutralElement","addEventListener","opt","getLayerName","nextPage","wrapper","buttonGroup","ButtonGroup","innerTracker","MouseTracker","overlay","fabricjsOverlay","addHandler","viewport","getMaxZoom","getMinZoom","viewportUpdatedForPageYet","renderHighlights","zoom","fabricCanvas","getZoom","forEachObject","_isMarker","radius","markObjectsDirtyNextUpdate","dirty","freeDrawingBrush","resize","resizecanvas","pageNumber","selectedIndex","onOpen","on","_highlightUid","setFocusHighlight","discardActiveObject","_isTarget","obj","_isTargetChild","canvasMouseDown","canvasMouseMove","canvasMouseUp","highlightCoords","computeMarkerThumbBounds","aCoords","toJSON","toSVG","showRollover","hideRollover","perPixelTargetFind","setActiveObject","onresize","match","tileSourceSSL","resourceURL","successCallBack","errorCallback","retryWithInfoJSON","initialResponse","withInfoJson","checkTileSource","validResourceURL","errorResponse","selected","firstChild","removeChild","lastChild","t","targetHighLight","x","y","w","h","targetRect","Rect","fitBoundsWithConstraints","isMouseDown","pointerCoords","getPointer","drawMarker","newShape","addShape","Circle","originX","originY","newColor","selectedObject","getActiveObject","set","checkDoubleClick","drawLine","endLineMode","prevLineEndPoint","o","lineInProgress","mouse","abs","renderAll","forceRedraw","calcCoords","svg","panClick","jsonBlob","objects","parsedHighlight","hoverCursor","Shadow","blur","jsonString","loadFromJSON","lockCanvasObject","lastTime","currentTime","elapsedTime","pointer","activeShape","lineOptions","centerPoint","getCenterPoint","oldCircle","Polyline","add","oldHoverLine","hoverLine","oldPolyline","points","markerCoords","tl","bl","br","pCoords","markerFill","Color","fromHex","setAlpha","rad","marker","toRgba","lockScalingX","lockScalingY","lockRotation","lockScalingFlip","lockSkewingX","lockSkewingY","lockUniScaling","hasControls","defaultCursor","fabricObject","lock","lockMovementX","lockMovementY","getObjects","isDrawingMode","stopDrawing","lockCanvasObjects","setMouseNavEnabled","selectedObjects","currentLayer","currentLayerName","tile","layerNamePayload","zoomTo","image_thumbnail_urls","iconBackdropStyle","iconBackdropStyleActive","cyan100","iconBackdropStyleSpaced","floatingIconBackdropStyle","smallIconStyle","tooltipStyle","pointerEvents","highlightHidden","isEmpty","clear","tooltipStyles","editShapeClick","rectClick","circleClick","markerClick","pencilClick","lineClick","colorizeClick","deleteHighlightClick","moveLayerClick","deleteLayerClick","submitLayerName","flex","borderBottom","onChangeLayerName","editLayerNameClick","cancelEditLayerName","sliderStyle","axis","zoomControlChange","DocumentStatusBar","show","lastSaved","lockedByUserName","saving","float","resourceName","renderCheckInOutButtons","renderSaveIcon","renderLastSaved","renderDeleteButton","renderTooltip","getStatusMessage","DocumentInner","DocumentViewer","onChangeTitle","titleChangeTimeout","titleChangeDelayMs","elementRef","cornerIconTooltipOpen","cornerIconTooltipAnchor","sharePanelOpen","sharePanelAnchor","documentURL","hasCopiedURL","getDocumentURL","currentState","toggleHighlights","docId","isInIframe","parent","clipboardWrite","permissions","query","loc","referrer","nodeName","querySelector","clipboard","writeText","flexShrink","linkInspectorAnchorClick","onShareOpen","onShareClose","flexFlow","onFocus","copyDocumentURL","underlineStyle","onToggleHighlights","onCloseDocument","numRows","documentGridOffsetWidth","innerWidth","windowHeight","innerHeight","opacity","renderTitleBar","renderStatusBar","hover","component","hoverIndex","DraggableLinkIcon","LinkList","LinkDropTarget","border","textAlign","justifyContent","fontStyle","LinkArea","LinkInspector","getItemList","buttonId","idString","timeUpdateDelay","LinkInspectorPopup","newTitle","titleUpdateTimer","titleBuffer","titleHasFocus","Paper","transitionEnabled","yellow100","orange100","purple100","blue100","green100","lightGreen100","titleBarColor","canEditTitle","titleBarID","onTitleBlur","onTitleFocus","getTitleColor","linkInspectorVisible","linkInspectorProps","openDoc","startPos","startPosition","handle","bounds","getInnerID","popupIndex","onDragHandleMouseDown","paddingRight","renderTitle","closeHandler","generatePopupKey","LinkInspectorPopupLayer","boxSizing","targets","mouseDownHandler","dialogStartPosition","SearchResultsPopup","minConstraints","maxConstraints","SearchResultsPopupLayer","onClose","TableRow","progressTrStyle","nameTdStyle","overflowWrap","progressTdStyle","statusTdStyle","lightBlue400","yellow400","CloseDialog","closeAction","cancelAction","secondary","BatchImagePrompt","defaultState","invalidFiles","menuItemsToRender","newItem","repeat","toLowerCase","pushSelfAndDescendants","spaced","updateCheck","RadioButton","defaultSelected","changeFolderType","val","selectFolder","uploadsNotDone","folderChoiceValid","validFileFormats","batchSize","filesAreValidFormat","showInitStuff","red900","renderFolderChoice","renderMultipleUploadButton","Project","renderDocumentViewer","mainContainer","mouseX","mouseY","rolloverTimer","createTarget","activateRolloverTimer","deactivateRolloverTimer","documentID","highlightID","newTarget","scrollY","selectTextHighlight","params","queryParams","URLSearchParams","getAll","renderDeleteDialog","newNumRows","ceil","newScrollPos","pageYOffset","gridInnerStyle","flexWrap","el","onMouseMove","clientX","clientY","autoHideDuration","onTitleChange","renderDialogLayers","renderDocumentGrid","renderSnackbar","onBeforeunload","adminUsers","sidebarIsDragging","write","DragDropContext","HTML5Backend","App","muiTheme","getMuiTheme","darkBaseTheme","palette","primary1Color","slider","trackColor","trackColorSelected","handleColorZero","handleFillColor","selectionColor","rippleColor","Route","exact","hostname","ReactDOM","getElementById","serviceWorker","registration","unregister"],"mappings":"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","file":"static/js/main.453f304b.chunk.js","sourcesContent":["export const LOADING = 'home/LOADING';\nexport const ERRORED = 'home/ERRORED';\nexport const FETCH_SUCCESS = 'home/FETCH_SUCCESS';\nexport const LOGIN_SHOWN = 'home/LOGIN_SHOWN';\nexport const LOGIN_HIDDEN = 'home/LOGIN_HIDDEN';\nexport const REGISTRATION_SHOWN = 'home/REGISTRATION_SHOWN';\nexport const REGISTRATION_HIDDEN = 'home/REGISTRATION_HIDDEN';\nexport const APPROVAL_PENDING_SHOWN = 'home/APPROVAL_PENDING_SHOWN';\nexport const APPROVAL_PENDING_HIDDEN = 'home/APPROVAL_PENDING_HIDDEN';\nexport const USER_EMAIL_CHANGED = 'home/USER_EMAIL_CHANGED';\nexport const USER_NAME_CHANGED = 'home/USER_NAME_CHANGED';\nexport const USER_PASSWORD_CHANGED = 'home/USER_PASSWORD_CHANGED';\nexport const USER_PASSWORD_CONFIRMATION_CHANGED = 'home/USER_PASSWORD_CONFIRMATION_CHANGED';\nexport const USER_AUTH_ERRORED = 'home/USER_AUTH_ERRORED';\nexport const AUTH_MENU_TOGGLED = 'home/AUTH_MENU_TOGGLED';\nexport const AUTH_MENU_HIDDEN = 'home/AUTH_MENU_HIDDEN';\nexport const ADMIN_DIALOG_SHOWN = 'home/ADMIN_DIALOG_SHOWN';\nexport const ADMIN_DIALOG_HIDDEN = 'home/ADMIN_DIALOG_HIDDEN';\nexport const USER_ADMIN_LIST_LOADING = 'home/USER_ADMIN_LIST_LOADING';\nexport const USER_ADMIN_LIST_ERRORED = 'home/USER_ADMIN_LIST_ERRORED';\nexport const USER_ADMIN_LIST_SUCCESS = 'home/USER_ADMIN_LIST_SUCCESS';\nexport const UPDATE_USER_LOADING = 'home/UPDATE_USER_LOADING';\nexport const UPDATE_USER_ERRORED = 'home/UPDATE_USER_ERRORED';\nexport const UPDATE_USER_SUCCESS = 'home/UPDATE_USER_SUCCESS';\nexport const DELETE_USER_LOADING = 'home/DELETE_USER_LOADING';\nexport const DELETE_USER_ERRORED = 'home/DELETE_USER_ERRORED';\nexport const DELETE_USER_SUCCESS = 'home/DELETE_USER_SUCCESS';\nexport const CONFIRM_USER_SUCCESS = 'home/CONFIRM_USER_SUCCESS';\nexport const CONFIRM_USER_ERRORED = 'home/CONFIRM_USER_ERRORED';\nexport const CONFIRM_USER_SUCCESS_DIALOG_CLOSED = 'home/CONFIRM_USER_SUCCESS_DIALOG_CLOSED';\nexport const RESEND_CONFIRMATION_STARTED = 'home/RESEND_CONFIRMATION_STARTED';\nexport const RESEND_CONFIRMATION_SUCCESS = 'home/RESEND_CONFIRMATION_SUCCESS';\nexport const RESEND_CONFIRMATION_ERRORED = 'home/RESEND_CONFIRMATION_ERRORED';\n\nconst initialState = {\n projects: [],\n loading: false,\n errored: false,\n loginShown: false,\n registrationShown: false,\n approvalPendingShown: false,\n userEmail: '',\n userName: '',\n userPassword: '',\n userPasswordConfirmation: '',\n userAuthError: false,\n authMenuShown: false,\n authMenuAnchor: null,\n adminDialogShown: false,\n userAdminList: [],\n userAdminListLoading: false,\n userAdminListErrored: false,\n confirmUserSuccessDialogShown: false,\n confirmUserErrored: false,\n confirmUserErroredDialogShown: false,\n confirmationEmailResent: false,\n confirmationEmailErrored: false,\n confirmationResendButtonDisabled: false,\n confirmationEmailErrorMsg: '',\n};\n\nexport default function(state = initialState, action) {\n switch (action.type) {\n case LOADING:\n return {\n ...state,\n loading: true\n };\n\n case ERRORED:\n return {\n ...state,\n errored: true\n };\n\n case FETCH_SUCCESS:\n return {\n ...state,\n loading: false,\n projects: action.projects\n };\n\n case LOGIN_SHOWN:\n return {\n ...state,\n loginShown: true,\n registrationShown: false,\n approvalPendingShown: false,\n authMenuShown: false\n };\n\n case LOGIN_HIDDEN:\n return {\n ...state,\n loginShown: false,\n userAuthError: false,\n userEmail: '',\n userName: '',\n userPassword: '',\n userPasswordConfirmation: '',\n confirmationEmailResent: false,\n }\n\n case REGISTRATION_SHOWN:\n return {\n ...state,\n registrationShown: true,\n loginShown: false,\n approvalPendingShown: false,\n authMenuShown: false\n };\n\n case REGISTRATION_HIDDEN:\n return {\n ...state,\n registrationShown: false,\n userAuthError: false,\n userEmail: '',\n userName: '',\n userPassword: '',\n userPasswordConfirmation: ''\n };\n\n case APPROVAL_PENDING_SHOWN:\n return {\n ...state,\n approvalPendingShown: true,\n userAuthError: false,\n registrationShown: false,\n loginShown: false,\n authMenuShown: false\n };\n\n case APPROVAL_PENDING_HIDDEN:\n return {\n ...state,\n approvalPendingShown: false,\n userAuthError: false,\n userEmail: '',\n userName: '',\n userPassword: '',\n userPasswordConfirmation: ''\n };\n\n case USER_EMAIL_CHANGED:\n return {\n ...state,\n userEmail: action.value\n };\n\n case USER_NAME_CHANGED:\n return {\n ...state,\n userName: action.value\n };\n\n case USER_PASSWORD_CHANGED:\n return {\n ...state,\n userPassword: action.value\n };\n\n case USER_PASSWORD_CONFIRMATION_CHANGED:\n return {\n ...state,\n userPasswordConfirmation: action.value\n };\n\n case USER_AUTH_ERRORED:\n return {\n ...state,\n userAuthError: action.error\n };\n\n case AUTH_MENU_TOGGLED:\n return {\n ...state,\n authMenuShown: !state.authMenuShown,\n authMenuAnchor: action.anchor\n };\n\n case AUTH_MENU_HIDDEN:\n return {\n ...state,\n userAuthError: false,\n authMenuShown: false\n };\n\n case ADMIN_DIALOG_SHOWN:\n return {\n ...state,\n adminDialogShown: true\n };\n\n case ADMIN_DIALOG_HIDDEN:\n return {\n ...state,\n adminDialogShown: false\n };\n\n case USER_ADMIN_LIST_LOADING:\n case UPDATE_USER_LOADING:\n case DELETE_USER_LOADING:\n return {\n ...state,\n userAdminListLoading: true,\n };\n\n case USER_ADMIN_LIST_ERRORED:\n case UPDATE_USER_ERRORED:\n case DELETE_USER_ERRORED:\n return {\n ...state,\n userAdminListErrored: true,\n userAdminListLoading: false\n };\n\n case USER_ADMIN_LIST_SUCCESS:\n case UPDATE_USER_SUCCESS:\n case DELETE_USER_SUCCESS:\n return {\n ...state,\n userAdminListLoading: false,\n userAdminListErrored: false,\n userAdminList: action.users\n };\n\n case CONFIRM_USER_SUCCESS:\n return {\n ...state,\n userAuthError: false,\n confirmUserSuccessDialogShown: true,\n confirmUserErrored: false,\n };\n\n case CONFIRM_USER_SUCCESS_DIALOG_CLOSED:\n return {\n ...state,\n userAuthError: false,\n confirmUserSuccessDialogShown: false,\n confirmUserErrored: false,\n }\n\n case CONFIRM_USER_ERRORED:\n return {\n ...state,\n userAuthError: false,\n confirmUserSuccessDialogShown: true,\n confirmUserErrored: true,\n };\n\n case RESEND_CONFIRMATION_STARTED:\n return {\n ...state,\n confirmationResendButtonDisabled: true,\n confirmationEmailErrored: false,\n confirmationEmailResent: false,\n confirmationEmailErrorMsg: '',\n }\n\n case RESEND_CONFIRMATION_SUCCESS:\n return {\n ...state,\n confirmationEmailResent: true,\n confirmationEmailErrored: false,\n confirmationResendButtonDisabled: true,\n confirmationEmailErrorMsg: '',\n };\n \n case RESEND_CONFIRMATION_ERRORED:\n return {\n ...state,\n confirmationEmailErrored: true,\n confirmationEmailErrorMsg: action.error,\n confirmationEmailResent: false,\n confirmationResendButtonDisabled: false,\n }\n \n default:\n return state;\n }\n}\n\nexport function load() {\n return function(dispatch) {\n dispatch({\n type: LOADING\n });\n\n fetch('/projects', {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(projects => {\n // sort by title\n projects = projects.sort(createAlphaNumericComparator('title'));\n dispatch({\n type: FETCH_SUCCESS,\n projects\n })\n })\n .catch(() => dispatch({\n type: ERRORED\n }));\n };\n}\n\nexport function showLogin() {\n return function(dispatch) {\n dispatch({\n type: LOGIN_SHOWN\n });\n };\n}\n\nexport function hideLogin() {\n return function(dispatch) {\n dispatch({\n type: LOGIN_HIDDEN\n });\n };\n}\n\nexport function showRegistration() {\n return function(dispatch) {\n dispatch({\n type: REGISTRATION_SHOWN\n });\n };\n}\n\nexport function hideRegistration() {\n return function(dispatch) {\n dispatch({\n type: REGISTRATION_HIDDEN\n });\n };\n}\n\nexport function showApprovalPending() {\n return function(dispatch) {\n dispatch({\n type: APPROVAL_PENDING_SHOWN\n });\n };\n}\n\nexport function hideApprovalPending() {\n return function(dispatch) {\n dispatch({\n type: APPROVAL_PENDING_HIDDEN\n });\n };\n}\n\nexport function userEmailChanged(event) {\n return function(dispatch) {\n dispatch({\n type: USER_EMAIL_CHANGED,\n value: event.target.value\n });\n };\n}\n\nexport function userNameChanged(event) {\n return function(dispatch) {\n dispatch({\n type: USER_NAME_CHANGED,\n value: event.target.value\n });\n };\n}\n\nexport function userPasswordChanged(event) {\n return function(dispatch) {\n dispatch({\n type: USER_PASSWORD_CHANGED,\n value: event.target.value\n });\n };\n}\n\nexport function userPasswordConfirmationChanged(event) {\n return function(dispatch) {\n dispatch({\n type: USER_PASSWORD_CONFIRMATION_CHANGED,\n value: event.target.value\n });\n };\n}\n\nexport function userAuthErrored(error) {\n return function(dispatch) {\n dispatch({\n type: USER_AUTH_ERRORED,\n error\n });\n };\n}\n\nexport function toggleAuthMenu(anchor) {\n return function(dispatch) {\n dispatch({\n type: AUTH_MENU_TOGGLED,\n anchor\n });\n };\n}\n\nexport function hideAuthMenu(anchor) {\n return function(dispatch) {\n dispatch({\n type: AUTH_MENU_HIDDEN\n });\n };\n}\n\nexport function showAdminDialog() {\n return function(dispatch) {\n dispatch({\n type: ADMIN_DIALOG_SHOWN\n });\n dispatch(loadUserAdminList());\n };\n}\n\nexport function loadUserAdminList() {\n return function(dispatch) {\n dispatch({\n type: USER_ADMIN_LIST_LOADING\n });\n\n fetch('/users/list_admin', {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(users => dispatch({\n type: USER_ADMIN_LIST_SUCCESS,\n users\n }))\n .catch(() => dispatch({\n type: USER_ADMIN_LIST_ERRORED\n }));\n };\n}\n\nexport function hideAdminDialog() {\n return function(dispatch) {\n dispatch({\n type: ADMIN_DIALOG_HIDDEN\n });\n };\n}\n\nexport function updateUser(userId, attributes) {\n return function(dispatch) {\n dispatch({\n type: UPDATE_USER_LOADING\n });\n\n fetch(`/users/${userId}`, {\n method: 'PATCH',\n body: JSON.stringify(attributes),\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(users => dispatch({\n type: UPDATE_USER_SUCCESS,\n users\n }))\n .catch(() => dispatch({\n type: UPDATE_USER_ERRORED\n }));\n }\n}\n\nexport function deleteUser(userId) {\n return function(dispatch) {\n dispatch({\n type: DELETE_USER_LOADING\n });\n\n fetch(`/users/${userId}`, {\n method: 'DELETE',\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(users => dispatch({\n type: DELETE_USER_SUCCESS,\n users\n }))\n .catch(() => dispatch({\n type: DELETE_USER_ERRORED\n }));\n }\n}\n\nfunction createAlphaNumericComparator( field ) {\n return function alphaNumericCompare(a,b) {\n var nameA = a[field].toUpperCase(); // ignore upper and lowercase\n var nameB = b[field].toUpperCase(); // ignore upper and lowercase\n if (nameA < nameB) {\n return -1;\n }\n if (nameA > nameB) {\n return 1;\n }\n \n // names must be equal\n return 0;\n } \n}\n\nexport function confirmUser(token) {\n return function(dispatch) {\n fetch(`/auth/confirmation?confirmation_token=${token}`, {\n method: 'GET',\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(res => {\n if (res.account_confirmation_success === \"true\" || res.account_confirmation_success === true) {\n dispatch({\n type: CONFIRM_USER_SUCCESS\n });\n } else {\n throw Error(res);\n }\n })\n .catch((error) => {\n dispatch({\n type: CONFIRM_USER_ERRORED,\n error\n });\n })\n }\n}\n\nexport function resendConfirmationEmail() {\n return function(dispatch, getState) {\n dispatch({\n type: RESEND_CONFIRMATION_STARTED,\n })\n fetch('/auth/confirmation', {\n method: 'POST',\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n body: JSON.stringify({\n email: getState().home.userEmail\n }),\n })\n .then(response => {\n if (!response.ok) {\n const { errors } = response.json();\n if (errors && errors.length > 0) {\n throw Error(errors[0]);\n }\n throw Error(response.statusText);\n }\n dispatch({\n type: RESEND_CONFIRMATION_SUCCESS,\n });\n return response;\n })\n .catch(err => {\n dispatch({\n type: RESEND_CONFIRMATION_ERRORED,\n err\n });\n })\n }\n}\n\nexport function closeConfirmDialog() {\n return function (dispatch) {\n dispatch({\n type: CONFIRM_USER_SUCCESS_DIALOG_CLOSED,\n })\n }\n}","\nexport const START_SEARCH = 'search/START_SEARCH';\nexport const SEARCH_SUCCESS = 'search/SEARCH_SUCCESS';\nexport const SEARCH_ERRORED = 'search/SEARCH_ERRORED';\nexport const UPDATE_SEARCH_PHRASE_BUFFER = 'search/UPDATE_SEARCH_PHRASE_BUFFER';\nexport const CLOSE_SEARCH_POPUP = 'search/CLOSE_SEARCH_POPUP';\n\nconst initialState = {\n loading: false,\n searchPhrase: '',\n searchPhraseBuffer: '',\n searchResults: [],\n popupOpen: false,\n errored: false\n};\n\nexport default function(state = initialState, action) {\n switch (action.type) {\n case START_SEARCH:\n return {\n ...state,\n searchPhrase: action.searchPhrase,\n searchResults: [],\n loading: true,\n errored: false\n }\n\n case SEARCH_SUCCESS:\n return {\n ...state,\n searchResults: action.searchResults,\n popupOpen: true,\n loading: false,\n errored: false\n }\n\n case SEARCH_ERRORED:\n return {\n ...state,\n popupOpen: false,\n loading: false,\n errored: true\n }\n\n case CLOSE_SEARCH_POPUP:\n return {\n ...initialState\n }\n\n case UPDATE_SEARCH_PHRASE_BUFFER:\n return {\n ...state,\n searchPhraseBuffer: action.searchPhraseBuffer\n }\n\n default:\n return state;\n }\n}\n\nexport function startSearch(projectID, searchPhrase) {\n return function(dispatch) {\n dispatch({\n type: START_SEARCH,\n searchPhrase\n });\n \n fetch(`/projects/${projectID}/search?q=${encodeURI(searchPhrase)}`, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(searchResults => {\n return searchResults;\n })\n .then(searchResults => dispatch({\n type: SEARCH_SUCCESS,\n searchResults\n }))\n .catch(() => dispatch({\n type: SEARCH_ERRORED\n }));\n };\n }\n\n export function closeSearchPopup() {\n return function(dispatch) {\n dispatch({\n type: CLOSE_SEARCH_POPUP\n });\n }\n }\n\n export function updateSearchPhraseBuffer(searchPhraseBuffer) {\n return function(dispatch) {\n dispatch({\n type: UPDATE_SEARCH_PHRASE_BUFFER,\n searchPhraseBuffer\n });\n }\n }\n","\nexport const SELECT_TARGET = 'annotationViewer/SELECT_TARGET';\nexport const SELECT_LOAD_SUCCESS = 'annotationViewer/SELECT_LOAD_SUCCESS';\nexport const SELECT_SIDEBAR_TARGET = 'annotationViewer/SELECT_SIDEBAR_TARGET';\nexport const SELECT_SIDEBAR_LOAD_SUCCESS = 'annotationViewer/SELECT_SIDEBAR_LOAD_SUCCESS';\nexport const SELECT_LOAD_ERRORED = 'annotationViewer/SELECT_LOAD_ERRORED';\nexport const REFRESH_TARGET = 'annotationViewer/REFRESH_TARGET';\nexport const REFRESH_SUCCESS = 'annotationViewer/REFRESH_SUCCESS';\nexport const REFRESH_ERRORED = 'annotationViewer/REFRESH_ERRORED';\nexport const CLOSE_TARGET = 'annotationViewer/CLOSE_TARGET';\nexport const CLOSE_TARGET_ROLLOVER = 'annotationViewer/CLOSE_TARGET_ROLLOVER';\nexport const CLOSE_SIDEBAR_TARGET = 'annotationViewer/CLOSE_SIDEBAR_TARGET';\nexport const CLOSE_DOCUMENT_TARGETS = 'annotationViewer/CLOSE_DOCUMENT_TARGETS';\nexport const PROMOTE_TARGET = 'annotationViewer/PROMOTE_TARGET';\nexport const CLEAR_SELECTION = 'annotationViewer/CLEAR_SELECTION';\nexport const DELETE_LINK_SUCCESS = 'annotationViewer/DELETE_LINK_SUCCESS';\nexport const ADD_LINK_SUCCESS = 'annotationViewer/ADD_LINK_SUCCESS';\nexport const MOVE_LINK = 'annotationViewer/MOVE_LINK';\nexport const MOVE_LINK_SUCCESS = 'annotationViewer/MOVE_LINK_SUCCESS';\nexport const MOVE_LINK_ERRORED = 'annotationViewer/MOVE_LINK_ERRORED';\n\nconst initialState = {\n selectedTargets: [],\n sidebarTarget: null,\n sidebarLoading: true,\n addedLink: {},\n};\n\nexport default function(state = initialState, action) {\n switch (action.type) {\n case SELECT_TARGET:\n return {\n ...state,\n selectedTargets: state.selectedTargets.concat([Object.assign({loading: true, opened: Date.now()}, action.target)])\n };\n\n case SELECT_LOAD_SUCCESS:\n let preUpdateTargetsCopy = state.selectedTargets.slice(0);\n let toUpdateIndex = -1;\n if (action.target.highlight_id) {\n toUpdateIndex = preUpdateTargetsCopy.findIndex(target => target.highlight_id === action.target.highlight_id);\n }\n else {\n toUpdateIndex = preUpdateTargetsCopy.findIndex(target => target.document_id === action.target.document_id && !target.highlight_id);\n }\n if (toUpdateIndex >= 0) {\n let updatedTarget = Object.assign({opened: Date.now()}, action.target);\n updatedTarget.loading = false;\n Object.assign(updatedTarget, action.loadedTarget);\n preUpdateTargetsCopy.splice(toUpdateIndex, 1, updatedTarget);\n }\n return {\n ...state,\n selectedTargets: preUpdateTargetsCopy\n };\n\n case REFRESH_TARGET:\n let preRefreshTargetsCopy = state.selectedTargets.slice(0);\n if (action.index >= 0) {\n let refreshingTarget = Object.assign({}, preRefreshTargetsCopy[action.index]);\n refreshingTarget.loading = true;\n preRefreshTargetsCopy.splice(action.index, 1, refreshingTarget);\n }\n return {\n ...state,\n selectedTargets: preRefreshTargetsCopy\n }\n\n case REFRESH_SUCCESS:\n let preReplaceTargetsCopy = state.selectedTargets.slice(0);\n if (action.index >= 0) {\n let refreshedTarget = Object.assign({}, state.selectedTargets[action.index]);\n refreshedTarget.loading = false;\n Object.assign(refreshedTarget, action.loadedTarget);\n preReplaceTargetsCopy.splice(action.index, 1, refreshedTarget);\n }\n return {\n ...state,\n selectedTargets: preReplaceTargetsCopy\n };\n\n case SELECT_SIDEBAR_TARGET:\n return {\n ...state,\n sidebarTarget: action.target,\n sidebarLoading: true\n };\n\n case SELECT_SIDEBAR_LOAD_SUCCESS:\n let updatedTarget = Object.assign({}, action.target);\n Object.assign(updatedTarget, action.loadedTarget);\n return {\n ...state,\n sidebarTarget: updatedTarget,\n sidebarLoading: false\n };\n\n case CLOSE_TARGET: {\n let preCloseTargetsCopy = state.selectedTargets.slice(0);\n let toCloseIndex = -1;\n if (action.highlight_id) {\n toCloseIndex = preCloseTargetsCopy.findIndex(target => target.highlight_id === action.highlight_id);\n }\n else {\n toCloseIndex = preCloseTargetsCopy.findIndex(target => (target.document_id === action.document_id && !target.highlight_id))\n }\n if (toCloseIndex >= 0) {\n preCloseTargetsCopy.splice(toCloseIndex, 1);\n }\n return {\n ...state,\n selectedTargets: preCloseTargetsCopy\n };\n }\n\n case CLOSE_TARGET_ROLLOVER: {\n let preCloseTargetsCopy = state.selectedTargets.slice(0);\n let toCloseIndex = -1;\n toCloseIndex = preCloseTargetsCopy.findIndex(target => target.rollover && target.uid === action.highlight_uid);\n if (toCloseIndex >= 0) {\n preCloseTargetsCopy.splice(toCloseIndex, 1);\n }\n return {\n ...state,\n selectedTargets: preCloseTargetsCopy\n };\n }\n\n case CLOSE_DOCUMENT_TARGETS:\n const newSelectedTargets = state.selectedTargets.filter(target => target.document_id !== action.document_id)\n return {\n ...state,\n selectedTargets: newSelectedTargets\n };\n\n case CLOSE_SIDEBAR_TARGET:\n return {\n ...state,\n sidebarTarget: null\n };\n\n case PROMOTE_TARGET:\n let prePromoteTargetsCopy = state.selectedTargets.slice(0);\n let toPromoteIndex = -1;\n if (action.highlight_id) {\n toPromoteIndex = prePromoteTargetsCopy.findIndex(target => target.highlight_id === action.highlight_id);\n }\n else {\n toPromoteIndex = prePromoteTargetsCopy.findIndex(target => target.document_id === action.document_id && !target.highlight_id)\n }\n if (toPromoteIndex >= 0 && toPromoteIndex < prePromoteTargetsCopy.length - 1) {\n const targetToPromote = prePromoteTargetsCopy.splice(toPromoteIndex, 1)[0];\n prePromoteTargetsCopy.push(targetToPromote);\n }\n return {\n ...state,\n selectedTargets: prePromoteTargetsCopy\n }\n\n case CLEAR_SELECTION:\n return {\n ...state,\n selectedTargets: []\n };\n\n case DELETE_LINK_SUCCESS:\n // remove the link from the active targets\n const {selectedTargets, sidebarTarget} = state\n let nextSidebarTarget = null, nextSelectedTargets; \n if (sidebarTarget) {\n nextSidebarTarget = { ...sidebarTarget }\n nextSidebarTarget.links_to = sidebarTarget.links_to.filter( link => link.link_id !== action.link_id )\n }\n\n nextSelectedTargets = [ ...selectedTargets ]\n nextSelectedTargets.forEach( target => {\n target.links_to = target.links_to.filter( link => link.link_id !== action.link_id )\n })\n\n return {\n ...state,\n sidebarTarget: nextSidebarTarget,\n selectedTargets: nextSelectedTargets\n };\n\n case ADD_LINK_SUCCESS:\n const { id, highlight_id, document_id, position, listType } = action.payload;\n return {\n ...state,\n addedLink: {\n id,\n highlight_id,\n document_id,\n position,\n listType,\n }\n };\n\n case MOVE_LINK:\n return {\n ...state,\n sidebarLoading: true\n };\n\n case MOVE_LINK_SUCCESS:\n return {\n ...state,\n sidebarLoading: false\n };\n\n case MOVE_LINK_ERRORED:\n return {\n ...state,\n sidebarLoading: false\n };\n \n default:\n return state;\n }\n}\n\nexport function selectTarget(target) {\n return function(dispatch) {\n dispatch({\n type: CLOSE_TARGET,\n document_id: target.document_id,\n highlight_id: target.highlight_id\n });\n dispatch({\n type: SELECT_TARGET,\n target\n });\n\n const targetUrl = target.highlight_id ? `/highlights/${target.highlight_id}` : `/documents/${target.document_id}`;\n fetch(targetUrl, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(loadedTarget => dispatch({\n type: SELECT_LOAD_SUCCESS,\n loadedTarget,\n target\n }))\n // .catch(() => dispatch({\n // type: SELECT_LOAD_ERRORED\n // }));\n }\n}\n\n// refresh all the targets that have links to this document\nexport function refreshTargetByDocumentID( document_id ) {\n return function(dispatch, getState) {\n const selectedTargets = getState().annotationViewer.selectedTargets;\n selectedTargets.forEach( (target,targetIndex) => {\n const linkToDoc = target.links_to.find( link => link.document_id === document_id )\n if( linkToDoc ) {\n dispatch( refreshTarget(targetIndex) );\n }\n })\n }\n}\n\nexport function refreshTarget(index) {\n return function(dispatch, getState) {\n dispatch({\n type: REFRESH_TARGET,\n index\n });\n\n const existingTarget = getState().annotationViewer.selectedTargets[index];\n if (existingTarget) {\n const targetUrl = existingTarget.highlight_id ? `/highlights/${existingTarget.highlight_id}` : `/documents/${existingTarget.document_id}`;\n\n fetch(targetUrl, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(loadedTarget => dispatch({\n type: REFRESH_SUCCESS,\n loadedTarget,\n index\n }))\n .catch(() => dispatch({\n type: REFRESH_ERRORED,\n index\n }));\n }\n }\n}\n\nexport function selectSidebarTarget(target) {\n return function(dispatch) {\n dispatch({\n type: SELECT_SIDEBAR_TARGET,\n target\n });\n\n const targetUrl = target.highlight_id ? `/highlights/${target.highlight_id}` : `/documents/${target.document_id}`;\n fetch(targetUrl, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(loadedTarget => dispatch({\n type: SELECT_SIDEBAR_LOAD_SUCCESS,\n loadedTarget,\n target\n }))\n .catch(() => dispatch({\n type: SELECT_LOAD_ERRORED\n }));\n }\n}\n\nexport function closeTargetRollover(highlight_uid) {\n return function(dispatch) {\n dispatch({\n type: CLOSE_TARGET_ROLLOVER,\n highlight_uid\n });\n }\n}\n\nexport function closeTarget(document_id, highlight_id) {\n return function(dispatch) {\n dispatch({\n type: CLOSE_TARGET,\n document_id,\n highlight_id\n });\n }\n}\n\n// close all targets related to this document\nexport function closeDocumentTargets(document_id) {\n return function(dispatch) {\n dispatch({\n type: CLOSE_DOCUMENT_TARGETS,\n document_id\n });\n }\n}\n\nexport function closeSidebarTarget() {\n return function(dispatch) {\n dispatch({\n type: CLOSE_SIDEBAR_TARGET\n });\n }\n}\n\nexport function promoteTarget(document_id, highlight_id) {\n return function(dispatch) {\n dispatch({\n type: PROMOTE_TARGET,\n document_id,\n highlight_id\n });\n }\n}\n\nexport function clearSelection() {\n return function(dispatch) {\n dispatch({\n type: CLEAR_SELECTION\n });\n }\n}\n\nexport function addLink(origin, linked, newLinkPosition, listType) {\n return function(dispatch, getState) {\n fetch('/links', {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'POST',\n body: JSON.stringify({\n linkable_a_id: origin.linkable_id,\n linkable_a_type: origin.linkable_type,\n linkable_b_id: linked.linkable_id,\n linkable_b_type: linked.linkable_type\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then((newLink) => {\n const sidebarTarget = getState().annotationViewer.sidebarTarget;\n if (sidebarTarget) {\n let { highlight_id, document_id } = sidebarTarget;\n if (highlight_id) {\n if ((origin.linkable_type === 'Highlight' && origin.linkable_id === highlight_id) || (linked.linkable_type === 'Highlight' && linked.linkable_id === highlight_id))\n dispatch(selectSidebarTarget(sidebarTarget));\n }\n else if ((origin.linkable_type === 'Document' && origin.linkable_id === document_id) || (linked.linkable_type === 'Document' && linked.linkable_id === document_id))\n dispatch(selectSidebarTarget(sidebarTarget));\n }\n getState().annotationViewer.selectedTargets.forEach((target, index) => {\n let { highlight_id, document_id } = target;\n if (highlight_id) {\n if ((origin.linkable_type === 'Highlight' && origin.linkable_id === highlight_id) || (linked.linkable_type === 'Highlight' && linked.linkable_id === highlight_id))\n dispatch(refreshTarget(index));\n }\n else if ((origin.linkable_type === 'Document' && origin.linkable_id === document_id) || (linked.linkable_type === 'Document' && linked.linkable_id === document_id))\n dispatch(refreshTarget(index));\n });\n if (newLinkPosition) {\n dispatch({\n type: ADD_LINK_SUCCESS,\n payload: {\n id: newLink.id,\n highlight_id: newLink.linkable_a.highlight_id || newLink.linkable_b.highlight_id,\n document_id: newLink.linkable_a.document_id || newLink.linkable_b.document_id,\n position: newLinkPosition,\n listType,\n },\n });\n }\n })\n .catch(() => {\n // TODO\n });\n };\n}\n\nexport function deleteLink(doomedLinkID) {\n return function(dispatch, getState) {\n fetch(`/links/${doomedLinkID}`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'DELETE'\n }) \n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(() => {\n dispatch({\n type: DELETE_LINK_SUCCESS,\n link_id: doomedLinkID\n });\n })\n .then(() => {\n // Update positions in UI\n const sidebarTarget = getState().annotationViewer.sidebarTarget;\n if (sidebarTarget && (sidebarTarget.highlight_id || sidebarTarget.document_id)) {\n dispatch(selectSidebarTarget(sidebarTarget));\n }\n getState().annotationViewer.selectedTargets.forEach((target, index) => {\n if (target.highlight_id || target.document_id) {\n dispatch(refreshTarget(index));\n }\n });\n })\n .catch(() => {\n // TODO\n });\n };\n}\n\nexport function moveLink(linkId, targetId, targetParentType, position) {\n return function(dispatch, getState) {\n dispatch({\n type: MOVE_LINK\n });\n return fetch(`/links/${linkId}/move`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'PATCH',\n body: JSON.stringify({\n targetId,\n targetParentType,\n position,\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(() => {\n // Update positions in UI\n const sidebarTarget = getState().annotationViewer.sidebarTarget;\n if (sidebarTarget && (sidebarTarget.highlight_id || sidebarTarget.document_id)) {\n dispatch(selectSidebarTarget(sidebarTarget));\n }\n getState().annotationViewer.selectedTargets.forEach((target, index) => {\n if (target.highlight_id || target.document_id) {\n dispatch(refreshTarget(index));\n }\n });\n })\n .then(() => {\n dispatch({\n type: MOVE_LINK_SUCCESS\n });\n })\n .catch(() => dispatch({\n type: MOVE_LINK_ERRORED\n }));\n }\n}","export const UPDATE_EDITOR_STATE = 'textEditor/UPDATE_EDITOR_STATE';\nexport const CLOSE_EDITOR = 'textEditor/CLOSE_EDITOR';\nexport const SET_HIGHLIGHT_COLOR = 'textEditor/SET_HIGHLIGHT_COLOR';\nexport const HIDE_COLOR_PICKER = 'textEditor/HIDE_COLOR_PICKER';\nexport const TOGGLE_COLOR_PICKER = 'textEditor/TOGGLE_COLOR_PICKER';\nexport const SET_HIGHLIGHT_SELECT_MODE = 'textEditor/SET_HIGHLIGHT_SELECT_MODE';\nexport const SELECT_HIGHLIGHT = 'textEditor/SELECT_HIGHLIGHT';\nexport const TOGGLE_HIGHLIGHTS = 'textEditor/TOGGLE_HIGHLIGHTS';\n\nconst initialState = {\n editorStates: {},\n highlightColors: {},\n displayColorPickers: {},\n errored: false,\n highlightSelectModes: {},\n selectedHighlights: {},\n highlightsHidden: {},\n};\n\nexport default function(state = initialState, action) {\n switch (action.type) {\n case UPDATE_EDITOR_STATE:\n let updatedStates = Object.assign({}, state.editorStates);\n updatedStates[action.editorKey] = action.editorState;\n return {\n ...state,\n editorStates: updatedStates\n };\n\n case CLOSE_EDITOR:\n let cleanedStates = Object.assign({}, state.editorStates);\n delete cleanedStates[action.editorKey];\n return {\n ...state,\n editorStates: cleanedStates\n };\n\n case SET_HIGHLIGHT_COLOR:\n let updatedHighlightColors = Object.assign({}, state.highlightColors);\n updatedHighlightColors[action.editorKey] = action.highlightColor;\n return {\n ...state,\n highlightColors: updatedHighlightColors\n };\n\n case HIDE_COLOR_PICKER:\n let updatedDisplayColorPickers = Object.assign({}, state.displayColorPickers);\n updatedDisplayColorPickers[action.editorKey] = false;\n return {\n ...state,\n displayColorPickers: updatedDisplayColorPickers\n };\n\n case TOGGLE_COLOR_PICKER:\n let updatedToggleDisplayColorPickers = Object.assign({}, state.displayColorPickers);\n updatedToggleDisplayColorPickers[action.editorKey] = !updatedToggleDisplayColorPickers[action.editorKey];\n return {\n ...state,\n displayColorPickers: updatedToggleDisplayColorPickers\n };\n\n case SET_HIGHLIGHT_SELECT_MODE:\n let updatedHighlightSelectModes = Object.assign({}, state.highlightSelectModes);\n updatedHighlightSelectModes[action.editorKey] = action.value;\n return {\n ...state,\n highlightSelectModes: updatedHighlightSelectModes\n };\n\n case SELECT_HIGHLIGHT:\n let updatedSelectedHighlights = Object.assign({}, state.selectedHighlights);\n updatedSelectedHighlights[action.editorKey] = action.highlightKey;\n return {\n ...state,\n selectedHighlights: updatedSelectedHighlights\n };\n \n case TOGGLE_HIGHLIGHTS:\n let highlightsHidden = { ...state.highlightsHidden };\n highlightsHidden[action.editorKey] = action.value;\n return {\n ...state,\n highlightsHidden\n };\n \n default:\n return state;\n }\n}\n\nexport function updateEditorState(editorKey, editorState) {\n return function(dispatch) {\n dispatch({\n type: UPDATE_EDITOR_STATE,\n editorKey,\n editorState\n });\n }\n}\n\nexport function closeEditor(editorKey) {\n return function(dispatch) {\n return dispatch({\n type: CLOSE_EDITOR,\n editorKey\n });\n }\n}\n\nexport function setTextHighlightColor(editorKey, highlightColor) {\n return function(dispatch) {\n dispatch({\n type: SET_HIGHLIGHT_COLOR,\n editorKey,\n highlightColor\n });\n dispatch({\n type: HIDE_COLOR_PICKER,\n editorKey\n });\n }\n}\n\nexport function toggleTextColorPicker(editorKey) {\n return function(dispatch) {\n dispatch({\n type: TOGGLE_COLOR_PICKER,\n editorKey\n });\n }\n}\n\nexport function setHighlightSelectMode(editorKey, value) {\n return function(dispatch, getState) {\n dispatch({\n type: SET_HIGHLIGHT_SELECT_MODE,\n editorKey,\n value\n });\n // deselect when leaving highlight-select-mode\n if (!value) {\n dispatch({\n type: SELECT_HIGHLIGHT,\n editorKey,\n highlightKey: null\n });\n window.setTimeout(() => {\n dispatch({\n type: UPDATE_EDITOR_STATE,\n editorKey,\n editorState: getState().textEditor.editorStates[editorKey]\n });\n }, 500)\n }\n }\n}\n\nexport function selectHighlight(editorKey, highlightKey) {\n return function(dispatch) {\n dispatch({\n type: SELECT_HIGHLIGHT,\n editorKey,\n highlightKey // pass null to this parameter to deselect\n });\n }\n}\n\nexport function toggleTextHighlights(editorKey, value) {\n return function(dispatch) {\n dispatch({\n type: TOGGLE_HIGHLIGHTS,\n editorKey,\n value\n });\n };\n}\n","import { loadProject } from './project';\nimport { closeDocumentFolders } from './documentGrid'\n\nexport const NEW_FOLDER = 'folders/NEW_FOLDER';\nexport const POST_SUCCESS = 'folders/POST_SUCCESS';\nexport const POST_ERRORED = 'folders/POST_ERRORED';\nexport const FOLDER_OPENED = 'folders/FOLDER_OPENED';\nexport const OPEN_SUCCESS = 'folders/OPEN_SUCCESS';\nexport const OPEN_ERRORED = 'folders/OPEN_ERRORED';\nexport const FOLDER_CLOSED = 'folders/FOLDER_CLOSED';\nexport const UPDATE_FOLDER = 'folders/UPDATE_FOLDER';\nexport const PATCH_SUCCESS = 'folders/PATCH_SUCCESS';\nexport const PATCH_ERRORED = 'folders/PATCH_ERRORED';\nexport const DELETE_FOLDER = 'folders/DELETE_DOCUMENT';\nexport const DELETE_SUCCESS = 'folders/DELETE_SUCCESS';\nexport const DELETE_ERRORED = 'folders/DELETE_ERRORED';\nexport const MOVE_FOLDER = 'folders/MOVE_FOLDER';\nexport const MOVE_FOLDER_SUCCESS = 'folders/MOVE_FOLDER_SUCCESS';\nexport const MOVE_FOLDER_ERRORED = 'folders/MOVE_FOLDER_ERRORED';\nexport const ADD_TREE = 'folders/ADD_TREE';\nexport const ADD_TREE_SUCCESS = 'folders/ADD_TREE_SUCCESS';\nexport const ADD_TREE_ERRORED = 'folders/ADD_TREE_ERRORED';\n\nconst initialState = {\n openFolderContents: {}\n};\n\nexport default function(state = initialState, action) {\n switch (action.type) {\n case FOLDER_OPENED:\n case MOVE_FOLDER:\n case DELETE_FOLDER:\n let loadingOpenFolderContents = Object.assign({}, state.openFolderContents);\n loadingOpenFolderContents[action.id] = 'loading';\n return {\n ...state,\n openFolderContents: loadingOpenFolderContents\n };\n\n case OPEN_SUCCESS:\n case MOVE_FOLDER_SUCCESS:\n let successOpenFolderContents = Object.assign({}, state.openFolderContents);\n successOpenFolderContents[action.id] = action.contentsChildren;\n return {\n ...state,\n openFolderContents: successOpenFolderContents\n };\n\n case OPEN_ERRORED:\n case MOVE_FOLDER_ERRORED:\n case DELETE_ERRORED:\n let erroredOpenFolderContents = Object.assign({}, state.openFolderContents);\n erroredOpenFolderContents[action.id] = 'errored'\n return {\n ...state,\n openFolderContents: erroredOpenFolderContents\n };\n\n case FOLDER_CLOSED:\n case DELETE_SUCCESS:\n let closeOpenFolderContents = Object.assign({}, state.openFolderContents);\n closeOpenFolderContents[action.id] = null;\n return {\n ...state,\n openFolderContents: closeOpenFolderContents\n };\n\n default:\n return state;\n }\n}\n\nexport function createFolder(parentId, parentType, title = 'New Folder', position = 0) {\n return function(dispatch, getState) {\n dispatch({\n type: NEW_FOLDER\n });\n\n fetch('/document_folders', {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'POST',\n body: JSON.stringify({\n title,\n project_id: getState().project.id,\n parent_id: parentId,\n parent_type: parentType\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response.json();\n })\n .then(async folder => {\n // move folder into position if specified\n if (position && position !== 0) {\n let moveBody = {\n document_folder: {\n position,\n }\n };\n if (parentType !== \"Project\") {\n moveBody.document_folder.destination_id = parentId;\n }\n fetch(`/document_folders/${folder.id}/move`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'PATCH',\n body: JSON.stringify(moveBody)\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return;\n })\n .then(() => {\n if (parentType === \"DocumentFolder\") {\n dispatch(openFolder(parentId));\n }\n });\n }\n })\n .then(() => dispatch(loadProject(getState().project.id)))\n .then(() => dispatch({\n type: POST_SUCCESS\n }))\n .catch(() => dispatch({\n type: POST_ERRORED\n }));\n }\n}\n\nexport function openFolder(id) {\n return function(dispatch, getState) {\n dispatch({\n type: FOLDER_OPENED,\n id\n });\n\n fetch(`document_folders/${id}`, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(folder => {\n dispatch({\n type: OPEN_SUCCESS,\n id,\n contentsChildren: folder.contents_children\n });\n if (folder.parent_type === \"DocumentFolder\") {\n // open all parent folders up to root if not open\n const { openFolderContents } = getState().folders;\n if (!Object.hasOwn(openFolderContents, folder.parent_id)) {\n dispatch(openFolder(folder.parent_id));\n }\n }\n })\n .catch(() => dispatch({\n type: OPEN_ERRORED\n }));\n };\n}\n\nexport function closeFolder(id) {\n return function(dispatch) {\n dispatch({\n type: FOLDER_CLOSED,\n id\n });\n };\n}\n\nexport function moveFolder(folderID, destination_id, destinationParentType, position ) {\n return function(dispatch) {\n dispatch({\n type: UPDATE_FOLDER\n });\n\n return fetch(`/document_folders/${folderID}/move`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'PATCH',\n body: JSON.stringify({\n document_folder: {\n destination_id,\n position\n }\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(() => {\n dispatch({\n type: MOVE_FOLDER_SUCCESS\n });\n })\n .catch(() => dispatch({\n type: MOVE_FOLDER_ERRORED\n }));\n }\n}\n\nexport function updateFolder(id, attributes) {\n return function(dispatch) {\n dispatch({\n type: UPDATE_FOLDER\n });\n\n return fetch(`/document_folders/${id}`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'PATCH',\n body: JSON.stringify(attributes)\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(folder => {\n dispatch({\n type: PATCH_SUCCESS,\n folder\n });\n })\n .catch(() => dispatch({\n type: PATCH_ERRORED\n }));\n }\n}\n\nexport function deleteFolder(folderId, parentType, parentId) {\n return function(dispatch, getState) {\n dispatch({\n type: DELETE_FOLDER,\n id: folderId\n });\n\n fetch(`/document_folders/${folderId}`, {\n method: 'DELETE',\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => response.json())\n .then((descendants) => {\n dispatch(closeDocumentFolders(descendants));\n dispatch({\n type: DELETE_SUCCESS,\n id: folderId\n });\n if (parentType === 'Project') {\n dispatch(loadProject(getState().project.id));\n }\n if (parentType === 'DocumentFolder' && getState().folders.openFolderContents[parentId]) {\n dispatch(openFolder(parentId))\n }\n })\n .catch(() => dispatch({\n type: DELETE_ERRORED,\n id: folderId\n }));\n };\n}\n\nexport function addTree( parentId, parentType, tree) {\n return function(dispatch, getState) {\n dispatch({\n type: ADD_TREE\n });\n\n fetch(`/document_folders/${parentId}/add_tree`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'POST',\n body: JSON.stringify({\n document_folder: {\n parent_id: parentId,\n parent_type: parentType,\n tree \n }\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n })\n .then(() => dispatch(loadProject(getState().project.id)))\n .then(() => dispatch({\n type: ADD_TREE_SUCCESS\n }))\n .catch(() => dispatch({\n type: ADD_TREE_ERRORED\n }));\n }\n}","import {\n TEXT_RESOURCE_TYPE,\n CANVAS_RESOURCE_TYPE,\n loadProject,\n IMAGE_UPLOAD_STARTED,\n IMAGE_UPLOAD_COMPLETE,\n IMAGE_UPLOAD_ERRORED,\n IMAGE_UPLOAD_TIMEOUT,\n IMAGE_UPLOAD_TO_RAILS_SUCCESS,\n IMAGE_UPLOAD_DOC_CREATED,\n} from './project';\nimport {\n addLink,\n selectSidebarTarget,\n closeSidebarTarget,\n refreshTarget,\n closeDocumentTargets,\n refreshTargetByDocumentID,\n closeTarget\n} from './annotationViewer';\nimport {\n updateEditorState,\n selectHighlight,\n setHighlightSelectMode\n} from './textEditor';\nimport { deleteFolder, openFolder } from './folders';\nimport {\n setAddTileSourceMode,\n UPLOAD_SOURCE_TYPE,\n PAGE_TO_CHANGE,\n RENAME_LAYER_SUCCESS,\n TOGGLE_EDIT_LAYER_NAME,\n} from './canvasEditor';\nimport fetchWithTimeout from './fetch';\nimport retryFetch from 'fetch-retry';\nimport { defaultRequestTimeout } from './constants';\n\nexport const DEFAULT_LAYOUT = 'default';\nexport const TEXT_HIGHLIGHT_DELETE = 'TEXT_HIGHLIGHT_DELETE';\nexport const CANVAS_HIGHLIGHT_DELETE = 'CANVAS_HIGHLIGHT_DELETE';\nexport const DOCUMENT_DELETE = 'DOCUMENT_DELETE';\nexport const FOLDER_DELETE = 'FOLDER_DELETE';\nexport const OPEN_DOCUMENT = 'document_grid/OPEN_DOCUMENT';\nexport const OPEN_DOCUMENT_SUCCESS = 'document_grid/OPEN_DOCUMENT_SUCCESS';\nexport const OPEN_DOCUMENT_ERRORED = 'document_grid/OPEN_DOCUMENT_ERRORED';\nexport const CLOSE_DOCUMENT = 'document_grid/CLOSE_DOCUMENT';\nexport const REPLACE_DOCUMENT = 'document_grid/REPLACE_DOCUMENT';\nexport const CLEAR_RESOURCES = 'document_grid/CLEAR_RESOURCES';\nexport const ADD_HIGHLIGHT = 'document_grid/ADD_HIGHLIGHT';\nexport const ADD_HIGHLIGHT_SUCCESS = 'document_grid/ADD_HIGHLIGHT_SUCCESS';\nexport const ADD_HIGHLIGHT_ERRORED = 'document_grid/ADD_HIGHLIGHT_ERRORED';\nexport const DELETE_HIGHLIGHT = 'document_grid/DELETE_HIGHLIGHT';\nexport const DELETE_HIGHLIGHT_ERRORED = 'document_grid/DELETE_HIGHLIGHT_ERRORED';\nexport const DELETE_HIGHLIGHT_SUCCESS = 'document_grid/DELETE_HIGHLIGHT_SUCCESS';\nexport const UPDATE_HIGHLIGHT = 'document_grid/UPDATE_HIGHLIGHT';\nexport const UPDATE_HIGHLIGHT_ERRORED = 'document_grid/UPDATE_HIGHLIGHT_ERRORED';\nexport const UPDATE_HIGHLIGHT_SUCCESS = 'document_grid/UPDATE_HIGHLIGHT_SUCCESS';\nexport const DUPLICATE_HIGHLIGHTS = 'document_grid/DUPLICATE_HIGHLIGHTS';\nexport const DUPLICATE_HIGHLIGHTS_SUCCESS = 'document_grid/DUPLICATE_HIGHLIGHTS_SUCCESS';\nexport const DUPLICATE_HIGHLIGHTS_ERRORED = 'document_grid/DUPLICATE_HIGHLIGHTS_ERRORED';\nexport const MOVE_DOCUMENT = 'document_grid/MOVE_DOCUMENT';\nexport const MOVE_DOCUMENT_SUCCESS = 'document_grid/MOVE_DOCUMENT_SUCCESS';\nexport const MOVE_DOCUMENT_ERRORED = 'document_grid/MOVE_DOCUMENT_ERRORED';\nexport const UPDATE_DOCUMENT = 'document_grid/UPDATE_CONTENT';\nexport const CHECK_IN_DOCS = 'document_grid/CHECK_IN_DOCS';\nexport const UPDATE_SNACK_BAR = 'document_grid/UPDATE_SNACK_BAR';\nexport const PATCH_SUCCESS = 'document_grid/PATCH_SUCCESS';\nexport const PATCH_ERRORED = 'document_grid/PATCH_ERRORED';\nexport const NEW_DOCUMENT = 'document_grid/NEW_DOCUMENT';\nexport const POST_SUCCESS = 'document_grid/POST_SUCCESS';\nexport const POST_ERRORED = 'document_grid/POST_ERRORED';\nexport const DELETE_DOCUMENT = 'document_grid/DELETE_DOCUMENT';\nexport const DELETE_SUCCESS = 'document_grid/DELETE_SUCCESS';\nexport const DELETE_ERRORED = 'document_grid/DELETE_ERRORED';\nexport const OPEN_DELETE_DIALOG = 'document_grid/OPEN_DELETE_DIALOG';\nexport const CLOSE_DELETE_DIALOG = 'document_grid/CLOSE_DELETE_DIALOG';\nexport const ADD_IMAGE_TO_DOCUMENT = 'document_grid/ADD_IMAGE_TO_DOCUMENT';\nexport const ADD_IMAGE_SUCCESS = 'document_grid/ADD_IMAGE_SUCCESS';\nexport const ADD_IMAGE_ERRORED = 'document_grid/ADD_IMAGE_ERRORED';\nexport const SET_CURRENT_LAYOUT = 'document_grid/SET_CURRENT_LAYOUT';\nexport const MOVE_DOCUMENT_WINDOW = 'document_grid/MOVE_DOCUMENT_WINDOW';\nexport const CANVAS_LAYER_DELETE = 'document_grid/CANVAS_LAYER_DELETE';\nexport const REFRESH_DOCUMENTS = 'document_grid/REFRESH_DOCUMENTS';\nexport const GET_CURRENT_DOC_CONTENT = 'document_grid/GET_CURRENT_DOC_CONTENT';\nexport const GET_CURRENT_DOC_CONTENT_SUCCESS = 'document_grid/GET_CURRENT_DOC_CONTENT_SUCCESS';\nexport const GET_CURRENT_DOC_CONTENT_ERRORED = 'document_grid/GET_CURRENT_DOC_CONTENT_ERRORED';\nexport const FETCH_LOCK_SUCCESS = 'document_grid/FETCH_LOCK_SUCCESS';\nexport const FETCH_LOCK_ERRORED = 'document_grid/FETCH_LOCK_ERRORED';\nexport const FROM_IMAGE_SUCCESS = 'document_grid/FROM_IMAGE_SUCCESS';\nexport const OPEN_INITIAL_DOCS_STARTED = 'document_grid/OPEN_INITIAL_DOCS_STARTED';\nexport const OPEN_INITIAL_DOCS_SUCCESS = 'document_grid/OPEN_INITIAL_DOCS_SUCCESS';\nexport const OPEN_INITIAL_DOCS_ERRORED = 'document_grid/OPEN_INITIAL_DOCS_ERRORED';\n\n\nexport const layoutOptions = [\n { rows: 1, cols: 1, description: '1 x 1' },\n { rows: 1, cols: 2, description: '1 x 2' },\n { rows: 2, cols: 2, description: '2 x 2' },\n { rows: 3, cols: 3, description: '3 x 3' }\n];\n\nexport const MAX_EXCERPT_LENGTH = 80;\n\nconst initialState = {\n layout: DEFAULT_LAYOUT,\n openDocuments: [],\n loading: false,\n highlightsLoading: false,\n errored: false,\n deleteDialogOpen: false,\n deleteDialogTitle: 'Confirm Delete',\n deleteDialogBody: 'Are you sure you want to delete this item?',\n deleteDialogSubmit: 'Delete',\n deleteDialogPayload: null,\n deleteDialogKind: null,\n snackBarOpen: false,\n snackBarMessage: null,\n currentLayout: 2,\n loadingInitialDocs: false,\n};\n\nexport default function(state = initialState, action) {\n switch (action.type) {\n case ADD_HIGHLIGHT:\n case DELETE_HIGHLIGHT:\n case DUPLICATE_HIGHLIGHTS:\n return {\n ...state,\n highlightsLoading: true,\n loading: true\n }\n case UPDATE_HIGHLIGHT:\n return {\n ...state,\n highlightsLoading: action.shouldStartLoading,\n loading: action.shouldStartLoading\n }\n case OPEN_DOCUMENT:\n case NEW_DOCUMENT:\n case DELETE_DOCUMENT:\n case MOVE_DOCUMENT:\n return {\n ...state,\n loading: true\n }\n\n case UPDATE_DOCUMENT:\n return state\n\n case OPEN_DOCUMENT_SUCCESS:\n case POST_SUCCESS:\n let openDocumentsCopy = state.openDocuments.slice(0);\n state.openDocuments.forEach((document, index) => {\n if (+document.id === +action.document.id)\n openDocumentsCopy.splice(index, 1, Object.assign({timeOpened: document.timeOpened}, action.document));\n });\n let positionToSplice = action.documentPosition;\n openDocumentsCopy.splice(positionToSplice, 0, Object.assign({timeOpened: Date.now(), firstTarget: action.firstTarget }, action.document));\n return {\n ...state,\n openDocuments: openDocumentsCopy,\n loading: false\n }\n\n case FROM_IMAGE_SUCCESS:\n return {\n ...state,\n loading: false\n }\n\n case OPEN_DOCUMENT_ERRORED:\n case PATCH_ERRORED:\n case POST_ERRORED:\n case MOVE_DOCUMENT_ERRORED:\n case DELETE_ERRORED:\n console.log('document error');\n console.log(action.type);\n return {\n ...state,\n loading: false,\n errored: true\n }\n\n \n case DELETE_HIGHLIGHT_ERRORED:\n case UPDATE_HIGHLIGHT_ERRORED:\n case DUPLICATE_HIGHLIGHTS_ERRORED:\n case ADD_HIGHLIGHT_ERRORED:\n console.log('highlight error');\n console.log(action.type);\n return {\n ...state,\n loading: false,\n highlightsLoading: false,\n errored: true\n }\n\n case CHECK_IN_DOCS: {\n const nextOpenDocs = [ ...state.openDocuments ]\n nextOpenDocs.forEach( resource => {\n if( action.docIDs.find( docID => docID === resource.document_id ) ) {\n resource.locked=false\n resource.locked_by_me=false\n resource.locked_by_user_name=null\n }\n })\n\n const numDocs = action.docIDs.length\n const snackBarMessage = numDocs > 0 ? `Checked in ${numDocs} documents.` : \"All your documents are checked in.\"\n\n return {\n ...state,\n snackBarOpen: true,\n snackBarMessage,\n openDocuments: nextOpenDocs\n };\n }\n\n case UPDATE_SNACK_BAR: {\n const { snackBarOpen, snackBarMessage } = action\n return {\n ...state,\n snackBarOpen,\n snackBarMessage \n }\n }\n\n case REFRESH_DOCUMENTS:\n let preRefreshDocumentsCopy = state.openDocuments.slice(0);\n state.openDocuments.forEach((document, index) => {\n if (+document.id === +action.document.id \n && action.timeOpened \n && document.timeOpened !== action.timeOpened) {\n const { timeOpened } = document;\n preRefreshDocumentsCopy.splice(index, 1, Object.assign({timeOpened}, action.document));\n }\n });\n return {\n ...state,\n openDocuments: preRefreshDocumentsCopy\n };\n \n case PATCH_SUCCESS:\n case REPLACE_DOCUMENT:\n let preReplaceDocumentsCopy = state.openDocuments.slice(0);\n if (!action.shouldSkipReplacement) {\n state.openDocuments.forEach((document, index) => {\n if (+document.id === +action.document.id) {\n const { timeOpened } = document;\n preReplaceDocumentsCopy.splice(index, 1, Object.assign({timeOpened}, action.document));\n }\n });\n }\n return {\n ...state,\n loading: state.highlightsLoading,\n openDocuments: preReplaceDocumentsCopy\n };\n\n case CLOSE_DOCUMENT:\n let preCloseDocumentsCopy = state.openDocuments.slice(0);\n let toCloseIndex = state.openDocuments.findIndex(resource => {\n return ( resource.id.toString() === action.documentId.toString() &&\n resource.timeOpened === action.timeOpened )\n });\n if (toCloseIndex >= 0) {\n preCloseDocumentsCopy.splice(toCloseIndex, 1);\n }\n return {\n ...state,\n openDocuments: preCloseDocumentsCopy\n };\n\n case DELETE_SUCCESS:\n const targetID = action.documentId.toString();\n const openDocuments = state.openDocuments.filter( openDocument => ( openDocument.id.toString() !== targetID ) )\n return {\n ...state,\n openDocuments,\n loading: false,\n };\n\n case CLEAR_RESOURCES:\n return {\n ...state,\n openDocuments: []\n };\n\n case ADD_HIGHLIGHT_SUCCESS:\n let resourceIndex = state.openDocuments.findIndex(resource => resource.id === action.document_id);\n let updatedopenDocuments = state.openDocuments.slice(0);\n if (resourceIndex >= 0) {\n let updatedResource = Object.assign(updatedopenDocuments[resourceIndex], {});\n updatedResource.highlight_map[action.highlight_id] = {\n id: action.id,\n target: action.highlightTarget,\n color: action.color,\n excerpt: action.excerpt,\n links: []\n };\n updatedopenDocuments.splice(resourceIndex, 1, updatedResource);\n }\n return {\n ...state,\n openDocuments: updatedopenDocuments,\n loading: false,\n highlightsLoading: false,\n }\n\n case DUPLICATE_HIGHLIGHTS_SUCCESS:\n let duplicatesUpdatedOpenDocuments = state.openDocuments.slice(0);\n action.highlights.forEach(highlight => {\n let resourceIndex = state.openDocuments.findIndex(resource => resource.id === action.document_id);\n if (resourceIndex >= 0) {\n let updatedResource = Object.assign(duplicatesUpdatedOpenDocuments[resourceIndex], {});\n updatedResource.highlight_map[highlight.uid] = {\n id: highlight.id,\n target: highlight.target,\n color: highlight.color,\n excerpt: highlight.excerpt,\n links: highlight.links\n };\n duplicatesUpdatedOpenDocuments.splice(resourceIndex, 1, updatedResource);\n }\n });\n return {\n ...state,\n openDocuments: duplicatesUpdatedOpenDocuments,\n loading: false,\n highlightsLoading: false,\n }\n\n case UPDATE_HIGHLIGHT_SUCCESS:\n let hResourceIndex = state.openDocuments.findIndex(resource => resource.id === action.document_id);\n let hUpdatedOpenDocuments = state.openDocuments.slice(0);\n if (hResourceIndex >= 0) {\n let hUpdatedResource = Object.assign(hUpdatedOpenDocuments[hResourceIndex], {});\n if (hUpdatedResource.highlight_map[action.highlight_id])\n hUpdatedResource.highlight_map[action.highlight_id].color = action.color;\n hUpdatedOpenDocuments.splice(hResourceIndex, 1, hUpdatedResource);\n }\n return {\n ...state,\n openDocuments: hUpdatedOpenDocuments,\n highlightsLoading: false,\n loading: false\n }\n\n case MOVE_DOCUMENT_SUCCESS:\n case DELETE_HIGHLIGHT_SUCCESS:\n return {\n ...state,\n highlightsLoading: false,\n loading: false\n }\n\n case OPEN_DELETE_DIALOG:\n return {\n ...state,\n deleteDialogOpen: true,\n deleteDialogTitle: action.title,\n deleteDialogBody: action.body,\n deleteDialogSubmit: action.submit,\n deleteDialogPayload: action.payload,\n deleteDialogKind: action.kind\n };\n\n case CLOSE_DELETE_DIALOG:\n return {\n ...state,\n deleteDialogOpen: false,\n deleteDialogTitle: initialState.deleteDialogTitle,\n deleteDialogBody: initialState.deleteDialogBody,\n deleteDialogSubmit: initialState.deleteDialogSubmit,\n deleteDialogPayload: initialState.deleteDialogPayload,\n deleteDialogKind: initialState.deleteDialogKind\n };\n\n case SET_CURRENT_LAYOUT:\n return {\n ...state,\n currentLayout: action.index\n };\n\n case MOVE_DOCUMENT_WINDOW:\n let draggedDocument = state.openDocuments[action.dragIndex];\n let openDocumentsMoveCopy = state.openDocuments.slice(0);\n openDocumentsMoveCopy.splice(action.dragIndex, 1);\n openDocumentsMoveCopy.splice(action.moveIndex, 0, draggedDocument);\n return {\n ...state,\n openDocuments: openDocumentsMoveCopy\n };\n\n case FETCH_LOCK_SUCCESS:\n const {\n documentId,\n locked,\n locked_by_me,\n locked_by_user_name,\n } = action;\n const openDocumentsFetchUpdated = state.openDocuments.map((doc) => {\n if (+doc.id === +documentId) {\n return {\n ...doc,\n locked,\n locked_by_me,\n locked_by_user_name,\n };\n } else return doc;\n });\n return {\n ...state,\n openDocuments: openDocumentsFetchUpdated\n };\n\n case OPEN_INITIAL_DOCS_STARTED:\n return {\n ...state,\n loadingInitialDocs: true,\n };\n\n case OPEN_INITIAL_DOCS_ERRORED:\n case OPEN_INITIAL_DOCS_SUCCESS:\n return {\n ...state,\n loadingInitialDocs: false,\n loading: false,\n };\n\n default:\n return state;\n }\n}\n\nexport function openDocument(documentId, firstTarget, inContents, pos) {\n return function(dispatch, getState) {\n let documentPosition = getState().documentGrid.openDocuments.length;\n if (!inContents && pos) {\n documentPosition = pos;\n }\n dispatch({\n type: OPEN_DOCUMENT\n });\n\n fetch(`/documents/${documentId}`, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(document => {\n return document;\n })\n .then(document => dispatch({\n type: OPEN_DOCUMENT_SUCCESS,\n document,\n firstTarget,\n documentPosition\n }))\n .catch(() => dispatch({\n type: OPEN_DOCUMENT_ERRORED\n }));\n };\n}\n\nexport function closeAllResources() {\n return function(dispatch) {\n dispatch({\n type: CLEAR_RESOURCES\n });\n };\n}\n\nexport function addHighlight(document_id, highlight_id, highlightTarget, color, excerpt, callback) {\n return function(dispatch) {\n dispatch({\n type: ADD_HIGHLIGHT\n });\n\n fetch('/highlights', {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'POST',\n body: JSON.stringify({\n document_id: document_id,\n uid: highlight_id,\n target: highlightTarget,\n color: color,\n excerpt: excerpt\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(savedHighlight => {\n dispatch({\n type: ADD_HIGHLIGHT_SUCCESS,\n document_id,\n highlight_id,\n highlightTarget,\n color,\n excerpt,\n id: savedHighlight.id\n });\n return savedHighlight\n })\n .then(savedHighlight => {\n if (callback) {\n callback(savedHighlight);\n }\n })\n .catch(() => dispatch({\n type: ADD_HIGHLIGHT_ERRORED\n }));\n }\n}\n\nexport function deleteHighlights(highlights = []) {\n return function(dispatch, getState) {\n highlights.forEach(highlight => {\n if (highlight && highlight.id) {\n fetch(`/highlights/${highlight.id}`, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'DELETE'\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n })\n .then(() => {\n dispatch({\n type: DELETE_HIGHLIGHT_SUCCESS,\n uid: highlight.uid,\n document_id: highlight.document_id\n });\n const sidebarTarget = getState().annotationViewer.sidebarTarget;\n if (sidebarTarget && (+sidebarTarget.document_id === +highlight.document_id && +sidebarTarget.highlight_id === +highlight.id)) {\n dispatch(closeSidebarTarget());\n }\n else if (sidebarTarget && sidebarTarget.links_to.reduce((matched, link) => matched || (+link.document_id === +highlight.document_id && +link.highlight_id === +highlight.id), false)) {\n dispatch(selectSidebarTarget(sidebarTarget));\n }\n getState().annotationViewer.selectedTargets.forEach((target, index) => {\n if (+target.document_id === +highlight.document_id && +target.highlight_id === +highlight.id) {\n dispatch(closeTarget(highlight.document_id, highlight.id));\n }\n else if(target.links_to.reduce((matched, link) => matched || (+link.document_id === +highlight.document_id && +link.highlight_id === +highlight.id), false)) {\n dispatch(refreshTarget(index));\n }\n });\n })\n .catch(() => dispatch({\n type: DELETE_HIGHLIGHT_ERRORED\n }));\n }\n });\n }\n}\n\nexport function updateHighlight(id, attributes, callback) {\n return function(dispatch, getState) {\n dispatch({\n type: UPDATE_HIGHLIGHT,\n shouldStartLoading: !Object.prototype.hasOwnProperty.call(attributes, 'excerpt'),\n });\n\n return fetch(`/highlights/${id}`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'PATCH',\n body: JSON.stringify(attributes)\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(highlight => {\n if (!Object.prototype.hasOwnProperty.call(attributes, 'excerpt')) {\n dispatch(refreshCurrentDocContent(highlight.document_id));\n }\n dispatch({\n type: UPDATE_HIGHLIGHT_SUCCESS,\n color: highlight.color,\n highlight_id: highlight.uid,\n document_id: highlight.document_id\n });\n const sidebarTarget = getState().annotationViewer.sidebarTarget;\n if (sidebarTarget && ((+sidebarTarget.document_id === +highlight.document_id && +sidebarTarget.highlight_id === +highlight.id) || sidebarTarget.links_to.reduce((matched, link) => matched || (+link.document_id === +highlight.document_id && +link.highlight_id === +highlight.id), false))) {\n dispatch(selectSidebarTarget(sidebarTarget));\n }\n getState().annotationViewer.selectedTargets.forEach((target, index) => {\n if ((+target.document_id === +highlight.document_id && +target.highlight_id === +highlight.id) || target.links_to.reduce((matched, link) => matched || (+link.document_id === +highlight.document_id && +link.highlight_id === +highlight.id), false)) {\n dispatch(refreshTarget(index));\n }\n });\n })\n .then(highlight => {\n if (callback) {\n callback(highlight);\n }\n })\n .catch(() => dispatch({\n type: UPDATE_HIGHLIGHT_ERRORED\n }));\n }\n}\n\nexport function duplicateHighlights(highlights, document_id) {\n return function(dispatch) {\n dispatch({\n type: DUPLICATE_HIGHLIGHTS\n });\n\n fetch('/highlights/duplicate', {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'POST',\n body: JSON.stringify({\n highlights,\n document_id\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(newHighlights => {\n dispatch({\n type: DUPLICATE_HIGHLIGHTS_SUCCESS,\n highlights: newHighlights,\n document_id\n });\n })\n .catch(() => dispatch({\n type: DUPLICATE_HIGHLIGHTS_ERRORED\n }));\n }\n}\n\n\nexport function createTextDocument(parentId, parentType, position, callback) {\n return function(dispatch, getState) {\n dispatch({\n type: NEW_DOCUMENT\n });\n\n // Annotation title handling\n let title = parentType === 'Document' ? 'New Annotation' : 'Untitled Document';\n if (\n parentType === 'Document' \n && getState().annotationViewer\n && Array.isArray(getState().annotationViewer.selectedTargets)\n && getState().annotationViewer.selectedTargets.length > 0\n ) {\n getState().annotationViewer.selectedTargets.forEach(target => {\n if (target.document_id === parentId) {\n title = `Annotation for ${target.document_title}`;\n }\n });\n }\n\n fetch('/documents', {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'POST',\n body: JSON.stringify({\n title,\n project_id: getState().project.id,\n document_kind: TEXT_RESOURCE_TYPE,\n content: {type: 'doc', content: [{\"type\":\"paragraph\",\"content\":[]}]},\n parent_id: parentId,\n parent_type: parentType\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(document => {\n if (position && position !== 0) {\n let moveBody = {\n document: {\n position,\n }\n };\n if (parentType !== \"Project\") {\n moveBody.document.destination_id = parentId;\n }\n fetch(`/documents/${document.id}/move`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'PATCH',\n body: JSON.stringify(moveBody)\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n }\n return document;\n })\n .then(document => {\n dispatch({\n type: POST_SUCCESS,\n document,\n documentPosition: getState().documentGrid.openDocuments.length\n });\n if (parentType === 'Project') { // refresh project if document has been added to its table of contents\n dispatch(loadProject(getState().project.id));\n } else if (parentType === 'DocumentFolder') {\n dispatch(openFolder(parentId));\n }\n return document;\n })\n .then(document => {\n if (callback) {\n callback(document);\n }\n })\n .catch(() => dispatch({\n type: POST_ERRORED\n }));\n }\n}\n\nexport function createTextDocumentWithLink(origin, parentId = null, parentType = null, position = 0) {\n return function(dispatch) {\n dispatch(createTextDocument(parentId, parentType, position, document => {\n dispatch(addLink(origin, {\n linkable_id: document.id,\n linkable_type: 'Document'\n }, null, origin.linkable_type));\n }));\n }\n}\n\nexport function moveDocument(documentId, destination_id, destinationParentType, position ) {\n return function(dispatch, getState) {\n dispatch({\n type: MOVE_DOCUMENT\n });\n\n return fetch(`/documents/${documentId}/move`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'PATCH',\n body: JSON.stringify({\n document: {\n destination_id,\n position\n }\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(() => {\n dispatch({\n type: MOVE_DOCUMENT_SUCCESS\n });\n })\n .catch(() => dispatch({\n type: MOVE_DOCUMENT_ERRORED\n }));\n }\n}\n\nexport function refreshDocuments(document, timeOpened) {\n return function(dispatch) {\n dispatch({\n type: REFRESH_DOCUMENTS,\n document,\n timeOpened,\n });\n }\n}\n\nexport function updateDocument(documentId, attributes, options) {\n return function(dispatch, getState) {\n dispatch({\n type: UPDATE_DOCUMENT\n });\n\n // patch via the lock method if we're adjusting the state of the lock\n const url = ( options && options.adjustLock ) ? `/documents/${documentId}/lock` : `/documents/${documentId}`;\n\n return fetch(url, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'PATCH',\n body: JSON.stringify(attributes)\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(document => {\n dispatch({\n type: PATCH_SUCCESS,\n document,\n shouldSkipReplacement: (!!options && !!options.refreshDocumentContent && !!options.timeOpened),\n });\n if (options && options.adjustLock) {\n dispatch({\n type: REPLACE_DOCUMENT,\n document\n });\n if (attributes.locked === false && options.instanceKey) {\n dispatch(selectHighlight(options.instanceKey, null));\n dispatch(setHighlightSelectMode(options.instanceKey, false));\n }\n }\n if (options && options.replaceThisDocument) {\n dispatch({\n type: REPLACE_DOCUMENT,\n document\n });\n }\n if (options && options.refreshLists) {\n if (getState().project.contentsChildren.map(child => child.document_id).includes(documentId)) {\n dispatch(loadProject(getState().project.id));\n } else if (document.parent_type === 'DocumentFolder') {\n dispatch(openFolder(document.parent_id));\n }\n const sidebarTarget = getState().annotationViewer.sidebarTarget;\n if (sidebarTarget && (sidebarTarget.document_id === documentId || sidebarTarget.links_to.map(link => link.document_id).includes(documentId))) {\n dispatch(selectSidebarTarget(sidebarTarget));\n }\n getState().annotationViewer.selectedTargets.forEach((target, index) => {\n if (target.document_id === documentId || target.links_to.map(link => link.document_id).includes(documentId)) {\n dispatch(refreshTarget(index));\n }\n });\n }\n if (options && options.refreshDocumentContent && options.timeOpened) {\n dispatch(refreshDocuments(document, options.timeOpened))\n }\n })\n .catch(() => dispatch({\n type: PATCH_ERRORED\n }));\n }\n}\n\nexport function setDocumentThumbnail({\n documentId,\n image_url,\n }) {\n return function(dispatch, getState) {\n dispatch({\n type: UPDATE_DOCUMENT\n });\n\n fetchWithTimeout(`/documents/${documentId}/set_thumbnail`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'POST',\n body: JSON.stringify({\n image_url\n }),\n retryDelay: 12000,\n })\n .then(response => {\n if (!response.ok) {\n if (response.status === 408) {\n throw Error('Unable to set thumbnail');\n } else {\n throw Error(response.statusText);\n }\n }\n return response;\n })\n .then(response => response.json())\n .then(document => {\n dispatch({\n type: PATCH_SUCCESS,\n document\n });\n if (getState().project.contentsChildren.map(child => child.document_id).includes(documentId)) {\n dispatch(loadProject(getState().project.id));\n }\n const sidebarTarget = getState().annotationViewer.sidebarTarget;\n if (sidebarTarget && (sidebarTarget.document_id === documentId || sidebarTarget.links_to.map(link => link.document_id).includes(documentId))) {\n dispatch(selectSidebarTarget(sidebarTarget));\n }\n getState().annotationViewer.selectedTargets.forEach((target, index) => {\n if (target.document_id === documentId || target.links_to.map(link => link.document_id).includes(documentId)) {\n dispatch(refreshTarget(index));\n }\n });\n })\n .catch(() => {\n dispatch({\n type: PATCH_ERRORED\n });\n });\n }\n}\n\nexport function setHighlightThumbnail(highlightId, image_url, coords, svg_string) {\n return function(dispatch, getState) {\n dispatch({\n type: UPDATE_HIGHLIGHT\n });\n\n fetch(`/highlights/${highlightId}/set_thumbnail`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'POST',\n body: JSON.stringify({\n image_url,\n coords,\n svg_string\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(highlight => {\n dispatch({\n type: UPDATE_HIGHLIGHT_SUCCESS\n });\n const sidebarTarget = getState().annotationViewer.sidebarTarget;\n if (sidebarTarget && ((+sidebarTarget.document_id === +highlight.document_id && +sidebarTarget.highlight_id === +highlight.id) || sidebarTarget.links_to.reduce((matched, link) => matched || (+link.document_id === +highlight.document_id && +link.highlight_id === +highlight.id), false))) {\n dispatch(selectSidebarTarget(sidebarTarget));\n }\n getState().annotationViewer.selectedTargets.forEach((target, index) => {\n if ((+target.document_id === +highlight.document_id && +target.highlight_id === +highlight.id) || target.links_to.reduce((matched, link) => matched || (+link.document_id === +highlight.document_id && +link.highlight_id === +highlight.id), false)) {\n dispatch(refreshTarget(index));\n }\n });\n })\n .catch(() => dispatch({\n type: UPDATE_HIGHLIGHT_ERRORED\n }));\n }\n}\n\nexport function createCanvasDocument({ parentId, parentType, position, callback }) {\n return function(dispatch, getState) {\n dispatch({\n type: NEW_DOCUMENT\n });\n\n fetch('/documents', {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'POST',\n body: JSON.stringify({\n title: 'Untitled Image',\n project_id: getState().project.id,\n document_kind: CANVAS_RESOURCE_TYPE,\n content: { tileSources: [] },\n parent_id: parentId,\n parent_type: parentType\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(document => {\n if (position && position !== 0) {\n let moveBody = {\n document: {\n position,\n }\n };\n if (parentType !== \"Project\") {\n moveBody.document.destination_id = parentId;\n }\n fetch(`/documents/${document.id}/move`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'PATCH',\n body: JSON.stringify(moveBody)\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n }\n return document;\n })\n .then(document => {\n dispatch({\n type: POST_SUCCESS,\n document,\n documentPosition: getState().documentGrid.openDocuments.length\n });\n dispatch(setAddTileSourceMode(document.id, UPLOAD_SOURCE_TYPE));\n if (parentType === 'Project') { // refresh project if document has been added to its table of contents\n dispatch(loadProject(getState().project.id));\n } else if (document.parent_type === 'DocumentFolder') {\n dispatch(openFolder(document.parent_id));\n }\n return document;\n })\n .then(document => {\n if (callback) {\n callback(document);\n }\n })\n .catch(() => dispatch({\n type: POST_ERRORED\n }));\n }\n}\n\nexport function closeDocument(documentId, timeOpened) {\n return function(dispatch) {\n dispatch({\n type: CLOSE_DOCUMENT,\n documentId,\n timeOpened\n });\n };\n}\n\nexport function replaceDocument(document) {\n return function(dispatch) {\n dispatch({\n type: REPLACE_DOCUMENT,\n document\n });\n };\n}\n\nexport function deleteDocument(documentId) {\n return function(dispatch, getState) {\n dispatch({\n type: DELETE_DOCUMENT\n });\n\n fetch(`/documents/${documentId}`, {\n method: 'DELETE',\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n })\n .then(() => {\n dispatch({\n type: DELETE_SUCCESS,\n documentId\n });\n dispatch(closeDocumentTargets(documentId));\n dispatch(refreshTargetByDocumentID(documentId));\n dispatch(loadProject(getState().project.id));\n })\n .catch(() => dispatch({\n type: DELETE_ERRORED\n }));\n };\n}\n\nexport function openDeleteDialog(title, body, submit, payload, kind) {\n return function(dispatch) {\n dispatch({\n type: OPEN_DELETE_DIALOG,\n title,\n body,\n submit,\n payload,\n kind\n });\n }\n}\n\nexport function closeDeleteDialog() {\n return function(dispatch) {\n dispatch({\n type: CLOSE_DELETE_DIALOG\n });\n }\n}\n\n// close any documents found in these folders\nexport function closeDocumentFolders( folders ) {\n return function(dispatch, getState) {\n const openDocuments = getState().documentGrid.openDocuments\n openDocuments.forEach( (document) => {\n const found = folders.find( folderID => folderID === document.parent_id )\n if( found ) {\n dispatch(closeDocumentTargets(document.id));\n dispatch(closeDocument(document.id,document.timeOpened));\n dispatch(refreshTargetByDocumentID(document.id));\n }\n })\n }\n}\n\nexport function confirmDeleteDialog() {\n return function(dispatch, getState) {\n const payload = getState().documentGrid.deleteDialogPayload;\n switch (getState().documentGrid.deleteDialogKind) {\n case TEXT_HIGHLIGHT_DELETE:\n const { editorStates } = getState().textEditor;\n if (payload.transaction && payload.document_id && payload.instanceKey) {\n const newState = editorStates[payload.instanceKey].apply(payload.transaction);\n dispatch(updateEditorState(payload.instanceKey, newState));\n dispatch(updateDocument(\n payload.document_id,\n {content: {type: 'doc', content: payload.transaction.doc.content}},\n { refreshDocumentContent: payload.timeOpened ? true : false, timeOpened: payload.timeOpened }\n ));\n dispatch(deleteHighlights(payload.highlights));\n if (payload.highlightsToDuplicate.length > 0) dispatch(duplicateHighlights(payload.highlightsToDuplicate, payload.document_id));\n payload.alteredHighlights.forEach(highlight => {\n dispatch(updateHighlight(highlight.id, {excerpt: highlight.excerpt}));\n });\n dispatch(selectHighlight(payload.instanceKey, null));\n }\n dispatch(closeDeleteDialog());\n break;\n\n case CANVAS_HIGHLIGHT_DELETE:\n dispatch(deleteHighlights(payload.highlights));\n if (payload.canvas) {\n payload.fabricObjects.forEach(object => {\n payload.canvas.remove(object);\n });\n }\n dispatch(closeDeleteDialog());\n break;\n \n case CANVAS_LAYER_DELETE:\n dispatch(deleteLayer(payload));\n dispatch(closeDeleteDialog());\n break;\n \n case DOCUMENT_DELETE:\n dispatch(deleteDocument(payload.documentId));\n dispatch(closeDeleteDialog());\n break;\n\n case FOLDER_DELETE:\n // TODO close any document windows that are children of this folder and any target windows related to those documents\n dispatch(deleteFolder(payload.folderId, payload.parentType, payload.parentId));\n dispatch(closeDeleteDialog());\n break;\n\n default:\n dispatch(closeDeleteDialog());\n }\n }\n}\n\nexport function setCurrentLayout(event, index) {\n return function(dispatch) {\n dispatch({\n type: SET_CURRENT_LAYOUT,\n index\n });\n };\n}\n\nexport function moveDocumentWindow(dragIndex, moveIndex) {\n return function(dispatch) {\n dispatch({\n type: MOVE_DOCUMENT_WINDOW,\n dragIndex,\n moveIndex\n });\n };\n}\n\nexport function updateSnackBar(snackBarOpen,snackBarMessage) {\n return function(dispatch) {\n dispatch({\n type: UPDATE_SNACK_BAR,\n snackBarMessage, \n snackBarOpen\n });\n };\n}\n\nexport function moveLayer({ documentId, origin, direction, editorKey }) {\n return function(dispatch, getState) {\n dispatch({\n type: UPDATE_DOCUMENT\n });\n\n fetch(`/documents/${documentId}/move_layer`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'PATCH',\n body: JSON.stringify({\n origin,\n direction,\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(document => {\n if (getState().project.contentsChildren.map(child => child.document_id).includes(documentId)) {\n dispatch(loadProject(getState().project.id));\n }\n const sidebarTarget = getState().annotationViewer.sidebarTarget;\n if (sidebarTarget && (sidebarTarget.document_id === documentId || sidebarTarget.links_to.map(link => link.document_id).includes(documentId))) {\n dispatch(selectSidebarTarget(sidebarTarget));\n }\n getState().annotationViewer.selectedTargets.forEach((target, index) => {\n if (target.document_id === documentId || target.links_to.map(link => link.document_id).includes(documentId)) {\n dispatch(refreshTarget(index));\n }\n });\n if (document.content && document.content.tileSources && document.content.tileSources[0]) {\n const firstTileSource = document.content.tileSources[0];\n // Update doc thumbnail\n let imageUrlForThumbnail = '';\n if (typeof firstTileSource === 'string') {\n // Tile source is a string, so it's IIIF\n let resourceURL = firstTileSource.replace('http:', 'https:').replace('/info.json', '');\n imageUrlForThumbnail = resourceURL + '/full/!400,400/0/default.png';\n } else if (firstTileSource.url && firstTileSource.type === 'image') {\n imageUrlForThumbnail = firstTileSource.url;\n } else {\n imageUrlForThumbnail = firstTileSource;\n }\n dispatch(setDocumentThumbnail({\n documentId,\n image_url: imageUrlForThumbnail,\n }));\n }\n dispatch({\n type: REPLACE_DOCUMENT,\n document\n });\n })\n .then(() => {\n dispatch({\n type: PAGE_TO_CHANGE,\n pageToChange: origin + direction,\n editorKey,\n });\n dispatch({\n type: PATCH_SUCCESS,\n document\n });\n })\n .catch(() => dispatch({\n type: PATCH_ERRORED\n }));\n }\n}\n\n\nexport function deleteLayer({ documentId, layer, editorKey }) {\n return function(dispatch, getState) {\n dispatch({\n type: UPDATE_DOCUMENT\n });\n\n fetch(`/documents/${documentId}/delete_layer`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'PATCH',\n body: JSON.stringify({\n layer,\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(document => {\n if (getState().project.contentsChildren.map(child => child.document_id).includes(documentId)) {\n dispatch(loadProject(getState().project.id));\n }\n const sidebarTarget = getState().annotationViewer.sidebarTarget;\n if (sidebarTarget && (sidebarTarget.document_id === documentId || sidebarTarget.links_to.map(link => link.document_id).includes(documentId))) {\n dispatch(selectSidebarTarget(sidebarTarget));\n }\n getState().annotationViewer.selectedTargets.forEach((target, index) => {\n if (target.document_id === documentId || target.links_to.map(link => link.document_id).includes(documentId)) {\n dispatch(refreshTarget(index));\n }\n });\n if (layer === 0 && document.content && document.content.tileSources && document.content.tileSources[0]) {\n const firstTileSource = document.content.tileSources[0];\n // Update doc thumbnail\n let imageUrlForThumbnail = '';\n if (typeof firstTileSource === 'string') {\n // Tile source is a string, so it's IIIF\n let resourceURL = firstTileSource.replace('http:', 'https:').replace('/info.json', '');\n imageUrlForThumbnail = resourceURL + '/full/!400,400/0/default.png';\n } else if (firstTileSource.url && firstTileSource.type === 'image') {\n imageUrlForThumbnail = firstTileSource.url;\n } else {\n imageUrlForThumbnail = firstTileSource;\n }\n dispatch(setDocumentThumbnail({\n documentId,\n image_url: imageUrlForThumbnail\n }));\n }\n dispatch({\n type: REPLACE_DOCUMENT,\n document\n });\n })\n .then(() => {\n dispatch({\n type: PAGE_TO_CHANGE,\n pageToChange: 0,\n editorKey,\n });\n dispatch({\n type: PATCH_SUCCESS,\n document\n });\n })\n .catch(() => dispatch({\n type: PATCH_ERRORED\n }));\n }\n}\n\n\nexport function renameLayer({ documentId, layer, name, editorKey }) {\n return function(dispatch, getState) {\n dispatch({\n type: UPDATE_DOCUMENT\n });\n\n fetch(`/documents/${documentId}/rename_layer`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'PATCH',\n body: JSON.stringify({\n layer,\n name,\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(document => {\n if (getState().project.contentsChildren.map(child => child.document_id).includes(documentId)) {\n dispatch(loadProject(getState().project.id));\n }\n const sidebarTarget = getState().annotationViewer.sidebarTarget;\n if (sidebarTarget && (sidebarTarget.document_id === documentId || sidebarTarget.links_to.map(link => link.document_id).includes(documentId))) {\n dispatch(selectSidebarTarget(sidebarTarget));\n }\n getState().annotationViewer.selectedTargets.forEach((target, index) => {\n if (target.document_id === documentId || target.links_to.map(link => link.document_id).includes(documentId)) {\n dispatch(refreshTarget(index));\n }\n });\n dispatch({\n type: REPLACE_DOCUMENT,\n document\n });\n })\n .then(() => {\n dispatch({\n type: PAGE_TO_CHANGE,\n pageToChange: layer,\n editorKey,\n });\n dispatch({\n type: TOGGLE_EDIT_LAYER_NAME,\n editorKey,\n value: false,\n });\n dispatch({\n type: RENAME_LAYER_SUCCESS,\n });\n })\n .catch(() => dispatch({\n type: PATCH_ERRORED\n }));\n }\n}\n\nexport function refreshCurrentDocContent(documentId) {\n return function(dispatch) {\n dispatch({\n type: GET_CURRENT_DOC_CONTENT\n });\n\n fetch(`/documents/${documentId}`, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(document => dispatch({\n type: REPLACE_DOCUMENT,\n document,\n }))\n .catch(() => dispatch({\n type: GET_CURRENT_DOC_CONTENT_ERRORED\n }));\n };\n}\n\nexport function fetchLock(documentId) {\n return function(dispatch) {\n fetch(`/documents/${documentId}`, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(document => dispatch({\n type: FETCH_LOCK_SUCCESS,\n documentId,\n locked: document.locked,\n locked_by_me: document.locked_by_me,\n locked_by_user_name: document.locked_by_user_name,\n }))\n .catch(() => dispatch({\n type: FETCH_LOCK_ERRORED\n }));\n };\n}\n\nfunction createCanvasDocWithImage ({ parentId, parentType, signedId, url, filename }) {\n return async function(dispatch, getState) {\n dispatch({\n type: NEW_DOCUMENT\n });\n try {\n const response = await fetchWithTimeout('/documents/create_batch', {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'POST',\n body: JSON.stringify({\n title: 'Loading',\n project_id: getState().project.id,\n document_kind: CANVAS_RESOURCE_TYPE,\n content: {\n tileSources: [\n {\n type: 'image',\n url,\n name: filename,\n }\n ]\n },\n parent_id: parentId,\n parent_type: parentType,\n locked: false,\n images: [signedId],\n mode: 'batch',\n }),\n })\n if (!response.ok) {\n throw Error(response.statusText);\n }\n const queuedJob = await response.json();\n dispatch({\n type: FROM_IMAGE_SUCCESS,\n });\n dispatch({\n type: IMAGE_UPLOAD_DOC_CREATED,\n signedId,\n });\n return queuedJob;\n }\n catch(error) {\n let errMsg = error.message;\n if (error.name === 'AbortError') {\n errMsg = 'Upload failed';\n }\n dispatch({\n type: IMAGE_UPLOAD_ERRORED,\n signedId,\n error: errMsg,\n });\n dispatch({\n type: POST_ERRORED\n });\n }\n }\n}\n\nasync function createFolderForBatch({ projectId, newFolderName }) {\n return fetchWithTimeout('/document_folders', {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'POST',\n body: JSON.stringify({\n title: newFolderName,\n project_id: projectId,\n parent_id: projectId,\n parent_type: 'Project'\n }),\n retryDelay: defaultRequestTimeout,\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response.json();\n })\n}\n\nfunction createMultipleCanvasDocs({ parentId, parentType, signedIds }) {\n return async function(dispatch, getState) {\n try {\n const jobsQueue = await Promise.allSettled(\n signedIds.map(async signedId => {\n try {\n const response = await retryFetch(fetchWithTimeout)(`/images/${signedId}`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'GET',\n retryDelay: defaultRequestTimeout,\n retries: 3,\n })\n if (!response.ok) {\n throw Error(response.statusText);\n }\n const image = await response.json();\n const filename = image.blob.filename.substring(\n 0, image.blob.filename.lastIndexOf('.')\n );\n dispatch({\n type: IMAGE_UPLOAD_TO_RAILS_SUCCESS,\n signedId,\n image: image.blob,\n });\n const queuedJob = await dispatch(createCanvasDocWithImage({\n parentId,\n parentType,\n signedId,\n filename,\n url: image.url,\n }));\n return Promise.resolve({ ...queuedJob, signedId });\n } \n catch (error) {\n let errMsg = error.message;\n if (error.name === 'AbortError') {\n errMsg = 'Upload failed';\n }\n dispatch({\n type: IMAGE_UPLOAD_ERRORED,\n signedId,\n error: errMsg,\n });\n return Promise.reject(error);\n }\n })\n );\n let jobs = jobsQueue\n .filter(jobPromise => jobPromise.status === 'fulfilled')\n .map(job => ({\n signed_id: job.value.signedId,\n id: job.value.id,\n }));\n try {\n const response = await retryFetch(fetchWithTimeout)(`/jobs`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'POST',\n body: JSON.stringify({\n jobs\n }),\n retryDelay: defaultRequestTimeout / 4,\n retries: 35,\n retryOn: async (attempt, error, response) => {\n const finishedStatuses = ['complete', 'failed', 'interrupted'];\n const res = await response.json();\n if (attempt > 35) {\n res\n .forEach(job => {\n if (job.status === 'complete') {\n dispatch({\n type: IMAGE_UPLOAD_COMPLETE,\n signedId: job.signed_id,\n });\n } else if (job.status === 'failed' || job.status === 'interrupted') {\n dispatch({\n type: IMAGE_UPLOAD_ERRORED,\n signedId: job.signed_id,\n error: job.status,\n });\n } else {\n dispatch({\n type: IMAGE_UPLOAD_TIMEOUT,\n signedId: job.signed_id,\n error: 'Queued and processing',\n });\n }\n });\n return false;\n }\n res.forEach(job => {\n if (job.status === 'complete') {\n dispatch({\n type: IMAGE_UPLOAD_COMPLETE,\n signedId: job.signed_id,\n });\n } else if (job.status === 'failed' || job.status === 'interrupted') {\n dispatch({\n type: IMAGE_UPLOAD_ERRORED,\n signedId: job.signed_id,\n error: job.status,\n });\n }\n })\n const unfinished = res.some(job => !finishedStatuses.includes(job.status));\n if (error !== null || response.status >= 400 || unfinished) {\n return true;\n }\n },\n })\n if (!response.ok) {\n throw Error(response.statusText);\n }\n } catch (error) {\n console.error(error);\n }\n if (parentType === 'Project') // refresh project if documents added to its table of contents\n dispatch(loadProject(getState().project.id));\n } catch (error) {\n console.error(error);\n }\n }\n}\n\nexport function createBatchImages ({\n projectId,\n signedIds,\n inFolder,\n existingFolder,\n folderId,\n newFolderName,\n}) {\n return async function(dispatch) {\n dispatch({\n type: IMAGE_UPLOAD_STARTED,\n signedIds,\n });\n let parentId = projectId;\n let parentType = 'Project';\n try { \n if (inFolder) {\n if (existingFolder && folderId) {\n parentType = 'DocumentFolder';\n parentId = parseInt(folderId, 10);\n await dispatch(createMultipleCanvasDocs({\n parentId,\n parentType,\n signedIds,\n }));\n } else if (!existingFolder && newFolderName) {\n parentType = 'DocumentFolder';\n const folder = await createFolderForBatch({\n projectId,\n newFolderName,\n });\n await dispatch(createMultipleCanvasDocs({\n parentId: folder.id,\n parentType,\n signedIds,\n }));\n dispatch(loadProject(projectId));\n }\n } else {\n await dispatch(createMultipleCanvasDocs({\n parentId,\n parentType,\n signedIds,\n }));\n }\n } catch (error) {\n console.error(error);\n }\n };\n}\n\nexport function openInitialDocs(docIds) {\n return async function(dispatch, getState) {\n if (docIds.length > 0) {\n dispatch({\n type: OPEN_INITIAL_DOCS_STARTED,\n });\n await Promise.all(docIds.map(async (documentId, idx) => {\n return fetch(`/documents/${documentId}`, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(document => {\n return document;\n })\n .then(async document => {\n await dispatch({\n type: OPEN_DOCUMENT_SUCCESS,\n document,\n firstTarget: null,\n documentPosition: idx,\n });\n if (document.parent_type === \"DocumentFolder\") {\n // open parent folder if not open\n const { openFolderContents } = getState().folders;\n if (!Object.hasOwn(openFolderContents, document.parent_id)) {\n dispatch(openFolder(document.parent_id));\n }\n } else if (document.parent_type === \"Document\" && !docIds.includes(document.parent_id.toString())) {\n // if document is an annotation (parent is a document),\n // open parent document at position 0\n await fetch(`/documents/${document.parent_id}`, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(parentDoc => {\n return parentDoc;\n })\n .then(parentDoc => {\n const parentLink = document.links_to.find((link) => link.document_id === parentDoc.id);\n const firstTarget = parentLink && parentLink.highlight_uid;\n dispatch({\n type: OPEN_DOCUMENT_SUCCESS,\n document: parentDoc,\n firstTarget,\n documentPosition: idx - 1 >= 0 ? idx - 1 : 0,\n });\n return Promise.resolve();\n })\n .catch(() => {\n dispatch({\n type: OPEN_DOCUMENT_ERRORED\n });\n dispatch({\n type: OPEN_INITIAL_DOCS_ERRORED,\n });\n return Promise.reject();\n });\n }\n return Promise.resolve();\n })\n .catch(() => {\n dispatch({\n type: OPEN_DOCUMENT_ERRORED\n });\n dispatch({\n type: OPEN_INITIAL_DOCS_ERRORED,\n });\n return Promise.reject();\n });\n }));\n dispatch({\n type: OPEN_INITIAL_DOCS_SUCCESS,\n });\n }\n }\n}\n","export const SET_HIGHLIGHT_COLOR = 'canvasEditor/SET_HIGHLIGHT_COLOR';\nexport const HIDE_COLOR_PICKER = 'canvasEditor/HIDE_COLOR_PICKER';\nexport const TOGGLE_COLOR_PICKER = 'canvasEditor/TOGGLE_COLOR_PICKER';\nexport const SET_ADD_TILE_SOURCE_MODE = 'canvasEditor/SET_ADD_TILE_SOURCE_MODE';\nexport const SET_IS_PENCIL_MODE = 'canvasEditor/SET_IS_PENCIL_MODE';\nexport const SET_GLOBAL_CANVAS_DISPLAY = 'canvasEditor/SET_GLOBAL_CANVAS_DISPLAY';\nexport const SET_IMAGE_URL = 'canvasEditor/SET_IMAGE_URL';\nexport const TOGGLE_HIGHLIGHTS = 'canvasEditor/TOGGLE_HIGHLIGHTS';\nexport const IIIF_TILE_SOURCE_TYPE = 'iiif';\nexport const IMAGE_URL_SOURCE_TYPE = 'image_url';\nexport const UPLOAD_SOURCE_TYPE = 'upload';\nexport const PAGE_TO_CHANGE = 'canvasEditor/PAGE_TO_CHANGE';\nexport const RENAME_LAYER = 'canvasEditor/RENAME_LAYER';\nexport const RENAME_LAYER_SUCCESS = 'canvasEditor/RENAME_LAYER_SUCCESS';\nexport const TOGGLE_EDIT_LAYER_NAME = 'canvasEditor/TOGGLE_EDIT_LAYER_NAME';\n\nconst initialState = {\n highlightColors: {},\n displayColorPickers: {},\n addTileSourceMode: {},\n highlightsHidden: {},\n imageURLs: {},\n isPencilMode: {},\n globalCanvasDisplay: true,\n pageToChange: {},\n editingLayerName: {},\n};\n\nexport default function(state = initialState, action) {\n switch (action.type) {\n case SET_HIGHLIGHT_COLOR:\n let updatedHighlightColors = Object.assign({}, state.highlightColors);\n updatedHighlightColors[action.editorKey] = action.highlightColor;\n return {\n ...state,\n highlightColors: updatedHighlightColors\n };\n\n case HIDE_COLOR_PICKER:\n let updatedDisplayColorPickers = Object.assign({}, state.displayColorPickers);\n updatedDisplayColorPickers[action.editorKey] = false;\n return {\n ...state,\n displayColorPickers: updatedDisplayColorPickers\n };\n\n case TOGGLE_COLOR_PICKER:\n let updatedToggleDisplayColorPickers = Object.assign({}, state.displayColorPickers);\n updatedToggleDisplayColorPickers[action.editorKey] = !updatedToggleDisplayColorPickers[action.editorKey];\n return {\n ...state,\n displayColorPickers: updatedToggleDisplayColorPickers\n };\n\n case SET_ADD_TILE_SOURCE_MODE:\n let updatedAddTileSourceMode = Object.assign({}, state.addTileSourceMode);\n updatedAddTileSourceMode[action.editorKey] = action.mode;\n return {\n ...state,\n addTileSourceMode: updatedAddTileSourceMode\n };\n \n case SET_IMAGE_URL:\n let imageURLs = { ...state.imageURLs };\n imageURLs[action.editorKey] = action.url;\n return {\n ...state,\n imageURLs\n };\n\n case SET_IS_PENCIL_MODE:\n let updatedPencilMode = Object.assign({}, state.isPencilMode);\n updatedPencilMode[action.editorKey] = action.isPencilMode;\n return {\n ...state,\n isPencilMode: updatedPencilMode\n };\n\n case SET_GLOBAL_CANVAS_DISPLAY:\n return {\n ...state,\n globalCanvasDisplay: action.value\n };\n\n case TOGGLE_HIGHLIGHTS:\n let highlightsHidden = { ...state.highlightsHidden };\n highlightsHidden[action.editorKey] = action.value;\n return {\n ...state,\n highlightsHidden\n };\n \n case PAGE_TO_CHANGE:\n let updatedPageToChange = Object.assign({}, state.pageToChange);\n updatedPageToChange[action.editorKey] = action.pageToChange;\n return {\n ...state,\n pageToChange: updatedPageToChange,\n };\n \n case TOGGLE_EDIT_LAYER_NAME:\n let updatedEditingLayerName = Object.assign({}, state.editingLayerName);\n updatedEditingLayerName[action.editorKey] = action.value;\n return {\n ...state,\n editingLayerName: updatedEditingLayerName,\n };\n \n case RENAME_LAYER_SUCCESS:\n return {\n ...state,\n loading: false,\n };\n\n default:\n return state;\n }\n}\n\nexport function setCanvasHighlightColor(editorKey, highlightColor) {\n return function(dispatch) {\n dispatch({\n type: SET_HIGHLIGHT_COLOR,\n editorKey,\n highlightColor\n });\n dispatch({\n type: HIDE_COLOR_PICKER,\n editorKey\n });\n }\n}\n\nexport function toggleCanvasColorPicker(editorKey) {\n return function(dispatch) {\n dispatch({\n type: TOGGLE_COLOR_PICKER,\n editorKey\n });\n }\n}\n\nexport function setAddTileSourceMode(editorKey, mode) {\n return function(dispatch) {\n dispatch({\n type: SET_ADD_TILE_SOURCE_MODE,\n editorKey,\n mode\n });\n }\n}\n\nexport function setImageUrl(editorKey, url) {\n return function(dispatch) {\n dispatch({\n type: SET_IMAGE_URL,\n editorKey,\n url\n });\n }\n}\n\nexport function setIsPencilMode(editorKey, isPencilMode) {\n return function(dispatch) {\n dispatch({\n type: SET_IS_PENCIL_MODE,\n editorKey,\n isPencilMode\n });\n }\n}\n\nexport function toggleCanvasHighlights(editorKey, value) {\n return function(dispatch) {\n dispatch({\n type: TOGGLE_HIGHLIGHTS,\n editorKey,\n value\n });\n };\n}\n\nexport function setGlobalCanvasDisplay(value) {\n return function(dispatch) {\n dispatch({\n type: SET_GLOBAL_CANVAS_DISPLAY,\n value\n });\n }\n}\n\nexport function changePage({ editorKey, page }) {\n return function(dispatch) {\n dispatch({\n type: PAGE_TO_CHANGE,\n pageToChange: page,\n editorKey,\n });\n }\n}\n\nexport function toggleEditLayerName({ editorKey, value }) {\n return function(dispatch) {\n dispatch({\n type: TOGGLE_EDIT_LAYER_NAME,\n editorKey,\n value,\n });\n }\n}\n","export default async function fetchWithTimeout(resource, options = {}) {\n const { retryDelay = 8000 } = options;\n const timeout = retryDelay + 100;\n\n const controller = new AbortController();\n const id = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(resource, {\n ...options,\n signal: controller.signal,\n });\n clearTimeout(id);\n\n return response;\n}\n","export const authUrl = '/auth';\nexport const defaultRequestTimeout = 28000;","import { push, replace } from 'react-router-redux';\nimport { CLOSE_SEARCH_POPUP } from './search'\nimport { CHECK_IN_DOCS } from './documentGrid'\n\nexport const TEXT_RESOURCE_TYPE = 'text';\nexport const CANVAS_RESOURCE_TYPE = 'canvas';\nexport const READ_PERMISSION = 'read';\nexport const WRITE_PERMISSION = 'write';\nexport const ADMIN_PERMISSION = 'admin';\n\nexport const LOAD_PROJECT = 'project/LOAD_PROJECT';\nexport const GET_SUCCESS = 'project/GET_SUCCESS';\nexport const GET_ERRORED = 'project/GET_ERRORED';\nexport const CLEAR_PROJECT = 'project/CLEAR_PROJECT';\nexport const NEW_PROJECT = 'project/NEW_PROJECT';\nexport const POST_SUCCESS = 'project/POST_SUCCESS';\nexport const POST_ERRORED = 'project/POST_ERRORED';\nexport const UPDATE_PROJECT = 'project/UPDATE_PROJECT';\nexport const PATCH_SUCCESS = 'project/PATCH_SUCCESS';\nexport const PATCH_ERRORED = 'project/PATCH_ERRORED';\nexport const DELETE_PROJECT = 'project/DELETE_PROJECT';\nexport const DELETE_SUCCESS = 'project/DELETE_SUCCESS';\nexport const DELETE_ERRORED = 'project/DELETE_ERRORED';\nexport const OPEN_DOCUMENT_POPOVER = 'project/OPEN_DOCUMENT_POPOVER';\nexport const CLOSE_DOCUMENT_POPOVER = 'project/CLOSE_DOCUMENT_POPOVER';\nexport const SETTINGS_SHOWN = 'project/SETTINGS_SHOWN';\nexport const SETTINGS_HIDDEN = 'project/SETTINGS_HIDDEN';\nexport const NEW_PERMISSION_LEVEL_CHANGE = 'project/NEW_PERMISSION_LEVEL_CHANGE';\nexport const NEW_PERMISSION_USER_CHANGE = 'project/NEW_PERMISSION_USER_CHANGE';\nexport const CREATE_PERMISSION_LOADING = 'project/CREATE_PERMISSION_LOADING';\nexport const CREATE_PERMISSION_ERRORED = 'project/CREATE_PERMISSION_ERRORED';\nexport const CREATE_PERMISSION_SUCCESS = 'project/CREATE_PERMISSION_SUCCESS';\nexport const TOGGLE_DELETE_CONFIRMATION = 'project/TOGGLE_DELETE_CONFIRMATION';\nexport const TOGGLE_SIDEBAR = 'project/TOGGLE_SIDEBAR';\nexport const HIDE_BATCH_IMAGE_PROMPT = 'project/HIDE_BATCH_IMAGE_PROMPT';\nexport const SHOW_BATCH_IMAGE_PROMPT = 'project/SHOW_BATCH_IMAGE_PROMPT';\nexport const IMAGE_UPLOAD_STARTED = 'project/IMAGE_UPLOAD_STARTED';\nexport const IMAGE_UPLOAD_COMPLETE = 'project/IMAGE_UPLOAD_COMPLETE';\nexport const IMAGE_UPLOAD_ERRORED = 'project/IMAGE_UPLOAD_ERRORED';\nexport const IMAGE_UPLOAD_TIMEOUT = 'project/IMAGE_UPLOAD_TIMEOUT';\nexport const IMAGE_UPLOAD_TO_RAILS_SUCCESS = 'project/IMAGE_UPLOAD_TO_RAILS_SUCCESS';\nexport const SET_UPLOADING_TRUE = 'project/SET_UPLOADING_TRUE';\nexport const KILL_UPLOADING = 'project/KILL_UPLOADING';\nexport const ADD_FOLDER_DATA = 'project/ADD_FOLDER_DATA';\nexport const SHOW_CLOSE_DIALOG = 'project/SHOW_CLOSE_DIALOG';\nexport const HIDE_CLOSE_DIALOG = 'project/HIDE_CLOSE_DIALOG';\nexport const IMAGE_UPLOAD_DOC_CREATED = 'project/IMAGE_UPLOAD_DOC_CREATED';\nexport const GET_EXPORTS_LOADING = 'project/GET_EXPORTS_LOADING';\nexport const GET_EXPORTS_SUCCESS = 'project/GET_EXPORTS_SUCCESS';\nexport const GET_EXPORTS_ERRORED = 'project/GET_EXPORTS_ERRORED';\nexport const CREATE_EXPORT_LOADING = 'project/CREATE_EXPORT_LOADING';\nexport const CREATE_EXPORT_SUCCESS = 'project/CREATE_EXPORT_SUCCESS';\nexport const CREATE_EXPORT_ERRORED = 'project/CREATE_EXPORT_ERRORED';\n\nconst sidebarOpenWidth = 490\n\nconst initialState = {\n id: null,\n title: 'No project selected',\n description: '',\n contentsChildren: [],\n userProjectPermissions: [],\n public: false,\n currentUserPermissions: {},\n loading: false,\n errored: false,\n documentPopoverOpenFor: null,\n settingsShown: false,\n newPermissionLoading: false,\n newPermissionUser: null,\n newPermissionLevel: READ_PERMISSION,\n newPermissionError: null,\n deleteConfirmed: false,\n sidebarWidth: sidebarOpenWidth,\n sidebarOpen: true,\n batchImagePromptShown: false,\n uploads: [],\n uploading: false,\n folderData: [],\n closeDialogShown: false,\n uploadError: null,\n exports: {},\n exportsError: null,\n exportsLoading: false,\n exportJobId: null,\n};\n\nexport default function(state = initialState, action) {\n switch (action.type) {\n case LOAD_PROJECT:\n return {\n ...state,\n title: action.title || state.title,\n loading: true\n };\n\n case DELETE_SUCCESS:\n case CLEAR_PROJECT:\n return initialState;\n\n case NEW_PROJECT:\n return {\n ...state,\n loading: true,\n title: 'Untitled Project'\n };\n\n case UPDATE_PROJECT:\n case DELETE_PROJECT:\n return {\n ...state,\n loading: true\n }\n\n case GET_SUCCESS:\n case POST_SUCCESS:\n case PATCH_SUCCESS:\n return {\n ...state,\n loading: false,\n id: action.projectId,\n title: action.projectTitle,\n description: action.projectDescription,\n userProjectPermissions: action.userProjectPermissions || [],\n contentsChildren: action.contentsChildren || [],\n public: action.public,\n currentUserPermissions: action.currentUserPermissions\n };\n\n case GET_ERRORED:\n case POST_ERRORED:\n case PATCH_ERRORED:\n case DELETE_ERRORED:\n console.log('project error');\n return {\n ...state,\n loading: false,\n errored: true\n };\n\n case OPEN_DOCUMENT_POPOVER:\n return {\n ...state,\n documentPopoverOpenFor: action.target\n };\n\n case CLOSE_DOCUMENT_POPOVER:\n return {\n ...state,\n documentPopoverOpenFor: null\n };\n\n case SETTINGS_SHOWN:\n return {\n ...state,\n settingsShown: true\n };\n\n case SETTINGS_HIDDEN:\n return {\n ...state,\n settingsShown: false\n };\n\n case CREATE_PERMISSION_LOADING:\n return {\n ...state,\n newPermissionLoading: true,\n };\n\n case CREATE_PERMISSION_SUCCESS:\n return {\n ...state,\n newPermissionLoading: false,\n newPermissionError: null,\n newPermissionUser: null\n };\n\n case CREATE_PERMISSION_ERRORED:\n return {\n ...state,\n newPermissionLoading: false,\n newPermissionError: 'Unable to add user.',\n }\n\n case NEW_PERMISSION_USER_CHANGE:\n return {\n ...state,\n newPermissionUser: action.user\n };\n\n case NEW_PERMISSION_LEVEL_CHANGE:\n return {\n ...state,\n newPermissionLevel: action.level\n };\n\n case TOGGLE_DELETE_CONFIRMATION:\n return {\n ...state,\n deleteConfirmed: !state.deleteConfirmed\n };\n\n case TOGGLE_SIDEBAR:\n const sidebarOpen = !state.sidebarOpen\n const sidebarWidth = sidebarOpen ? sidebarOpenWidth : 0\n return {\n ...state,\n sidebarOpen,\n sidebarWidth \n };\n\n case SHOW_BATCH_IMAGE_PROMPT:\n return {\n ...state,\n batchImagePromptShown: action.projectId,\n };\n\n case HIDE_BATCH_IMAGE_PROMPT:\n return {\n ...state,\n batchImagePromptShown: false,\n uploading: false,\n uploads: [],\n folderData: [],\n uploadError: null,\n };\n\n case SET_UPLOADING_TRUE:\n return {\n ...state,\n uploading: true,\n uploadError: null,\n };\n\n case KILL_UPLOADING:\n return {\n ...state,\n uploading: false,\n uploadError: action.err,\n };\n \n case IMAGE_UPLOAD_STARTED:\n const uploads = action.signedIds.map((signedId) => ({\n signedId,\n state: 'uploading',\n }));\n return {\n ...state,\n uploads,\n };\n \n case IMAGE_UPLOAD_TO_RAILS_SUCCESS:\n const uploadsWithFilename = state.uploads.map((upload) => ({\n ...upload,\n filename: upload.signedId === action.signedId ? action.image.filename : upload.filename,\n }));\n return {\n ...state,\n uploads: uploadsWithFilename,\n };\n\n case IMAGE_UPLOAD_DOC_CREATED:\n const createdUploads = state.uploads.map((upload) => ({\n ...upload,\n state: upload.signedId === action.signedId ? 'doc-created' : upload.state,\n }));\n return {\n ...state,\n uploads: createdUploads,\n };\n \n case IMAGE_UPLOAD_COMPLETE:\n const newUploads = state.uploads.map((upload) => ({\n ...upload,\n state: upload.signedId === action.signedId ? 'finished' : upload.state,\n }));\n const stillUploadingComplete = newUploads.some(upload => !['timeout', 'finished', 'error'].includes(upload.state));\n return {\n ...state,\n uploads: newUploads,\n uploading: stillUploadingComplete,\n };\n \n case IMAGE_UPLOAD_ERRORED:\n const uploadsWithError = state.uploads.map((upload) => ({\n ...upload,\n state: upload.signedId === action.signedId ? 'error' : upload.state,\n error: upload.signedId === action.signedId ? action.error : upload.error,\n }));\n const stillUploadingErrored = uploadsWithError.some(upload => !['timeout', 'finished', 'error'].includes(upload.state));\n return {\n ...state,\n uploads: uploadsWithError,\n uploading: stillUploadingErrored,\n };\n\n case IMAGE_UPLOAD_TIMEOUT:\n const uploadsWithTimeout = state.uploads.map((upload) => ({\n ...upload,\n state: upload.signedId === action.signedId ? 'timeout' : upload.state,\n error: upload.signedId === action.signedId ? action.error : upload.error,\n }));\n const stillUploadingTimeout = uploadsWithTimeout.some(upload => !['timeout', 'finished', 'error'].includes(upload.state));\n return {\n ...state,\n uploads: uploadsWithTimeout,\n uploading: stillUploadingTimeout,\n };\n\n case ADD_FOLDER_DATA:\n return {\n ...state,\n folderData: action.folders,\n }\n \n case SHOW_CLOSE_DIALOG:\n return {\n ...state,\n closeDialogShown: true,\n }\n\n case HIDE_CLOSE_DIALOG:\n return {\n ...state,\n closeDialogShown: false,\n }\n\n case GET_EXPORTS_LOADING:\n return {\n ...state,\n exportsError: null,\n exportsLoading: true,\n }\n\n case GET_EXPORTS_SUCCESS:\n return {\n ...state,\n exports: action.exports,\n exportsError: null,\n exportsLoading: false,\n exportJobId: null,\n }\n\n case GET_EXPORTS_ERRORED:\n return {\n ...state,\n exportsError: action.error,\n exportsLoading: false,\n }\n\n case CREATE_EXPORT_LOADING:\n return {\n ...state,\n exportsError: null,\n exportsLoading: true,\n }\n\n case CREATE_EXPORT_SUCCESS:\n return {\n ...state,\n exportJobId: action.jobId,\n exportsError: null,\n exportsLoading: false,\n }\n\n case CREATE_EXPORT_ERRORED:\n return {\n ...state,\n exportsError: action.error,\n exportsLoading: false,\n }\n \n default:\n return state;\n }\n}\n\nexport function clearProject() {\n return function(dispatch) {\n dispatch({\n type: CLOSE_SEARCH_POPUP\n });\n dispatch({\n type: CLEAR_PROJECT\n });\n };\n}\n\nexport function loadProject(projectId, title) {\n return function(dispatch) {\n dispatch({\n type: LOAD_PROJECT\n });\n\n fetch(`projects/${projectId}`, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(project => {\n if( project.forbidden ) {\n dispatch(push('/'))\n } else {\n dispatch({\n type: GET_SUCCESS,\n projectId: project.id,\n projectTitle: project.title,\n projectDescription: project.description,\n contentsChildren: project['contents_children'],\n userProjectPermissions: project['user_project_permissions'],\n public: project.public,\n currentUserPermissions: project['current_user_permissions']\n });\n dispatch(loadExports(project.id));\n }\n })\n .catch(() => dispatch({\n type: GET_ERRORED\n }));\n };\n}\n\nexport function newProject() {\n return function(dispatch) {\n dispatch({\n type: NEW_PROJECT\n });\n dispatch(push('/new'));\n\n fetch('/projects', {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid'),\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n },\n method: 'POST',\n body: JSON.stringify({\n title: 'Untitled Project'\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(project => {\n dispatch({\n type: POST_SUCCESS,\n projectId: project.id,\n projectTitle: project.title,\n userProjectPermissions: project['user_project_permissions'],\n public: project.public,\n currentUserPermissions: project['current_user_permissions']\n });\n dispatch(replace(`/${project.id}`));\n dispatch(showSettings());\n })\n .catch(() => dispatch({\n type: POST_ERRORED\n }));\n };\n}\n\nexport function updateProject(projectId, attributes) {\n return function(dispatch) {\n dispatch({\n type: UPDATE_PROJECT\n });\n\n fetch(`/projects/${projectId}`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'PATCH',\n body: JSON.stringify(attributes)\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(project => {\n dispatch({\n type: PATCH_SUCCESS,\n projectId: project.id,\n projectTitle: project.title,\n projectDescription: project.description,\n contentsChildren: project['contents_children'],\n userProjectPermissions: project['user_project_permissions'],\n public: project.public,\n currentUserPermissions: project['current_user_permissions']\n });\n })\n .catch(() => dispatch({\n type: PATCH_ERRORED\n }));\n };\n}\n\nexport function openDocumentPopover(target) {\n return function(dispatch) {\n dispatch({\n type: OPEN_DOCUMENT_POPOVER,\n target\n });\n };\n}\n\nexport function closeDocumentPopover() {\n return function(dispatch) {\n dispatch({\n type: CLOSE_DOCUMENT_POPOVER\n });\n };\n}\n\nexport function showSettings() {\n return function(dispatch) {\n dispatch({\n type: SETTINGS_SHOWN\n });\n };\n}\n\nexport function hideSettings() {\n return function(dispatch) {\n dispatch({\n type: SETTINGS_HIDDEN\n });\n };\n}\n\nexport function setNewPermissionUser(user) {\n return function(dispatch) {\n dispatch({\n type: NEW_PERMISSION_USER_CHANGE,\n user\n });\n };\n}\n\nexport function setNewPermissionLevel(level) {\n return function(dispatch) {\n dispatch({\n type: NEW_PERMISSION_LEVEL_CHANGE,\n level\n });\n };\n}\n\nexport function createNewPermission() {\n return function(dispatch, getState) {\n const { id, newPermissionUser, newPermissionLevel } = getState().project;\n\n if (newPermissionUser !== null) {\n dispatch({\n type: CREATE_PERMISSION_LOADING\n });\n\n fetch('/user_project_permissions', {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid'),\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n },\n method: 'POST',\n body: JSON.stringify({\n project_id: id,\n email: newPermissionUser,\n permission: newPermissionLevel\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n })\n .then(() => {\n dispatch({\n type: CREATE_PERMISSION_SUCCESS\n });\n dispatch(loadProject(id));\n })\n .catch(() => dispatch({\n type: CREATE_PERMISSION_ERRORED\n }));\n }\n }\n}\n\nexport function deletePermission(id) {\n return function(dispatch, getState) {\n dispatch({\n type: CREATE_PERMISSION_LOADING\n });\n\n fetch(`/user_project_permissions/${id}`, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid'),\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n },\n method: 'DELETE'\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n })\n .then(() => {\n dispatch({\n type: CREATE_PERMISSION_SUCCESS\n });\n dispatch(loadProject(getState().project.id));\n })\n .catch(() => dispatch({\n type: CREATE_PERMISSION_ERRORED\n }));\n }\n}\n\nexport function updatePermission(id, permissionLevel) {\n return function(dispatch, getState) {\n dispatch({\n type: CREATE_PERMISSION_LOADING\n });\n\n fetch(`/user_project_permissions/${id}`, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid'),\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n },\n method: 'PATCH',\n body: JSON.stringify({\n permission: permissionLevel\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n })\n .then(() => {\n dispatch({\n type: CREATE_PERMISSION_SUCCESS\n });\n dispatch(loadProject(getState().project.id));\n })\n .catch(() => dispatch({\n type: CREATE_PERMISSION_ERRORED\n }));\n }\n}\n\nexport function checkInAll(projectID) {\n return function(dispatch) {\n fetch(`/projects/${projectID}/check_in`, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid'),\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n },\n method: 'POST'\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(status => {\n dispatch({\n type: CHECK_IN_DOCS,\n projectId: projectID,\n docIDs: status.checked_in_docs,\n });\n })\n .catch(() => dispatch({\n type: POST_ERRORED\n }));\n };\n}\n\nexport function toggleDeleteConfirmation() {\n return function(dispatch) {\n dispatch({\n type: TOGGLE_DELETE_CONFIRMATION\n });\n }\n}\n\nexport function toggleSidebar() {\n return function(dispatch) {\n dispatch({\n type: TOGGLE_SIDEBAR\n });\n }\n}\n\nexport function deleteProject(projectId) {\n return function(dispatch) {\n dispatch({\n type: DELETE_PROJECT\n });\n\n fetch(`/projects/${projectId}`, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid'),\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n },\n method: 'DELETE'\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n })\n .then(() => {\n dispatch({\n type: DELETE_SUCCESS\n });\n dispatch(push('/'));\n })\n .catch(() => dispatch({\n type: DELETE_ERRORED\n }));\n }\n}\n\nexport function hideBatchImagePrompt() {\n return function(dispatch) {\n dispatch({\n type: HIDE_BATCH_IMAGE_PROMPT,\n });\n }\n}\n\nexport function showBatchImagePrompt({ projectId }) {\n return function(dispatch) {\n dispatch({\n type: SHOW_BATCH_IMAGE_PROMPT,\n projectId,\n });\n dispatch(getFolderData({ projectId }));\n }\n}\n\nexport function startUploading() {\n return function(dispatch) {\n dispatch({\n type: SET_UPLOADING_TRUE,\n });\n }\n}\n\nexport function killUploading(err) {\n return function(dispatch) {\n dispatch({\n type: KILL_UPLOADING,\n err,\n });\n }\n}\n\nfunction getFolderDataFromIds({ folderIds }) {\n return function(dispatch, getState) {\n const { id } = getState().project;\n fetch('/document_folders/get_many', {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid'),\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n },\n method: 'POST',\n body: JSON.stringify({\n folder_ids: folderIds,\n project_id: id,\n })\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response.json()\n })\n .then(folders => {\n dispatch({\n type: ADD_FOLDER_DATA,\n folders: folders.map(folder => ({\n id: folder[0],\n title: folder[1],\n parent_type: folder[2],\n parent_id: folder[3],\n }))\n })\n })\n .catch(error => {\n console.error(error);\n });\n }\n}\n\nexport function getFolderData({ projectId }) {\n return function(dispatch, getState) {\n fetch(`/projects/${projectId}`, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(project => {\n let folderIds = [];\n if (project.contents_children) { \n project.contents_children.filter(\n child => child['document_kind'] === 'folder'\n ).forEach(child => {\n folderIds.push(child.id);\n child.descendant_folder_ids.forEach(descendant => {\n if (!folderIds.includes(descendant)) {\n folderIds.push(descendant);\n }\n })\n });\n dispatch(getFolderDataFromIds({ folderIds }));\n }\n });\n }\n}\n\nexport function showCloseDialog() {\n return function(dispatch) {\n dispatch({\n type: SHOW_CLOSE_DIALOG,\n })\n }\n}\n\nexport function hideCloseDialog() {\n return function(dispatch) {\n dispatch({\n type: HIDE_CLOSE_DIALOG,\n })\n }\n}\n\nexport function loadExports(projectId) {\n return function(dispatch) {\n dispatch({\n type: GET_EXPORTS_LOADING\n });\n\n fetch(`projects/${projectId}/exports`, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n }\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response;\n })\n .then(response => response.json())\n .then(data => {\n dispatch({\n type: GET_EXPORTS_SUCCESS,\n exports: data,\n });\n })\n .catch(() => dispatch({\n type: GET_EXPORTS_ERRORED\n }));\n };\n}\n\nexport function createExport() {\n return function(dispatch, getState) {\n const { id } = getState().project;\n dispatch({\n type: CREATE_EXPORT_LOADING\n });\n\n fetch(`/projects/${id}/create_export`, {\n headers: {\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid'),\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n },\n method: 'POST',\n })\n .then(response => {\n if (!response.ok) {\n throw Error(response.statusText);\n }\n return response.json();\n })\n .then((job) => {\n setTimeout(() => {\n dispatch(loadExports(id));\n }, 3000);\n dispatch({\n type: CREATE_EXPORT_SUCCESS,\n jobId: job.id,\n });\n })\n .catch((err) => dispatch({\n type: CREATE_EXPORT_ERRORED,\n error: err,\n }));\n }\n}","import { combineReducers } from 'redux';\nimport { routerReducer } from 'react-router-redux';\nimport { reduxTokenAuthReducer } from 'redux-token-auth';\nimport home from './home';\nimport project from './project';\nimport folders from './folders';\nimport documentGrid from './documentGrid';\nimport annotationViewer from './annotationViewer';\nimport textEditor from './textEditor';\nimport canvasEditor from './canvasEditor';\nimport search from './search';\n\nexport default combineReducers({\n routing: routerReducer,\n reduxTokenAuth: reduxTokenAuthReducer,\n home,\n project,\n folders,\n documentGrid,\n annotationViewer,\n textEditor,\n canvasEditor,\n search\n});\n","import { createStore, applyMiddleware, compose } from 'redux';\nimport { routerMiddleware } from 'react-router-redux';\nimport thunk from 'redux-thunk';\nimport { createBrowserHistory } from 'history';\nimport rootReducer from './modules';\n\nexport const history = createBrowserHistory();\n\nconst initialState = {\n reduxTokenAuth: {\n currentUser: {\n isLoading: false,\n isSignedIn: false,\n attributes: {}\n }\n }\n};\nconst enhancers = [];\nconst middleware = [\n thunk,\n routerMiddleware(history)\n];\n\nif (process.env.NODE_ENV === 'development') {\n const devToolsExtension = window.devToolsExtension;\n\n if (typeof devToolsExtension === 'function') {\n enhancers.push(devToolsExtension());\n }\n}\n\nconst composedEnhancers = compose(\n applyMiddleware(...middleware),\n ...enhancers\n);\n\nconst store = createStore(\n rootReducer,\n initialState,\n composedEnhancers\n);\n\nexport default store;\n","import { generateAuthActions } from 'redux-token-auth';\nimport { authUrl } from './constants';\n\nconst config = {\n authUrl,\n userAttributes: {\n name: 'name',\n approved: 'approved',\n admin: 'admin',\n id: 'id',\n confirmed: 'confirmed',\n },\n userRegistrationAttributes: {\n name: 'name',\n password_confirmation: 'password_confirmation',\n email: 'email',\n uid: 'uid',\n }\n}\n\nconst {\n registerUser,\n signInUser,\n signOutUser,\n verifyCredentials\n} = generateAuthActions(config);\n\nexport {\n registerUser,\n signInUser,\n signOutUser,\n verifyCredentials\n};\n","import React, { Component } from 'react';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { withRouter } from 'react-router';\nimport Dialog from 'material-ui/Dialog';\nimport TextField from 'material-ui/TextField';\nimport FlatButton from 'material-ui/FlatButton';\nimport { red500, green400, blue900 } from 'material-ui/styles/colors';\nimport { registerUser, signInUser } from './modules/redux-token-auth-config';\nimport {\n load,\n hideLogin,\n hideRegistration,\n showApprovalPending,\n hideApprovalPending,\n userEmailChanged,\n userNameChanged,\n userPasswordChanged,\n userPasswordConfirmationChanged,\n userAuthErrored,\n closeConfirmDialog,\n resendConfirmationEmail,\n} from './modules/home';\n\nclass LoginRegistrationDialog extends Component {\n render() {\n let title = '';\n let actions = [];\n let open = false;\n let requestedClose = () => {};\n let showNameField = false;\n let showEmailField = false;\n let showPasswordField = false;\n let showPasswordConfirmationField = false;\n const { location } = this.props;\n\n if (this.props.registrationShown) {\n title = 'Register new user';\n actions.push(\n \n );\n actions.push(\n {\n this.props.registerUser({\n email: this.props.userEmail,\n uid: this.props.userEmail,\n name: this.props.userName,\n password: this.props.userPassword,\n password_confirmation: this.props.userPasswordConfirmation,\n })\n .then(() => {\n this.props.showApprovalPending();\n })\n .catch(this.props.userAuthErrored);\n }}\n />\n );\n open = true;\n requestedClose = this.props.hideRegistration;\n showNameField = true;\n showEmailField = true;\n showPasswordField = true;\n showPasswordConfirmationField = true;\n }\n else if (this.props.approvalPendingShown) {\n title = 'Approval pending';\n actions.push(\n \n );\n open = true;\n requestedClose = this.props.hideApprovalPending;\n } else if (this.props.confirmUserSuccessDialogShown) {\n title = this.props.confirmUserErrored ? 'Email confirmation error' : 'Email confirmed succesfully';\n actions.push(\n \n );\n open = true;\n requestedClose = this.props.closeConfirmDialog;\n }\n else if (this.props.loginShown) {\n title = 'Sign in';\n actions.push(\n \n );\n actions.push(\n {\n this.props.signInUser({\n email: this.props.userEmail,\n password: this.props.userPassword\n })\n .then(() => {\n this.props.hideLogin();\n if (location && location.pathname === '/') {\n this.props.load();\n }\n })\n .catch(this.props.userAuthErrored);\n }}\n />\n );\n open = true;\n requestedClose = this.props.hideLogin;\n showNameField = false;\n showEmailField = true;\n showPasswordField = true;\n }\n\n return (\n \n {this.props.userAuthError &&\n <>\n

\n User authentication error\n

\n {this.props.userAuthError.response && this.props.userAuthError.response.data \n && this.props.userAuthError.response.data.errors && (\n

\n {Array.isArray(this.props.userAuthError.response.data.errors)\n && this.props.userAuthError.response.data.errors.length > 0 \n && this.props.userAuthError.response.data.errors[0].toString().includes('confirmation email was sent')\n && (\n <>\n {`${this.props.userAuthError.response.data.errors[0].toString()}.`}\n {' '}\n \n {this.props.confirmationEmailResent && (\n Sent!\n )}\n {this.props.confirmationEmailErrored && (\n \n There was an error resending the email.\n {' '}\n {this.props.confirmationEmailErrorMsg.toString()}\n \n )}\n \n )}\n {!Array.isArray(this.props.userAuthError.response.data.errors)\n && Array.isArray(this.props.userAuthError.response.data.errors.full_messages)\n && this.props.userAuthError.response.data.errors.full_messages.length > 0\n && this.props.userAuthError.response.data.errors.full_messages[0].toString()\n }\n

\n )}\n \n }\n {this.props.approvalPendingShown &&\n <>\n

\n Your account has been created, but your email must be confirmed before you may log in.\n

\n

\n In addition, a site administrator must approve your account before you can proceed to work with projects.\n An email has been sent to the administrators for this site.\n

\n \n }\n {this.props.confirmUserSuccessDialogShown && (\n

\n {this.props.confirmUserErrored && 'There was an error confirming your email address.'}\n {!this.props.confirmUserErrored && (\n <>\n

\n Congratulations, your Digital Mappa account and\n email are confirmed! You may now log in.\n

\n

\n Once an administrator approves your account, you may start using this\n {' '}\n Digital Mappa\n {' '}\n instance in accordance with the permissions set by this\n instance's administrator. To access any non-public projects on this DM instance,\n you will still need to be added to a specific project by its project\n administrator.\n

\n \n )}\n

\n )}\n {showEmailField &&\n
\n
\n
\n }\n {showNameField &&\n
\n
\n
\n }\n {showPasswordField &&\n
\n
\n
\n }\n {showPasswordConfirmationField &&\n
\n
\n
\n }\n \n );\n }\n}\n\nconst mapStateToProps = state => ({\n loginShown: state.home.loginShown,\n registrationShown: state.home.registrationShown,\n approvalPendingShown: state.home.approvalPendingShown,\n userEmail: state.home.userEmail,\n userName: state.home.userName,\n userPassword: state.home.userPassword,\n userPasswordConfirmation: state.home.userPasswordConfirmation,\n userAuthError: state.home.userAuthError,\n confirmUserSuccessDialogShown: state.home.confirmUserSuccessDialogShown,\n confirmUserErrored: state.home.confirmUserErrored,\n confirmationEmailResent: state.home.confirmationEmailResent,\n confirmationEmailErrored: state.home.confirmationEmailErrored,\n confirmationResendButtonDisabled: state.home.confirmationResendButtonDisabled,\n confirmationEmailErrorMsg: state.home.confirmationEmailErrorMsg,\n});\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n load,\n hideLogin,\n hideRegistration,\n showApprovalPending,\n hideApprovalPending,\n userEmailChanged,\n userNameChanged,\n userPasswordChanged,\n userPasswordConfirmationChanged,\n registerUser,\n signInUser,\n userAuthErrored,\n closeConfirmDialog,\n resendConfirmationEmail,\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(withRouter(props => ));\n","import React, { Component } from 'react';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\nimport {\n Table,\n TableBody,\n TableHeader,\n TableHeaderColumn,\n TableRow,\n TableRowColumn,\n} from 'material-ui/Table';\nimport Toggle from 'material-ui/Toggle';\nimport { red50, red400, red600, lightBlue50, grey200 } from 'material-ui/styles/colors';\nimport { hideAdminDialog, updateUser, deleteUser } from './modules/home';\n\nclass AdminDialog extends Component {\n render() {\n return (\n \n ]}\n contentStyle={{ width: '90%', maxWidth: '1000px' }}\n >\n \n \n \n Email\n Name\n Approved\n Site admin\n \n \n \n \n {this.props.userAdminList.map(user => (\n \n {user.email}\n {user.name}\n \n {this.props.updateUser(user.id, {approved: isInputChecked});}} />\n \n \n {this.props.updateUser(user.id, {admin: isInputChecked});}} />\n \n \n {this.props.deleteUser(user.id);}} backgroundColor={red400} hoverColor={red600} style={{ color: user.id === this.props.currentUser.attributes.id ? grey200 : 'white' }} />\n \n \n ))}\n \n
\n \n )\n }\n}\n\nconst mapStateToProps = state => ({\n currentUser: state.reduxTokenAuth.currentUser,\n adminDialogShown: state.home.adminDialogShown,\n userAdminList: state.home.userAdminList,\n userAdminListLoading: state.home.userAdminListLoading,\n userAdminListErrored: state.home.userAdminListErrored\n});\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n hideAdminDialog,\n updateUser,\n deleteUser\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(AdminDialog);\n","import React, { Component } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport TextField from 'material-ui/TextField';\nimport IconButton from 'material-ui/IconButton';\nimport Search from 'material-ui/svg-icons/action/search';\nimport { grey500 } from 'material-ui/styles/colors';\nimport { startSearch, updateSearchPhraseBuffer } from './modules/search';\n\nclass SearchBar extends Component {\n\n onSearch = () => {\n const search = this.props.search;\n if( search.searchPhraseBuffer.length > 0 ) {\n this.props.startSearch( this.props.projectID, search.searchPhraseBuffer );\n }\n }\n\n onChange = (e,value) => {\n this.props.updateSearchPhraseBuffer( value );\n }\n\n onKeypress = (e) => {\n let code = e.keyCode || e.which;\n // enter key\n if(code === 13) { \n this.onSearch();\n } \n }\n\n // TODO: support hitting enter to begin a search\n\n render() {\n return (\n
\n \n \n \n \n
\n );\n }\n}\n\n\nconst mapStateToProps = state => ({\n search: state.search\n});\n \nconst mapDispatchToProps = dispatch => bindActionCreators({\n startSearch,\n updateSearchPhraseBuffer\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n )(SearchBar);\n","import React, { Component } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { clearSelection } from './modules/annotationViewer'\nimport { push } from 'react-router-redux';\nimport { withRouter } from 'react-router';\nimport AppBar from 'material-ui/AppBar';\nimport FlatButton from 'material-ui/FlatButton';\nimport Popover from 'material-ui/Popover';\nimport Menu from 'material-ui/Menu';\nimport MenuItem from 'material-ui/MenuItem';\nimport CircularProgress from 'material-ui/CircularProgress';\nimport Divider from 'material-ui/Divider';\nimport DropDownMenu from 'material-ui/DropDownMenu';\nimport NavigationArrowUpward from 'material-ui/svg-icons/navigation/arrow-upward';\nimport MenuIcon from 'material-ui/svg-icons/navigation/menu';\nimport MoreVert from 'material-ui/svg-icons/navigation/more-vert';\nimport IconButton from 'material-ui/IconButton';\nimport { signOutUser } from './modules/redux-token-auth-config';\nimport { toggleSidebar } from './modules/project';\nimport { load, showRegistration, showLogin, toggleAuthMenu, hideAuthMenu, showAdminDialog } from './modules/home';\nimport { setCurrentLayout, layoutOptions } from './modules/documentGrid';\n\nimport LoginRegistrationDialog from './LoginRegistrationDialog';\nimport AdminDialog from './AdminDialog';\nimport SearchBar from './SearchBar';\n\nconst LoginMenuBody = props => {\n if (props.currentUser \n && props.currentUser.isSignedIn\n && props.currentUser.attributes\n && props.currentUser.attributes.confirmed) {\n return (\n
\n {\n props.signOutUser()\n .then(() => {\n props.clearSelection()\n props.hideAuthMenu();\n if (props.location && props.location.pathname === '/') {\n props.load();\n props.returnHome();\n }\n });\n }} />\n {props.currentUser.attributes.admin &&\n
\n \n {\n props.showAdminDialog();\n props.hideAuthMenu();\n }} />\n
\n }\n
\n );\n }\n return (\n
\n \n \n
\n )\n}\n\nclass Navigation extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n layoutTooltipOpen: false,\n layoutTooltipAnchor: null,\n };\n }\n\n onTooltipOpen (e) {\n e.persist();\n const layoutTooltipAnchor = e.currentTarget;\n e.preventDefault();\n this.setState((prevState) => {\n return {\n ...prevState,\n layoutTooltipOpen: true,\n layoutTooltipAnchor,\n }\n });\n }\n\n onTooltipClose () {\n this.setState((prevState) => {\n return {\n ...prevState,\n layoutTooltipOpen: false,\n }\n });\n }\n onCloseProject = () => {\n this.props.clearSelection()\n this.props.returnHome()\n }\n\n render() {\n let userMenuLabel = '';\n if (this.props.currentUser \n && this.props.currentUser.isSignedIn \n && this.props.currentUser.attributes \n && this.props.currentUser.attributes.confirmed\n ) { // if a user is signed in\n userMenuLabel += this.props.currentUser.attributes.name;\n if (!this.props.currentUser.attributes.approved) {\n userMenuLabel += ' (Pending approval)';\n }\n }\n return (\n
\n \n {this.props.title}\n {this.props.isLoading &&\n \n }\n
}\n showMenuIconButton={!this.props.isHome}\n iconElementLeft={this.props.isHome ? (
) : (\n \n \n \n )}\n iconElementRight={\n
\n {!this.props.isHome && \n
\n \n \n {layoutOptions.map((option, index) => (\n \n ))}\n \n
\n }\n }\n label={userMenuLabel}\n labelPosition='before'\n onClick={event => {this.props.toggleAuthMenu(event.currentTarget);}}\n />\n {!this.props.isHome && (\n \n \n \n )}\n
\n }\n style={{position: 'fixed', top: 0, zIndex: 9999}}\n />\n \n \n \n \n \n \n Set grid layout\n \n \n \n
\n )\n }\n}\n\nconst mapStateToProps = state => ({\n currentUser: state.reduxTokenAuth.currentUser,\n authMenuShown: state.home.authMenuShown,\n authMenuAnchor: state.home.authMenuAnchor,\n currentLayout: state.documentGrid.currentLayout\n});\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n returnHome: () => push('/'),\n load,\n showRegistration,\n showLogin,\n toggleAuthMenu,\n hideAuthMenu,\n signOutUser,\n showAdminDialog,\n setCurrentLayout,\n clearSelection,\n toggleSidebar\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(withRouter((props) => ));\n","import React, { Component } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { push } from 'react-router-redux';\nimport Paper from 'material-ui/Paper';\nimport { List, ListItem } from 'material-ui/List';\nimport Divider from 'material-ui/Divider';\nimport FlatButton from 'material-ui/FlatButton';\nimport AddCircle from 'material-ui/svg-icons/content/add-circle';\nimport { load, confirmUser } from './modules/home';\nimport { newProject, clearProject } from './modules/project';\nimport { closeAllResources } from './modules/documentGrid';\nimport Navigation from './Navigation';\n\nclass Home extends Component {\n componentDidMount() {\n if (this.props.confirmationToken) {\n this.props.confirmUser(this.props.confirmationToken);\n }\n this.props.load();\n this.props.clearProject();\n this.props.closeAllResources();\n }\n\n render() {\n return (\n
\n \n \n \n {this.props.projects.map(project => (\n this.props.projectClick(project.id)}\n style={{padding: '16px'}}\n key={`project-${project.id}`}\n />\n ))}\n \n {this.props.currentUser.isSignedIn && this.props.currentUser.attributes.approved &&\n
\n \n }\n style={{padding: '12px 0', height: 'auto'}}\n onClick={this.props.newProject}\n disabled={this.props.loading}\n />\n
\n }\n
\n
\n );\n }\n}\n\nconst mapStateToProps = (state, ownProps) => ({\n projects: state.home.projects,\n loading: state.home.loading,\n currentUser: state.reduxTokenAuth.currentUser,\n reduxTokenAuth: state.reduxTokenAuth,\n confirmationToken: ownProps.location && ownProps.location.search \n && ownProps.location.search.includes('confirmationToken') ? ownProps.location.search.split('confirmationToken=')[1] : '',\n});\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n load,\n projectClick: slug => push(`/${slug}`),\n newProject,\n clearProject,\n closeAllResources,\n confirmUser,\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(Home);\n","import React, { Component } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\nimport TextField from 'material-ui/TextField';\nimport { Tabs, Tab } from 'material-ui/Tabs';\nimport {\n Table,\n TableBody,\n TableHeader,\n TableHeaderColumn,\n TableRow,\n TableRowColumn,\n} from 'material-ui/Table';\nimport SelectField from 'material-ui/SelectField';\nimport MenuItem from 'material-ui/MenuItem';\nimport Toggle from 'material-ui/Toggle';\nimport Checkbox from 'material-ui/Checkbox';\nimport { red100, red200, red400, red600, lightBlue100, lightBlue200, grey200, grey600 } from 'material-ui/styles/colors';\nimport IconButton from 'material-ui/IconButton';\nimport ErrorIcon from 'material-ui/svg-icons/alert/error';\nimport CheckIcon from 'material-ui/svg-icons/navigation/check';\nimport RefreshIcon from 'material-ui/svg-icons/navigation/refresh';\nimport {\n ADMIN_PERMISSION,\n READ_PERMISSION,\n WRITE_PERMISSION,\n createExport,\n createNewPermission,\n deletePermission,\n deleteProject,\n hideSettings,\n loadExports,\n setNewPermissionLevel,\n setNewPermissionUser,\n toggleDeleteConfirmation,\n updatePermission,\n updateProject,\n} from \"./modules/project\";\n\nclass ProjectSettingsDialog extends Component {\n\n renderAddCollabRow() {\n const { newPermissionLevel, newPermissionError } = this.props; \n\n return (\n \n Enter an email address to invite:\n \n {this.props.setNewPermissionUser(newValue);}}\n errorText={ newPermissionError ? newPermissionError : null }\n />\n \n \n {this.props.setNewPermissionLevel(newValue);}}\n >\n \n \n \n \n \n \n \n \n \n )\n }\n\n renderAddButtonLabel() {\n return this.props.newPermissionLoading ? 'Adding...' : 'Add'\n }\n\n validateAddCollab() {\n const { newPermissionUser, newPermissionLoading } = this.props; \n\n return (\n newPermissionLoading === false && \n newPermissionUser !== null && \n newPermissionUser.length > 0\n )\n }\n\n renderCollabTableRow(userProjectPermission) {\n const { currentUser } = this.props;\n\n return (\n \n {userProjectPermission.user.name}\n {userProjectPermission.user.user_email}\n \n {this.props.updatePermission(userProjectPermission.id, newValue);}}\n disabled={currentUser.attributes.id === userProjectPermission.user.id}\n >\n \n \n \n \n \n \n {this.props.deletePermission(userProjectPermission.id);}} backgroundColor={red100} hoverColor={red200} disabled={currentUser.attributes.id === userProjectPermission.user.id} />\n \n \n )\n }\n\n renderCollaboratorsTab() {\n const { userProjectPermissions } = this.props;\n\n return (\n \n \n \n \n Name\n Email\n Permission level\n \n \n \n \n { userProjectPermissions.map(userProjectPermission => {\n return this.renderCollabTableRow(userProjectPermission)\n })}\n { this.renderAddCollabRow() }\n \n
\n
\n );\n }\n\n renderProjectTab() {\n const { id, title, description } = this.props;\n\n return (\n \n {this.scheduleProjectTitleUpdate(newValue);}}\n />
\n {this.scheduleProjectDescriptionUpdate(newValue);}}\n multiLine={true}\n rows={4}\n rowsMax={2}\n />\n {this.props.updateProject(id, {public: isInputChecked});}}\n style={{ maxWidth: '300px', margin: '18px 0' }}\n />\n
\n )\n }\n\n renderExportsTab() {\n const { exports, createExport } = this.props;\n let exportsTable;\n if (exports && exports.length) {\n const exportRows = exports.map((exp) => {\n let updatedAt = exp.updated_at;\n if (typeof updatedAt !== 'string') updatedAt *= 1000;\n updatedAt = new Date(updatedAt);\n let exportLink = \"-\";\n if (exp.url) {\n exportLink = Download;\n }\n let status = exp.status;\n if (exp.error_class) {\n status = <>\n {exp.status}\n {}}\n disableFocusRipple\n disableTouchRipple\n >\n \n \n \n }\n return (\n \n {updatedAt.toLocaleString()}\n \n {status}\n \n {exportLink}\n \n )\n });\n exportsTable = (\n \n \n \n Date\n \n Status\n { this.props.loadExports(this.props.id) }}\n disabled={this.props.exportsLoading}\n >\n \n \n \n Actions\n \n \n \n {exportRows}\n \n
\n )\n }\n let createStatus;\n if (this.props.exportJobId) {\n createStatus = (\n <>\n \n Initiated successfully\n \n )\n }\n return (\n \n {exportsTable}\n

\n Initiate an export for archival purposes. This will create a .zip file with simple \n HTML representations of this project's contents, preserving all text, images, and\n annotations. It may take some time to produce; check back here for its status.\n

\n
\n {this.props.createExport()}}\n backgroundColor={lightBlue100}\n hoverColor={lightBlue200}\n disabled={!!this.props.exportsLoading || !!this.props.exportJobId}\n />\n {createStatus}\n
\n
\n );\n }\n\n renderDeleteTab() {\n const { id, deleteConfirmed, toggleDeleteConfirmation } = this.props;\n\n return (\n \n

Delete My Project

\n \n {this.props.deleteProject(id)}}\n backgroundColor={red400}\n hoverColor={red600}\n style={{ color: deleteConfirmed ? 'white' : grey200 }}\n disabled={!deleteConfirmed}\n />\n
\n )\n }\n\n render() {\n const { settingsShown, hideSettings } = this.props;\n\n return (\n \n ]}\n contentStyle={{\n width: '90%',\n maxWidth: '1000px',\n position: 'absolute',\n left: '50%',\n top: '65px',\n transform: 'translate(-50%, 0)',\n transition: 'top 0.5s ease',\n }}\n >\n \n { this.renderProjectTab() }\n { this.renderCollaboratorsTab() }\n { this.renderExportsTab() }\n { this.renderDeleteTab() }\n \n \n );\n }\n\n scheduleProjectTitleUpdate(title) {\n const delay = 1000; // milliseconds\n if (this.scheduledProjectTitleUpdate)\n window.clearTimeout(this.scheduledProjectTitleUpdate);\n this.scheduledProjectTitleUpdate = window.setTimeout(function() {\n this.props.updateProject(this.props.id, {title});\n }.bind(this), delay);\n }\n\n scheduleProjectDescriptionUpdate(description) {\n const delay = 1000; // milliseconds\n if (this.scheduledProjectDescriptionUpdate)\n window.clearTimeout(this.scheduledProjectDescriptionUpdate);\n this.scheduledProjectDescriptionUpdate = window.setTimeout(function() {\n this.props.updateProject(this.props.id, {description});\n }.bind(this), delay);\n }\n}\n\nconst mapStateToProps = state => ({\n currentUser: state.reduxTokenAuth.currentUser,\n settingsShown: state.project.settingsShown,\n id: state.project.id,\n title: state.project.title,\n description: state.project.description,\n userProjectPermissions: state.project.userProjectPermissions,\n public: state.project.public,\n newPermissionUser: state.project.newPermissionUser,\n newPermissionLevel: state.project.newPermissionLevel,\n newPermissionError: state.project.newPermissionError,\n newPermissionLoading: state.project.newPermissionLoading,\n deleteConfirmed: state.project.deleteConfirmed,\n exports: state.project.exports,\n exportsLoading: state.project.exportsLoading,\n exportJobId: state.project.exportJobId,\n});\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n hideSettings,\n updateProject,\n setNewPermissionUser,\n setNewPermissionLevel,\n createNewPermission,\n deletePermission,\n updatePermission,\n toggleDeleteConfirmation,\n deleteProject,\n createExport,\n loadExports,\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(ProjectSettingsDialog);\n","import React, { Component } from 'react';\nimport { DragSource } from 'react-dnd';\nimport FlatButton from 'material-ui/FlatButton';\n\nclass AddDocumentButton extends Component {\n componentDidMount() {\n // use a static image for drag preview\n const { addType, connectDragPreview } = this.props;\n let dragIcon = new Image();\n if (addType === 'text') {\n dragIcon.src = '/dragging-add-doc.png';\n } else {\n dragIcon.src = '/dragging-add-img.png';\n }\n connectDragPreview(dragIcon);\n }\n\n render() {\n if (this.props.addType === \"batch\") {\n // image batch should not be draggable, as it already has a folder\n // selector in its modal\n return (\n
\n \n
\n );\n }\n // connect all others to drag and drop\n return this.props.connectDragSource(\n
\n \n
\n );\n }\n}\n\nfunction collectDrag(connect, monitor) {\n return {\n connectDragSource: connect.dragSource(),\n connectDragPreview: connect.dragPreview(),\n isDragging: monitor.isDragging()\n };\n}\n\nexport default DragSource(\n 'newDocument',\n { beginDrag: (props) => ({ addType: props.addType }) },\n collectDrag\n)(AddDocumentButton);\n","import React, { Component } from 'react';\nimport { DragSource } from 'react-dnd';\nimport CreateNewFolder from 'material-ui/svg-icons/file/create-new-folder';\nimport FlatButton from 'material-ui/FlatButton';\n\nclass AddFolderButton extends Component {\n componentDidMount() {\n // use a static image for add folder drag preview\n const { connectDragPreview } = this.props;\n let dragIcon = new Image();\n dragIcon.src = '/dragging-add-folder.png';\n connectDragPreview(dragIcon);\n }\n\n render() {\n return this.props.connectDragSource(\n
\n }\n onClick={this.props.onClick}\n />\n
\n );\n }\n}\n\nfunction collectDrag(connect, monitor) {\n return {\n connectDragSource: connect.dragSource(),\n connectDragPreview: connect.dragPreview(),\n isDragging: monitor.isDragging()\n };\n}\n\nexport default DragSource(\n 'newFolder',\n { beginDrag: (_props) => ({}) },\n collectDrag\n)(AddFolderButton);\n","import React, { Component } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { DragSource } from 'react-dnd';\n\nimport { ListItem } from 'material-ui/List';\nimport TextFields from 'material-ui/svg-icons/editor/text-fields';\nimport ArrowDown from 'material-ui/svg-icons/navigation/expand-more';\nimport ArrowRight from 'material-ui/svg-icons/navigation/chevron-right';\nimport HighlightOff from 'material-ui/svg-icons/action/highlight-off';\nimport IconButton from 'material-ui/IconButton';\nimport Avatar from 'material-ui/Avatar';\nimport Link from 'material-ui/svg-icons/content/link';\n\nimport { grey100, grey300, grey400, grey800, white, black } from 'material-ui/styles/colors';\n\nimport { TEXT_RESOURCE_TYPE, CANVAS_RESOURCE_TYPE } from './modules/project';\nimport { openDocument } from './modules/documentGrid';\n\nclass Summary extends Component {\n constructor(props) {\n super(props);\n\n this.singleClickTimeout = null;\n this.doubleClickCutoffMs = 400;\n\n this.defaultBgColor = this.props.item.linkItem ? 'white' : grey100;\n\n this.state = {\n backgroundColor: this.props.isOpen && this.props.item.document_kind !== 'folder' ? grey800 : this.defaultBgColor,\n };\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.isOpen !== this.props.isOpen) {\n this.setState({\n backgroundColor: this.props.isOpen && this.props.item.document_kind !== 'folder' ? grey800 : this.defaultBgColor,\n })\n }\n }\n\n renderRightIcon() {\n const { item } = this.props;\n\n if( !item.linkItem && item.document_kind !== 'folder' && this.props.isDraggable ) {\n return (\n
\n \n
\n ) \n } else {\n return null;\n }\n }\n\n renderRightButton() {\n const { item, writeEnabled } = this.props;\n if( item.linkItem ) {\n if( !writeEnabled ) return null;\n return (\n { item.removeLinkCallback(item)} }\n >\n \n \n )\n } else {\n return null;\n }\n }\n\n render() {\n const { document_kind, thumbnail_url, linkItem } = this.props.item;\n return (\n {\n if(linkItem) {\n this.setState({\n backgroundColor: grey300,\n });\n }\n }}\n onMouseLeave={() => {\n if(linkItem) {\n this.setState({\n backgroundColor: 'white',\n });\n }\n }}\n leftAvatar={document_kind === 'folder' ? null :\n : null}\n style={!linkItem ? {\n left: '8px',\n borderRadius: '0'\n } : {\n borderRadius: '0'\n }}\n />\n }\n leftIcon={document_kind === 'folder' ? (this.props.isOpen ? : ) : null}\n rightIcon={ this.renderRightIcon() }\n rightIconButton={ this.renderRightButton() }\n style={!linkItem ? {\n borderStyle: 'solid',\n borderWidth: this.props.borderBold ? '2px' : '1px',\n borderColor: grey400,\n margin: this.props.isDraggable ? '0 8px' : '12px 8px',\n color: this.props.isOpen ? white : black,\n backgroundColor: this.props.isOpen && document_kind !== 'folder' ? grey800 : this.state.backgroundColor,\n cursor: this.props.isDragging ? '-webkit-grabbing' : ((this.props.isDraggable && '-webkit-grab') || 'pointer'),\n maxWidth: `${this.props.sidebarWidth - 20}px`\n } : {\n color: this.props.isOpen ? white : black,\n backgroundColor: this.props.isOpen && document_kind !== 'folder' ? grey800 : this.state.backgroundColor,\n }}\n innerDivStyle={!linkItem ? {\n paddingLeft: '64px'\n } : null}\n onClick={event => {\n event.stopPropagation();\n window.clearTimeout(this.singleClickTimeout);\n this.singleClickTimeout = window.setTimeout(() => {\n this.props.handleClick();\n }, this.doubleClickCutoffMs);\n }}\n onDoubleClick={() => {\n window.clearTimeout(this.singleClickTimeout);\n this.props.handleDoubleClick();\n }}\n >\n {this.props.children}\n \n );\n }\n}\n\nconst summarySource = {\n beginDrag(props) {\n return {\n id: props.item.id,\n linkable_id: props.item.highlight_id || props.item.document_id,\n linkable_type: props.item.highlight_id ? 'Highlight' : 'Document',\n isFolder: props.isFolder,\n isLinkItem: props.item.linkItem,\n link_id: props.item.link_id,\n descendant_folder_ids: props.isFolder ? props.item.descendant_folder_ids : null,\n existingParentId: props.item.parent_id,\n existingParentType: props.item.parent_type\n };\n }\n};\n\nfunction collect(connect, monitor) {\n return {\n connectDragSource: connect.dragSource(),\n connectDragPreview: connect.dragPreview(),\n isDragging: monitor.isDragging()\n };\n}\n\nclass DraggableSummary extends Component {\n\n componentDidMount() {\n // use a static image for dragg preview\n const { connectDragPreview } = this.props;\n let linkDragIcon = new Image();\n linkDragIcon.src = '/dragging-link.png';\n connectDragPreview(linkDragIcon);\n }\n\n render() {\n return this.props.connectDragSource(\n
\n \n
\n );\n }\n}\nDraggableSummary = DragSource(\n props => props.inContents ? 'contentsSummary' : 'linkableSummary',\n summarySource,\n collect\n)(DraggableSummary);\n\nclass LinkableSummary extends Component {\n componentWillMount() {\n ListItem.defaultProps.disableTouchRipple = true;\n ListItem.defaultProps.disableFocusRipple = true;\n }\n\n render() {\n if (this.props.isDraggable) {\n return (\n
\n \n
\n );\n }\n else {\n return ;\n }\n }\n}\n\nconst mapStateToProps = state => ({\n sidebarWidth: state.project.sidebarWidth\n});\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n openDocument\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(LinkableSummary);\n","import React, { Component } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport TextField from 'material-ui/TextField';\nimport IconButton from 'material-ui/IconButton';\nimport DeleteForever from 'material-ui/svg-icons/action/delete-forever';\nimport { grey600, grey900, red800 } from 'material-ui/styles/colors';\nimport { openFolder, closeFolder, updateFolder } from './modules/folders';\nimport { updateDocument, openDeleteDialog, FOLDER_DELETE } from './modules/documentGrid';\nimport { loadProject } from './modules/project';\nimport LinkableList from './LinkableList';\nimport LinkableSummary from './LinkableSummary';\n\nconst titleChangeDelayMs = 800;\n\nconst FolderContents = props => {\n switch (props.contents) {\n case 'loading':\n return

Loading...

;\n\n case 'errored':\n return

Error!

;\n\n default:\n if (props.contents.length > 0) {\n return (\n \n );\n }\n return

Empty

;\n }\n}\n\nclass DocumentFolder extends Component {\n render() {\n return (\n \n
\n {\n window.clearTimeout(this['folderTitleChangeTimeout_' + this.props.item.id]);\n this['folderTitleChangeTimeout_' + this.props.item.id] = window.setTimeout(() => {\n this.props.updateFolder(this.props.item.id, {title: newValue});\n }, titleChangeDelayMs);\n }}\n onClick={event => {\n event.stopPropagation();\n return 0;\n }}\n />\n {this.props.isOpen && this.props.adminEnabled &&\n {\n this.props.openDeleteDialog(\n 'Destroying \"' + this.props.item.document_title + '\"',\n (<>\n

\n Deleting this folder will destroy all its contents.\n

\n

\n That means that all contained documents or folders, and any child annotations\n original to those documents, will be destroyed.\n

\n

\n If you wish to preserve any documents or folders inside, click\n Cancel and move them out of this folder before deleting it.\n

\n ),\n 'Destroy folder',\n { folderId: this.props.item.id, parentType: this.props.item.parent_type, parentId: this.props.parentId },\n FOLDER_DELETE\n );\n }}\n >\n \n \n }\n
\n {this.props.isOpen &&\n \n }\n
\n );\n }\n}\n\nconst mapStateToProps = state => ({\n openFolderContents: state.folders.openFolderContents,\n projectId: state.project.id\n});\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n openFolder,\n closeFolder,\n updateDocument,\n updateFolder,\n loadProject,\n openDeleteDialog\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(DocumentFolder);\n","const MAX_IIIF_CANVASES = 250\n\nexport function checkTileSource( tileSource, successCallBack, errorCallback ) {\n\n const retryWithInfoJSON = function(initialResponse) {\n const withInfoJson = tileSource+'/info.json'\n fetch(withInfoJson).then(response => {\n if( response.ok ) {\n console.log(`Found image info at: ${withInfoJson}`)\n successCallBack( withInfoJson )\n } else {\n errorCallback(response.statusText)\n } \n })\n }\n\n fetch(tileSource).then(response => {\n if (!response.ok) {\n console.log(response.statusText);\n retryWithInfoJSON(response)\n } else {\n successCallBack( tileSource )\n }\n }).catch( (e) => {\n console.error(e);\n retryWithInfoJSON(e)\n }) \n}\n\nexport function parseIIIFManifest(manifestJSON) {\n const manifest = JSON.parse(manifestJSON);\n if( !manifest ) {\n return null\n }\n \n // IIIF presentation 2.1\n let canvasCount = 0\n const sequences = manifest.sequences.map( (sequence) => {\n let sequenceLabel = sequence.label ? sequence.label : 'unnamed sequence'\n let newSequence = { name: sequenceLabel, children: [] }\n if( sequence.canvases ) {\n let canvases = []\n sequence.canvases.forEach( (canvas) => {\n let image = canvas.images ? canvas.images[0] : null\n if( image && \n image.resource &&\n image.resource.service &&\n image.resource.service[\"@id\"] ) {\n let canvasLabel = canvas.label ? canvas.label : 'unnamed canvas'\n canvasCount++\n canvases.push( {\n name: canvasLabel,\n image_info_uri: image.resource.service[\"@id\"]\n })\n }\n });\n newSequence.children = canvases\n } \n return newSequence\n })\n \n // don't parse this file if it exceeds limits\n if( canvasCount > MAX_IIIF_CANVASES ) {\n console.log(\"Maximum number of IIIF canvases exceeded.\")\n return null\n }\n\n return sequences;\n }\n ","import React, { Component } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { DropTarget } from 'react-dnd';\nimport { openFolder, closeFolder, moveFolder, addTree } from './modules/folders';\nimport { openDocumentPopover, closeDocumentPopover, showBatchImagePrompt } from './modules/project';\nimport { createTextDocument, createCanvasDocument } from './modules/documentGrid';\nimport { createFolder } from './modules/folders';\nimport { addLink, moveLink } from './modules/annotationViewer';\nimport { moveDocument } from './modules/documentGrid';\nimport { loadProject } from './modules/project';\nimport DocumentFolder from './DocumentFolder';\nimport {NativeTypes} from 'react-dnd-html5-backend';\nimport { parseIIIFManifest } from './modules/iiif';\n\nconst ListTargetInner = props => {\n const { isFolder, isOver, itemType, inContents, writeEnabled, adminEnabled, openDocumentIds, item, openFolderContents, allDraggable } = props;\n if (isFolder) {\n let contents = openFolderContents[item.id];\n return {contents ? props.closeFolder(item.id) : props.openFolder(item.id);}}\n handleDoubleClick={() => {}}\n />\n }\n else {\n const isNewItem = ['newDocument', 'newFolder'].includes(itemType);\n const shouldShowOver = isOver && !(!inContents && isNewItem);\n return (\n
\n
\n
\n );\n }\n}\n\nfunction handleFileSystemDrop(props,monitorItem) {\n const { addTree, targetParentId, targetParentType, buoyancyTarget } = props\n const droppedFile = monitorItem.files[0]\n const droppedFileName = droppedFile.name\n let reader = new FileReader();\n\n reader.onload = (e) => {\n try {\n let sequences = parseIIIFManifest(reader.result);\n if( sequences ) { \n // for manifests with a single sequence, don't create an extra subfolder\n let tree = ( sequences.length === 1 ) ? {\n name: droppedFileName,\n position: buoyancyTarget,\n children: sequences[0].children\n } : {\n name: droppedFileName,\n position: buoyancyTarget,\n children: sequences\n }\n console.log(tree)\n addTree( targetParentId, targetParentType, tree)\n }\n }\n catch(e) {\n console.log( \"Unable to parse IIIF Manifest: \"+e)\n }\n }\n reader.readAsText(droppedFile);\n}\n\nfunction handleDMItemDrop(props,monitorItem) {\n let handler = props.moveDocument;\n let idToPass = monitorItem.id;\n if (props.inContents && monitorItem.isFolder) {\n handler = props.moveFolder;\n } else if (!props.inContents) {\n if (\n props.targetParentType === monitorItem.linkable_type \n && props.targetParentId === monitorItem.linkable_id\n ) {\n // Target and monitorItem are the same\n return;\n } else if (\n !props.items.find(item => \n (monitorItem.linkable_type === 'Highlight' && item.highlight_id === monitorItem.linkable_id)\n || (monitorItem.linkable_type === 'Document' && item.document_id === monitorItem.linkable_id)\n )\n ) {\n // Link isn't yet in list\n const origin = {\n linkable_id: props.highlightId || props.documentId,\n linkable_type: props.highlightId ? 'Highlight' : 'Document'\n }\n props.addLink(origin, monitorItem, props.buoyancyTarget, origin.linkable_type);\n return;\n } else {\n // Link in list, just needs to reorder\n idToPass = monitorItem.link_id;\n handler = props.moveLink;\n }\n }\n const targetID = props.targetParentType === 'Project' ? null : props.targetParentId;\n handler(idToPass, targetID, props.targetParentType, props.buoyancyTarget )\n .then(() => {\n // TODO these shouldn't happen until we get an OK back from the server\n if (monitorItem.existingParentType === 'Project' || props.targetParentType === 'Project')\n props.loadProject(props.projectId);\n if (monitorItem.existingParentType === 'DocumentFolder' && props.openFolderContents[monitorItem.existingParentId])\n props.openFolder(monitorItem.existingParentId);\n if (props.targetParentType === 'DocumentFolder' && props.openFolderContents[props.targetParentId])\n props.openFolder(props.targetParentId);\n });\n}\n\nconst listDropTarget = {\n canDrop(props, monitor) {\n const monitorItem = monitor.getItem();\n const itemType = monitor.getItemType();\n if (\n (props.item && monitorItem.isFolder && (monitorItem.id === props.item.id \n || (monitorItem.descendant_folder_ids && monitorItem.descendant_folder_ids.includes(props.item.id))\n )) \n || (monitorItem.isLinkItem && props.inContents)\n || (monitorItem.files && !props.inContents)\n || (!props.inContents && ['newDocument', 'newFolder'].includes(itemType))\n ) {\n return false;\n }\n return true;\n },\n\n drop(props, monitor) {\n const {\n buoyancyTarget,\n createCanvasDocument,\n createFolder,\n createTextDocument,\n targetParentId,\n targetParentType,\n } = props;\n\n if (!monitor.didDrop()) {\n const monitorItem = monitor.getItem();\n const itemType = monitor.getItemType();\n if (monitorItem.files) {\n handleFileSystemDrop(props ,monitorItem)\n } else if (itemType === \"contentsSummary\") {\n handleDMItemDrop(props, monitorItem)\n } else if (itemType === \"newDocument\") {\n if(monitorItem.addType === \"image\") {\n createCanvasDocument({\n parentId: targetParentId,\n parentType: targetParentType,\n position: buoyancyTarget + 1,\n });\n }\n else {\n createTextDocument(targetParentId, targetParentType, buoyancyTarget + 1);\n }\n } else if (itemType === \"newFolder\") {\n createFolder(targetParentId, targetParentType, \"New Folder\", buoyancyTarget + 1);\n }\n }\n }\n};\n\nfunction collect(connect, monitor) {\n return {\n connectDropTarget: connect.dropTarget(),\n isOver: monitor.isOver(),\n itemType: monitor.getItemType(),\n };\n}\n\nclass ListDropTarget extends Component {\n componentDidUpdate(prevProps) {\n if (this.props.addedLink !== prevProps.addedLink) {\n const { id, highlight_id, document_id, position, listType } = this.props.addedLink;\n if (position === this.props.buoyancyTarget) {\n if (listType === 'Highlight') {\n this.props.moveLink(id, highlight_id, 'Highlight', position + 1);\n } else if (listType === 'Document') {\n this.props.moveLink(id, document_id, 'Document', position + 1);\n }\n }\n }\n }\n render() {\n return this.props.connectDropTarget(\n
\n \n
\n );\n }\n}\n\nListDropTarget = DropTarget(\n ['contentsSummary', 'newFolder', 'newDocument', NativeTypes.FILE],\n listDropTarget,\n collect,\n)(ListDropTarget);\n\nconst mapStateToProps = state => ({\n documentPopoverOpenFor: state.project.documentPopoverOpenFor,\n openFolderContents: state.folders.openFolderContents,\n projectId: state.project.id,\n addedLink: state.annotationViewer.addedLink,\n});\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n openFolder,\n closeFolder,\n moveFolder,\n moveDocument,\n addLink,\n moveLink,\n loadProject,\n addTree,\n openDocumentPopover,\n closeDocumentPopover,\n createTextDocument,\n createCanvasDocument,\n createFolder,\n showBatchImagePrompt,\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(ListDropTarget);\n","import React, { Component } from 'react';\nimport { connect } from 'react-redux';\nimport { bindActionCreators } from 'redux';\nimport { List } from 'material-ui/List';\nimport { openDocument } from './modules/documentGrid';\nimport { openFolder, closeFolder } from './modules/folders';\nimport { selectSidebarTarget } from './modules/annotationViewer';\nimport LinkableSummary from './LinkableSummary';\nimport DocumentFolder from './DocumentFolder';\nimport ListDropTarget from './ListDropTarget';\n\nclass LinkableList extends Component {\n\n renderFolder(item, buoyancyTarget, targetParentId, targetParentType) {\n const { allDraggable, inContents, writeEnabled, adminEnabled, openDocumentIds, openFolderContents } = this.props;\n const itemKey = `${item.document_kind}-${item.id}-${item.link_id}`;\n\n let contents = openFolderContents[item.id];\n if (inContents && writeEnabled) {\n return (\n
\n \n \n
\n )\n }\n return (\n {contents ? this.props.closeFolder(item.id) : this.props.openFolder(item.id);}}\n handleDoubleClick={() => {}}\n />\n );\n }\n\n renderItem(item, buoyancyTarget, targetParentId, targetParentType) {\n const { inContents, writeEnabled, openDocuments, openDocumentIds, originKey } = this.props;\n const itemKey = `${item.document_kind}-${item.id}-${item.link_id}`;\n\n let primaryText = item.document_title;\n if (item.excerpt && item.excerpt.length > 0) {\n primaryText = (\n
\n \n {item.title ? item.title : item.excerpt}\n \n {' '}\n in\n {' '}\n {item.document_title}\n
\n );\n }\n return (\n
\n {writeEnabled &&\n \n }\n {\n let target = item.highlight_id;\n let pos = null;\n if (item.document_kind === 'text') target = item.highlight_uid;\n if (originKey) {\n const [originId, originTimeOpened] = originKey.split('-');\n pos = openDocuments\n .findIndex(doc => \n doc.id === parseInt(originId, 10) \n && doc.timeOpened === parseInt(originTimeOpened, 10)\n ) + 1;\n }\n this.props.openDocument(item.document_id, target, inContents, pos)\n }}\n // TODO use this for rename function\n handleDoubleClick={() => {}}\n // handleDoubleClick={() => {this.props.selectSidebarTarget(item);}}\n >\n
{primaryText}
\n \n
\n );\n }\n\n render() {\n const { items, inContents, writeEnabled, insideFolder, parentFolderId, projectId, highlightId, documentId } = this.props;\n let targetParentId = projectId;\n let targetParentType = 'Project';\n if (insideFolder) {\n targetParentId = parentFolderId;\n targetParentType = 'DocumentFolder';\n }\n else if (!inContents) {\n targetParentId = highlightId || documentId;\n targetParentType = highlightId ? 'Highlight' : 'Document';\n }\n\n return (\n \n
\n {items.map((item, index) => {\n if (item.document_kind === 'folder') {\n return this.renderFolder(item, index, targetParentId, targetParentType);\n } else {\n return this.renderItem(item, index, targetParentId, targetParentType);\n }\n })}\n {writeEnabled &&\n \n }\n
\n
\n );\n }\n}\n\nconst mapStateToProps = state => ({\n openFolderContents: state.folders.openFolderContents,\n projectId: state.project.id\n});\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n openDocument,\n openFolder,\n closeFolder,\n selectSidebarTarget\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(LinkableList);\n","import React, { Component } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\n\nimport { faintBlack, white } from 'material-ui/styles/colors'\nimport { toggleSidebar, showBatchImagePrompt } from './modules/project';\nimport { createTextDocument, createCanvasDocument } from './modules/documentGrid';\nimport { createFolder } from './modules/folders';\nimport AddDocumentButton from './AddDocumentButton';\nimport AddFolderButton from './AddFolderButton';\nimport LinkableList from './LinkableList';\nimport { Toolbar, ToolbarGroup, Drawer, IconButton } from 'material-ui';\nimport Settings from 'material-ui/svg-icons/action/settings';\nimport MoveToInbox from 'material-ui/svg-icons/content/move-to-inbox';\nimport NoteAdd from 'material-ui/svg-icons/action/note-add';\nimport Image from 'material-ui/svg-icons/image/image';\nimport AddToPhotos from 'material-ui/svg-icons/image/add-to-photos';\n\nclass TableOfContents extends Component {\n\n render() {\n const { sidebarWidth, sidebarOpen, adminEnabled, projectId, contentsChildren, openDocumentIds, writeEnabled } = this.props\n\n return (\n \n
\n
\n { writeEnabled &&\n \n \n {this.props.createTextDocument(projectId, 'Project');}}\n icon={}\n addType=\"text\"\n />\n {\n this.props.createCanvasDocument({\n parentId: projectId,\n parentType: 'Project',\n });\n }}\n icon={}\n addType=\"image\"\n />\n this.props.showBatchImagePrompt({ projectId })}\n icon={}\n addType=\"batch\"\n />\n {this.props.createFolder(projectId, 'Project');}}\n />\n \n \n \n { adminEnabled && \n \n \n \n }\n \n \n }\n \n
\n
\n
\n );\n }\n}\n\nconst mapStateToProps = state => ({\n projectId: state.project.id,\n sidebarOpen: state.project.sidebarOpen\n});\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n createTextDocument,\n createCanvasDocument,\n createFolder,\n toggleSidebar,\n showBatchImagePrompt,\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(TableOfContents);\n","import React from \"react\";\n\nconst PageMargins = ({ size, color }) => (\n \n \n \n \n \n \n \n);\n\nexport default PageMargins;","import {Schema} from \"prosemirror-model\"\n\nconst blockquoteDOM = [\"blockquote\", 0], hrDOM = [\"hr\"],\n preDOM = [\"pre\", [\"code\", 0]], brDOM = [\"br\"]\n\n// :: Object\n// [Specs](#model.NodeSpec) for the nodes defined in this schema.\nexport const nodes = {\n // :: NodeSpec The top level document node.\n doc: {\n content: \"block+\"\n },\n\n // :: NodeSpec A plain paragraph textblock. Represented in the DOM\n // as a `

` element.\n paragraph: {\n content: \"inline*\",\n group: \"block\",\n parseDOM: [{\n tag: \"p\",\n getAttrs: node => {\n const marginLeft = node.style['margin-left'].split('px')[0];\n const indentLevel = parseInt(marginLeft, 10) / 48;\n const lineHeightParsed = parseFloat(node.style['line-height']);\n const lineHeight = !isNaN(lineHeightParsed) ? lineHeightParsed : node.style['line-height'];\n return {\n indented: node.style['text-indent'] === '3em',\n indentLevel,\n lineHeight,\n }\n }\n }],\n attrs: {\n indented: {default: false},\n indentLevel: {default: 0},\n lineHeight: {default: 'normal'},\n },\n toDOM(node) {\n const textIndent = node.attrs.indented ? '3em' : '0';\n const marginLeft = `${node.attrs.indentLevel * 48}px`;\n const lineHeight = node.attrs.lineHeight;\n return [\"p\", {\n style: `text-indent: ${textIndent}; margin-left: ${marginLeft}; line-height: ${lineHeight}`\n }, 0];\n }\n },\n\n // :: NodeSpec A blockquote (`

`) wrapping one or more blocks.\n blockquote: {\n content: \"block+\",\n group: \"block\",\n defining: true,\n parseDOM: [{tag: \"blockquote\"}],\n toDOM() { return blockquoteDOM }\n },\n\n // :: NodeSpec A horizontal rule (`
`).\n horizontal_rule: {\n group: \"block\",\n parseDOM: [{tag: \"hr\"}],\n toDOM() { return hrDOM }\n },\n\n // :: NodeSpec A heading textblock, with a `level` attribute that\n // should hold the number 1 to 6. Parsed and serialized as `

` to\n // `

` elements.\n heading: {\n attrs: {level: {default: 1}},\n content: \"inline*\",\n group: \"block\",\n defining: true,\n parseDOM: [{tag: \"h1\", attrs: {level: 1}},\n {tag: \"h2\", attrs: {level: 2}},\n {tag: \"h3\", attrs: {level: 3}},\n {tag: \"h4\", attrs: {level: 4}},\n {tag: \"h5\", attrs: {level: 5}},\n {tag: \"h6\", attrs: {level: 6}}],\n toDOM(node) { return [\"h\" + node.attrs.level, 0] }\n },\n\n // :: NodeSpec A code listing. Disallows marks or non-text inline\n // nodes by default. Represented as a `
` element with a\n  // `` element inside of it.\n  code_block: {\n    content: \"text*\",\n    marks: \"\",\n    group: \"block\",\n    code: true,\n    defining: true,\n    parseDOM: [{tag: \"pre\", preserveWhitespace: \"full\"}],\n    toDOM() { return preDOM }\n  },\n\n  // :: NodeSpec The text node.\n  text: {\n    group: \"inline\"\n  },\n\n  // :: NodeSpec An inline image (``) node. Supports `src`,\n  // `alt`, and `href` attributes. The latter two default to the empty\n  // string.\n  image: {\n    inline: true,\n    attrs: {\n      src: {},\n      width: {default: \"unset\"},\n      alt: {default: null},\n      title: {default: null}\n    },\n    group: \"inline\",\n    draggable: true,\n    parseDOM: [{tag: \"img[src][width]\", getAttrs(dom) {\n      return {\n        src: dom.getAttribute(\"src\"),\n        title: dom.getAttribute(\"title\"),\n        alt: dom.getAttribute(\"alt\"),\n        width: dom.getAttribute(\"width\")\n      }\n    }}],\n    toDOM(node) { \n      const attrs = {style: `width: ${node.attrs.width}`}\n      return [\"img\", { ...node.attrs, ...attrs }] \n    }\n  },\n\n  // :: NodeSpec A hard line break, represented in the DOM as `
`.\n hard_break: {\n inline: true,\n group: \"inline\",\n selectable: false,\n parseDOM: [{tag: \"br\"}],\n toDOM() { return brDOM }\n }\n}\n\nconst emDOM = [\"em\", 0], strongDOM = [\"strong\", 0], codeDOM = [\"code\", 0]\n\n// :: Object [Specs](#model.MarkSpec) for the marks in the schema.\nexport const marks = {\n // :: MarkSpec A link. Has `href` and `title` attributes. `title`\n // defaults to the empty string. Rendered and parsed as an ``\n // element.\n link: {\n attrs: {\n href: {},\n title: {default: null},\n target: {default: '_blank'}\n },\n inclusive: false,\n parseDOM: [{tag: \"a[href]\", getAttrs(dom) {\n return {href: dom.getAttribute(\"href\"), title: dom.getAttribute(\"title\")}\n }}],\n toDOM(node) { return [\"a\", node.attrs, 0] }\n },\n\n // :: MarkSpec An emphasis mark. Rendered as an `` element.\n // Has parse rules that also match `` and `font-style: italic`.\n em: {\n parseDOM: [{tag: \"i\"}, {tag: \"em\"}],\n toDOM() { return emDOM }\n },\n\n underline: {\n parseDOM: [{tag: \"u\"}],\n toDOM() { return [\"u\", 0] }\n },\n\n strikethrough: {\n parseDOM: [{tag: \"s\"}],\n toDOM() { return [\"s\", 0] }\n },\n\n fontSize: {\n attrs: {fontSize: {default: '12pt'}},\n parseDOM: [{\n style: \"font-size\",\n getAttrs: (styleValue) => ({ fontSize: styleValue }),\n }],\n toDOM(mark) {\n let fontSize=mark.attrs.fontSize; \n return [\"span\", { style: `font-size:${fontSize}` }, 0] \n }\n },\n\n fontFamily: {\n attrs: {fontFamily: {default: 'sans-serif'}},\n parseDOM: [{\n style: \"font-family\",\n getAttrs: (styleValue) => ({ fontFamily: styleValue }),\n }],\n toDOM(mark) {\n let fontFamily=mark.attrs.fontFamily; \n return [\"span\", { style: `font-family:${fontFamily}` }, 0] \n }\n },\n\n color: {\n attrs: {color: {default: 'black'}},\n parseDOM: [{\n style: \"color\",\n getAttrs: (styleValue) => ({ color: styleValue }),\n }],\n toDOM(mark) {\n let color=mark.attrs.color; \n return [\"span\", { style: `color:${color}` }, 0] \n }\n },\n\n // :: MarkSpec A strong mark. Rendered as ``, parse rules\n // also match `` and `font-weight: bold`.\n strong: {\n parseDOM: [{tag: \"strong\"},\n // This works around a Google Docs misbehavior where\n // pasted content will be inexplicably wrapped in ``\n // tags with a font-weight normal.\n {tag: \"b\", getAttrs: node => node.style.fontWeight !== \"normal\" && null},\n {style: \"font-weight\", getAttrs: value => /^(bold(er)?|[5-9]\\d{2,})$/.test(value) && null}],\n toDOM() { return strongDOM }\n },\n\n // :: MarkSpec Code font mark. Represented as a `` element.\n code: {\n parseDOM: [{tag: \"code\"}],\n toDOM() { return codeDOM }\n }\n}\n\n// :: Schema\n// This schema rougly corresponds to the document schema used by\n// [CommonMark](http://commonmark.org/), minus the list elements,\n// which are defined in the [`prosemirror-schema-list`](#schema-list)\n// module.\n//\n// To reuse elements from this schema, extend or read from its\n// `spec.nodes` and `spec.marks` [properties](#model.Schema.spec).\nexport const schema = new Schema({nodes, marks})\n","import { liftListItem } from 'prosemirror-schema-list';\nimport { ReplaceAroundStep } from 'prosemirror-transform';\nimport { Slice, Fragment } from 'prosemirror-model';\n\nfunction markApplies(doc, ranges, type) {\n for (let i = 0; i < ranges.length; i++) {\n let {$from, $to} = ranges[i]\n let can = $from.depth === 0 ? doc.type.allowsMarkType(type) : false\n doc.nodesBetween($from.pos, $to.pos, node => {\n if (can) return false\n can = node.inlineContent && node.type.allowsMarkType(type)\n })\n if (can) return true\n }\n return false\n}\n\nexport function addMark(markType, attrs) {\n return function(state, dispatch) {\n let {empty, $cursor, ranges} = state.selection\n if ((empty && !$cursor) || !markApplies(state.doc, ranges, markType)) return false\n if (dispatch) {\n if ($cursor) {\n dispatch(state.tr.addStoredMark(markType.create(attrs)))\n } else {\n let has = false, tr = state.tr\n for (let i = 0; !has && i < ranges.length; i++) {\n let {$from, $to} = ranges[i]\n has = state.doc.rangeHasMark($from.pos, $to.pos, markType)\n }\n for (let i = 0; i < ranges.length; i++) {\n let {$from, $to} = ranges[i]\n tr.addMark($from.pos, $to.pos, markType.create(attrs))\n }\n dispatch(tr) \n }\n }\n return true\n }\n}\n\nexport function removeMark(markType, uid) {\n return function(state, dispatch) {\n let {empty, $cursor, ranges} = state.selection\n if (!uid && ((empty && !$cursor) || !markApplies(state.doc, ranges, markType))) return false\n if (dispatch) {\n if (markType && uid) {\n let transform = null;\n state.doc.descendants((node, position) => {\n node.marks.forEach(mark => {\n if (mark.type.name === markType.name && mark.attrs.highlightUid === uid) {\n if (transform) {\n // chain removal steps for additional marks onto the first step in the transform\n transform.removeMark(position, position + node.nodeSize, mark);\n }\n else {\n transform = state.tr.removeMark(position, position + node.nodeSize, mark);\n }\n }\n });\n });\n if (transform) dispatch(transform);\n }\n // no longer used for deleting highlights\n else if ($cursor) {\n dispatch(state.tr.removeStoredMark(markType))\n } else {\n let has = false, tr = state.tr\n for (let i = 0; !has && i < ranges.length; i++) {\n let {$from, $to} = ranges[i]\n has = state.doc.rangeHasMark($from.pos, $to.pos, markType)\n }\n for (let i = 0; i < ranges.length; i++) {\n let {$from, $to} = ranges[i]\n if (has) tr.removeMark($from.pos, $to.pos, markType)\n }\n dispatch(tr.scrollIntoView())\n }\n }\n return true\n }\n}\n\nfunction canInsert(state, nodeType) {\n const $from = state.selection.$from;\n for (let d = $from.depth; d >= 0; d--) {\n const index = $from.index(d);\n if ($from.node(d).canReplaceWith(index, index, nodeType)) { return true }\n }\n return false\n }\n\nexport function replaceNodeWith (nodeType, attrs) {\n return function(state, dispatch) {\n if (canInsert(state, nodeType)) {\n dispatch(state.tr.replaceSelectionWith(nodeType.create(attrs)));\n }\n return true\n }\n}\n\nexport function setNodeAttributes (nodeType, attributes) {\n return function(state, dispatch) {\n const { ranges } = state.selection;\n let transaction = state.tr;\n for (let i = 0; i < ranges.length; i++) {\n let { $from, $to } = ranges[i];\n state.doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n if (node.type.name === nodeType.name) {\n const attrs = { ...node.attrs, ...attributes};\n const newNode = nodeType.create(attrs, null, node.marks);\n transaction.step(\n new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1,\n pos + node.nodeSize - 1,\n new Slice(Fragment.from(newNode), 0, 0),\n 1, true,\n ),\n );\n }\n })\n }\n if(transaction.docChanged){\n dispatch(transaction);\n }\n return true;\n }\n}\n\nexport function increaseIndent (nodeType, withHanging) {\n return function(state, dispatch) {\n const { ranges } = state.selection;\n let transaction = state.tr;\n for (let i = 0; i < ranges.length; i++) {\n let { $from, $to } = ranges[i];\n state.doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n if (node.type.name === nodeType.name) {\n if (node.attrs.indented === false && node.attrs.indentLevel === 0 && withHanging) {\n const attrs = { ...node.attrs, indented: true };\n const newNode = nodeType.create(attrs, null, node.marks);\n transaction.step(\n new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1,\n pos + node.nodeSize - 1,\n new Slice(Fragment.from(newNode), 0, 0),\n 1, true,\n ),\n );\n } else if (node.attrs.indentLevel < 5) {\n let { indentLevel } = node.attrs;\n indentLevel += 1;\n const attrs = { ...node.attrs, indentLevel };\n const newNode = nodeType.create(attrs, null, node.marks);\n transaction.step(\n new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1,\n pos + node.nodeSize - 1,\n new Slice(Fragment.from(newNode), 0, 0),\n 1, true,\n ),\n );\n }\n }\n })\n }\n if(transaction.docChanged){\n dispatch(transaction);\n }\n return true;\n }\n}\n\nexport function decreaseIndent (nodeType, withHanging) {\n return function(state, dispatch) {\n const { ranges } = state.selection;\n let transaction = state.tr;\n for (let i = 0; i < ranges.length; i++) {\n let { $from, $to } = ranges[i];\n let removedFromList = false;\n state.doc.nodesBetween($from.pos, $to.pos, (node) => {\n if (node.type.name === 'list_item') {\n node.descendants((node) => {\n if (node.type.name === nodeType.name) {\n if (node.attrs.indentLevel === 0 && node.attrs.indented === false) {\n removedFromList = true;\n }\n } \n });\n if (removedFromList) {\n const cmd = liftListItem(node.type);\n cmd(state, dispatch);\n }\n }\n })\n if (removedFromList) return true;\n else {\n state.doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n if (node.type.name === nodeType.name) {\n if (node.attrs.indentLevel > 0 && (\n node.attrs.indented === false || (withHanging && node.attrs.indented === true)\n )) {\n let { indentLevel } = node.attrs;\n indentLevel -= 1;\n const attrs = { ...node.attrs, indentLevel };\n const newNode = nodeType.create(attrs, null, node.marks);\n transaction.step(\n new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1,\n pos + node.nodeSize - 1,\n new Slice(Fragment.from(newNode), 0, 0),\n 1, true,\n ),\n );\n } else if (node.attrs.indented === true && !withHanging) {\n const attrs = { ...node.attrs, indented: false };\n const newNode = nodeType.create(attrs, null, node.marks);\n transaction.step(\n new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1,\n pos + node.nodeSize - 1,\n new Slice(Fragment.from(newNode), 0, 0),\n 1, true,\n ),\n );\n }\n } \n });\n if(transaction.docChanged){\n dispatch(transaction);\n }\n return true;\n }\n }\n }\n}","import { tableNodeTypes } from 'prosemirror-tables';\nimport { TextSelection } from 'prosemirror-state';\n\nfunction createTable(state, rowsCount, colsCount, withHeaderRow, cellContent) {\n const types = tableNodeTypes(state.schema)\n const headerCells = []\n const cells = []\n const createCell = (cellType, cellContent) => cellContent ? cellType.createChecked(null, cellContent) : cellType.createAndFill()\n\n for (let index = 0; index < colsCount; index += 1) {\n const cell = createCell(types.cell, cellContent)\n\n if (cell) {\n cells.push(cell)\n }\n\n if (withHeaderRow) {\n const headerCell = createCell(types.header_cell, cellContent)\n\n if (headerCell) {\n headerCells.push(headerCell)\n }\n }\n }\n\n const rows = []\n\n for (let index = 0; index < rowsCount; index += 1) {\n rows.push(types.row.createChecked(null, withHeaderRow && index === 0 ? headerCells : cells))\n }\n\n return types.table.createChecked(null, rows)\n}\n\n// add table to a new paragraph\nexport function addTable(state, dispatch, { rowsCount, colsCount, withHeaderRow, cellContent }) {\n let tr = state.tr\n\n // get block end position\n const end = tr.selection.$head.end(1) // param 1 is node deep\n const resolvedEnd = tr.doc.resolve(end)\n\n // move cursor to the end, then insert table\n const nodes = createTable(state, rowsCount, colsCount, withHeaderRow, cellContent)\n tr.setSelection(TextSelection.near(resolvedEnd))\n tr = tr.replaceSelectionWith(nodes).scrollIntoView()\n\n // move cursor into table\n const offset = end + 1\n const resolvedPos = tr.doc.resolve(offset)\n tr.setSelection(TextSelection.near(resolvedPos))\n\n dispatch(tr)\n}","import React, { Component } from 'react';\nimport { GithubPicker } from 'react-color';\nimport { yellow500, orange300, redA100, purpleA100, blueA100, cyanA100, lightGreenA700, lightGreenA200 } from 'material-ui/styles/colors';\n\nexport default class HighlightColorSelect extends Component {\n render() {\n return (\n \n \n
\n \n {this.props.displayColorPicker &&\n
\n {this.props.setHighlightColor(color.hex);}}\n />\n
\n }\n
\n );\n }\n}\n","import React, { Component } from 'react';\n\n/**\n * This wraps ProseMirror's EditorView into React component.\n */\nexport default class ProseMirrorEditorView extends Component {\n \n focus() {\n if (this.props.editorView) {\n this.props.editorView.focus();\n }\n }\n\n componentWillUnmount() {\n if (this.props.editorView) {\n this.props.editorView.destroy();\n }\n }\n\n shouldComponentUpdate(nextProps) {\n // Update component if style attrs change\n if (this.props.style !== nextProps.style || this.props.columnCount !== nextProps.columnCount) {\n return true\n }\n // Note that EditorView manages its DOM itself so we'd rather not mess\n // with it otherwise.\n return false;\n }\n\n render() {\n // Render just an empty div which is then used as a container for an\n // EditorView instance.\n const style = { flexGrow: '1', padding: '10px', ...this.props.style };\n let className = '';\n switch (this.props.columnCount) {\n case 1: \n className = 'one-column';\n break;\n case 2: \n className = 'two-column';\n break;\n case 3:\n className = 'three-column';\n break;\n default:\n className = '';\n break;\n }\n return
;\n }\n}\n","class LinkTooltip {\n constructor(view) {\n this.tooltip = document.createElement('div');\n this.tooltip.className = 'link-tooltip';\n view.dom.parentNode.appendChild(this.tooltip);\n\n this.update(view, null);\n }\n\n update(view, lastState) {\n let state = view.state;\n // Don't do anything if the document/selection didn't change\n if (\n lastState &&\n lastState.doc.eq(state.doc) &&\n lastState.selection.eq(state.selection)\n ) {\n return;\n }\n\n let { empty, $cursor } = state.selection;\n // Don't display if there's a non-empty selection, or no cursor\n if (!$cursor || !empty) {\n this.tooltip.style.display = 'none';\n return;\n }\n this.tooltip.style.display = '';\n let { from, to } = state.selection;\n let href = '';\n // Check that we're inside a link\n let insideLink = false;\n state.doc.nodesBetween(from, to, (node) => {\n node.marks.forEach(mark => {\n if (mark.type.name === 'link') {\n insideLink = true;\n // Grab link from mark attrs\n href = mark.attrs.href;\n }\n })\n });\n // Otherwise don't display\n if (!insideLink) {\n this.tooltip.style.display = 'none';\n return;\n }\n // Viewport coordinates\n let start = view.coordsAtPos(from);\n \n // Parent bounding box\n let box = this.tooltip.offsetParent.getBoundingClientRect();\n const scrollTop = this.tooltip.offsetParent.scrollTop;\n const origTooltipLeft = start.left - box.left;\n this.tooltip.style.left = `${origTooltipLeft}px`;\n let tooltipBottom = box.bottom - start.top - scrollTop;\n this.tooltip.style.bottom = `${tooltipBottom}px`;\n let text = href;\n if (text.length > 30) {\n text = `${text.substring(0, 27)}...`;\n }\n\n this.tooltip.innerHTML = `${text}`;\n\n let tooltipRect = this.tooltip.getBoundingClientRect();\n\n // Handle horizontal overflow\n if (tooltipRect.left < box.left) {\n const overflow = box.left - tooltipRect.left;\n this.tooltip.style.left = `${origTooltipLeft + overflow + 5}px`;\n }\n if (tooltipRect.right > box.right) {\n const overflow = tooltipRect.right - box.right;\n this.tooltip.style.left = `${origTooltipLeft - overflow - 20}px`;\n }\n \n // Handle vertical overflow\n if (tooltipRect.top < box.top) {\n const lineHeight = start.bottom - start.top;\n tooltipBottom = box.top - scrollTop - (lineHeight + 3);\n this.tooltip.style.bottom = `${tooltipBottom}px`;\n tooltipRect = this.tooltip.getBoundingClientRect();\n const diff = tooltipRect.top - start.bottom;\n if (diff > 10) {\n this.tooltip.style.bottom = `${tooltipBottom + diff - 10}px`;\n }\n }\n }\n\n destroy() {\n this.tooltip.remove();\n }\n}\n\nexport default LinkTooltip;\n","import { NodeSelection } from 'prosemirror-state';\n\nclass ImageTooltip {\n constructor(view) {\n this.tooltip = document.createElement('div');\n this.tooltip.className = 'link-tooltip image-tooltip';\n\n this.buttons = [];\n\n this.tooltipImageSmall = document.createElement('span');\n this.tooltipImageSmall.innerText = 'Small';\n this.buttons.push(this.tooltipImageSmall);\n this.tooltipImageMedium = document.createElement('span');\n this.tooltipImageMedium.innerText= 'Medium';\n this.buttons.push(this.tooltipImageMedium);\n this.tooltipImageLarge = document.createElement('span');\n this.tooltipImageLarge.innerText = 'Large';\n this.buttons.push(this.tooltipImageLarge);\n this.tooltipImageOrig = document.createElement('span');\n this.tooltipImageOrig.innerText = 'Original';\n this.buttons.push(this.tooltipImageOrig);\n\n this.buttons.forEach((button, index) => {\n let tooltipDiv = document.createElement('div');\n tooltipDiv.className = index === 3 ? '' : 'image-tooltip-div';\n button.onclick = () => console.log(button.innerText);\n tooltipDiv.appendChild(button);\n this.tooltip.appendChild(tooltipDiv);\n })\n \n view.dom.parentNode.appendChild(this.tooltip);\n\n this.update(view, null);\n }\n\n handleClick({ node, from, view, width }) {\n let transaction = view.state.tr.setNodeMarkup(\n from, null, {src: node.attrs.src, width: width} \n );\n const resolvedPos = transaction.doc.resolve(from);\n const nodeSelection = new NodeSelection(resolvedPos);\n transaction = transaction.setSelection(nodeSelection);\n view.dispatch(transaction);\n view.focus();\n }\n\n update(view, lastState) {\n let state = view.state;\n // Don't do anything if the document/selection didn't change\n if (\n lastState &&\n lastState.doc.eq(state.doc) &&\n lastState.selection.eq(state.selection)\n ) {\n return;\n }\n\n let { empty } = state.selection;\n // Don't display if there's a non-empty selection, or no cursor\n if (empty) {\n this.tooltip.style.display = 'none';\n return;\n }\n this.tooltip.style.display = '';\n let { from, to } = state.selection;\n // Check that we've selected an image\n let imageSelected = false;\n let nodeSelection = null;\n state.doc.nodesBetween(from, to, (node) => {\n if (node.type.name === 'image') {\n imageSelected = true;\n nodeSelection = NodeSelection.create(state.doc, from);\n }\n });\n // Otherwise don't display\n if (!imageSelected) {\n this.tooltip.style.display = 'none';\n return;\n }\n // Viewport coordinates\n let start = view.coordsAtPos(from);\n let end = view.coordsAtPos(to)\n \n // Parent bounding box\n let box = this.tooltip.offsetParent.getBoundingClientRect();\n const scrollTop = this.tooltip.offsetParent.scrollTop;\n let origTooltipLeft = Math.max((start.left + end.left) / 2, start.left + 3) - box.left;\n this.tooltip.style.left = `${origTooltipLeft}px`;\n let tooltipBottom = box.bottom - start.top - 42 - scrollTop;\n this.tooltip.style.bottom = `${tooltipBottom}px`;\n\n let tooltipRect = this.tooltip.getBoundingClientRect();\n\n // Handle horizontal overflow\n if (tooltipRect.left < box.left) {\n let newTooltipLeft = (box.left + box.right) / 2 - box.left;\n this.tooltip.style.left = `${newTooltipLeft}px`;\n }\n if (tooltipRect.right > box.right) {\n const overflow = tooltipRect.right - box.right;\n this.tooltip.style.left = `${origTooltipLeft - overflow - 20}px`;\n }\n \n // Handle vertical overflow\n if (tooltipRect.top < box.top) {\n const diff = box.top - tooltipRect.top;\n this.tooltip.style.bottom = `${tooltipBottom - diff - 10}px`;\n }\n const node = nodeSelection !== null ? nodeSelection.node : null;\n this.tooltipImageSmall.onclick = () => this.handleClick({ node, from, view, width: '240px' });\n this.tooltipImageMedium.onclick = () => this.handleClick({ node, from, view, width: '500px' });\n this.tooltipImageLarge.onclick = () => this.handleClick({ node, from, view, width: '1024px' });\n this.tooltipImageOrig.onclick = () => this.handleClick({ node, from, view, width: 'unset' });\n }\n\n destroy() {\n this.tooltip.remove();\n }\n}\n\nexport default ImageTooltip;\n","import React, { Component } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { yellow500 } from 'material-ui/styles/colors';\nimport DropDownMenu from 'material-ui/DropDownMenu';\nimport IconMenu from 'material-ui/IconMenu';\nimport Popover from 'material-ui/Popover';\nimport Menu from 'material-ui/Menu';\nimport MenuItem from 'material-ui/MenuItem';\nimport { Toolbar, ToolbarGroup } from 'material-ui/Toolbar';\nimport Dialog from 'material-ui/Dialog';\nimport FlatButton from 'material-ui/FlatButton';\nimport TextField from 'material-ui/TextField';\nimport CircularProgress from 'material-ui/CircularProgress';\nimport DeleteForever from 'material-ui/svg-icons/action/delete-forever';\n\nimport { SketchPicker } from 'react-color';\n\nimport IconButton from 'material-ui/IconButton';\nimport TextFields from 'material-ui/svg-icons/editor/text-fields';\nimport FormatBold from 'material-ui/svg-icons/editor/format-bold';\nimport FormatItalic from 'material-ui/svg-icons/editor/format-italic';\nimport FormatUnderlined from 'material-ui/svg-icons/editor/format-underlined';\nimport FormatStrikethrough from 'material-ui/svg-icons/editor/format-strikethrough';\nimport FormatQuote from 'material-ui/svg-icons/editor/format-quote';\nimport InsertLink from 'material-ui/svg-icons/editor/insert-link';\nimport LineSpacing from 'material-ui/svg-icons/editor/format-line-spacing';\nimport FormatListBulleted from 'material-ui/svg-icons/editor/format-list-bulleted';\nimport FormatListNumbered from 'material-ui/svg-icons/editor/format-list-numbered';\nimport IncreaseIndent from 'material-ui/svg-icons/editor/format-indent-increase';\nimport DecreaseIndent from 'material-ui/svg-icons/editor/format-indent-decrease';\nimport EllipsisIcon from 'material-ui/svg-icons/navigation/more-horiz';\nimport BorderColor from 'material-ui/svg-icons/editor/border-color';\nimport CropFree from 'material-ui/svg-icons/image/crop-free';\nimport ViewColumn from 'material-ui/svg-icons/action/view-column';\nimport InsertImage from 'material-ui/svg-icons/editor/insert-photo';\nimport { Hr, Table } from 'react-bootstrap-icons';\nimport PageMargins from './icons/PageMargins';\nimport { Schema, DOMSerializer } from 'prosemirror-model';\nimport { EditorState, TextSelection, Plugin } from 'prosemirror-state';\nimport { EditorView, Decoration, DecorationSet } from 'prosemirror-view';\nimport { AddMarkStep, RemoveMarkStep, ReplaceStep } from 'prosemirror-transform';\nimport { addListNodes, wrapInList } from 'prosemirror-schema-list';\nimport { toggleMark, wrapIn } from 'prosemirror-commands';\nimport { exampleSetup } from 'prosemirror-example-setup';\nimport { undo, redo } from \"prosemirror-history\";\nimport { keymap } from \"prosemirror-keymap\";\nimport {\n tableEditing,\n columnResizing,\n tableNodes,\n addColumnBefore,\n addColumnAfter,\n deleteColumn,\n addRowBefore,\n addRowAfter,\n deleteRow,\n deleteTable,\n mergeCells,\n toggleHeaderColumn,\n toggleHeaderRow,\n isInTable,\n goToNextCell,\n} from \"prosemirror-tables\";\n\nimport { schema } from './TextSchema';\nimport {\n addMark,\n decreaseIndent,\n increaseIndent,\n removeMark,\n replaceNodeWith,\n setNodeAttributes,\n} from './TextCommands';\nimport { addTable } from './TextTableCommands';\nimport HighlightColorSelect from './HighlightColorSelect';\nimport {\n updateEditorState,\n setTextHighlightColor,\n toggleTextColorPicker,\n setHighlightSelectMode,\n selectHighlight,\n closeEditor\n} from './modules/textEditor';\nimport { setGlobalCanvasDisplay } from './modules/canvasEditor';\nimport {\n TEXT_HIGHLIGHT_DELETE,\n MAX_EXCERPT_LENGTH,\n addHighlight,\n updateHighlight,\n duplicateHighlights,\n updateDocument,\n openDeleteDialog\n} from './modules/documentGrid';\n\nimport ProseMirrorEditorView from './ProseMirrorEditorView';\nimport Checkbox from 'material-ui/Checkbox';\nimport LinkTooltip from './TextLinkTooltipPlugin';\nimport ImageTooltip from './TextImageTooltipPlugin';\nimport { DirectUploadProvider } from '@docflow/react-activestorage-provider';\n\nconst fontFamilies = ['sans-serif', 'serif', 'monospace', 'cursive'];\n\nconst lineHeights = [1, 1.15, 1.5, 2];\n\nconst buttonWidth = 48;\n\nconst validURLRegex = /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})).?)(?::\\d{2,5})?(?:[/?#]\\S*)?$/i\nconst validImageRegex = /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})).?)(?::\\d{2,5})?(?:[/?#]\\S*)?\\.(?:jpg|gif|png)$/i\n\nclass TextResource extends Component {\n\n constructor(props) {\n super(props);\n\n this.highlightsToDuplicate = [];\n this.props.setTextHighlightColor(this.getInstanceKey(), yellow500);\n this.scheduledContentUpdate = null;\n\n this.editorViewWrapper = React.createRef();\n\n this.tools = [\n { name: 'highlight-color', width: buttonWidth, text: 'Change highlight color' },\n { name: 'highlight', width: buttonWidth, text: 'Highlight selected text' },\n { name: 'highlight-select', width: buttonWidth, text: 'Select a highlight' },\n { name: 'text-color', width: buttonWidth, text: 'Change text color' },\n { name: 'bold', width: buttonWidth, text: 'Bold' },\n { name: 'italic', width: buttonWidth, text: 'Italicize' },\n { name: 'underline', width: buttonWidth, text: 'Underline' },\n { name: 'strikethrough', width: buttonWidth, text: 'Strikethrough' },\n { name: 'font-family', width: 148 },\n { name: 'font-size', width: 72 },\n { name: 'link', width: buttonWidth, text: 'Hyperlink' },\n { name: 'image', width: buttonWidth, text: 'Insert image' },\n { name: 'blockquote', width: buttonWidth, text: 'Blockquote' },\n { name: 'hr', width: buttonWidth, text: 'Horizontal rule' },\n { name: 'table', width: buttonWidth, text: 'Insert/edit table' },\n { name: 'line-spacing', width: buttonWidth, text: 'Line spacing' },\n { name: 'decrease-indent', width: buttonWidth, text: 'Decrease indent' },\n { name: 'increase-indent', width: buttonWidth, text: 'Increase indent' },\n { name: 'bulleted-list', width: buttonWidth, text: 'Bulleted list' },\n { name: 'numbered-list', width: buttonWidth, text: 'Numbered list' },\n { name: 'columns', width: buttonWidth, text: 'Set column count' },\n { name: 'margin', width: buttonWidth, text: 'Set page margins' },\n { name: 'highlight-delete', width: buttonWidth, text: 'Delete selected highlight' },\n ].map((tool, position) => {\n return { ...tool, position }\n });\n\n this.tableTools = [\n { name: 'insert-col-before', text: 'Insert column before', cmd: addColumnBefore },\n { name: 'insert-col-after', text: 'Insert column after', cmd: addColumnAfter },\n { name: 'delete col', text: 'Delete column', cmd: deleteColumn },\n { name: 'insert-row-before', text: 'Insert row before', cmd: addRowBefore },\n { name: 'insert-row-after', text: 'Insert row after', cmd: addRowAfter },\n { name: 'delete-row', text: 'Delete row', cmd: deleteRow },\n { name: 'toggle-header-col', text: 'Toggle header column', cmd: toggleHeaderColumn },\n { name: 'toggle-header-row', text: 'Toggle header row', cmd: toggleHeaderRow },\n { name: 'merge-cells', text: 'Merge cells', cmd: mergeCells },\n { name: 'delete-table', text: 'Delete table', cmd: deleteTable },\n ];\n\n this.initialLinkDialogState = {\n linkDialogOpen: false,\n linkDialogBuffer: \"\",\n linkDialogBufferInvalid: false,\n createHyperlink: null,\n }\n\n this.initialImageDialogState = {\n imageDialogOpen: false,\n imageDialogBuffer: '',\n imageDialogBufferInvalid: false,\n createImage: null,\n uploadedImage: null,\n uploadingImage: false,\n imageUploadText: '',\n }\n\n this.initialTableDialogState = {\n tableDialogOpen: false,\n tableDialogRows: '',\n tableDialogCols: '',\n tableDialogHeader: false,\n tableDialogRowsInvalid: false,\n tableDialogColsInvalid: false,\n createTable: null,\n }\n\n this.initialMarginDialogState = {\n marginDialogOpen: false,\n marginLeft: this.props.content.marginLeft || '',\n marginRight: this.props.content.marginRight || '',\n marginTop: this.props.content.marginTop || '',\n marginBottom: this.props.content.marginBottom || '',\n priorMargins: {\n marginLeft: this.props.content.marginLeft || '',\n marginRight: this.props.content.marginRight || '',\n marginTop: this.props.content.marginTop || '',\n marginBottom: this.props.content.marginBottom || '',\n },\n marginLefttInvalid: false,\n marginRightInvalid: false,\n marginTopInvalid: false,\n marginBottomInvalid: false,\n setPageMargin: null,\n }\n\n this.state = {\n editorView: null,\n documentSchema: this.createDocumentSchema(),\n targetHighlights: [],\n currentScrollTop: 0,\n toolbarWidth: 0,\n hiddenTools: ['highlight-delete'],\n hiddenToolsOpen: false,\n hiddenToolsAnchor: undefined,\n textColor: 'teal',\n colorPickerOpen: false,\n colorPickerAnchor: undefined,\n tooltipOpen: {},\n tooltipAnchor: {},\n tableMenuOpen: false,\n tableMenuAnchor: undefined,\n columnCount: this.props.content.columnCount || 1,\n ...this.initialLinkDialogState,\n ...this.initialTableDialogState,\n ...this.initialMarginDialogState,\n ...this.initialImageDialogState,\n };\n }\n \n componentDidUpdate(prevProps, prevState) {\n if (this.state.targetHighlights !== prevState.targetHighlights) {\n this.createEditorState();\n }\n if (this.props.index !== prevProps.index && this.state.currentScrollTop && this.editorViewWrapper.current) {\n this.editorViewWrapper.current.scrollTo(0, this.state.currentScrollTop);\n }\n if (this.props.content !== prevProps.content) {\n this.createEditorState();\n this.props.setLastSaved(new Date().toLocaleString('en-US'));\n this.props.setSaving({ doneSaving: true });\n }\n if (this.props.content.marginLeft !== prevProps.content.marginLeft) {\n this.setState({ marginLeft: this.props.content.marginLeft });\n }\n if (this.props.content.marginRight !== prevProps.content.marginRight) {\n this.setState({ marginRight: this.props.content.marginRight });\n }\n if (this.props.content.marginTop !== prevProps.content.marginTop) {\n this.setState({ marginTop: this.props.content.marginTop });\n }\n if (this.props.content.marginBottom !== prevProps.content.marginBottom) {\n this.setState({ marginBottom: this.props.content.marginBottom });\n }\n if (this.props.content.columnCount !== prevProps.content.columnCount) {\n this.setState({ columnCount: this.props.content.columnCount });\n }\n }\n\n renderTool = ({ toolName, text }) => {\n const { \n highlightColors,\n displayColorPickers,\n setTextHighlightColor,\n toggleTextColorPicker,\n highlightSelectModes,\n selectedHighlights,\n loading\n } = this.props;\n \n const instanceKey = this.getInstanceKey();\n let tooltip = '';\n\n switch (toolName) {\n case 'highlight-color':\n return (\n {toggleTextColorPicker(instanceKey);}}\n onMouseOver={this.onTooltipOpen.bind(this, toolName)}\n onMouseOut={this.onTooltipClose.bind(this, toolName)}\n />\n );\n\n case 'highlight':\n return (\n \n \n \n );\n\n case 'text-color':\n return (\n \n \n \n )\n \n case 'bold':\n return (\n \n \n \n );\n\n case 'italic':\n return (\n \n \n \n );\n\n case 'underline':\n return (\n \n \n \n );\n\n case 'strikethrough':\n return (\n \n \n \n );\n \n case 'font-size':\n return this.renderFontSizeDropDown(loading);\n\n case 'font-family':\n return this.renderFontFamilyDropDown(loading);\n\n case 'link':\n return (\n \n \n \n );\n\n case 'image':\n return (\n \n \n \n );\n\n case 'table':\n tooltip=!this.state.hiddenTools.includes(toolName) ? text : undefined;\n return this.renderTableMenu(loading, tooltip);\n\n case 'line-spacing':\n tooltip=!this.state.hiddenTools.includes(toolName) ? text : undefined;\n return this.renderLineSpacingMenu(loading, tooltip);\n\n case 'columns':\n tooltip=!this.state.hiddenTools.includes(toolName) ? text : undefined;\n return this.renderColumnsMenu(loading, tooltip);\n\n case 'bulleted-list':\n return (\n \n \n \n );\n\n case 'numbered-list':\n return (\n \n \n \n );\n\n case 'decrease-indent':\n return (\n \n \n \n );\n\n case 'increase-indent':\n return (\n \n \n \n );\n \n case 'blockquote':\n return (\n \n \n \n );\n\n case 'hr': {\n return (\n \n \n \n )\n }\n \n case 'highlight-select':\n return (\n \n \n \n );\n\n case 'margin':\n return (\n \n \n \n );\n \n case 'highlight-delete':\n return (\n \n \n \n );\n \n default:\n return (
);\n }\n }\n\n renderTooltipFromHidden ({ toolName, text }) {\n return (\n \n {text}\n \n );\n }\n\n onTooltipOpen (toolName, e) {\n e.persist();\n const anchorEl = e.currentTarget;\n e.preventDefault();\n this.setState((prevState) => {\n return {\n ...prevState,\n tooltipOpen: { ...prevState.tooltipOpen, [toolName]: true },\n tooltipAnchor: { ...prevState.tooltipAnchor, [toolName]: anchorEl },\n }\n });\n }\n\n onTooltipClose (toolName) {\n this.setState((prevState) => {\n return {\n ...prevState,\n tooltipOpen: { ...prevState.tooltipOpen, [toolName]: false },\n }\n });\n }\n\n onToolbarWidthChange(node) {\n if (node && node.offsetWidth !== this.state.toolbarWidth) {\n let hiddenTools = this.state.hiddenTools;\n let sumWidths = 0;\n let hidingBegan = false;\n this.tools\n .sort((a, b) => a.position - b.position)\n .forEach((tool) => {\n if (sumWidths + tool.width + buttonWidth < node.offsetWidth && !hidingBegan) {\n sumWidths += tool.width;\n if (hiddenTools.includes(tool.name) && tool.name !== 'highlight-delete') {\n hiddenTools.splice(hiddenTools.indexOf(tool.name), 1);\n }\n } else {\n hidingBegan = true;\n hiddenTools.push(tool.name);\n }\n });\n this.setState({ hiddenTools });\n this.setState({ toolbarWidth: node.offsetWidth });\n }\n }\n \n mergeRefs (...refs) {\n const filteredRefs = refs.filter(Boolean);\n if (!filteredRefs.length) return null;\n if (filteredRefs.length === 1) return filteredRefs[0];\n return inst => {\n for (const ref of filteredRefs) {\n if (typeof ref === 'function') {\n ref(inst);\n } else if (ref) {\n ref.current = inst;\n }\n }\n };\n };\n \n onScrollChange (node) {\n if (node !== null && node.scrollTop !== this.state.currentScrollTop) {\n this.setState({ currentScrollTop: node.scrollTop });\n }\n }\n\n createDocumentSchema() {\n const { document_id } = this.props;\n const instanceKey = this.getInstanceKey();\n\n const toDOM = function(mark) {\n const highlightInfo = this.props.getHighlightMap()[mark.attrs.highlightUid];\n const color = highlightInfo ? highlightInfo.color : (mark.attrs.tempColor || this.props.highlightColors[instanceKey]);\n const properties = {\n class: `dm-highlight ${instanceKey}-${mark.attrs.highlightUid}`,\n style: `background: ${color};`,\n onclick: `window.selectTextHighlight('${document_id}', '${mark.attrs.highlightUid}', '${instanceKey}')`,\n onmouseenter: `window.showRollover('${document_id}', '${mark.attrs.highlightUid}', '${instanceKey}')`,\n onmouseleave: `window.hideRollover('${mark.attrs.highlightUid}')`\n };\n properties['data-highlight-uid'] = mark.attrs.highlightUid;\n properties['data-document-id'] = mark.attrs.documentId;\n return ['span', properties, 0];\n }.bind(this);\n\n const highlightSpec = {\n attrs: {highlightUid: {default: 'dm_new_highlight'}, documentId: {default: null}, tempColor: {default: null}},\n toDOM: toDOM,\n parseDOM: [{tag: 'span.dm-highlight', getAttrs(dom) {\n return {\n highlightUid: dom.getAttribute('data-highlight-uid'),\n documentId: dom.getAttribute('data-document-id'),\n tempColor: dom.style.background\n };\n }}]\n }\n\n const marks = schema.spec.marks.addBefore('link', 'highlight', highlightSpec)\n let nodes = addListNodes( schema.spec.nodes, 'paragraph block*', 'block')\n nodes = nodes.append( tableNodes({\n tableGroup: \"block\",\n cellContent: \"block+\",\n cellAttributes: {\n background: {\n default: null,\n getFromDOM(dom) { return dom.style.backgroundColor || null },\n setDOMAttr(value, attrs) { if (value) attrs.style = (attrs.style || \"\") + `background-color: ${value};` }\n }\n }\n }))\n\n // create schema based on prosemirror-schema-basic\n return new Schema({ nodes, marks });\n }\n\n getEditorState() {\n const { editorStates } = this.props;\n const existingEditorState = editorStates[this.getInstanceKey()];\n\n if( !existingEditorState ) {\n return this.createEditorState();\n } else {\n return existingEditorState;\n }\n }\n\n createEditorState() {\n const dmSchema = this.state.documentSchema;\n\n let plugins = exampleSetup({\n schema: dmSchema,\n menuBar: false\n });\n\n // add table and history commands\n plugins.push( \n columnResizing(),\n tableEditing(),\n keymap({\n \"Mod-z\": undo,\n \"Mod-y\": redo,\n \"Mod-u\": this.onUnderlineByKey.bind(this),\n \"Ctrl-u\": this.onUnderlineByKey.bind(this),\n \"Mod-X\": this.onStrikethroughByKey.bind(this),\n \"Ctrl-X\": this.onStrikethroughByKey.bind(this),\n \"Tab\": this.handleTab.bind(this),\n \"Shift-Tab\": this.handleShiftTab.bind(this),\n })\n );\n\n const highlightSelectPlugin = new Plugin({\n props: {\n decorations: function(state) {\n let decorations = [];\n const selectedHighlight = this.props.getSelectedHighlight(this.getInstanceKey());\n if (selectedHighlight) {\n state.doc.descendants((node, position) => {\n node.marks.forEach(mark => {\n if (mark.type.name === this.state.documentSchema.marks.highlight.name && mark.attrs.highlightUid === selectedHighlight) {\n decorations.push(Decoration.inline(position, position + node.nodeSize, {class: 'selected'}));\n }\n });\n });\n }\n return DecorationSet.create(state.doc, decorations);\n }.bind(this)\n }\n });\n\n plugins.push(highlightSelectPlugin);\n\n\n const highlightTargetPlugin = new Plugin({\n props: {\n decorations: function(state) {\n let decorations = [];\n const targetHighlights = this.state.targetHighlights;\n if (targetHighlights && targetHighlights.length > 0) {\n state.doc.descendants((node, position) => {\n node.marks.forEach(mark => {\n if (mark.type.name === this.state.documentSchema.marks.highlight.name && targetHighlights.includes(mark.attrs.highlightUid)) {\n decorations.push(Decoration.inline(position, position + node.nodeSize, {class: 'targeted'}));\n }\n });\n });\n }\n return DecorationSet.create(state.doc, decorations);\n }.bind(this)\n }\n });\n\n plugins.push(highlightTargetPlugin);\n\n const linkPreviewPlugin = new Plugin({\n view(editorView) { return new LinkTooltip(editorView) }\n });\n\n plugins.push(linkPreviewPlugin);\n\n const imageResizePlugin = new Plugin({\n view(editorView) { return new ImageTooltip(editorView) }\n });\n \n if(this.isEditable()) plugins.push(imageResizePlugin);\n\n // create a new editor state\n const doc = dmSchema.nodeFromJSON(this.props.content);\n const editorState = EditorState.create({\n doc,\n selection: TextSelection.create(doc, 0),\n plugins\n })\n this.props.updateEditorState(this.getInstanceKey(), editorState);\n return editorState;\n }\n\n toSearchText(document) {\n return document.textBetween(0,document.nodeSize - 2, ' ');\n }\n\n onHighlight = (e) => {\n e.preventDefault();\n const markType = this.state.documentSchema.marks.highlight;\n const { document_id } = this.props;\n const editorState = this.getEditorState();\n const cmd = addMark( markType, {highlightUid: `dm_text_highlight_${uuidv4()}`, documentId: document_id });\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n\n onColorPickerOpen(e) {\n e.preventDefault();\n this.setState({\n colorPickerOpen: true,\n colorPickerAnchor: e.currentTarget,\n });\n }\n\n onColorPickerClose() {\n this.setState({\n colorPickerOpen: false,\n });\n this.state.editorView.focus();\n }\n\n onChangeTextColor = (color) => {\n this.setState({ textColor: color.hex });\n const colorMarkType = this.state.documentSchema.marks.color;\n const editorState = this.getEditorState();\n const cmd = color ? addMark( colorMarkType, { color: color.hex } ) : removeMark( colorMarkType );\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n\n onBold = (e) => {\n e.preventDefault();\n const markType = this.state.documentSchema.marks.strong;\n const editorState = this.getEditorState();\n const cmd = toggleMark( markType );\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n\n onItalic = (e) => {\n e.preventDefault();\n const markType = this.state.documentSchema.marks.em;\n const editorState = this.getEditorState();\n const cmd = toggleMark( markType );\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n\n onUnderlineByKey = (editorState) => {\n const markType = this.state.documentSchema.marks.underline;\n const cmd = toggleMark( markType );\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n\n preventDefaultKeymaps = (e) => {\n if (\n (e.metaKey && e.key === 'u')\n || (e.ctrlKey && e.key === 'u')\n || (e.key === 'Tab')\n ) {\n e.preventDefault();\n }\n }\n\n onUnderline = (e) => {\n e.preventDefault();\n const markType = this.state.documentSchema.marks.underline;\n const editorState = this.getEditorState();\n const cmd = toggleMark( markType );\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n\n onStrikethrough = (e) => {\n e.preventDefault();\n const markType = this.state.documentSchema.marks.strikethrough;\n const editorState = this.getEditorState();\n const cmd = toggleMark( markType );\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n\n onStrikethroughByKey = (editorState) => {\n const markType = this.state.documentSchema.marks.strikethrough;\n const cmd = toggleMark( markType );\n cmd( editorState, this.state.editorView.dispatch );\n }\n\n onIncreaseIndent = (e) => {\n e.preventDefault();\n const nodeType = this.state.documentSchema.nodes.paragraph;\n const editorState = this.getEditorState();\n const cmd = increaseIndent(nodeType, false);\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n\n onDecreaseIndent = (e) => {\n e.preventDefault();\n const nodeType = this.state.documentSchema.nodes.paragraph;\n const editorState = this.getEditorState();\n const cmd = decreaseIndent(nodeType, true);\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n\n onIncreaseIndentByKey = (editorState) => {\n const nodeType = this.state.documentSchema.nodes.paragraph;\n const cmd = increaseIndent(nodeType, true);\n cmd( editorState, this.state.editorView.dispatch );\n }\n\n onDecreaseIndentByKey = (editorState) => {\n const nodeType = this.state.documentSchema.nodes.paragraph;\n const cmd = decreaseIndent(nodeType, false);\n cmd( editorState, this.state.editorView.dispatch );\n }\n // markActive(state, type) {\n // let {from, $from, to, empty} = state.selection\n // if (empty) return type.isInSet(state.storedMarks || $from.marks())\n // else return state.doc.rangeHasMark(from, to, type)\n // }\n\n onHyperLink = (e) => {\n e.preventDefault();\n\n // http://prosemirror.net/examples/menu/\n // is the caret in a hyperlink presently?\n\n const createHyperlink = (url) => {\n const markType = this.state.documentSchema.marks.link;\n const editorState = this.getEditorState();\n const cmd = addMark( markType, { href: url } );\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n this.setState( {...this.state, linkDialogOpen: true, createHyperlink } );\n }\n\n onImage = (e) => {\n e.preventDefault();\n const createImage = (url) => {\n const imageNodeType = this.state.documentSchema.nodes.image;\n const editorState = this.getEditorState();\n const cmd = replaceNodeWith(imageNodeType, { src: url });\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n this.setState( {...this.state, imageDialogOpen: true, createImage } );\n }\n\n onOrderedList(e) {\n e.preventDefault();\n const orderedListNodeType = this.state.documentSchema.nodes.ordered_list;\n const editorState = this.getEditorState();\n const cmd = wrapInList( orderedListNodeType );\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n\n onBulletList(e) {\n e.preventDefault();\n const bulletListNodeType = this.state.documentSchema.nodes.bullet_list;\n const editorState = this.getEditorState();\n const cmd = wrapInList( bulletListNodeType );\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n\n onBlockquote(e) {\n e.preventDefault();\n const blockquoteNodeType = this.state.documentSchema.nodes.blockquote;\n const editorState = this.getEditorState();\n const cmd = wrapIn( blockquoteNodeType );\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n\n onHR(e) {\n e.preventDefault();\n const hrNodeType = this.state.documentSchema.nodes.horizontal_rule;\n const editorState = this.getEditorState();\n const cmd = replaceNodeWith(hrNodeType);\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n\n onFontSizeChange(e,i,fontSize) {\n e.preventDefault();\n const fontSizeMarkType = this.state.documentSchema.marks.fontSize;\n const editorState = this.getEditorState();\n const cmd = fontSize ? addMark( fontSizeMarkType, { fontSize } ) : removeMark( fontSizeMarkType );\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n\n onFontFamilyChange(e,i,fontFamily) {\n e.preventDefault();\n const fontFamilyMarkType = this.state.documentSchema.marks.fontFamily;\n const editorState = this.getEditorState();\n const cmd = fontFamily ? addMark( fontFamilyMarkType, { fontFamily } ) : removeMark( fontFamilyMarkType );\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n\n onLineSpacingChange = (e, lineHeight) => {\n e.preventDefault();\n const nodeType = this.state.documentSchema.nodes.paragraph;\n const editorState = this.getEditorState();\n const cmd = setNodeAttributes(nodeType, { lineHeight });\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n }\n\n onHighlightSelectMode(e) {\n e.preventDefault();\n const key = this.getInstanceKey();\n this.props.setHighlightSelectMode(key, !this.props.highlightSelectModes[key]);\n }\n\n onDeleteHighlight(e) {\n e.preventDefault();\n const selectedHighlight = this.props.selectedHighlights[this.getInstanceKey()];\n if (selectedHighlight) {\n const markType = this.state.documentSchema.marks.highlight;\n const editorState = this.getEditorState();\n const cmd = removeMark( markType, selectedHighlight );\n cmd( editorState, this.state.editorView.dispatch );\n }\n this.state.editorView.focus();\n }\n\n onTableClick(e) {\n e.preventDefault();\n const createTable = ({ rowsCount, colsCount, withHeaderRow }) => {\n const editorState = this.getEditorState();\n const dispatch = this.state.editorView.dispatch;\n addTable(editorState, dispatch, { rowsCount, colsCount, withHeaderRow });\n this.state.editorView.focus();\n }\n this.setState( {...this.state, tableDialogOpen: true, createTable } );\n }\n\n onTableMenuChange(e, action) {\n e.preventDefault();\n switch (action) {\n case 'insert-table':\n this.onTableClick(e);\n break;\n default:\n const editorState = this.getEditorState();\n const { cmd } = this.tableTools.find((tool) => tool.name === action);\n cmd( editorState, this.state.editorView.dispatch );\n this.state.editorView.focus();\n break;\n }\n }\n\n onHiddenToolsOpen(e) {\n e.preventDefault();\n this.setState({\n hiddenToolsOpen: true,\n hiddenToolsAnchor: e.currentTarget,\n });\n }\n\n onHiddenToolsClose(e) {\n this.setState({\n hiddenToolsOpen: false,\n });\n }\n\n onMarginClick(e) {\n e.preventDefault();\n const setPageMargin = ({ marginTop, marginBottom, marginLeft, marginRight }) => {\n const editorState = this.getEditorState();\n this.props.updateDocument(\n this.props.document_id,\n { \n content: {\n type: 'doc',\n content: editorState.doc.content,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n columnCount: this.state.columnCount,\n },\n },\n { refreshDocumentContent: true, timeOpened: this.props.timeOpened },\n );\n this.state.editorView.focus();\n }\n const { marginTop, marginBottom, marginLeft, marginRight } = this.state;\n this.setState(prevState => ({\n ...prevState,\n marginDialogOpen: true,\n setPageMargin,\n priorMargins: {\n marginTop, marginBottom, marginLeft, marginRight\n },\n }));\n }\n\n onColumnsChange(e, columnCount) {\n e.preventDefault();\n const editorState = this.getEditorState();\n this.setState({ columnCount });\n const { marginTop, marginBottom, marginLeft, marginRight } = this.state;\n this.props.updateDocument(\n this.props.document_id,\n { \n content: {\n type: 'doc',\n content: editorState.doc.content,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n columnCount,\n },\n },\n { refreshDocumentContent: true, timeOpened: this.props.timeOpened },\n );\n this.state.editorView.focus();\n }\n\n handleTab(editorState) {\n if (isInTable(editorState)) {\n goToNextCell(1)(editorState, this.state.editorView.dispatch);\n } else {\n this.onIncreaseIndentByKey(editorState);\n }\n }\n\n handleShiftTab(editorState) {\n if (isInTable(editorState)) {\n goToNextCell(-1)(editorState, this.state.editorView.dispatch);\n } else {\n this.onDecreaseIndentByKey(editorState);\n }\n }\n\n componentWillReceiveProps(nextProps) {\n // When we receive new EditorState through props — we apply it to the\n // EditorView instance and update local state for this component\n const editorState = this.getEditorState();\n if (editorState && nextProps.editorStates ) {\n const nextEditorState = nextProps.editorStates[this.getInstanceKey()];\n if( this.state.editorView && nextEditorState ) {\n this.state.editorView.updateState(nextEditorState);\n }\n }\n }\n\n isEditable = () => {\n const { writeEnabled, lockedByMe } = this.props;\n return ( writeEnabled && lockedByMe );\n }\n\n createEditorView = (element) => {\n if( !this.state.editorView ) {\n const editorState = this.getEditorState();\n const editorView = new EditorView(element, {\n state: editorState,\n dispatchTransaction: this.dispatchTransaction,\n handlePaste: this.handlePaste,\n editable: () => this.isEditable() && !this.props.loading,\n });\n\n let targetHighlight = null;\n // if a highlight is targeted, locate it in props\n if( this.props.firstTarget ) {\n for( let key in this.props.highlight_map ) {\n let currentHighlight = this.props.highlight_map[key]\n if( currentHighlight.uid === this.props.firstTarget ) {\n targetHighlight = currentHighlight\n break\n }\n }\n if( targetHighlight ) {\n // find the highlight position in the doc\n let targetPosition\n editorState.doc.descendants( (node, pos) => {\n if( targetPosition ) return false\n if( node.marks.find( mark => { return mark.attrs.highlightUid === targetHighlight.target } ) )\n targetPosition = pos\n })\n // scroll to position\n if( targetPosition ) {\n const domNode = editorView.nodeDOM(targetPosition)\n if( domNode ) {\n // parent node is the highlight span\n domNode.parentNode.scrollIntoView({block: \"center\"})\n window.scrollTo(0,0)\n }\n }\n }\n }\n\n // to allow resize of tables\n document.execCommand(\"enableObjectResizing\", false, false)\n document.execCommand(\"enableInlineTableEditing\", false, false)\n\n this.setState(prevState => (\n { \n ...prevState,\n targetHighlights: targetHighlight !== null ? [...prevState.targetHighlights, targetHighlight.target] : [],\n editorView\n }\n ));\n }\n }\n\n collectHighlights(startNode, from, to) {\n let highlights = [];\n startNode.nodesBetween(from, to, node => {\n node.marks.forEach(mark => {\n if (mark.type.name === this.state.documentSchema.marks.highlight.name)\n highlights.push(mark);\n });\n });\n return highlights;\n }\n\n createHighlight = (mark, slice, serializer) => {\n const { document_id, highlightColors } = this.props;\n const { highlightUid } = mark.attrs;\n const instanceKey = this.getInstanceKey();\n let div = document.createElement('div');\n div.appendChild(serializer.serializeFragment(slice.content));\n const excerpt = div.textContent.length > MAX_EXCERPT_LENGTH ? `${div.textContent.slice(0,MAX_EXCERPT_LENGTH-3)}...` : div.textContent\n this.props.addHighlight(document_id, highlightUid, highlightUid, highlightColors[instanceKey],excerpt);\n }\n\n handlePaste = (view, event, slice) => {\n // process highlights that entered via copy and paste\n let pastedMarks = [];\n slice.content.descendants(node => {\n node.marks.forEach(mark => {\n if (mark.type === this.state.documentSchema.marks.highlight) pastedMarks.push(mark);\n });\n });\n pastedMarks.forEach((mark, index) => {\n let markEntry = Object.assign({}, mark.attrs);\n mark.attrs['highlightUid'] = markEntry['newHighlightUid'] = `dm_text_highlight_${uuidv4()}_${index}`;\n mark.attrs['documentId'] = this.props.document_id;\n this.highlightsToDuplicate.push(markEntry);\n });\n }\n\n dispatchTransaction = (tx) => {\n this.processAndConfirmTransaction(tx, function(tx) {\n const editorState = this.getEditorState();\n const nextEditorState = editorState.apply(tx);\n this.state.editorView.updateState(nextEditorState);\n this.props.updateEditorState(this.getInstanceKey(), nextEditorState);\n }.bind(this));\n };\n\n processAndConfirmTransaction = (tx, callback) => {\n this.props.setSaving({ doneSaving: false });\n let postponeCallback = false;\n let postContentChanges = true;\n const serializer = DOMSerializer.fromSchema(this.state.documentSchema);\n const { steps } = tx;\n const { document_id } = this.props;\n let alteredHighlights = [];\n let effectedMarks = [];\n const editorState = this.getEditorState();\n if (steps.length > 0 && steps.every((step) => step instanceof AddMarkStep && step.mark.type.name === this.state.documentSchema.marks.highlight.name)) {\n // on highlight, will create 1 AddMarkStep per line break / element crossing\n // save one new highlight for the entire range\n this.createHighlight(steps[0].mark, tx.curSelection.content(), serializer);\n }\n steps.forEach(step => {\n // process highlights that have been removed or altered by a text content change or a mark toggle\n if (step instanceof ReplaceStep || (step instanceof RemoveMarkStep && step.mark.type.name === this.state.documentSchema.marks.highlight.name)) {\n // TODO: handle case where the space between two highlights is eliminated\n // pad the range where we look for effected highlights in order to accommodate edge cases with cursor at beginning or end of highlight\n let from = Math.max(step.from - 1, 0), to = step.to;\n if (step.to - step.from < 1) {\n let resolvedFrom = tx.doc.resolve(step.from);\n if (resolvedFrom.parentOffset < 1) {\n to += 1;\n }\n }\n try {\n editorState.doc.resolve(from);\n editorState.doc.resolve(to);\n effectedMarks = effectedMarks.concat(this.collectHighlights(editorState.doc, from, to));\n } catch (e) {\n console.log(e);\n }\n const additionTo = step.to + (tx.doc.nodeSize - tx.before.nodeSize);\n try {\n tx.doc.resolve(step.from);\n tx.doc.resolve(additionTo);\n const possibleNewMarks = this.collectHighlights(tx.doc, step.from, additionTo);\n possibleNewMarks.forEach(mark => {\n if (!effectedMarks.includes(mark) && !this.highlightsToDuplicate.map(item => item.newHighlightUid).includes(mark.attrs.highlightUid)) {\n this.createHighlight(mark, tx.doc.slice(step.from, additionTo), serializer);\n }\n });\n } catch (e) {\n console.log(e);\n }\n }\n });\n if (effectedMarks.length > 0) {\n let removedMarks = effectedMarks.slice(0);\n tx.doc.descendants(node => {\n node.marks.forEach(mark => {\n if (mark.type.name === this.state.documentSchema.marks.highlight.name) {\n const effectedIndex = effectedMarks.indexOf(mark);\n if (effectedIndex >= 0) {\n if (this.props.highlight_map[mark.attrs.highlightUid] && serializer.serializeNode(node).textContent !== this.props.highlight_map[mark.attrs.highlightUid].excerpt) {\n alteredHighlights.push({\n id: this.props.highlight_map[mark.attrs.highlightUid].id,\n excerpt: serializer.serializeNode(node).textContent\n });\n }\n removedMarks.splice(effectedIndex, 1); // the mark remains, so exclude it from the list of removed marks\n }\n }\n });\n });\n let toRemoveUids = [];\n for (let i = 0; i < removedMarks.length; i++) {\n const uid = removedMarks[i].attrs.highlightUid;\n if (toRemoveUids.indexOf(uid) < 0) toRemoveUids.push(uid);\n }\n if (toRemoveUids.length > 0) {\n postponeCallback = true;\n postContentChanges = false;\n this.props.openDeleteDialog(\n 'Removing highlight' + (toRemoveUids.length > 1 ? 's' : ''),\n 'Are you sure you want to destroy ' + (toRemoveUids.length > 1 ? (toRemoveUids.length) + ' highlights and their ' : 'a highlight and its ') + 'links?',\n 'Destroy ' + (toRemoveUids.length > 1 ? (toRemoveUids.length) + ' highlights' : 'highlight'),\n {\n transaction: tx,\n document_id,\n highlights: toRemoveUids.map(uid => this.props.highlight_map[uid]),\n highlightsToDuplicate: this.highlightsToDuplicate.slice(0),\n alteredHighlights,\n instanceKey: this.getInstanceKey(),\n timeOpened: this.props.timeOpened,\n },\n TEXT_HIGHLIGHT_DELETE\n );\n }\n }\n if (steps.length === 0) this.props.setSaving({ doneSaving: true });\n if (postContentChanges && tx.before.content !== tx.doc.content)\n this.scheduleContentUpdate(tx.doc)\n if (!postponeCallback) {\n if (this.highlightsToDuplicate.length > 0) {\n this.props.duplicateHighlights(this.highlightsToDuplicate, document_id);\n }\n alteredHighlights.forEach(highlight => {\n this.props.updateHighlight(highlight.id, {excerpt: highlight.excerpt});\n });\n callback(tx);\n }\n this.highlightsToDuplicate = [];\n }\n\n scheduleContentUpdate(doc) {\n const delay = 500; // milliseconds\n const content = doc.content;\n const search_text = this.toSearchText(doc)\n if (this.scheduledContentUpdate) {\n window.clearTimeout(this.scheduledContentUpdate);\n }\n this.scheduledContentUpdate = window.setTimeout(function() {\n this.props.updateDocument(\n this.props.document_id,\n {content: {type: 'doc', content}, search_text},\n { refreshDocumentContent: true, timeOpened: this.props.timeOpened },\n );\n this.props.setLastSaved(new Date().toLocaleString('en-US'));\n this.props.setSaving({ doneSaving: true });\n }.bind(this), delay);\n }\n\n getInstanceKey() {\n const { document_id, timeOpened } = this.props;\n return `${document_id}-${timeOpened}`;\n }\n\n renderColorPicker() {\n return (\n \n \n \n )\n }\n\n renderFontSizeDropDown(loading) {\n return (\n \n {[...Array(128).keys()].filter(key => key !== 0).map(key =>\n \n )}\n \n );\n }\n\n renderFontFamilyDropDown(loading) {\n return (\n \n {fontFamilies.map(family =>\n \n )}\n \n );\n }\n\n renderLineSpacingMenu(loading, tooltip) {\n return (\n \n \n \n }\n anchorOrigin={{horizontal: 'left', vertical: 'top'}}\n targetOrigin={{horizontal: 'left', vertical: 'top'}}\n >\n {lineHeights.map(height =>\n \n )}\n \n )\n }\n\n closeTableMenu() {\n this.setState({\n tableMenuOpen: false,\n });\n }\n\n openTableMenu(event) {\n this.setState({\n tableMenuOpen: true,\n tableMenuAnchor: event.currentTarget,\n });\n }\n\n renderTableMenu(loading, tooltip) {\n return (\n \n {\n this.openTableMenu(event);\n }}\n >\n \n \n this.closeTableMenu()}\n animated={true}\n style={{ zIndex: 20000 }}\n >\n this.closeTableMenu()}\n maxHeight={500}\n style={{\n position: 'relative',\n }}\n >\n \n {this.tableTools.map(tool => (\n \n ))}\n \n \n
\n );\n }\n\n renderColumnsMenu(loading, tooltip) {\n return (\n \n \n \n }\n anchorOrigin={{horizontal: 'left', vertical: 'top'}}\n targetOrigin={{horizontal: 'left', vertical: 'top'}}\n >\n {[1, 2, 3].map(columnCount =>\n \n )}\n \n )\n }\n\n renderToolbar() {\n\n if( !this.isEditable() ) return
;\n\n return (\n
\n e.preventDefault()} \n >\n \n {this.tools.sort((a, b) => a.position - b.position)\n .filter(tool => !this.state.hiddenTools.includes(tool.name))\n .map(tool => this.renderTool({ toolName: tool.name, text: tool.text }))\n }\n {this.state.hiddenTools.length > 0 && (\n <>\n \n \n \n \n {this.tools.sort((a, b) => a.position - b.position)\n .filter(tool => this.state.hiddenTools.includes(tool.name))\n .map(tool => this.renderTool({ toolName: tool.name, text: tool.text }))\n }\n \n {this.tools.sort((a, b) => a.position - b.position)\n .filter(tool => this.state.hiddenTools.includes(tool.name))\n .map(tool => this.renderTooltipFromHidden({ toolName: tool.name, text: tool.text }))\n }\n \n )}\n {this.renderTooltipFromHidden({ toolName: 'highlight-color', text: 'Change highlight color' })}\n {this.renderTooltipFromHidden({ toolName: 'font-family', text: 'Font' })}\n {this.renderTooltipFromHidden({ toolName: 'font-size', text: 'Font size (pt)' })}\n \n \n { this.renderColorPicker() }\n
\n );\n }\n\n onCancelHyperlinkDialog = () => {\n // discard the buffer state and close dialog\n this.setState({...this.state, ...this.initialLinkDialogState});\n }\n\n onSubmitHyperlinkDialog = () => {\n // call the callback if it is valid, otherwise, set error state and stay open\n const url = this.state.linkDialogBuffer;\n if( url && url.length > 0 && validURLRegex.test( url ) ) {\n this.state.createHyperlink( url );\n this.setState({\n ...this.state,\n ...this.initialLinkDialogState\n });\n } else {\n this.setState({ ...this.state, linkDialogBufferInvalid: true });\n }\n }\n\n renderLinkDialog() {\n const actions = [\n ,\n ,\n ];\n\n return (\n \n {this.setState( { ...this.state, linkDialogBuffer: newValue}) }}\n />\n \n );\n }\n\n onCancelImageDialog = () => {\n // discard the buffer state and close dialog\n this.setState({...this.state, ...this.initialImageDialogState});\n }\n\n onSubmitImageDialog = () => {\n // call the callback if it is valid, otherwise, set error state and stay open\n const url = this.state.imageDialogBuffer;\n if( url && url.length > 0 && (validImageRegex.test( url ) || this.state.uploadedImage) ) {\n this.state.createImage( url );\n this.setState({\n ...this.state,\n ...this.initialImageDialogState\n });\n } else {\n this.setState({ ...this.state, imageDialogBufferInvalid: true });\n }\n }\n\n renderImageDialog() {\n const actions = [\n ,\n ,\n ];\n\n return (\n \n {\n this.setState({ uploadedImage: true });\n try { \n const response = await fetch(`/images/${signedIds[0]}`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'access-token': localStorage.getItem('access-token'),\n 'token-type': localStorage.getItem('token-type'),\n 'client': localStorage.getItem('client'),\n 'expiry': localStorage.getItem('expiry'),\n 'uid': localStorage.getItem('uid')\n },\n method: 'GET',\n })\n if (!response.ok) {\n throw Error(response.statusText);\n }\n const finishedUpload = await response.json();\n this.setState({ imageDialogBuffer: finishedUpload.url });\n this.setState({ imageUploadText: 'Image upload complete, you may now click \"Insert\" below.' });\n this.setState({ uploadingImage: false });\n } catch (error) {\n this.setState({ imageUploadText: error.message });\n this.setState({ uploadingImage: false });\n }\n }}\n render={({ handleUpload, uploads, ready }) => (\n
\n {\n this.setState({ uploadingImage: true });\n handleUpload(e.currentTarget.files);\n }}\n />\n {uploads.map(upload => {\n switch (upload.state) {\n case 'waiting':\n return

Waiting to upload {upload.file.name}

\n case 'uploading':\n const { progress } = upload;\n const progressString = parseFloat(progress).toFixed(2).toString();\n return (\n

\n Uploading {upload.file.name}: {progressString}%\n

\n )\n case 'error':\n return (\n

\n Error uploading {upload.file.name}: {upload.error}\n

\n )\n case 'finished':\n return (\n

Finished uploading {upload.file.name}

\n )\n default:\n return (\n

{upload.file.name} status unknown

\n )\n }\n })}\n {this.state.imageUploadText !== '' && (\n

{this.state.imageUploadText}

\n )}\n {this.state.imageUploadText === '' && (\n

or

\n )}\n
\n )}\n /> \n {this.setState( { imageDialogBuffer: newValue }) }}\n disabled={this.state.uploadedImage || this.state.uploadingImage}\n />\n \n );\n }\n\n onCancelTableDialog = () => {\n // discard the buffer state and close dialog\n this.setState({...this.state, ...this.initialTableDialogState});\n }\n\n onSubmitTableDialog = () => {\n // call the callback if it is valid, otherwise, set error state and stay open\n const rowsCount = parseInt(this.state.tableDialogRows, 10);\n const colsCount = parseInt(this.state.tableDialogCols, 10);\n const withHeaderRow = this.state.tableDialogHeader;\n if(!isNaN(rowsCount) && !isNaN(colsCount) \n && rowsCount > 0 && colsCount > 0\n && rowsCount < 50 && colsCount < 50) {\n this.state.createTable({ rowsCount, colsCount, withHeaderRow });\n this.setState({\n ...this.state,\n ...this.initialTableDialogState\n });\n } else {\n this.setState({ \n ...this.state, \n tableDialogRowsInvalid: (isNaN(rowsCount) || rowsCount <= 0 || rowsCount >= 50), \n tableDialogColsInvalid: (isNaN(colsCount) || colsCount <= 0 || colsCount >= 50),\n });\n }\n }\n\n renderTableDialog() {\n const actions = [\n ,\n ,\n ];\n\n return (\n \n this.setState({...this.state, tableDialogRows: newValue}) }\n />\n
\n this.setState({ ...this.state, tableDialogCols: newValue}) }\n />\n
\n
\n this.setState({ ...this.state, tableDialogHeader: checked})}\n />\n \n );\n }\n\n onCancelMarginDialog = () => {\n // discard the buffer state and close dialog\n this.setState({ marginDialogOpen: false, ...this.state.priorMargins });\n }\n\n onSubmitMarginDialog = () => {\n // call the callback if it is valid, otherwise, set error state and stay open\n const marginTop = parseInt(this.state.marginTop || 0, 10);\n const marginBottom = parseInt(this.state.marginBottom || 0, 10);\n const marginLeft = parseInt(this.state.marginLeft || 0, 10);\n const marginRight = parseInt(this.state.marginRight || 0, 10);\n\n if(!isNaN(marginTop) && !isNaN(marginBottom) && !isNaN(marginLeft) && !isNaN(marginRight)\n && marginTop >= 0 && marginBottom >= 0 && marginLeft >= 0 && marginRight >= 0) {\n this.state.setPageMargin({ marginTop, marginBottom, marginLeft, marginRight });\n this.setState({\n marginDialogOpen: false,\n });\n } else {\n this.setState({\n ...this.state,\n marginTopInvalid: (isNaN(marginTop) || marginTop < 0),\n marginBottomInvalid: (isNaN(marginBottom) || marginBottom < 0),\n marginLeftInvalid: (isNaN(marginLeft) || marginLeft < 0),\n marginRightInvalid: (isNaN(marginRight) || marginRight < 0),\n });\n }\n }\n\n renderMarginDialog() {\n const actions = [\n ,\n ,\n ];\n\n return (\n \n this.setState({ marginLeft: newValue}) }\n /> px\n
\n this.setState({ marginRight: newValue}) }\n /> px\n
\n this.setState({ marginTop: newValue}) }\n /> px\n
\n this.setState({ marginBottom: newValue}) }\n /> px\n \n );\n }\n\n render() {\n const marginTop = parseInt(this.state.marginTop || 0, 10);\n const marginBottom = parseInt(this.state.marginBottom || 0, 10);\n const marginLeft = parseInt(this.state.marginLeft || 0, 10);\n const marginRight = parseInt(this.state.marginRight || 0, 10);\n const columnCount = parseInt(this.state.columnCount || 1, 10);\n return (\n
\n { this.props.writeEnabled ? this.renderToolbar() : \"\" }\n \n {this.props.loading && this.isEditable() && (\n
\n \n
\n )}\n \n { this.renderLinkDialog() }\n { this.renderImageDialog() }\n { this.renderTableDialog() }\n { this.renderMarginDialog() }\n
\n
\n );\n }\n}\n\nconst mapStateToProps = state => ({\n editorStates: state.textEditor.editorStates,\n highlightColors: state.textEditor.highlightColors,\n displayColorPickers: state.textEditor.displayColorPickers,\n highlightSelectModes: state.textEditor.highlightSelectModes,\n selectedHighlights: state.textEditor.selectedHighlights\n});\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n updateEditorState,\n addHighlight,\n updateHighlight,\n duplicateHighlights,\n setTextHighlightColor,\n toggleTextColorPicker,\n setHighlightSelectMode,\n selectHighlight,\n updateDocument,\n openDeleteDialog,\n setGlobalCanvasDisplay,\n closeEditor,\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(TextResource);\n","import React from 'react';\nimport SvgIcon from 'material-ui/SvgIcon';\n\nconst RemoveFromPhotos = (props) => (\n \n \n \n);\n\nRemoveFromPhotos.displayName = 'ImageAddToPhotos';\nRemoveFromPhotos.muiName = 'SvgIcon';\n\nexport default RemoveFromPhotos;","import React, { Component } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport ActiveStorageProvider from '@docflow/react-activestorage-provider';\nimport TextField from 'material-ui/TextField';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport CircularProgress from 'material-ui/CircularProgress';\nimport FlatButton from 'material-ui/FlatButton';\n\nimport CloudUpload from 'material-ui/svg-icons/file/cloud-upload';\nimport InsertLink from 'material-ui/svg-icons/editor/insert-link';\nimport Error from 'material-ui/svg-icons/alert/error';\n\nimport {\n setAddTileSourceMode,\n setImageUrl,\n IIIF_TILE_SOURCE_TYPE,\n IMAGE_URL_SOURCE_TYPE,\n UPLOAD_SOURCE_TYPE,\n changePage\n} from './modules/canvasEditor';\nimport {\n replaceDocument,\n updateDocument,\n setDocumentThumbnail,\n} from './modules/documentGrid';\nimport deepEqual from 'deep-equal';\n\nconst tileSourceTypeLabels = {};\ntileSourceTypeLabels[IIIF_TILE_SOURCE_TYPE] = {select: 'IIIF', textField: 'Link to IIIF Image Information URI'};\ntileSourceTypeLabels[IMAGE_URL_SOURCE_TYPE] = {select: 'Image URL', textField: 'Link to Web Image'};\ntileSourceTypeLabels[UPLOAD_SOURCE_TYPE] = {select: 'Upload image', textField: 'Choose files'};\n\nconst validURLRegex = /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})).?)(?::\\d{2,5})?(?:[/?#]\\S*)?$/i\n\nclass AddImageLayer extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n newTileSourceValue: null,\n linkError: false,\n uploadErrorMessage: null,\n uploading: false,\n newImageUrls: [],\n addingNewLayers: false,\n }\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.image_urls.length > prevProps.image_urls.length) {\n if (this.props.addTileSourceMode[this.props.document_id] === UPLOAD_SOURCE_TYPE) {\n this.props.image_urls.forEach(url =>{\n if (!prevProps.image_urls.includes(url)) {\n this.setState((prevState) => ({ ...prevState, newImageUrls: prevState.newImageUrls.concat([url]) }));\n }\n })\n } else {\n this.setState({ newImageUrls: [] });\n }\n }\n if (prevProps.content && this.props.content \n && this.props.content.tileSources && this.props.content.tileSources[0]\n && !deepEqual(prevProps.content.tileSources, this.props.content.tileSources))\n {\n this.setState({addingNewLayers: true});\n }\n }\n\n addTileSource = (addTileSourceMode) => {\n let imageUrlForThumbnail = null;\n const newContent = {};\n if (this.props.content) Object.assign(newContent, this.props.content);\n const existingTileSources = newContent.tileSources || [];\n const existingIiifTileNames = newContent.iiifTileNames || [];\n const shouldSetThumbnail = existingTileSources.length < 1;\n\n let iiifTileNames = [];\n\n let newTileSources = [];\n switch (addTileSourceMode) {\n case UPLOAD_SOURCE_TYPE:\n if (this.props.image_urls && this.props.image_urls.length > 0 \n && this.state.newImageUrls && this.state.newImageUrls.length > 0) {\n this.state.newImageUrls.forEach((url) => {\n const filename = decodeURIComponent(url.substring(\n url.lastIndexOf('/')+1,\n url.lastIndexOf('.')\n ));\n newTileSources.push({\n type: 'image',\n url,\n name: filename,\n });\n if (shouldSetThumbnail && newTileSources.length > 0)\n imageUrlForThumbnail = newTileSources[0].url;\n })\n }\n break;\n\n case IMAGE_URL_SOURCE_TYPE:\n const url = this.state.newTileSourceValue;\n const filename = url.substring(url.lastIndexOf('/')+1, url.lastIndexOf('.'));\n newTileSources.push({\n type: 'image',\n url,\n name: filename,\n });\n if (shouldSetThumbnail)\n imageUrlForThumbnail = url;\n break;\n\n case IIIF_TILE_SOURCE_TYPE:\n newTileSources.push(this.state.newTileSourceValue);\n if (shouldSetThumbnail) {\n imageUrlForThumbnail = this.state.newTileSourceValue.replace('http:', 'https:').replace('/info.json', '') + '/full/!160,160/0/default.png';\n }\n iiifTileNames.push({\n name: 'IIIF layer',\n url: this.state.newTileSourceValue,\n });\n break;\n\n default:\n newTileSources.push(this.state.newTileSourceValue);\n }\n\n this.setState(prevState => ({\n ...prevState,\n newImageUrls: [],\n newTileSourceValue: null,\n }));\n this.props.setAddTileSourceMode(this.props.document_id, null);\n\n if (shouldSetThumbnail && imageUrlForThumbnail) {\n this.props.setDocumentThumbnail({\n documentId: this.props.document_id, \n image_url: imageUrlForThumbnail,\n });\n }\n\n newContent.tileSources = existingTileSources.concat(newTileSources);\n newContent.iiifTileNames = existingIiifTileNames.concat(iiifTileNames);\n this.props.updateDocument(this.props.document_id, {\n content: newContent\n }, { replaceThisDocument: true });\n\n this.props.changePage({\n page: newContent.tileSources.length - 1,\n editorKey: this.props.editorKey,\n });\n }\n\n renderUploadButton(buttonStyle,iconStyle) {\n const {\n content,\n document_id,\n replaceDocument,\n setAddTileSourceMode,\n setLastSaved,\n setSaving,\n } = this.props;\n const allowNewLayers = this.state.addingNewLayers || (content && content.tileSources && content.tileSources.length > 0);\n return (\n {\n replaceDocument({\n ...document,\n locked_by_me: document.locked ? true : false,\n });\n this.addTileSource(UPLOAD_SOURCE_TYPE);\n this.setState({\n ...this.state,\n uploadErrorMessage: null,\n uploading: false,\n });\n setLastSaved(new Date().toLocaleString('en-US'));\n setSaving({ doneSaving: true });\n }}\n onError={() => {\n this.setState({\n ...this.state,\n uploadErrorMessage: 'Unable to process file.',\n uploading: false,\n });\n }}\n render={({ handleUpload, uploads, ready }) => (\n }\n label=\"Upload from Computer\"\n disabled={this.state.uploading}\n >\n {\n setAddTileSourceMode(\n document_id,\n UPLOAD_SOURCE_TYPE\n );\n this.setState({\n ...this.state,\n uploadErrorMessage: null,\n uploading: true,\n });\n setSaving({ doneSaving: false });\n handleUpload(e.currentTarget.files);\n }}\n style={{ display: 'none' }}\n multiple={allowNewLayers}\n />\n \n )}\n />\n );\n }\n\n onIIIFLink = () => {\n this.props.setAddTileSourceMode(this.props.document_id, IIIF_TILE_SOURCE_TYPE);\n this.setState( { ...this.state, uploadErrorMessage: null, uploading: false, linkError: false } );\n }\n\n onWebLink = () => {\n this.props.setAddTileSourceMode(this.props.document_id, IMAGE_URL_SOURCE_TYPE);\n this.setState( { ...this.state, uploadErrorMessage: null, uploading: false, linkError: false } );\n }\n\n onLinkSubmit = () => {\n const { document_id, addTileSourceMode } = this.props;\n const tileSource = this.state.newTileSourceValue\n const tileSourceMode = addTileSourceMode[document_id];\n\n if( this.validateTileSource(tileSource) ) {\n this.addTileSource(tileSourceMode);\n this.setState( { ...this.state, linkError: false } );\n } else {\n this.setState( { ...this.state, linkError: true } );\n }\n }\n\n validateTileSource(tileSource) {\n if( tileSource && tileSource.length > 0 ) {\n return validURLRegex.test( tileSource );\n }\n return false;\n }\n\n onCancel = () => {\n this.props.setAddTileSourceMode(this.props.document_id, null);\n }\n\n render() {\n const { document_id, writeEnabled, addTileSourceMode, content } = this.props;\n const tileSourceMode = addTileSourceMode[document_id];\n const allowNewLayers = this.state.addingNewLayers || (content && content.tileSources && content.tileSources.length > 0);\n \n if (!writeEnabled || !tileSourceMode) return null;\n \n const divStyle = { margin: 20 };\n const textStyle = { color: 'white' };\n const buttonStyle = { margin: 12, height: 60 };\n const iconStyle = { width: 50, height: 50 };\n \n return (\n
\n

\n {allowNewLayers && (\n <>\n Add image layer(s)\n \n )}\n {!allowNewLayers && (\n <>\n Add an image\n \n )}\n

\n

Choose an image source:

\n \n {this.renderUploadButton(buttonStyle, iconStyle)}\n \n }\n onClick={this.onIIIFLink}\n disabled={this.state.uploading}\n style={buttonStyle}\n />\n }\n onClick={this.onWebLink}\n disabled={this.state.uploading}\n style={buttonStyle}\n />\n \n {tileSourceMode !== UPLOAD_SOURCE_TYPE && (\n
\n {\n this.setState({ ...this.state, newTileSourceValue: newValue });\n }}\n />\n \n
\n )}\n {tileSourceMode === UPLOAD_SOURCE_TYPE && this.state.uploading ? (\n
\n

Uploading image...

\n \n
\n ) : (\n this.state.uploadErrorMessage != null && (\n
\n

\n \n {this.state.uploadErrorMessage}\n

\n
\n )\n )}\n \n {allowNewLayers && (\n \n )}\n
\n );\n }\n}\n\nconst mapStateToProps = state => ({\n addTileSourceMode: state.canvasEditor.addTileSourceMode\n});\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n setAddTileSourceMode,\n updateDocument,\n setImageUrl,\n setDocumentThumbnail,\n replaceDocument,\n changePage,\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(AddImageLayer);\n","import React, { Component } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport OpenSeadragon from 'openseadragon-fabricjs-overlay/openseadragon/openseadragon';\nimport { fabric } from 'openseadragon-fabricjs-overlay/fabric/fabric.adapted';\nimport { openSeaDragonFabricOverlay } from 'openseadragon-fabricjs-overlay/openseadragon-fabricjs-overlay';\nimport Slider from 'material-ui/Slider';\nimport IconButton from 'material-ui/IconButton';\nimport PanTool from 'material-ui/svg-icons/action/pan-tool';\nimport CropFree from 'material-ui/svg-icons/image/crop-free';\nimport CropSquare from 'material-ui/svg-icons/image/crop-square';\nimport PanoramaFishEye from 'material-ui/svg-icons/image/panorama-fish-eye';\nimport Place from 'material-ui/svg-icons/maps/place';\nimport Edit from 'material-ui/svg-icons/image/edit';\nimport Colorize from 'material-ui/svg-icons/image/colorize';\nimport ShowChart from 'material-ui/svg-icons/editor/show-chart';\nimport DeleteForever from 'material-ui/svg-icons/action/delete-forever';\nimport AddToPhotos from 'material-ui/svg-icons/image/add-to-photos';\nimport RemoveFromPhotos from './icons/RemoveFromPhotos';\nimport Done from 'material-ui/svg-icons/action/done';\nimport Cancel from 'material-ui/svg-icons/navigation/close';\nimport { LayerBackward, LayerForward } from 'react-bootstrap-icons';\nimport { yellow500, cyan100 } from 'material-ui/styles/colors';\nimport {\n setCanvasHighlightColor,\n toggleCanvasColorPicker,\n setImageUrl,\n setIsPencilMode,\n setAddTileSourceMode,\n UPLOAD_SOURCE_TYPE,\n toggleEditLayerName,\n} from './modules/canvasEditor';\nimport {\n addHighlight,\n updateHighlight,\n setHighlightThumbnail,\n openDeleteDialog,\n CANVAS_HIGHLIGHT_DELETE,\n moveLayer,\n CANVAS_LAYER_DELETE,\n renameLayer,\n} from './modules/documentGrid';\nimport { checkTileSource } from './modules/iiif';\nimport HighlightColorSelect from './HighlightColorSelect';\nimport AddImageLayer from './AddImageLayer';\nimport TextField from 'material-ui/TextField';\nimport deepEqual from 'deep-equal';\nimport { v4 as uuidv4 } from 'uuid';\n\n// overlay these modules\nopenSeaDragonFabricOverlay(OpenSeadragon, fabric);\n\n// from https://stackoverflow.com/a/48343346/6126327 - show consistent stroke width regardless of object scaling\nfabric.Object.prototype._renderStroke = function(ctx) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n ctx.save();\n ctx.scale(1 / this.scaleX, 1 / this.scaleY);\n this._setLineDash(ctx, this.strokeDashArray, this._renderDashedStroke);\n this._applyPatternGradientTransform(ctx, this.stroke);\n ctx.stroke();\n ctx.restore();\n};\n\nconst strokeWidth = 3.0;\nconst markerRadius = 4.0;\nconst doubleClickTimeout = 500;\nconst markerThumbnailSize = 100;\nconst fabricViewportScale = 2000;\nconst maxZoomPixelRatio = 2.25;\n\nclass CanvasResource extends Component {\n constructor(props) {\n super(props);\n this.osdId =`openseadragon-${this.props.document_id}-${Date.now()}`;\n this.osdViewer = null;\n this.upButton = null;\n this.downButton = null;\n this.layerSelect = null;\n this.imageLayerControls = null;\n this.highlight_map = {};\n this.viewportUpdatedYet = false;\n this.currentMode = 'pan';\n this.hasOpenedOnce = false;\n\n this.state = {\n currentPage: 0,\n totalPages: 0,\n layerName: '',\n zoomLevel: 0,\n maxZoom: 100,\n minZoom: 0,\n };\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.content && this.props.content \n && this.props.content.tileSources && this.props.content.tileSources[0]\n && !deepEqual(prevProps.content.tileSources, this.props.content.tileSources))\n {\n this.openTileSources(this.props.content.tileSources);\n if (this.props.content.tileSources.length !== prevProps.content.tileSources.length) {\n this.osdViewer.goToPage(0);\n this.setState({ totalPages: this.props.content.tileSources.length });\n } else {\n this.osdViewer.goToPage(this.props.pageToChange[this.getInstanceKey()] || 0);\n }\n const hasLayerControls = this.osdViewer.controls \n && this.osdViewer.controls.find(ctrl => ctrl.element.className === 'image-layer-controls');\n if (this.hasLayers() && !hasLayerControls) {\n this.osdViewer.addControl(this.imageLayerControls, {\n anchor: OpenSeadragon.ControlAnchor.TOP_LEFT,\n autoFade: false,\n });\n } else if (!this.hasLayers() && hasLayerControls) {\n this.osdViewer.removeControl(this.imageLayerControls);\n }\n this.props.setSaving({ doneSaving: true });\n this.props.setLastSaved(new Date().toLocaleString('en-US'));\n }\n if (this.layerSelect \n && prevProps.content && this.props.content && this.props.content.tileSources\n && !deepEqual(prevProps.content.iiifTileNames, this.props.content.iiifTileNames)) {\n this.refreshLayerSelect(this.props.content.tileSources);\n this.props.setSaving({ doneSaving: true });\n this.props.setLastSaved(new Date().toLocaleString('en-US'));\n }\n if (prevProps.pageToChange[this.getInstanceKey()] !== this.props.pageToChange[this.getInstanceKey()]) {\n this.osdViewer.goToPage(this.props.pageToChange[this.getInstanceKey()] || 0);\n }\n if (this.props.highlightsHidden[this.getInstanceKey()] !== prevProps.highlightsHidden[this.getInstanceKey()]\n && !this.props.highlightsHidden[this.getInstanceKey()]) {\n this.osdViewer.raiseEvent( 'update-viewport', {} );\n }\n }\n\n componentDidMount() {\n const {content, highlight_map, document_id, setCanvasHighlightColor, setAddTileSourceMode, updateHighlight, addHighlight, setHighlightThumbnail} = this.props;\n this.highlight_map = highlight_map;\n\n const initialColor = yellow500;\n const key = this.getInstanceKey();\n setCanvasHighlightColor(key, initialColor);\n\n // Handle iOS bug with \"canvas area exceeds the maximum limit\": set { useCanvas: false } if on\n // iOS and at least one of the tile sources is an image (i.e. not IIIF) \n const iOS = \n // userAgent detection (does not work on iPad)\n /iPad|iPhone|iPod/.test(navigator.userAgent) ||\n // navigator.platform detection (soon to be deprecated)\n [\n \"iPad Simulator\",\n \"iPhone Simulator\",\n \"iPod Simulator\",\n \"iPad\",\n \"iPhone\",\n \"iPod\",\n ].includes(navigator.platform) ||\n // iPad on iOS 13 detection\n (navigator.userAgent.includes(\"Mac\") &&\n (\"ontouchend\" in document || navigator.maxTouchPoints > 0));\n const containsImageFile = content &&\n content.tileSources &&\n content.tileSources.some((source) => source.type === \"image\");\n\n const viewer = this.osdViewer = OpenSeadragon({\n id: this.osdId,\n prefixUrl: '/images/',\n showNavigationControl: false,\n tileSources: [],\n maxZoomPixelRatio,\n navigatorSizeRatio: 0.15,\n gestureSettingsMouse: { clickToZoom: false },\n showNavigator: true,\n sequenceMode: true,\n showSequenceControl: false,\n preserveViewport: true,\n preserveImageSizeOnResize: true,\n useCanvas: !(iOS && containsImageFile),\n });\n const hasLayers = this.hasLayers();\n\n const upButton = this.upButton = new OpenSeadragon.Button({\n tooltip: \"Previous layer\",\n srcRest: \"/images/up_rest.png\",\n srcGroup: \"/images/up_grouphover.png\",\n srcHover: \"/images/up_hover.png\",\n srcDown: \"/images/up_pressed.png\",\n onRelease: () => {\n let prevPage = this.state.currentPage - 1;\n if (this.state && this.state.totalPages && this.state.currentPage === 0) {\n // Wrap around if at beginning\n prevPage = this.state.totalPages - 1;\n }\n viewer.goToPage(prevPage);\n },\n });\n const layerSelect = this.layerSelect = OpenSeadragon.makeNeutralElement('select');\n layerSelect.style = '';\n layerSelect.className = 'image-layer-select';\n layerSelect.name = `${this.getInstanceKey()}-layer-select`;\n layerSelect.addEventListener('change', () => {\n viewer.goToPage(parseInt(layerSelect.value, 10));\n });\n \n if (hasLayers) {\n content.tileSources.forEach((tileSource, index) => {\n const opt = OpenSeadragon.makeNeutralElement('option');\n opt.value = index;\n opt.label = `${index+1}: ${this.getLayerName(index)}`;\n layerSelect.appendChild(opt);\n });\n }\n\n const downButton = this.downButton = new OpenSeadragon.Button({\n tooltip: \"Next layer\",\n srcRest: \"/images/down_rest.png\",\n srcGroup: \"/images/down_grouphover.png\",\n srcHover: \"/images/down_hover.png\",\n srcDown: \"/images/down_pressed.png\",\n onRelease: () => {\n let nextPage = this.state.currentPage + 1;\n if (this.state && this.state.totalPages && this.state.currentPage === (this.state.totalPages-1)) {\n // Wrap around if at end\n nextPage = 0;\n }\n viewer.goToPage(nextPage);\n },\n });\n\n const wrapper = this.imageLayerControls = OpenSeadragon.makeNeutralElement('div');\n wrapper.className = 'image-layer-controls';\n const buttons = [upButton, downButton];\n const buttonGroup = new OpenSeadragon.ButtonGroup({ buttons });\n buttonGroup.element.className = 'layer-button-group';\n wrapper.appendChild(buttonGroup.element);\n wrapper.appendChild(layerSelect);\n wrapper.innerTracker = new OpenSeadragon.MouseTracker({\n element: wrapper,\n });\n if (hasLayers) {\n viewer.addControl(wrapper, {\n anchor: OpenSeadragon.ControlAnchor.TOP_LEFT,\n autoFade: false,\n });\n }\n\n const overlay = this.overlay = viewer.fabricjsOverlay({scale: fabricViewportScale});\n\n let tileSources = (content && content.tileSources) ? content.tileSources : [];\n let imageUrlForThumbnail = null\n const firstTileSource = tileSources[0];\n\n if (firstTileSource) {\n this.setState({ totalPages: tileSources.length });\n imageUrlForThumbnail = this.openTileSources(tileSources);\n } else {\n // we don't have an image yet, so this causes AddImageLayer to display\n setAddTileSourceMode(document_id, UPLOAD_SOURCE_TYPE);\n }\n\n viewer.addHandler('update-viewport', () => {\n const maxZoom = this.osdViewer.viewport.getMaxZoom();\n const minZoom = this.osdViewer.viewport.getMinZoom();\n let zoomLevel = maxZoom;\n if (this.state.zoomLevel <= minZoom) {\n zoomLevel = minZoom;\n } else if (this.state.zoomLevel <= maxZoom) {\n zoomLevel = this.state.zoomLevel;\n } \n this.setState((prevState) => ({ ...prevState, minZoom, maxZoom, zoomLevel }));\n if (!this.viewportUpdatedForPageYet) {\n this.renderHighlights(overlay, highlight_map);\n this.viewportUpdatedForPageYet = true;\n }\n const zoom = overlay.fabricCanvas().getZoom();\n overlay.fabricCanvas().forEachObject(object => {\n if (object._isMarker) {\n object.radius = markerRadius / zoom;\n }\n object.strokeWidth = strokeWidth / zoom;\n if (this.markObjectsDirtyNextUpdate) object.dirty = true;\n });\n this.markObjectsDirtyNextUpdate = false;\n overlay.fabricCanvas().freeDrawingBrush.width = strokeWidth / overlay.fabricCanvas().getZoom();\n overlay.resize();\n overlay.resizecanvas();\n });\n\n viewer.addHandler('page', (event) => {\n const pageNumber = parseInt(event.page, 10);\n if (this.layerSelect) {\n this.layerSelect.selectedIndex = pageNumber;\n }\n\n this.markObjectsDirtyNextUpdate = true;\n this.setState({\n currentPage: pageNumber,\n layerName: this.getLayerName(pageNumber),\n });\n });\n\n viewer.addHandler('open', this.onOpen.bind(this) );\n\n viewer.addHandler('zoom', event => {\n const maxZoom = this.osdViewer.viewport.getMaxZoom();\n const minZoom = this.osdViewer.viewport.getMinZoom();\n let zoomLevel = maxZoom;\n if (event.zoom <= minZoom) {\n zoomLevel = minZoom;\n } else if (event.zoom <= maxZoom) {\n zoomLevel = event.zoom;\n } \n this.setState((prevState) => ({ ...prevState, zoomLevel, minZoom, maxZoom }));\n });\n\n overlay.fabricCanvas().freeDrawingBrush.color = initialColor;\n overlay.fabricCanvas().freeDrawingBrush.width = strokeWidth / overlay.fabricCanvas().getZoom();\n\n overlay.fabricCanvas().on('object:selected', event => {\n if (this.currentMode === 'pan' && event.target && event.target._highlightUid) {\n window.setFocusHighlight(document_id, event.target._highlightUid, key); // the code that pops up the annotation\n overlay.fabricCanvas().discardActiveObject();\n } else if (this.currentMode === 'edit' && event && event.target._isTarget) {\n for (let i = 0; i < 3; i++){ // For some reason it's necessary to do this multiple times\n overlay.fabricCanvas().forEachObject((obj) => {\n if (obj && obj._isTargetChild) {\n overlay.fabricCanvas().remove(obj);\n }\n });\n }\n }\n });\n overlay.fabricCanvas().on('mouse:down', this.canvasMouseDown.bind(this) );\n overlay.fabricCanvas().on('mouse:move', this.canvasMouseMove.bind(this) );\n overlay.fabricCanvas().on('mouse:up', this.canvasMouseUp.bind(this) );\n overlay.fabricCanvas().on('object:modified', event => {\n if( this.currentMode === 'edit' && event && event.target && event.target._highlightUid && !event.target._isTargetChild ) {\n const highlight_id = this.highlight_map[event.target._highlightUid].id;\n if (highlight_id && imageUrlForThumbnail) {\n const highlightCoords = event.target._isMarker ?\n this.computeMarkerThumbBounds(event.target) :\n event.target.aCoords\n \n this.props.setSaving({ doneSaving: false });\n updateHighlight(\n highlight_id, \n {target: JSON.stringify(event.target.toJSON(['_highlightUid', '_isMarker']))},\n () => {\n this.props.setSaving({ doneSaving: true });\n this.props.setLastSaved(new Date().toLocaleString('en-US'));\n }\n );\n setHighlightThumbnail(highlight_id, imageUrlForThumbnail, highlightCoords, event.target.toSVG());\n }\n }\n });\n\n // rollover highlights\n overlay.fabricCanvas().on('mouse:over', event => {\n if (this.currentMode === 'pan' && event.target && event.target._highlightUid) {\n window.showRollover(this.props.document_id, event.target._highlightUid, key);\n }\n });\n overlay.fabricCanvas().on('mouse:out', function(event) {\n if (this.currentMode === 'pan' && event.target && event.target._highlightUid) {\n window.hideRollover(event.target._highlightUid);\n }\n }.bind(this));\n\n // process paths created with pencil tool\n overlay.fabricCanvas().on('path:created', event => {\n if (event.path) {\n let path = event.path;\n const highlightUid = `dm_canvas_highlight_${uuidv4()}`;\n path._highlightUid = highlightUid;\n path.perPixelTargetFind = true;\n this.overlay.fabricCanvas().setActiveObject(path);\n this.props.setSaving({ doneSaving: false });\n addHighlight(\n document_id,\n highlightUid,\n JSON.stringify(path.toJSON(['_highlightUid', '_isMarker'])),\n this.overlay.fabricCanvas().freeDrawingBrush.color,\n 'Pencil highlight',\n savedHighlight => {\n setHighlightThumbnail(savedHighlight.id, imageUrlForThumbnail, path.aCoords, path.toSVG());\n this.props.setSaving({ doneSaving: true });\n this.props.setLastSaved(new Date().toLocaleString('en-US'));\n });\n }\n });\n\n // handle window resize\n window.onresize = function() {\n overlay.resize();\n overlay.resizecanvas();\n };\n }\n\n openTileSources(tileSources) {\n const key = this.getInstanceKey()\n let imageUrlForThumbnail = '';\n let firstTileSource = tileSources[0];\n\n if (firstTileSource && firstTileSource.type === 'image' && firstTileSource.url) {\n imageUrlForThumbnail = firstTileSource.url\n // don't force ssl for localhost\n if( imageUrlForThumbnail.match(/^http:\\/\\/localhost/) ) {\n this.props.setImageUrl(key, imageUrlForThumbnail);\n if (tileSources.length > 1) {\n const newTileSources = [{ type: 'image', url: imageUrlForThumbnail }, ...tileSources.slice(1)]\n this.osdViewer.open(newTileSources);\n } else this.osdViewer.open([{ type: 'image', url: imageUrlForThumbnail }]);\n } else {\n const tileSourceSSL = imageUrlForThumbnail.replace('http:', 'https:')\n this.props.setImageUrl(key, tileSourceSSL);\n if (tileSources.length > 1) {\n const newTileSources = [{ type: 'image', url: tileSourceSSL }, ...tileSources.slice(1)]\n this.osdViewer.open(newTileSources);\n } else this.osdViewer.open([{ type: 'image', url: tileSourceSSL }]);\n }\n } else if (firstTileSource && typeof firstTileSource === 'string') {\n // Tile source is a string, so it's IIIF\n let resourceURL = firstTileSource.replace('http:', 'https:').replace('/info.json', '');\n imageUrlForThumbnail = resourceURL + '/full/!400,400/0/default.png'\n this.props.setImageUrl(key, imageUrlForThumbnail);\n checkTileSource(\n resourceURL,\n (validResourceURL) => { \n if (tileSources.length > 1) {\n const newTileSources = [validResourceURL, ...tileSources.slice(1)]\n this.osdViewer.open(newTileSources);\n } else this.osdViewer.open([validResourceURL]);\n },\n (errorResponse) => { console.log( errorResponse ) }\n )\n }\n this.refreshLayerSelect(tileSources);\n\n return imageUrlForThumbnail;\n }\n\n refreshLayerSelect(tileSources) {\n if (this.layerSelect) {\n const selected = this.layerSelect.selectedIndex;\n while (this.layerSelect.firstChild) {\n this.layerSelect.removeChild(this.layerSelect.lastChild);\n }\n tileSources.forEach((t, index) => {\n const opt = OpenSeadragon.makeNeutralElement('option');\n opt.value = index;\n opt.label = `${index+1}: ${this.getLayerName(index)}`;\n this.layerSelect.appendChild(opt);\n });\n this.layerSelect.selectedIndex = selected;\n }\n }\n\n // if a first target for this window has been specified, pan and zoom to it.\n onOpen() {\n if( this.props.firstTarget && !this.hasOpenedOnce ) {\n let targetHighLight = null;\n for( let key in this.props.highlight_map ) {\n let currentHighlight = this.props.highlight_map[key]\n if( currentHighlight.id === this.props.firstTarget ) {\n targetHighLight = currentHighlight\n break\n }\n }\n if( targetHighLight ) {\n const target = JSON.parse(targetHighLight.target)\n const x = target.left / fabricViewportScale\n const y = target.top / fabricViewportScale\n const w = target.width / fabricViewportScale\n const h = target.height / fabricViewportScale\n // back out a little so we can see highlight in context\n const targetRect = new OpenSeadragon.Rect(x-0.1,y-0.1,w+0.2,h+0.2)\n const viewport = this.osdViewer.viewport;\n viewport.fitBoundsWithConstraints( targetRect );\n this.hasOpenedOnce = true;\n // console.log(`tr: ${targetRect.toString()} tr2: ${targetRect2.toString()}`)\n }\n }\n }\n\n canvasMouseDown(event) {\n\n if( this.currentMode === 'edit' || this.currentMode === 'pan' ) return;\n\n this.isMouseDown = true;\n this.pointerCoords = this.overlay.fabricCanvas().getPointer(event.e);\n\n switch(this.currentMode) {\n case 'marker':\n this.drawMarker(this.pointerCoords);\n break;\n\n case 'rect':\n this.newShape = new fabric.Rect({\n left: this.pointerCoords.x,\n top: this.pointerCoords.y,\n width: 20,\n height: 20,\n fill: 'transparent'\n });\n this.addShape(this.newShape);\n break;\n\n case 'circle':\n this.newShape = new fabric.Circle({\n radius: 15,\n left: this.pointerCoords.x,\n top: this.pointerCoords.y,\n fill: 'transparent',\n originX: 'center', originY: 'center' // when circle is resized, the center remains constant\n });\n this.addShape(this.newShape);\n break;\n\n case 'colorize':\n // select new color\n const newColor = this.props.highlightColors[this.getInstanceKey()]\n // get object, if one is clicked\n const selectedObject = this.overlay.fabricCanvas().getActiveObject();\n\n // make sure the click selected an object\n if(selectedObject) {\n selectedObject.set({ stroke: newColor });\n // this deselects the highlight, which causes the color change to take place\n // without this line, a object that was previously selected prior to use of the tool would not change color until deselected\n this.overlay.fabricCanvas().discardActiveObject();\n\n const highlight_id = this.highlight_map[selectedObject._highlightUid].id;\n this.props.setSaving({ doneSaving: false });\n this.props.updateHighlight(\n highlight_id,\n {color: newColor, target: JSON.stringify(selectedObject.toJSON(['_highlightUid', '_isMarker']))},\n () => {\n this.props.setSaving({ doneSaving: true });\n this.props.setLastSaved(new Date().toLocaleString('en-US'));\n }\n );\n }\n break;\n\n case 'lineDraw':\n if( this.checkDoubleClick() ) {\n this.drawLine(this.pointerCoords, true);\n this.endLineMode();\n } else {\n this.drawLine(this.pointerCoords, true);\n this.prevLineEndPoint = this.pointerCoords;\n }\n break;\n default:\n break;\n }\n }\n\n canvasMouseMove(o) {\n if( this.currentMode === 'edit' || this.currentMode === 'pan' ) return;\n\n if (this.currentMode === 'lineDraw' && this.lineInProgress) {\n this.pointerCoords = this.overlay.fabricCanvas().getPointer(o.e);\n this.drawLine(this.pointerCoords, false);\n }\n\n if( this.newShape && this.isMouseDown ) {\n const mouse = this.overlay.fabricCanvas().getPointer(o.e);\n switch(this.currentMode) {\n case 'rect':\n if(mouse.x < this.pointerCoords.x) {\n this.newShape.set({left: mouse.x });\n }\n if(mouse.y < this.pointerCoords.y) {\n this.newShape.set({top: mouse.y });\n }\n\n this.newShape.set({width: Math.abs(this.pointerCoords.x - mouse.x) });\n this.newShape.set({height: Math.abs(this.pointerCoords.y - mouse.y) });\n\n this.overlay.fabricCanvas().renderAll();\n break;\n case 'circle':\n if( Math.abs(mouse.x - this.pointerCoords.x) > Math.abs(mouse.y - this.pointerCoords.y) ) {\n this.newShape.set({radius: Math.abs( mouse.x - this.pointerCoords.x ) });\n } else {\n this.newShape.set({radius: Math.abs( mouse.y - this.pointerCoords.y ) });\n }\n\n this.overlay.fabricCanvas().renderAll();\n break;\n default:\n break;\n\n }\n }\n }\n\n canvasMouseUp() {\n if( this.currentMode !== 'rect' && this.currentMode !== 'circle') {\n if( this.currentMode !== 'edit' && this.currentMode !== 'colorize' && this.currentMode !== 'pan' && this.currentMode !== 'lineDraw') {\n this.panClick(); // jonah *** change here the current mode to 'pan'\n }\n return;\n }\n\n // needed for new shape to respond to mouse clicks\n this.osdViewer.forceRedraw();\n const label = this.currentMode === 'rect' ? 'Rectangular highlight' : 'Circular highlight';\n this.isMouseDown = false;\n const key = this.getInstanceKey();\n const aCoords = this.newShape.calcCoords(true);\n const svg = this.newShape.toSVG();\n const imageUrlForThumbnail = this.props.imageURLs[key]\n\n this.props.setSaving({ doneSaving: false });\n this.props.addHighlight(\n this.props.document_id,\n this.newShape._highlightUid,\n JSON.stringify(this.newShape.toJSON(['_highlightUid', '_isMarker'])),\n this.props.highlightColors[key],\n label,\n savedHighlight => {\n this.props.setHighlightThumbnail(\n savedHighlight.id,\n imageUrlForThumbnail,\n aCoords,\n svg\n );\n this.props.setSaving({ doneSaving: true });\n this.props.setLastSaved(new Date().toLocaleString('en-US'));\n });\n this.panClick(); // jonah *** change here the current mode to 'pan'\n this.newShape = null;\n }\n\n renderHighlights(overlay, highlight_map) {\n const jsonBlob = {objects: []};\n for (const highlightUid in highlight_map) {\n const highlight = highlight_map[highlightUid];\n const parsedHighlight = JSON.parse(highlight.target);\n if( this.props.firstTarget ) {\n if( highlight.id === this.props.firstTarget ) {\n for (let i = 0; i < 3; i += 1) {\n // Copy the object 3 times to make the glow more visible\n jsonBlob.objects.push({ ...parsedHighlight,\n selectable: false,\n hoverCursor: 'default',\n _isTargetChild: true,\n shadow: new fabric.Shadow({\n color: 'blue',\n blur: 10,\n }),\n });\n }\n parsedHighlight._isTarget = true;\n }\n }\n jsonBlob.objects.push(parsedHighlight);\n }\n const jsonString = JSON.stringify(jsonBlob);\n const zoom = overlay.fabricCanvas().getZoom();\n overlay.fabricCanvas().loadFromJSON(jsonString, () => {\n overlay.fabricCanvas().forEachObject(object => {\n this.lockCanvasObject(object, true);\n if (object._isMarker) {\n object.radius = markerRadius / zoom;\n }\n object.strokeWidth = strokeWidth / zoom;\n object.dirty = true;\n object.perPixelTargetFind = true;\n if (!object._isTargetChild) object.selectable = true;\n\n if (!this.props.writeEnabled) {\n object.hoverCursor = 'default';\n }\n });\n });\n }\n\n // doing it this way because double click events are not reliably\n // processed by osdViewer or fabric js.\n checkDoubleClick() {\n if( this.lastTime ) {\n const currentTime = Date.now();\n const elapsedTime = currentTime - this.lastTime;\n this.lastTime = currentTime;\n return ( elapsedTime < doubleClickTimeout );\n } else {\n this.lastTime = Date.now();\n return false;\n }\n }\n\n drawLine(pointer, activeShape) {\n // draw first segment normally\n // draw a line connecting most recent segment to current mouse position\n // on click add that line to points array\n const key = this.getInstanceKey();\n const lineOptions = {\n fill: 'transparent',\n selectable: false,\n stroke: this.props.highlightColors[key],\n strokeWidth: strokeWidth / this.overlay.fabricCanvas().getZoom()\n };\n\n if( this.lineInProgress ) {\n if (this.lineInProgress.radius) { // drawing first line segment\n // if we have a circle, replace it with a line\n const centerPoint = this.lineInProgress.getCenterPoint();\n const oldCircle = this.lineInProgress;\n this.lineInProgress = new fabric.Polyline(\n [{ x: centerPoint.x, y: centerPoint.y}, { x: pointer.x, y: pointer.y }],\n lineOptions\n );\n this.overlay.fabricCanvas().remove(oldCircle);\n this.overlay.fabricCanvas().add(this.lineInProgress);\n } else if (this.prevLineEndPoint && !activeShape) {\n // if we are just hovering make a line\n const oldHoverLine = this.hoverLine;\n this.hoverLine = new fabric.Polyline(\n [{ x: this.prevLineEndPoint.x, y: this.prevLineEndPoint.y}, { x: pointer.x, y: pointer.y }],\n lineOptions\n );\n this.overlay.fabricCanvas().remove(oldHoverLine);\n this.overlay.fabricCanvas().add(this.hoverLine);\n \n } else {\n // otherwise, add to the line\n const oldPolyline = this.lineInProgress;\n const oldHoverLine = this.hoverLine;\n const points = oldPolyline.points.concat({ x: pointer.x, y: pointer.y });\n this.lineInProgress = new fabric.Polyline( points, lineOptions );\n this.overlay.fabricCanvas().remove(oldHoverLine);\n this.overlay.fabricCanvas().remove(oldPolyline);\n this.overlay.fabricCanvas().add(this.lineInProgress);\n }\n }\n else {\n // start with a circle\n let radius = markerRadius / this.overlay.fabricCanvas().getZoom()\n this.lineInProgress = new fabric.Circle({\n radius,\n left: pointer.x - radius,\n top: pointer.y - radius,\n selectable: false,\n fill: this.props.highlightColors[key],\n stroke: 'transparent',\n _isMarker: true\n });\n this.overlay.fabricCanvas().add(this.lineInProgress);\n }\n }\n\n computeMarkerThumbBounds(markerCoords) {\n return {\n tl: { x: markerCoords.left - markerThumbnailSize, y: markerCoords.top - markerThumbnailSize },\n tr: { x: markerCoords.left + markerThumbnailSize, y: markerCoords.top - markerThumbnailSize },\n bl: { x: markerCoords.left - markerThumbnailSize, y: markerCoords.top + markerThumbnailSize },\n br: { x: markerCoords.left + markerThumbnailSize, y: markerCoords.top + markerThumbnailSize }\n }\n }\n\n drawMarker(pCoords) {\n const imageUrlForThumbnail = this.props.imageURLs[this.getInstanceKey()];\n\n // create marker shape on canvas\n let markerFill = fabric.Color.fromHex(this.props.highlightColors[this.getInstanceKey()]);\n markerFill.setAlpha(0.3);\n var rad = markerRadius / this.overlay.fabricCanvas().getZoom();\n let markerCoords = { left: pCoords.x - rad, top: pCoords.y - rad }\n let marker = new fabric.Circle({\n radius: rad,\n left: markerCoords.left, // offset to put marker at center of click\n top: markerCoords.top,\n fill: markerFill.toRgba(),\n lockScalingX: true,\n lockScalingY: true,\n lockRotation: true,\n lockScalingFlip: true,\n lockSkewingX: true,\n lockSkewingY: true,\n lockUniScaling: true,\n hasControls: false,\n _isMarker: true\n });\n this.addShape(marker);\n const highlightCoords = this.computeMarkerThumbBounds(markerCoords)\n\n this.props.setSaving({ doneSaving: false });\n // save as a highlight\n this.props.addHighlight(\n this.props.document_id,\n marker._highlightUid,\n JSON.stringify(marker.toJSON(['_highlightUid', '_isMarker'])),\n this.props.highlightColors[this.getInstanceKey()],\n 'Marker highlight',\n savedHighlight => {\n this.props.setHighlightThumbnail(\n savedHighlight.id,\n imageUrlForThumbnail,\n highlightCoords,\n marker.toSVG()\n );\n this.props.setSaving({ doneSaving: true });\n this.props.setLastSaved(new Date().toLocaleString('en-US'));\n });\n }\n\n endLineMode() {\n if( !this.lineInProgress ) return;\n const aCoords = this.lineInProgress.aCoords;\n const svg = this.lineInProgress.toSVG();\n const imageUrlForThumbnail = this.props.imageURLs[this.getInstanceKey()];\n\n // now act like other shapes, assign a unique id\n this.lineInProgress.perPixelTargetFind = true;\n this.lineInProgress.selectable = true;\n this.lockCanvasObject(this.lineInProgress, true);\n const highlightUid = `dm_canvas_highlight_${uuidv4()}`;\n this.lineInProgress['_highlightUid'] = highlightUid;\n\n this.props.setSaving({ doneSaving: false });\n this.props.addHighlight(\n this.props.document_id,\n this.lineInProgress._highlightUid,\n JSON.stringify(this.lineInProgress.toJSON(['_highlightUid', '_isMarker'])),\n this.props.highlightColors[this.getInstanceKey()],\n 'Line highlight',\n savedHighlight => {\n this.props.setHighlightThumbnail(\n savedHighlight.id,\n imageUrlForThumbnail,\n aCoords,\n svg\n );\n this.props.setSaving({ doneSaving: true });\n this.props.setLastSaved(new Date().toLocaleString('en-US'));\n });\n this.lineInProgress = null;\n this.overlay.fabricCanvas().defaultCursor = 'default';\n this.osdViewer.forceRedraw();\n this.panClick(); // jonah *** change here the current mode to 'pan'\n }\n\n addShape(fabricObject) {\n const highlightUid = `dm_canvas_highlight_${uuidv4()}`;\n const { highlightColors } = this.props;\n const instanceKey = this.getInstanceKey();\n fabricObject['_highlightUid'] = highlightUid;\n fabricObject.stroke = highlightColors[instanceKey];\n fabricObject.strokeWidth = strokeWidth / this.overlay.fabricCanvas().getZoom();\n fabricObject.perPixelTargetFind = true;\n fabricObject.selectable = true;\n this.lockCanvasObject(fabricObject, true);\n this.overlay.fabricCanvas().add(fabricObject);\n }\n\n lockCanvasObject( object, lock ) {\n if( lock ) {\n object.lockScalingX = true;\n object.lockScalingY = true;\n object.lockRotation = true;\n object.lockScalingFlip = true;\n object.lockSkewingX = true;\n object.lockSkewingY = true;\n object.lockUniScaling = true;\n object.lockMovementX = true;\n object.lockMovementY = true;\n object.hasControls = false;\n } else {\n if( !object._isMarker ) {\n object.lockScalingX = false;\n object.lockScalingY = false;\n object.lockRotation = false;\n object.lockScalingFlip = false;\n object.lockSkewingX = false;\n object.lockSkewingY = false;\n object.lockUniScaling = false;\n object.hasControls = true;\n }\n object.lockMovementX = false;\n object.lockMovementY = false;\n }\n }\n\n lockCanvasObjects( lock ) {\n const canvasObjects = this.overlay.fabricCanvas().getObjects();\n canvasObjects.forEach( object => {\n this.lockCanvasObject( object, lock );\n });\n }\n\n stopDrawing() {\n this.endLineMode();\n // turn off pencil mode\n this.overlay.fabricCanvas().isDrawingMode = false;\n this.props.setIsPencilMode(this.props.document_id, false);\n }\n\n panClick() {\n // deselect highlight to ensure resize handles behave properly\n this.overlay.fabricCanvas().discardActiveObject();\n this.stopDrawing()\n this.lockCanvasObjects(true);\n this.currentMode = 'pan';\n this.osdViewer.setMouseNavEnabled(true);\n }\n\n editShapeClick() {\n this.stopDrawing()\n this.currentMode = 'edit';\n this.lockCanvasObjects(false);\n this.osdViewer.setMouseNavEnabled(false);\n\n // deselect highlight to ensure resize handles behave properly\n this.overlay.fabricCanvas().discardActiveObject();\n }\n\n rectClick() {\n this.stopDrawing()\n this.currentMode = 'rect';\n this.lockCanvasObjects(true);\n this.osdViewer.setMouseNavEnabled(false);\n }\n\n circleClick() {\n this.stopDrawing()\n this.currentMode = 'circle';\n this.lockCanvasObjects(true);\n this.osdViewer.setMouseNavEnabled(false);\n }\n\n markerClick() {\n this.stopDrawing()\n this.currentMode = 'marker';\n this.lockCanvasObjects(true);\n this.osdViewer.setMouseNavEnabled(false);\n }\n\n pencilClick() {\n this.currentMode = 'freeDraw';\n this.osdViewer.setMouseNavEnabled(false);\n this.stopDrawing()\n\n this.lockCanvasObjects(true);\n this.overlay.fabricCanvas().isDrawingMode = true;\n this.props.setIsPencilMode(this.props.document_id, true);\n }\n\n lineClick() {\n this.currentMode = 'lineDraw';\n this.osdViewer.setMouseNavEnabled(false);\n this.stopDrawing()\n this.lockCanvasObjects(true);\n this.overlay.fabricCanvas().defaultCursor = 'crosshair';\n }\n\n colorizeClick() {\n this.stopDrawing()\n this.currentMode = 'colorize';\n this.lockCanvasObjects(true);\n this.osdViewer.setMouseNavEnabled(false);\n }\n\n deleteHighlightClick() {\n const selectedObject = this.overlay.fabricCanvas().getActiveObject();\n let selectedObjects = [];\n if (selectedObject) selectedObjects.push(selectedObject);\n if (selectedObjects.length > 0) {\n this.props.openDeleteDialog(\n 'Removing highlight' + (selectedObjects.length > 1 ? 's' : ''),\n 'Deleting the selection will destroy ' + (selectedObjects.length > 1 ? (selectedObjects.length) + ' highlights and their ' : 'a highlight and its ') + 'links.',\n 'Destroy ' + (selectedObjects.length > 1 ? (selectedObjects.length) + ' highlights' : 'highlight'),\n {\n highlights: selectedObjects.map(object => this.props.highlight_map[object._highlightUid]),\n fabricObjects: selectedObjects,\n canvas: this.overlay.fabricCanvas()\n },\n CANVAS_HIGHLIGHT_DELETE\n );\n }\n\n }\n\n moveLayerClick(direction) {\n this.props.setSaving({ doneSaving: false });\n this.props.moveLayer({\n documentId: this.props.document_id,\n origin: this.state.currentPage,\n direction,\n editorKey: this.getInstanceKey(),\n });\n }\n\n deleteLayerClick() {\n this.props.openDeleteDialog(\n 'Deleting layer',\n `This will delete layer ${this.state.currentPage + 1}, ${this.getLayerName(this.state.currentPage)}, from the stack.`,\n 'Delete layer',\n {\n documentId: this.props.document_id,\n layer: this.state.currentPage,\n editorKey: this.getInstanceKey(),\n },\n CANVAS_LAYER_DELETE\n );\n }\n\n editLayerNameClick() {\n this.props.toggleEditLayerName({\n editorKey: this.getInstanceKey(),\n value: true,\n });\n this.setState({\n layerName: this.getLayerName(this.state.currentPage),\n })\n }\n\n cancelEditLayerName() {\n this.props.toggleEditLayerName({\n editorKey: this.getInstanceKey(),\n value: false,\n });\n }\n\n getLayerName(page) {\n const { content } = this.props;\n const currentLayer = content.tileSources[page];\n let currentLayerName = 'Untitled image layer';\n if (typeof currentLayer === 'string') {\n // Tile source is a string, so it's IIIF\n if (content.iiifTileNames && content.iiifTileNames.find(tile => tile.url === currentLayer)) {\n currentLayerName = content.iiifTileNames.find(tile => tile.url === currentLayer).name;\n } else {\n currentLayerName = 'IIIF layer';\n }\n } else if (currentLayer && currentLayer.name) {\n currentLayerName = currentLayer.name;\n } else if (currentLayer && currentLayer.url) {\n const url = currentLayer.url;\n currentLayerName = decodeURIComponent(url.substring(url.lastIndexOf('/')+1, url.lastIndexOf('.')));\n }\n return currentLayerName;\n }\n\n onChangeLayerName(event, newValue) {\n this.setState({\n layerName: newValue,\n })\n }\n\n submitLayerName(e) {\n e.preventDefault();\n const target = e.currentTarget[`layer${this.state.currentPage}-name`];\n let layerNamePayload = {};\n if (target && target.value) {\n layerNamePayload = {\n documentId: this.props.document_id,\n layer: this.state.currentPage,\n name: target.value,\n editorKey: this.getInstanceKey(),\n };\n this.props.renameLayer(layerNamePayload);\n this.props.setSaving({ doneSaving: false });\n }\n }\n\n zoomControlChange(event, value) {\n if (this.osdViewer && this.osdViewer.viewport) {\n const zoomLevel = value;\n this.setState({ zoomLevel });\n this.osdViewer.viewport.zoomTo(zoomLevel);\n }\n }\n\n getInstanceKey() {\n const { document_id, timeOpened } = this.props;\n return `${document_id}-${timeOpened}`;\n }\n\n hasLayers() {\n const { content } = this.props;\n return (\n content \n && content.tileSources \n && Array.isArray(content.tileSources) \n && content.tileSources.length > 1\n );\n }\n\n render() {\n const {\n loading,\n document_id,\n content,\n image_thumbnail_urls,\n addTileSourceMode,\n setAddTileSourceMode,\n image_urls,\n highlightsHidden,\n displayColorPickers,\n highlightColors,\n toggleCanvasColorPicker,\n setCanvasHighlightColor,\n writeEnabled,\n lockedByMe,\n globalCanvasDisplay,\n setLastSaved,\n setSaving,\n projectId,\n } = this.props;\n const key = this.getInstanceKey();\n\n this.highlight_map = this.props.highlight_map;\n\n const iconBackdropStyle = {\n width: '20px',\n height: '20px',\n marginBottom: '10px',\n marginLeft: '5px',\n background: 'white',\n padding: '1px',\n borderRadius: '1px'\n };\n const iconBackdropStyleActive = Object.assign({}, iconBackdropStyle);\n iconBackdropStyleActive.background = cyan100;\n const iconBackdropStyleSpaced = Object.assign({}, iconBackdropStyle);\n iconBackdropStyleSpaced.marginLeft = '12px';\n\n const floatingIconBackdropStyle = {\n width: '16px',\n height: '16px',\n paddingTop: '2px',\n paddingLeft: '5px',\n };\n\n const iconStyle = {\n width: '18px',\n height: '18px'\n };\n\n const smallIconStyle = {\n width: '16px',\n height: '16px',\n };\n\n const tooltipStyle = {\n pointerEvents: 'none',\n }\n\n let editable = ( writeEnabled && lockedByMe );\n const mode = addTileSourceMode[document_id];\n const highlightHidden = !editable && highlightsHidden[key]\n const hasLayers = this.hasLayers();\n\n if( !editable && this.currentMode !== 'pan' ) {\n this.panClick();\n }\n // don't render highlights if they are hidden\n if( !lockedByMe && this.overlay ) {\n const canvas = this.overlay.fabricCanvas()\n if( highlightHidden && !canvas.isEmpty() ) {\n canvas.clear();\n } else {\n if( !highlightHidden && canvas.isEmpty() ) {\n this.renderHighlights(this.overlay,this.highlight_map)\n }\n }\n }\n \n const currentLayerName = this.getLayerName(this.state.currentPage);\n const editingLayerName = this.props.editingLayerName[key];\n\n return (\n
\n
\n {editable &&\n
\n {\n setCanvasHighlightColor(key, color);\n if (this.overlay) {\n this.overlay.fabricCanvas().freeDrawingBrush.color = color;\n }\n }}\n toggleColorPicker={() => {toggleCanvasColorPicker(key);}}\n />\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n setAddTileSourceMode(document_id, UPLOAD_SOURCE_TYPE)}\n style={iconBackdropStyleSpaced}\n iconStyle={iconStyle}\n tooltipStyles={tooltipStyle}\n disabled={loading}\n >\n \n \n this.moveLayerClick(-1)}\n style={iconBackdropStyle}\n tooltipStyles={tooltipStyle}\n >\n \n \n this.moveLayerClick(1)}\n style={iconBackdropStyle}\n tooltipStyles={tooltipStyle}\n >\n \n \n \n \n \n {hasLayers && (\n
\n \n \n {this.state.currentPage+1}\n \n \n {`: ${!editingLayerName ? currentLayerName : ''}`}\n \n
\n {editingLayerName && (\n \n )}\n {!editingLayerName && (\n \n \n \n )}\n {editingLayerName && (\n <>\n \n \n \n \n \n \n \n )}\n \n )}\n\n
\n }\n
\n \n
\n
\n
\n \n \n );\n }\n}\n\nconst mapStateToProps = state => ({\n highlightColors: state.canvasEditor.highlightColors,\n highlightsHidden: state.canvasEditor.highlightsHidden,\n displayColorPickers: state.canvasEditor.displayColorPickers,\n addTileSourceMode: state.canvasEditor.addTileSourceMode,\n imageURLs: state.canvasEditor.imageURLs,\n isPencilMode: state.canvasEditor.isPencilMode,\n globalCanvasDisplay: state.canvasEditor.globalCanvasDisplay,\n pageToChange: state.canvasEditor.pageToChange,\n loading: state.documentGrid.loading,\n editingLayerName: state.canvasEditor.editingLayerName,\n});\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n addHighlight,\n updateHighlight,\n setAddTileSourceMode,\n setImageUrl,\n setHighlightThumbnail,\n setCanvasHighlightColor,\n toggleCanvasColorPicker,\n setIsPencilMode,\n openDeleteDialog,\n moveLayer,\n renameLayer,\n toggleEditLayerName,\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(CanvasResource);\n","import React, { Component } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { updateDocument, openDeleteDialog, DOCUMENT_DELETE } from './modules/documentGrid';\nimport IconButton from 'material-ui/IconButton';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport DeleteForever from 'material-ui/svg-icons/action/delete-forever';\nimport Popover from 'material-ui/Popover';\nimport CircularProgress from 'material-ui/CircularProgress';\n\nclass DocumentStatusBar extends Component {\n\n constructor(props) {\n super(props);\n this.state = {\n tooltipOpen: {},\n tooltipAnchor: {},\n }\n }\n\n renderLastSaved() {\n let style = {\n color: this.props.document_kind === 'canvas' ? 'lightgray' : 'gray',\n marginLeft: '6px',\n };\n const saving = !this.props.doneSaving && !this.props.loading;\n const show = !saving && this.props.lastSaved !== '' && this.props.locked && this.props.lockedByMe;\n return (\n {show ? `Saved: ${this.props.lastSaved}` : ''}\n );\n }\n\n getStatusMessage() {\n let statusMessage = '';\n if (this.props.locked) {\n if (this.props.lockedByMe) {\n statusMessage = \"Check document in for team to edit.\"\n } else {\n statusMessage = `This document is checked out by ${this.props.lockedByUserName}.`;\n }\n } else {\n statusMessage = \"Check document out to edit it.\";\n }\n\n return statusMessage;\n }\n\n onTooltipOpen(anchor, e) {\n e.persist();\n const anchorEl = e.currentTarget;\n e.preventDefault();\n this.setState((prevState) => {\n return {\n ...prevState,\n tooltipOpen: { ...prevState.tooltipOpen, [anchor]: true },\n tooltipAnchor: { ...prevState.tooltipAnchor, [anchor]: anchorEl },\n }\n });\n }\n\n onTooltipClose(anchor) {\n this.setState((prevState) => {\n return {\n ...prevState,\n tooltipOpen: { ...prevState.tooltipOpen, [anchor]: false },\n }\n });\n }\n\n renderTooltip({ name, text }) {\n return (\n \n {text}\n \n );\n }\n\n\n renderCheckInOutButtons() {\n let label;\n if (this.props.locked) {\n if (this.props.lockedByMe) {\n label = 'check in';\n } else {\n label = 'checked out';\n }\n } else {\n label = 'check out';\n }\n\n return (\n {\n this.props.updateDocument(this.props.document_id, { locked: !this.props.locked }, {\n adjustLock: true,\n instanceKey: this.props.instanceKey,\n })\n }}\n onMouseOver={this.onTooltipOpen.bind(this, 'checkInOut')}\n onMouseOut={this.onTooltipClose.bind(this, 'checkInOut')}\n disabled={this.props.loading || (this.props.locked && !this.props.lockedByMe)}\n />\n );\n }\n\n renderSaveIcon() {\n if (!this.props.locked || (this.props.locked && !this.props.lockedByMe)) return null;\n const saving = !this.props.doneSaving && !this.props.loading;\n const style = {\n verticalAlign: 'middle',\n width: '24px',\n maxWidth: '24px',\n minWidth: '24px',\n height: '24px',\n maxHeight: '24px',\n minHeight: '24px',\n marginLeft: '6px',\n color: 'gray'\n };\n return (\n <>\n {saving && (\n \n )}\n \n )\n }\n\n renderDeleteButton() {\n // don't allow deletion if locked by someone else\n if (this.props.locked && !this.props.lockedByMe) return null;\n\n return (\n {\n this.props.openDeleteDialog(\n 'Destroying \"' + this.props.resourceName + '\"',\n (

\n Deleting this document will destroy all its associated highlights\n and links, and any child annotations original to the document,\n in addition to the content of the document itself.\n

),\n 'Destroy document',\n { documentId: this.props.document_id },\n DOCUMENT_DELETE\n );\n }}\n >\n \n
\n );\n }\n\n render() {\n if (!this.props.writeEnabled) return null;\n\n const style = {\n backgroundColor: this.props.document_kind === 'canvas' ? '#424242' : '#ccc',\n paddingLeft: '7px',\n zIndex: 2,\n }\n\n return (\n
\n {this.renderCheckInOutButtons()}\n {this.renderSaveIcon()}\n {this.renderLastSaved()}\n {this.renderDeleteButton()}\n {this.renderTooltip({ name: 'checkInOut', text: this.getStatusMessage() })}\n
\n );\n }\n}\n\nconst mapStateToProps = state => ({\n});\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n updateDocument,\n openDeleteDialog\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(DocumentStatusBar);\n","import React, { Component } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport {\n\tDragSource,\n\tDropTarget\n} from 'react-dnd';\nimport Paper from 'material-ui/Paper';\nimport TextField from 'material-ui/TextField';\nimport IconButton from 'material-ui/IconButton';\nimport Close from 'material-ui/svg-icons/navigation/close';\nimport Visibility from 'material-ui/svg-icons/action/visibility';\nimport VisibilityOff from 'material-ui/svg-icons/action/visibility-off';\nimport Description from 'material-ui/svg-icons/action/description';\nimport { grey100, grey200, grey300, grey800, grey900, white } from 'material-ui/styles/colors';\nimport { updateDocument, closeDocument, moveDocumentWindow, layoutOptions } from './modules/documentGrid';\nimport { toggleCanvasHighlights } from './modules/canvasEditor';\nimport { toggleTextHighlights } from './modules/textEditor';\nimport { closeDocumentTargets } from './modules/annotationViewer';\nimport TextResource from './TextResource';\nimport CanvasResource from './CanvasResource';\nimport DocumentStatusBar from './DocumentStatusBar';\nimport { Popover, RaisedButton } from 'material-ui';\nimport { BoxArrowUp, Check2 } from 'react-bootstrap-icons';\n\nconst DocumentInner = function(props) {\n switch (props.document_kind) {\n case 'text':\n return ;\n case 'canvas':\n return ;\n default:\n return
Error: no type defined for this resource.
;\n }\n}\n\nconst documentSource = {\n beginDrag(props) {\n return {\n id: props.id,\n index: props.index\n };\n }\n}\n\nconst documentTarget = {\n hover(props, monitor, component) {\n if (!component) {\n return null;\n }\n\n const dragIndex = monitor.getItem().index;\n const hoverIndex = props.index;\n\n if (dragIndex === hoverIndex) {\n return null;\n }\n\n props.moveDocumentWindow(dragIndex, hoverIndex);\n monitor.getItem().index = hoverIndex;\n }\n}\n\nfunction collectDrag(connect, monitor) {\n return {\n connectDragSource: connect.dragSource(),\n connectDragPreview: connect.dragPreview(),\n isDragging: monitor.isDragging()\n };\n}\n\nfunction collectDrop(connect, monitor) {\n return {\n connectDropTarget: connect.dropTarget(),\n isOver: monitor.isOver()\n };\n}\n\nclass DocumentViewer extends Component {\n constructor(props) {\n super(props);\n\n this.titleChangeTimeout = null;\n this.titleChangeDelayMs = 800;\n\n this.elementRef = React.createRef();\n\n this.state = {\n resourceName: this.props.resourceName,\n lastSaved: '',\n doneSaving: true,\n cornerIconTooltipOpen: false,\n cornerIconTooltipAnchor: null,\n sharePanelOpen: false,\n sharePanelAnchor: null,\n documentURL: '',\n hasCopiedURL: false,\n }\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.resourceName !== prevProps.resourceName) {\n this.setState({\n resourceName: this.props.resourceName,\n });\n }\n }\n\n async componentDidMount() {\n this.props.connectDragPreview(new Image());\n await this.getDocumentURL(this.props.document_id.toString());\n }\n\n isEditable = () => {\n const { writeEnabled, lockedByMe } = this.props;\n return ( writeEnabled && lockedByMe );\n }\n\n setLastSaved(lastSaved) {\n this.setState({ lastSaved });\n }\n\n onChangeTitle = (event, newValue) => {\n this.setSaving({ doneSaving: false })\n this.setState({\n resourceName: newValue,\n })\n window.clearTimeout(this.titleChangeTimeout);\n this.titleChangeTimeout = window.setTimeout(() => {\n this.props.updateDocument(this.props.document_id, {title: newValue}, {\n refreshLists: true,\n refreshDocumentContent: true,\n timeOpened: this.props.timeOpened,\n });\n this.setLastSaved(new Date().toLocaleString('en-US'));\n this.setSaving({ doneSaving: true })\n }, this.titleChangeDelayMs);\n }\n\n onToggleHighlights() {\n const key = this.getInstanceKey();\n const currentState = this.props.highlightsHidden[key] === true ? true : false\n this.props.toggleHighlights( key, !currentState )\n }\n\n getInstanceKey() {\n const { document_id, timeOpened } = this.props;\n return `${document_id}-${timeOpened}`;\n }\n\n onCloseDocument() {\n this.props.closeDocument(this.props.document_id, this.props.timeOpened)\n this.props.closeDocumentTargets(this.props.document_id)\n }\n\n setSaving({ doneSaving }) {\n this.setState({ doneSaving });\n }\n\n\n onTooltipOpen (e) {\n e.persist();\n const cornerIconTooltipAnchor = e.currentTarget;\n e.preventDefault();\n this.setState((prevState) => {\n return {\n ...prevState,\n cornerIconTooltipOpen: true,\n cornerIconTooltipAnchor,\n }\n });\n }\n\n onTooltipClose () {\n this.setState((prevState) => {\n return {\n ...prevState,\n cornerIconTooltipOpen: false,\n }\n });\n }\n\n onShareOpen (e) {\n e.persist();\n const sharePanelAnchor = e.currentTarget;\n e.preventDefault();\n this.setState((prevState) => {\n return {\n ...prevState,\n sharePanelOpen: true,\n sharePanelAnchor,\n }\n });\n }\n\n onShareClose () {\n this.setState((prevState) => {\n return {\n ...prevState,\n sharePanelOpen: false,\n hasCopiedURL: false,\n }\n });\n }\n\n async getDocumentURL(docId) {\n let loc;\n // eslint-disable-next-line no-restricted-globals\n const isInIframe = (parent !== window);\n let clipboardWrite = {};\n try {\n clipboardWrite = await navigator.permissions.query({ name: 'clipboard-write' });\n } catch (e) {\n // in firefox + iframe we will assume clipboard has been granted\n clipboardWrite = { state: \"granted\" };\n }\n if (isInIframe && clipboardWrite.state === \"granted\") {\n // if in iframe, use parent URL to build document URL\n // (check that clipboard write permission is granted to ensure iframe parent URL\n // only used here when intentionally enabled)\n loc = document.referrer;\n } else {\n // eslint-disable-next-line no-restricted-globals\n loc = window.location.href.replace(location.search, \"\");\n }\n this.setState((prevState) => ({\n ...prevState,\n documentURL: `${loc}?document=${docId}`\n }));\n }\n\n copyDocumentURL(e) {\n if (e.currentTarget.nodeName === \"INPUT\") {\n e.currentTarget.select();\n } else {\n e.currentTarget.parentNode.parentNode.querySelector(\"#document-link\").select();\n }\n navigator.clipboard.writeText(this.state.documentURL);\n this.setState((prevState) => ({\n ...prevState,\n hasCopiedURL: true,\n }));\n }\n\n renderTitleBar() {\n const iconStyle = {\n padding: '0',\n width: '20px',\n height: '20px'\n };\n const buttonStyle = Object.assign({ margin: '2px' }, iconStyle);\n const highlightsHidden = this.props.highlightsHidden[this.getInstanceKey()];\n\n return (\n this.props.connectDragSource(\n
\n
\n \n \n \n \n Show link inspector\n \n \n \n \n \n \n
\n \n : null}\n label={this.state.hasCopiedURL ? \"Copied\" : \"Copy link\"}\n style={{marginRight: '10px'}}\n onClick={this.copyDocumentURL.bind(this)}\n backgroundColor={this.state.hasCopiedURL ? grey300 : white}\n />\n
\n \n { !this.isEditable() &&\n \n { highlightsHidden \n ? \n : \n }\n \n }\n \n \n \n
\n
\n )\n );\n }\n\n renderStatusBar() {\n const {\n document_kind,\n document_id,\n loading,\n locked,\n lockedByMe,\n lockedByUserName,\n resourceName,\n writeEnabled\n } = this.props;\n\n return (\n \n );\n }\n\n render() {\n const { currentLayout, isDragging, document_kind, connectDropTarget, numRows, sidebarWidth } = this.props;\n const documentGridOffsetWidth = window.innerWidth - sidebarWidth - 16;\n const windowHeight = window.innerHeight;\n const width = (documentGridOffsetWidth / currentLayout.cols) - 100\n const rows = currentLayout.rows < numRows ? currentLayout.rows : numRows;\n const height = ((windowHeight - 72.0) / rows) - 16;\n const highlightsHidden = this.props.highlightsHidden[this.getInstanceKey()];\n\n return (\n \n {connectDropTarget(\n
\n { this.renderTitleBar() }\n \n { this.renderStatusBar() }\n
\n )}\n \n );\n }\n}\nDocumentViewer = DragSource(\n 'documentViewer',\n documentSource,\n collectDrag\n)(DropTarget(\n 'documentViewer',\n documentTarget,\n collectDrop\n)(DocumentViewer));\n\nconst mapStateToProps = (state, ownProps) => ({\n openDocuments: state.documentGrid.openDocuments,\n loading: state.documentGrid.loading,\n currentLayout: layoutOptions[state.documentGrid.currentLayout],\n sidebarWidth: state.project.sidebarWidth,\n highlightsHidden: ownProps.document_kind === 'canvas' ? state.canvasEditor.highlightsHidden : state.textEditor.highlightsHidden,\n});\n\nconst mapDispatchToProps = (dispatch, props) => bindActionCreators({\n updateDocument,\n closeDocument,\n moveDocumentWindow,\n closeDocumentTargets,\n toggleHighlights: props.document_kind === 'canvas' ? toggleCanvasHighlights : toggleTextHighlights,\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(withRouter((props) => ));\n\n","import React, { Component } from 'react';\nimport { DragSource } from 'react-dnd';\nimport Link from 'material-ui/svg-icons/content/link';\nimport { IconButton } from 'material-ui';\n\nconst summarySource = {\n beginDrag(props) {\n const { id, highlight_id, document_id, parent_id, parent_type, descendant_folder_ids } = props.item;\n\n return {\n id,\n linkable_id: highlight_id || document_id,\n linkable_type: highlight_id ? 'Highlight' : 'Document',\n isFolder: props.isFolder,\n descendant_folder_ids: props.isFolder ? descendant_folder_ids : null,\n existingParentId: parent_id,\n existingParentType: parent_type\n };\n }\n};\n\nfunction collect(connect, monitor) {\n return {\n connectDragSource: connect.dragSource(),\n connectDragPreview: connect.dragPreview(),\n isDragging: monitor.isDragging()\n };\n}\n\nclass DraggableLinkIcon extends Component { \n\n componentDidMount() {\n // use a static image for dragg preview\n const { connectDragPreview } = this.props;\n let linkDragIcon = new Image();\n linkDragIcon.src = '/dragging-link.png';\n connectDragPreview(linkDragIcon);\n }\n\n render() {\n return this.props.connectDragSource( \n
\n \n
\n );\n }\n\n\n oldrender() {\n return this.props.connectDragSource( \n
\n Drag this icon to make a link.}\n >\n \n \n
\n );\n }\n}\n\nexport default DragSource(\n props => props.inContents ? 'contentsSummary' : 'linkableSummary',\n summarySource,\n collect\n)(DraggableLinkIcon);\n\n","import React, {Component} from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport { DropTarget } from 'react-dnd';\nimport Subheader from 'material-ui/Subheader';\nimport { grey400 } from 'material-ui/styles/colors';\nimport { addLink, deleteLink, selectSidebarTarget } from './modules/annotationViewer';\nimport NoteAdd from 'material-ui/svg-icons/action/note-add';\nimport LinkableList from './LinkableList';\nimport { createTextDocumentWithLink } from './modules/documentGrid';\nimport { openDocumentPopover, closeDocumentPopover } from './modules/project';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport 'react-resizable/css/styles.css';\nimport DraggableLinkIcon from './DraggableLinkIcon';\n\nconst LinkList = function(props) {\n if (props.items && props.items.length > 0) {\n return (\n \n );\n }\n return null;\n}\n\nconst linkTarget = {\n canDrop(props, monitor) {\n return true;\n },\n\n drop(props, monitor) {\n const origin = {\n linkable_id: props.highlight_id || props.document_id,\n linkable_type: props.highlight_id ? 'Highlight' : 'Document'\n }\n const target = monitor.getItem();\n\n // first, make sure origin !== target\n if( origin.linkable_type === target.linkable_type &&\n origin.linkable_id === target.linkable_id ) {\n // TODO indicate invalid\n return;\n }\n // then, make sure linked isn't already in our set of links\n const existingLinkFound = props.items.find( (link) => {\n if( target.linkable_type === 'Highlight') {\n // are these same highlight?\n return ( target.linkable_id === link.highlight_id )\n } else {\n // are these same doc?\n return ( !link.highlight_id && target.linkable_id === link.document_id ) \n }\n });\n\n if( existingLinkFound ) {\n // TODO indicate invalid\n return\n }\n\n // this is a fresh link, create it...\n props.addLink(origin, target, null, origin.linkable_type);\n }\n};\n\nfunction collect(connect, monitor) {\n return {\n connectDropTarget: connect.dropTarget(),\n isOver: monitor.isOver()\n };\n}\n\nclass LinkDropTarget extends Component {\n render() {\n return (\n
\n
\n \n
\n {(this.props.connectDropTarget(\n
\n {!this.props.isOver &&\n Drop link here.\n }\n
\n ))}\n
\n );\n }\n}\nLinkDropTarget = DropTarget(\n ['contentsSummary', 'linkableSummary'],\n linkTarget,\n collect\n)(LinkDropTarget);\n\nconst LinkArea = props => {\n if (props.writeEnabled) {\n return ;\n }\n return ;\n}\n\nclass LinkInspector extends Component {\n\n getItemList() {\n const links = this.props.target.links_to;\n if( links && links.length > 0 ) {\n return links.map( (link) => {\n const linkID = link.document_id + (link.highlight_id ? '-' + link.highlight_id : '');\n return { \n ...link, \n id: linkID, \n linkItem: true, \n removeLinkCallback: (linkItem) => {\n this.props.deleteLink(linkItem.link_id);\n } \n };\n })\n } else {\n return [];\n }\n }\n \n render() {\n const { target } = this.props;\n if (target === null) return null;\n\n const items = this.getItemList();\n const buttonId = `addNewDocumentButton-${this.props.idString}`;\n return (\n
\n \n {this.props.writeEnabled && \n
\n }\n style={{margin: 5}}\n onClick={() => {\n this.props.createTextDocumentWithLink({\n linkable_id: target.highlight_id || target.document_id,\n linkable_type: target.highlight_id ? 'Highlight' : 'Document'\n }, this.props.target.document_id, 'Document');\n this.props.closeDocumentPopover();\n }}\n id={buttonId}\n />\n
\n \n
\n
\n }\n
\n );\n }\n}\n\nconst mapStateToProps = state => ({\n documentPopoverOpenFor: state.project.documentPopoverOpenFor\n})\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n addLink,\n deleteLink,\n openDocumentPopover,\n closeDocumentPopover,\n createTextDocumentWithLink,\n selectSidebarTarget\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(LinkInspector);\n","import React, {Component} from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport Draggable from 'react-draggable';\n\nimport Paper from 'material-ui/Paper';\nimport IconButton from 'material-ui/IconButton';\nimport Subheader from 'material-ui/Subheader';\nimport TextField from 'material-ui/TextField';\n\nimport Close from 'material-ui/svg-icons/navigation/close';\nimport Done from 'material-ui/svg-icons/action/done';\nimport ModeComment from 'material-ui/svg-icons/editor/mode-comment';\nimport { yellow100, orange100, red100, purple100, blue100, cyan100, green100, lightGreen100 } from 'material-ui/styles/colors';\nimport { yellow500, orange300, redA100, purpleA100, cyanA100, blueA100, lightGreenA700, lightGreenA200, grey400 } from 'material-ui/styles/colors';\n\nimport LinkInspector from './LinkInspector';\nimport { updateHighlight } from './modules/documentGrid';\n\nconst timeUpdateDelay = 1000\n\nclass LinkInspectorPopup extends Component {\n\n constructor(props) {\n super(props)\n this.state = {\n titleBuffer: props.target.title ? props.target.title : props.target.excerpt,\n titleUpdateTimer: null,\n titleHasFocus: false \n }\n }\n\n componentWillMount() {\n Paper.defaultProps.transitionEnabled = false;\n }\n\n getTitleColor(color) {\n if( color === yellow500) return yellow100\n if( color === orange300) return orange100\n if( color === redA100) return red100\n if( color === purpleA100) return purple100\n if( color === cyanA100) return cyan100\n if( color === blueA100) return blue100\n if( color === lightGreenA700) return green100\n if( color === lightGreenA200) return lightGreen100\n return grey400;\n }\n\n onChangeTitle = (e,newTitle) => {\n let {titleUpdateTimer} = this.state; \n\n if (titleUpdateTimer) {\n window.clearTimeout(titleUpdateTimer);\n }\n titleUpdateTimer = window.setTimeout(function() {\n this.props.updateHighlight(this.props.target.id, {title: newTitle}); \n }.bind(this), timeUpdateDelay);\n\n this.setState( {...this.state, titleBuffer: newTitle, titleUpdateTimer })\n }\n\n onTitleFocus(e) {\n this.setState( {...this.state, titleHasFocus: true })\n }\n\n onTitleBlur() {\n this.setState( {...this.state, titleHasFocus: false })\n }\n\n renderTitle(titleBarColor, canEditTitle) {\n const titleBarID = `highlight-title-${this.props.target.uid}`\n\n if( this.props.target.highlight_id ) {\n if( canEditTitle && this.state.titleHasFocus && !this.props.rollover ) {\n return (\n \n \n \n \n \n \n ) \n } else {\n return(\n {}}>\n {this.state.titleBuffer}\n \n ) \n }\n } else {\n return (\n \n {this.props.target.title}\n \n )\n }\n }\n\n getInnerID() {\n return `${this.props.id}-inner`\n }\n\n render() {\n const { target, writeEnabled, adminEnabled, rollover } = this.props;\n \n const titleBarColor = this.getTitleColor(target.color);\n \n const linkIconStyle = {\n paddingLeft: 5,\n paddingRight: 10,\n marginBottom: '-5px',\n width: '20px',\n height: '20px'\n };\n\n const linkInspectorVisible = (writeEnabled && !rollover) || (this.props.target.links_to && this.props.target.links_to.length > 0) \n const linkInspectorProps = { ...this.props, writeEnabled: writeEnabled && !rollover, adminEnabled }\n\n const canEditTitle = this.props.writeEnabled && (this.props.target.document_id \n ? this.props.openDocuments.some(\n openDoc => openDoc.id === this.props.target.document_id && openDoc.locked === true\n )\n : true);\n const startPos = target.startPosition;\n let open = true;\n if (!startPos) {\n open = false;\n }\n return open && (\n \n \n
\n \n \n { this.renderTitle(titleBarColor, canEditTitle) } \n \n \n { !this.props.rollover && }\n \n
\n { linkInspectorVisible && \n
\n \n
\n }\n
\n
\n )\n }\n\n}\n\nconst mapStateToProps = state => ({\n});\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n updateHighlight\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(LinkInspectorPopup);","import React, { Component } from 'react';\nimport LinkInspectorPopup from './LinkInspectorPopup';\n\nconst generatePopupKey = target => `${target.document_id}${(target.highlight_id ? '-' + target.highlight_id : '')}-${target.opened}`;\n\nexport default class LinkInspectorPopupLayer extends Component {\n render() {\n return (\n
\n
\n {this.props.targets.map((target, index) => (\n {this.props.closeHandler(target.document_id, target.highlight_id);}}\n onDragHandleMouseDown={() => {this.props.mouseDownHandler(target.document_id, target.highlight_id);}}\n openDocumentIds={this.props.openDocumentIds}\n openDocuments={this.props.openDocuments}\n writeEnabled={this.props.writeEnabled}\n adminEnabled={this.props.adminEnabled}\n rollover={target.rollover}\n />\n ))}\n
\n
\n );\n }\n}\n","import React, {Component} from 'react';\nimport { ResizableBox } from 'react-resizable';\nimport Draggable from 'react-draggable';\nimport Paper from 'material-ui/Paper';\nimport IconButton from 'material-ui/IconButton';\nimport Close from 'material-ui/svg-icons/navigation/close';\nimport Subheader from 'material-ui/Subheader';\nimport Search from 'material-ui/svg-icons/action/search';\nimport Divider from 'material-ui/Divider';\nimport LinkableList from './LinkableList';\n\nconst dialogStartPosition = { x: 300, y: 100, z: 1100 };\n\nexport default class SearchResultsPopup extends Component {\n componentWillMount() {\n Paper.defaultProps.transitionEnabled = false;\n }\n\n render() {\n\n const searchIconStyle = {\n paddingLeft: 5,\n paddingRight: 10,\n marginBottom: '-5px',\n width: '20px',\n height: '20px'\n };\n\n return (\n \n \n \n
\n
\n \n \n Search for: {this.props.searchPhrase}\n \n \n \n \n
\n \n
\n { this.props.searchResults.length > 0 ? \n \n :\n
\n No documents found.\n
\n } \n
\n
\n
\n
\n
\n );\n }\n}\n","import React, { Component } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport SearchResultsPopup from './SearchResultsPopup';\nimport { closeSearchPopup } from './modules/search';\n\nclass SearchResultsPopupLayer extends Component {\n\n onClose = () => {\n if( !this.props.search.loading ) {\n this.props.closeSearchPopup();\n }\n }\n\n render() {\n const search = this.props.search;\n return (\n
\n
\n { search.popupOpen &&\n \n }\n
\n
\n );\n }\n}\n\nconst mapStateToProps = state => ({\n search: state.search\n});\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n closeSearchPopup\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(SearchResultsPopupLayer);\n","import React, { Component } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport Checkbox from 'material-ui/Checkbox';\nimport Dialog from 'material-ui/Dialog';\nimport DropDownMenu from 'material-ui/DropDownMenu';\nimport FlatButton from 'material-ui/FlatButton';\nimport LinearProgress from 'material-ui/LinearProgress';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport { RadioButton, RadioButtonGroup } from 'material-ui/RadioButton';\nimport TextField from 'material-ui/TextField';\nimport CloudUpload from 'material-ui/svg-icons/file/cloud-upload';\nimport {\n hideBatchImagePrompt,\n hideCloseDialog,\n killUploading,\n showCloseDialog,\n startUploading,\n} from './modules/project';\nimport { createBatchImages } from './modules/documentGrid';\nimport { DirectUploadProvider } from '@docflow/react-activestorage-provider';\nimport { red400, red900, green400, lightBlue400, yellow400 } from 'material-ui/styles/colors';\nimport MenuItem from 'material-ui/MenuItem/MenuItem';\n\nconst TableRow = ({ upload, mode }) => {\n let name = '';\n let id = '';\n if (mode === 'fromProps') {\n name = upload.filename || upload.signedId;\n id = upload.signedId;\n } else {\n name = upload.file.name;\n id = upload.id;\n }\n const progressTrStyle = {\n marginTop: '20px',\n };\n const nameTdStyle = {\n width: '400px',\n maxWidth: '400px',\n minWidth: '400px',\n overflowWrap: 'break-word',\n paddingRight: '10px',\n fontWeight: 'bold',\n };\n const progressTdStyle = {\n width: '320px',\n maxWidth: '320px',\n minWidth: '320px',\n paddingRight: '10px',\n };\n const statusTdStyle = {\n width: '200px',\n maxWidth: '200px',\n minWidth: '200px',\n textAlign: 'right',\n }\n switch (upload.state) {\n case 'waiting':\n case 'uploading':\n return (\n \n \n {name}\n \n \n \n {mode === 'fromProps' ? 'Processing' : 'Uploading'}\n \n \n );\n case 'doc-created':\n return (\n \n \n {name}\n \n \n \n Processing\n \n \n );\n case 'error':\n return (\n \n \n {name}\n \n \n \n {upload.error.toString()}\n \n \n );\n case 'finished':\n return (\n \n \n {name}\n \n \n \n {mode === 'fromProps' ? 'Complete' : 'Processing'}\n \n \n );\n case 'timeout':\n return (\n \n \n {name}\n \n \n \n \n \n {upload.error.toString()}\n \n \n );\n default:\n return (\n \n {name}\n \n \n Unknown\n \n \n );\n }\n}\n\nconst CloseDialog = ({ closeAction, cancelAction, open }) => {\n return (\n ,\n ,\n ]}\n >\n Are you sure you want to close this dialog? It may interrupt uploads in progress.\n \n );\n}\n\nclass BatchImagePrompt extends Component {\n constructor(props) {\n super(props);\n this.defaultState = {\n invalidFiles: null,\n inFolder: false,\n existingFolder: false,\n newFolderName: '',\n folderId: '',\n menuItemsToRender: [],\n };\n this.state = {\n ...this.defaultState,\n };\n }\n\n pushSelfAndDescendants({ parent, folderData, level }) {\n if(!this.state.menuItemsToRender.some(item => item.key === parent.id)) {\n const newItem = {\n key: parent.id,\n value: parent.id,\n primaryText: `${level > 0 ? `└${'─'.repeat(level-1)}` : ''} ${parent.title}`,\n };\n this.setState((prevState) => ({ menuItemsToRender: [...prevState.menuItemsToRender, newItem] }));\n folderData\n .filter(child => \n child.parent_type === 'DocumentFolder' && \n child.parent_id === parent.id\n )\n .sort((a, b) => {\n if (a.title.toLowerCase() < b.title.toLowerCase()) { return -1; }\n if (a.title.toLowerCase() > b.title.toLowerCase()) { return 1; }\n return 0;\n })\n .forEach(child => this.pushSelfAndDescendants({\n parent: child,\n folderData,\n level: level+1,\n }));\n }\n }\n\n updateCheck() {\n this.setState((prevState) => {\n if (prevState.inFolder === false) {\n return {\n ...prevState,\n inFolder: !prevState.inFolder,\n existingFolder: false,\n }\n } else {\n return {\n ...prevState,\n inFolder: !prevState.inFolder,\n };\n }\n });\n }\n\n changeFolderType(event, value) {\n const { folderData } = this.props;\n this.setState({\n existingFolder: value === 'existing',\n })\n if (value === 'existing') {\n folderData\n .filter(child => child['parent_type'] === 'Project')\n .sort((a, b) => {\n if (a.title.toLowerCase() < b.title.toLowerCase()) { return -1; }\n if (a.title.toLowerCase() > b.title.toLowerCase()) { return 1; }\n return 0;\n })\n .forEach(child => this.pushSelfAndDescendants(\n { parent: child, folderData, level: 0}\n ));\n }\n }\n\n selectFolder(event, index, value) {\n this.setState({\n folderId: value,\n })\n }\n\n renderFolderChoice() {\n const { contentsChildren } = this.props;\n const { inFolder, existingFolder, folderId, newFolderName } = this.state;\n const spaced = { marginBottom: '16px' };\n const dropdownStyle = { width: '100%', marginTop: '-6px', marginBottom: '22px' };\n const grayStyle = { color: 'gray' };\n return (\n <>\n \n {inFolder && (\n <>\n \n \n child['document_kind'] === 'folder'\n ).length === 0\n }\n />\n \n {!existingFolder && (\n <>\n New folder:\n {' '}\n this.setState({ newFolderName: val })}\n hintText=\"Name\"\n style={{ marginLeft: '4px', ...spaced }}\n >\n \n \n )}\n {existingFolder && ( \n \n \n {\n this.state.menuItemsToRender.map(item => (\n \n ))\n }\n \n )}\n \n )}\n \n )\n }\n\n renderMultipleUploadButton({ projectId }) {\n const { createBatchImages, uploading, startUploading, killUploading, uploadError } = this.props;\n const { folderId, newFolderName, inFolder, existingFolder } = this.state;\n const uploadsNotDone = this.props.uploads && this.props.uploads.length > 0 && this.props.uploads.some(\n (upload) => !['timeout', 'finished', 'error'].includes(upload.state)\n );\n const folderChoiceValid = \n !inFolder || \n (existingFolder === false && newFolderName !== '') ||\n (existingFolder === true && folderId !== '');\n return !uploadError ? (\n {\n createBatchImages({\n projectId,\n signedIds,\n inFolder,\n existingFolder,\n folderId,\n newFolderName,\n });\n }}\n render={({ handleUpload, uploads, ready }) => (\n <>\n {!uploading && !(this.props.uploads && this.props.uploads.length > 0) && (\n }\n label=\"Upload multiple\"\n disabled={\n !ready ||\n uploads.length > 0 ||\n uploadsNotDone ||\n !folderChoiceValid\n }\n >\n 0 ||\n uploadsNotDone ||\n !folderChoiceValid}\n multiple\n onChange={(e) => {\n const { files } = e.currentTarget;\n if (files.length > 50) {\n this.setState((prevState) => ({ ...prevState, invalidFiles: 'count' }));\n } else {\n const validFileFormats = ['image/png', 'image/jpeg', 'image/jpg'];\n let batchSize = 0.0;\n let filesAreValidFormat = true;\n for (let i = 0; i < files.length; i += 1) {\n const sizeInBytes = files[i].size;\n const sizeInMB = sizeInBytes / (1024*1024);\n batchSize += sizeInMB;\n if (!validFileFormats.includes(files[i].type)) {\n filesAreValidFormat = false;\n }\n }\n if (batchSize <= 150 && filesAreValidFormat) {\n handleUpload(files).catch(err => {\n console.error(err);\n killUploading(err);\n });\n startUploading();\n this.setState((prevState) => ({ ...prevState, invalidFiles: null }));\n } else if (batchSize > 150) {\n this.setState((prevState) => ({ ...prevState, invalidFiles: 'size' }));\n } else {\n this.setState((prevState) => ({ ...prevState, invalidFiles: 'format' }));\n }\n }\n }}\n style={{ display: 'none' }}\n />\n \n )}\n {uploading && !(this.props.uploads && this.props.uploads.length > 0) && (\n <>\n {!(uploads && uploads.length > 0) && (\n <>\n

\n Loading...\n

\n \n \n )}\n {uploads && uploads.length > 0 && (\n \n \n {uploads.map((upload) => (\n \n ))}\n \n
\n )}\n \n )}\n {this.props.uploads && this.props.uploads.length > 0 && (\n \n \n {this.props.uploads.map((upload) => (\n \n ))}\n \n
\n )}\n \n )}\n />\n ) : (<>);\n }\n\n render() {\n const { \n batchImagePromptShown,\n closeDialogShown,\n hideBatchImagePrompt,\n hideCloseDialog,\n showCloseDialog,\n uploading,\n uploads,\n uploadError,\n } = this.props;\n const projectId = batchImagePromptShown;\n\n const uploadsNotDone = uploads.some(\n (upload) => !['timeout', 'finished', 'error'].includes(upload.state)\n );\n\n const showInitStuff = !uploading && !(this.props.uploads && this.props.uploads.length > 0);\n\n return (\n {\n if (uploading || (uploads.length > 0 && uploadsNotDone)) {\n showCloseDialog();\n } else {\n hideBatchImagePrompt();\n this.setState({ ...this.defaultState });\n }\n }}\n autoScrollBodyContent={true}\n actions={[\n {\n if (uploading || (uploads.length > 0 && uploadsNotDone)) {\n showCloseDialog();\n } else {\n hideBatchImagePrompt();\n this.setState({ ...this.defaultState });\n }\n }}\n />,\n ]}\n contentStyle={{ width: '90%', maxWidth: '1000px' }}\n >\n {(showInitStuff || this.state.invalidFiles) && (\n
\n {showInitStuff && !uploadError && (\n <>\n

\n Here you can upload\n {' '}\n up to 50 JPG or PNG images (but no more than 150 MB at once)\n {' '}\n in batch, and optionally into a folder.\n

\n

\n Note that this can be an intensive process that consumes a lot of memory, \n and you should not leave the page until the process completes.\n

\n \n )}\n {uploadError && (\n <>\n

Error: {uploadError.toString()}

\n

\n Please try again. If a specific file caused an error,\n it may need to be uploaded separately.\n

\n \n )}\n {this.state.invalidFiles === 'count' && (\n

\n Error: Limit of 50 images exceeded\n

\n )}\n {this.state.invalidFiles === 'size' && (\n

\n Error: Limit of 150 MB exceeded\n

\n )}\n {this.state.invalidFiles === 'format' && (\n

\n Error: File must be of type JPG or PNG\n

\n )}\n
\n )}\n
\n {uploading && (<>\n

Upload in progress. Closing this page before uploads complete may result in lost uploads.

\n

It is also recommended not to close this dialog window.

\n )}\n {uploads && !uploading && uploads.length > 0 && !uploadsNotDone && (<>\n

Upload complete!

\n

You may now safely close this dialog window and/or page.

\n {uploads.some(upload => upload.state === 'timeout') && (\n

\n Note: Since\n {' '}\n {uploads.filter(upload => upload.state === 'timeout').length}\n {' '}\n uploads are still processing in the background, you may wish to close this page entirely \n and check back in a few minutes to ensure that all images were succesfully processed.\n

\n )}\n )}\n
\n {showInitStuff && !uploadError && this.renderFolderChoice()}\n {this.renderMultipleUploadButton({ projectId })}\n {\n hideBatchImagePrompt();\n hideCloseDialog();\n this.setState({ ...this.defaultState });\n }}\n cancelAction={() => {\n hideCloseDialog();\n }}\n open={closeDialogShown}\n />\n \n );\n }\n}\n\nconst mapStateToProps = (state) => ({\n batchImagePromptShown: state.project.batchImagePromptShown,\n uploads: state.project.uploads,\n uploading: state.project.uploading,\n contentsChildren: state.project.contentsChildren,\n folderData: state.project.folderData,\n closeDialogShown: state.project.closeDialogShown,\n uploadError: state.project.uploadError,\n});\n\nconst mapDispatchToProps = (dispatch) =>\n bindActionCreators(\n {\n hideBatchImagePrompt,\n startUploading,\n killUploading,\n createBatchImages,\n showCloseDialog,\n hideCloseDialog,\n },\n dispatch\n );\n\nexport default connect(mapStateToProps, mapDispatchToProps)(BatchImagePrompt);\n","import React, { Component } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect } from 'react-redux';\nimport HTML5Backend from 'react-dnd-html5-backend';\nimport { DragDropContext } from 'react-dnd';\nimport { loadProject, updateProject, showSettings, hideSettings, checkInAll } from './modules/project';\nimport { selectTarget, closeTarget, closeTargetRollover, promoteTarget } from './modules/annotationViewer';\nimport { closeDeleteDialog, confirmDeleteDialog, layoutOptions, openDocument, openInitialDocs, updateSnackBar, fetchLock } from './modules/documentGrid';\nimport { selectHighlight } from './modules/textEditor';\nimport Dialog from 'material-ui/Dialog';\nimport Snackbar from 'material-ui/Snackbar';\nimport FlatButton from 'material-ui/FlatButton';\nimport Navigation from './Navigation';\nimport ProjectSettingsDialog from './ProjectSettingsDialog';\nimport TableOfContents from './TableOfContents';\nimport DocumentViewer from './DocumentViewer';\nimport LinkInspectorPopupLayer from './LinkInspectorPopupLayer';\nimport SearchResultsPopupLayer from './SearchResultsPopupLayer';\nimport BatchImagePrompt from './BatchImagePrompt';\nimport { Beforeunload } from 'react-beforeunload';\n\nconst rolloverTimeout = 500\n\nclass Project extends Component {\n constructor(props) {\n super(props);\n\n this.mainContainer = null;\n this.mouseX = 0;\n this.mouseY = 0;\n this.rolloverTimer = null;\n }\n\n setFocusHighlight(document_id, highlight_id, key) {\n this.hideRollover(highlight_id)\n const target = this.createTarget(document_id, highlight_id, key)\n if (target) {\n this.props.selectTarget(target);\n }\n }\n\n selectTextHighlight(document_id, highlight_id, key) {\n if (!(key && this.props.highlightsHidden && this.props.highlightsHidden[key])) {\n if (this.props.highlightSelectModes[key]) {\n this.props.selectHighlight(key, highlight_id);\n }\n // if the clicked highlight is currently selected, don't proceed with the normal popover behavior to facilitate editing the highlighted text\n else if (this.props.selectedHighlights[key] !== highlight_id) {\n this.setFocusHighlight(document_id, highlight_id, key);\n }\n }\n }\n\n showRollover(document_id, highlight_id, key) {\n // if this doc's highlights are hidden, or the hovered highlight is currently selected,\n // don't proceed with the normal popover behavior to facilitate editing the highlighted text\n if ((key && this.props.highlightsHidden && this.props.highlightsHidden[key]) || this.props.selectedHighlights[key] === highlight_id) return;\n const existingPopover = this.props.selectedTargets.find( target => !target.rollover && target.uid === highlight_id )\n if( !existingPopover ) {\n this.activateRolloverTimer( () => {\n const target = this.createTarget(document_id, highlight_id, key)\n if (target) {\n target.rollover = true\n this.props.selectTarget(target);\n }\n else {\n console.log('tried to show rollover for a non-existent target', document_id, highlight_id);\n }\n })\n }\n }\n\n hideRollover(highlight_uid) {\n const existingRollover = this.props.selectedTargets.find( target => target.rollover && target.uid === highlight_uid )\n if( existingRollover ) {\n this.props.closeTargetRollover(highlight_uid);\n } else {\n this.deactivateRolloverTimer()\n }\n }\n\n createTarget( documentID, highlightID, key ) {\n const resource = this.props.openDocuments.find(resource => resource.id.toString() === documentID.toString());\n const target = resource && highlightID ? resource.highlight_map[highlightID] : resource;\n if (target) {\n let newTarget = { ...target }\n newTarget.document_id = documentID;\n newTarget.originKey = key;\n newTarget.highlight_id = highlightID ? target.id : null;\n newTarget.document_title = resource.title;\n newTarget.document_kind = resource.document_kind;\n newTarget.startPosition = {\n x: Math.min(Math.max(this.mouseX - this.props.sidebarWidth, 0), this.mainContainer.offsetWidth),\n y: this.mouseY + window.scrollY\n };\n return newTarget\n } else {\n return null\n }\n }\n\n activateRolloverTimer( callback ) {\n this.deactivateRolloverTimer()\n this.rolloverTimer = setTimeout(callback, rolloverTimeout )\n }\n\n deactivateRolloverTimer() {\n if( this.rolloverTimer ) {\n clearTimeout(this.rolloverTimer)\n this.rolloverTimer = null\n }\n }\n\n componentDidMount() {\n window.setFocusHighlight = this.setFocusHighlight.bind(this);\n window.selectTextHighlight = this.selectTextHighlight.bind(this);\n window.showRollover = this.showRollover.bind(this);\n window.hideRollover = this.hideRollover.bind(this);\n if (this.props.match.params.slug !== 'new') {\n this.props.loadProject(this.props.match.params.slug, this.props.projectTitle)\n // open documents included in query params\n const queryParams = new URLSearchParams(this.props.location.search);\n if (queryParams) {\n this.props.openInitialDocs(queryParams.getAll(\"document\"));\n }\n }\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.currentUser !== this.props.currentUser && this.props.match.params.slug !== 'new') {\n this.props.loadProject(this.props.match.params.slug, this.props.projectTitle);\n this.props.openDocumentIds.forEach((id) => {\n this.props.fetchLock(id);\n });\n }\n if (prevProps.openDocuments !== this.props.openDocuments && !this.props.loadingInitialDocs) {\n // update query params when opening or closing a document\n const queryParams = new URLSearchParams();\n this.props.openDocuments.forEach((doc) => {\n queryParams.append(\"document\", doc.id.toString());\n });\n this.props.history.replace({\n pathname: this.props.location.pathname,\n search: `?${queryParams.toString()}`,\n });\n }\n }\n\n renderDeleteDialog() {\n const { deleteDialogTitle, closeDeleteDialog, deleteDialogSubmit, deleteDialogOpen, deleteDialogBody, confirmDeleteDialog } = this.props;\n\n return (\n ,\n \n ]}\n modal={true}\n open={deleteDialogOpen}\n >\n {deleteDialogBody}\n \n );\n }\n\n renderDialogLayers() {\n return (\n
\n \n \n { this.renderDeleteDialog() }\n \n \n
\n );\n }\n\n getSelectedHighlight(key) {\n return this.props.selectedHighlights[key];\n }\n\n renderDocumentViewer = (document,index) => {\n const { projectId, writeEnabled } = this.props;\n const key = `${document.id}-${document.timeOpened}`;\n return (\n {this.setFocusHighlight(document.id, undefined, key);}}\n writeEnabled={writeEnabled}\n locked={document.locked}\n lockedByUserName={document.locked_by_user_name}\n lockedByMe={document.locked_by_me}\n numRows={this.numRows}\n firstTarget={document.firstTarget}\n getSelectedHighlight={this.getSelectedHighlight.bind(this)}\n />\n );\n }\n\n renderDocumentGrid() {\n const { currentLayout, openDocuments } = this.props;\n const newNumRows = Math.max(1, Math.ceil(openDocuments.length / currentLayout.cols));\n\n // if the number of rows goes up, bump the scroll bar\n if( this.numRows && newNumRows > currentLayout.rows && newNumRows > this.numRows ) {\n const newScrollPos = 100 + window.pageYOffset;\n window.scrollTo(0, newScrollPos);\n }\n this.numRows = newNumRows;\n\n const gridInnerStyle = {\n margin: `72px 8px 0 ${this.props.sidebarWidth + 8}px`,\n display: 'flex',\n flexWrap: 'wrap',\n overflow: 'hidden'\n }\n\n return (\n {this.mainContainer = el;}}\n onMouseMove={event => {this.mouseX = event.clientX; this.mouseY = event.clientY;}}\n >\n \n {openDocuments.map( this.renderDocumentViewer )}\n \n \n );\n }\n\n renderSnackbar() {\n const { snackBarMessage, snackBarOpen, updateSnackBar } = this.props \n return (\n { updateSnackBar(false,null) } }\n />\n ) \n }\n\n render() {\n const {\n title,\n projectId,\n loading,\n adminEnabled,\n sidebarWidth,\n contentsChildren,\n openDocumentIds,\n writeEnabled,\n uploads,\n uploading,\n batchImagePromptShown,\n } = this.props;\n const uploadsNotDone = uploads.some(\n (upload) => upload.state !== 'finished' && upload.state !== 'error'\n );\n return (\n
\n {this.props.updateProject(projectId, {title: newValue});}}\n isLoading={loading}\n />\n this.props.checkInAll(projectId) }\n sidebarWidth={sidebarWidth} \n contentsChildren={contentsChildren} \n openDocumentIds={openDocumentIds} \n writeEnabled={writeEnabled} \n />\n { this.renderDialogLayers() }\n { this.renderDocumentGrid() }\n { this.renderSnackbar() }\n {(loading || \n (\n uploads && \n uploads.length > 0 && \n uploadsNotDone\n ) ||\n uploading ||\n batchImagePromptShown)\n && (\n event.preventDefault()} />\n )}\n
\n );\n }\n}\n\nconst mapStateToProps = state => ({\n currentUser: state.reduxTokenAuth.currentUser,\n projectId: state.project.id,\n title: state.project.title,\n loading: state.project.loading,\n errored: state.project.errored,\n adminUsers: state.project.adminUsers,\n contentsChildren: state.project.contentsChildren,\n sidebarWidth: state.project.sidebarWidth,\n sidebarIsDragging: state.project.sidebarIsDragging,\n uploads: state.project.uploads,\n uploading: state.project.uploading,\n batchImagePromptShown: state.project.batchImagePromptShown,\n writeEnabled: state.project.currentUserPermissions.write,\n adminEnabled: state.project.currentUserPermissions.admin,\n openDocuments: state.documentGrid.openDocuments,\n openDocumentIds: state.documentGrid.openDocuments.map(document => document.id.toString()),\n deleteDialogOpen: state.documentGrid.deleteDialogOpen,\n deleteDialogTitle: state.documentGrid.deleteDialogTitle,\n deleteDialogBody: state.documentGrid.deleteDialogBody,\n deleteDialogSubmit: state.documentGrid.deleteDialogSubmit,\n loadingInitialDocs: state.documentGrid.loadingInitialDocs,\n snackBarOpen: state.documentGrid.snackBarOpen,\n snackBarMessage: state.documentGrid.snackBarMessage,\n currentLayout: layoutOptions[state.documentGrid.currentLayout],\n selectedTargets: state.annotationViewer.selectedTargets,\n sidebarTarget: state.annotationViewer.sidebarTarget,\n highlightSelectModes: state.textEditor.highlightSelectModes,\n selectedHighlights: state.textEditor.selectedHighlights,\n highlightsHidden: state.textEditor.highlightsHidden,\n});\n\nconst mapDispatchToProps = dispatch => bindActionCreators({\n checkInAll,\n closeDeleteDialog,\n closeTarget,\n closeTargetRollover,\n confirmDeleteDialog,\n fetchLock,\n hideSettings,\n loadProject,\n openDocument,\n openInitialDocs,\n promoteTarget,\n selectHighlight,\n selectTarget,\n showSettings,\n updateProject,\n updateSnackBar,\n}, dispatch);\n\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(DragDropContext(HTML5Backend)(Project));\n","import React, { Component } from 'react';\nimport { Route } from 'react-router-dom';\nimport darkBaseTheme from 'material-ui/styles/baseThemes/darkBaseTheme';\nimport MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';\nimport getMuiTheme from 'material-ui/styles/getMuiTheme';\nimport { grey200, grey400, grey900 } from 'material-ui/styles/colors';\nimport Home from './Home';\nimport Project from './Project';\nimport 'prosemirror-view/style/prosemirror.css';\nimport 'prosemirror-menu/style/menu.css';\nimport 'prosemirror-example-setup/style/style.css';\n\nexport default class App extends Component {\n render() {\n return (\n \n
\n
\n \n \n
\n
\n
\n );\n }\n}\n","// In production, we register a service worker to serve assets from local cache.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\n// cached resources are updated in the background.\n\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\n// This link also includes instructions on opting out of this behavior.\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport default function register() {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Lets check if a service worker still exists or not.\n checkValidServiceWorker(swUrl);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://goo.gl/SC7cgQ'\n );\n });\n } else {\n // Is not local host. Just register service worker\n registerValidSW(swUrl);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and\n // the fresh content will have been added to the cache.\n // It's the perfect time to display a \"New content is\n // available; please refresh.\" message in your web app.\n console.log('New content is available; please refresh.');\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n if (\n response.status === 404 ||\n response.headers.get('content-type').indexOf('javascript') === -1\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Provider } from 'react-redux';\nimport { ConnectedRouter } from 'react-router-redux';\nimport store, { history } from './store';\nimport { verifyCredentials } from './modules/redux-token-auth-config';\nimport './index.css';\nimport App from './App';\nimport {unregister} from './registerServiceWorker';\n\nverifyCredentials(store);\n\nReactDOM.render(\n \n \n
\n \n
\n
\n
,\n document.getElementById('root')\n);\n\nunregister();\n// TODO perhaps enable this later.\n//registerServiceWorker();\n"],"sourceRoot":""}