{"version":3,"sources":["common/utils/handle-response.js","common/utils/role.js","common/utils/history.js","common/services/authentication.service.js","common/components/PrivateRoute.jsx","viewer/contexts/TilesContext.jsx","common/utils/Localization.jsx","common/utils/Utils.jsx","viewer/utils/ROI.jsx","viewer/utils/PolygonUtil.jsx","common/components/Structure.jsx","common/components/RoiTypes.jsx","common/utils/Backend.jsx","about/AboutPage.jsx","common/components/Spinloader.jsx","admin/components/SystemContainer.jsx","admin/components/UserDetailsDialog.jsx","admin/components/UsersContainer.jsx","globalComponents/CustomListSelector.jsx","admin/components/GroupDetailsDialog.jsx","admin/components/GroupsContainer.jsx","admin/components/FolderChooser.jsx","admin/components/ImporterContainer.jsx","admin/components/ModuleSelectionDialog.jsx","admin/components/ModuleCreationContainer.jsx","admin/components/EyeIconButton.jsx","common/utils/RandomColorGenerator.jsx","common/components/SketchColorPicker.jsx","admin/components/CaseSettingsEditableOptionsMenu.jsx","admin/components/CaseSettingsListItem.jsx","admin/components/CaseSettingsContainer.jsx","admin/AdminPage.jsx","audioViewer/components/AudioAnnotationItem.jsx","audioViewer/components/AudioAnnotations.jsx","common/components/WheelControllableSlider.jsx","audioViewer/components/AudioControlBar.jsx","audioViewer/components/MagnitudeSpectrogram.jsx","audioViewer/components/AudioFileContainer.jsx","audioViewer/AudioRenderer.jsx","audioViewer/components/ExclusionBoxIcon.jsx","audioViewer/AudioToolBar.jsx","common/components/ClickAwareTreeItem.jsx","audioViewer/sidebar/StructureOptionMenu.jsx","audioViewer/sidebar/StructureItem.jsx","audioViewer/sidebar/StructureTree.jsx","audioViewer/sidebar/AudioFileTree.jsx","common/components/AITrainingSettings.jsx","common/components/StepperDialog.jsx","home/dialogs/TrainAIModelComponents/ModelMetaData.jsx","home/dialogs/TrainAIModelComponents/ModelTypeSelection.jsx","home/dialogs/TrainAIModelComponents/StructureSelection.jsx","home/dialogs/TrainAIModelComponents/SettingOptions.jsx","home/dialogs/TrainAIModelComponents/SettingCategories.jsx","home/dialogs/TrainAIModelComponents/ModelAndDatasetSettings.jsx","home/dialogs/TrainAIModel.jsx","audioViewer/sidebar/AiTrainingTab.jsx","audioViewer/sidebar/AudioSideBarDock.jsx","audioViewer/AudioSideBar.jsx","common/components/LocalVerticalResizeBorder.jsx","audioViewer/AudioViewer.jsx","aiViewer/components/AIModelListItem.jsx","aiViewer/components/AIModelsList.jsx","aiViewer/components/AIModelsFiltering.jsx","common/components/AITrainingInformation.jsx","common/components/AITrainingDataContainer.jsx","aiViewer/components/dashboard-representation/SelectedAIModelInformation.jsx","aiViewer/components/custom-tensorboard-representation/Utils.jsx","aiViewer/components/custom-tensorboard-representation/ApacheEChartsTimeSeries.jsx","aiViewer/components/dashboard-representation/Utils.jsx","aiViewer/AIViewer.jsx","home/dialogs/CreateCaseDialogComponents/StepCaseForm.jsx","home/dialogs/CreateProjectdialogComponents/EmptySlideCreation.jsx","home/dialogs/CreateProjectdialogComponents/StepFileSelection.jsx","home/dialogs/CreateCaseDialog.jsx","cases/components/DynamicCaseTable.jsx","cases/components/CasesTable.jsx","cases/CasesPage.jsx","common/components/CustomDialog.jsx","viewer/utils/CanvasUtil.jsx","viewer/utils/RendererUtils.jsx","viewer/components/ScaleBar.jsx","viewer/components/ZoomBar.jsx","viewer/components/MiniMap.jsx","viewer/components/ZStackBar.jsx","viewer/components/ImageInfo.jsx","viewer/components/ToggleButton.jsx","viewer/contexts/PersistentStorageContext.jsx","viewer/contexts/ResultTabContext.jsx","fileViewer/Renderer.jsx","fileViewer/FileRenderer.jsx","fileViewer/components/ToggleButtonFV.jsx","fileViewer/FileToolBar.jsx","fileViewer/ImagePreview.jsx","fileViewer/components/FolderEntity.jsx","fileViewer/Foldertree.jsx","fileViewer/FileViewer.jsx","home/dialogs/CreateProjectdialogComponents/StepProjectModuleSelection.jsx","proteomViewer/components/ProteomSettings.jsx","home/dialogs/CreateProjectdialogComponents/StepMetaData.jsx","home/dialogs/CreateProjectDialog.jsx","common/components/LazyRender.jsx","home/dialogs/FindFilesDialog.jsx","globalComponents/CustomSvgIcon.jsx","home/components/ProjectsTableRow.jsx","home/components/ProjectsTable.jsx","home/HomePage.jsx","licensing/LicensingPage.jsx","account/LoginPage.jsx","common/components/NavigationBar.jsx","prediction/images/p1.jpg","prediction/images/p2.jpg","prediction/images/p3.jpg","prediction/images/p4.jpg","prediction/PredictionPage.jsx","viewer/utils/StructuresUtils.jsx","viewer/contexts/ProjectContext.jsx","viewer/contexts/ProjectHistoryContext.jsx","proteomViewer/components/Preview3d.jsx","proteomViewer/components/ProteomSideBar.jsx","proteomViewer/components/ProteomResults.jsx","proteomViewer/components/ProteomToolBar.jsx","proteomViewer/ProteomViewer.jsx","home/Report.jsx","scanViewer/contexts/ScanViewerContext.jsx","scanViewer/components/ScanStream.jsx","scanViewer/components/ScanMinimap.jsx","scanViewer/components/ScanComments.jsx","scanViewer/components/ScanDebugData.jsx","scanViewer/components/ScanRenderer.jsx","globalComponents/CustomSelector.jsx","scanViewer/components/SelectFileDialog.jsx","scanViewer/components/ScanToolBar.jsx","globalComponents/CustomSlider.jsx","scanViewer/components/ScanMicroscopeSettings.jsx","scanViewer/components/ScanFluorescence.jsx","scanViewer/ScanViewer.jsx","settings/SettingsPage.jsx","spectraViewer/components/ELineChart.jsx","spectraViewer/contexts/SpectraViewerContext.jsx","spectraViewer/components/FileParamForm.jsx","common/components/LocalHorizontalResizeBorder.jsx","spectraViewer/components/CustomResultTable.jsx","spectraViewer/components/SpectraBottomTableResults.jsx","spectraViewer/components/SpectraLeftTableResults.jsx","spectraViewer/components/ResultChart.jsx","spectraViewer/components/SpectraResultCharts.jsx","spectraViewer/components/SpectraSidebarTabs/SpectraTab.jsx","spectraViewer/components/SpectraSidebarTabs/OperationsTab.jsx","spectraViewer/components/SpectraSidebarTabs/ModelTab.jsx","spectraViewer/components/SpectraSidebarTabs/AnalysisTab.jsx","spectraViewer/components/SpectraSideBar.jsx","spectraViewer/components/SpectraToolBar.jsx","spectraViewer/SpectraViewer.jsx","userhistory/components/DayPicker.jsx","userhistory/components/DayPagination.jsx","userhistory/components/UserHistoryTable.jsx","userhistory/UserHistoryPage.jsx","viewer/components/Histogram.jsx","viewer/contexts/AllViewerContexts.jsx","viewer/components/ClassroomChat.jsx","viewer/components/CroppedImage.jsx","viewer/components/SceneImage.jsx","viewer/components/AccuracyGraph.jsx","viewer/components/GalleryToolBoxes.jsx","viewer/components/Gallery.jsx","viewer/components/OverlaySlider.jsx","viewer/components/VerticalResizeBorder.jsx","viewer/components/VerticalToolBar.jsx","viewer/components/ResultTable.jsx","viewer/utils/GeometricInterpolation.jsx","viewer/components/TimeChart.jsx","viewer/components/TimeLineTool.jsx","viewer/components/Renderer.jsx","viewer/components/sidebar/SideBarTabAISelectByModel.jsx","viewer/components/sidebar/SideBarTabAI.jsx","viewer/components/ListItemOptionsMenu.jsx","viewer/components/ListItemSubType.jsx","viewer/components/ListItemStructure.jsx","viewer/components/sidebar/SideBarTabRois.jsx","viewer/components/FileTreeView.jsx","viewer/components/sidebar/SideBarTabView.jsx","viewer/components/ScoringMatrixHistoClassification.jsx","viewer/components/ScoringMatrixHistoPointCounting.jsx","viewer/components/sidebar/SideBarTabResults.jsx","viewer/components/SideBar.jsx","viewer/components/3DViewHelper.jsx","viewer/components/3D-Viewer.jsx","viewer/components/tools/Tool.jsx","viewer/components/tools/ActiveLearningTool.jsx","home/components/AIModelDialogTable.jsx","home/dialogs/AIModelDialog.jsx","viewer/components/tools/AITrainingTool.jsx","viewer/components/tools/CommentTool.jsx","viewer/components/tools/CopyTool.jsx","viewer/components/tools/ConfigForms/OverlapConfigForm.jsx","viewer/components/tools/EllipseTool.jsx","viewer/components/tools/FillTool.jsx","globalComponents/CustomRangeSlider.jsx","viewer/components/tools/FilterAnnotationsTool.jsx","viewer/components/tools/GridAnnotationTool.jsx","viewer/components/tools/GridTool.jsx","viewer/components/tools/HeatmapTool.jsx","viewer/components/tools/InstantAnalysisTool.jsx","viewer/components/tools/LandmarkTool.jsx","viewer/components/tools/MagicWandTool.jsx","viewer/components/tools/PenTool.jsx","viewer/utils/TinyQueue.jsx","viewer/utils/rbush-knn.jsx","viewer/components/tools/PlotNearestRoiTool.jsx","viewer/components/tools/RectangleTool.jsx","viewer/components/tools/RegionGrabCutTool.jsx","viewer/components/tools/RegionGrowingTool.jsx","viewer/components/tools/RegionSAMTool.jsx","viewer/components/tools/RegionTool.jsx","viewer/components/tools/RoiResizeTool.jsx","viewer/components/tools/SelectionTool.jsx","viewer/components/tools/StreamViewTool.jsx","viewer/components/tools/TilesClassificationTool.jsx","viewer/components/tools/TilesHistoPointCountingTool.jsx","viewer/components/WindowTool.jsx","viewer/Viewer.jsx","App.jsx","registerServiceWorker.js","index.js"],"names":["handleResponse","response","text","then","data","JSON","parse","ok","indexOf","status","authenticationService","logout","window","location","reload","error","message","statusText","Promise","reject","Role","createBrowserHistory","currentUserSubject","BehaviorSubject","localStorage","getItem","login","email","password","requestOptions","method","headers","body","stringify","fetch","user","setItem","next","removeItem","currentUser","asObservable","currentUserValue","value","PrivateRoute","_ref","Component","component","roles","rest","_objectWithoutProperties","_excluded","_jsx","Route","_objectSpread","render","props","role","Redirect","to","pathname","state","from","TilesContext","React","createContext","withTiles","WrappedComponent","Consumer","children","context","tiles","displayName","concat","name","TilesProvider","_Component","_inherits","_super","_createSuper","_this","_classCallCheck","call","getIndex","a","strAnnoCount","i","length","getIndexObj","strSubtypesPages","id","resetStPg","page","visibleImage","visibleImageUpdatedAt","coloredImages","coloredImagesUpdatedAt","imgWidth","imgHeight","pageIndex","histogramConfig","selectedLayerColor","selcetedLayerIndex","annotationCount","firstIteration","accPoints","pointCount","galleryVisible","isMousedown","isOnImage","IsInOtherImage","onPageInput","structure","structureBefore","graphAcc","roiProps","color","isSubtype","subtypeName","pos","histoClassificationStarted","fileId","zLevel","chainLeaderId","transformationMatrix","transformationFactor","transformationOffset","_createClass","key","_this2","Provider","this","setVisibleImage","clearTiles","_i","_Object$keys","Object","keys","_i2","_Object$keys2","_i3","_Object$keys3","_i4","_Object$keys4","pushVisibleImage","tileId","Date","getTime","sorted","push","sort","b","onload","src","undefined","resetVisibleImages","f","getVisibleImages","getVisibleImage","img","setColoredImages","pushColoredImages","resetColoredImages","getColoredImages","getColoredImage","setImgWidth","getImgWidth","setImgHeight","getImgHeight","setPageIndex","getPageIndex","setHistogramConfig","getHistogramConfig","setSelectedLayerColor","getSelectedLayerColor","setSelectedLayerIndex","selectedLayerIndex","getSelectedLayerIndex","addAnnotationCount","x","setAnnotationCount","getAnnotationCount","setFirstIteration","getFirstIteration","pushAccPoint","point","y","getAccPoints","setGalleryVisible","getGalleryVisible","setIsMousedown","getIsMousedown","setIsOnImage","getIsOnImage","setIsInOtherImage","isInOtherImage","getIsInOtherImage","setRoiProps","getRoiProps","setPositionRoi","setOnPageInput","getOnPageInput","pushStrAnnoCount","pushDynamicStructureAC","splice","setStrAnnoCount","idx","setParentAnnoCount","getStrAnnoCountElement","getStrAnnoCount","setAnnoCount","changeAnnoCount","idx_a","idx_b","pushSubtypesPages","obj","tilePage","subtypes","pushDynamicStructureSP","label","getSubtypesPages","setSubtypesPages","setPage","getPage","setTilePage","getTilePage","setSubtypes","setSingleSubtype","c","getSubtypes","resetSubtypesPages","setStructure","getStructure","getStructureBefore","setGraphAcc","pushGraphAcc","getGraphAcc","setHistoClassificationStarted","getHistoClassificationStarted","setFileId","getFileId","setZLevel","getZLevel","setTransformationMatnFactnOff","fact","Off","getTransformationMatrix","getTransformationFactor","getTransformationOffset","removeTransformationMatrix","resetAllTransformationMatnFact","getAllTransformationMatrices","getAllTransformationFactors","getAllTransformationOffsets","padTo2Digits","num","toString","padStart","convertDate","jsonDate","convertDateToShortIsoString","date","d","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","isUuid","inputString","acceptNil","arguments","TypeError","test","isObject","Array","isArray","isInt","input","roundToDecimal","decimals","Math","round","Number","EPSILON","pow","viewerType","projectType","toLowerCase","includes","downloadJsonObjectAsFile","jsonObject","downloadName","Error","dataStr","encodeURIComponent","dlAnchorElem","document","createElement","setAttribute","click","remove","requestFileInput","_x","_requestFileInput","apply","_asyncToGenerator","_regeneratorRuntime","mark","_callee","acceptedFileTypes","wrap","_context","prev","abrupt","resolve","inputElem","onchange","e","target","files","stop","debounce","fn","delay","timeoutId","_len","args","_key","clearTimeout","setTimeout","isColorLight","rgba","hex","result","exec","_result","_slicedToArray","r","g","parseInt","hexToRgba","BaseROI","strokeColor","fillColor","CommentROI","regions","type","commentValue","computedValue","inverted","fontScaleFactor","updateBounds","bounds","calcBoundingBox","width","right","left","height","bottom","top","p","RegionROI","copy","roiCopy","uuid","isAnnotated","structureId","isLabeled","isSelObj","aiAnnotated","setRegions","uuidv4","center","borderColor","subtype","color1","ai","annotated","labeled","isSel","isSaved","saved","z","fullyLoaded","comment","tileName","selected","selectedWithKey","frequencyClass","isStartData","aiIdx","galleryIndex","firstTimeGallery","treeItem","minX","minY","maxX","maxY","roi","poly","turf","pointOnPolygon","geometry","coordinates","_step","_iterator","_createForOfIteratorHelper","s","n","done","_step3","region","_iterator3","toFixed","err","_step2","_iterator2","converted","area","_unused","console","log","inputRegions","_step4","_iterator4","resultRegions","p1","p2","comp","numObjects","getSimplifiedRectRegions","intRegions","map","simplifyedRegions","tolerance","simplifiedPoly","highQuality","simplifyRegions","pArea","abs","RectROI","_BaseROI","ctx","w","h","drawingMode","resizePoint","cornerRadius","getTransform","dragStart","canvas","style","cursor","hovered","vw","vh","max","min","strokeStyle","lineWidth","beginPath","rect","stroke","closePath","cornerDiameter","fillStyle","fill","getFirstValidatedIndexValue","item","index","createRoisFromAnno","anno","geoJSON","filter","frequencyCl","lineArrayBuffer","lineArray","radius","feature","buffered","buffer","viewRect","distance","deltaX","deltaY","sqrt","pointInsideRegion","turfPoint","turfPoly","pointInside","regionRoi","hasIntersection","regionRoi1","regionRoi2","poly1","poly2","intersects","isInside","findIndexById","structures","findIndex","findSameLayer","selectedLayer","defaultParentIndex","parentLayerId","parentId","classificationSubtype","parentIndex","findSiblingRoiLayers","roiLayers","overlapRoiLayers","visible","layer","regionRois","checkIfStructureHidden","showWarningSnackbar","findClickedRoi","includeBaseROI","inversed","_step6","overlapTreeItems","tree","search","_iterator6","updateDrawLayer","drawRegion","clear","bufferSize","drawRegionRois","multiLayerRegions","multiDrawRegions","transformResult","coordArray","_step14","_iterator14","roiToAdd","createRegionRoi","updateLayer","positionInRoiLayer","overlap","parentLayer","clickedOnRoi","_step15","historyItem","histId","_iterator15","parentRegionRois","reducedLayerRegionRois","_step12","_iterator12","forEach","getTreeItemsFromRois","multiParentRegions","intersection","turfPolyToRegionRois","_step16","_iterator16","_loop","overlapRoiLayer","_step17","overlapItems","_iterator17","_loop2","drawRoi","drawPoly","isIntersecting","_step18","_iterator18","_step19","_iterator19","_loop3","add","transformResultInfo","differenceRegionsInfo","_step13","_iterator13","segDiff","idxRoi","segGeoJSON","idxRegionsInfo","differenceRegionsAndInfo","debug","openErrorDialog","firstRoiToAdd","insert","all","fromIndex","arr","toIndex","element","arraymove","projectHistory","findRoi","resultRoi","targetLayerIndex","_step20","_iterator20","PolyBool","epsilon","Structure","isStructure","isDynamic","sameLevelRank","isUnfolded","annotationsAreVisible","hasChildren","nestingDepth","totalObjectCount","canBeChosen","isChosen","toolSettings","optionalParams","maxId","__setMaxId","newStructureId","highestIdInStructures","floor","reduce","structureCanMove","direction","siblings","some","sameLevelIndex","parentStructures","parentStructs","_toConsumableArray","find","childStructures","childStructs","sortStructures","parentStructure","child","moveStructure","newSameLevelRank","sibsToModify","prevRanks","insertStructure","parent","_importStructures","_callee2","firstNewId","callback","file","fr","_args2","_context2","openConfirmationDialog","sent","FileReader","newStructures","newIds","errmsg","showErrorSnackbar","newStruct","fromObject","struct","t0","_x3","readAsText","val","_obj$id","_obj$label","_obj$isStructure","_obj$color","_obj$isDynamic","_obj$parentId","_obj$sameLevelRank","_obj$isUnfolded","_obj$annotationsAreVi","_obj$hasChildren","_obj$nestingDepth","_obj$totalObjectCount","_obj$canBeChosen","_obj$isChosen","_obj$toolSettings","_obj$optionalParams","Id","Label","IsStructure","Color","IsDynamic","ParentId","SameLevelRank","IsUnfolded","AnnotationsAreVisible","HasChildren","NestingDepth","TotalObjectCount","CanBeChosen","IsChosen","ToolSettings","OptionalParams","ModificationStatus","freeze","Saved","Added","Deleted","RoiType","ImageRoi","AudioRoi","ImageAnnotationType","Area","Comments","AnnotationAction","Save","Export","Import","DeleteAll","saveAnnotations","projectId","annotationType","annotations","values","Backend","saveAnnotationsToDb","oldIds","roiUpdate","reassignedIds","idTuple","modificationStatus","fileName","success","warning","failedToAdd","failedToDelete","_importAnnotations","existingAnnotations","unsaved","importedAnnotations","isAiAnnotated","t","startTime","endTime","minFreq","maxFreq","channels","t1","_x9","_deleteAllAnnotations","_callee3","forceDelete","updatedAnnotations","_args3","_context3","Roi","_Roi","roiCoords","_roiCoords$","calcBoundingBoxFullObject","_obj$fileId","_obj$structure","_obj$isAiAnnotated","_obj$user","_obj$modificationStat","_obj$z","_obj$t","_obj$coordinates","_obj$annotationType","_obj$minX","_obj$minY","_obj$maxX","_obj$maxY","FileId","IsAiAnnotated","User","Z","T","Coordinates","AnnotationType","MinX","MinY","MaxX","MaxY","_Roi2","_super2","RangeError","_obj$id2","_obj$fileId2","_obj$structure2","_obj$isAiAnnotated2","_obj$user2","_obj$modificationStat2","_obj$startTime","_obj$endTime","_obj$minFreq","_obj$maxFreq","_obj$channels","StartTime","EndTime","MinFreq","MaxFreq","Channels","DEFAULT_PORT","SERVER_URL","jobProgressConnection","HubConnectionBuilder","withUrl","configureLogging","LogLevel","Warning","build","fetch_auth","url","config","token","Authorization","validateResponse","permissionString","json","showHandledProblems","errorMessage","permissionDenied","handleJsonResponse","res","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","group","userId","userGroups","validateResponseJSON","catch","errorName","customErrorPrint","appsettings","params","errorCallback","progressCallback","jobId","random","substr","connection","on","line","start","invoke","_requestProject","_args","_x2","_loadAnnotations","queryOptions","_x5","_x4","roiType","performance","now","timeInSeconds","time","searchOptions","_res","incomingRoi","model_path","online","callbackInput","models","newModels","new_model","unlistedModels","warn","modelErrs","model","version","shortErr","ex","_listCases","_callee4","_context4","_deleteCase","_callee5","caseId","_context5","_x6","_createCase","_callee6","_yield$response$json","responseData","_context6","_x7","_editCase","_callee7","_context7","_x8","projectIds","exportName","blob","URL","createObjectURL","href","download","appendChild","FormData","append","formData","projectActionMode","projectCount","projects","aiModel","names","output_name","projectJson","folderPath","fileMappings","projectNames","remoteUuid","rois","roisToAdd","roiIdsToDelete","Blob","availabeProjectTypes","waitForElement","getVersion","ptKey","projectTypes","loadAvailableProjectTypes","description","isUserModule","order","dir","isRelative","str","spinloader","off","isJsonString","jsonLine","k","trainingProgress","progress","replace","showWithProgress","show","project","annotation","serializedGeoJSON","myJson","stdout","galleryTrainingProgress","alModel","lv","image_path","_getFileUuid","_callee8","_context8","_x10","zRange","showPointCloud","origin","req","XMLHttpRequest","open","setRequestHeader","responseType","Uint8Array","onerror","send","path","successCallback","modelType","isVdlModel","parameters","advancedSettings","comDLArchitecture","updateTrainingData","modelName","verifiedAIModel","selectedAIModel","redirect","_getCurrentUser","_callee9","_context9","fullName","_x11","graphRequestSettings","startsWith","slice","Accept","tileExportProgress","io","WebSocket","dateFormated","toISOString","dateDay","join","convertDateToDayString","closeProject","loadTensorboardScalarData","getTrainingEpochProgress","styles","theme","root","flexGrow","overflow","paper","marginTop","spacing","display","flexDirection","link","margin","LogFilesTab","withStyles","logFiles","logFilesPython","classes","_jsxs","Grid","container","xs","sm","Typography","variant","className","rel","decodeURIComponent","AboutTab","HelpTab","workflows","ReleaseNotesTab","releaseNotes","Table","TableBody","TableRow","TableCell","align","notes","note","AboutPage","setProjectTypeWorkflows","aboutResult","getLicensingInfo","license","filteredWorkflows","activeModules","workflow","activeModule","setState","handleChange","event","newValue","scrollRef","current","scrollTo","activeTab","buildDate","canAccessLogFiles","createRef","getAbout","getCurrentUser","_this$state","intranetUrl","localhostMode","CssBaseline","Container","maxWidth","Paper","Tabs","indicatorColor","textColor","onChange","Tab","ref","padding","maxHeight","withRouter","SpinloaderContext","withSpinloader","SpinloaderProvider","progressObject","start_time","messagePresent","isNaN","indefinite","timeout","showWithAutoProgress","seconds","currentSecond","predictedSeconds","updateAutoProgress","showWithMessage","measureTime","executionTime","minutes","logMessage","rightWidth","scenesLeft","timeoutSeconds","waitTime","timeoutHide","_this3","hide","_this4","func","_this5","_this6","showWithTimeout","numberScenes","progObject","resetTimer","numberRestScenes","hideTimeDelayed","load","setRightWidth","greyedOutBackground","progressContainer","Dialog","dialog","hideBackdrop","DialogTitle","CircularProgress","LinearProgress","linearProgress","size","position","zIndex","textAlign","pointerEvents","marginLeft","background","_useState","useState","_useState2","settings","setSettings","useEffect","readAppSettings","Card","CardContent","Tooltip","disableInteractive","title","canUseSystemActions","Button","onClick","openResponseDialog","deleteTempFiles","deleted","showSuccessSnackbar","disabled","canSetJobRunTimes","TextField","defaultValue","schedulerStart","tempSettings","InputLabelProps","shrink","inputProps","step","schedulerEnd","CardActions","collection","storagePath","tempPath","galleryOutputPath","entries","_step$value","endsWith","writeAppSettings","icon","CheckBoxOutlineBlankIcon","fontSize","checkedIcon","CheckBoxIcon","useStyles","makeStyles","border","borderRadius","UserDetailsDialog","setUser","_useState3","_useState4","selectedGroups","setSelectedGroups","getUserGroups","newUser","_defineProperty","onClose","DialogContent","Box","noValidate","autoComplete","autoFocus","fullWidth","create","canEditUserGroups","Autocomplete","disablePortal","options","groups","multiple","getOptionLabel","option","isOptionEqualToValue","renderInput","renderOption","Checkbox","marginRight","checked","DialogActions","onApply","table","minWidth","justifyContent","alignItems","chip","TableRowRender","canEditUsers","deleteUser","handleUserEdit","editTooltipTitle","deleteTooltipTitle","scope","groupIdx","Chip","IconButton","EditIcon","DeleteIcon","UsersContainer","userDetails","setUserDetails","setCreate","updateGroups","handleBackendResponse","updateUserList","TableHead","users","Boolean","createUser","updateUserGroups","updateUser","CustomListSelector","_React$Component","_this$props","optionsList","selectedIdx","FormControl","selectContainer","sx","m","InputLabel","htmlFor","Select","MenuItem","defaultCheckboxAdminData","canImportProjects","canExportModels","canImportModels","canEditGroups","canAccessAdminPage","canAccessLicensingPage","canEditAutoImportSettings","canAccessAllUserActions","canCreateModules","defaultCheckboxProjectData","isProjectVisible","canOpenProject","canAccessResults","canComment","canAnnotate","canEditStructures","canRunJob","canAccessAITab","canEditAITabSettings","canTrainModel","canEditProjectProperties","GroupDetailsDialog","componentDidMount","updateCheckboxes","resetDetails","checkboxAdminData","checkboxProjectData","groupName","_Object$entries","_Object$entries$_i","presetAdminIdx","presetProjectIdx","componentDidUpdate","prevProps","_Object$entries2","_Object$entries2$_i","_Object$entries3","_Object$entries3$_i","updateGroup","createGroup","setcheckboxAdminDataValue","onAdminPresetChange","updateObject","presetAdminOptionsList","updateGroupName","setCheckboxProjectData","onProjectPresetChange","_i5","onAdminPermissionCheckboxChange","forceUpdate","onProjectPermissionCheckboxChange","newGroupName","nameError","groupWithSameName","presetProjectOptionsList","column","columnHeadline","FormGroup","FormControlLabel","control","gridTemplateColumns","marginBottom","GroupsContainer","groupDetailsOpen","setGroupDetailsOpen","setGroup","userGroupIds","groupCanBeEdited","isSuperAdmin","editGroup","deleteGroup","list","minHeight","overflowY","content","paddingTop","folderIcon","itemText","textOverflow","FolderChooser","dirfiles","setDirFiles","currentPath","setCurrentPath","updateFolderList","walkDir","filteredDirFiles","entry","List","dense","ListItem","ListItemIcon","substring","lastIndexOf","ArrowUpward","ListItemText","primary","ListItemButton","Folder","InputProps","readOnly","ImporterContainer","showFolderChooser","setShowFolderChooser","readImporterSettings","importerFolders","folders","split","folder","folderIdx","ListItemAvatar","Avatar","FolderIcon","secondary","ListItemSecondaryAction","edge","newSettings","removeDirectoryClick","startIcon","AddIcon","importerStart","importerEnd","importerNewerThan","writeImporterSettings","openErrorSnackbar","ProjectModuleTiles","availableTypes","onProjectType","onProjectTypeChange","dialogContent","ImageList","rowHeight","projectTilesList","cols","tile","ImageListItem","classNames","projectTile","projectTileSelected","deleteButton","deleteProjectModuleType","image","alt","tileImage","tileBar","ModuleSelectionDialog","_isMounted","componentWillUnmount","setMountedState","stateObject","updateProjectTypes","openWarningDialog","handleClose","handleOK","selectedProjectType","onSelectProject","submitted","other","fontFamily","ModuleCreationContainer","setProject","projectObject","structureKeys","structureObj","_structureKeys","handleStructureSelect","uploadedFile","readFile","contents","resultStructures","tempStructure","toolNames","noStructuresError","handlePreviewSelect","_ref2","previewError","previewFile","previewImgUrl","onCreateProjectType","missingInput","moduleIdError","moduleLabelError","loadReducedAvailableProjectTypes","createProjectModuleTypeJsonFile","createProjectModuleTypeImage","renderPreviewImage","imagePreview","getElementById","previewDiv","PublishIcon","previewIcon","accept","dialogOpen","exportSelectedProjectType","exportProjectTypes","exportNewProjectTypes","ownProjectTypes","isDevState","selectedProject","metaData","ProjectProperties","AutomaticBaseRoiWholeImage","Hidden","HideSubMenus","Online","PreventOverlap","PreventOverlapSame","ProjectStringProperties","SideBarWidth","toolsInProject","GalleryTool","TilesTool","AdjustLayoutTool","FilterAnnotationsTool","PlotNearestTool","DrawRectangleAnnotationTool","DrawEllipseAnnotationTool","DrawPixelAnnotationTool","DrawRegionAnnotationTool","SelectRegionAnnotationTool","CopyRegionAnnotationTool","FillHoleAnnotationTool","OtherTools","CommentTool","ScreenshotTool","ZoomOriginalTool","ZoomInOutTool","ZoomFitTool","SaveTool","LandmarkTool","RoiResizeTool","HeatmapTool","SaveImagesTool","PassiveLearningTool","ApplyModelTool","RoiTab","AICockpit","ResultTab","AITrainingTool","ShowALTabTool","GridTool","GridAnnotationTool","GalleryTrainingTool","dynamicStructure","job","param","FontAwesomeIcon","faImages","faCube","faSquareFull","SortIcon","ScatterPlotIcon","ViewQuilt","CheckBoxOutlineBlank","faPen","faDrawPolygon","faCircle","mask","faFillDrip","faMousePointer","faHandPointer","faClone","faBrain","faThLarge","faDownload","RateReviewIcon","faCamera","textIcon","ZoomOutMap","ZoomIn","faPencilRuler","faTable","activeColor","toolsInProjectObject","renderIcon","middleStructuresColumn","tileContainer","GetAppIcon","importProjectTypes","textInputField","helperText","palette","main","fontWeight","lineHeight","float","StyledIconButton","styled","EyeIconButton","VisibilityIcon","VisibilityOffIcon","presetColors","getRandomColor","colorIdx","getUnusedColor","counter","popover","pickerContainer","boxShadow","mainSwatch","cover","pickerSwatches","flexWrap","pickerSwatch","aspectRatio","outline","SketchColorPicker","includeWhite","displayColorPicker","setDisplayColorPicker","xPosition","setXPosition","_useState5","_useState6","yPosition","setYPosition","colorsForSwatches","clientX","clientY","innerHeight","innerWidth","stopPropagation","HexAlphaColorPicker","presetColor","defaultProps","selectFieldDatatype","selectFieldDefault","defaultSelectInput","fab","newItem","CaseSettingsEditableOptionsMenu","forwardedRef","_ref$data","items","newSelectionItemValue","setNewSelectionItemValue","selectedValue","setSelectedValue","selectionItems","setSelectionItems","newItemInputRef","useRef","getOptionsData","useImperativeHandle","MuiTextField","select","itemIdx","newColor","prevItems","newItems","preventDefault","updatedItems","focus","handleOnDeleteSelectionItem","onKeyDown","onSubmit","newSelectionItems","inputRef","forwardRef","types","textArea","CaseSettingsListItem","caseSettingsEditableOptionsMenuRef","onDeleteRow","_React$useState","_React$useState2","setLabel","_React$useState3","_React$useState4","dataType","setDataType","_React$useState5","_React$useState6","setDefaultValue","_React$useState7","_React$useState8","setVisible","isDisabled","getCaseData","returnDefaultValue","optionsData","DragIndicatorIcon","dataTypeFieldPreset","multiline","minRows","prevValue","CaseSettingsContainer","cardContentRef","caseCols","setCaseCols","listHeight","setListHeight","savedAppsettings","setSavedAppsettings","setAppsettings","newAppsettings","caseColumns","caseCol","handleResize","addEventListener","removeEventListener","caseColRefs","prevValues","newCaseCols","handleConfirmation","deleteColumnData","caseAccCol","renderCol","el","DragDropContext","onDragEnd","destination","_newCaseCols$splice","source","reorderedItem","Droppable","droppableId","provided","innerRef","droppableProps","Draggable","draggableId","draggableProps","dragHandleProps","userSelect","placeholder","_","caseColumn","getPossibleCaseSettingsChanges","criticalColumns","Fab","prevCaseCols","cardContentEl","scrollHeight","behavior","ActiveTab","Users","Groups","Cases","System","ModuleCreation","AdminPage","countPermissions","accumulator","currentValue","loadGroupList","loadUserList","getCurrentUserGroups","superAdminId","saveClick","onTabChange","activeComponent","SystemContainer","rootContent","whiteSpace","canvasContainer","DELTA","AudioAnnotationItem","saveNow","reportSaveStatus","_props$removeOverlaps","removeOverlaps","mouseX","setMouseX","_props$isVisible","isVisible","visibleTimeRange","prevTimeRange","AudioViewer","useContext","AudioViewerContext","containerWidth","AudioFile","AudioFileContext","isDrawing","setIsDrawing","canvasWidth","setCanvasWidth","setCursor","isKeyboardDrawing","setKeyboardDrawing","_useState7","_useState8","setAnnotations","currentAnnotation","actionState","loadAnnotationsFromDB","newRois","endAnnotation","updateCanvas","timestamp","selectedStructure","newAnnos","allTasks","childActions","ownTasks","task","username","msg","exportAnnotations","importAnnotations","deleteAllAnnotations","annos","setChildActions","_data$currentAnnotati","x1","pixelDeltaX","updateAnnotation","timestampToPx","handleKeyPress","disableKeyboardShortcuts","shiftKey","code","initializeAnnotation","getX","drawRect","getBoundingClientRect","pageX","isValueNearby","pxToTimestamp","pxValue","audio","duration","timestampValue","isOverlapping","anno1","anno2","isValueInside","getCanvasWidth","_canvasContainer$curr","getPixelAnnotations","convertToPixelAnnotation","newActionState","annoIdx","audioAnno","x2","finalizeAnnotation","tmpAnn","modifiedAnnotations","tmpAnnotations","newAnnotation","getAnnotationTransformed","audioDuration","factor","delatXTransofrmed","_getAnnotationTransfo2","tempAnno","minAnno","maxAnno","removeOverlapsFromAnnotation","_getAnnotationTransfo","existingAnno","transformedAnnot","existingAnnoIdx","mergeOverlappingAnnotations","deletionArea","newAnnotations","_newAnnotations","newAnno","deleteAnnotation","getContext","clearRect","onMouseDown","setSelectedStructure","placement","labelWidth","buttons","onMouseMove","updatedCursor","updateCursor","delta","movementX","onMouseUp","onContextMenu","cursorContainer","borderLeft","AudioAnnotations","timestampPosition","structuresRef","selectedStructureRef","savedStructures","setSavedStructures","disableKeyboardShortcutsRef","prevSaveStatus","newSaveStatus","switchStructure","currentlySelectedIndex","newlySelectedStructure","parents","pop","every","structureSaveStatus","tmpStatus","allStructuresSaved","reportFileSaveStatus","reportStructureSaveStatus","excludeToolActive","WheelControllableSlider","_props$defaultValue","_props$min","_props$max","_props$step","_props$onChange","_props$onChangeCommit","onChangeCommitted","sliderRef","sliderPosition","setSliderPosition","sliderPostionRef","adjustSliderByScrolling","useCallback","newVal","sign","deltaZ","Slider","onMouseEnter","onMouseLeave","borderBottom","sliders","AudioControlBar","waveS","getWaveSurfer","media","volume","savedVolume","setSavedVolume","playPause","jump","getDuration","interval","skip","paused","pause","PauseIcon","play","PlayArrowIcon","setTime","StopIcon","Stack","setVolume","VolumeOffIcon","VolumeDownIcon","valueLabelDisplay","VolumeUpIcon","SpeedIcon","playbackRate","setPlaybackRate","createStyles","toggleButton","waveVisible","spectrogramVisible","leftWidth","setWaveSurfer","setVisibleTimeRange","wavesurfer","waveformRef","setWaveVisible","setspectrogramVisible","zoomRef","minZoom","setMinZoom","initWS","zoom","setOptions","plugins","spectrogramIdx","SpectrogramPlugin","addSpectrogram","destroy","zoomDelta","newZoom","getMinZoom","zoomToFit","renderer","clientWidth","registerPlugin","showTime","labels","ws","WaveSurfer","autoCenter","autoScroll","cursorWidth","audioFileSrc","currentTime","updateTimeStampPosition","visibleStartTime","visibleEndTime","wrapper","getWrapper","parentElement","parentWidth","contentWidth","visibleDuration","widthToDurationFactor","visibleLeft","seek","scrollLeft","gridTemplateRows","ExpandLessIcon","ExpandMoreIcon","playing","AudioFileContainer","_props$labelWidth","waveSurfer","setTimestamp","setTimestampPosition","setDisableKeyboardShortcuts","_useState9","_useState10","setContentWidth","_useState11","_useState12","hoverPositionX","setHoverPositionX","_useState13","_useState14","hoverBarVisible","setHoverBarVisible","bind","updateVisibleTimeRange","newPosition","currentDuration","loadAudioFile","fileUrl","tmpHowl","Howl","format","sourcePath","onplay","onpause","onseek","unload","revokeObjectURL","calcWidths","valueLabelFormat","ms","boundingBox","handleContainerFocus","tabIndex","onBlur","Fragment","xPos","pixelToTime","followCursor","startX","MagnitudeSpectrogram","LABEL_WIDTH","AudioRenderer","_props$files","ExclusionBoxIcon","SvgIcon","viewBox","saveButton","divider","AudioToolBar","save","setExcludeToolActive","handleKeyDownEvent","ctrlKey","toggleSideBar","faExchangeAlt","Divider","ClickAwareTreeItemContent","_clsx","nodeId","iconProp","expansionIcon","displayIcon","_useTreeItem","useTreeItem","expanded","focused","handleExpansion","handleSelection","preventSelection","clsx","iconContainer","ClickAwareTreeItem","TreeItem","ContentComponent","menuIcon","StructureOptionMenu","setStructures","triggerAction","anchorEl","setAnchorEl","menuOpen","setMenuOpen","addChild","newStructure","currentTarget","oldState","MoreVertIcon","Menu","PlaylistAdd","_structures","newStructs","parentIdx","cs","shift","duplicateStructure","FileCopy","GetApp","Publish","ArrowDownward","deleteAnnotations","deleteStructure","Delete","propTypes","PropTypes","instanceOf","isRequired","array","structureElement","inputElement","structureIcon","RecursiveStructureItem","_props$selectedStruct","_props$trainingSettin","trainingSettings","_props$setTrainingSet","setTrainingSettings","leftSpacing","paddingLeft","StructureItem","_props$setStructures","_props$setSelectedStr","_props$triggerAction","_props$isLocked","isLocked","_props$isInSelectionM","isInSelectionMode","_props$updateChoosabi","updateChoosability","_props$trainingSettin2","_props$setTrainingSet2","_excluded2","setColor","setIsChosen","setAnnotationVisibility","updateStructure","tmpStructures","tmpStructure","old","AccountTreeIcon","Visibility","VisibilityOff","structureButtons","structureList","paddingRight","StructureTree","_props$structures","_props$allowChoices","allowChoices","_props$structureSelec","structureSelectability","_props$allStructuresE","allStructuresEnabled","allRoisHidden","setAllRoisHidden","newStructureName","setNewStructureName","updateStructureSelectability","addNewStructure","updatedStructures","exportStructures","importStructures","TreeView","defaultCollapseIcon","defaultExpandIcon","ChevronRightIcon","onNodeToggle","expandedNodeIds","_createElement","Add","previewImageContainer","importText","lineThrough1","lineThrough2","sceneItem","objectFit","visibility","excludeButton","selectedFile","selectedFileIdx","hasNotExcludedScenes","excluded","toExclude","exludedValue","updateFiles","onExcludeFilesToggle","excludeScene","RemoveCircleIcon","AddCircleIcon","fileIdx","updateSelectedFile","onSelectFile","onExcludeAudioFileToggle","DatasetApproach","ImageFileBased","ImageObjectBased","ImageSlidingWindow","AudioFileBased","AudioSlidingWindow","DatasetApproachNames","_Object$freeze","DatasetApproachShort","_Object$freeze2","DatasetType","ImageClassification","ImageObjectDetection","ImageSegmentation","ImageInstanceSegmentation","AudioClassification","AudioSequenceDetection","AudioSequenceSegmentation","AudioSequenceInstanceSegmentation","DatasetTypeNames","_Object$freeze3","DatasetTypeShort","_Object$freeze4","TrainingDataTypes","Image","Audio","_trainingDataTypebyModuleName","AudioAnnotator","trainingDataTypebyModuleName","Metrics","Accuracy","MetricsNames","LossFunction","CrossEntropy","Dice","CrossEntropyDice","LossFunctionNames","_Object$freeze6","Optimizer","Adam","AdamW","SGD","OptimizerNames","_Object$freeze7","_DefaultDatasetTypeMappings","_DefaultDatasetApproachMappings","TrainingParameters","_ref$epochs","epochs","_ref$earlyStopping","earlyStopping","_ref$batchSize","batchSize","_ref$metrics","metrics","_ref$lossFunctions","lossFunctions","_ref$optimizer","optimizer","_ref$learningRate","learningRate","metric","lossFunction","ModelMetaData","_ref2$name","_ref2$version","_ref2$description","_ref2$isNewModel","isNewModel","DatasetParameters","_ref3","_ref3$datasetApproach","datasetApproach","_ref3$datasetType","datasetType","_ref3$datasetOnly","datasetOnly","_ref3$useExistingData","useExistingDataset","DatasetMeta","ImageDatasetMeta","_DatasetMeta","_ref4","_ref4$datasetType","_ref4$inputChannels","inputChannels","_ref4$fluorescenceCha","fluorescenceChannels","_ref4$spatialDims","spatialDims","_ref4$imageWidth","imageWidth","_ref4$imageHeight","imageHeight","_ref4$numberOfClasses","numberOfClasses","_ref4$pyramidLevel","pyramidLevel","AudioDatasetMeta","_DatasetMeta2","_ref5","_ref5$datasetType","_ref5$sequenceLengthS","sequenceLengthSeconds","_ref5$sequenceOverlap","sequenceOverlapSeconds","_ref5$numberOfClasses","_ModelParameterMappping","_Object$freeze8","AITrainingSettings","datasetParameters","trainingParameters","modelParameters","stepper","paddingBottom","StepperDialog","_steps$activeStep$tit","_steps$activeStep","_steps$activeStep$con","_steps$activeStep2","_steps$activeStep$nex","_steps$activeStep3","_steps$activeStep$bac","_steps$activeStep4","isOpen","setOpen","_props$steps","steps","_props$submitMessage","submitMessage","_props$onNext","onNext","_props$onBack","onBack","activeStep","setActiveStep","handleNext","validate","pageToJumpTo","prevActiveStep","keepMounted","ValidatorForm","_Fragment","Stepper","alternativeLabel","nonLinear","_step$title","Step","StepButton","MobileStepper","nextButton","KeyboardArrowRight","backButton","KeyboardArrowLeft","modelSelButtonContainer","modelSelButton","existingModel","existingVersion","_existingAiModels$fin","_existingAiModels$fin2","_existingAiModels$map","_existingAiModels$fin3","_existingAiModels$fin4","existingAiModels","nameInUse","containsInvalidChar","useHSANamingFormat","setUseHSANamingFormat","setModelName","modelVersion","initialModelName","getHSAModelName","nameParts","DialogContentText","versions","images","tileHeadline","datasetOptions","default","classification","objectDetection","segmentation","instanceSegmentation","med","mapModuleToModelOptions","ModelTypeSelection","_mapModuleToModelOpti","model_options","ImageListItemBar","StructureSelection","_props$setAllStructur","setAllStructuresEnabled","anyParentSelected","anyChildSelected","DatasetApproachSelection","trainingDataType","EpochSelection","LearningRateSelection","BatchSizeSelection","EarlyStoppingLimitSelection","OptimizerSelection","LossFunctionSelection","SelectProps","renderValue","MetricsSelection","DatasetCreationOptions","selectedCreationOption","setSelectedCreationOption","ImageSizeSelection","ImagePyramidLevelSelection","pyramidLevels","levelData","level","ImageInputChannelSelection","ome","isBrightfield","channel","AudioSequenceLengthSelection","AudioSequenceOverlapSelection","AudioNumberOfClassesSelection","accordion","CommonlyUsedCategory","updateOpen","Accordion","isExpanded","AccordionSummary","expandIcon","HelpOutlineIcon","AccordionDetails","setting","getPyramidLevels","dropdownPyramidLevels","maxLevel","getImageDatasetSettings","getAudioDatasetSettings","AdvancedDatasetSettings","AdvancedModelSettings","ModelAndDatasetSettings","openAccordion","setOpenAccordion","history","useHistory","useReducer","aiModels","setAiModels","setNameInUse","setContainsInvalidChar","getModelMetadata","DefaultDatasetType","DefaultDatasetApproach","validateMetaData","validateModelType","validateStructureSelection","validateEntries","verbose","valueToCheck","localNameInUse","meta_data","localContainsInvalidChar","isValid","parentsNotChosen","anyStructureChosen","validateAllSettings","submit","firstInvalidStep","socketMessagePromise","trainModel","getSocket","showActionSnackbar","stepNo","versionUsed","extractSettings","AiTrainingTab","openTrainingDialog","setOpenTrainingDialog","TrainAIModel","Context","AudioSideBarDock","init","setInit","dockbox","mode","tabs","layout","setLayout","filesTab","AudioFileTree","structureTreeTab","aiTrainingTab","DockLayout","loadTab","onLayoutChange","newLayout","newChilds","oldChilds","custom","floatable","maximizable","AudioSideBar","_props$hide","_props$width","action","LocalVerticalResizeBorder","handleMouseDown","resizeMode","lastPageX","initPageX","handleMouseMove","leftBorder","newWidth","resizeWidth","targetWidth","handleMouseEnd","borderWidth","overlayBorder","resizesBorder","MIN_SIDEBAR_WIDTH","sideBarWidth","setSideBarWidth","hideSideBar","setHideSideBar","triggerSave","setFiles","savedFiles","setSavedFiles","setSelectedFile","_useState15","_useState16","_useState17","_useState18","setAllStructuresSaved","allStructuresSavedRef","_useState19","_useState20","_useState21","_useState22","_useState23","_useState24","_useState25","_useState26","_useState27","_useState28","setContainerWidth","loadProject","isOpenProject","incomingProject","_incomingProject$file","setNavigationbarTitle","viewerConfig","loadStructures","saveReminder","setInterval","saveProject","clearInterval","currentSideBarWidth","saveStructures","fileSaveStatus","tmpSaveStatus","AIModelListItem","loading","onStopTraining","setSelectedModel","isHovered","setIsHovered","datasetProgress","setDatasetProgress","trainingEpochProgress","setTrainingEpochProgress","information","trainingStatus","setTrainingStatus","parseFloat","socket","dataObj","model_name","disconnect","backgroundColor","disableRipple","renderState","AIModelsList","AIModels","selectedModel","flex","iconButton","textField","AIModelsFiltering","modelFilterValue","onFilterChange","structureFilter","setStructureFilter","structureFilters","setStructureFilters","modelTypeFilter","setModelTypeFilter","trainingStatusFilter","setTrainingStatusFilter","ResetIcon","onKeyPress","prevFilters","onDelete","chipToDelete","chips","InputBase","SearchIcon","SystemInformation","systemInformation","os","cpu","gpu","ram","AITrainingInformation","creationDate","completionDate","AITrainingDataContainer","card","cardWrapper","opacity","iconAdjust","loadingCard","scrollable","SelectedAIModelInformation","makeTopRow","InfoOutlinedIcon","cardContent","toDateString","toLocaleTimeString","String","SettingsApplicationsIcon","TuneIcon","MemoryIcon","downloadZippedChartDataAndImage","chartId","zip","csvData","csvContent","chartElement","chartBase64","base64Data","JSZip","x_values","y_values","echarts","getDataURL","pixelRatio","base64","generateAsync","saveAs","xValues","yValues","xAxisName","x_axis","yAxisName","y_axis","_setColors","sub","setColors","_setColors2","solidColor","transparentColor","xAxis","yAxis","dataZoom","end","fillerColor","handleColor","handleStyle","tooltip","trigger","axisPointer","series","showSymbol","itemStyle","animationDuration","downloadNZip","chartDataKeys","chartData","app","boxStyle","chartButtons","gap","chartDimension","ApacheEChartsTimeSeries","charts","setOption","dispose","BarChartIcon","setChartAndDownloadButton","DownloadIcon","noData","ceil","handleDownload","finalSelectedModel","jsonStr","blobURL","tempLink","removeChild","blueButton","verticalAlign","textDecoration","transitionDuration","greyButton","addOneIfOdd","nKeys","AIViewer","trainedModels","setTrainedModels","loadingOne","setLoadingOne","importingAIModel","setImportingAIModel","exportingAIModel","setExportingAIModel","exportingAIModelDataset","setExportingAIModelDataset","deletingAIModel","setDeletingAIModel","setModelFilterValue","selectedTab","setSelectedTab","setChartDataKeys","setError","setM","setN","setChartData","fetchData","resKeys","resKeysLength","nTrainedModels","is_new_model","dataset_parameters","dataset_approach","dataset_type","dataset_only","use_existing_dataset","training_parameters","early_stopping","batch_size","loss_function","learning_rate","model_parameters","input_channels","spatial_dims","image_width","image_height","number_of_classes","pyramid_level","trainingsettings","project_id","project_type","system_information","trainingInformation","creation_date","completion_date","training_status","error_message","AIModelDataContainer","filteredModels","filterInput","getFilteredAIModels","updateSelectedModel","handleImportModelSelection","importAIModels","fileIsNew","CloudUploadIcon","chartBlocks","styleOne","setChartBlocks","alignSelf","centered","iconPosition","SettingsIcon","borderRight","ReplayIcon","Name","exportAIModel","CloudDownload","exportAIModelDataset","SimCardDownload","borderTop","deleteAIModel","successful","StepCaseForm","updateTrigger","setCaseColumns","editCase","today","updateCaseColumns","updatedCaseColumns","col","textFieldValue","innerText","newCaseColumns","newColumns","newColumn","TextFieldProps","itemValue","EmptySlideCreation","allowed_formats","checkFormat","valid_regex","emptyFile_name","ref_regex","pattern","allowed_format","addFile","ref_button","non_utf8_capable_filetypes","StepFileSelection","getLastDir","pathEnding","lastSeperator","fromCharCode","getFilesFromPath","filterText","addAll","supportedFileFormats","sortedDirFiles","pathParts","extension","filename","foldersToExclude","lastDir","sameMrxsFile","char","charCodeAt","lastFileName","dirFilePaths","lastFileIdx","firstIdx","lastIdx","fileNameToAdd","onChangeFiles","toggleAllFiles","removeFolder","addFolder","filePaths","filteredFiles","filesToAdd","resultFiles","relativePath","previewImageFiles","Set","toggleSortMenu","sortMenuOpen","setSortBy","_this$state2","sortBy","sortReverse","creationTime","reverse","image_error","_this$state3","node","onChangeFilter","fileList","clickEvent","imageThumbnail","onError","CheckBox","fileSize","loaded","AddToPhotos","selectionTarget","freeHistoParameters","applyButton","nextStepState","NEXT","CREATE","EDIT","activeStepState","FORM","FILE_SELECTION","CreateCaseDialog","setUpdateTrigger","setFormData","nextButtonState","setNextButtonState","prevCaseColumns","Files","prevFormData","updateCases","createCase","handleSave","prevUpdateTrigger","caseStateContainer","tagBox","row","cases","columns","setOrder","CreationDateTime","orderBy","setOrderBy","acc","columnVisibility","setColumnVisibility","TableContainer","TableSortLabel","active","property","columnId","prevColumnVisibility","orderByA","orderByB","stableSort","hover","handleRowClick","onEditRow","CasesTable","caseColumnsData","setEditCase","isCreateCaseDialogOpen","setIsCreateCaseDialogOpen","DynamicCaseTable","casesContainer","CasesPage","setCases","setCaseColumnsData","_Backend$readAppSetti","listCases","casesResponse","appsettingsResponse","singleCase","initCaseCols","_matchingCaseCol$labe","_matchingCaseCol$item","matchingCaseCol","initCaseCol","appsettingsCols","orderedNewCaseCols","aIdx","bIdx","deleteCase","CustomDialog","handleConfirmOpen","responseFunction","dialogState","awaitUserConfirmation","confirmed","handleErrorOpen","handleWarningOpen","downloadError","trackTransforms","svg","createElementNS","xform","createSVGMatrix","savedTransforms","translate","restore","scale","sy","scaleNonUniform","rotate","radians","PI","dx","dy","transform","m2","multiply","setTransform","pt","createSVGPoint","transformedPoint","matrixTransform","inverse","backTransformedPoint","getBaseLog","configureImage","offScrCan","ctx1","drawImage","imgData","getImageData","gamma","j","putImageData","__assign","assign","prototype","hasOwnProperty","calculateAffineTransformation","opointBase","opointShift","bfact","tfact","pointBase","pointShift","ny","muXSumX","muXSumY","muYSumX","muYSumY","muX","muY","x0","y0","muXSumXQ","muXSumYQ","muYSumXQ","muYSumYQ","ssX","ssY","normX","normY","newX0","newY0","_SVD","_a","u","v","eps","withu","withv","tol","l1","l","testConvergence","q","iteration","SVD","transpose","U","Vt","V","traceTA","R","S","calcOnloading","imgs","currentSrc","baseId","translateScale","sizeY","hMat","onloading","visImg","xStart","yStart","tilesToLoad","transformPoint","tileRegistration","callbackPushImage","cv","splited","maxTile","iM","inv","tileWidth","tileHeight","pointTL","pointTR","pointBL","pointBR","invPointTL","invPointTR","invPointBL","invPointBR","rectPointTL","rectPointBR","rectWidth","rectHeight","OriginRectPointTL","OriginRectPointTR","OriginRectPointBL","OriginRectPointBR","matSource","matFromArray","CV_32FC2","matTarget","newMat","getPerspectiveTransform","xEnd","yEnd","diff","trunc","offsetX","offsetY","tileLoaderParams","matFromImageData","dst","Mat","dsize","Size","warpPerspective","INTER_NEAREST","BORDER_REPLICATE","newImgData","ImageData","Uint8ClampedArray","rows","offTileCan","renderRegion","tileLoader","colorInImage","globalCompositeOperation","fillRect","scaleUnitLabels","scaleUnits","maxScaleWidth","ScaleBar","grabbing","scalebarMeters","physicalSizeX","exponent","toExponential","unitExponent","unitExponentIndex","mantissa","roundedMantissa","fluorescence","setScaleBarData","_this$props2","onStart","parentObj","offsetParent","onStop","onDrag","marks","ZoomBar","isSelected","clickable","verticalBar","markButton","changeValue","MiniMap","initialized","mousewheel","passive","offsetWidth","offsetHeight","inSideBar","getCtx","miniMapMouseEvent","pageY","onMoveTo","chainMouseMove","mouseDown","dragging","mouseMove","mouseUp","zoomMouseWheel","stopEvent","componentRef","_assertThisInitialized","draw","enabled","getPageForChannel","imgLoaded","sizeX","coloredImg","zoomOut","mainCanvas","screenX","screenY","screenW","screenH","moveTo","lineTo","classToUse","rootsideBar","handle","DragIndicator","dragIndicator","withTheme","rootsidebar","ValueLabelComponent","enterTouchDelay","ZStackBar","minZ","maxZ","zsr","onStep","onChangeZ","onChangeZValue","onChangeZSr","playDirection","onPlayPause","barIcon","faLayerGroup","verticalTextfield","sizeZ","playPauseDown","PauseCircleOutline","PlayCircleOutline","stepUp","ArrowDropUp","slider","orientation","stepDown","ArrowDropDown","playPauseUp","ImageInfo","faInfo","infoArea","noWrap","sizeS","scene","ToggleButton","onToggle","toolbarButton","toolbarButtonChecked","Map","toolbarButtonIcon","faInfoCircle","faRuler","faStopwatch","LinearScale","UnfoldMore","PersistentStorageContext","withPersistentStorage","persistentStorage","PersistentStorageProvider","loadedProjectState","projectState","projectTypeState","saveProjectTypeValue","loadProjectTypeValue","loadAll","ResultTabContext","withResultTab","propsWithoutClasses","_objectDestructuringEmpty","resultTab","ResultTabProvider","getPosition","rendererCtx","getScale","selectedRoi","selectedChildIndex","changeFile","hundredTiles","rendererInitialized","rendererCanvas","zoomLevelFixed","gridExists","resetPressed","selSampleSet","fileChange","getSelectedRoi","setSelectedRoi","getSelectedChildIndex","setSelectedChildIndex","getSelectedStructure","getChangeFile","setChangeFile","getHundredTiles","setHundredTiles","getRendererInitialized","setRendererInitialized","getRendererCanvas","setRendererCanvas","getRendererCtx","setRendererCtx","getZoomLevelFixed","toggleZoomLevelFixed","setZoomLevelFixed","getGridExists","setGridExists","getResetPressed","setResetPressed","getSelSampleSet","setSelSampleSet","getFileChange","setFileChange","toBase","base","symbols","decimal","conversion","Renderer","createBackgroundPattern","backgroundPattern","patternContext","canvasId","mouseup","mousemove","lastX","lastY","loadObject","showFullscreen","displayTimeBar","displayZStackBar","showZStackBar","checkMiniMapVisivility","mousePos","getMousePositionInImage","keepRendering","reset","loadAllTiles","getMousePosition","mousePosition","mouseY","getPointInCanvas","p3","getPositionInImage","X","Y","getPointInCanvasCoord","tp","mousedown","button","isChained","_Object$values","splitscreenFileIds","fDragStart","rendererDict","_Object$values2","chainListFileIds","altKey","tempChainToggle","onChangeChain","splitscreenIdx","mouseBusy","mouseOnCanvas","middleMousePos","dragROI","drag","resizeROI","resize","_Object$values3","fPt","chainMouseDrag","_Object$values4","zoomMoveActionDebounced","lastMoveTime","mouseEnter","mouseLeave","centerX","centerY","handleMouseUp","onScaleOnly","wheelDelta","detail","zoomDirection","zoomValueOut","isActive","activeFileId","zoomTo","returnValue","zoomPoint","_Object$values5","chainMousewheel","_i6","_Object$values6","leaderZoomPoint","miniMapZoom","tpt","miniMapRef","_i7","_Object$values7","initialScale","zoomMoveAction","chainMoveTo","_i8","_Object$values8","_i9","_Object$values9","pushColoredImage","colImg","complete","preloadNextFrames","sizeT","preloadFrame","preloadNextZFrames","playDirectionZ","zoomToFactor","scaleTarget","zoomOriginal","zoomOneToN","zoomFit","canvasTranform","imageSmoothingEnabled","zoomObject","zoomRoi","zoomLeft","zoomRight","zoomTop","zoomBottom","inDebounce","updateZ","updateGlobalZ","updateT","updateGlobalT","drawVisibleImage","dt","lastFps","fps","newT","sr","playingZ","newZ","imgRegistered","initializedZ","Infinity","visX","visY","_i11","_visX","isLoadingTiles","changingFile","compositionModeFluor","parentlv","imgOld","requestAnimationFrame","globalAlpha","showScaleBar","scaleBarData","scaleFactor","scaleWidth","stopLineHeight","fontMargin","font","textBaseline","fillText","nowTime","setZoomLevelForGridSize","gridSize","updateFLChannels","onPlayPauseZ","onSeek","onChangeT","onChangeSr","onStepZ","keyExtender","getLayoutElement","hideMiniMap","showMiniMap","hideRestrictions","saveString","miniMapKey","showImageInfo","showZoomBar","showFileNavButtons","Popper","transition","TransitionProps","Fade","splitscreenCount","toolbarButtonRootSingle","toolbarButtonRoot","rightSpace","fileNavLeftBtn","openPrevFile","KeyboardArrowLeftIcon","fileNavRightBtn","openNextFile","KeyboardArrowRightIcon","previewWidth","previewHeight","tMin","tMax","selectedROI","limitVisibleRegions","layerTrees","previewRectChanged","startY","showObjectIdx","miniMapReady","showTimeBar","showResultTable","updateCounter","visibleRegionsLimit","visibleRegionsRadius","structureRegionLimits","slowestStructureIdx","fastestStructureIdx","fileIdStateData","lineIdx","selROI","setNewSelRoi","callbackCounter","oldVisibleRegionCount","gridTileCount","tempLayer","prevState","oldFileId","newFileId","heatmapContainer","resizableContainer","FileRenderer","fileViewer","FileViewerContext","histogramConfigs","setHistogramConfigs","omeDict","setOmeDict","currentFileId","loadImage","nChannels","setRendererDict","tZoomROI1","zoomROI","ToggleButtonFV","disableinteractive","oldPreviewWidth","oldTreeWidth","setPreviewWidth","setTreeWidth","setOldPreviewWidth","setOldTreeWidth","treeWidth","updateDimensions","toolbar","overflowX","buttonGroup","buttonStyle","textButtonStyle","toolBar","openAdjust","setOpenAdjust","rendererRef","onSaveScreenshot","triggerZoomAction","disabledisableinteractive","ZoomOutMapIcon","ZoomOut","fileBox","imgContainer","ImagePreview","setFileList","enterDelay","setEnterDelay","imageRefs","selectedFolder","calculatePreviewHeight","element1","elemHeight","clientHeight","LazyLoad","draggable","onDragStart","dataTransfer","setData","setSelFile","RecursiveFolderEntity","entity","dirContent","setDirContent","FolderEntity","setSelFolder","endOfPath","FolderOpenOutlinedIcon","InsertDriveFileOutlinedIcon","Foldertree","topLevelEntities","setTLEs","setExpanded","openFolder","setOpenFolder","entities","nodeIds","tle","dropfieldRoot","rendererGridRoot","splitscreenGridRoot","activeIndicatorBorder","attachButton","setSplitscreenFileIds","setActiveFileId","showSplitscreenDropzone","setShowSplitscreenDropzone","containerKey","setContainerKey","zoomObjectDict","setZoomObjectDict","keyDown","handleFileChange","onmousemove","_rendererDict$activeF","savedT","handleSavedZoomObjects","zoomData","structuredClone","dropTriggered","fetchFileId","addToSplitscreen","removeRenderer","dict","getFileUuid","fileIds","currentIdx","flexBasis","onDragEnter","onDragLeave","onDragOver","onDrop","getData","onDropFile","setActiveView","ids","activeId","onExcludeSplitscreen","FileToolBar","toDataURL","screenShotName","StepProjectModuleSelection","searchText","imageListItemRefs","isInView","imageList","getAttribute","handleImageListScroll","parentTop","parentHeight","elTop","onChangeName","onSaveName","isHistoModule","TextValidator","errorMessages","validators","onFocus","FormHelperText","imageListRef","searchContent","projectProperties","toSearch","availableType","WIP","expiringMarker","expirationDate","expiredMarker","expiresInDays","titleBar","ProteomSettings","projectStringProperties","onChangeMetaData","paddingContainer","formItem","Channel","Proteome","hidden","FormLabel","RadioGroup","Continues","Discontinues","EpitopeLengthMax","EpitopeLengthMin","numberInput","MinScore","StepMetaData","metaField","CreateProjectDialog","newdefaultname","updateProjectFiles","name_array","createProject","projectModel","readableId","tools","handleActiveTabChange","setProjectsPending","nextStep","handleBack","prevStep","renameProject","field","dd","mm","yyyy","licenseStatus","isExpired","firstValidProjectType","uploadFile","completed","LazyRender","maxContainerHeight","elementHeight","_props$offsetElements","offsetElements","containerRef","scrollPositionTop","setScrollPositionTop","containerHeight","setContainerHeight","handleScroll","scrollTop","scrollBottom","_containerRef$current","ProjectActionMode","Update","_dialogContent","FindFilesDialog","_props$formData","_props$onSuccess","dialogIsOpen","handleSubmit","checkFileMappings","allUniquelyMapped","onSuccess","endAdornment","duplicatePath","InputAdornment","ContentCopyIcon","found","CheckIcon","ErrorIcon","newPath","uniqueFiles","mapping","localeCompare","filesFound","duplicates","missing","generateFileList","CustomSvgIcon","vertAlign","xmlns","isolation","fillRule","vectorEffect","strokeWidth","strokeLinejoin","strokeLinecap","strokeMiterlimit","cx","cy","focusable","ProjectsTableRow","handleClick","handleSelectOneClick","onEditProject","onProjectStateClick","loadProjectMessage","jsonResponse","onSetTimedClick","setProjectsTimed","tableRow","canOpen","renderThumbnail","canEdit","ownerName","resultObject","labelFromProjectType","progressBarContainer","bar","creatingJobBar","progressBar","onProjectErrorStateClick","labelFromState","creationDateTime","toLocaleString","duplicateProjects","FileCopyIcon","cancelJob","canRun","TimerIcon","desc","numeric","disablePadding","EnhancedTableHead","createSortHandler","onRequestSort","onSelectAllClick","numSelected","sortDirection","EnhancedTableToolbar","_user$group","_user$group2","onDeleteClick","onRunSelectedClick","onTimedRunSelectedClick","onDuplicateSelectedClick","onMergeSelectedClick","onImportClick","onExportClick","fileUploader","Toolbar","highlight","searchIcon","searchField","spacer","actions","Merge","CloudUpload","lighten","light","dark","ProjectsTable","_React$Component2","tableContainerRef","projectTypesNames","topScrollPos","bottomScrollPos","handleRequestSort","handleSelectAllClick","isJobVisible","selectedObject","selectedIndex","serverIsRunning","handleContextmenu","importProjects","ImportProjectsDialog","_step5","_iterator5","exportProjects","deleteProjects","deleteGalleryExport","projectTypesEqual","selectedProjectId","mergeProjects","_this3$state","idxTop","showJob","countOther","cur","sortedProjects","cmp","stabilizedThis","getSorting","FindMissingFiles","countFinished","tableWrapper","stickyHeader","tableLayout","rowCount","onRunRowClick","darken","incrementDefaultName","maxProjNum","proj","match","projNum","newMaxProjNum","pad","HomePage","checkPythonServer","isLocalServerReady","handleClickOpen","editableProject","handleEditOpen","refreshProjects","activeTabIndex","newDefaultName","refreshProjectsInterval","refreshInterval","listProjects","serverSpinLoader","LicensingPage","_event$target","isSubmitting","javaPath","correctPath","writeAppSettingsLicensing","allValid","dialogString","validationObject","removeErrorStyle","handleCopyLink","navigator","clipboard","writeText","hardwareID","pasteLicenseKeyFromClipboard","readText","licenseKey","readLicenseKeyFromFile","fileInput","fileReader","fileContents","handleAccept","selectedFolderPath","validationMsg","showStoragePathChooser","localhost","readAppSettingsLicensing","statusBlock","OutlinedInput","form","inputField","inputButton","licensStatusContainer","licensingInputArea","textAreaButton","ContentPasteIcon","FileUploadIcon","breakpoints","up","formControl","LoginPage","validateUserOrEmail","userList","valid","trim","isUsername","validateEmail","emailErrorText","testUserList","addValidationRule","getUserList","removeValidationRule","avatar","LockOutlinedIcon","suggested","NavigationBar","checkProjectButton","isResultsButtonVisible","dir_path","walkProjectDirFiles","reportExists","resultsPath","extraButtonState","projectPath","canAccessCases","canAccessScan","canAccessFileView","headline","showDevButtons","scannerState","expirationMessage","setPageHeadline","listen","subscribe","scannerData","expirationDays","contains","titleMap","pathFragment","fullVersion","AppBar","menuButton","grow","newestLogFile","headerButton","WorkIcon","PermMediaIcon","FolderCopyIcon","ScannerIcon","warningColor","toggleClassRoomChat","ScreenShareIcon","handleMenu","Person","Grow","menu","square","ClickAwayListener","onClickAway","MenuList","CoPresent","Build","History","Info","ExitToApp","appbarPlaceholder","mixins","textTransform","transformOrigin","errorColor","PredictionPage","p4","generateParentList","parentList","continueSearch","currentStruct","getParentIndex","generateChildrenList","childrenList","generateAListOfAllChildrenRecursively","hasChild","allChildren","getParentIndexLayer","subtypeLevel","getContainedRegionRois","decendantIds","ProjectContext","withProject","projectContext","ProjectProvider","initProject","initForeignHistory","structuresStateList","showSubtypes","cleanUsersData","timeNow","usersData","updateTime","receiveSocketMessage","syncStructures","receive","fileRoiLayers","newRoiLayers","tempRoiLayer","roiLayer","RBush","initSocket","getAnnotationSocket","onmessage","ev","intervalId","readyState","objectToSend","viewer","setChangingFile","setActiveTab","tab","getActiveTab","getRegionById","getNumberOfChilds","sendStructures","addStructure","grid","newLayerId","dynamic","allToolNames","classFrequencies","class_0","class_1","class_2","class_3","class_4","class_5","class_6","avgClassFrequnecy","defaultSelected","alterStructure","newRoilayer","addSubStructure","fromHistoModule","subStructure","parentColor","subtypeColor","numberChilds","roiIndex","addSubtypeText","addSubType","_this$state4","findChilds","subType","_this$state5","_this$state6","childs","toplevelParentId","structureIndex","roiIdx","subtypesRemoved","parentStruct","toplevelParentIndex","fullChildrenList","currentChildren","updateStructures","newSelectedLayer","_this$state7","pureLabel","copiesCount","duplicateChildren","findChildren","oldParent","newParent","_this$state8","newId","canMoveStructure","structuresSameLevel","_this$state9","strt","ed","allElements_1","lastStructure","idxSwapStructure","otherParent","sceneGUID","roi_layer_a","roi_layer_b","getProjectStringInfos","setStateNow","newState","setAiModelRepository","aiModelRepository","setAiStateObject","aiStateObject","getUserData","setPersistentStorage","commentLayers","isLoadingAnnotations","galleryImageSize","userPermissions","groupPermissions","canEditModel","annotationsReduced","totalRoiCount","getUsersData","ProjectHistoryContext","ProjectHistoryProvider","collecting","past","future","stepType","toSend","itm","roiStructure","processItem","updateState","undoItem","redoItem","shownSaveHintNum","onSaveClick","_this$viewer$props$pr","parentLayerIdx","parentRoiLayer","isSame","sameBoundsWith","_ret","undo","redo","canUndo","canRedo","getHistoryLength","sizeLimitReached","mergedItems","startCollection","addCollection","mergePastItems","Preview3d","addScript","script","async","head","addStyle","initPeptide","updateProtein","selectedRow","shownProteinId","proteinId","getUniprotData","locationMin","locationMax","viewer3D","xmlhttp","onreadystatechange","xmlDoc","responseXML","getElementsByTagName","dbReference","viewerId","childNodes","chainsArr","valueArr","chain","positionsArr","minPos","maxPos","openMolecule","getLiteMolScope","liteMolScope","angular","isolateScope","moleculeId","LiteMolComponent","destroyPlugin","createPlugin","loadMolecule","sequenceAnnotation","loadSequenceAnnotation","colorChains","selectionDetails","entity_id","struct_asym_id","start_residue_number","end_residue_number","highlightOn","initLiteMolScope","ready","litemolelem","bootstrap","liteMolElement","angularScript","replaceWith","view3d","hiddenView3d","centeredRow","ProteomeSideBar","handleTabChange","forceSidebarUpdate","faDna","faCog","changeProjectName","saveAndRunProject","ProteomResultsHead","ProteomResults","allRows","score","proteinName","proteins","createRow","setSelectedRow","handleEpitopeRowClick","epitopes","collapsed","isCollapsed","epitope","tempRow","epitopeRow","ProteomToolBar","downloadPath","downloadReport","topTools","bottomTools","onSave","ProteomeViewer","projectData","loadAnnotationsObject","saveFunction","createProjectModel","nameChanged","projectName","outerContainer","ToolBarContainer","SideBarContainer","PreviewContainer","Report","chartFolderPath","loadReport","workbook","XLSX","read","SheetNames","Sheets","Sheet1","A1","sheets","sheet_name","utils","sheet_to_json","header","raw","abc","sheet","rowLength","lastContentIdx","cell","addRow","unshift","_step3$value","array_sheets","tab_name","resultTabContent","array_sheet","Datasheet","valueRenderer","onCellsChanged","chart","renderReportChart","boxSizing","ScanViewerContext","withScanViewerContext","scanViewerContext","ScanViewerProvider","setLenseType","lenseType","setAdapterType","adapterType","changeScanState","scanState","changeTab","slideScanning","commentCount","_this$io","connected","emit","setScanRendererSize","changeMicroscopeParams","paramJson","changeImportParams","importFilePath","moveCenter","sendMinimapClickPosition","sendFilePath","filePath","tabIdx","exportWIP","importWIP","filepath","createWSI","setWhiteBalanceState","setVignetteState","setFeaturePointsState","numFeaturePoints","toggleCamera","cameraVisible","toggleMinimap","mapVisible","toggleGrid","gridVisible","toggleDebugData","debugDataVisible","toggleComments","commentsVisible","toggleFluorescence","sideBarContent","updateFluorescenceParams","toggleAutomation","automationVisible","toggleFocusPeaking","focusPeakingOn","deleteScanArea","deleteArea","centeredX","y1","centeredY","y2","zoomIn","zoomReset","exitScanner","useAutomatedMicroscope","command","automatedMicroscopeStatus","streamReady","selectedChannel","cameraMinFramerate","cameraMaxFramerate","cameraMinExposureTime","cameraMaxExposureTime","cameraMinGain","cameraMaxGain","cameraMinGamma","cameraMaxGamma","cameraMinBlackValue","cameraMaxBlackValue","pixelSizeCamera","cameraColorMin","cameraColorMax","getScanSocket","message_content","cameraVisibleValue","mapVisibleValue","gridVisibleValue","debugDataVisibleValue","commentsVisibleValue","automationVisibleValue","focusPeakingOnValue","sideBarContentValue","ScanStream","streamKey","deleteAreaStyle","imageSrc","setImageSrc","imgStyle","ScanMinimap","onMinimapClick","parentRect","minimapRef","handleDrag","ui","defaultPosition","streamImg","cameraSettings","heading","info","recordVignette","fluorescenceSettings","startScan","duringScan","pausedScan","saveSettings","ScanComments","texts","count","cardStyle","cardContentStyle","gutterBottom","cardActionsStyle","previousButtonStyle","nextButtonStyle","closeButtonStyle","ScanDebugData","debugDataList","debugDataKey","debugDataValue","mainStream","minimapStream","debugDataContainer","setDeleteArea","mouseState","setMouseState","setDebugDataList","deleteAreaRef","mainStreamRef","onbeforeunload","cleanup","computeRendererSize","onMouseWheel","data_list","setDeleteAreaEnd","getGridPoint","clickPoint","setDeleteAreaStart","movementY","CustomSelector","errorValue","sliderContainer","SelectFileDialog","updateCurrentFiles","currentFiles","onListItemClick","fileFormats","validateFilePath","onChangeFileName","fullFilePath","selectedExtension","changeFilePath","inputIsValid","getFileMetadata","numTimePoints","handleCancel","whiteBalanceState","handleConfirm","lenseParams","adapterParams","onConfirm","dialogTitle","resultFileRow","folderPathText","resultFileName","extensionDropDown","fileFormat","contentBox","upButton","listItem","fileIcon","vignetteRow","whiteBalanceCheckbox","checkboxLabel","OpticsRow","OpticsSelector","infoButton","scanPreview","selectFileButton","ScanToolBar","fileDialogOpen","sidebarVisible","onToggleSidebar","elem","showWIPIcons","_this$props$scanViewe","toolbarButtonActive","Pause","PlayArrow","Videocam","GridOn","BugReportIcon","Comment","Flare","VideogameAsset","BlurOn","RestartAlt","inactive","CustomSlider","onSliderChange","onDoubleClick","onSliderchangeComitted","InfoIcon","ScanMicroscopeSettings","vignetteState","lightSourceParams","sliderParams","red","green","blue","sendParams","frameRate","minKey","maxKey","standardValue","exposureTime","gain","blackValue","lightSource","textButton","Stop","automationTextfield","automationButtonContainer","automationButton","Link","LinkOff","HdrAuto","LockOpen","ArrowLeft","ArrowRight","CenterFocusStrong","Home","automationTextfieldContainer","stepsize","velocity","automationLongTextfieldContainer","gcode","textfieldNumber","featurePointRow","ScanFluorescence","addChannel","channelName","emitParams","selectChannel","deleteChannel","buttonSelected","buttonUnselected","listItemSelected","listItemUnselected","ChannelTextField","ScanViewer","rendererContainer","ScanRenderer","toolBarContainer","sideBarContainer","SettingsPage","ELineChart","initChart","mainChartDataShown","showRawSpectra","showAnalysisResults","requestData","chartDom","myChart","chartRef","setChart","topContainer","toolBarBorder","SpectraViewerContext","withSpectraViewer","spectraViewer","SpectraViewerProvider","setContextState","object","updateAreas","areas","refs","toggleSavedCalcs","useSavedCalcs","setMaxScores","availableSamples","rawSpectra","maxScores","sortPCAs","valueToSortBy","temp_pcas","pcas","pcaOrder","selectedSpectrum","operationSets","rawSpectraLoaded","selectedPca","selectedPcaId","focusedPca","scores","approximations","analysisResults","analysisResultsLoaded","selectedPcaScore","selectedProcessedSpectrum","currentlyShownData","ratedSpectra","selectedModelIdx","selectedModelName","passingCriteria","passingCriteria_idx","passingCriteria_min","passingCriteria_max","spectraPredictionSettings","FileParamForm","onFileParamChange","paramName","fileParams","fileParam","onUpdateFileParams","fp","subName","concentration","concentrationsOk","concentr","tmp","setInitialized","paperContainer","Input","LocalHorizontalResizeBorder","lastPageY","initPageY","bottomBorder","newHeight","resizeHeight","targetHeight","borderHeight","descendingComparator","getComparator","comparator","headCells","headCell","visuallyHidden","CustomResultTable","tableHeight","isAsc","clip","SpectraBottomTableResults","r2","rmse","used_scores","preprocessing","mainContent","SpectraLeftTableResults","meta","measurement","ResultChart","resultChart","ecStat","regression","chartType","xAxisLabel","yAxisLabel","serie","datasets","substances","predictedConcentration","lineData","legend","axisLabel","showMinLabel","showMaxLabel","initChartType","chartTypes","chartObject","CHARTTYPES","SpectraResultCharts","setCurrentlyShownData","resultChartTypes","onUpdateResultChartTypes","onRemoveChart","TooltipTable","SpectraTab","statusIcon","spectrum","isTemporary","arrow","Timeline","HourglassEmpty","spectrumRating","spectrumWithinTolerances","ratedSpectrum","pass","rating","interactive","ErrorOutline","CheckCircle","Cancel","toggleAll","toggleLegend","updateChartData","operations","int","minMax","quant","std","vec","OperationsTab","coordRange","onAddOperationsSet","operationSetsCopy","onRemoveOperationSet","onAddOperation","operation","lastSet","toAdd","onChangeChip","setIdx","onApplySettings","throwError","onEnterArea","tempAreas","dispatchAction","applyContainer","applyMainContent","short","operationButton","chipIndikation","operationSet","operationSetRow","chipContainer","removeIcon","Remove","hideRemove","hideAdd","labelValue","deleteIcon","onKeyUp","xAxisData","stepX","applyBottomContent","textAligne","listStyle","criteriaUpperBound","selectionContainer","minMaxInput","ModelTab","selectionContainerRef","tabScrollPosition","scrollContainerHeight","onPCASelection","onModelSelection","selectedVersionIdx","modeltype","_model$versions$model","substance","oldSettings","foundIdx","onPcaAnalysis","onPredictSpectrum","pcaStats","pca","features","Radio","modelStats","_model$versions$model2","_model$versions$model3","subst","datetime","handleChangeCriteriaLimits","handleChangePredictionSettings","handleChangeManualXRange","xValueMinMax","passingCriteriaSettings","_spectraViewer$passin","targetIndex","criterium","spectraPreditionSettings","_spectraViewer$spectr","_spectraViewer$spectr2","setXRangeManually","_spectraViewer$pcas","_spectraViewer$models","_this$props3","SwapVertIcon","returnHome","AnalysisTab","graph_names","visbilityButton","iconOn","iconOff","onApproxToggleVisibility","checkForChecked","checkForAnyChecked","approximation","orig","pre","approx","resid","SpectraSideBar","faChartArea","faCheckCircle","faChartLine","tab_no","SpectraToolBar","topContent","toggleLeftTableContainer","bottomContent","SpectraViewer","simpleParams","legendData","windowSize","gatherAllCriteria","criteria","requestType","_this$props$spectraVi","useAll","areaSet","selectedSpectrumId","limits","requestSpectraData","rated_spectra","structurePcaAnalysisResults","showPredictionResults","predictedSpectra","model_data","setSeries","backendStatus","total","_score$symbol","symbol","character","_approximation$symbol2","_approximation$symbol3","_approximation$symbol4","rawSpectrum","_approximation$symbol","original_data","approximated_data","orig_data","spectra","_tmpSpectra","tmpSpectra","existingNames","validateDatasets","animation","containLabel","toolbox","yAxisIndex","brush","saveAsImage","itemSize","iconStyle","xAxisIndex","brushLink","outOfBrush","colorAlpha","dataset","handleMainTabChange","activeMainTab","leftTableWidth","bottomTableHeight","leftTableContainer","setParentState","borderBackground","bottomTableContainer","LocalizationProvider","dateAdapter","AdapterDateFns","DesktopDatePicker","inputFormat","maxDate","minDate","firstDate","updateTable","isSameDay","someDate","compareDate","navButton","setDate","NavigateBefore","DayPicker","NavigateNext","inlineBtn","MuiVirtualizedTable","_React$PureComponent","getRowClassName","onRowClick","cellRenderer","cellData","columnIndex","headerRenderer","headerHeight","tableProps","AutoSizer","gridStyle","rowClassName","_ref6","dataKey","Column","headerProps","PureComponent","VirtualizedTable","userActions","userAction","DayPagination","downloadUserActions","rowGetter","_ref7","setUserActions","setFirstDate","getUserActions","UserHistoryTable","HistogramScale","hexToRGB","alpha","validateGamma","ChannelsConfig","omeChannels","low","high","Histogram","handleColorPickerClick","selectedSingleChannel","selectedChannels","handleColorPickerClose","handleColorPickerChange","channelIndex","newHistogramConfig","forceUpdateWithTimeout","activateAllChannels","validGamma","singleChannelMode","channelSelectMode","leftGammaValue","gammaFunction","rightGammaValue","changeChannelSelectMode","updateChannels","changeChannel","onExportHistogramParameters","strData","onImportHistogramParameters","selectedCs","loadedConfig","stateToSet","newStateObject","stateGamma","originalHistogramConfig","getEnabledChannels","histograms","lastClickedChannel","sliderMode","calcHist","drawGammaLine","dimensions","histo","histo2","sum","backgroundCanvas","bitDepth","visibleStep","maxValues","transformedCount","gammaCanvas","handleMinMaxRange","leftSide","rightSide","middleBarActive","new_min","new_max","updateRange","leftBarActive","rightBarActive","drawHistogramBackground","leftGamma","handleGammaChange","blur","rightGamma","channelsArray","initData","toolButtonRight","handleReset","faUndo","toolButton","handleLogLin","handleMinMaxFit","faArrowsAltH","handleBestFit","chartContainer","renderHistogram","gradientBar","slider1","sliderGamma","slider2","actionButton","ToggleButtonGroup","toggleContainer","toggleBtnContent","channelLabel","rangeSlider","withAllViewerContexts","withProjectHistory","students","ClassroomChat","classRoomChatWidth","student","inline","CroppedImage","roI","validateZ","globalZ","findVisibleRois","pd","parentLayerIndex","activeTool","areAllImagesComplete","allComplete","imgLeft","imgTop","canvasFactor","getRoiStructureId","getClassificationStructure","handleCanvasClick","automaticTraining","classificationId","setSelectedWithKey","updateGallery","classificationStructure","roiWasSubtype","bufferRoiId","nativeEvent","which","getNuberChildRois","startData","alruns","enoughAnnotations","startAutomaticTraining","giveWarning","allImgsAnnotated","_this$props4","allImagesLabeled","setFUllyAnnotated","setAnnotated","minFive","twoAnnotated","enough","handleCanvasMouseDown","_this$props5","drawingEnabled","canvasFactor1","mouse","gallery","_this$props6","points","mousepos","_this$props7","posInRoiLayer","positionInLayer","setObjectToLoad","handleMouseLeave","_this$props8","handleMouseEnter","_this$props9","_this$props10","onZStep","zoomSpeed","imgBoundWidth","actTool","previousPageIndex","loadedCount","fullyLoadedCount","imgs1","visibleRegions","_this$props11","scroll","zoomSp","imgBoundHeight","_this$props12","drawLayer","imgBottom","imgRight","factorPyramidLevel","factor_w","factor_h","xBound","yBound","boundWidth","boundHeight","xTile","yTile","rows1","cols1","objectToLoad","vImg","_y","sX","sY","sWidth","sHeight","x1D","y1D","wD","hD","imageForCanvas","fktWidth","fktHeight","contour","drawCustomCursor","ctxOv","canvasOverlay","drawCrosshair","crosshairLineWidth","lineLength","linePostion","widthHeight","crosshairColor","crosshairOpacity","_this$props13","drawMode","pixelSize","unit","physicalSizeXUnit","canvasWidthString","zBar","zStackIcon","zStepUp","zStepDown","SceneImage","handleImageClick","classId","selectedInGallery","getColorFromId","getParentColor","galleryMounted","showFileNames","AccuracyGraph","cWdt","GalleryToolBoxes","getProjectLabel","isScrollbarVisible","onResize","toolbarSize","handleChangeContour","setDrawContour","showContour","handleChangeShowFileNames","setShowFileNames","handleChangeCombo","setFirstTimeGallery","getStructuresForDropDown","findParentIndex","handleChangeFilteredStructure","emptyIdx","onSelectLayer","handleChangeCrosshair","fromKeyPress","setDrawCrosshair","handleChangeActiveTab","setAutomaticTraining","startTraining","activeLearning","trainingWarning","findClassificationChilds","saveChangesGallery","setAlruns","passiveLearning","applyDL","numberElements","applyModel","handleChangeMakePredictions","setApplyModelAfterTraining","checkToolInConfig","toolName","originalToolbarHeight","comboBoxSizeOptions","showGallery","childsGallery","setCrosshairColor","setCrosshairOpacity","setCrosshairLineWidth","galleryType","comboBoxSizeValue","Resizable","resizeHandles","toolBox","Mouse","Keyboard","tabsContainer","progressText","trainingAcc","setStartData","makePredictions","defaultChecked","ChatBubbleOutline","flexVerticalContainer","flexFlow","flexRowContentHeight","flexRowRemainingHeight","aiLabel","imgOuter","Gallery","drawContour","allImagesLoaded","allImagesComplete","fromChangePage","fromMount","loadedRois","pg","rowsPerPage","isRoiSubtype","setElementCount","elCnt","childNames","findAllSubtypes","elementCount","childIds","setDynamicStructure","dynamicIndex","setAnnotationsContext","lenStructures","setSubtypesPagesContext","allChilds","setSubtypeValues","twoSubtypes","selectNewImage","selectNewRoi","selectNewFile","roiLay","idxSelRoi","childLabels","subtypeRois","idxInSubtypes","nextRoi","idxNextRoi","visibleFiles","deleteSelectedRoi","idxNext","handleChangePage","onGallerychangePage","checkIfLoadNewObject","scrollToTop","prevStr","handleChangeRowsPerPage","pageInput","numObjsInLayer","getNumberOfElements","numEls","classifyImageWithKey","classifyRoiWithKey","classifyFileWithKey","_this$props14","currentRoi","_this$props15","classifyTilesGalleryWithKey","_this$props16","setPageSelectedRoi","_this$props17","enoughAnnosCount","handleDivMouseDown","handleDivMouseUp","_this$props18","prps","_this$props19","childColors","isFileSubtype","fileClassId","_this$props20","setProgress","validationAcc","filterObjects","renderCroppedImage","onRefresh","number","visImgs","indexOffset","fromAI","renderSceneImage","imageSize","getRowsPerPageForProject","canvasSize","_this$props21","_this$props22","selectedObjects","nextProps","_this$props23","clr","selObjCord","selObjs","indexLayer","setLayer","updateProject","commentLayer","allRoiLayers","viewerConfig_project","updateFileClasses","_tools$iam_ai_inferen","_this$props24","_this$props25","classificationFiles","iam_ai_inference","onParameterChange","toolTipCircularProgress","roisForImages","displayedFiles","alignContent","onScroll","maxHeigth","TablePagination","labelRowsPerPage","rowsPerPageOptions","getRowsPerPageOptionsForProject","backIconButtonProps","nextIconButtonProps","onPageChange","onRowsPerPageChange","labelDisplayedRows","OverlaySlider","update","checkedUp","upperListValue","lowerListValue","fileCheck","checkedLow","handleUpVisChange","handleLowVisChange","setOpacity","handleUpMenuChange","setActive","handleLowMenuChange","handleCheck","lowValue","fullscreenFileIds","fsChain","upperArea","upperList","lowerArea","lowerList","sliderDiv","upFormcontrol","lowFormcontrol","lowButton","chainButton","LinkIcon","LinkOffIcon","getAriaValueText","VerticalResizeBorder","resizeSideBar","Tools","NONE","RECT_ROI","PEN_ROI","MAGICWAND_ROI","REGIONGROWING_ROI","REGIONGRABCUT_ROI","REGION_ROI","RECTANGLE_ROI","COMMENT_ROI","ELLIPSE_ROI","COPY_ROI","SELECTION_ROI","FILTERANNOTATIONS_ROI","PLOTNEAREST_ROI","FILL","IAM","AL","AITRAINING","GRIDTOOL","GRIDANNOTATIONTOOL","SELECTION_Tile","POINTCOUNTING_Tile","LANDMARK","STREAMVIEW","HEATMAP","ROIRESIZE","VerticalToolBar","setToolBarWidth","handleEscKey","viewerToGallery","containerElement","topElement","bottomElement","verticalToolBarWidth","topHeight","bottomHeight","resultWidth","updateToolBarWidth","keyCode","onChangeTool","exportAllFiles","fileIDs","exportGallery","str_1","str_2","showMessage","exportCurrentFile","setStructureIds","setZLevelforRois","zLevelClassification","ApplyModel","onStartTraining","openAITrainingPopUp","onToggleLayoutItem","allScenes","onToggleTimeBar","show3DViewer","onToggle3DViewer","onToggleMeshView","showTilesGallery","onZoomDelta","onZoomFit","onZoomOriginal","onToggleSideBar","annotationsAreReduced","showZoomLevels","showUndoRedo","showSaveTool","showToggleSideBar","isImporting","onToggleGallery","setGalleryTool","changeToSelectedFile","faBraille","onToggleTilesGallery","FilterAlt","onToggleFullscreen","FullscreenExitIcon","FullscreenIcon","faPlus","faMagic","tool","AllOutIcon","RadioButtonCheckedIcon","REGIONSAM_ROI","faTh","faChartBar","toolConfig","InlineSVG","aiUsedStructures","structureName","selectedVersion","faPlayCircle","onSaveImages","faFileDownload","toolBarRow","onToggleOverlay","showOverlay","FlipIcon","PinDropIcon","onToggleWindowTool","showWindowTool","SelectAllIcon","CastIcon","onZoomOneToN","UndoIcon","RedoIcon","ResultTable","updateResultTable","percentageNumber","getPercentageAndNumber","percentage","numberObjects","structuredTableValues","percNumb","numberParentObjects","renderRow","structureIdx","tableSize","getDist","pointA","pointB","getPointByPlaceInCurve","startIndex","place","distAr","indexA","indexB","dist","getCurveDistances","distSum","_getStartInterpolPoin","absPlace","accLen","distIndex","absPlaceDist","getStartInterpolPoint","indA","indB","pA","pB","linearInterpol","pStart","pEnd","tStart","tEnd","getFigure","figureA","figureB","startPointIndA","startPointIndB","figAIsClockwise","figBIsClockwise","pointsCount","t2","figure","clockwiseSignA","clockwiseSignB","xInd","xB","predictStartPointIndex","xMin","xMax","yMin","yMax","pInd","minDist","startPointIndex","anchorPoint","getVec","traversalPolylineClockwise","fig","ind","theMostLeftPointIndex","aNext","aPrev","vPrev","vNext","TimeChart","keyFrames","frameWidth","interpolatedIntervals","keyFrameEls","keyFrame","keyFrameElSize","intervalEls","intervalElHeight","stepWalker","stepLeft","timeCounter","modePanel","interpolate","framerate","playButtons","playPauseForward","playPauseBackward","stepRight","resizeTongue","resizingLine","TimeLineTool","setPosByMouse","handleInterpolation","frameArray","curT","findLayer","isKeyFrame","prevKeyFrame","searchPrevKeyFrame","nextKeyFrame","searchNextKeyFrame","regionRoisStart","regionRoisEnd","figureCount","frame","frameArrayItem","getOrCreateFrameArrayItem","getOrCreateRoiLayer","figureIndex","figureStart","figureEnd","startPointIndexA","startPointIndexB","interpolatedFigure","requiredLayer","handleResizeMouseDown","isResizing","resizePos","handleResizeMouseMove","newResizePos","resizeTimeLine","handleResizeMouseUp","coordX","innerContainer","clientLeft","newRoiLayer","frameSeparatorColor","bgImage","frameIndices","frameIndex","frameInfo","addLength","backgroundImage","timeLineHeight","renderContent","colors","heatmap","h337","gradient","maxOpacity","minOpacity","updatePreviewRect","setPreviewRect","previewRect","updatePreviewRectSize","updateObjectMode","objectMode","UNSAFE_componentWillReceiveProps","landmarkLayer","landmarkLayers","toolMouseForward","selectedId","selection","classify","classifySelectedRoi","newROI","onChangeROIs","setHeatmapData","maxValue","showHeatmap","heatmapData","preventMiddleMousePos","onCanvasMouseMove","onCanvasMouseLeave","updateFrameArray","hoverROI","centerROI","transformLandmark","landmarkRois","transformLandmarkNoOffset","transformAnnotation","newRegionList","_step7","newRegion","_iterator7","temp","newRoi","generateTransformationOffset","origCenter","generateLandmarkTransformation","targetId","baseOme","calculateTransformationMatrix","tOffset","offset","pushRegTile","mat","Img","changeHiConfig","resultTabActive","centerRoi","selRoi","roiItem","setNextTile","pt2","zoomInRoi","pt1","tzoomROI1","setSubtypeRois","_loop4","_i10","findRoiLayer","strs","parentLayerRois","doubleObject","doubleObjectIndex","parentRoi","newArray","_step8","_iterator8","updateVisibleROIDebounced","moveAnnotations","_step9","_iterator9","_step10","_iterator10","_step11","_iterator11","_i12","_loop5","rr","rRoi","serachParams","structureHasRois","showSubstructure","subtypeHasSubstructureParent","hasStrParent","fillstyle","findColor","ptrn","createPattern","patternScale","boundsAreaCompare","getDynamicRegions","_step23","_iterator23","showGridLabels","txt","tempStrokeStyle","tempLineWidth","_step21","_iterator21","_step24","getRectRegions","_iterator24","layerRois","_step22","_iterator22","_loop6","getPointOnPoly","textToShow","_step25","_iterator25","commentRois","angle","vector","atan2","wrapText","showMarks","linelength","drawUsers","windowToolRef","_i18","_Object$values10","userData","userName","textWidth","arrowCoords","_i19","_arrowCoords","_step26","_iterator26","words","testLine","measureText","getChildsofStructure","withMouse","parentIndexLayer","idxStr","strToUse","nextFileId","getNextFileId","automaticFileChange","inxCurrentFile","rendererKeyDown","keyDownSelection","isTilesToolUsed","hasLayerTileNames","scaledWidth","scaledHeight","minSize","maxSize","setPreviewSize","newSize","prevW","prevH","preview","frameArrayDict","initFrameArray","updateExistingStructures","applyFrameArray","loadFrameArray","_step27","updatedFrameArrayFrame","_iterator27","getClearedRoiLayer","prevT","prevZ","curZ","prevFrameIndex","storeRoiLayersToFrameArray","removedStructures","_step28","_iterator28","existingStructures","_step29","_iterator29","_loop7","layerId","oldFrameIndex","getRemovedStructures","removeLayersFromFrameArray","flipRoiLayers","histoModule","clearRoiLayers","loadedAnnotationsCounter","MuiAccordion","MuiAccordionSummary","MuiAccordionDetails","usableModels","SideBarTabAISelectByModel","formDataAICockpit","aiCockpitLoaded","updateModelCheckboxes","modelIsSelected","selectedModels","checkboxesChanged","modelIsDisabled","modelIsChecked","usableStructures","usableStructure","structureIsChecked","isChecked","structureIsDisabled","updateSelectedTool","availableModels","availableModelsForStructure","getAvailableModelsForStructure","fullStructure","structurePath","findParentId","usableStructurClone","updatePersistentDefaultModels","expandedIdx","setAiUsedStructures","selectedLayerIdx","currentDefaultModels","handleExpandingChange","export","WeightsName","delete","initAIFormData","toggleModel","handleChangeModel","structure_indices","structureNameArray","handleModelChange","SideBarTabAI","convertStructures","convertedStructures","setFormDataAICockpit","setAIFormData","checkForAvailableIAMSubtype","findClassificationSubtypes","hideSubtypes","selModel","handleChangeVersion","versionName","modelStructure","modelIncludesSubtypes","visibleVersions","selectedDropDownVersion","lastSubtype","initModelCounter","_this$props$projectCo","getOnlineModelsContainer","Refresh","thickness","modelsInitialized","tabContainer","accordionContainer","showFirstAccordion","toggleShowFirstAccordion","tableContainer","spinnerContainer","modelSelectionContainer","ListItemOptionsMenu","optionsAnchorEl","handleOptionsOpen","handleOptionsClose","roiRegions","arrayIn","downloadArrayAsFile","drawRegions","nonOverlapping","overlappingRois","intersecting","PlaylistAddIcon","ArrowUpwardIcon","ArrowDownwardIcon","ListItemSubType","textFieldRef","visibilitySubtypesOff","visibilitySubtypesOn","itemClicked","updateStructureChange","adaptRois","newName","onChangeLayers","updateViewer","renderLocation","drawDivider","classificationChilds","numberOfObjects","listItemRef","updateFormDataStructures","selStructures","disableUnderline","ArrowDropUpIcon","ArrowDropDownIcon","parLayer","ListItemStructure","selectStructure","textInputRef","setTextInputRef","structureInput","SideBarTabRois","structureScrollList","handlestructureListScroll","countVisibleStructures","dynamicStructureText","focusTextInput","isStructureAndShown","selectedStructureView","isSubtypeAndShown","onChangeStructureView","structuresListHeight","structureRefs","isAdmin","annotatedStructureCount","structureLayer","tabContent","onExportParameters","onImportParameters","onCenterROI","onHoverROI","summary","onChangeOpacity","roiContainer","FileTreeView","overflowListRef","missingThumbnails","currentSceneFilterIdx","scrollPosition","fileGroups","fileNames","selectedPath","scenes","maxSceneIdx","fileTreeView","excludeAllContainer","projectsToExclude","projectsToInclude","filesList","fn_index","fileItem","labelWrap","sceneFile","f_id","sceneName","previewImageSelected","previewImageInSplitscreen","previewImageNotSelected","previewImage","sidebarHandle","closeButton","expensionSummary","SideBarTabView","isMounted","onChangeChannels","histogramContainer","ScoringMatrixHistoClassification","UNSAFE_componentWillMount","selSample","store","selId","parentIdxSelStructure","getAbbreviationOfStructure","strWithBracket","isCriticalOrSelected","isStructureCritical","numberTiles","totalClassFrequencies","mean","setAvgClassFrequ","criticalClass","avgClassFrequency","subtractFrequencyClass","addFrequencyClass","fClass","newSelChildIdx","warningWasShown","warningStr","handleChangeSelectedStructure","idxNewSelectedStructure","resetStructures","selectRow","childIdx","renderSubtypeRow","rowFrequencyClass","renderFrequencyClasses","isSelSampleSet","ScoringMatrixHistoPointCounting","getCount","blockClassifyTile","classifyTile","getTotalCount","classifyTileWithkey","keyNumber","canCallClassifyTileWithKey","structureForClassification","isTileClassified","tileHasStructureClass","indexSubtype","fromRendering","emptyId","numberRois","renderMatrixBottom","renderMatrixHeader","HistoClassififcationLabels","SideBarTabResults","gridtool","setSelectedSampleFromFilename","sampleAbbr","sampleLabel","exists","changeSample","isHistoClass","isHistoPntC","setRoiItem","createGrid","resetRoiLayers","sortSlides","savedRoi","numberRegionRois","selectiontile","checkIfSkipped","setClassToZero","startHistoPointCounting","setGridSize","pointcountingtile","totalCount","onPause","saveToJSON","blockPrevious","onPrevious","previousHistoClassification","previousHistoPointCounting","prevFileId","getPrevFileId","lastTileIndices","roiFile","blockNext","nextButtonDisabled","nextHistoClassification","nextHistoPointCounting","id_range","getRoiLayersIdRange","roi_min","roi_max","indicesObject","isLastClassifiedTile","classifiedTiles","idxLastTile","blueTilesClassified","onEnd","renderGridTool","noConfig","renderConfiguration","dynamicStructureAbbrText","newSubstructureLabel","addSelectedStructures","structuresToAdd","showLabelsToAdd","getCurrentFileInx","startOrContinueText","nextOrSkipText","isLastFile","_this$props26","lastTileClassification","lastTileCounting","labelWithBracket","getOtherLabels","_this$props27","sampleChilds","sampleChildsLabels","newLabels","histoLabel","handleChangeNewStructures","labelStr","_this$props28","numberTilesFile","showAddSubstructure","SideBar","initAICockpitData","maxEpochs","stepsProgress","epochsProgress","showTrainingButton","buildingModel","showTrainingProgress","trainingFinished","newModelName","overallProgress","trainingSuccessful","startTrainingTime","errorLabel","metricsDict","fullScene","structureIndices","augmentations","newModel","uniqueName","validChar","backbones","unet","unet_pp","deepLabV3_p","classification_models","physicalSize","physicalSizeUnit","in_channels","setInputChannels","flChannels","setFlChannels","modelsize","lr","includeBackgroundTiles","tileSize","objectBasedBaseStructure","calculateWeightMap","useClassWeights","setAvailableModels","setModelsInitialized","loadPersistentDefaultModels","defaultModels","connectOnline","initPythonModules","selected_model","selected_version","stringProperties","DefaultModels","isResultTab","nextTab","getActiveTabResults","renderCommentTool","roiCount","sidebar","tabContentContainer","sideBarTabResults","ViewHelper","viewHelperSize","setClearColor","setSize","mount","domElement","cameraPosition","THREE","focusPoint","camera","set","lookAt","color2","color3","getAxisMaterial","zAxis","rotation","posXAxisHelper","getSpriteMaterial","posYAxisHelper","posZAxisHelper","negXAxisHelper","negYAxisHelper","negZAxisHelper","setScalar","renderScene","toneMapped","arc","getStyle","texture","applyQuaternion","quaternion","material","frameId","animate","cancelAnimationFrame","antialias","propsCam","Viewer3D","renderer3D","outputEncoding","toneMappingExposure","aspect","updateProjectionMatrix","controls","OrbitControls","get3dObjects","GLTFLoader","gltf","setFromObject","getCenter","get3DAllObjectsExists","load3DObject","getObjectByName","Tool","flag","prevX","currX","prevY","currY","downScale","ActiveLearningTool","_Tool","toolLayerConfig","ConfigForm","calcPreview","calcFull","AIModelDialogTable","sortOrder","filterType","print","responsive","rowsSelected","selectToolbarPlacement","draggableColumns","tableBodyMaxHeight","onRowSelectionChange","currentRowsSelected","dataIndex","handleSelectedAIModels","handleAddButton","textLabels","noMatch","toolTip","columnHeaderTooltip","pagination","previous","displayRows","downloadCsv","viewColumns","filterTable","titleAria","selectedRows","deleteAria","MUIDataTable","dataTable","verified","validationloss","validationmiou","validationmeaniou","trainingObjectsCount","trainingobjectscount","PaperComponent","cancel","Transition","Slide","AIModelDialog","selectedAIModels","addButtonDisabled","existingAIModels","selectedModelSourcepath","trainExistingModel","finishAddCustomAIModels","modelInformationContainer","addCustomAIModelButton","AddCircleOutlineIcon","addCustomAIModelText","TransitionComponent","tableDialog","deleteCustomAIModels","customAIModelsAdded","selectedAiModel","sourcepath","addCustomAIModels","gridContent","selectContent","selectedModelInformation","getSelectedModelSourcepath","setSelectedExistingModel","updateTrainingProgress","showDownloadProgress","hideStartTraining","buildingModelText","lossProgress","meanIoUProgress","showOptimizationProgress","trainingFailed","elapsedTime","modelOptimizeProgress","modelDownloadProgress","valmeanIoUProgress","vallossProgress","configForm","selectedExistingModel","errorEpochs","errorAIName","openTrainExistingDialog","selectedExistingModelSourcepath","aiTrainingSignalR","onApplyAll","ConfigFormRaw","required","PlayArrowRoundedIcon","ReplayRoundedIcon","listButtonStyle","mouseActionState","commentState","selectedTool","selectedCommentIdx","lastP","gripData","generateDistancePoints","dl","generateArrowPoints","addPoint","eventPoint","lastEventPoint","updateCommentRoi","changeSelectedCommentIdx","changeCommentState","deleteCommentRoi","changeSelectedColor","changeSelectedCommentValue","changeRoiFontSize","lineColor","selectionColor","numPoints","physicalLength","unitLength","mouseP","selectedCommentRoi","minArea","MAX_SAFE_INTEGER","containsPoint","commentRoiArea","deltaXProc","deltaYProc","computePolygonArea","physicalSizeY","computLengthValue","pointInsideBounds","startPoint","lastRoi","fct","pointInsideSelection","gripPoints","_gripPoints","gripPoint","gripSize","gripSizeInner","bInner","_len2","_key2","changeCommentType","_this$props$commentSt","Crop169Icon","ArrowForwardOutlinedIcon","CommentIcon","commentRoi","FormatSizeIcon","CopyTool","layerResults","selectedSameLayer","historyLength","foundRoiResults","foundRegionIndex","foundRoi","allRegions","regionroi","regionRois1","regionRois2","regions1","regions2","getIntersections","roi_region","historyLength2","onChangeMode","OverlapConfigForm","removeOverlap","removeOverlapSame","useNodeDrawingMode","onChangeRemoveOverlap","onChangeRemoveOverlapSame","onChangeUseNodeDrawingMode","EllipseTool","tempRemoveOverlap","tempRemoveOverlapSame","originalSelectedLayer","numberOfSegments","cos","sin","pointsToCirclePolygon","FillTool","pIndex","determineCorrectLayer","correctLayer","mainRoi","hole","tempHoleRoi","overlappingRegionRoiTreeItems","possibleRoiCandidates","oRoi","finalPossibleRoiCandidates","roisToExclude","possibleOverlapRoi","_possibleRoiCandidate","excludedOverlapRoi","fRoi","fillHole","CustomRangeSlider","valueMin","valueMax","onChangeMin","onKeyEnter","transformExponential","onChangeMax","selectionIdx","smallerIdx","biggerIdx","sortedTreeItems","checkJumps","randSliderKey","rangeSliderParams","updateRangeMode","zoomToRect","deleteSmaller","idxToDelete","treeItemToDelete","updateSortedTreeItems","deleteBigger","treeItem1","treeItem2","valueIsMin","valueIsMax","selectRegion","toggleJumps","deleteSelection","resultItem","treeItems","bArea","curX","curY","findSmallestTreeItem","sortIdx","smallerSelectionCount","biggerSelectionCount","smallerMinSliderCount","biggerMaxSliderCount","gridGap","Pagination","shape","endPoint","rightClick","gridOffsetX","gridOffsetY","exportClasses","baseROIOnly","createSelectionArea","sP","eP","treeSelection","gridLayer","baseRois","printFunction","setSelectedLayer","baseRoi","c_1","c_2","c_3","c_4","saveGridConfig","onClickExport","pconfig","projectNoViewConfig","fileIndex","exportObject","selectedStructureId","fileConfig","tileExport","newLine","tileCount","saveObject","disableExport","rendererObj","mp","onChangeGridSize","onChangeOverlap","onChangeGridOffsetX","onChangeGridOffsetY","onChangeExportClasses","onChangeBaseROIOnly","h6_small","gridButton","girdIconText","tilesToGenerate","showGridPreview","isInsideBaseROI","createRandomTiles","positions","foundTiles","isValidTile","noGridForChilds","fromFileChange","lenChilds","newGridSize","resetStructure","create1mmGrid","isHistoClassification","isHistoPointCounting","sizeUnit","pixelWidth","threshold","searchRadius","prevSelectedLayer","activeGrid","initTool","visibilityState","getSubtypeLabels","structs","getRois","checkRTree","rtree","KDBush","treePoints","worldToCanvas","yToWorld","xToWorld","worldDistance","dStart","dEnd","makeTiles","tileSizeX","tileSizeY","canvasHeight","TLx","TLy","BRx","BRy","setHeatmapWithGrid","results","gridMaxValue","range","avgX","avgY","setHeatmapWithoutGrid","noGridMaxValue","within","checkVisibleObjects","pxlValue","textAlignLast","updateDrawing","InstantAnalysisTool","runAnalysis","callbackFunction","instantAnalysisSignalR","calcTileName","letters","numberRows","numberCellsAlphabet","firstLetter","lettersIdx","resetParameters","configFormRef","parameter","pixelLengthX","pixelLengthY","pixelArea","findParentStructure","fileClassification","toolParams","selLayerStructureId","outerParentidx","findOuterParentIdx","layersToSave","depending_structure","depending_channel","required_structures","required_struture","rendererdict","activeLearningSignalR","parentlist","selectedToolName","layerIndex","annotationSaveStructureId","annotationSaveStructureIndex","collides","itemsToRemove","itemToRemove","applyToAll","getSelectedObjects","resultProject","pFile","coord","formControlInUse","SettingsBackupRestoreIcon","validateParameters","cIndex","toolParam","tempCIndex","accordionExpanded","_this7","_this8","formControls","optionalFormControls","digits","valueOf","hiddenStructures","component_type","optional","selectedLandmarkIdx","gripIdx","radioValue","deletedNumberQ","onClickRemoveTransformation","matrix","reallocateLandmarkNumbers","bMarks","onClickApplyTransformation","baseMarks","targetMarks","handleRadioChange","onClickRemoveAllMarks","mousePoint","topLeft","bottomRight","roiColor","markNumber","tag","checkBoundingBox","hatchOffset","MagicWandTool","shiftflag","lastp","mouseWheelEvent","useMagicWand","bytes","wandMask","MagicWandToolLib","floodFill","len","gaussBlurOnlyBorder","cacheInd","getBorderIndices","trace","traceContours","simplifyContours","inner","ps","onChangeThreshold","PenTool","penRadius","minPenRadius","maxPenRadius","tempUseNodeDrawingMode","initDrawing","replaceLastPointInDrawLayer","addPointToDrawLayer","applyDrawLayer","linePoly","lineRegions","fkt","fromGallery","_this$line","penRad","onChangePenRadius","TinyQueue","compare","defaultCompare","_down","_up","halfLength","best","knn","predicate","maxDistance","candidate","toBBox","queue","compareDist","boxDist","leaf","isItem","peek","box","axisDist","PlotNearestRoiTool","nearestLayer","nearest","mainRadius","nearestRadius","connectionLineWidth","mainVisibility","nearestVisibility","connectionVisibility","maxDistanceVisibility","nearestLayerId","setSelectedRoiLayer","onChangeColors","onChangeConfig","onChangeSelection","nearestCenters","center2","drawDistanceCircles","selectedTree","drawNearestConnections","drawLayerCircles","onChangeColor","colorObject","configObject","filteredStructures","RectangleTool","resizingStarted","selectNexRoi","getValidatedRegions","hoveredRoi","editRoi","deleteRoi","mouseDownPosition","mouseDownRoi","hoveredIndex","rw","rh","setHoveredRoi","deltaP","setClickedRoiSelected","rb","cornerSize","roiWidth","roiHeight","highlightRoi","highlightResizeCorner","RegionGrabCutTool","penOpacity","lines","matline","fitPointToImage","getPolygonsWithOpenCV","tlp","resultImageData","rect1","Rect","resizeMultiplier","originalSize","workingSize","INTER_AREA","point1","Point","point2","cvtColor","COLOR_RGBA2RGB","zeros","CV_8U","obvFgColor","Scalar","GC_FGD","obvBgColor","GC_BGD","posFgColor","GC_PR_FGD","fgP1","fgP2","rectangle","circle","bgdModel","fgdModel","grabCut","GC_INIT_WITH_MASK","ucharPtr","COLOR_RGBA2GRAY","THRESH_BINARY","contours","MatVector","hierarchy","findContours","RETR_CCOMP","CHAIN_APPROX_SIMPLE","polygons","cnt","get","contourArea","polygon","data32S","removeCenteredObject","centeredRoi","getTopLeftPoint","getBottomRightPoint","isPointOutsideRect","isOutside","brp","isDrawingpointInsideRect","resetViuals","lineFlag","obvColor","rad","topLeftPoint","RegionGrowingTool","growRegion","seed","inputData","outputData","seedIdx","seedR","seedG","seedB","newedge","ii","next4Edges","jj","ci","cr","cg","cb","imageData","growResult","rgbaPlanes","toolStates","RegionSAMTool","lastSamCall","startRectPoint","endRectPoint","toolState","updateToolState","setPolygonsWithSAM","_this$file","isPreview","samData","useSAM","previewPolygons","validateRect","resetVisuals","drawRectangle","drawPlus","isForeground","drawRectangleCross","drawPreviewPolygon","_poly$i","drawPoligonOutline","_this$polygons","_poly$i2","onCancel","setRectWholeScene","RegionTool","getIndexOf","drawRegionGeoJson","polygonToGeoJSON","drawRegionWithoutHoles","_unused2","getExterior","deleteItem","pointsToUpdateLayer","newPoints","getAllChildsOfStructure","affectedStructures","affStruct","_affectedStructures","growPoly","turfpoly","bufferedTurfPoly","processStructures","roisProcessed","finishProcessStructures","growStructures","SelectionTool","foundLayer","setCol","setIds","setBorderColor","setClassificationId","setClassification","setAutomaticFileChange","changeItem","fromButton","boundsSelection","moveToRect","changeTile","classifyFullSceneImage","ClassifySceneAsOneImage","fromRenderer","tilesProject","dashLength","setLineDash","changeSelRoi","handleChangeClassification","handleAutomaticFileChange","_this2$props","_this2$props2","_this2$props3","StreamViewTool","isStreaming","streamUrl","uploadRendererContent","streamRenderer","dataURI","byteString","atob","unescape","mimeString","ia","dataURItoBlob","toggleStream","TilesClassificationTool","TilesHistoPointCountingTool","lineLengthWidth","lineLengthHeight","WindowTool","handleSizeChanged","CompContainer","canvasComp","Viewer","idMapping","biggestAnnotationsFileSizeInMB","toolPresets","commentLayersObject","landmarkLayersObject","tMatrices","tFactors","tOffsets","projectDataFiles","dataFileIdx","projectDataFile","projectFile","fullyAnnotated","migrateTools","initLayersAndStructures","openedFileId","sFileIds","fsFileIds","newZoomObjectDict","openFile","rv","groupBy","sortedFiles","contextStateObject","isOwner","setSelLayerConfig","_step4$value","_step5$value","toolIndex","viewerConfigTool","vTool","transformedVParameters","generateToolParameterDict","makeProjectCompatible","sructuresWithNoId","projDataStr","viewerConfStr","newLayerIndices","loadAllFiles","newProjectObject","projId","fileAnnotationsLoaded","loadAnnotationsFunction","createAnnotationsProjectModel","loadAnnotations","withHoles","onlyAnnotations","saveWithSpinloader","preparingStartJob","toolParameters","sharedToolParameters","shared","structureHasChild","findStructureSubtypeLevel","subtypeLevelCount","clearOtherLayers","updateStructuresWithPersistentStorage","histogram","storedParams","checkIfErrorInProjectData","newRegionRois","selObjects","graphData","selectedFileId","processGeoJSONArray","geoJSONArray","layerID","newRegionRoisObject","layerObject","tIdx","_this$props$projectCo2","projectWithClasses","getLocalZoomObject","toggleRois","activeElement","localName","pressedNumber","getArrayDepth","depthArray","depth","isCorrespondingPolygon","createNewRois","frameGeoJson","updateVisibleROI","processLoadedAnnotations","jsonAnnotations","newroiLayers","is_locked","is_reduced","total_roi_count","emptyIdxs","_keys","idframeArray","idTimeArray","loadedframeArray","objectframeArray","_this$createNewRois","_this$createNewRois2","structROIs","structID","annotatedFileIds","_this$props$projectCo3","structuresMap","currentFile","fileData","maxResults","lp1","lastViewRoiParams","lp2","_this$props$projectCo4","_this$props$projectCo5","deleteRoiLayersForScene","_this$props$projectCo6","galleryChangeTool","checkTool","exit","_this$props$projectCo7","checkPropertyInConfig","persisObj","addFileToFullscreen","onSwitchFileSplitscreen","toggleFileTreeView","showFileTreeView","loadSCNXMLAnnotations","deleteforAllScenes","getNumberSubstructuresWithRois","_this$props$projectCo8","nextParentLayer","_this$props$projectCo9","current_id","idTimeArr","idLayer","tArrRois","frameIdTimeArr","selLayer","selStructure","selStructureId","exportSubstructures","numberSubstructuresWithRois","fileID","fromActiveLearning","updateCount","setAIObjects","_this$props$projectCo10","Objs","subtypeStructureIdx","idxLastLabeled","unlabeled","sortedObjects","newSortedArray","updatedRoiLayer","_this$props$projectCo11","findFileIndex","applyModelAfterTraining","startPassiveLearningTraining","prepareImagesForTraining","startClassification","projModel","adjustRoiLayers","_this$props$projectCo12","subtypeLayer","addStuff","string","filesByteArray","checkStringLength","largeFilesJSONtoBlobConverter","tmpString","keyIdx","annoKeys","annoKeyIdx","annoKey","annoValue","geoJSONKeys","geoJSONKeyIdx","paramKey","paramValue","polyIdx","finalizeByteArray","getProjectInfoString","lastIndex","saveScreenshot","savePath","createZoomObjectForRect","fullscreenChain","fullscreenInitFilePlacement","o","_i13","_i14","_i15","_i16","_i17","onSaveGalleryClick","originalSideBarWidth","showGrid","resizeEnd","newSideBarWidth","minSideBarWidth","minRendererWidth","newTimeLineHeight","minTimeLineHeight","minCanvasHeight","newToolBarWidth","galleryView","isElementVisible","sideBarWidthObject","sideBarWidthFromConfig","saveChainStatus","chainList","onSelectFileSplitscreen","onChainSplitscreen","bool","setOpacityChangeFullscreen","firstFullscreenOpacity","secFullscreenOpacity","firstRef","secRef","firstId","secId","setActiveFileFullscreen","onToggleFullscreenChain","aiStructures","timeLineHeightObject","verticalToolBarIconsHeight","importProgress","hC","scrollGallery","dimensionsUpdated","refreshState","structureTools","resetRoiZoom","resetRoiZoomInDict","onmousedown","onmouseup","requestProject","newMappingsFound","gl","X1","Y1","hConfig","paramDict","paramLabelDict","_Object$values11","widthThreshold","outerWidth","heightThreshold","outerHeight","Firebug","chrome","isInitialized","lastFileId","_this$props$projectCo13","_loop8","newOme","importNeeded","close","onclose","failedFilePath","automaticFullImageRoiLayer","docstr","doc","DOMParser","parseFromString","annodoc","tagName","vertices","vertex","selRoiLayer","fromExport","defaultSaveCallback","_this9","_this$props$projectCo14","mainContainer","onWheel","projectConfig","zoomROI1","fullscreenIdx","onSaveGallery","histogramChanged","en","onUpdateDimensions","App","enqueueSnackbar","action_msg","hide_msg","closeSnackbar","sbId","persist","historyDepth","FileViewer","ProteomViewer","ScanProvider","exact","UserHistoryPage","withSnackbar","hostname","baseUrl","rootElement","createTheme","typography","useNextVariants","ReactDOM","BrowserRouter","basename","StyledEngineProvider","injectFirst","ThemeProvider","SnackbarProvider","maxSnack","serviceWorker","registration","unregister"],"mappings":"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","file":"static/js/main.bdb57169.chunk.js","sourcesContent":["import { authenticationService } from '../services';\r\n\r\nexport function handleResponse(response) {\r\n return response.text().then(text => {\r\n const data = text && JSON.parse(text);\r\n if (!response.ok) {\r\n if ([401, 403].indexOf(response.status) !== -1) {\r\n // auto logout if 401 Unauthorized or 403 Forbidden response returned from api\r\n authenticationService.logout();\r\n window.location.reload(true);\r\n }\r\n else if ([409].indexOf(response.status) !== -1) {\r\n authenticationService.logout();\r\n window.location = \"/licensing\";\r\n }\r\n\r\n const error = (data && data.message) || response.statusText;\r\n return Promise.reject(error);\r\n }\r\n\r\n return data;\r\n });\r\n}","export const Role = {\r\n\tAdmin: 'Admin',\r\n\tUser: 'User' \r\n}","import { createBrowserHistory } from 'history';\r\n\r\nexport const history = createBrowserHistory();","import { BehaviorSubject } from \"rxjs\";\r\n\r\nimport { handleResponse } from \"../utils\";\r\n\r\nconst currentUserSubject = new BehaviorSubject(\r\n JSON.parse(localStorage.getItem(\"currentUser\"))\r\n);\r\n\r\nexport const authenticationService = {\r\n login,\r\n logout,\r\n currentUser: currentUserSubject.asObservable(),\r\n get currentUserValue() {\r\n return currentUserSubject.value;\r\n },\r\n};\r\n\r\nfunction login(email, password) {\r\n const requestOptions = {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ email, password }),\r\n };\r\n\r\n return fetch(`/api/user/authenticate`, requestOptions)\r\n .then(handleResponse)\r\n .then((user) => {\r\n // store user details and jwt token in local storage to keep user logged in between page refreshes\r\n localStorage.setItem(\"currentUser\", JSON.stringify(user));\r\n currentUserSubject.next(user);\r\n return user;\r\n });\r\n}\r\n\r\nfunction logout() {\r\n //window.location.reload(true); //clear cache\r\n // remove user from local storage to log user out\r\n localStorage.removeItem(\"currentUser\");\r\n currentUserSubject.next(null);\r\n}\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Route, Redirect } from \"react-router-dom\";\r\n\r\nimport { authenticationService } from \"../services\";\r\n\r\nconst PrivateRoute = ({ component: Component, roles, ...rest }) => (\r\n {\r\n const currentUser = authenticationService.currentUserValue;\r\n if (!currentUser) {\r\n // not logged in so redirect to login page with the return url\r\n return (\r\n \r\n );\r\n }\r\n\r\n // check if route is restricted by role\r\n if (roles && roles.indexOf(currentUser.role) === -1) {\r\n // role not authorised so redirect to home page\r\n return ;\r\n }\r\n\r\n // authorised so return component\r\n return ;\r\n }}\r\n />\r\n);\r\n\r\nPrivateRoute.propTypes = {\r\n component: PropTypes.oneOfType([PropTypes.object, PropTypes.func]),\r\n roles: PropTypes.array,\r\n location: PropTypes.string,\r\n};\r\n\r\nexport { PrivateRoute };\r\n","//import React from 'react';\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// make a new context\r\nconst TilesContext = React.createContext();\r\n\r\nexport const withTiles = (Component) => {\r\n const WrappedComponent = (props) => (\r\n \r\n {(context) => }\r\n \r\n );\r\n\r\n WrappedComponent.displayName = `withTiles(${\r\n Component.displayName || Component.name || \"Component\"\r\n })`;\r\n\r\n return WrappedComponent;\r\n};\r\n\r\n// create provider component\r\nexport class TilesProvider extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {};\r\n\r\n this.visibleImage = [];\r\n this.visibleImageUpdatedAt = [];\r\n this.coloredImages = [];\r\n this.coloredImagesUpdatedAt = [];\r\n this.imgWidth = 0;\r\n this.imgHeight = 0;\r\n this.pageIndex = 0;\r\n this.histogramConfig = null;\r\n this.selectedLayerColor = \"#fff\";\r\n this.selcetedLayerIndex = 0;\r\n this.annotationCount = 0;\r\n this.firstIteration = true;\r\n this.accPoints = [];\r\n this.pointCount = 0;\r\n this.galleryVisible = false;\r\n this.isMousedown = false;\r\n this.isOnImage = false;\r\n this.IsInOtherImage = false;\r\n this.onPageInput = false;\r\n this.strAnnoCount = [];\r\n this.strSubtypesPages = [];\r\n this.structure = null;\r\n this.structureBefore = null;\r\n this.graphAcc = [];\r\n this.roiProps = {\r\n color: \"\",\r\n isSubtype: false,\r\n subtypeName: \"\",\r\n pos: -1,\r\n };\r\n this.histoClassificationStarted = false;\r\n this.fileId = null;\r\n this.zLevel = 0;\r\n this.chainLeaderId = null;\r\n this.transformationMatrix = {};\r\n this.transformationFactor = {};\r\n this.transformationOffset = {};\r\n }\r\n\r\n getIndex = (a) => {\r\n if (this.strAnnoCount) {\r\n for (let i = 0; i < this.strAnnoCount.length; i++) {\r\n if (this.strAnnoCount[i][0] === a) {\r\n return i;\r\n }\r\n }\r\n }\r\n return -1;\r\n };\r\n\r\n getIndexObj = (a) => {\r\n if (this.strSubtypesPages) {\r\n for (let i = 0; i < this.strSubtypesPages.length; i++) {\r\n if (this.strSubtypesPages[i].id === a) {\r\n return i;\r\n }\r\n }\r\n }\r\n return -1;\r\n };\r\n\r\n resetStPg = () => {\r\n if (this.strSubtypesPages) {\r\n for (let i = 0; i < this.strSubtypesPages.length; i++) {\r\n this.strSubtypesPages[i].page = 0;\r\n }\r\n }\r\n };\r\n\r\n render() {\r\n return (\r\n {\r\n this.visibleImage = a;\r\n },\r\n clearTiles: () => {\r\n for (let key of Object.keys(this.visibleImage)) {\r\n this.visibleImage[key] = null;\r\n }\r\n for (let key of Object.keys(this.visibleImage)) {\r\n delete this.visibleImage[key];\r\n }\r\n for (let key of Object.keys(this.coloredImages)) {\r\n this.coloredImages[key] = null;\r\n }\r\n for (let key of Object.keys(this.coloredImages)) {\r\n delete this.coloredImages[key];\r\n }\r\n },\r\n pushVisibleImage: (a, tileId) => {\r\n this.visibleImage[tileId] = a;\r\n this.visibleImageUpdatedAt[tileId] = new Date().getTime();\r\n\r\n // 275 imgs ~ 1GB RAM\r\n if (Object.keys(this.visibleImage).length > 150) {\r\n let sorted = [];\r\n for (let tileId in this.visibleImageUpdatedAt) {\r\n sorted.push([tileId, this.visibleImageUpdatedAt[tileId]]);\r\n }\r\n sorted.sort(function (a, b) {\r\n return a[1] - b[1];\r\n });\r\n\r\n let i = 0;\r\n while (\r\n Object.keys(this.visibleImage).length > 125 &&\r\n i < sorted.length\r\n ) {\r\n if (\r\n sorted &&\r\n sorted[i] &&\r\n this.visibleImage[sorted[i][0]] &&\r\n this.visibleImageUpdatedAt[sorted[i][0]] &&\r\n sorted[i][0] !== \"0,0,0,0\"\r\n ) {\r\n this.visibleImage[sorted[i][0]].onload = null;\r\n this.visibleImage[sorted[i][0]].src = null;\r\n this.visibleImage[sorted[i][0]] = null;\r\n delete this.visibleImage[sorted[i][0]];\r\n delete this.visibleImageUpdatedAt[sorted[i][0]];\r\n } else {\r\n if (this.visibleImageUpdatedAt[sorted[i][0]] === undefined) {\r\n delete this.visibleImageUpdatedAt[sorted[i][0]];\r\n }\r\n }\r\n i++;\r\n }\r\n }\r\n },\r\n resetVisibleImages: () => {\r\n for (let f in this.visibleImage) {\r\n if (f !== \"0,0,0,0\") {\r\n this.visibleImage[f].onload = null;\r\n this.visibleImage[f].src = null;\r\n this.visibleImage[f] = null;\r\n delete this.visibleImage[f];\r\n delete this.visibleImageUpdatedAt[f];\r\n }\r\n }\r\n // this.visibleImage = [];\r\n },\r\n getVisibleImages: () => {\r\n return this.visibleImage;\r\n },\r\n getVisibleImage: (tileId) => {\r\n let img = this.visibleImage[tileId];\r\n if (img !== undefined) {\r\n this.visibleImageUpdatedAt[tileId] = new Date().getTime();\r\n }\r\n return img;\r\n },\r\n\r\n // Colored Images\r\n setColoredImages: (a) => {\r\n this.coloredImages = a;\r\n },\r\n pushColoredImages: (a, tileId) => {\r\n this.coloredImages[tileId] = a;\r\n this.coloredImagesUpdatedAt[tileId] = new Date().getTime();\r\n\r\n // 275 imgs ~ 1GB RAM\r\n if (Object.keys(this.coloredImages).length > 150) {\r\n let sorted = [];\r\n for (let tileId in this.coloredImagesUpdatedAt) {\r\n sorted.push([tileId, this.coloredImagesUpdatedAt[tileId]]);\r\n }\r\n\r\n sorted.sort(function (a, b) {\r\n return a[1] - b[1];\r\n });\r\n\r\n let i = 0;\r\n while (\r\n Object.keys(this.coloredImages).length > 125 &&\r\n i < sorted.length\r\n ) {\r\n if (\r\n sorted &&\r\n sorted[i] &&\r\n this.coloredImages[sorted[i][0]] &&\r\n this.coloredImagesUpdatedAt[sorted[i][0]] &&\r\n sorted[i][0] !== \"0,0,0,0\"\r\n ) {\r\n this.coloredImages[sorted[i][0]].onload = null;\r\n this.coloredImages[sorted[i][0]].src = null;\r\n this.coloredImages[sorted[i][0]] = null;\r\n delete this.coloredImages[sorted[i][0]];\r\n delete this.coloredImagesUpdatedAt[sorted[i][0]];\r\n } else {\r\n if (this.coloredImagesUpdatedAt[sorted[i][0]] === undefined) {\r\n delete this.coloredImagesUpdatedAt[sorted[i][0]];\r\n }\r\n }\r\n i++;\r\n }\r\n }\r\n },\r\n resetColoredImages: () => {\r\n for (let f in this.coloredImages) {\r\n if (this.coloredImages[f] && f !== \"0,0,0,0\") {\r\n this.coloredImages[f].onload = null;\r\n this.coloredImages[f].src = null;\r\n this.coloredImages[f] = null;\r\n delete this.coloredImages[f];\r\n delete this.coloredImagesUpdatedAt[f];\r\n }\r\n }\r\n },\r\n getColoredImages: () => {\r\n return this.coloredImages;\r\n },\r\n getColoredImage: (tileId) => {\r\n let img = this.coloredImages[tileId];\r\n if (img !== undefined) {\r\n this.coloredImagesUpdatedAt[tileId] = new Date().getTime();\r\n }\r\n return img;\r\n },\r\n\r\n setImgWidth: (a) => {\r\n this.imgWidth = a;\r\n },\r\n getImgWidth: () => {\r\n return this.imgWidth;\r\n },\r\n\r\n setImgHeight: (a) => {\r\n this.imgHeight = a;\r\n },\r\n getImgHeight: () => {\r\n return this.imgHeight;\r\n },\r\n\r\n setPageIndex: (a) => {\r\n this.pageIndex = a;\r\n },\r\n getPageIndex: () => {\r\n return this.pageIndex;\r\n },\r\n\r\n setHistogramConfig: (a) => {\r\n this.histogramConfig = a;\r\n },\r\n getHistogramConfig: () => {\r\n return this.histogramConfig;\r\n },\r\n\r\n setSelectedLayerColor: (a) => {\r\n this.selectedLayerColor = a;\r\n },\r\n getSelectedLayerColor: () => {\r\n return this.selectedLayerColor;\r\n },\r\n\r\n setSelectedLayerIndex: (a) => {\r\n this.selectedLayerIndex = a;\r\n },\r\n getSelectedLayerIndex: () => {\r\n return this.selectedLayerIndex;\r\n },\r\n\r\n addAnnotationCount: (x) => {\r\n this.annotationCount = this.annotationCount + x;\r\n },\r\n setAnnotationCount: (x) => {\r\n return (this.annotationCount = x);\r\n },\r\n getAnnotationCount: () => {\r\n return this.annotationCount;\r\n },\r\n\r\n setFirstIteration: (x) => {\r\n this.firstIteration = x;\r\n },\r\n getFirstIteration: () => {\r\n return this.firstIteration;\r\n },\r\n\r\n pushAccPoint: (x) => {\r\n let point = {\r\n x: 30 * this.pointCount,\r\n y: x,\r\n };\r\n this.accPoints.push(point);\r\n this.pointCount = this.pointCount + 1;\r\n },\r\n getAccPoints: () => {\r\n return this.accPoints;\r\n },\r\n\r\n setGalleryVisible: (a) => {\r\n this.galleryVisible = a;\r\n },\r\n getGalleryVisible: () => {\r\n return this.galleryVisible;\r\n },\r\n\r\n setIsMousedown: (a) => {\r\n this.isMousedown = a;\r\n },\r\n getIsMousedown: () => {\r\n return this.isMousedown;\r\n },\r\n\r\n setIsOnImage: (a) => {\r\n this.isOnImage = a;\r\n },\r\n getIsOnImage: () => {\r\n return this.isOnImage;\r\n },\r\n\r\n setIsInOtherImage: (a) => {\r\n this.isInOtherImage = a;\r\n },\r\n getIsInOtherImage: () => {\r\n return this.isInOtherImage;\r\n },\r\n\r\n setRoiProps: (a) => {\r\n this.roiProps.color = a.color;\r\n this.roiProps.isSubtype = a.isSubtype;\r\n this.roiProps.subtypeName = a.subtypeName;\r\n },\r\n getRoiProps: () => {\r\n return this.roiProps;\r\n },\r\n\r\n setPositionRoi: (a) => {\r\n this.roiProps.pos = a;\r\n },\r\n\r\n setOnPageInput: (a) => {\r\n this.onPageInput = a;\r\n },\r\n getOnPageInput: () => {\r\n return this.onPageInput;\r\n },\r\n\r\n pushStrAnnoCount: (a) => {\r\n this.strAnnoCount.push([a, 0]);\r\n },\r\n pushDynamicStructureAC: (a, b) => {\r\n this.strAnnoCount.splice(b, 0, [a, 0]);\r\n },\r\n setStrAnnoCount: (a, b) => {\r\n let idx = this.getIndex(a);\r\n if (this.strAnnoCount[idx]) {\r\n this.strAnnoCount[idx][1] = this.strAnnoCount[idx][1] + b;\r\n }\r\n },\r\n setParentAnnoCount: (a, b) => {\r\n let idx = this.getIndex(a);\r\n if (this.strAnnoCount[idx]) {\r\n this.strAnnoCount[idx][1] = this.strAnnoCount[idx][1] + b;\r\n }\r\n },\r\n getStrAnnoCountElement: (a) => {\r\n let idx = this.getIndex(a);\r\n return this.strAnnoCount[idx][1];\r\n },\r\n getStrAnnoCount: () => {\r\n return this.strAnnoCount;\r\n },\r\n setAnnoCount: (a) => {\r\n this.strAnnoCount = a;\r\n },\r\n changeAnnoCount: (a, b) => {\r\n let idx_a = this.getIndex(a);\r\n let idx_b = this.getIndex(b);\r\n if (this.strAnnoCount[idx_a] && this.strAnnoCount[idx_b]) {\r\n this.strAnnoCount[idx_a][1] = this.strAnnoCount[idx_a][1] + 1;\r\n this.strAnnoCount[idx_b][1] = this.strAnnoCount[idx_b][1] - 1;\r\n }\r\n },\r\n\r\n pushSubtypesPages: (a, b) => {\r\n let obj = {\r\n name: a,\r\n page: 0,\r\n tilePage: 0,\r\n subtypes: [],\r\n id: b,\r\n };\r\n this.strSubtypesPages.push(obj);\r\n },\r\n pushDynamicStructureSP: (a, b) => {\r\n let obj = {\r\n name: a.label,\r\n page: 0,\r\n tilePage: 0,\r\n subtypes: [],\r\n id: a.id,\r\n };\r\n this.strSubtypesPages.splice(b, 0, obj);\r\n },\r\n getSubtypesPages: () => {\r\n return this.strSubtypesPages;\r\n },\r\n setSubtypesPages: (a) => {\r\n this.strSubtypesPages = a;\r\n },\r\n setPage: (a, b) => {\r\n let idx = this.getIndexObj(a);\r\n this.strSubtypesPages[idx].page = b;\r\n },\r\n getPage: (a) => {\r\n let idx = this.getIndexObj(a);\r\n if (this.strSubtypesPages[idx]) {\r\n return this.strSubtypesPages[idx].page;\r\n } else {\r\n return 0;\r\n }\r\n },\r\n setTilePage: (a, b) => {\r\n let idx = this.getIndexObj(a);\r\n this.strSubtypesPages[idx].tilePage = b;\r\n },\r\n getTilePage: (a) => {\r\n let idx = this.getIndexObj(a);\r\n return this.strSubtypesPages[idx].tilePage;\r\n },\r\n setSubtypes: (a, b) => {\r\n let idx = this.getIndexObj(a);\r\n this.strSubtypesPages[idx].subtypes = b;\r\n },\r\n setSingleSubtype: (a, b, c) => {\r\n let idx = this.getIndexObj(a);\r\n this.strSubtypesPages[idx].subtypes[c] = b;\r\n },\r\n getSubtypes: (a) => {\r\n let idx = this.getIndexObj(a);\r\n return this.strSubtypesPages[idx].subtypes;\r\n },\r\n resetSubtypesPages: () => {\r\n this.resetStPg();\r\n //this.strSubtypesPages = [];\r\n },\r\n\r\n setStructure: (a) => {\r\n this.structureBefore = this.structure;\r\n this.structure = a;\r\n },\r\n getStructure: () => {\r\n return this.structure;\r\n },\r\n getStructureBefore: () => {\r\n return this.structureBefore;\r\n },\r\n\r\n setGraphAcc: (a) => {\r\n this.graphAcc = a;\r\n },\r\n pushGraphAcc: (a) => {\r\n this.graphAcc.push(a);\r\n },\r\n getGraphAcc: () => {\r\n return this.graphAcc;\r\n },\r\n\r\n setHistoClassificationStarted: (a) => {\r\n this.histoClassificationStarted = a;\r\n },\r\n getHistoClassificationStarted: () => {\r\n return this.histoClassificationStarted;\r\n },\r\n\r\n setFileId: (a) => {\r\n this.fileId = a;\r\n },\r\n getFileId: () => {\r\n return this.fileId;\r\n },\r\n\r\n setZLevel: (a) => {\r\n this.zLevel = a;\r\n },\r\n getZLevel: () => {\r\n return this.zLevel;\r\n },\r\n setTransformationMatnFactnOff: (a, fileId, fact, Off) => {\r\n this.transformationMatrix[fileId] = a;\r\n this.transformationFactor[fileId] = fact;\r\n this.transformationOffset[fileId] = Off;\r\n },\r\n getTransformationMatrix: (fileId) => {\r\n return this.transformationMatrix[fileId];\r\n },\r\n getTransformationFactor: (fileId) => {\r\n return this.transformationFactor[fileId];\r\n },\r\n getTransformationOffset: (fileId) => {\r\n return this.transformationOffset[fileId];\r\n },\r\n removeTransformationMatrix: (fileId) => {\r\n delete this.transformationMatrix[fileId];\r\n delete this.transformationFactor[fileId];\r\n delete this.transformationOffset[fileId];\r\n },\r\n resetAllTransformationMatnFact: () => {\r\n this.transformationMatrix = {};\r\n this.transformationFactor = {};\r\n this.transformationOffset = {};\r\n },\r\n getAllTransformationMatrices: () => {\r\n return this.transformationMatrix;\r\n },\r\n getAllTransformationFactors: () => {\r\n return this.transformationFactor;\r\n },\r\n getAllTransformationOffsets: () => {\r\n return this.transformationOffset;\r\n },\r\n }}\r\n >\r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nTilesProvider.propTypes = {\r\n children: PropTypes.element.isRequired,\r\n};\r\n\r\nexport default TilesContext;\r\n","function padTo2Digits(num) {\r\n return num.toString().padStart(2, \"0\");\r\n}\r\n\r\n/**\r\n * Adjusts a UTC date to local timezone.\r\n * @param {Date} date A date object to convert.\r\n * @returns {Date} A date adjusted to the local timezone.\r\n */\r\nexport function convertUTCDateToLocalDate(date) {\r\n var newDate = new Date(date.getTime() + date.getTimezoneOffset() * 60 * 1000);\r\n\r\n var offset = date.getTimezoneOffset() / 60;\r\n var hours = date.getHours();\r\n\r\n newDate.setHours(hours - offset);\r\n\r\n return newDate;\r\n}\r\n\r\n/**\r\n * Turn a json date into a standard Date object.\r\n * @param {object} jsonDate An date formatted as a json object.\r\n * @returns {Date} A Date object.\r\n */\r\nexport function convertDate(jsonDate) {\r\n return new Date(jsonDate);\r\n}\r\n\r\nexport function convertDateToDayString(date) {\r\n return [\r\n date.getFullYear(),\r\n padTo2Digits(date.getMonth() + 1),\r\n padTo2Digits(date.getDate()),\r\n ].join(\"-\");\r\n}\r\n\r\n/**\r\n * Converts a given local date to a short ISO 8601 formatted string.\r\n * @param {Date} date Date object.\r\n * @returns {String} Date as ISO 8601 formatted string.\r\n */\r\nexport function convertDateToShortIsoString(date) {\r\n let d = new Date(date);\r\n let isoString =\r\n d.getFullYear() +\r\n \"-\" +\r\n padTo2Digits(d.getMonth() + 1) +\r\n \"-\" +\r\n padTo2Digits(d.getDate()) +\r\n \"_\" +\r\n padTo2Digits(d.getHours()) +\r\n \"-\" +\r\n padTo2Digits(d.getMinutes()) +\r\n \"-\" +\r\n padTo2Digits(d.getSeconds());\r\n return isoString;\r\n}\r\n","//#region Type checks\r\n\r\nimport { isArray } from \"mathjs\";\r\n\r\n/**\r\n * Validate that a string follows the uuid format per RFC4122.\r\n * @param {string} inputString String to validate for uuid formatting.\r\n * @param {boolean} acceptNil Whether to accept NIL type UUID or not. Defaults to false\r\n * @returns {boolean} Whether the given string is a valid UUID.\r\n */\r\nexport function isUuid(inputString, acceptNil = false) {\r\n if (typeof inputString !== \"string\") return false;\r\n if (typeof acceptNil !== \"boolean\")\r\n throw TypeError(\r\n `acceptNil must be of type boolean, received ${typeof acceptNil}: ${acceptNil}`\r\n );\r\n\r\n const uuid =\r\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\r\n const uuid_w_nil =\r\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\r\n\r\n // Cheap length check\r\n if (inputString.length !== 36) return false;\r\n\r\n if (acceptNil) {\r\n return uuid_w_nil.test(inputString);\r\n } else {\r\n return uuid.test(inputString);\r\n }\r\n}\r\n\r\n/**\r\n * Check if a given string is a valid 3, 6, or 8 character hex color representation.\r\n * @param {string} inputString A string to test for valid color format.\r\n * @returns {bool} The given string is a valid hex color representation.\r\n */\r\nexport function isHexColor(inputString) {\r\n if (typeof inputString !== \"string\") return false;\r\n const hexColor = /^(#[\\da-f]{3}|#[\\da-f]{6}|#[\\da-f]{8})$/i;\r\n return hexColor.test(inputString);\r\n}\r\n\r\n/**\r\n * Checks if a value is a plain object.\r\n * @param {number} input Object to test.\r\n * @returns {boolean} Whether the given value resembles an object.\r\n */\r\n\r\nexport function isObject(obj) {\r\n return obj && typeof obj === \"object\" && !Array.isArray(obj);\r\n}\r\n\r\n/**\r\n * Checks if a value is an integer value.\r\n * @param {number} input Number to test.\r\n * @returns {boolean} Whether the given value resembles an integer.\r\n */\r\nexport function isInt(input) {\r\n if (typeof input === \"bigint\") return true; // BigInts are always ints\r\n if (typeof input !== \"number\") return false;\r\n\r\n return (input | 0) === input;\r\n}\r\n//#endregion\r\n\r\n//#region Conversions\r\n/**\r\n * Rounds a floating point number to specified decimals after the comma.\r\n * @param {number} num Number to round.\r\n * @param {int} decimals Decimals after the comma to round to. Defaults to 0.\r\n * @returns {number} Input rounded to specified decimal count.\r\n */\r\nexport function roundToDecimal(num, decimals = 0) {\r\n if (typeof num != \"number\") {\r\n throw TypeError(\r\n `num must be of type number, received ${typeof num}: ${num}`\r\n );\r\n }\r\n\r\n if (!isInt(decimals) || decimals < 0) {\r\n throw TypeError(\r\n `decimals must be an integer >= 0, received ${typeof decimals}: ${decimals}`\r\n );\r\n }\r\n\r\n return (\r\n Math.round((num + Number.EPSILON) * Math.pow(10, decimals)) /\r\n Math.pow(10, decimals)\r\n );\r\n}\r\n\r\n/**\r\n * Convert a byte to its two character, hexadecimal uppercase representation.\r\n * @param {byte} input Byte (between 0 and 255) to convert to 2-letter hex value.\r\n * @returns {string} The input converted to a two-character hex string.\r\n */\r\nexport function byteToHex(input) {\r\n if (!isInt(input) || input < 0 || input > 255) {\r\n throw TypeError(\r\n `input must be an integer >= 0, <= 255, received ${typeof input}: ${input}`\r\n );\r\n }\r\n return (\"0\" + Number(input).toString(16)).slice(-2).toUpperCase();\r\n}\r\n//#endregion\r\n\r\n/**\r\n * Get the viewer defining url path from a project type in the format \"/path/\".\r\n * @param {string} projectType Name of the project type.\r\n * @returns {string} Viewer defining path for URL.\r\n */\r\nexport function viewerType(projectType) {\r\n if (typeof projectType !== \"string\")\r\n throw TypeError(\r\n `projectType must be of type string, received ${typeof projectType}: ${projectType}`\r\n );\r\n projectType = projectType.toLowerCase();\r\n // Spectra Viewer\r\n if (\r\n projectType.includes(\"esrtraining\") ||\r\n projectType.includes(\"esrevaluation\")\r\n ) {\r\n return \"/esr_view/\";\r\n }\r\n // Proteome Viewer\r\n else if (projectType.includes(\"proteomeanalysis\")) {\r\n return \"/proteome_view/\";\r\n }\r\n // Audio Viewer\r\n else if (projectType.includes(\"audioannotator\")) {\r\n return \"/audio_view/\";\r\n }\r\n // Image Viewer\r\n else {\r\n return \"/view/\";\r\n }\r\n}\r\n\r\n/**\r\n * Download a json object as a file with a given name.\r\n * @param {JSON} jsonObject The JSON object to save.\r\n * @param {string} downloadName Optional. How the file will be called once downloaded.\r\n * Needs not end in .json. Defaults to export.json.\r\n */\r\nexport function downloadJsonObjectAsFile(\r\n jsonObject,\r\n downloadName = \"export.json\"\r\n) {\r\n if (!isObject(jsonObject))\r\n throw TypeError(\r\n `jsonObject must be of type object, received ${typeof jsonObject}: ${jsonObject}`\r\n );\r\n if (typeof downloadName !== \"string\")\r\n throw TypeError(\r\n `downloadName must be of type string, received ${typeof downloadName}: ${downloadName}`\r\n );\r\n if (downloadName.length <= 0)\r\n throw Error(`downloadName must not be empty, received: ${downloadName}`);\r\n\r\n let dataStr =\r\n \"data:text/json;charset=utf-8,\" +\r\n encodeURIComponent(JSON.stringify(jsonObject));\r\n\r\n let dlAnchorElem = document.createElement(\"a\");\r\n dlAnchorElem.setAttribute(\"href\", dataStr);\r\n dlAnchorElem.setAttribute(\"download\", downloadName);\r\n dlAnchorElem.click();\r\n dlAnchorElem.remove();\r\n}\r\n\r\n/**\r\n * Download an array as a file with a given name.\r\n * @param {array} arrayIn The array to save.\r\n * @param {string} downloadName Optional. How the file will be called once downloaded.\r\n * Needs not end in .json. Defaults to export.json.\r\n */\r\nexport function downloadArrayAsFile(arrayIn, downloadName = \"export.json\") {\r\n if (!isArray(arrayIn))\r\n throw TypeError(\r\n `arrayIn must be of type array, received ${typeof arrayIn}: ${arrayIn}`\r\n );\r\n if (typeof downloadName !== \"string\")\r\n throw TypeError(\r\n `downloadName must be of type string, received ${typeof downloadName}: ${downloadName}`\r\n );\r\n if (downloadName.length <= 0)\r\n throw Error(`downloadName must not be empty, received: ${downloadName}`);\r\n\r\n let dataStr =\r\n \"data:text/json;charset=utf-8,\" +\r\n encodeURIComponent(JSON.stringify(arrayIn));\r\n\r\n let dlAnchorElem = document.createElement(\"a\");\r\n dlAnchorElem.setAttribute(\"href\", dataStr);\r\n dlAnchorElem.setAttribute(\"download\", downloadName);\r\n dlAnchorElem.click();\r\n dlAnchorElem.remove();\r\n}\r\n\r\n/**\r\n * Creates pop-up window to import a file via http input field.\r\n * @param {Array} acceptedFileTypes Strings of file endings allowed to import (including the dot, e.g. .json).\r\n * @returns {Promise} The files to import.\r\n */\r\nexport async function requestFileInput(acceptedFileTypes) {\r\n if (!Array.isArray(acceptedFileTypes))\r\n throw TypeError(\r\n `acceptedFileTypes must be an Array, received ${typeof acceptedFileTypes}: ${acceptedFileTypes}`\r\n );\r\n\r\n return new Promise((resolve) => {\r\n // Import window\r\n const inputElem = document.createElement(\"INPUT\");\r\n inputElem.setAttribute(\"type\", \"file\");\r\n inputElem.setAttribute(\"onChange\", \"file\");\r\n inputElem.setAttribute(\"accept\", acceptedFileTypes);\r\n inputElem.onchange = (e) => resolve(e.target.files);\r\n inputElem.click();\r\n inputElem.remove();\r\n });\r\n}\r\n\r\n/**\r\n * Shuffles array in place using Fisher-Yates algorithm.\r\n * @param {Array} a An array containing items to be shuffled.\r\n * @returns {Array} The shuffled array\r\n */\r\nexport function shuffle(a) {\r\n if (!Array.isArray(a))\r\n throw TypeError(`a must be of type Array, received ${typeof a}: ${a}`);\r\n\r\n for (let i = a.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [a[i], a[j]] = [a[j], a[i]];\r\n }\r\n return a;\r\n}\r\n\r\n/**\r\n * if there were no new calls of this function for the delay time, the newest func will be triggered\r\n * @param {function} func callback function\r\n * @param {int} delay in ms\r\n * @returns\r\n */\r\nexport function debounce(fn, delay) {\r\n let timeoutId;\r\n return function (...args) {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n timeoutId = setTimeout(() => {\r\n fn(...args);\r\n }, delay);\r\n };\r\n}\r\n\r\n/**\r\n * Given an index and the total number of entries, return the log-scaled value.\r\n * @param {int} idx Index of all numbers to take logarithm of.\r\n * @param {int} total Total number of indicies.\r\n * @param {number} base Optional. Base of logarithm. Defaults to 10.\r\n * @returns\r\n */\r\nexport function logScale(idx, total, base = 10) {\r\n const logmax = logBase(total + 1, base);\r\n const exp = (logmax * idx) / total;\r\n return Math.round(Math.pow(base, exp) - 1);\r\n}\r\n\r\n/**\r\n * Takes the logarithm of a number to a given base.\r\n * @param {number} val Value to calculate logarithm for.\r\n * @param {number} base Base to take logarithem to.\r\n * @returns {number} log_base(val)\r\n */\r\nexport function logBase(val, base) {\r\n return Math.log(val) / Math.log(base);\r\n}\r\n\r\nfunction hexToRgba(hex) {\r\n const regex = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})?$/i;\r\n const result = regex.exec(hex);\r\n\r\n if (!result) {\r\n return null;\r\n }\r\n\r\n const [, r, g, b, a] = result;\r\n\r\n return {\r\n r: parseInt(r, 16),\r\n g: parseInt(g, 16),\r\n b: parseInt(b, 16),\r\n a: a ? parseInt(a, 16) / 255 : 1,\r\n };\r\n}\r\n\r\n/**\r\n * Determines if a given color is light or dark.\r\n * @param {string} color - The hex code of the color to check.\r\n * @returns {boolean} True if the color is light, false if it is dark.\r\n */\r\n\r\nexport function isColorLight(color) {\r\n // Convert the color to RGB\r\n const rgba = hexToRgba(color);\r\n\r\n // If the color is light because of transparence, return true imeediately\r\n if (rgba.a < 0.5) return true;\r\n\r\n // Calculate the luminance using the formula for relative luminance defined in WCAG 2.0\r\n const luminance = 0.2126 * rgba.r + 0.7152 * rgba.g + 0.0722 * rgba.b;\r\n\r\n // Set the threshold for light colors\r\n const threshold = 186;\r\n\r\n // Return true if the luminance is greater than the threshold for light colors\r\n return luminance > threshold;\r\n}\r\n","import { calcBoundingBox, simplifyRegions } from \"../utils/PolygonUtil\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport * as turf from \"@turf/turf\";\r\n\r\n// Base class of a roi\r\n// Depreciated?\r\nexport class BaseROI {\r\n constructor() {\r\n this.strokeColor = \"green\";\r\n this.fillColor = null;\r\n }\r\n}\r\n\r\nexport class CommentROI {\r\n constructor(regions, color, type, commentValue, computedValue) {\r\n this.inverted = false;\r\n this.fontScaleFactor = 1;\r\n this.regions = regions;\r\n this.color = color;\r\n this.type = type;\r\n this.commentValue = commentValue;\r\n this.computedValue = computedValue;\r\n this.updateBounds();\r\n }\r\n\r\n updateBounds() {\r\n this.bounds = calcBoundingBox([this.regions]);\r\n this.width = this.bounds.right - this.bounds.left;\r\n this.height = this.bounds.bottom - this.bounds.top;\r\n }\r\n\r\n containsPoint(p) {\r\n return !(\r\n p.x < this.bounds.left ||\r\n p.x > this.bounds.right ||\r\n p.y < this.bounds.top ||\r\n p.y > this.bounds.bottom\r\n );\r\n }\r\n}\r\n\r\n// polygon roi\r\nexport class RegionROI {\r\n isObject = false;\r\n constructor(obj) {\r\n this.setRegions(obj.regions ? obj.regions : obj);\r\n //this.regions = bufferSimplifyRegions(this.regions); //simplify old regions with small gap\r\n this.uuid = uuidv4();\r\n this.inverted = false;\r\n\r\n this.center = {\r\n x: this.bounds.left + (this.bounds.right - this.bounds.left) / 2,\r\n y: this.bounds.top + (this.bounds.bottom - this.bounds.top) / 2,\r\n };\r\n this.borderColor = \"4px solid white\";\r\n\r\n this.isSubtype = obj.subtype\r\n ? obj.subtype\r\n : obj.isSubtype\r\n ? obj.isSubtype\r\n : false;\r\n this.color = obj.color1 ? obj.color1 : obj.color ? obj.color : \"#FFFFFF\";\r\n this.subtypeName = obj.name\r\n ? obj.name\r\n : obj.subtypeName\r\n ? obj.subtypeName\r\n : \"\";\r\n this.aiAnnotated = obj.ai\r\n ? obj.ai\r\n : obj.aiAnnotated\r\n ? obj.aiAnnotated\r\n : false;\r\n this.isAnnotated = obj.annotated\r\n ? obj.annotated\r\n : obj.isAnnotated\r\n ? obj.isAnnotated\r\n : false;\r\n this.isLabeled = obj.labeled\r\n ? obj.labeled\r\n : obj.isLabeled\r\n ? obj.isLabeled\r\n : false;\r\n this.isSelObj = obj.isSel ? obj.isSel : obj.isSelObj ? obj.isSelObj : false;\r\n this.isSaved = obj.saved ? obj.saved : obj.isSaved ? obj.isSaved : false;\r\n this.z = obj.z ? obj.z : -1;\r\n this.fullyLoaded = obj.fullyLoaded ? obj.fullyLoaded : false;\r\n this.comment = obj.comment ? obj.comment : \"\";\r\n this.tileName = obj.tileName ? obj.tileName : \"\";\r\n this.structureId = obj.structureId ? obj.structureId : 0;\r\n this.selected = obj.selected ? obj.selected : false;\r\n this.selectedWithKey = obj.selectedWithKey ? obj.selectedWithKey : false;\r\n this.frequencyClass = obj.frequencyClass ? obj.frequencyClass : -1;\r\n this.isObject = obj.isObject ? obj.isObject : false;\r\n if (this.regions[0].length > 5) this.isObject = false; //can not be object\r\n\r\n this.isStartData = false;\r\n this.aiIdx = 0;\r\n this.galleryIndex = null;\r\n this.firstTimeGallery = true;\r\n\r\n this.treeItem = {\r\n minX: this.bounds.left,\r\n minY: this.bounds.top,\r\n maxX: this.bounds.right,\r\n maxY: this.bounds.bottom,\r\n roi: this,\r\n };\r\n }\r\n\r\n copy = () => {\r\n let roiCopy = new RegionROI(this);\r\n roiCopy.regions = JSON.parse(JSON.stringify(this.regions)); // [...this.regions];\r\n roiCopy.uuid = this.uuid;\r\n roiCopy.color = this.color;\r\n roiCopy.isSubtype = this.isSubtype;\r\n roiCopy.isAnnotated = this.isAnnotated;\r\n roiCopy.subtypeName = this.subtypeName;\r\n roiCopy.structureId = this.structureId;\r\n roiCopy.isLabeled = this.isLabeled;\r\n roiCopy.isSelObj = this.isSelObj;\r\n roiCopy.aiAnnotated = this.aiAnnotated;\r\n return roiCopy;\r\n };\r\n\r\n getPointOnPoly() {\r\n let poly = turf.polygon(this.regions);\r\n var pointOnPolygon = turf.centerOfMass(poly);\r\n return {\r\n x: pointOnPolygon.geometry.coordinates[0],\r\n y: pointOnPolygon.geometry.coordinates[1],\r\n };\r\n }\r\n\r\n /** Create turf region for coordinate set.\r\n *\r\n * @param {Array} regions Regions to be edited. Must have format [[[x,y], ..., [x,y]]]\r\n */\r\n setRegions(regions) {\r\n try {\r\n // Allow redundant styles of nesting\r\n if (typeof regions[0][0] === \"number\") {\r\n regions = [regions];\r\n } else if (typeof regions[0][0][0] === \"number\") {\r\n // regions = regions; -> Do nothing\r\n } else {\r\n regions = regions[0];\r\n }\r\n\r\n // use less float digits\r\n for (let region of regions) {\r\n for (let point of region) {\r\n point[0] = +point[0].toFixed(2);\r\n point[1] = +point[1].toFixed(2);\r\n }\r\n }\r\n\r\n for (let region of regions) {\r\n if (\r\n region[0][0] !== region[region.length - 1][0] ||\r\n region[0][1] !== region[region.length - 1][1]\r\n ) {\r\n region.push(region[0]);\r\n }\r\n }\r\n this.bounds = calcBoundingBox(regions);\r\n try {\r\n let poly = turf.polygon(regions);\r\n let converted = turf.toWgs84(poly);\r\n this.area = turf.area(converted);\r\n } catch (e) {\r\n this.area = -1;\r\n }\r\n if (this.area < 0) {\r\n this.area =\r\n (this.bounds.right - this.bounds.left) *\r\n (this.bounds.bottom - this.bounds.top);\r\n }\r\n\r\n this.regions = regions; // simplifyRegions(regions, 0.01);\r\n } catch {\r\n console.log(\"Error, regions could not be set:\", regions);\r\n }\r\n }\r\n\r\n removeDuplicates(inputRegions) {\r\n for (let regions of inputRegions) {\r\n let resultRegions = [];\r\n if (regions.length > 2) {\r\n regions.push(regions[0]);\r\n let resultRegions = [regions[0]];\r\n for (let i = 1; i < regions.length; i++) {\r\n let p1 = regions[i - 1];\r\n let p2 = regions[i];\r\n let isEqual = p1[0] === p2[0] && p1[1] === p2[1];\r\n if (!isEqual) {\r\n resultRegions.push(p2);\r\n }\r\n }\r\n }\r\n inputRegions = resultRegions;\r\n }\r\n return inputRegions;\r\n }\r\n\r\n getRectRegions() {\r\n return [\r\n [\r\n [this.bounds.left, this.bounds.top],\r\n [this.bounds.right, this.bounds.top],\r\n [this.bounds.right, this.bounds.bottom],\r\n [this.bounds.left, this.bounds.bottom],\r\n [this.bounds.left, this.bounds.top],\r\n ],\r\n ];\r\n }\r\n\r\n getSimplifiedRectRegions() {\r\n return [\r\n [\r\n [parseInt(this.bounds.left, 10), parseInt(this.bounds.top, 10)],\r\n [parseInt(this.bounds.right, 10), parseInt(this.bounds.top, 10)],\r\n [parseInt(this.bounds.right, 10), parseInt(this.bounds.bottom, 10)],\r\n [parseInt(this.bounds.left, 10), parseInt(this.bounds.bottom, 10)],\r\n [parseInt(this.bounds.left, 10), parseInt(this.bounds.top, 10)],\r\n ],\r\n ];\r\n }\r\n\r\n //return regions, so that rendering is still fast\r\n getDynamicRegions(comp, numObjects) {\r\n if (comp > 0.001 || numObjects < 100) {\r\n //if big, return original\r\n return this.regions;\r\n }\r\n\r\n if (comp < 0.00005) {\r\n //if very small return rectangles (bounding box)\r\n return this.getSimplifiedRectRegions();\r\n } else if (typeof this.intRegions === \"undefined\") {\r\n //else return rounded polygon\r\n this.intRegions = this.regions.map((regions) => {\r\n return regions.map((p) => [parseInt(p[0], 10), parseInt(p[1], 10)]);\r\n });\r\n }\r\n\r\n if (comp < 0.0005) {\r\n if (typeof this.simplifyedRegions === \"undefined\") {\r\n this.simplifyedRegions = simplifyRegions(this.intRegions, 1);\r\n }\r\n return this.simplifyedRegions;\r\n }\r\n return this.intRegions;\r\n }\r\n\r\n intersects(p1, p2) {\r\n return !(\r\n p2.x < this.bounds.left ||\r\n p1.x > this.bounds.right ||\r\n p2.y < this.bounds.top ||\r\n p1.y > this.bounds.bottom\r\n );\r\n }\r\n\r\n boundsAreaCompare(p1, p2) {\r\n let pArea = Math.abs(p2.x - p1.x) * Math.abs(p2.y - p1.y);\r\n let b = this.bounds;\r\n let area = Math.abs(b.right - b.left) * Math.abs(b.bottom - b.top);\r\n return area / pArea;\r\n }\r\n\r\n sameBoundsWith(roi) {\r\n return (\r\n this.bounds.left === roi.bounds.left &&\r\n this.bounds.right === roi.bounds.right &&\r\n this.bounds.top === roi.bounds.top &&\r\n this.bounds.bottom === roi.bounds.bottom\r\n );\r\n }\r\n}\r\n\r\n// simple recatangle roi\r\n// Depreciated?\r\nexport class RectROI extends BaseROI {\r\n constructor(ctx, x, y, w, h, drawingMode = false) {\r\n super();\r\n this.x = x;\r\n this.y = y;\r\n this.w = w;\r\n this.h = h;\r\n this.ctx = ctx;\r\n if (drawingMode) {\r\n this.resizePoint = 3;\r\n }\r\n }\r\n\r\n summary() {\r\n return (\r\n \"Rect (\" +\r\n Math.round(this.x) +\r\n \",\" +\r\n Math.round(this.y) +\r\n \",\" +\r\n Math.round(this.w) +\r\n \",\" +\r\n Math.round(this.h) +\r\n \")\"\r\n );\r\n }\r\n\r\n handleMouseDown(p1) {\r\n let cornerRadius = 5 / this.ctx.getTransform().a;\r\n if (\r\n p1.x >= this.x - cornerRadius &&\r\n p1.x <= this.x + cornerRadius &&\r\n p1.y >= this.y - cornerRadius &&\r\n p1.y <= this.y + cornerRadius\r\n ) {\r\n this.resizePoint = 0;\r\n return 2;\r\n } else if (\r\n p1.x >= this.x + this.w - cornerRadius &&\r\n p1.x <= this.x + this.w + cornerRadius &&\r\n p1.y >= this.y - cornerRadius &&\r\n p1.y <= this.y + cornerRadius\r\n ) {\r\n this.resizePoint = 1;\r\n return 2;\r\n } else if (\r\n p1.x >= this.x - cornerRadius &&\r\n p1.x <= this.x + cornerRadius &&\r\n p1.y >= this.y + this.h - cornerRadius &&\r\n p1.y <= this.y + this.h + cornerRadius\r\n ) {\r\n this.resizePoint = 2;\r\n return 2;\r\n } else if (\r\n p1.x >= this.x + this.w - cornerRadius &&\r\n p1.x <= this.x + this.w + cornerRadius &&\r\n p1.y >= this.y + this.h - cornerRadius &&\r\n p1.y <= this.y + this.h + cornerRadius\r\n ) {\r\n this.resizePoint = 3;\r\n return 2;\r\n } else if (\r\n p1.x >= this.x &&\r\n p1.x <= this.x + this.w &&\r\n p1.y >= this.y &&\r\n p1.y <= this.y + this.h\r\n ) {\r\n this.dragStart = p1;\r\n return 1;\r\n }\r\n }\r\n\r\n handleMouseMove(p1) {\r\n let cornerRadius = 5 / this.ctx.getTransform().a;\r\n if (\r\n p1.x >= this.x - cornerRadius &&\r\n p1.x <= this.x + cornerRadius &&\r\n p1.y >= this.y - cornerRadius &&\r\n p1.y <= this.y + cornerRadius\r\n ) {\r\n this.ctx.canvas.style.cursor = \"se-resize\";\r\n this.hovered = true;\r\n } else if (\r\n p1.x >= this.x + this.w - cornerRadius &&\r\n p1.x <= this.x + this.w + cornerRadius &&\r\n p1.y >= this.y - cornerRadius &&\r\n p1.y <= this.y + cornerRadius\r\n ) {\r\n this.ctx.canvas.style.cursor = \"ne-resize\";\r\n this.hovered = true;\r\n } else if (\r\n p1.x >= this.x - cornerRadius &&\r\n p1.x <= this.x + cornerRadius &&\r\n p1.y >= this.y + this.h - cornerRadius &&\r\n p1.y <= this.y + this.h + cornerRadius\r\n ) {\r\n this.ctx.canvas.style.cursor = \"ne-resize\";\r\n this.hovered = true;\r\n } else if (\r\n p1.x >= this.x + this.w - cornerRadius &&\r\n p1.x <= this.x + this.w + cornerRadius &&\r\n p1.y >= this.y + this.h - cornerRadius &&\r\n p1.y <= this.y + this.h + cornerRadius\r\n ) {\r\n this.ctx.canvas.style.cursor = \"se-resize\";\r\n this.hovered = true;\r\n } else if (\r\n p1.x >= this.x &&\r\n p1.x <= this.x + this.w &&\r\n p1.y >= this.y &&\r\n p1.y <= this.y + this.h\r\n ) {\r\n if (this.ctx.canvas.style.cursor === \"default\") {\r\n this.ctx.canvas.style.cursor = \"pointer\";\r\n }\r\n this.hovered = true;\r\n } else {\r\n this.hovered = false;\r\n }\r\n }\r\n\r\n handleMouseUp() {\r\n // heal rois (fix negative width and height)\r\n if (this.w < 0) {\r\n this.x += this.w;\r\n this.w = -this.w;\r\n }\r\n if (this.h < 0) {\r\n this.y += this.h;\r\n this.h = -this.h;\r\n }\r\n }\r\n\r\n drag(p1, vw, vh) {\r\n // apply relative movement\r\n this.x += p1.x - this.dragStart.x;\r\n this.y += p1.y - this.dragStart.y;\r\n\r\n // check if out of image bounds\r\n this.x = Math.max(Math.min(vw - this.w, this.x), 0);\r\n this.y = Math.max(Math.min(vh - this.h, this.y), 0);\r\n\r\n // save cursor position\r\n this.dragStart = p1;\r\n }\r\n\r\n resize(p1, vw, vh) {\r\n // check if out of image bounds\r\n p1.x = Math.max(Math.min(vw, p1.x), 0);\r\n p1.y = Math.max(Math.min(vh, p1.y), 0);\r\n\r\n if (this.resizePoint === 0) {\r\n this.w -= p1.x - this.x;\r\n this.x = p1.x;\r\n this.h -= p1.y - this.y;\r\n this.y = p1.y;\r\n\r\n if ((this.w > 0 && this.h > 0) || (this.w < 0 && this.h < 0)) {\r\n this.ctx.canvas.style.cursor = \"se-resize\";\r\n } else {\r\n this.ctx.canvas.style.cursor = \"ne-resize\";\r\n }\r\n } else if (this.resizePoint === 1) {\r\n this.w += p1.x - this.w - this.x;\r\n this.h -= p1.y - this.y;\r\n this.y = p1.y;\r\n\r\n if ((this.w > 0 && this.h > 0) || (this.w < 0 && this.h < 0)) {\r\n this.ctx.canvas.style.cursor = \"ne-resize\";\r\n } else {\r\n this.ctx.canvas.style.cursor = \"se-resize\";\r\n }\r\n } else if (this.resizePoint === 2) {\r\n this.w -= p1.x - this.x;\r\n this.x = p1.x;\r\n this.h += p1.y - this.h - this.y;\r\n\r\n if ((this.w > 0 && this.h > 0) || (this.w < 0 && this.h < 0)) {\r\n this.ctx.canvas.style.cursor = \"ne-resize\";\r\n } else {\r\n this.ctx.canvas.style.cursor = \"se-resize\";\r\n }\r\n } else if (this.resizePoint === 3) {\r\n this.w += p1.x - this.w - this.x;\r\n this.h += p1.y - this.h - this.y;\r\n\r\n if ((this.w > 0 && this.h > 0) || (this.w < 0 && this.h < 0)) {\r\n this.ctx.canvas.style.cursor = \"se-resize\";\r\n } else {\r\n this.ctx.canvas.style.cursor = \"ne-resize\";\r\n }\r\n }\r\n }\r\n\r\n draw() {\r\n this.ctx.strokeStyle = this.strokeColor;\r\n\r\n if (this.hovered) this.ctx.strokeStyle = \"yellow\";\r\n\r\n // fixed line width\r\n this.ctx.lineWidth = 2 / this.ctx.getTransform().a;\r\n\r\n // custom drawing\r\n this.ctx.beginPath();\r\n this.ctx.rect(this.x, this.y, this.w, this.h);\r\n this.ctx.stroke();\r\n this.ctx.closePath();\r\n\r\n if (this.hovered) {\r\n this.ctx.lineWidth = 1 / this.ctx.getTransform().a;\r\n let cornerDiameter = 10 / this.ctx.getTransform().a;\r\n let cornerRadius = 5 / this.ctx.getTransform().a;\r\n\r\n this.ctx.fillStyle = \"white\";\r\n this.ctx.strokeStyle = \"black\";\r\n\r\n // draw corner haptic\r\n this.ctx.beginPath();\r\n this.ctx.rect(\r\n this.x - cornerRadius,\r\n this.y - cornerRadius,\r\n cornerDiameter,\r\n cornerDiameter\r\n );\r\n this.ctx.rect(\r\n this.x + this.w - cornerRadius,\r\n this.y - cornerRadius,\r\n cornerDiameter,\r\n cornerDiameter\r\n );\r\n this.ctx.rect(\r\n this.x - cornerRadius,\r\n this.y + this.h - cornerRadius,\r\n cornerDiameter,\r\n cornerDiameter\r\n );\r\n this.ctx.rect(\r\n this.x + this.w - cornerRadius,\r\n this.y + this.h - cornerRadius,\r\n cornerDiameter,\r\n cornerDiameter\r\n );\r\n this.ctx.fill();\r\n this.ctx.stroke();\r\n this.ctx.closePath();\r\n }\r\n }\r\n}\r\n\r\nfunction getFirstValidatedIndexValue(item, index) {\r\n if (item && item[index] && item[index].length > 0) {\r\n return item[index][0];\r\n } else {\r\n return item;\r\n }\r\n}\r\n\r\nexport function createRoisFromAnno(anno) {\r\n return anno.geoJSON.coordinates\r\n .filter((c) => c.length > 0)\r\n .map((c, index) => {\r\n const r = new RegionROI({\r\n regions: c,\r\n color1: getFirstValidatedIndexValue(anno.geoJSON.color1, index),\r\n subtype: getFirstValidatedIndexValue(anno.geoJSON.subtype, index),\r\n name: getFirstValidatedIndexValue(anno.geoJSON.name, index),\r\n ai: getFirstValidatedIndexValue(anno.geoJSON.aiAnnotated, index),\r\n annotated: getFirstValidatedIndexValue(anno.geoJSON.isAnnotated, index),\r\n labeled: getFirstValidatedIndexValue(anno.geoJSON.isLabeled, index),\r\n isSel: getFirstValidatedIndexValue(anno.geoJSON.isSelObj, index),\r\n saved: getFirstValidatedIndexValue(anno.geoJSON.isSaved, index),\r\n z: getFirstValidatedIndexValue(anno.geoJSON.z, index),\r\n comment: getFirstValidatedIndexValue(anno.geoJSON.comment, index),\r\n tileName: getFirstValidatedIndexValue(anno.geoJSON.tileName, index),\r\n structureId: getFirstValidatedIndexValue(\r\n anno.geoJSON.structureId,\r\n index\r\n ),\r\n isObject: getFirstValidatedIndexValue(anno.geoJSON.isObject, index),\r\n frequencyCl: getFirstValidatedIndexValue(anno.geoJSON.frequencyClass),\r\n });\r\n return r;\r\n });\r\n}\r\n","import PolyBool from \"polybooljs\";\r\n\r\nimport { RegionROI } from \"./ROI\";\r\nimport * as turf from \"@turf/turf\";\r\n//import { booleanIntersects, difference, simplify } from \"@turf/turf\";\r\n// use old turf library, since new turf lib breaks GeoJSON coordinates when buffering\r\nimport { buffer } from \"turf\";\r\n\r\n//default: 0.0000000001\r\nPolyBool.epsilon(0.0000000001);\r\n\r\nexport function lineArrayBuffer(lineArray, radius, vw, vh) {\r\n if (lineArray === undefined || lineArray.length === 0) return;\r\n if (lineArray.length === 1) {\r\n lineArray = [lineArray[0], lineArray[0]];\r\n }\r\n let feature =\r\n lineArray.length > 1 ? turf.lineString(lineArray) : turf.point(lineArray);\r\n let buffered = buffer(feature, radius * 110);\r\n let viewRect = turf.bboxPolygon([0, 0, vw, vh]);\r\n let result = null;\r\n try {\r\n result = turf.intersect(buffered, viewRect);\r\n } catch {\r\n console.log(\"pen tool error:\", buffered, viewRect);\r\n return null;\r\n }\r\n return result;\r\n}\r\n\r\nexport function circleToPolygon(center, radius, numberOfSegments) {\r\n let n = numberOfSegments ? numberOfSegments : 32;\r\n let coordinates = [];\r\n\r\n for (let i = 0; i < n; ++i) {\r\n coordinates.push([\r\n center[0] + radius * Math.cos((2 * Math.PI * i) / n),\r\n center[1] + radius * Math.sin((2 * Math.PI * i) / n),\r\n ]);\r\n }\r\n\r\n return {\r\n regions: [coordinates],\r\n inverted: false,\r\n };\r\n}\r\n\r\nexport function distance(p1, p2) {\r\n let deltaX = p1.x - p2.x;\r\n let deltaY = p1.y - p2.y;\r\n return Math.sqrt(deltaX * deltaX + deltaY * deltaY);\r\n}\r\n\r\nexport function pointsToCirclePolygon(p1, p2, numberOfSegments, vw, vh) {\r\n let n = numberOfSegments ? numberOfSegments : 32;\r\n let center = {\r\n x: (p1.x + p2.x) / 2,\r\n y: (p1.y + p2.y) / 2,\r\n };\r\n let dist = distance(p1, center);\r\n let coordinates = [];\r\n let x = center.x - dist;\r\n let y = center.y - dist;\r\n let w = 2 * dist;\r\n let h = 2 * dist;\r\n\r\n for (let i = 0; i < n; ++i) {\r\n let point = [\r\n x + w / 2 + (w / 2) * Math.cos((2 * Math.PI * i) / n),\r\n y + h / 2 + (h / 2) * Math.sin((2 * Math.PI * i) / n),\r\n ];\r\n point[0] = Math.max(0, point[0]);\r\n point[1] = Math.max(0, point[1]);\r\n point[0] = Math.min(vw, point[0]);\r\n point[1] = Math.min(vh, point[1]);\r\n coordinates.push(point);\r\n }\r\n\r\n return {\r\n regions: [coordinates],\r\n inverted: false,\r\n };\r\n}\r\n\r\nexport function rectangleToEllipyePolygon(x, y, w, h, numberOfSegments) {\r\n let n = numberOfSegments ? numberOfSegments : 32;\r\n let coordinates = [];\r\n\r\n for (let i = 0; i < n; ++i) {\r\n coordinates.push([\r\n x + w / 2 + (w / 2) * Math.cos((2 * Math.PI * i) / n),\r\n y + h / 2 + (h / 2) * Math.sin((2 * Math.PI * i) / n),\r\n ]);\r\n }\r\n\r\n return {\r\n regions: [coordinates],\r\n inverted: false,\r\n };\r\n}\r\n\r\nexport function lineToPolygon(start, stop, width) {\r\n let coordinates = [];\r\n\r\n let normalVector = [-(stop[1] - start[1]), stop[0] - start[0]];\r\n\r\n let normalVectorLength = Math.sqrt(\r\n normalVector[0] * normalVector[0] + normalVector[1] * normalVector[1]\r\n );\r\n normalVector[0] /= normalVectorLength;\r\n normalVector[1] /= normalVectorLength;\r\n\r\n coordinates.push([\r\n start[0] + (normalVector[0] * width) / 2,\r\n start[1] + (normalVector[1] * width) / 2,\r\n ]);\r\n coordinates.push([\r\n stop[0] + (normalVector[0] * width) / 2,\r\n stop[1] + (normalVector[1] * width) / 2,\r\n ]);\r\n coordinates.push([\r\n stop[0] - (normalVector[0] * width) / 2,\r\n stop[1] - (normalVector[1] * width) / 2,\r\n ]);\r\n coordinates.push([\r\n start[0] - (normalVector[0] * width) / 2,\r\n start[1] - (normalVector[1] * width) / 2,\r\n ]);\r\n\r\n return {\r\n regions: [coordinates],\r\n inverted: false,\r\n };\r\n}\r\n\r\nexport function simplifyRegions(regions, tolerance) {\r\n let poly = turf.polygon(regions);\r\n let simplifiedPoly = regions;\r\n try {\r\n simplifiedPoly = turf.simplify(poly, {\r\n tolerance: tolerance,\r\n highQuality: false,\r\n });\r\n } catch (e) {\r\n return regions;\r\n }\r\n\r\n return simplifiedPoly.geometry.coordinates;\r\n}\r\n\r\nexport function bufferSimplifyRegions(regions) {\r\n let poly = turf.polygon(regions);\r\n poly = buffer(poly, -5);\r\n if (poly.geometry.coordinates[0].length === 0) return regions;\r\n let simplifiedPoly = turf.simplify(poly, {\r\n tolerance: 0.05,\r\n highQuality: false,\r\n });\r\n return simplifiedPoly.geometry.coordinates;\r\n}\r\n\r\n/**\r\n * Calculates the bounding box around an object, not considering holes.\r\n * Holes are calculated individually.\r\n * Results in a rect object with top, botton, left, and right properties.\r\n * @param {Array[[float, float]]} region Coordinates as array of point arrays.\r\n * @returns {object} Rectangle object containing top, botton, left, and right properties.\r\n */\r\nexport function calcBoundingBox(region) {\r\n if (region.length === 0) {\r\n // region is empty\r\n return { left: 0, top: 0, right: 0, bottom: 0 };\r\n }\r\n let rect = {\r\n left: region[0][region[0].length - 1][0],\r\n top: region[0][region[0].length - 1][1],\r\n right: region[0][region[0].length - 1][0],\r\n bottom: region[0][region[0].length - 1][1],\r\n };\r\n for (let p of region[0]) {\r\n if (p[0] < rect.left) rect.left = p[0];\r\n if (p[0] > rect.right) rect.right = p[0];\r\n if (p[1] < rect.top) rect.top = p[1];\r\n if (p[1] > rect.bottom) rect.bottom = p[1];\r\n }\r\n return rect;\r\n}\r\n\r\n/**\r\n * Calculates the bounding box around an object.\r\n * Results in a rect object with top, botton, left, and right properties.\r\n * @param {Array[Array[[float, float]]]} roiCoords GeoJson coordinates as array.\r\n * @returns Rectangle object containing top, botton, left, and right properties.\r\n */\r\nexport function calcBoundingBoxFullObject(roiCoords) {\r\n // Validity checks\r\n if (!roiCoords?.length) {\r\n throw new Error(\r\n \"Invalid or empty ROI supplied, cannot calculate bounding box\"\r\n );\r\n }\r\n\r\n // Only consider first coordinate set, the rest contain holes.\r\n if (!roiCoords[0]?.length) {\r\n throw new Error(\r\n \"Invalid or empty area supplied, cannot calculate bounding box\"\r\n );\r\n }\r\n return calcBoundingBox([roiCoords[0]]);\r\n}\r\n\r\nexport function getTreeItem(regions) {\r\n let bounds = calcBoundingBox(regions);\r\n return {\r\n minX: bounds.left,\r\n minY: bounds.top,\r\n maxX: bounds.right,\r\n maxY: bounds.bottom,\r\n used: false,\r\n regions: regions[0],\r\n };\r\n}\r\n\r\nexport function calcBoundingBoxes(layer) {\r\n let rects = [];\r\n for (let roi of layer.regionRois) {\r\n let region = roi.region;\r\n if (region[region.length - 1]) {\r\n rects.push(calcBoundingBox(region));\r\n }\r\n }\r\n return rects;\r\n}\r\n\r\nexport function intersectRect(r1, r2) {\r\n return !(\r\n r2.left >= r1.right ||\r\n r2.right <= r1.left ||\r\n r2.top >= r1.bottom ||\r\n r2.bottom <= r1.top\r\n );\r\n}\r\n\r\nexport function pointInsidePoly(p, polyPoints) {\r\n let x = p.x,\r\n y = p.y;\r\n let intersections = 0;\r\n let ss = \"\";\r\n for (let i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) {\r\n let xi = polyPoints[i][0],\r\n yi = polyPoints[i][1];\r\n let xj = polyPoints[j][0],\r\n yj = polyPoints[j][1];\r\n if (yj === yi && yj === y && x > Math.min(xj, xi) && x < Math.max(xj, xi)) {\r\n // Check if point is on an horizontal polygon boundary\r\n return true;\r\n }\r\n\r\n if (\r\n y > Math.min(yj, yi) &&\r\n y <= Math.max(yj, yi) &&\r\n x <= Math.max(xj, xi) &&\r\n yj !== yi\r\n ) {\r\n ss = ((y - yj) * (xi - xj)) / (yi - yj) + xj;\r\n if (ss === x) {\r\n // Check if point is on the polygon boundary (other than horizontal)\r\n return true;\r\n }\r\n if (xj === xi || x <= ss) {\r\n intersections++;\r\n }\r\n }\r\n }\r\n // If the number of edges we passed through is odd, then it’s in the polygon.\r\n if (intersections % 2 !== 0) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\nexport function pointInsideRegion(p, region) {\r\n let turfPoint = turf.point([p.x, p.y]);\r\n let turfPoly = turf.polygon([region]);\r\n return !turf.booleanDisjoint(turfPoly, turfPoint);\r\n}\r\n\r\nexport function pointInside(p, regionRoi) {\r\n let turfPoint = turf.point([p.x, p.y]);\r\n let turfPoly = turf.polygon(regionRoi.regions);\r\n return !turf.booleanDisjoint(turfPoly, turfPoint);\r\n}\r\n\r\nexport function boundsInside(b, regionRoi) {\r\n let points = [\r\n { x: b.left, y: b.top },\r\n { x: b.right, y: b.top },\r\n { x: b.right, y: b.bottom },\r\n { x: b.left, y: b.bottom },\r\n ];\r\n let returnValue = true;\r\n for (let p of points) {\r\n if (!pointInside(p, regionRoi)) returnValue = false;\r\n }\r\n return returnValue;\r\n}\r\n\r\n// if one poly intersects or is inside other poly\r\nexport function hasIntersection(regionRoi1, regionRoi2) {\r\n let poly1 = turf.polygon(regionRoi1.regions);\r\n let poly2 = turf.polygon(regionRoi2.regions);\r\n return !turf.booleanDisjoint(poly1, poly2);\r\n}\r\n\r\nexport function intersects(regionRoi1, regionRoi2) {\r\n let poly1 = turf.polygon(regionRoi1.regions[0]);\r\n let poly2 = turf.polygon(regionRoi2.regions[0]);\r\n return turf.booleanIntersects(poly1, poly2);\r\n}\r\n\r\nexport function isInside(regionRoi1, regionRoi2) {\r\n let poly1 = turf.polygon(regionRoi1.regions);\r\n let poly2 = turf.polygon(regionRoi2.regions);\r\n\r\n // Return true if poly1 is completely inside poly2\r\n return turf.booleanWithin(poly1, poly2);\r\n}\r\n\r\nexport function filterInvalidRegions(layer) {\r\n let result = layer.regionRois.filter(\r\n (roi) => roi.regions[roi.regions.length - 1]\r\n );\r\n layer.regionRois = result;\r\n}\r\n\r\nexport function getIntersections(regionRois1, regionRois2) {\r\n let regions1 = regionRois1.map((roi) => roi.regions);\r\n let regions2 = regionRois2.map((roi) => roi.regions);\r\n\r\n let poly1 = turf.multiPolygon(regions1);\r\n let poly2 = turf.multiPolygon(regions2);\r\n let intersection = turf.intersect(poly1, poly2);\r\n return intersection;\r\n}\r\nfunction findIndexById(structures, id) {\r\n return structures.findIndex((structure) => structure.id === id);\r\n}\r\nexport function findSameLayer(structures, selectedLayer) {\r\n let defaultParentIndex = selectedLayer === 0 ? -1 : 0;\r\n let parentLayerId = structures[selectedLayer].parentId;\r\n while (structures[selectedLayer].classificationSubtype) {\r\n selectedLayer = findIndexById(structures, parentLayerId);\r\n parentLayerId = structures[selectedLayer].parentId;\r\n }\r\n let parentIndex = structures.findIndex(\r\n (structure) => structure.id === structures[selectedLayer].parentId\r\n );\r\n return [selectedLayer, parentIndex < 0 ? defaultParentIndex : parentIndex];\r\n}\r\n\r\nexport function findSiblingRoiLayers(structures, selectedLayer, roiLayers) {\r\n let overlapRoiLayers = [];\r\n let parentLayerId = structures[selectedLayer].parentId;\r\n for (let i = 1; i < structures.length; i++) {\r\n if (\r\n selectedLayer !== i &&\r\n structures[i].parentId === parentLayerId &&\r\n structures[i].visible\r\n ) {\r\n if (roiLayers[i].layer.regionRois.length > 0) {\r\n overlapRoiLayers.push(roiLayers[i]);\r\n }\r\n }\r\n }\r\n return overlapRoiLayers;\r\n}\r\n\r\n/**\r\n * Check if structure is hidden when starting drawing and if so unhide it\r\n * @param {*} structures reference on this.structures needed! No copy!\r\n * @param {*} selectedLayer index of selected structure\r\n * @param {*}\r\n */\r\nexport function checkIfStructureHidden(\r\n structures,\r\n selectedLayer,\r\n isSubtype,\r\n name,\r\n color\r\n) {\r\n // set baseRoi to visible\r\n structures[0].visible = true;\r\n\r\n // if subtype get correct selectedLayer\r\n if (isSubtype) {\r\n selectedLayer = structures.findIndex(\r\n (structure) => structure.label === name && structure.color === color\r\n );\r\n }\r\n if (!structures[selectedLayer].visible) {\r\n window.showWarningSnackbar(\"Unhiding drawing structure\");\r\n structures[selectedLayer].visible = true;\r\n }\r\n let parentId = structures[selectedLayer].parentId;\r\n while (parentId !== 0) {\r\n // unhide all subtypes with same parent structure\r\n for (let idx in structures) {\r\n if (structures[idx].parentId === parentId) {\r\n if (!structures[idx].visible) {\r\n structures[idx].visible = true;\r\n }\r\n }\r\n }\r\n // unhide parent structure\r\n for (let structure of structures) {\r\n if (structure.id === parentId) {\r\n if (!structure.visible) {\r\n structure.visible = true;\r\n }\r\n parentId = structure.parentId;\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Filter only relevant Regions from given rois\r\n * @param {*} tree search tree\r\n * @param {*} rois ROI used as filter using Bounding Box\r\n * @returns [largestROI, reducedLayerRegions]\r\n */\r\nexport function getTreeRegionsFromRois(tree, rois) {\r\n let reducedLayerRois = [];\r\n for (let regionRoi of rois) {\r\n tree\r\n .search(regionRoi.treeItem)\r\n .filter((treeItem) => treeItem.roi.isObject === false)\r\n .forEach((treeItem) => {\r\n const index = reducedLayerRois.findIndex(\r\n (roi) => roi.uuid === treeItem.roi.uuid\r\n );\r\n if (index === -1) {\r\n reducedLayerRois.push(treeItem.roi);\r\n }\r\n });\r\n }\r\n return [\r\n reducedLayerRois[0],\r\n reducedLayerRois.map((roi) => roi.regions),\r\n reducedLayerRois,\r\n ];\r\n}\r\n\r\n/**\r\n * find smallest region\r\n * @param {*} p mouse position\r\n * @param {*} selectedLayer this.selectedLayer\r\n * @param {*} structures this.structures\r\n * @param {*} roiLayers this.roiLayers\r\n * @param {boolean} includeBaseROI this.includeBaseROI\r\n * @returns {[]} region polygon or false if none was found\r\n */\r\nexport function findRegion(\r\n p,\r\n selectedLayer,\r\n structures,\r\n roiLayers,\r\n includeBaseROI\r\n) {\r\n if (\r\n structures[selectedLayer].visible &&\r\n (includeBaseROI || !structures[selectedLayer].inversed)\r\n ) {\r\n let smallestRoi = null;\r\n for (let roi of roiLayers[selectedLayer].layer.regionRois) {\r\n if (pointInside(p, roi)) {\r\n if (smallestRoi === null || roi.area < smallestRoi.area) {\r\n smallestRoi = roi;\r\n }\r\n }\r\n }\r\n if (smallestRoi !== null) return smallestRoi;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * find clicked on ROI\r\n * @param {*} p mouse position\r\n * @param {*} selectedLayer this.selectedLayer\r\n * @param {*} structures this.structures\r\n * @param {*} roiLayers this.roiLayers\r\n * @param {boolean} includeBaseROI this.includeBaseROI\r\n * @returns {[]} region polygon or false if none was found\r\n */\r\nexport function findClickedRoi(\r\n p,\r\n selectedLayer,\r\n structures,\r\n roiLayers,\r\n includeBaseROI\r\n) {\r\n if (\r\n structures[selectedLayer].visible &&\r\n (includeBaseROI || !structures[selectedLayer].inversed)\r\n ) {\r\n let overlapTreeItems = roiLayers[selectedLayer].tree.search({\r\n minX: parseInt(p.x, 10),\r\n minY: parseInt(p.y, 10),\r\n maxX: parseInt(p.x, 10),\r\n maxY: parseInt(p.y, 10),\r\n });\r\n for (let treeItem of overlapTreeItems) {\r\n if (pointInside(p, treeItem.roi)) {\r\n return treeItem.roi;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/** Find all ROIs of a layer present at a certain location.\r\n *\r\n * @param {Object} p (Mouse) position {x: , y: }\r\n * @param {Int} selectedLayer The id of the selected layer.\r\n * @param {Array} structures Structures of the project.\r\n * @param {Array} roiLayers The layers containing all ROIs.\r\n * @param {Bool} includeBaseROI Whether or not to include the Base ROI.\r\n * @returns {Object} The ROI object found.\r\n * @returns {Bool} If no ROI is found, returns false.\r\n */\r\nexport function findClickedBounds(\r\n p,\r\n selectedLayer,\r\n structures,\r\n roiLayers,\r\n includeBaseROI\r\n) {\r\n if (\r\n structures[selectedLayer].visible &&\r\n (includeBaseROI || !structures[selectedLayer].inversed)\r\n ) {\r\n let overlapTreeItems = roiLayers[selectedLayer].tree.search({\r\n minX: parseInt(p.x, 10),\r\n minY: parseInt(p.y, 10),\r\n maxX: parseInt(p.x, 10),\r\n maxY: parseInt(p.y, 10),\r\n });\r\n for (let treeItem of overlapTreeItems) {\r\n return treeItem.roi;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Check if layer.regionRoi corresponse to Roi in overlapRegionRoi\r\n * @param {*} overlapRegionRois Regions that are overlapping with draw region\r\n * @param {ROI} checkRegion ROI of object.layer to be checked if the same as overlapRegionRois\r\n * @returns {boolean} true if is Hole, false if is outside\r\n */\r\nexport function isInRegionRois(overlapRegionRois, checkRegion) {\r\n let inRegionRois = false;\r\n\r\n for (let region of overlapRegionRois.regions) {\r\n if (\r\n region.find(\r\n (point) =>\r\n point[0] === checkRegion.regions[0][0] &&\r\n point[1] === checkRegion.regions[0][1]\r\n )\r\n ) {\r\n if (\r\n region.find(\r\n (point) =>\r\n point[0] === checkRegion.regions[1][0] &&\r\n point[1] === checkRegion.regions[1][1]\r\n )\r\n ) {\r\n inRegionRois = true;\r\n return inRegionRois;\r\n }\r\n }\r\n }\r\n\r\n return inRegionRois;\r\n}\r\n\r\n/**\r\n * generate overlapRegionRois based on GeoJson logic without the region (incl holes) that was clicked on\r\n * @param {*} reducedLayerRegionsGeoJson geoJson polygon/multipolygon\r\n * @param {*} clickedOnRegion (opt.) regions of clicked on ROI\r\n * @returns [overlapPolygon, clickedOnPolygon]\r\n */\r\nexport function generateOverlapRegionRois(\r\n reducedLayerRegionsGeoJson,\r\n clickedOnRegion\r\n) {\r\n let overlapPolygon = {\r\n inverted: false,\r\n regions: [],\r\n };\r\n let clickedOnPolygon = {\r\n inverted: false,\r\n regions: [],\r\n };\r\n\r\n if (reducedLayerRegionsGeoJson.coordinates.length > 0) {\r\n if (reducedLayerRegionsGeoJson[\"type\"] === \"Polygon\") {\r\n let clickIsOnPolygon = false;\r\n if (clickedOnRegion) {\r\n if (\r\n reducedLayerRegionsGeoJson[\"coordinates\"][0].find(\r\n (point) =>\r\n point[0] === clickedOnRegion[0][0] &&\r\n point[1] === clickedOnRegion[0][1]\r\n )\r\n ) {\r\n if (\r\n reducedLayerRegionsGeoJson[\"coordinates\"][0].find(\r\n (point) =>\r\n point[0] === clickedOnRegion[1][0] &&\r\n point[1] === clickedOnRegion[1][1]\r\n )\r\n ) {\r\n clickIsOnPolygon = true;\r\n }\r\n }\r\n }\r\n let tmpPoly = {\r\n inverted: false,\r\n regions: reducedLayerRegionsGeoJson[\"coordinates\"],\r\n };\r\n if (clickIsOnPolygon) {\r\n clickedOnPolygon = tmpPoly;\r\n } else {\r\n overlapPolygon = tmpPoly;\r\n }\r\n } else {\r\n for (let polygon of reducedLayerRegionsGeoJson[\"coordinates\"]) {\r\n let clickIsOnPolygon = false;\r\n if (clickedOnRegion) {\r\n if (\r\n polygon[0].find(\r\n (point) =>\r\n point[0] === clickedOnRegion[0][0] &&\r\n point[1] === clickedOnRegion[0][1]\r\n )\r\n ) {\r\n if (\r\n polygon[0].find(\r\n (point) =>\r\n point[0] === clickedOnRegion[1][0] &&\r\n point[1] === clickedOnRegion[1][1]\r\n )\r\n ) {\r\n clickIsOnPolygon = true;\r\n }\r\n }\r\n }\r\n if (clickIsOnPolygon) {\r\n clickedOnPolygon.regions = [...clickedOnPolygon.regions, ...polygon];\r\n } else {\r\n overlapPolygon.regions = [...overlapPolygon.regions, ...polygon];\r\n }\r\n }\r\n }\r\n }\r\n return [overlapPolygon, clickedOnPolygon];\r\n}\r\n\r\n/**\r\n * generate regions that intersect with drawRegion based on GeoJson logic\r\n * @param {{ type: String, coordinates: any }} reducedLayerRegionsGeoJson geoJson polygon/multipolygon\r\n * @param {[]} drawRegion region others have to intersect with\r\n * @returns overlapRegionRois\r\n */\r\nexport function getIntersectingRegions(reducedLayerRegionsGeoJson, drawRegion) {\r\n let poly = [];\r\n if (drawRegion.length === 1) drawRegion = drawRegion[0];\r\n let poly1 = turf.polygon([drawRegion]);\r\n\r\n if (reducedLayerRegionsGeoJson[\"type\"] === \"Polygon\") {\r\n if (reducedLayerRegionsGeoJson[\"coordinates\"].length > 0) {\r\n let poly2 = turf.polygon(reducedLayerRegionsGeoJson.coordinates[0]);\r\n\r\n if (turf.booleanIntersects(poly1, poly2)) {\r\n poly.push({\r\n regions: reducedLayerRegionsGeoJson.coordinates\r\n ? reducedLayerRegionsGeoJson.coordinates\r\n : [],\r\n inverted: false,\r\n });\r\n }\r\n } else {\r\n poly.push({\r\n regions: reducedLayerRegionsGeoJson.coordinates\r\n ? reducedLayerRegionsGeoJson.coordinates\r\n : [],\r\n inverted: false,\r\n });\r\n }\r\n } else {\r\n for (let regions of reducedLayerRegionsGeoJson.coordinates) {\r\n let poly2 = {\r\n type: \"Feature\",\r\n properties: {},\r\n geometry: {\r\n type: \"Polygon\",\r\n coordinates: regions[0],\r\n },\r\n };\r\n if (turf.booleanIntersects(poly1, poly2)) {\r\n poly.push({\r\n regions: regions,\r\n inverted: false,\r\n });\r\n }\r\n }\r\n }\r\n return poly;\r\n}\r\n\r\n/**\r\n * before further analysis remove holes from drawRegion\r\n * -> uses buffer of 1\r\n * @param {*} drawRegion in GeoJson format\r\n * @returns drawRegion without holes\r\n */\r\nexport function getExterior(drawRegion) {\r\n // custom index filter to get duplicated points\r\n function getIndexOf(a, arr) {\r\n for (let i = 0; i < arr.length; i++) {\r\n let el = arr[i];\r\n if (el[0] === a[0] && el[1] === a[1]) return i;\r\n }\r\n return -1;\r\n }\r\n\r\n try {\r\n drawRegion.regions[0] = drawRegion.regions[0].filter(\r\n (a, i, arr) => getIndexOf(a, arr) === i\r\n );\r\n let drawRegionGeoJson = PolyBool.polygonToGeoJSON(drawRegion);\r\n\r\n if (drawRegionGeoJson.coordinates.length !== 0) {\r\n drawRegionGeoJson = buffer(drawRegionGeoJson, 1).geometry;\r\n let drawRegionWithoutHoles = {\r\n inverted: false,\r\n regions: [],\r\n };\r\n if (drawRegionGeoJson.type === \"Polygon\") {\r\n drawRegionWithoutHoles.regions.push(drawRegionGeoJson.coordinates[0]);\r\n } else {\r\n for (let regions of drawRegionGeoJson.coordinates) {\r\n drawRegionWithoutHoles.regions.push(regions[0]);\r\n }\r\n }\r\n drawRegion = drawRegionWithoutHoles;\r\n }\r\n } catch {\r\n console.log(\"Error in getExterior, returning empty regions instead!\");\r\n drawRegion = {\r\n regions: [],\r\n inverted: false,\r\n };\r\n }\r\n\r\n return drawRegion;\r\n}\r\n\r\n// /**\r\n// * Get all regions and Rois that overlap with drawing region and the largest included area based on the provided rTree\r\n// * @param {*} tree rTree with all relevant ROIs\r\n// * @param {*} drawRegionRois drawn region that should be used as baseline\r\n// * @returns [reducedLayerRegions, reducedLayerRegionRois] which contain all regions/ROIs that are relevant for the drawn region\r\n// */\r\n// function getOverlapRegionsAndRois(tree, drawRegionRois) {\r\n// let reducedLayerRegions = [];\r\n// let reducedLayerRegionRois = [];\r\n// if (tree) {\r\n// // get all Regions that overlap with drawRegion\r\n// let tmpResult = getTreeRegionsFromRois(tree, drawRegionRois);\r\n// reducedLayerRegions = tmpResult[1];\r\n// reducedLayerRegionRois = tmpResult[2];\r\n// }\r\n// return [reducedLayerRegions, reducedLayerRegionRois];\r\n// }\r\n\r\nfunction getTreeItemsFromRois(tree, regionRois) {\r\n let reducedLayerRegionRois = [];\r\n if (tree) {\r\n for (let roi of regionRois) {\r\n tree.search(roi.treeItem).forEach((treeItem) => {\r\n let idx = reducedLayerRegionRois.findIndex(\r\n (r) => r.uuid === treeItem.roi.uuid\r\n );\r\n if (idx < 0) reducedLayerRegionRois.push(treeItem.roi);\r\n });\r\n }\r\n }\r\n return reducedLayerRegionRois;\r\n}\r\n\r\n/**\r\n * Generates difference Regions and Informations to account for subtypes when deleting (using turf)\r\n * @param {*} overlapItems overlapping tree items\r\n * @param {*} transformResult turf.difference() result\r\n * @returns differenceRegionsInfo - corresponding Info\r\n */\r\nfunction differenceRegionsAndInfo(overlapItems, transformResult) {\r\n let differenceRegionsInfo = [];\r\n\r\n transformResult = transformResult ? transformResult : turf.multiPolygon([]);\r\n if (transformResult.geometry.type === \"Polygon\") {\r\n transformResult = turf.multiPolygon([transformResult.geometry.coordinates]);\r\n }\r\n\r\n for (let poly of transformResult.geometry.coordinates) {\r\n differenceRegionsInfo.push({\r\n name: null,\r\n color: null,\r\n subtype: null,\r\n structureId: null,\r\n });\r\n let segDiff = turf.polygon(poly);\r\n for (let idxRoi in overlapItems) {\r\n let segGeoJSON = turf.polygon(overlapItems[idxRoi].regions);\r\n if (!turf.booleanDisjoint(segDiff, segGeoJSON)) {\r\n let idxRegionsInfo = differenceRegionsInfo.length - 1;\r\n differenceRegionsInfo[idxRegionsInfo].name =\r\n overlapItems[idxRoi].subtypeName;\r\n differenceRegionsInfo[idxRegionsInfo].color =\r\n overlapItems[idxRoi].color;\r\n differenceRegionsInfo[idxRegionsInfo].subtype =\r\n overlapItems[idxRoi].isSubtype;\r\n differenceRegionsInfo[idxRegionsInfo].structureId =\r\n overlapItems[idxRoi].structureId;\r\n break;\r\n }\r\n }\r\n }\r\n return differenceRegionsInfo;\r\n}\r\n\r\n// /**\r\n// * custom GeoJSON converter to throw that sees them all as outer Polygons\r\n// * TODO: Add efficient way to detect wholes\r\n// * @param {*} reducedLayerRegions\r\n// * @returns\r\n// */\r\n// function customGeoJsonConverter(reducedLayerRegions) {\r\n// let resultGeoJSON = {\r\n// coordinates: [],\r\n// };\r\n// if (reducedLayerRegions.length === 0) {\r\n// resultGeoJSON.type = \"Polygon\";\r\n// } else if (reducedLayerRegions.length === 1) {\r\n// resultGeoJSON.type = \"Polygon\";\r\n// resultGeoJSON.coordinates = reducedLayerRegions;\r\n// } else {\r\n// resultGeoJSON.type = \"MultiPolygon\";\r\n// for (let reducedLayerRegion of reducedLayerRegions) {\r\n// resultGeoJSON.coordinates.push([reducedLayerRegion]);\r\n// }\r\n// }\r\n// return resultGeoJSON;\r\n// }\r\n\r\n// function checkIfExists(value) {\r\n// return value ? value : null;\r\n// }\r\n\r\n// /**\r\n// * checks object for needed parameters and if not exists, set to null\r\n// * @param {*} object original object to check\r\n// * @returns object with all entries\r\n// */\r\n// function checkObject(object) {\r\n// object = {\r\n// layer: checkIfExists(object.layer),\r\n// drawRegion: checkIfExists(object.drawRegion),\r\n// clear: checkIfExists(object.clear),\r\n// color: checkIfExists(object.color),\r\n// subtype: checkIfExists(object.subtype),\r\n// name: checkIfExists(object.name),\r\n// tree: checkIfExists(object.tree),\r\n// positionInRoiLayer: checkIfExists(object.positionInRoiLayer),\r\n// fullyLoaded: checkIfExists(object.fullyLoaded),\r\n// overlap: checkIfExists(object.overlap),\r\n// parentLayer: checkIfExists(object.parentLayer),\r\n// structureId: checkIfExists(object.structureId),\r\n// overlapRoiLayers: checkIfExists(object.overlapRoiLayers),\r\n// clickedOnRegion: checkIfExists(object.clickedOnRegion),\r\n// convert: checkIfExists(object.convert),\r\n// };\r\n// return object;\r\n// }\r\n\r\n/** Updates the objects currently being drawn.\r\n *\r\n * @param {Object} layer Structure being edited {regionRois: [], inverted: Bool}\r\n * @param {Object} drawRegion Objects inside the structure: {regions: [[x:, y: ], ...], inverted: Bool}\r\n * @param {Bool} clear Delete mode?\r\n * @param {String} color Color of the currently selected structure (#012DEF)\r\n * @param {Bool} subtype Whether or not the annotation is a subtype.\r\n * @param {String} name Name of the structure.\r\n */\r\nexport function updateDrawLayer(\r\n layer,\r\n drawRegion,\r\n clear,\r\n color,\r\n subtype,\r\n name,\r\n bufferSize\r\n) {\r\n // drawRegionRois -> region that was clicked on\r\n let drawRegionRois = drawRegion.regions.map((regions) => {\r\n return new RegionROI({\r\n regions: regions,\r\n color1: color,\r\n subtype: subtype,\r\n name: name,\r\n });\r\n });\r\n let multiLayerRegions = layer.regionRois.map((roi) => roi.regions);\r\n let multiDrawRegions = drawRegionRois.map((roi) => roi.regions);\r\n let transformResult = turf.union(\r\n turf.multiPolygon(multiDrawRegions),\r\n turf.multiPolygon(multiLayerRegions)\r\n );\r\n if (bufferSize && bufferSize !== 0) {\r\n transformResult = buffer(transformResult, bufferSize * 100);\r\n }\r\n\r\n layer.regionRois = [];\r\n let coordArray = [];\r\n if (transformResult === null) {\r\n coordArray = [];\r\n } else if (transformResult.geometry.type === \"Polygon\") {\r\n coordArray = [transformResult.geometry.coordinates];\r\n } else {\r\n coordArray = transformResult.geometry.coordinates;\r\n }\r\n for (let coordinates of coordArray) {\r\n let roiToAdd = createRegionRoi(\r\n coordinates,\r\n color,\r\n subtype,\r\n name,\r\n null,\r\n null\r\n );\r\n if (roiToAdd.area > 2) layer.regionRois.push(roiToAdd);\r\n }\r\n}\r\n\r\n/** Creates a ROI object.\r\n *\r\n * @param {Array} regions Array of coordninate arrays: [[x,y], ..., [x,y]]\r\n * @param {String} color #012DEF\r\n * @param {Bool} subtype Is the ROI a subtype or not?\r\n * @param {String} name Name of the object structure, e.g. \"Base ROI\"\r\n * @param {Bool} fullyLoaded\r\n * @param {Int} structureId Id of the objects structure.\r\n * @param {Bool} isObject Is the ROI an object for object detection? Defaults to false.\r\n * @returns\r\n */\r\nexport function createRegionRoi(\r\n regions,\r\n color,\r\n isSubtype,\r\n name,\r\n fullyLoaded,\r\n structureId,\r\n isObject = false\r\n) {\r\n return new RegionROI({\r\n regions: regions,\r\n color1: color,\r\n subtype: isSubtype,\r\n name: name,\r\n fullyLoaded: fullyLoaded,\r\n structureId: structureId,\r\n isObject: isObject,\r\n });\r\n}\r\n\r\nexport function turfPolyToRegionRois(\r\n poly,\r\n color,\r\n isSubtype,\r\n name,\r\n fullyLoaded,\r\n structureId\r\n) {\r\n let coordArray = [];\r\n if (poly === null) {\r\n coordArray = [];\r\n } else if (poly.geometry.type === \"Polygon\") {\r\n coordArray = [poly.geometry.coordinates];\r\n } else {\r\n coordArray = poly.geometry.coordinates;\r\n }\r\n return coordArray.map((coordinates) => {\r\n return createRegionRoi(\r\n coordinates,\r\n color,\r\n isSubtype,\r\n name,\r\n fullyLoaded,\r\n structureId\r\n );\r\n });\r\n}\r\n\r\n/**\r\n * Checks if a ROI is inside its parentlayer,\r\n * calculates resulting polygon for overlapping polygons.\r\n *\r\n * @param {Object} layer Structure being edited {regionRois: [], inverted: Bool}\r\n * @param {Object} drawRegion Objects inside the structure: {regions: [RegionROI, ...], inverted: Bool}\r\n * @param {Bool} clear Delete mode?\r\n * @param {String} color Color of the currently selected structure (#012DEF)\r\n * @param {Bool} isSubtype Whether or not the annotation is a subtype.\r\n * @param {String} name Name of the structure.\r\n * @param {rTree} tree R Tree containing structure information of the selected layer\r\n * @param {Bool} positionInRoiLayer Is the object inside a ROI Layer?\r\n * @param {Bool} fullyLoaded\r\n * @param {Bool} overlap\r\n * @param {Object} parentLayer The parent structure as object. Prevents annotations outside of paranet layer.\r\n * @param {Int} structureId The id of the structure.\r\n * @param {Array} overlapRoiLayers List of all ROI Layers, 1 for each struct, substruct and subtypes of the same parent. Depends on the checkboxes set in remove overlaps.\r\n * @param {Object} clickedOnRoi The ROI the user clicked on to begin with, if any.\r\n * @param {Bool} isObject Is this an object detection annotation? Defaults to false.\r\n * @param {Bool} convert (Not used). Whether or not to convert. Defaults to false.\r\n */\r\nexport function updateLayer(\r\n layer,\r\n drawRegion,\r\n clear,\r\n color,\r\n isSubtype,\r\n name,\r\n tree,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n overlap,\r\n parentLayer,\r\n structureId,\r\n overlapRoiLayers,\r\n clickedOnRoi,\r\n isObject = false\r\n) {\r\n let historyItem = [];\r\n let histId = structureId;\r\n // drawRegionRois -> region that was clicked on\r\n // Creates a Region ROI for the freshly created ROI\r\n let drawRegionRois = [];\r\n for (let regionRoi of drawRegion.regions) {\r\n drawRegionRois.push(regionRoi);\r\n }\r\n\r\n // Extract the regions of the freshly created ROI\r\n let multiDrawRegions = drawRegionRois.map((roi) => roi.regions);\r\n\r\n // Filter with Base ROI and Parent Annotations\r\n if (parentLayer && parentLayer.tree && !clear) {\r\n let parentRegionRois = getTreeItemsFromRois(\r\n parentLayer.tree,\r\n drawRegionRois\r\n );\r\n // Extract the regions of parent regions\r\n let multiParentRegions = parentRegionRois.map((roi) => roi.regions);\r\n\r\n // Check if in parent region\r\n let poly1 = turf.multiPolygon(multiDrawRegions);\r\n poly1 = turf.simplify(poly1, {\r\n tolerance: 0.05,\r\n highQuality: false,\r\n });\r\n let poly2 = turf.multiPolygon(multiParentRegions);\r\n let intersection = turf.intersect(poly1, poly2);\r\n if (intersection) {\r\n multiDrawRegions = turfPolyToRegionRois(\r\n intersection,\r\n color,\r\n isSubtype,\r\n name,\r\n fullyLoaded,\r\n structureId\r\n ).map((roi) => roi.regions);\r\n } else {\r\n multiDrawRegions = [];\r\n window.showWarningSnackbar(\"Can only be drawn inside parent regions.\");\r\n return;\r\n }\r\n }\r\n\r\n // Remove Overlaps, if checkbox is active\r\n if (!clear && overlapRoiLayers && overlapRoiLayers.length > 0) {\r\n for (let overlapRoiLayer of overlapRoiLayers) {\r\n if (overlapRoiLayer.layer.regionRois.length > 0) {\r\n // get all Regions that overlap with drawRegion\r\n if (!isObject && overlapRoiLayer.tree) {\r\n let overlapItems = [];\r\n for (let drawRoi of drawRegionRois) {\r\n let drawPoly = turf.polygon(drawRoi.regions);\r\n overlapRoiLayer.tree\r\n .search(drawRoi.treeItem)\r\n .filter((treeItem) => treeItem.roi.isObject === isObject)\r\n .forEach((treeItem) => {\r\n if (clickedOnRoi && treeItem.roi.uuid === clickedOnRoi.uuid)\r\n return;\r\n let poly = turf.polygon(treeItem.roi.regions);\r\n let isIntersecting = true;\r\n try {\r\n isIntersecting = !turf.booleanDisjoint(poly, drawPoly);\r\n } catch (e) {\r\n console.log(\r\n \"intersection check failed, treeting polygon as intersecting!\"\r\n );\r\n isIntersecting = true;\r\n }\r\n if (isIntersecting) {\r\n overlapItems.push(treeItem.roi);\r\n }\r\n });\r\n }\r\n\r\n let multiLayerRegions = overlapItems.map((roi) => roi.regions);\r\n let transformResult = null;\r\n let poly1 = turf.multiPolygon(multiDrawRegions);\r\n let poly2 = turf.multiPolygon(multiLayerRegions);\r\n transformResult = turf.difference(poly1, poly2);\r\n if (transformResult) {\r\n // Reduce size of ROIs for good measure\r\n transformResult = buffer(transformResult, -10);\r\n if (transformResult.geometry.coordinates[0].length > 0) {\r\n transformResult = turf.simplify(transformResult, {\r\n tolerance: 0.05,\r\n highQuality: false,\r\n });\r\n }\r\n }\r\n\r\n let coordArray = [];\r\n if (transformResult === null) {\r\n coordArray = [];\r\n } else if (transformResult.geometry.type === \"Polygon\") {\r\n coordArray = [transformResult.geometry.coordinates];\r\n } else {\r\n coordArray = transformResult.geometry.coordinates;\r\n }\r\n drawRegionRois = [];\r\n for (let coordinates of coordArray) {\r\n if (coordinates[0].length < 1) continue;\r\n let roiToAdd = createRegionRoi(\r\n coordinates,\r\n color,\r\n isSubtype,\r\n name,\r\n fullyLoaded,\r\n structureId,\r\n isObject\r\n );\r\n if (roiToAdd.area > 2) drawRegionRois.push(roiToAdd);\r\n }\r\n multiDrawRegions = drawRegionRois.map((roi) => roi.regions);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Add objects to structure trees\r\n if (tree) {\r\n let overlapItems = [];\r\n for (let drawRoi of drawRegionRois) {\r\n let drawPoly = turf.polygon(drawRoi.regions);\r\n tree\r\n .search(drawRoi.treeItem)\r\n .filter((treeItem) => treeItem.roi.isObject === isObject)\r\n .forEach((treeItem) => {\r\n // if drawPoly is subtype, filter all annotations that aren't of the same subtype\r\n if (isSubtype && clear) {\r\n overlapItems.push(treeItem.roi);\r\n treeItem.roi.comment = \"\";\r\n tree.remove(treeItem);\r\n historyItem.push({\r\n add: false,\r\n id: histId,\r\n roi: treeItem.roi.copy(),\r\n });\r\n\r\n return;\r\n }\r\n let poly = turf.polygon(treeItem.roi.regions);\r\n let isIntersecting = true;\r\n try {\r\n isIntersecting = !turf.booleanDisjoint(poly, drawPoly);\r\n } catch (e) {\r\n console.log(\r\n \"intersection check failed, treating polygon as intersecting!\"\r\n );\r\n isIntersecting = true;\r\n }\r\n if (isIntersecting) {\r\n overlapItems.push(treeItem.roi);\r\n treeItem.roi.comment = \"\";\r\n tree.remove(treeItem);\r\n historyItem.push({\r\n add: false,\r\n id: structureId,\r\n roi: treeItem.roi.copy(),\r\n });\r\n }\r\n });\r\n //overlapItems.push(drawRoi);\r\n }\r\n let multiLayerRegions = overlapItems.map((roi) => roi.regions);\r\n let transformResult = null;\r\n let transformResultInfo = null;\r\n\r\n // Add a polygon\r\n if (!clear) {\r\n if (isObject) {\r\n // Ensure both the new and the old ROI are included.\r\n // No transformation\r\n multiLayerRegions.forEach((region) => {\r\n multiDrawRegions.push(region);\r\n });\r\n transformResult = turf.multiPolygon(multiDrawRegions);\r\n }\r\n // Non-Object ROI was clicked\r\n // Transform according to settings\r\n else {\r\n let poly1 = turf.multiPolygon(multiDrawRegions);\r\n // No overlapping regions\r\n if (multiLayerRegions.length === 0 && !overlap) {\r\n transformResult = poly1;\r\n }\r\n // Overlapping regions exist\r\n else {\r\n let poly2 = turf.multiPolygon(multiLayerRegions);\r\n try {\r\n transformResult = overlap\r\n ? turf.intersect(poly1, poly2)\r\n : turf.union(poly1, poly2);\r\n } catch (e) {\r\n console.debug(\"Overlap error:\", e);\r\n window.openErrorDialog(\r\n \"Overlap Error!\\n Probably too many objects to compute:\\n\" + e\r\n );\r\n }\r\n }\r\n }\r\n }\r\n // Remove a polygon\r\n else {\r\n if (!isObject) {\r\n if (overlapItems.length <= 100) {\r\n transformResult = turf.difference(\r\n turf.multiPolygon(multiLayerRegions),\r\n turf.multiPolygon(multiDrawRegions)\r\n );\r\n transformResultInfo = differenceRegionsAndInfo(\r\n overlapItems,\r\n transformResult\r\n );\r\n } else {\r\n window.showWarningSnackbar(\r\n \"Too many intersections, \" +\r\n overlapItems.length +\r\n \" objects deleted whole!\"\r\n );\r\n }\r\n }\r\n }\r\n\r\n // The new coordinates of the transformed object\r\n let coordArray = [];\r\n if (transformResult === null) {\r\n coordArray = [];\r\n } else if (transformResult.geometry.type === \"Polygon\") {\r\n coordArray = [transformResult.geometry.coordinates];\r\n } else {\r\n coordArray = transformResult.geometry.coordinates;\r\n }\r\n let firstRoiToAdd = null;\r\n for (let idx in coordArray) {\r\n let roiToAdd = createRegionRoi(\r\n coordArray[idx],\r\n transformResultInfo ? transformResultInfo[idx].color : color,\r\n transformResultInfo ? transformResultInfo[idx].subtype : isSubtype,\r\n transformResultInfo ? transformResultInfo[idx].name : name,\r\n fullyLoaded,\r\n transformResultInfo\r\n ? transformResultInfo[idx].structureId\r\n : structureId,\r\n isObject\r\n );\r\n if (roiToAdd.area > 2) {\r\n if (idx === \"0\") {\r\n firstRoiToAdd = roiToAdd;\r\n }\r\n tree.insert(roiToAdd.treeItem);\r\n historyItem.push({ add: true, id: histId, roi: roiToAdd });\r\n }\r\n }\r\n layer.regionRois = tree.all().map((treeItem) => treeItem.roi);\r\n if (firstRoiToAdd !== null && positionInRoiLayer >= 0) {\r\n let fromIndex = layer.regionRois.findIndex(\r\n (item) => item.uuid === firstRoiToAdd.uuid\r\n );\r\n arraymove(layer.regionRois, fromIndex, positionInRoiLayer);\r\n }\r\n }\r\n window.projectHistory.add(historyItem);\r\n}\r\n\r\n/**\r\n * Special findRegion function for CopyTools, since they require additional information of the layer\r\n * @param {Object} p mouse position {x:, y: }\r\n * @param {Array} roiLayers The layers containing all ROIs.\r\n * @param {Array} structures Structures of the project.\r\n * @param {Bool} includeBaseROI Whether or not to include the Base ROI.\r\n * @returns {[*, []]} Array with index of layer where region was found in and array with region in polygon form\r\n */\r\nexport function findRoi(p, roiLayers, structures, includeBaseROI) {\r\n let resultRoi = null;\r\n let targetLayerIndex = -1;\r\n\r\n for (let i = 0; i < roiLayers.length; i++) {\r\n if (\r\n structures[i].visible &&\r\n (includeBaseROI || !structures[i].inversed) &&\r\n roiLayers[i].layer.regionRois.length > 0\r\n ) {\r\n let overlapTreeItems = roiLayers[i].tree.search({\r\n minX: parseInt(p.x, 10),\r\n minY: parseInt(p.y, 10),\r\n maxX: parseInt(p.x, 10),\r\n maxY: parseInt(p.y, 10),\r\n });\r\n for (let treeItem of overlapTreeItems) {\r\n if (pointInside(p, treeItem.roi)) {\r\n if (resultRoi) {\r\n if (resultRoi.area > treeItem.roi.area) {\r\n resultRoi = treeItem.roi;\r\n targetLayerIndex = i;\r\n }\r\n } else {\r\n resultRoi = treeItem.roi;\r\n targetLayerIndex = i;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return [targetLayerIndex, resultRoi];\r\n}\r\n\r\nfunction arraymove(arr, fromIndex, toIndex) {\r\n var element = arr[fromIndex];\r\n arr.splice(fromIndex, 1);\r\n arr.splice(toIndex, 0, element);\r\n}\r\n","// Copyright HS Analysis GmbH, 2023\r\n// Author: Valentin Haas\r\n\r\n// Description: Structure model for annotation categorization.\r\n\r\n// Keep in sync with C# and js frontend:\r\n// Source\\HSA-KIT\\Database\\Model\\Structure.cs\r\n// Source\\HSA-KIT\\ClientApp\\src\\common\\components\\Structure.jsx\r\n// Source\\HSA-KIT\\modules\\hsa\\core\\models\\structure.py\r\n\r\n// HSA imports\r\nimport {\r\n isInt,\r\n isHexColor,\r\n downloadJsonObjectAsFile,\r\n isObject,\r\n requestFileInput,\r\n} from \"../utils/Utils\";\r\nimport { convertDateToShortIsoString } from \"../utils/Localization\";\r\n\r\n/**\r\n * Structure class used for annotation categorization.\r\n * For structure documentation see https://hsa.atlassian.net/wiki/spaces/HSAKIT/pages/16116235173917/Annotations+Data+Structure\r\n */\r\nexport default class Structure {\r\n /**\r\n * Maximum id used, to avoid duplicate ids.\r\n */\r\n static maxId = 0;\r\n static __setMaxId = (val) => (Structure.maxId = val);\r\n\r\n /**\r\n * Create a Structure object with all parameters.\r\n * @param {uint} id Unique identifier for the structure.\r\n * @param {string} label Visible name of structure.\r\n * @param {boolean} isStructure Distinction between class and structure. Defaults to true.\r\n * @param {string} color Color of the structure. Defaults to #FFFFFF.\r\n * @param {boolean} isDynamic Whether or not the user is allowed to delete/add substructures/classes to this structure. Defaults to true.\r\n * @param {uint} parentId Parent key, should the structure be a substructure. Defaults to null.\r\n * @param {uint} sameLevelRank Defines te order in which multiple strucutures on the same level with the same parent are displayed. Defaults to 0.\r\n * @param {boolean} isUnfolded Whether or not the children of a structure are visible. Defaults to false.\r\n * @param {boolean} annotationsAreVisible Whether or not the annotations of the structure are shown. Defaults to true.\r\n * @param {boolean} hasChildren Whether or not a structure has children. Defaults to false.\r\n * @param {uint} nestingDepth How deep a structure is nested inside other structures. Defaults to 0.\r\n * @param {ulong} totalObjectCount Annotation count over all contained r-Trees. Defaults to 0.\r\n * @param {boolean} canBeChosen Optional. Whether or not the structure can be chosen. Defaults to true.\r\n * @param {boolean} isChosen Optional. Whether or not the structure is chosen. Defaults to false.\r\n * @param {List[object]} toolSettings Optional. Which tools are activated for this structure and their parameters. Defaults to null.\r\n * @param {List[object]} optionalParams Optional. Project-specific optional parameters not covered by the attributes above. Defaults to null.\r\n */\r\n constructor(\r\n id,\r\n label,\r\n isStructure = true,\r\n color = \"#FFFFFF\",\r\n isDynamic = true,\r\n parentId = null,\r\n sameLevelRank = 0,\r\n isUnfolded = false,\r\n annotationsAreVisible = true,\r\n hasChildren = false,\r\n nestingDepth = 0,\r\n totalObjectCount = 0,\r\n canBeChosen = true,\r\n isChosen = false,\r\n toolSettings = null,\r\n optionalParams = null\r\n ) {\r\n // Input validation\r\n if (!isInt(id) || id <= 0)\r\n throw TypeError(\r\n `id must be of type integer > 0, received ${typeof id}: ${id}`\r\n );\r\n if (typeof label !== \"string\")\r\n throw TypeError(\r\n `label must be of type string, received ${typeof label}: ${label}`\r\n );\r\n if (typeof isStructure !== \"boolean\")\r\n throw TypeError(\r\n `isStructure must be of type boolean, received ${typeof isStructure}: ${isStructure}`\r\n );\r\n if (!isHexColor(color) && label !== \"Base ROI\")\r\n throw TypeError(\r\n `color must be a valid hexColor, received ${typeof color}: ${color}`\r\n );\r\n if (typeof isDynamic !== \"boolean\")\r\n throw TypeError(\r\n `isDynamic must be of type boolean, received ${typeof isDynamic}: ${isDynamic}`\r\n );\r\n if (parentId !== null && (!isInt(parentId) || parentId <= 0))\r\n throw TypeError(\r\n `parentId must be of type integer >= 0, received ${typeof parentId}: ${parentId}`\r\n );\r\n if (!isInt(sameLevelRank) || sameLevelRank < 0) {\r\n throw TypeError(\r\n `sameLevelRank must be of type integer >= 0, received ${typeof sameLevelRank}: ${sameLevelRank}`\r\n );\r\n }\r\n if (typeof isUnfolded !== \"boolean\")\r\n throw TypeError(\r\n `isUnfolded must be of type boolean, received ${typeof isUnfolded}: ${isUnfolded}`\r\n );\r\n if (typeof annotationsAreVisible !== \"boolean\")\r\n throw TypeError(\r\n `annotationsAreVisible must be of type boolean, received ${typeof annotationsAreVisible}: ${annotationsAreVisible}`\r\n );\r\n if (typeof hasChildren !== \"boolean\")\r\n throw TypeError(\r\n `hasChildren must be of type boolean, received ${typeof hasChildren}: ${hasChildren}`\r\n );\r\n if (!isInt(nestingDepth) || nestingDepth < 0)\r\n throw TypeError(\r\n `nestingDepth must be of type integer >= 0, received ${typeof nestingDepth}: ${nestingDepth}`\r\n );\r\n if (!isInt(totalObjectCount) || totalObjectCount < 0)\r\n throw TypeError(\r\n `totalObjectCount must be of type integer >= 0, received ${typeof totalObjectCount}: ${totalObjectCount}`\r\n );\r\n if (canBeChosen !== null && !(typeof canBeChosen === \"boolean\"))\r\n throw TypeError(\r\n `canBeChosen must be of type boolean, received ${typeof canBeChosen}: ${canBeChosen}`\r\n );\r\n if (!(typeof isChosen === \"boolean\"))\r\n throw TypeError(\r\n `isChosen must be of type boolean, received ${typeof isChosen}: ${isChosen}`\r\n );\r\n\r\n // Value assignments\r\n this.id = id;\r\n this.label = label;\r\n this.isStructure = isStructure;\r\n this.color = color;\r\n this.isDynamic = isDynamic;\r\n this.parentId = parentId;\r\n this.sameLevelRank = sameLevelRank;\r\n this.isUnfolded = isUnfolded;\r\n this.annotationsAreVisible = annotationsAreVisible;\r\n this.hasChildren = hasChildren;\r\n this.nestingDepth = nestingDepth;\r\n this.totalObjectCount = totalObjectCount;\r\n this.canBeChosen = canBeChosen;\r\n this.isChosen = isChosen;\r\n this.toolSettings = toolSettings;\r\n this.optionalParams = optionalParams;\r\n\r\n if (id > Structure.maxId) Structure.__setMaxId(id);\r\n }\r\n\r\n /**\r\n * Create a new structure from an object without needing to define all parameters individually.\r\n * Accepts camelCase and PascalCase properties, with camelCase being the default.\r\n * Additional properties will be ignored,\r\n * missing properties will use defaults or throw error per Structure contructor.\r\n * @param {object} obj An object containing all necessary properties of a structure.\r\n * @returns {Structure} A new structure\r\n */\r\n static fromObject = (obj) => {\r\n return new Structure(\r\n obj.id ?? obj.Id,\r\n obj.label ?? obj.Label,\r\n obj.isStructure ?? obj.IsStructure,\r\n obj.color ?? obj.Color,\r\n obj.isDynamic ?? obj.IsDynamic,\r\n obj.parentId ?? obj.ParentId,\r\n obj.sameLevelRank ?? obj.SameLevelRank,\r\n obj.isUnfolded ?? obj.IsUnfolded,\r\n obj.annotationsAreVisible ?? obj.AnnotationsAreVisible,\r\n obj.hasChildren ?? obj.HasChildren,\r\n obj.nestingDepth ?? obj.NestingDepth,\r\n obj.totalObjectCount ?? obj.TotalObjectCount,\r\n obj.canBeChosen ?? obj.CanBeChosen,\r\n obj.isChosen ?? obj.IsChosen,\r\n obj.toolSettings ?? obj.ToolSettings,\r\n obj.optionalParams ?? obj.OptionalParams\r\n );\r\n };\r\n\r\n /**\r\n * Create an independent (deep) copy of a structure.\r\n * @param {Structure} structure Structure to copy.\r\n * @returns {Structure} Copy of structure.\r\n */\r\n static copy = (structure) => {\r\n if (!(structure instanceof Structure))\r\n throw TypeError(\r\n `structure must be of type Structure, recieved ${typeof structure}: ${structure}`\r\n );\r\n return new Structure(\r\n structure.id,\r\n structure.label,\r\n structure.isStructure,\r\n structure.color,\r\n structure.isDynamic,\r\n structure.parentId,\r\n structure.sameLevelRank,\r\n structure.isUnfolded,\r\n structure.annotationsAreVisible,\r\n structure.hasChildren,\r\n structure.nestingDepth,\r\n structure.totalObjectCount,\r\n structure.canBeChosen,\r\n structure.isChosen,\r\n structure.toolSettings,\r\n structure.optionalParams\r\n );\r\n };\r\n}\r\n\r\n//#region Structure properties\r\n/**\r\n * Gets a new, free structureId that is one larger than the largest id already present.\r\n * @param {Array} structures All existing structures.\r\n * @returns {uint} New, free structure id.\r\n */\r\nexport function newStructureId(structures) {\r\n if (!Array.isArray(structures))\r\n throw TypeError(\r\n `structures must be of type Array, received ${typeof structures}: ${structures}`\r\n );\r\n\r\n const highestIdInStructures = Math.floor(\r\n structures\r\n .map((s) => s.id)\r\n .reduce((a, b) => Math.max(Math.abs(a), Math.abs(b)), 0)\r\n );\r\n return Math.max(Structure.maxId, highestIdInStructures) + 1;\r\n}\r\n\r\n/**\r\n * Perform a check whether a structure can move in a certain direction.\r\n * @param {Structure} structure The structure to move.\r\n * @param {int} direction Number of steps to move, postive numbers lower the structure, negative numbers raise it.\r\n * @param {Array} structures The existing structures.\r\n * @returns {bool} Whether the intended move is allowed.\r\n */\r\nexport function structureCanMove(structure, direction, structures) {\r\n if (!(structure instanceof Structure)) {\r\n throw TypeError(\r\n `structure must be of type Structure, recieved ${typeof structure}: ${structure}`\r\n );\r\n }\r\n if (!isInt(direction)) {\r\n throw TypeError(\r\n `direction must be of type int, received ${typeof direction}: ${direction}`\r\n );\r\n }\r\n if (!Array.isArray(structures)) {\r\n throw TypeError(\r\n `structures must be of type Array, received ${typeof structures}: ${structures}`\r\n );\r\n }\r\n\r\n // No movement requested\r\n if (direction === 0) return true;\r\n\r\n // Sort siblings by rank\r\n let siblings = structures\r\n .filter((s) => s.parentId === structure.parentId)\r\n .sort((a, b) => a.sameLevelRank - b.sameLevelRank);\r\n\r\n // Structure not in structures\r\n if (\r\n siblings.length === 0 ||\r\n !siblings.some((s) => s.id === structure.id && s.label === structure.label)\r\n ) {\r\n throw Error(`Structure ${structure.label} not found in structures`);\r\n }\r\n\r\n let sameLevelIndex = siblings.findIndex((s) => s.id === structure.id);\r\n\r\n // Check if new position would be in bounds of array\r\n if (\r\n sameLevelIndex + direction < 0 ||\r\n sameLevelIndex + direction > siblings.length - 1\r\n ) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Finds all parents of a structure.\r\n * Returns them in the order beginning from top and ending at given structure.\r\n * @param {Structure} structure The structure to find all parents for.\r\n * @param {Array} structures Existing structures.\r\n * @returns {Array} All parent structures, including the structure itself.\r\n */\r\nexport function parentStructures(structure, structures) {\r\n if (!(structure instanceof Structure))\r\n throw TypeError(\r\n `structure must be of type Structure, recieved ${typeof structure}: ${structure}`\r\n );\r\n if (!Array.isArray(structures))\r\n throw TypeError(\r\n `structures must be of type Array, received ${typeof structures}: ${structures}`\r\n );\r\n\r\n let parentStructs = [];\r\n\r\n // Recursively traverse structure tree upwards\r\n if (structure.parentId !== null) {\r\n parentStructs.push(\r\n ...parentStructures(\r\n structures.find((s) => s.id === structure.parentId),\r\n structures\r\n ),\r\n structure\r\n );\r\n return parentStructs;\r\n } else {\r\n return [structure];\r\n }\r\n}\r\n\r\n/**\r\n * Finds all children of a structure, beginning at the given structure and\r\n * ending with child-free structures.\r\n * @param {Structure} structure The structure to find all children for.\r\n * @param {Array} structures Existing structures.\r\n * @returns {Array} All child structures, including the structure itself.\r\n */\r\nexport function childStructures(structure, structures) {\r\n if (!(structure instanceof Structure))\r\n throw TypeError(\r\n `structure must be of type Structure, recieved ${typeof structure}: ${structure}`\r\n );\r\n if (!Array.isArray(structures))\r\n throw TypeError(\r\n `structures must be of type Array, received ${typeof structures}: ${structures}`\r\n );\r\n\r\n // Bottom end of structure tree\r\n if (!structure.hasChildren) {\r\n return [structure];\r\n } else {\r\n let childStructs = [structure];\r\n\r\n structures\r\n .filter((s) => s.parentId === structure.id)\r\n .forEach((s) => childStructs.push(...childStructures(s, structures)));\r\n\r\n return childStructs;\r\n }\r\n}\r\n\r\n//#endregion\r\n//#region Structure actions\r\n/**\r\n * Sorts structures by their hierarchy.\r\n * @param {array} structures All structures imported from a project as list.\r\n * @param {Structure} parentStructure The topmost parent structure under which all structures will be sorted.\r\n * Defaults to null to begin at the topmost level.\r\n * @returns {array} The structures sorted based on their hierarchy.\r\n */\r\nexport function sortStructures(structures, parentStructure = null) {\r\n if (parentStructure !== null && !(parentStructure instanceof Structure))\r\n throw TypeError(\r\n `parentStructure must be of type Structure, recieved ${typeof parentStructure}: ${parentStructure}`\r\n );\r\n\r\n // Find all children of parentstructure\r\n let children = structures.filter((s) =>\r\n parentStructure === null\r\n ? s.parentId === parentStructure\r\n : s.parentId === parentStructure.id\r\n );\r\n\r\n // Sort by sameLevelRank\r\n children.sort((a, b) => a.sameLevelRank - b.sameLevelRank);\r\n\r\n // Check if they have children of their own and sort recursively.\r\n let sorted = [];\r\n children.forEach((child) => {\r\n if (child.hasChildren) {\r\n sorted = [...sorted, ...sortStructures(structures, child)];\r\n } else {\r\n sorted = [...sorted, child];\r\n }\r\n });\r\n\r\n // Combine with parent and return as array\r\n if (parentStructure !== null) {\r\n return [parentStructure, ...sorted];\r\n } else {\r\n return sorted;\r\n }\r\n}\r\n\r\n/**\r\n * Move an existing structure in a defined direction.\r\n * Invalid moves return original array.\r\n * @param {Structure} structure The structure to move.\r\n * @param {int} direction Number of steps to move, postive numbers lower the structure, negative numbers raise it.\r\n * @param {Array} structures The existing structures.\r\n * @returns {Array} The modified structures.\r\n */\r\nexport function moveStructure(structure, direction, structures) {\r\n if (!(structure instanceof Structure)) {\r\n throw TypeError(\r\n `structure must be of type Structure, recieved ${typeof structure}: ${structure}`\r\n );\r\n }\r\n if (!isInt(direction)) {\r\n throw TypeError(\r\n `direction must be of type int, received ${typeof direction}: ${direction}`\r\n );\r\n }\r\n if (!Array.isArray(structures)) {\r\n throw TypeError(\r\n `structures must be of type Array, received ${typeof structures}: ${structures}`\r\n );\r\n }\r\n\r\n // No move requested, return original\r\n if (direction === 0) return structures;\r\n\r\n // Sort siblings by rank\r\n const siblings = structures\r\n .filter((s) => s.parentId === structure.parentId)\r\n .sort((a, b) => a.sameLevelRank - b.sameLevelRank);\r\n\r\n // Move not possible, return original structures\r\n if (!structureCanMove(structure, direction, siblings)) return structures;\r\n\r\n const sameLevelIndex = siblings.findIndex((s) => s.id === structure.id);\r\n const newSameLevelRank = siblings[sameLevelIndex + direction].sameLevelRank;\r\n\r\n // All items between old and new rank must be updated\r\n const sibsToModify = siblings.filter((s) => {\r\n if (direction > 0) {\r\n return (\r\n s.sameLevelRank >= structure.sameLevelRank &&\r\n s.sameLevelRank <= newSameLevelRank\r\n );\r\n } else {\r\n return (\r\n s.sameLevelRank <= structure.sameLevelRank &&\r\n s.sameLevelRank >= newSameLevelRank\r\n );\r\n }\r\n });\r\n // Rotate ranking values of all affected siblings\r\n const prevRanks = sibsToModify.map((s) => s.sameLevelRank);\r\n sibsToModify.forEach((s, idx) => {\r\n s.sameLevelRank =\r\n prevRanks[(idx + sibsToModify.length + direction) % sibsToModify.length];\r\n });\r\n\r\n // Structures are already edited by reference\r\n return sortStructures(structures);\r\n}\r\n\r\n/**\r\n * Insert a new structure into the list of existing structures, update structures as necessary.\r\n * @param {Structure} structure A structure to insert into existing structures.\r\n * @param {Array} structures List of all existing structures.\r\n * @returns {Array} Updated structure list.\r\n */\r\nexport function insertStructure(structure, structures) {\r\n if (!(structure instanceof Structure))\r\n throw TypeError(\r\n `structure must be of type Structure, recieved ${typeof structure}: ${structure}`\r\n );\r\n if (!Array.isArray(structures))\r\n throw TypeError(\r\n `structures must be of type Array, received ${typeof structures}: ${structures}`\r\n );\r\n\r\n // Do not allow duplicate ids.\r\n if (structures.map((s) => s.id).some((id) => id === structure.id)) {\r\n throw Error(\r\n `id \"${structure.id}\" already present in structures. \r\n Please use the newStructureId() method to generate a unique id.`\r\n );\r\n }\r\n\r\n // Find all same level-children and sort as lowest\r\n structure.sameLevelRank =\r\n structures\r\n .filter((s) => s.parentId === structure.parentId)\r\n .map((s) => s.id)\r\n .reduce((a, b) => Math.max(a, b), -1) + 1;\r\n\r\n // Update parent\r\n if (structure.parentId !== null) {\r\n const parent = structures.find((s) => s.id === structure.parentId);\r\n parent.hasChildren = true;\r\n parent.isUnfolded = true;\r\n }\r\n\r\n // Add adapted structure to all structures\r\n structures.push(structure);\r\n\r\n return sortStructures(structures);\r\n}\r\n\r\n/**\r\n * Delete a structure from the list of existing structures, update structures as necessary.\r\n * @param {Structure} structure The structure to delete from existing structures.\r\n * @param {Array} structures List of all existing structures.\r\n * @param {function} deleteAnnotations Optional. Delete rois of structure given to function. Receives (Structure: structureToDelete).\r\n * @returns {Array} Updated structure list.\r\n */\r\nexport function deleteStructure(\r\n structure,\r\n structures,\r\n deleteAnnotations = () => {}\r\n) {\r\n if (!(structure instanceof Structure))\r\n throw TypeError(\r\n `structure must be of type Structure, recieved ${typeof structure}: ${structure}`\r\n );\r\n if (!Array.isArray(structures))\r\n throw TypeError(\r\n `structures must be of type Array, received ${typeof structures}: ${structures}`\r\n );\r\n\r\n // Delete all rois of structure and its children\r\n // Find all children and delete them\r\n childStructures(structure, structures).forEach((s) => {\r\n deleteAnnotations(s);\r\n structures.splice(\r\n structures.findIndex((struct) => struct.id === s.id),\r\n 1\r\n );\r\n });\r\n\r\n // Find all siblings\r\n const siblings = structures\r\n .filter((s) => s.parentId === structure.parentId)\r\n .sort((a, b) => a.sameLevelRank - b.sameLevelRank);\r\n\r\n // Should parent no longer have children\r\n if (siblings.length === 0 && structure.parentId !== null) {\r\n structures.find((s) => s.id === structure.parentId).hasChildren = false;\r\n return sortStructures(structures);\r\n }\r\n\r\n // Update sameLevelRank of all siblings\r\n siblings.forEach((s, idx) => (s.sameLevelRank = idx));\r\n\r\n return sortStructures(structures);\r\n}\r\n\r\n/**\r\n * Duplicates a structure including all its decendents and\r\n * Inserts the duplicate as lowest sibling in same hierarchical rank.\r\n * @param {Structure} structure The structure to duplicate.\r\n * @param {Array} structures Existing structures.\r\n * @returns {Array} The updated structures.\r\n */\r\nexport function duplicateStructure(structure, structures) {\r\n if (!(structure instanceof Structure))\r\n throw TypeError(\r\n `structure must be of type Structure, recieved ${typeof structure}: ${structure}`\r\n );\r\n if (!Array.isArray(structures))\r\n throw TypeError(\r\n `structures must be of type Array, received ${typeof structures}: ${structures}`\r\n );\r\n\r\n // Find all children of structure to duplicate, including the structure\r\n const childStructs = childStructures(structure, structures);\r\n\r\n // Reserve new Ids\r\n const firstNewId = newStructureId(structures);\r\n const newIds = Array(childStructs.length);\r\n for (let i = 0; i < childStructs.length; i++) {\r\n newIds[i] = firstNewId + i;\r\n }\r\n\r\n // Create new structures based on children\r\n const newStructs = childStructs.map((s) => Structure.copy(s));\r\n\r\n // Adapt parent-Ids\r\n newStructs.forEach((s, idx) => {\r\n s.id = newIds[idx];\r\n s.label = `Copy: ${s.label}`;\r\n const parentIdx = childStructs.findIndex((cs) => cs.id === s.parentId);\r\n\r\n // If parent is one of the newly added structures, adapt to the new id.\r\n if (parentIdx >= 0) s.parentId = newIds[parentIdx];\r\n });\r\n\r\n structures = insertStructure(newStructs.shift(), structures);\r\n structures.push(...newStructs);\r\n const tmp = sortStructures(structures);\r\n return tmp;\r\n}\r\n\r\n/**\r\n * Export structuretree in frontend to .strhsa file.\r\n * @param {string} username Full username of exporting user.\r\n * @param {object} project Project the structures referr to.\r\n * @param {array} structures Structuretree to export.\r\n * @returns {object} Success status of export.\r\n */\r\nexport function exportStructures(username, project, structures) {\r\n if (typeof username !== \"string\") {\r\n throw TypeError(\r\n `username must be of type string, received ${typeof username}: ${username}`\r\n );\r\n }\r\n if (!isObject(project)) {\r\n throw TypeError(\r\n `project must be of type object, received ${typeof project}: ${project}`\r\n );\r\n }\r\n if (!Array.isArray(structures)) {\r\n throw TypeError(\r\n `structures must be an array, received ${typeof structures}: ${structures}`\r\n );\r\n }\r\n\r\n try {\r\n // Export rois with meta info\r\n const timestamp = convertDateToShortIsoString(Date.now());\r\n downloadJsonObjectAsFile(\r\n {\r\n version: 1.0,\r\n timestamp: timestamp,\r\n user: username,\r\n project: project,\r\n structures,\r\n },\r\n `${timestamp}_${project.name}_StructureTree_(${structures.length}_Structures).strhsa`\r\n );\r\n\r\n return {\r\n success: true,\r\n msg: `Successfully exported ${structures.length} structures.`,\r\n };\r\n } catch (err) {\r\n return {\r\n success: false,\r\n msg: `Failed to export ${structures.length} structures.`,\r\n error: err,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Import structures from .strhsa file. Replaces all current structures and deletes all current frontend annotations.\r\n * @param {uint} firstNewId First new id for new structures.\r\n * @param {function} callback Function to execute with the new structures. Receives (array: newStructures).\r\n * @param {function} error Optional. Function to execute on error. Receives (string: errorMessage).\r\n * @returns\r\n */\r\nexport async function importStructures(firstNewId, callback, error = () => {}) {\r\n if (!isInt(firstNewId) || firstNewId < 0)\r\n throw TypeError(\r\n `firstNewId must be an integer >= 0, received ${typeof firstNewId}: ${firstNewId}`\r\n );\r\n if (typeof callback !== \"function\")\r\n throw TypeError(\r\n `callback must be a function, received ${typeof callback}: ${callback}`\r\n );\r\n if (typeof error !== \"function\")\r\n throw TypeError(\r\n `error must be a function, received ${typeof error}: ${error}`\r\n );\r\n\r\n // Structure replacement warning\r\n const continueImport = await window.openConfirmationDialog(\r\n \"Import Structures\",\r\n `All structures and annotations will be deleted and replaced with the imported structures.\r\n Import anyway?`\r\n );\r\n if (!continueImport) return;\r\n\r\n const files = await requestFileInput([\".strhsa\"]);\r\n if (files.length === 0) return;\r\n const file = files[0];\r\n\r\n const fr = new FileReader();\r\n fr.onload = async (e) => {\r\n try {\r\n const data = JSON.parse(e.target.result);\r\n if (!Array.isArray(data.structures)) {\r\n window.showErrorSnackbar(`No valid structures found in ${file.name}.`);\r\n return;\r\n }\r\n\r\n // Empty structure import warning\r\n if (data.structures.length == 0) {\r\n const continueImport = await window.openConfirmationDialog(\r\n \"No structures to import\",\r\n `There are no structures included in uploaded file. \r\n An import will remove all existing structures, including their annotations. \r\n Import anyway?`\r\n );\r\n if (!continueImport) return;\r\n }\r\n\r\n let newStructures = [];\r\n\r\n // Replace full structure tree\r\n data.structures.forEach((s) => {\r\n const newStruct = Structure.fromObject(s);\r\n newStructures = insertStructure(newStruct, newStructures);\r\n });\r\n\r\n // Reserve new Ids\r\n const newIds = Array(data.structures.length);\r\n for (let i = 0; i < data.structures.length; i++) {\r\n newIds[i] = firstNewId + i;\r\n }\r\n\r\n // Update parent-child relationships\r\n newStructures.forEach((s) => {\r\n if (!s.parentId) return;\r\n const parentIndex = newStructures.findIndex(\r\n (struct) => struct.id === s.parentId\r\n );\r\n s.parentId = newIds[parentIndex];\r\n });\r\n\r\n // Update ids\r\n newStructures.forEach((s, i) => (s.id = newIds[i]));\r\n\r\n // Set new structures\r\n callback(sortStructures(newStructures));\r\n } catch (err) {\r\n const errmsg = `Failed to import the structures from file ${file.name}:\\n${err}`;\r\n console.debug(errmsg);\r\n error(errmsg);\r\n }\r\n };\r\n // Only accept the first element\r\n fr.readAsText(file);\r\n}\r\n//#endregion\r\n","// Copyright HS Analysis GmbH, 2023\r\n// Author: Valentin Haas\r\n\r\n// Description: Standardized Roi Types for HSA KIT.\r\n// For ROI documentation see https://hsa.atlassian.net/wiki/spaces/HSAKIT/pages/16116235173917/Annotations+Data+Structure\r\n\r\n// Keep in sync with C# and js frontend:\r\n// Source\\HSA-KIT\\Database\\Model\\RoiTypes.cs\r\n// Source\\HSA-KIT\\ClientApp\\src\\common\\components\\RoiTypes.jsx\r\n// Source\\HSA-KIT\\modules\\hsa\\core\\models\\roi_types.py\r\n\r\n// External packages\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\n// HSA imports\r\nimport Backend from \"../utils/Backend\";\r\nimport { isInt, isUuid, downloadJsonObjectAsFile } from \"../utils/Utils\";\r\nimport { convertDateToShortIsoString } from \"../../common/utils/Localization\";\r\nimport { calcBoundingBoxFullObject } from \"../../viewer/utils/PolygonUtil\";\r\nimport Structure from \"./Structure\";\r\n\r\n//#region DataType Enumerators\r\n/**\r\n * Limits and describes possible modification statuses.\r\n */\r\nexport const ModificationStatus = Object.freeze({\r\n // Must be updated together with backend\r\n Saved: 0,\r\n Added: 1,\r\n Deleted: 2,\r\n});\r\n\r\n/**\r\n * Limits and describes annotation types.\r\n */\r\nexport const RoiType = Object.freeze({\r\n // Must be updated together with backend\r\n ImageRoi: 0,\r\n AudioRoi: 1,\r\n});\r\n\r\n/**\r\n * Limits and decribes possible image annotation types statuses.\r\n */\r\nexport const ImageAnnotationType = Object.freeze({\r\n // Must be updated together with backend\r\n Area: 0,\r\n Object: 1,\r\n Comments: 2,\r\n});\r\n\r\n/**\r\n * Implemented actions concerning annotations to be executed.\r\n */\r\nexport const AnnotationAction = Object.freeze({\r\n // Must be updated together with backend\r\n Save: 0,\r\n Export: 1,\r\n Import: 2,\r\n DeleteAll: 3,\r\n});\r\n//#endregion\r\n\r\n//#region Roi Actions\r\n\r\n/**\r\n * Save all passed rois to database.\r\n * Update rois in frontend based on response from backend.\r\n * @param {uuid} projectId Project id to save annotations for.\r\n * @param {object} file File to save annotations for.\r\n * @param {Structure} structure Structure to save annotations for.\r\n * @param {RoiType} annotationType Type of rois to save.\r\n * @param {array} annotations Annotations to save.\r\n * @param {function} callback Optional: Always execute after receiving and processing save response. Receives (array: newAnnotations).\r\n * @param {function} error Optional: Execute on error. Receives (object: error).\r\n */\r\nexport function saveAnnotations(\r\n projectId,\r\n file,\r\n structure,\r\n annotationType,\r\n annotations,\r\n callback = () => {},\r\n error = () => {}\r\n) {\r\n if (!isUuid(projectId)) {\r\n throw TypeError(\r\n `projectId must be a valid UUID, received ${typeof projectId}: ${projectId}`\r\n );\r\n }\r\n if (typeof file !== \"object\") {\r\n throw TypeError(\r\n `file must be of type object, received ${typeof file}: ${file}`\r\n );\r\n }\r\n if (!(structure instanceof Structure)) {\r\n throw TypeError(\r\n `structure must be of type Structure, received ${typeof structure}: ${structure}`\r\n );\r\n }\r\n if (!Object.values(RoiType).includes(annotationType)) {\r\n `annotationType unknown, received ${typeof annotationType}: ${annotationType}`;\r\n }\r\n if (!Array.isArray(annotations)) {\r\n throw TypeError(\r\n `annotations must be an array, received ${typeof annotations}: ${annotations}`\r\n );\r\n }\r\n\r\n Backend.saveAnnotationsToDb(\r\n projectId,\r\n RoiType.AudioRoi,\r\n annotations,\r\n (data) => {\r\n // Read potentially updated roi ids.\r\n let oldIds = [];\r\n let newIds = [];\r\n\r\n data.roiUpdate.reassignedIds.forEach((idTuple) => {\r\n oldIds.push(idTuple[0]);\r\n newIds.push(idTuple[1]);\r\n });\r\n\r\n annotations = annotations.map((a) => {\r\n // Mirror potentially updated roi ids.\r\n if (oldIds.includes(a.id)) {\r\n a.id = newIds[oldIds.indexOf(a.id)];\r\n }\r\n\r\n // Everything was successfull -> Mark all annotations as saved.\r\n switch (a.modificationStatus) {\r\n case ModificationStatus.Saved:\r\n return a;\r\n\r\n case ModificationStatus.Added:\r\n a.modificationStatus = ModificationStatus.Saved;\r\n return a;\r\n\r\n case ModificationStatus.Deleted:\r\n // Exclude successfully deleted rois.\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n });\r\n\r\n // Remove undefineds\r\n annotations = annotations.filter((a) => a);\r\n console.debug(\r\n `Saved annotations for file \"${file.fileName}\", structure ${structure.label}: ${data.success}`\r\n );\r\n callback(annotations);\r\n },\r\n (err) => {\r\n // Some annotations failed to save to database.\r\n if (err.warning) {\r\n let oldIds = [];\r\n let newIds = [];\r\n\r\n // Read potentially updated roi ids.\r\n err.roiUpdate.reassignedIds.forEach((idTuple) => {\r\n oldIds.push(idTuple[0]);\r\n newIds.push(idTuple[1]);\r\n });\r\n\r\n annotations = annotations.map((a) => {\r\n // Mirror potentially updated roi ids.\r\n if (oldIds.includes(a.id)) {\r\n a.id = newIds[oldIds.indexOf(a.id)];\r\n }\r\n\r\n if (a.modificationStatus === ModificationStatus.Saved) {\r\n return a;\r\n }\r\n // Keep unsuccessfully added or unsuccessfully deleted rois unchanged\r\n else if (\r\n err.roiUpdate.failedToAdd.includes(a.id) ||\r\n err.roiUpdate.failedToDelete.includes(a.id)\r\n ) {\r\n return a;\r\n }\r\n // Set successfully added rois as saved.\r\n else if (a.modificationStatus === ModificationStatus.Added) {\r\n a.modificationStatus = ModificationStatus.Saved;\r\n return a;\r\n }\r\n // Exclude successfully deleted rois.\r\n });\r\n\r\n // Remove undefineds\r\n annotations = annotations.filter((a) => a);\r\n\r\n window.showWarningSnackbar(err.warning);\r\n console.debug(err);\r\n error(err);\r\n callback(annotations);\r\n }\r\n // The save process went wrong somewhere\r\n else if (err.error) {\r\n window.showErrorSnackbar(\r\n `Error saving annotations of file \"${file.fileName}\", structure ${structure.label}:\\n${err.error}`\r\n );\r\n error(err);\r\n }\r\n // Good luck\r\n else {\r\n window.showErrorSnackbar(\r\n `Unkonwn error saving annotations of file \"${file.fileName}\", structure ${structure.label}\"`\r\n );\r\n error(err);\r\n }\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Export all annotations in frontend to .annhsa file.\r\n * Triggers download of the .annhsa file.\r\n * @param {string} username Name of the user exporting the annotations.\r\n * @param {object} project Origin project of the rois.\r\n * @param {object} file File corresponding to the rois.\r\n * @param {Structure} structure Structure corresponding to the rois.\r\n * @param {RoiType} annotationType Type of rois to save.\r\n * @param {array} annotations All annotations.\r\n * @return {object} Success status of export.\r\n */\r\nexport function exportAnnotations(\r\n username,\r\n project,\r\n file,\r\n structure,\r\n annotationType,\r\n annotations\r\n) {\r\n if (typeof username !== \"string\") {\r\n throw TypeError(\r\n `username must be of type string, received ${typeof username}: ${username}`\r\n );\r\n }\r\n if (typeof project !== \"object\") {\r\n throw TypeError(\r\n `project must be of type object, received ${typeof project}: ${project}`\r\n );\r\n }\r\n if (typeof file !== \"object\") {\r\n throw TypeError(\r\n `file must be of type object, received ${typeof file}: ${file}`\r\n );\r\n }\r\n if (!(structure instanceof Structure)) {\r\n throw TypeError(\r\n `structure must be of type Structure, received ${typeof structure}: ${structure}`\r\n );\r\n }\r\n if (!Object.values(RoiType).includes(annotationType)) {\r\n `annotationType unknown, received ${typeof annotationType}: ${annotationType}`;\r\n }\r\n if (!Array.isArray(annotations)) {\r\n throw TypeError(\r\n `annotations must be an array, received ${typeof annotations}: ${annotations}`\r\n );\r\n }\r\n\r\n try {\r\n // Export rois with meta info\r\n const timestamp = convertDateToShortIsoString(Date.now());\r\n downloadJsonObjectAsFile(\r\n {\r\n version: 1.0,\r\n timestamp: timestamp,\r\n user: username,\r\n project: project,\r\n file: {\r\n id: file.id,\r\n label: file.fileName,\r\n },\r\n structure: {\r\n id: structure.id,\r\n label: structure.label,\r\n isStructure: structure.isStructure,\r\n },\r\n annotationType: annotationType,\r\n annotations: annotations,\r\n },\r\n `${timestamp}_${project.name}_${file.fileName}_${structure.label}_(${annotations.length})_${username}.annhsa`\r\n );\r\n\r\n return {\r\n success: true,\r\n msg: `Successfully exported ${annotations.length} annotations of structure ${structure.label}`,\r\n };\r\n } catch (err) {\r\n return {\r\n success: false,\r\n msg: `Failed to export ${annotations.length} annotations of structure ${structure.label}`,\r\n error: err,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Open a file selection window and import annotations from selected file to frontend.\r\n * Deletes all previous annotations.\r\n * @param {RoiType} annotationType The expected annotation type.\r\n * @param {array} existingAnnotations The previously exisiting annotations. Will all be set as to delete.\r\n * @param {object} file File corresponding to the rois.\r\n * @param {Structure} structure Structure corresponding to the rois.\r\n * @param {function} callback Always executes after loading and processing annotations. Receives (array: annotations).\r\n * @param {function} error Optional: Execute on error. Receives (object: error).\r\n */\r\nexport async function importAnnotations(\r\n annotationType,\r\n existingAnnotations,\r\n file,\r\n structure,\r\n callback,\r\n error = () => {}\r\n) {\r\n if (!Object.values(RoiType).includes(annotationType)) {\r\n `annotationType unknown, received ${typeof annotationType}: ${annotationType}`;\r\n }\r\n if (!Array.isArray(existingAnnotations)) {\r\n throw TypeError(\r\n `existingAnnotations must be an array, received ${typeof existingAnnotations}: ${existingAnnotations}`\r\n );\r\n }\r\n if (typeof file !== \"object\") {\r\n throw TypeError(\r\n `file must be of type object, received ${typeof file}: ${file}`\r\n );\r\n }\r\n if (!(structure instanceof Structure)) {\r\n throw TypeError(\r\n `structure must be of type Structure, received ${typeof structure}: ${structure}`\r\n );\r\n }\r\n\r\n // Warn about unsaved existing annotations\r\n const unsaved = existingAnnotations.filter(\r\n (a) => a.modificationStatus !== ModificationStatus.Saved\r\n ).length;\r\n if (unsaved > 0) {\r\n const continueImport = await window.openConfirmationDialog(\r\n \"Unsaved annotations\",\r\n `You have ${unsaved} unsaved modified ${\r\n unsaved === 1 ? \"annotation\" : \"annotations\"\r\n } in the structure \"${structure.label}\". \r\n An import will irreversibly remove all unsaved annotations. \r\n Import anyway?`\r\n );\r\n if (!continueImport) return;\r\n }\r\n\r\n // Import window\r\n const inputElem = document.createElement(\"INPUT\");\r\n inputElem.setAttribute(\"type\", \"file\");\r\n inputElem.setAttribute(\"onChange\", \"file\");\r\n inputElem.setAttribute(\"accept\", \".annhsa\");\r\n inputElem.onchange = (e) => {\r\n // Analyse the incoming file, abort on no file.\r\n let files = e.target.files;\r\n if (files.length <= 0) return;\r\n\r\n let fr = new FileReader();\r\n fr.onload = async (e) => {\r\n try {\r\n const data = JSON.parse(e.target.result);\r\n // Data validation checks\r\n // TODO: Refactor into some kind of async .then functions\r\n if (data.annotationType !== annotationType) {\r\n throw TypeError(\r\n `Annotation type mismatch: was expecting \"${annotationType}\", imported file is of type \"${data.annotationType}\"`\r\n );\r\n }\r\n\r\n // Warn about file change\r\n if (data.file.id !== file.id && data.file.label !== file.fileName) {\r\n const continueImport = await window.openConfirmationDialog(\r\n \"File Mismatch\",\r\n `The annotations were created for a different file:\\n\"${data.file.label}\". \r\n You are attempting to import it to the file:\\n\"${file.fileName}\". \r\n An import will remove all existing annotations. \r\n Import anyway?`\r\n );\r\n if (!continueImport) return;\r\n }\r\n\r\n // Warn about structure change\r\n if (\r\n data.structure.id !== structure.id &&\r\n data.structure.label !== structure.label\r\n ) {\r\n const continueImport = await window.openConfirmationDialog(\r\n \"Structure Mismatch\",\r\n `The annotations were created for a different structure: \"${data.structure.label}\". \r\n You are attempting to import it to the structure: \"${structure.label}\". \r\n An import will remove all existing annotations. \r\n Import anyway?`\r\n );\r\n if (!continueImport) return;\r\n }\r\n\r\n // Warn about 0-length imported annotations\r\n if (data.annotations.length === 0) {\r\n const continueImport = await window.openConfirmationDialog(\r\n \"No annotatations to import\",\r\n `There are no annotations included in uploaded file. \r\n An import will remove all existing annotations. \r\n Import anyway?`\r\n );\r\n if (!continueImport) return;\r\n }\r\n\r\n const importedAnnotations = [];\r\n switch (annotationType) {\r\n case RoiType.ImageRoi:\r\n data.annotations.forEach((a) =>\r\n importedAnnotations.push(\r\n new ImageRoi(\r\n uuidv4(),\r\n file.id,\r\n structure.id,\r\n a.isAiAnnotated,\r\n a.user,\r\n ModificationStatus.Added,\r\n a.z,\r\n a.t,\r\n a.coordinates,\r\n a.annotationType,\r\n a.minX,\r\n a.minY,\r\n a.maxX,\r\n a.maxY\r\n )\r\n )\r\n );\r\n break;\r\n\r\n case RoiType.AudioRoi:\r\n data.annotations.forEach((a) =>\r\n importedAnnotations.push(\r\n new AudioRoi(\r\n uuidv4(),\r\n file.id,\r\n structure.id,\r\n a.isAiAnnotated,\r\n a.user,\r\n ModificationStatus.Added,\r\n a.startTime,\r\n a.endTime,\r\n a.minFreq,\r\n a.maxFreq,\r\n a.channels\r\n )\r\n )\r\n );\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n\r\n // Set all existing annotations as deleted\r\n existingAnnotations.forEach(\r\n (anno) => (anno.modificationStatus = ModificationStatus.Deleted)\r\n );\r\n\r\n callback([...existingAnnotations, ...importedAnnotations]);\r\n } catch (err) {\r\n const errmsg = `Failed to import the annotations of type ${annotationType} from file ${files[0].name}:\\n${err}`;\r\n console.debug(errmsg);\r\n error(errmsg);\r\n }\r\n };\r\n // Only accept the first element\r\n fr.readAsText(files.item(0));\r\n };\r\n inputElem.click();\r\n inputElem.remove();\r\n}\r\n\r\n/**\r\n * After a confirming prompt, delete all annotations of a structure in frontend.\r\n * @param {array} existingAnnotations The previously exisiting annotations. Will all be set as to delete.\r\n * @param {Structure} structure Structure corresponding to the rois.\r\n * @param {function} callback Save updated annotations after modfication. Receives (array: annotations).\r\n * @param {bool} forceDelete Optional. Delete all annotations with out asking user first. Defaults to false.\r\n */\r\nexport async function deleteAllAnnotations(\r\n existingAnnotations,\r\n structure,\r\n callback,\r\n forceDelete = false\r\n) {\r\n if (!Array.isArray(existingAnnotations)) {\r\n throw TypeError(\r\n `existingAnnotations must be an array, received ${typeof existingAnnotations}: ${existingAnnotations}`\r\n );\r\n }\r\n if (!(structure instanceof Structure)) {\r\n throw TypeError(\r\n `structure must be of type Structure, received ${typeof structure}: ${structure}`\r\n );\r\n }\r\n if (typeof forceDelete !== \"boolean\") {\r\n throw TypeError(\r\n `forceDelete must be a boolean, received ${typeof forceDelete}: ${forceDelete}`\r\n );\r\n }\r\n const continueDeletion =\r\n forceDelete ||\r\n (await window.openConfirmationDialog(\r\n \"Delete all Annotations\",\r\n `This action will delete all annotations of the structure \"${structure.label}\". Proceed?`\r\n ));\r\n if (!continueDeletion) return;\r\n\r\n const updatedAnnotations = existingAnnotations.map((a) => {\r\n a.modificationStatus = ModificationStatus.Deleted;\r\n return a;\r\n });\r\n\r\n callback(updatedAnnotations);\r\n}\r\n\r\n//#endregion\r\n\r\n//#region General Roi definitions\r\n/**\r\n * Basic information every type of region of interest (ROI) must contain.\r\n */\r\nclass Roi {\r\n // Must be updated together with backend\r\n /**\r\n * Create a ROI object with all parameters.\r\n * @param {Guid} id Id of the ROI.\r\n * @param {Guid} fileId Id of the associated scene.\r\n * @param {uint} structure Id of associated structure.\r\n * @param {bool} isAiAnnotated Whether or not this annotation is AI generated.\r\n * @param {ModificationStatus} modificationStatus Status of modification of any single annotation.\r\n * @param {Guid} user User that created this annotation.\r\n */\r\n constructor(\r\n id,\r\n fileId,\r\n structure,\r\n isAiAnnotated,\r\n modificationStatus = ModificationStatus.Added,\r\n user\r\n ) {\r\n // Input validation\r\n if (!isUuid(id)) {\r\n throw TypeError(\r\n `id must be a non-nil UUID, received ${typeof id}: ${id}`\r\n );\r\n }\r\n if (!isUuid(fileId)) {\r\n throw TypeError(\r\n `fileId must be a non-nil UUID, received ${typeof fileId}: ${fileId}`\r\n );\r\n }\r\n if (!isInt(structure) || structure < 0) {\r\n throw TypeError(\r\n `structure must be an integer >= 0, received ${typeof structure}: ${structure}`\r\n );\r\n }\r\n if (typeof isAiAnnotated !== \"boolean\") {\r\n throw TypeError(\r\n `isAiAnnotated must be a boolean, received ${typeof isAiAnnotated}: ${isAiAnnotated}`\r\n );\r\n }\r\n if (!Object.values(ModificationStatus).includes(modificationStatus)) {\r\n throw TypeError(\r\n `Invalid modificationStatus, received ${typeof modificationStatus}: ${modificationStatus}`\r\n );\r\n }\r\n if (!isUuid(user)) {\r\n throw TypeError(\r\n `user must be a non-nil UUID, received ${typeof user}: ${user}`\r\n );\r\n }\r\n\r\n // Value assignment\r\n this.id = id;\r\n this.fileId = fileId;\r\n this.structure = structure;\r\n this.isAiAnnotated = isAiAnnotated;\r\n this.modificationStatus = modificationStatus;\r\n this.user = user;\r\n }\r\n}\r\n//#endregion\r\n\r\n//#region ImageRois\r\n/**\r\n * A ROI in an image or video, whose coordinates comply with the GeoJSON standard.\r\n */\r\nexport class ImageRoi extends Roi {\r\n // Must be updated together with backend\r\n /**\r\n * Create an ImageRoi object with all parameters.\r\n * @param {Guid} id Id of the ROI.\r\n * @param {Guid} fileId Id of the associated scene.\r\n * @param {Structure} structure Associated strucuture.\r\n * @param {bool} isAiAnnotated Whether or not this annotation is AI generated.\r\n * @param {ModificationStatus} modificationStatus Status of modification of any single annotation. 0: Saved to DB, 1: Added or modified, 2: Deleted\r\n * @param {Guid} user User that created this annotation.\r\n * @param {number} z Z-Layer in a z-Stack image.\r\n * @param {number} t Timeframe in a video.\r\n * @param {JSON | string} coordinates The coordinates of the polygon, complies with the GeoJSON format. Can be passed as string, will be converted to json.\r\n * @param {ImageAnnotationType} annotationType Defines the type of annotations.\r\n * @param {number} minX Optional. Minimum X value of the polygon bounding box.\r\n * @param {number} minY Optional. Minimum Y value of the polygon bounding box.\r\n * @param {number} maxX Optional. Maximum X value of the polygon bounding box.\r\n * @param {number} maxY Optional. Maximum Y value of the polygon bounding box.\r\n */\r\n constructor(\r\n id,\r\n fileId,\r\n structure,\r\n isAiAnnotated,\r\n user,\r\n modificationStatus,\r\n z,\r\n t,\r\n coordinates,\r\n annotationType,\r\n minX,\r\n minY,\r\n maxX,\r\n maxY\r\n ) {\r\n super(id, fileId, structure, isAiAnnotated, modificationStatus, user);\r\n\r\n // Input validation\r\n if (!isInt(z) || z < 0) {\r\n throw TypeError(`z must be an integer >= 0, received ${typeof z}: ${z}`);\r\n }\r\n if (!isInt(t) || z < 0) {\r\n throw TypeError(`t must be an integer >= 0, received ${typeof t}: ${t}`);\r\n }\r\n if (typeof coordinates !== \"object\" && typeof coordinates !== \"string\") {\r\n throw TypeError(\r\n `Invalid coordinates, received ${typeof coordinates}: ${coordinates}`\r\n );\r\n }\r\n if (!Object.values(ImageAnnotationType).includes(annotationType)) {\r\n throw TypeError(\r\n `Invalid annotationType, received ${typeof annotationType}: ${annotationType}`\r\n );\r\n }\r\n if (typeof minX !== \"number\" && minX !== undefined)\r\n throw TypeError(\r\n `minX must be a number, received ${typeof minX}: ${minX}`\r\n );\r\n if (typeof minY !== \"number\" && minX !== undefined)\r\n throw TypeError(\r\n `minY must be a number, received ${typeof minY}: ${minY}`\r\n );\r\n if (typeof maxX !== \"number\" && minX !== undefined)\r\n throw TypeError(\r\n `maxX must be a number, received ${typeof maxX}: ${maxX}`\r\n );\r\n if (typeof maxY !== \"number\" && minX !== undefined)\r\n throw TypeError(\r\n `maxY must be a number, received ${typeof maxY}: ${maxY}`\r\n );\r\n\r\n // Value assignment\r\n this.z = z;\r\n this.t = t;\r\n this.coordinates =\r\n typeof coordinates === \"string\" ? JSON.parse(coordinates) : coordinates;\r\n this.annotationType = annotationType;\r\n\r\n // Should the values not be passed on, they must be calculated.\r\n if (minX && minY && maxX && maxY) {\r\n this.minX = minX;\r\n this.minY = minY;\r\n this.maxX = maxX;\r\n this.maxY = maxY;\r\n } else {\r\n // Calculate bounding box\r\n let rect = calcBoundingBoxFullObject(this.coordinates);\r\n // Assuming coordinate origin in top left corner\r\n // . -- x -->\r\n // |\r\n // y\r\n // |\r\n // V\r\n this.minX = rect.left;\r\n this.minY = rect.top;\r\n this.maxX = rect.right;\r\n this.maxY = rect.bottom;\r\n }\r\n }\r\n\r\n /**\r\n * Returns an item that can be added to rTree or rBush.\r\n * Prevents the need to manually define such a tree item every time.\r\n * @returns Treeitem with bounding box and reference to roi.\r\n */\r\n getTreeItem() {\r\n return {\r\n minX: this.minX,\r\n minY: this.minY,\r\n maxX: this.maxX,\r\n maxY: this.maxY,\r\n roi: this,\r\n };\r\n }\r\n\r\n /**\r\n * Create a new ImageRoi from an object without needing to define all parameters individually.\r\n * Accepts camelCase and PascalCase properties, with camelCase being the default.\r\n * Additional properties will be ignored,\r\n * missing properties will use defaults or throw error per ImageRoi constructor.\r\n * @param {object} obj An object containing all necessary properties of a ImageRoi.\r\n * @returns {ImageRoi} A new ImageRoi.\r\n */\r\n static fromObject = (obj) => {\r\n return new ImageRoi(\r\n obj.id ?? obj.Id,\r\n obj.fileId ?? obj.FileId,\r\n obj.structure ?? obj.Structure,\r\n obj.isAiAnnotated ?? obj.IsAiAnnotated,\r\n obj.user ?? obj.User,\r\n obj.modificationStatus ?? obj.ModificationStatus,\r\n obj.z ?? obj.Z,\r\n obj.t ?? obj.T,\r\n obj.coordinates ?? obj.Coordinates,\r\n obj.annotationType ?? obj.AnnotationType,\r\n obj.minX ?? obj.MinX,\r\n obj.minY ?? obj.MinY,\r\n obj.maxX ?? obj.MaxX,\r\n obj.maxY ?? obj.MaxY\r\n );\r\n };\r\n}\r\n//#endregion\r\n\r\n//#region AudioRois\r\nexport class AudioRoi extends Roi {\r\n // Must be updated together with backend\r\n /**\r\n * Create a AudioRoi object with all parameters.\r\n * @param {Guid} id Id of the ROI.\r\n * @param {Guid} fileId Id of the associated scene.\r\n * @param {Structure} structure Associated strucuture.\r\n * @param {bool} isAiAnnotated Whether or not this annotation is AI generated.\r\n * @param {ModificationStatus} modificationStatus Status of modification of any single annotation.\r\n * @param {Guid} user User that created this annotation.\r\n * @param {number} startTime Timestamp of annotation beginning in seconds.\r\n * @param {number} endTime Timestamp of annotation end in seconds.\r\n * @param {number} minFreq Minimum frequency of annotation in Hertz.\r\n * @param {number} maxFreq Maximum frequency of annotation in Hertz.\r\n * @param {array} channels All channels the annotation is present in.\r\n */\r\n constructor(\r\n id,\r\n fileId,\r\n structure,\r\n isAiAnnotated,\r\n user,\r\n modificationStatus,\r\n startTime,\r\n endTime,\r\n minFreq,\r\n maxFreq,\r\n channels\r\n ) {\r\n super(id, fileId, structure, isAiAnnotated, modificationStatus, user);\r\n\r\n // Input validation\r\n if (typeof startTime !== \"number\" || startTime < 0) {\r\n throw TypeError(\r\n `startTime must be a number >= 0, received ${typeof startTime}: ${startTime}`\r\n );\r\n }\r\n if (typeof endTime !== \"number\" || endTime < 0) {\r\n throw TypeError(\r\n `endTime must be a number >= 0, received ${typeof endTime}: ${endTime}`\r\n );\r\n }\r\n if (typeof minFreq !== \"number\" || minFreq < 0) {\r\n throw TypeError(\r\n `minFreq must be a number >= 0, received ${typeof minFreq}: ${minFreq}`\r\n );\r\n }\r\n if (typeof maxFreq !== \"number\" || maxFreq < 0) {\r\n throw TypeError(\r\n `maxFreq must be a number >= 0, received ${typeof maxFreq}: ${maxFreq}`\r\n );\r\n }\r\n if (!Array.isArray(channels)) {\r\n throw TypeError(\r\n `channels must be an array, received ${typeof channels}: ${channels}`\r\n );\r\n }\r\n channels.forEach((c) => {\r\n if (!isInt(c) || c < 0) {\r\n throw TypeError(\r\n `All channels must be an integer >= 0, received ${typeof c}: ${c}`\r\n );\r\n }\r\n });\r\n\r\n // Value assignments\r\n // Ensure startTime comes before endtime\r\n if (startTime < endTime) {\r\n this.startTime = startTime;\r\n this.endTime = endTime;\r\n } else if (startTime > endTime) {\r\n // Switch times\r\n this.startTime = endTime;\r\n this.endTime = startTime;\r\n } else {\r\n // startTime === endTime\r\n throw new RangeError(\"startTime and endTime must not be identical.\");\r\n }\r\n\r\n // Ensure minFreq comes before maxFreq\r\n if (minFreq < maxFreq) {\r\n this.minFreq = minFreq;\r\n this.maxFreq = maxFreq;\r\n } else if (minFreq > maxFreq) {\r\n // Switch frequencies\r\n this.minFreq = maxFreq;\r\n this.maxFreq = minFreq;\r\n } else {\r\n // minFreq === maxFreq\r\n throw new RangeError(\"minFreq and maxFreq must not be identical.\");\r\n }\r\n\r\n this.channels = channels;\r\n }\r\n\r\n /**\r\n * Create a new AudioRoi from an object without needing to define all parameters individually.\r\n * Accepts camelCase and PascalCase properties, with camelCase being the default.\r\n * Additional properties will be ignored,\r\n * missing properties will use defaults or throw error per AudioRoi constructor.\r\n * @param {object} obj An object containing all necessary properties of a AudioRoi.\r\n * @returns {AudioRoi} A new AudioRoi.\r\n */\r\n static fromObject = (obj) => {\r\n return new AudioRoi(\r\n obj.id ?? obj.Id,\r\n obj.fileId ?? obj.FileId,\r\n obj.structure ?? obj.Structure,\r\n obj.isAiAnnotated ?? obj.IsAiAnnotated,\r\n obj.user ?? obj.User,\r\n obj.modificationStatus ?? obj.ModificationStatus,\r\n obj.startTime ?? obj.StartTime,\r\n obj.endTime ?? obj.EndTime,\r\n obj.minFreq ?? obj.MinFreq,\r\n obj.maxFreq ?? obj.MaxFreq,\r\n obj.channels ?? obj.Channels\r\n );\r\n };\r\n}\r\n\r\n//#endregion\r\n","import { authenticationService } from \"../services\";\r\n\r\nimport { HubConnectionBuilder, LogLevel } from \"@aspnet/signalr\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { io } from \"socket.io-client\";\r\nimport {\r\n convertDateToDayString,\r\n convertDateToShortIsoString,\r\n} from \"../../common/utils/Localization\";\r\nimport {\r\n ModificationStatus,\r\n RoiType,\r\n ImageRoi,\r\n AudioRoi,\r\n} from \"../components/RoiTypes\";\r\nimport Structure from \"../components/Structure\";\r\n\r\nconst DEFAULT_PORT = 8051;\r\nconst SERVER_URL = `http://127.0.0.1:${DEFAULT_PORT}`;\r\n\r\nlet jobProgressConnection = new HubConnectionBuilder()\r\n .withUrl(\"/jobprogress\")\r\n .configureLogging(LogLevel.Warning)\r\n .build();\r\njobProgressConnection.serverTimeoutInMilliseconds = 5_000 * 1_000; // 50000 second\r\njobProgressConnection.keepAliveIntervalInMilliseconds = 5_000 * 1_000; // 50000 second\r\n\r\n/**\r\n * injects authorization header into the fetch() function\r\n * @param {String} url backend endpoint\r\n * @param {Object} config additional stuff https://developer.mozilla.org/de/docs/Web/API/Fetch_API/Using_Fetch\r\n * @returns {Promise} result of fetch function\r\n */\r\nfunction fetch_auth(url, config = {}) {\r\n // return authorization header with jwt token\r\n const currentUser = authenticationService.currentUserValue;\r\n if (currentUser && currentUser.token) {\r\n if (!config.headers) config.headers = {};\r\n\r\n // place bearer token\r\n config.headers.Authorization = `Bearer ${currentUser.token}`;\r\n }\r\n return fetch(url, config);\r\n}\r\n\r\nfunction validateResponse(response, permissionString) {\r\n if (response.status === 403) {\r\n window.showErrorSnackbar(\r\n \"Current user has no permission to \" + permissionString + \"!\"\r\n );\r\n return { success: false, status: response.status };\r\n } else {\r\n return response.json();\r\n }\r\n}\r\n\r\nfunction validateResponseJSON(json, callback) {\r\n if (json.success === false && json.message !== \"\") {\r\n window.showErrorSnackbar(json.message);\r\n }\r\n callback(json);\r\n}\r\n\r\nfunction showHandledProblems(response, errorMessage) {\r\n if (response.permissionDenied === true) {\r\n window.showErrorSnackbar(errorMessage);\r\n }\r\n if (typeof response.errorMessage === \"string\" && window.openErrorDialog) {\r\n window.openErrorDialog(response.errorMessage);\r\n }\r\n return response;\r\n}\r\n\r\nfunction customErrorPrint(errorName, error) {\r\n if (error === \"SyntaxError: Unexpected token < in JSON at position 0\") {\r\n console.log(\"Backend could not be connected!\");\r\n } else {\r\n console.log(\"Backend Error in\", errorName, error);\r\n }\r\n}\r\n\r\n/**\r\n * Default handeling on a successfully parsed json response that returns an \"error\" key to report errors.\r\n * @param {JSON} res Parsed json object from response.\r\n * @param {Function} callback The function to call to handle a successful request.\r\n * @param {Function} error Optional. The function to call on any error.\r\n */\r\nfunction handleJsonResponse(res, callback, error = () => {}) {\r\n if (res.error) {\r\n console.error(error);\r\n error(res.error);\r\n } else {\r\n callback(res);\r\n }\r\n}\r\n\r\nexport default class Backend {\r\n static createUser(user, callback) {\r\n fetch_auth(`/api/admin/createuser`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(user),\r\n })\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n static deleteUser(id, callback) {\r\n fetch_auth(`/api/admin/deleteuser`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(id),\r\n })\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n static updateUser(user, callback) {\r\n fetch_auth(`/api/admin/updateuser`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(user),\r\n })\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n static loadUserList(callback) {\r\n fetch_auth(`/api/admin/userlist`)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n static loadGroupList(callback) {\r\n fetch_auth(`/api/admin/grouplist`)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n static createGroup(group, callback) {\r\n fetch_auth(`/api/admin/createGroup`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(group),\r\n })\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n static updateGroup(group, callback) {\r\n fetch_auth(`/api/admin/updateGroup`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(group),\r\n })\r\n .then((response) => validateResponse(response, \"edit groups\"))\r\n .then(callback);\r\n }\r\n static updateUserGroups(userId, userGroups, callback) {\r\n fetch_auth(`/api/admin/updateUserGroups?id=` + userId, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(userGroups),\r\n })\r\n .then((response) => validateResponse(response, \"edit groups\"))\r\n .then((json) => validateResponseJSON(json, callback));\r\n }\r\n static deleteGroup(id, callback) {\r\n fetch_auth(`/api/admin/deleteGroup`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(id),\r\n })\r\n .then((response) => validateResponse(response, \"edit groups\"))\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * load list of groups of given user\r\n * @param {Function} callback Success callback\r\n */\r\n static getUserGroups(id, callback) {\r\n fetch_auth(`/api/project/getUserGroups?id=` + id)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * load list of groups of logged in user\r\n * @param {Function} callback Success callback\r\n */\r\n static getCurrentUserGroups(callback) {\r\n fetch_auth(`/api/project/getCurrentUserGroups`)\r\n .then((response) => {\r\n if (response.status === 204 || response.status === 401) {\r\n authenticationService.logout();\r\n window.location.reload(true); //clear cache\r\n }\r\n return response.json();\r\n })\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * loads version and release notes\r\n * @param {Function} callback Success callback\r\n */\r\n static getAbout(callback) {\r\n fetch_auth(`/api/about/about`)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * loads version code\r\n * @param {Function} callback Success callback\r\n */\r\n static getVersion(callback) {\r\n fetch_auth(`/api/about/version`)\r\n .then((response) => response.json())\r\n .then(callback)\r\n .catch((error) => customErrorPrint(\"getVersion\", error));\r\n }\r\n\r\n /**\r\n * loads system configuration from appsettings.json\r\n * @param {Function} callback Success callback with ome data model\r\n */\r\n static readAppSettings() {\r\n return fetch_auth(`/api/admin/appsettings`)\r\n .then((response) => response.json())\r\n .catch((error) => console.log(error));\r\n }\r\n\r\n /**\r\n * writes system configuration from appsettings.json\r\n * @param {Object} appsettings Appsettings Dictionary\r\n * @param {Function} callback Success callback with ome data model\r\n */\r\n static writeAppSettings(appsettings, callback) {\r\n fetch_auth(`/api/admin/appsettings`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(appsettings),\r\n })\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * checks, the changes for the case settings to show in frontend in dialog\r\n * @param {Object} appsettings Appsettings Dictionary\r\n * @param {Function} callback Success callback with ome data model\r\n */\r\n static getPossibleCaseSettingsChanges(appsettings, callback) {\r\n fetch_auth(`/api/admin/check_update_case_settings`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(appsettings),\r\n })\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * loads system configuration from appsettings.json\r\n * @param {Function} callback Success callback with ome data model\r\n */\r\n static readAppSettingsLicensing(callback) {\r\n fetch_auth(`/api/about/appsettingslicensing`)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * writes system configuration from appsettings.json\r\n * @param {Object} appsettings Appsettings Dictionary\r\n * @param {Function} callback Success callback with ome data model\r\n */\r\n static writeAppSettingsLicensing(appsettings, callback) {\r\n fetch_auth(`/api/about/appsettingslicensing`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(appsettings),\r\n })\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * loads system configuration from appsettings.json\r\n * @param {Function} callback Success callback with ome data model\r\n */\r\n static readImporterSettings(callback) {\r\n fetch_auth(`/api/admin/importsettings`)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * writes system configuration from appsettings.json\r\n * @param {Object} appsettings Appsettings Dictionary\r\n * @param {Function} callback Success callback with ome data model\r\n */\r\n static writeImporterSettings(appsettings, callback) {\r\n fetch_auth(`/api/admin/importsettings`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(appsettings),\r\n })\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * Deletes {../TEMP/files}-folder.\r\n * @param {Function} callback function after the deletion is done\r\n */\r\n static deleteTempFiles(callback) {\r\n fetch_auth(`/api/admin/delete_temp_files`)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * Runs a instant analysis tool with real time updates using signalR\r\n * @param {Object} data Instant analysis configuration\r\n * @param {Function} callback Success callback\r\n * @param {Function} errorCallback Error callback\r\n * @param {Function} progressCallback Progress callback\r\n */\r\n static loadImage(params, callback, errorCallback, progressCallback) {\r\n //console.debug(JSON.stringify(data));\r\n const jobId = \"_\" + Math.random().toString(36).substr(2, 9);\r\n\r\n let connection = new HubConnectionBuilder()\r\n .withUrl(\"/jobprogress\")\r\n .configureLogging(LogLevel.Warning)\r\n .build();\r\n connection.serverTimeoutInMilliseconds = 5000000; // 5000 second\r\n connection.on(\"Progress\", (line) => {\r\n if (line) {\r\n progressCallback(line);\r\n }\r\n });\r\n connection.on(\"StandardOutput\", (line) => {\r\n // output debug prints of python module\r\n if (line) {\r\n console.debug(line);\r\n }\r\n });\r\n connection.on(\"Error\", (line) => {\r\n // output debug prints of python module\r\n if (line) {\r\n console.error(line);\r\n }\r\n });\r\n\r\n connection\r\n .start()\r\n .then(() => connection.invoke(\"AssociateJob\", jobId))\r\n .catch((err) => console.error(err.toString()));\r\n\r\n fetch_auth(`/api/rendering/load_image?id=${params.id}&jobId=${jobId}`)\r\n .then((response) => response.json())\r\n .then((res) => {\r\n res.error ? errorCallback(res.error) : callback(res);\r\n })\r\n .catch((error) => {\r\n errorCallback(error);\r\n });\r\n }\r\n\r\n /**\r\n * Request a project, before actually loading it.\r\n * Allows to check if the project is available and to inject further actions if not.\r\n * @param {uuidv4} id The id of the project to request.\r\n * @param {Function} callback The function to call to handle a successful request.\r\n * @param {Function} error Optional. The function to call on any error.\r\n */\r\n static async requestProject(id, callback, error = () => {}) {\r\n fetch_auth(`/api/project/request?id=${id}`, {\r\n method: \"GET\",\r\n })\r\n .then((response) => {\r\n if (response.ok) {\r\n return response.json();\r\n }\r\n throw new Error(`Error loading exported projects`);\r\n })\r\n .then((res) => handleJsonResponse(res, callback, error))\r\n .catch((err) => {\r\n console.error(err);\r\n error(err);\r\n });\r\n }\r\n\r\n /**\r\n * Load project meta data from backend.\r\n * @param {Object} params object containing project id {id: GUID}.\r\n * @param {Function} callback Success callback with project model object as parameter.\r\n * @param {Function} error Error handeling function\r\n */\r\n static loadProject(params, callback, error = (err) => console.error(err)) {\r\n fetch_auth(`/api/project/get?id=${params.id}`)\r\n .then((response) => {\r\n if (response.ok) {\r\n return response.json();\r\n }\r\n throw new Error(`Error loading project ${params.id}!`);\r\n })\r\n .then(callback)\r\n .catch((err) => error(err));\r\n }\r\n\r\n /**\r\n * Clean up and close database after closing a project.\r\n * @param {uuid} projectId Id of the closed project.\r\n * @param {function} callback Function to call upon success.\r\n * @param {function} error Function to call upon error.\r\n */\r\n static closeProject = (projectId, callback, error) => {\r\n fetch_auth(`/api/project/close?projectId=${projectId}`)\r\n .then((res) => {\r\n return res.json();\r\n })\r\n .then((res) =>\r\n res.error\r\n ? error(`Error closing project ${projectId}:\\n\\n ${res.error}`)\r\n : callback(res)\r\n )\r\n .catch((err) =>\r\n error(`Error parsing response, actions failed:\\n\\n ${err}`)\r\n );\r\n };\r\n\r\n /**\r\n * load file annotations data from Backend\r\n * @param {Object} params object with project id\r\n * @param {Function} callback Success callback with project model object as parameter\r\n */\r\n static async loadAnnotations(params, queryOptions) {\r\n return fetch_auth(\r\n `/api/project/get_annotations?id=${params.id}&fileId=${params.fileId}`,\r\n {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(queryOptions),\r\n }\r\n ).then(async (response) => {\r\n const r = await response.json();\r\n if (response.status === 200) return r;\r\n if (response.status === 400) {\r\n window.showErrorSnackbar(\"Access to the path is denied.\");\r\n return null;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Init Annotations DB\r\n * @param {UUID} projectId The id of the project to load annotations from.\r\n * @param {RoiType} roiType Type of rois to load.\r\n * @param {function} callback Function to execute on success.\r\n * @param {function} error Function to execute on error.\r\n */\r\n static initAnnotationsFromDB(projectId, roiType, callback, error) {\r\n const start = performance.now();\r\n if (!projectId) {\r\n throw new Error(\"Missing project id, which is required.\");\r\n }\r\n if (!Object.values(RoiType).includes(roiType)) {\r\n throw TypeError(`Invalid roiType ${roiType}.`);\r\n }\r\n // Perform the request\r\n fetch_auth(\r\n `api/project/init_annotations_db?projectId=${projectId}&roiType=${roiType}`,\r\n {\r\n method: \"GET\",\r\n }\r\n )\r\n .then((response) => {\r\n if (response.ok) {\r\n // TODO: Implement byte[] decoding\r\n return response.json();\r\n } else {\r\n return response.json();\r\n }\r\n })\r\n .then((res) => {\r\n if (res?.error) {\r\n error(`Error loading annotations:\\n${res.error}`);\r\n } else {\r\n const end = performance.now();\r\n const timeInSeconds = (end - start) / 1000;\r\n res.time = timeInSeconds;\r\n callback();\r\n }\r\n })\r\n .catch((err) =>\r\n error(`Error initializing annotations database:\\n${err}`)\r\n );\r\n }\r\n\r\n /**\r\n * Load annotations from backend database.\r\n * @param {UUID} projectId The id of the project to load annotations from.\r\n * @param {RoiType} roiType Type of rois to load.\r\n * @param {object} searchOptions Options to narrow down the rois to look for. Must consist of at minimum of fileId.\r\n * @param {function} callback Function to execute on success.\r\n * @param {function} error Function to execute on error.\r\n */\r\n static loadAnnotationsFromDB(\r\n projectId,\r\n roiType,\r\n searchOptions,\r\n callback,\r\n error\r\n ) {\r\n try {\r\n if (!projectId) {\r\n throw new Error(\"Missing project id, which is required.\");\r\n }\r\n if (!Object.values(RoiType).includes(roiType)) {\r\n throw TypeError(`Invalid roiType ${roiType}.`);\r\n }\r\n if (!searchOptions) {\r\n throw new Error(\r\n \"Missing search options, must consist at minimum of fileId.\"\r\n );\r\n }\r\n if (!searchOptions.fileId) {\r\n throw new Error(\"Missing file id, which is required.\");\r\n }\r\n } catch (err) {\r\n console.error(\r\n \"An error occured fetching the annotaions form the database:\\n\",\r\n err\r\n );\r\n error(err);\r\n return;\r\n }\r\n\r\n // Perform the request\r\n fetch_auth(\r\n `api/project/get_annotations_from_db?projectId=${projectId}&roiType=${roiType}`,\r\n {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(searchOptions),\r\n }\r\n )\r\n .then((response) => {\r\n if (response.ok) {\r\n // TODO: Implement byte[] decoding\r\n return response.json();\r\n } else {\r\n return response.json();\r\n }\r\n })\r\n .then((res) => {\r\n if (res?.error) {\r\n error(`Error loading annotations:\\n${res.error}`);\r\n } else {\r\n // Map rois to their respective types\r\n switch (roiType) {\r\n case RoiType.ImageRoi:\r\n res = res.map(\r\n (incomingRoi) => new ImageRoi.fromObject(incomingRoi)\r\n );\r\n break;\r\n\r\n case RoiType.AudioRoi:\r\n res = res.map(\r\n (incomingRoi) => new AudioRoi.fromObject(incomingRoi)\r\n );\r\n break;\r\n\r\n default:\r\n throw TypeError(`Cannot conver to invalid roiType ${roiType}.`);\r\n }\r\n callback(res);\r\n }\r\n })\r\n .catch((err) => error(`Error loading annotations:\\n${err}`));\r\n }\r\n\r\n /**\r\n * load file annotations data from Backend\r\n * @param {Object} params object with project id\r\n * @param {Function} callback Success callback with project model object as parameter\r\n */\r\n static loadAnnotationsObject(params, callback) {\r\n fetch_auth(\r\n `/api/project/get_annotations_object?id=${params.id}&fileId=${params.fileId}`\r\n )\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n static exportGallery(id, fileId, callback) {\r\n fetch_auth(`/api/project/export_gallery?id=${id}&fileId=${fileId}`, {\r\n method: \"POST\",\r\n })\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * Get all model inforamtion from both local as well as optionally from online sources.\r\n * The respose will be parsed and the models passed to callback as json.\r\n * @param {String} model_path \"hsa_models\".\r\n * @param {Bool} online Should models be donwloaded from the HSA online server. Defaults to false.\r\n * @param {Function} callback Function executed after response is received.\r\n */\r\n static getModelMetadata(model_path, online = false, callback) {\r\n fetch_auth(\r\n `/api/project/get_model_metadata?model_path=${model_path}&online=${online}`,\r\n {\r\n method: \"GET\",\r\n }\r\n )\r\n .then((response) => {\r\n if (!response.ok) {\r\n console.log(`Received status code: ${response.status}`);\r\n throw new Error(\r\n `Network response was not ok, status: ${response.status}`\r\n );\r\n }\r\n return response.json();\r\n })\r\n .then((result) => {\r\n const callbackInput = {\r\n models: JSON.parse(result.models),\r\n newModels: JSON.parse(result.new_model),\r\n };\r\n callback(callbackInput);\r\n\r\n // In case of models that could not be loaded\r\n if (result.unlistedModels !== \"[]\") {\r\n const unlistedModels = JSON.parse(result.unlistedModels);\r\n console.warn(\r\n \"Not all models are displayed, missing models are:\\n\",\r\n unlistedModels\r\n );\r\n const modelErrs = unlistedModels.map(\r\n (model) => `\\n${model.name} - ${model.version}: \\t${model.shortErr}`\r\n );\r\n window.openErrorDialog(\r\n `Not all models could be loaded, missing models are:${modelErrs}\\n\\nFor further information see console.`\r\n );\r\n }\r\n })\r\n .catch((error) => {\r\n console.error(\"There was an error!\", error);\r\n });\r\n }\r\n\r\n /**\r\n * Pre-load python modules in backend to save loading times when actually needed.\r\n */\r\n static initPythonModules() {\r\n fetch_auth(`/api/project/init_python_modules`, {\r\n method: \"POST\",\r\n });\r\n }\r\n\r\n /**\r\n * List all projects of the logged in user\r\n * @param {Function} callback Success callback with list as parameter\r\n */\r\n static listProjects(callback) {\r\n try {\r\n fetch_auth(\"/api/project/list\")\r\n .then((response) => {\r\n if (response.status === 401) {\r\n console.log(\"not authenticated => logout\");\r\n authenticationService.logout();\r\n return;\r\n }\r\n return response.json();\r\n })\r\n .then(callback)\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n } catch (ex) {\r\n console.log(\"error:\", ex);\r\n }\r\n }\r\n\r\n /**\r\n * List all cases of the logged in user\r\n * @param {Function} callback Success callback with list as parameter\r\n */\r\n static async listCases() {\r\n return fetch_auth(\"/api/cases/list\").then((response) => {\r\n if (response.status === 401) {\r\n console.log(\"not authenticated => logout\");\r\n authenticationService.logout();\r\n return;\r\n }\r\n return response.json();\r\n });\r\n }\r\n\r\n /**\r\n * Delete a specific case of the logged in user\r\n * @param {string} caseId ID of the case to delete\r\n */\r\n static async deleteCase(caseId) {\r\n return fetch_auth(`/api/cases/delete/${caseId}`, { method: \"DELETE\" }).then(\r\n (response) => {\r\n if (response.status === 401) {\r\n console.log(\"not authenticated => logout\");\r\n authenticationService.logout();\r\n return;\r\n }\r\n return response.json();\r\n }\r\n );\r\n }\r\n\r\n /*\r\n * Get message from one project\r\n * @param {String} id\r\n * @returns Promise\r\n */\r\n static loadProjectMessage(id) {\r\n return fetch_auth(`/api/project/get_message?id=${id}`).then((response) =>\r\n response.json()\r\n );\r\n }\r\n\r\n /**\r\n * Creates a new project in database based on the chosen template\r\n * @param {Object} data Project creation model\r\n * @param {Function} callback Success callback\r\n */\r\n static createProject(data, callback) {\r\n fetch_auth(`/api/project/create`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data),\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n callback(data);\r\n });\r\n }\r\n\r\n /**\r\n * Creates a new case in database\r\n *\r\n * @param {Object} data - Object with 2 arrays: caseColumns to create 1 case and files for the case files\r\n * @returns {Promise} - Resolves with responseData or rejects with error\r\n */\r\n static async createCase(data) {\r\n try {\r\n const response = await fetch_auth(\"/api/cases/create\", {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data),\r\n });\r\n const { data: responseData } = await response.json();\r\n return Promise.resolve(responseData);\r\n } catch (error) {\r\n console.error(error);\r\n return Promise.reject(error);\r\n }\r\n }\r\n\r\n /**\r\n * Updates an existing case in the database based on ID\r\n *\r\n * @param {string} id - ID of the case to update\r\n * @param {Object} data - Object with 1 array: caseColumns to update 1 case\r\n * @returns {Promise} - Resolves with responseData or rejects with error\r\n */\r\n static async editCase(id, data) {\r\n try {\r\n const response = await fetch_auth(`/api/cases/edit/${id}`, {\r\n method: \"PUT\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data),\r\n });\r\n return Promise.resolve(response);\r\n } catch (error) {\r\n console.error(error);\r\n return Promise.reject(error);\r\n }\r\n }\r\n\r\n /**\r\n * Export Projects\r\n * @param {String[]} projectIds\r\n * @param {Function} callback\r\n */\r\n static exportProjects(projectIds, exportName, callback) {\r\n fetch_auth(`/api/project/export`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(projectIds),\r\n })\r\n .then((response) => response.blob())\r\n .then((blob) => {\r\n var url = window.URL.createObjectURL(blob);\r\n var a = document.createElement(\"a\");\r\n a.href = url;\r\n a.download = exportName + \".hsa\";\r\n document.body.appendChild(a); // we need to append the element to the dom -> otherwise it will not work in firefox\r\n a.click();\r\n a.remove(); //afterwards we remove the element again\r\n callback();\r\n });\r\n }\r\n\r\n /**\r\n * Import exported projects.\r\n * @param {FormFile} file The file to import projects from.\r\n * @param {Function} callback The function to call to handle a successful request.\r\n * @param {Function} error Optional. The function to call on any error.\r\n */\r\n static importProjects(file, callback, error = () => {}) {\r\n var data = new FormData();\r\n data.append(\"file\", file);\r\n\r\n fetch_auth(`/api/project/import`, {\r\n method: \"POST\",\r\n body: data,\r\n })\r\n .then((response) => {\r\n if (response.ok) {\r\n return response.json();\r\n }\r\n throw new Error(`Error loading exported projects`);\r\n })\r\n .then((res) => handleJsonResponse(res, callback, error))\r\n .catch((err) => {\r\n console.error(err);\r\n error(err);\r\n });\r\n }\r\n\r\n /**\r\n * Checks new or edited proposed file mappings for validity in Backend.\r\n * @param {Tuple(Array, Array)} formData Tuple with list of all projects to import and list of all proposed file mappings.\r\n * @param {String} projectActionMode The action to perform on the projects. Must be a valid value of ProjectActionMode.\r\n * @param {Function} callback The function to call to handle a successful request. Receives {object} Response.\r\n * @param {Function} error Optional. The function to call on any error. Receives {string} Error.\r\n */\r\n static checkFileMappings(\r\n formData,\r\n projectActionMode,\r\n callback,\r\n error = () => {}\r\n ) {\r\n fetch_auth(`/api/project/checkFileMappings?mode=${projectActionMode}`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(formData),\r\n })\r\n .then((response) => {\r\n if (response.ok) {\r\n return response.json();\r\n }\r\n const projectCount = formData.projects.length;\r\n throw new Error(\r\n `Error importing ${projectCount} ${\r\n projectCount === 1 ? \"project\" : \"projects\"\r\n }`\r\n );\r\n })\r\n .then((res) => handleJsonResponse(res, callback, error))\r\n .catch((err) => {\r\n console.error(err);\r\n error(err.message);\r\n });\r\n }\r\n\r\n /**\r\n * Export an AI model to a .modelhsa file and triggers its download.\r\n * @param {Object} aiModel The model to export.\r\n * @param {Function} callback What to\r\n */\r\n static exportAIModel(aiModel, callback) {\r\n fetch_auth(`/api/project/export_ai_model`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(aiModel),\r\n })\r\n .then((response) => {\r\n if (response.ok) {\r\n callback(response);\r\n return response.blob();\r\n } else {\r\n callback(response);\r\n window.showErrorSnackbar(\"No permission to export models!\");\r\n return null;\r\n }\r\n })\r\n .then((blob) => {\r\n if (blob !== null) {\r\n var url = window.URL.createObjectURL(blob);\r\n var a = document.createElement(\"a\");\r\n a.href = url;\r\n a.download = JSON.parse(aiModel)[\"Name\"] + \".modelhsa\";\r\n document.body.appendChild(a); // we need to append the element to the dom -> otherwise it will not work in firefox\r\n a.click();\r\n a.remove(); //afterwards we remove the element again\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Export an AI model dataset to a .hsa file and triggers its download.\r\n * @param {Object} aiModel The model to export.\r\n * @param {Function} callback What to\r\n */\r\n static exportAIModelDataset(aiModel, callback) {\r\n fetch_auth(`/api/project/export_ai_model_dataset`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(aiModel),\r\n })\r\n .then((response) => {\r\n if (response.ok) {\r\n callback(response);\r\n return response.blob();\r\n } else {\r\n callback(response);\r\n window.showErrorSnackbar(\"No permission to export models!\");\r\n return null;\r\n }\r\n })\r\n .then((blob) => {\r\n if (blob !== null) {\r\n var url = window.URL.createObjectURL(blob);\r\n var a = document.createElement(\"a\");\r\n a.href = url;\r\n a.download = JSON.parse(aiModel)[\"Name\"] + \"_dataset_project.hsa\";\r\n document.body.appendChild(a); // we need to append the element to the dom -> otherwise it will not work in firefox\r\n a.click();\r\n a.remove(); //afterwards we remove the element again\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Deletes selected Custom AI Model\r\n * @param {*} selectedAIModel\r\n * @param {*} callback\r\n */\r\n static deleteAIModel(aiModel, callback) {\r\n fetch_auth(`/api/ai/delete_models`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(aiModel),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * Imports Exported AI Models\r\n * @param {FormFile} file\r\n * @param {Function} callback\r\n */\r\n static importAIModels(file, callback) {\r\n var data = new FormData();\r\n data.append(\"file\", file);\r\n\r\n fetch_auth(`/api/project/import_ai_model`, {\r\n method: \"POST\",\r\n body: data,\r\n })\r\n .then((response) => response.json())\r\n .then((res) =>\r\n showHandledProblems(res, \"No permission to import models!\")\r\n )\r\n .then((res) => callback(res));\r\n }\r\n\r\n /**\r\n * Exports (starts download) multiple project modules as zip file\r\n * @param {String[]} names\r\n * @param {Function} callback\r\n */\r\n static exportProjectTypes(names, output_name, callback) {\r\n fetch_auth(`/api/project/export_project_module_types`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(names),\r\n })\r\n .then((response) => response.blob())\r\n .then((blob) => {\r\n var url = window.URL.createObjectURL(blob);\r\n var a = document.createElement(\"a\");\r\n a.href = url;\r\n a.download = output_name + \".zip\";\r\n document.body.appendChild(a); // we need to append the element to the dom -> otherwise it will not work in firefox\r\n a.click();\r\n a.remove(); //afterwards we remove the element again\r\n callback(\"success\");\r\n });\r\n }\r\n\r\n /**\r\n * Create Project Module Preview Image\r\n * @param {String} name\r\n * @param {String} projectJson\r\n * @param {Function} callback\r\n */\r\n static createProjectModuleTypeJsonFile(name, projectJson, callback) {\r\n fetch_auth(`/api/project/create_project_module_type_json?name=${name}`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(projectJson),\r\n })\r\n .then((response) => response.json())\r\n .then((res) =>\r\n showHandledProblems(res, \"No permission to create project modules!\")\r\n )\r\n .then((res) => callback(res));\r\n }\r\n\r\n /**\r\n * Create Project Module Preview Image\r\n * @param {String} name\r\n * @param {FormFile} img\r\n * @param {Function} callback\r\n */\r\n static createProjectModuleTypeImage(name, img, callback) {\r\n console.log(\"createProjectModuleTypeImage()\");\r\n let data = new FormData();\r\n data.append(\"file\", img);\r\n\r\n fetch_auth(`/api/project/create_project_module_type_image?name=${name}`, {\r\n method: \"POST\",\r\n body: data,\r\n })\r\n .then((response) => response.json())\r\n .then((res) =>\r\n showHandledProblems(res, \"No permission to create project modules!\")\r\n )\r\n .then((res) => callback(res));\r\n }\r\n\r\n /**\r\n * Save screenshot in slides sub folder\r\n * @param {String} name\r\n * @param {FormFile} img\r\n * @param {Function} callback\r\n */\r\n static saveScreenshot(folderPath, fileName, img, callback) {\r\n let data = new FormData();\r\n data.append(\"file\", img);\r\n fetch_auth(\r\n `/api/project/save_screenshot?fileName=${fileName}&folderPath=${folderPath}`,\r\n {\r\n method: \"POST\",\r\n body: data,\r\n }\r\n )\r\n .then((response) => response.json())\r\n .then((res) => callback(res));\r\n }\r\n\r\n /**\r\n * Delete Project Module Preview Image and json file\r\n * @param {String} name\r\n * @param {Function} callback\r\n */\r\n static deleteProjectModuleType(name, callback) {\r\n fetch_auth(`/api/project/delete_project_module_type?name=${name}`, {\r\n method: \"POST\",\r\n })\r\n .then((response) => response.json())\r\n .then((res) => callback(res));\r\n }\r\n\r\n /**\r\n * Imports Exported Project Types\r\n * @param {FormFile} fileMappings\r\n * @param {Function} callback\r\n * @param {Function} errorCallback\r\n */\r\n static importProjectTypes(fileMappings, callback, errorCallback) {\r\n var data = new FormData();\r\n data.append(\"file\", fileMappings);\r\n fetch_auth(`/api/project/import_project_types`, {\r\n method: \"POST\",\r\n body: data,\r\n })\r\n .then((response) => response.json())\r\n .then((res) => (res.error ? errorCallback(res.error) : callback(res)))\r\n .catch((error) => errorCallback(error));\r\n }\r\n\r\n /**\r\n * Deletes multiple Projects\r\n * @param {String[]} projectIds\r\n * @param {Function} callback\r\n */\r\n static deleteProjects(projectIds, callback) {\r\n fetch_auth(`/api/project/delete`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(projectIds),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * Deletes Gallery Export of Projects\r\n * @param {String[]} projectNames\r\n * @param {Function} callback\r\n */\r\n static deleteGalleryExport(projectNames, callback) {\r\n fetch_auth(`/api/project/deleteGallery`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(projectNames),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * Duplicate multiple Projects\r\n * @param {String[]} projectIds\r\n * @param {Function} callback\r\n */\r\n static duplicateProjects(projectIds, callback) {\r\n fetch_auth(`/api/project/duplicate`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(projectIds),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * Merges multiple Projects and creates new Project\r\n * @param {String[]} projectIds\r\n * @param {Function} callback\r\n */\r\n static mergeProjects(projectIds, callback) {\r\n fetch_auth(`/api/project/merge`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(projectIds),\r\n })\r\n .then((response) => {\r\n return response.json();\r\n })\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * Rename Project\r\n * @param {String} projectId\r\n * @param {String} name\r\n * @param {Function} callback\r\n */\r\n static renameProject(projectId, name, callback) {\r\n let params = [projectId, name];\r\n fetch_auth(`/api/project/rename`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(params),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * Update Project Files\r\n * @param {String} projectId\r\n * @param {Object} model\r\n * @param {Function} callback\r\n */\r\n static updateProjectFiles(projectId, model, callback) {\r\n fetch_auth(`/api/project/update_files?id=${projectId}`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(model),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * Sets multiple Projects to pending\r\n * @param {String[]} projectIds\r\n * @param {Function} callback\r\n */\r\n static setProjectsPending(projectIds, callback) {\r\n fetch_auth(`/api/project/pending`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(projectIds),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * Sets multiple Projects to timed\r\n * @param {String[]} projectIds\r\n * @param {Function} callback\r\n */\r\n static setProjectsTimed(projectIds, callback) {\r\n fetch_auth(`/api/project/timed`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(projectIds),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * saves project data into a json file\r\n * @param {Object} data project model\r\n * @param {Function} callback\r\n */\r\n static saveProject(data, callback) {\r\n fetch_auth(`/api/project/saveProject`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data),\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n callback(data);\r\n });\r\n }\r\n\r\n /**\r\n * saves annotations into json files\r\n * @param {String} projectId\r\n * @param {Object} data project model\r\n * @param {Function} callback\r\n */\r\n static saveAnnotations(projectId, fileId, data, callback) {\r\n // https://stackoverflow.com/questions/50918007/accepting-byte-in-a-net-core-webapi-controller\r\n // data = new Blob([data.buffer]);\r\n fetch_auth(\r\n `/api/project/saveAnnotations?projectId=${projectId}&fileId=${fileId}`,\r\n {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/octet-stream\" },\r\n body: data,\r\n }\r\n )\r\n .then((response) => response.json())\r\n .then((data) => {\r\n callback(data);\r\n })\r\n .catch((error) => console.log(\"error\", error));\r\n }\r\n\r\n /**\r\n * sends image to ftp server to simulate stream\r\n *\r\n */\r\n static streamRenderer(data, remoteUuid, callback) {\r\n fetch_auth(`/api/project/streamRenderer?remoteUuid=${remoteUuid}`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/octet-stream\" },\r\n body: data,\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n callback(data);\r\n })\r\n .catch((error) => console.log(\"error\", error));\r\n }\r\n\r\n /**\r\n * Load the structures of a project from backend.\r\n * @param {uuid} projectId Id of the project to load the structures for.\r\n * @param {function} callback Callback function to execute on success.\r\n * @param {function} error Callback function to execute on error.\r\n */\r\n static loadStructures(projectId, callback, error) {\r\n fetch_auth(`/api/project/load_structures?projectId=${projectId}`, {\r\n method: \"GET\",\r\n })\r\n .then((res) => {\r\n return res.ok\r\n ? res.json()\r\n : { error: `Failed to load structures for project ${projectId}` };\r\n })\r\n .then((res) => {\r\n if (res.error) {\r\n error(res.error);\r\n } else {\r\n // Cast to structure class\r\n res = res.map((s) => Structure.fromObject(s));\r\n callback(res);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Save structures of a project to its database.\r\n * @param {uuid} projectId Id of project to save annotations for.\r\n * @param {array} structures Structures to save as list.\r\n * @param {function} callback Function executed on success.\r\n * @param {function} error Error callback function.\r\n */\r\n static saveStructures(projectId, structures, callback, error) {\r\n fetch_auth(`/api/project/save_structures?projectId=${projectId}`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(structures),\r\n })\r\n .then((res) => (res.ok ? null : res.json()))\r\n .then((data) => {\r\n if (data?.error) error(data.error);\r\n else callback();\r\n })\r\n .catch((err) => error(err));\r\n }\r\n\r\n /**\r\n * Save rois of a project to the projects annotation database.\r\n * @param {UUID} projectId Id of project to save annotations for.\r\n * @param {RoiType} roiType Type of rois to be saved.\r\n * @param {array} rois List of all rois to be saved.\r\n * @param {function} callback Function to execute on success.\r\n * @param {function} error Function to execute on error.\r\n */\r\n static saveAnnotationsToDb(projectId, roiType, rois, callback, error) {\r\n // Check for missing input\r\n if (!projectId || !roiType || !rois) return;\r\n\r\n // Reduce rois to those modified\r\n rois = rois.filter(\r\n (roi) => roi.modificationStatus !== ModificationStatus.Saved\r\n );\r\n\r\n // No rois to save\r\n if (rois.length === 0) {\r\n callback({\r\n success: \"All rois already saved\",\r\n roiUpdate: {\r\n reassignedIds: [],\r\n failedToAdd: [],\r\n failedToDelete: [],\r\n },\r\n });\r\n return;\r\n }\r\n\r\n // Identify new rois\r\n let roisToAdd = rois.filter(\r\n (roi) => roi.modificationStatus === ModificationStatus.Added\r\n );\r\n\r\n // Identify deleted rois, keep only ids\r\n let roiIdsToDelete = rois\r\n .filter((roi) => roi.modificationStatus === ModificationStatus.Deleted)\r\n .map((roi) => roi.id);\r\n\r\n let data = new Blob([JSON.stringify({ roisToAdd, roiIdsToDelete })]);\r\n\r\n fetch_auth(\r\n `/api/project/save_annotations_to_db?projectId=${projectId}&roiType=${roiType}`,\r\n {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/octet-stream\" },\r\n body: data,\r\n }\r\n )\r\n .then((res) => res.json())\r\n .then((data) => {\r\n data.error || data.warning ? error(data) : callback(data);\r\n })\r\n .catch((err) => error({ error: err.toString() }));\r\n }\r\n\r\n /**\r\n * saves project data into a json file\r\n * @param {Object} data project model\r\n * @param {Function} callback\r\n */\r\n static saveGallery() {}\r\n\r\n /**\r\n * load project type viewer configuration\r\n * @param {String} projectType name of project type\r\n * @param {Function} callback\r\n */\r\n static loadViewerConfig(projectType, callback) {\r\n fetch_auth(\r\n `/api/project/load_viewer_config?name=${encodeURIComponent(projectType)}`\r\n )\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * load all available project types\r\n * only load once, otherwise weit for a variable to be filled before returning result\r\n * @param {Function} callback contains list of all project types\r\n */\r\n static loadAvailableProjectTypes(callback) {\r\n //let t0 = performance.now();\r\n if (typeof window.availabeProjectTypes === \"undefined\") {\r\n window.availabeProjectTypes = \"blocked\";\r\n fetch_auth(\"/api/project/get_project_types\")\r\n .then((response) => response.json())\r\n .then((data) => {\r\n //console.log(\"loadAPTs time:\", performance.now() - t0);\r\n window.availabeProjectTypes = data;\r\n callback(data);\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n } else {\r\n const waitForElement = () => {\r\n if (window.availabeProjectTypes !== \"blocked\") {\r\n //console.log(\"loadAPTs time:\", performance.now() - t0);\r\n callback(window.availabeProjectTypes);\r\n } else {\r\n setTimeout(waitForElement, 200);\r\n }\r\n };\r\n waitForElement();\r\n }\r\n }\r\n\r\n /**\r\n * load all available project types, but only return reduced information, to be faster\r\n * also save and load from local storage\r\n * @param {Function} callback contains list of all project types\r\n */\r\n static loadReducedAvailableProjectTypes(callback) {\r\n //let t0 = performance.now();\r\n Backend.getVersion((data) => {\r\n const ptKey = \"projectTypes_\" + data.version;\r\n let projectTypes = JSON.parse(localStorage.getItem(ptKey));\r\n if (projectTypes === null) {\r\n Backend.loadAvailableProjectTypes((data) => {\r\n projectTypes = data.map((item) => {\r\n return {\r\n annotations: item.annotations,\r\n description: item.description,\r\n isUserModule: item.isUserModule,\r\n name: item.name,\r\n order: item.order,\r\n label: item.label,\r\n };\r\n });\r\n localStorage.setItem(ptKey, JSON.stringify(projectTypes));\r\n //console.log(\"loadRAPTs time:\", performance.now() - t0);\r\n callback(projectTypes);\r\n });\r\n } else {\r\n //console.log(\"loadRAPTs time:\", performance.now() - t0);\r\n callback(projectTypes);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * load all available project types\r\n * @param {String} dir directory to list files within\r\n * @param {Function} callback contains list of all project types\r\n */\r\n static walkDir(dir, isRelative, callback) {\r\n fetch_auth(\r\n `/api/project/walk_dir?path=${encodeURIComponent(\r\n dir\r\n )}&isRelative=${isRelative}`\r\n )\r\n .then((response) => response.json())\r\n .then(callback)\r\n .catch((error) => {\r\n console.log(\"error\", error);\r\n window.showErrorSnackbar(\"Error loading directory!\");\r\n });\r\n }\r\n\r\n /**\r\n * load all available project types\r\n * @param {String} dir directory to list files within\r\n * @param {Function} callback contains list of all project types\r\n */\r\n static walkProjectDirFiles(dir, callback) {\r\n fetch_auth(\r\n `/api/project/walk_project_dir_files?path=${encodeURIComponent(dir)}`\r\n )\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * Cancel Job\r\n * @param {String} id\r\n */\r\n static cancelJob(id) {\r\n fetch_auth(`/api/project/cancel`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(id),\r\n }).then((response) => response.json());\r\n }\r\n\r\n /**\r\n * Check if String has JSON-Format\r\n * @param {String} str\r\n */\r\n static isJsonString(str) {\r\n try {\r\n // for (var i = 0; i < str.length; i++) {\r\n\r\n // }\r\n JSON.parse(str);\r\n } catch (e) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Runs a instant analysis tool with real time updates using signalR\r\n * @param {Object} data Instant analysis configuration\r\n * @param {Function} callback Success callback\r\n * @param {Function} error Error callback\r\n */\r\n static instantAnalysisSignalR(data, spinloader, callback, error) {\r\n //console.log(\"data:\", data);\r\n\r\n // connection.on(\"Progress\", (line) => {\r\n // // output debug prints of python module\r\n // //console.debug(line);\r\n // });\r\n jobProgressConnection.off(\"StandardOutput\");\r\n jobProgressConnection.on(\"StandardOutput\", (line) => {\r\n // output debug prints of python module\r\n\r\n // output warning\r\n if (line) {\r\n if (this.isJsonString(line)) {\r\n const jsonLine = JSON.parse(line);\r\n for (var k in jsonLine) {\r\n switch (k) {\r\n case \"warning\":\r\n window.showWarningSnackbar(jsonLine[\"warning\"]);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n } else {\r\n window.trainingProgress(line);\r\n }\r\n if (line.includes(\"[DownloadProgress]\")) {\r\n let progress = line.replace(\"[DownloadProgress]\", \"\");\r\n spinloader.showWithProgress({\r\n message: \"Download Model\",\r\n progress: parseInt(progress, 10),\r\n });\r\n } else if (line.includes(\"[IAMProgress]\")) {\r\n let progress = line.replace(\"[IAMProgress]\", \"\");\r\n spinloader.showWithProgress({\r\n message: \"Progress\",\r\n progress: parseInt(progress, 10),\r\n });\r\n } else if (!line.includes(\"[MESSAGE]\")) {\r\n console.debug(line);\r\n spinloader.show();\r\n }\r\n }\r\n });\r\n jobProgressConnection.off(\"Result\");\r\n jobProgressConnection.on(\"Result\", (json) => {\r\n if (json.error) {\r\n console.log(\"iam result error:\", json.error);\r\n // there was an exception in python module\r\n error(json.error);\r\n } else {\r\n // success\r\n json.project.files.forEach((file) => {\r\n file.annotations.forEach((annotation) => {\r\n annotation.geoJSON = JSON.parse(annotation.serializedGeoJSON);\r\n annotation.serializedGeoJSON = null;\r\n });\r\n });\r\n callback(json.project);\r\n }\r\n });\r\n\r\n fetch_auth(`/api/analysis/iam`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data),\r\n })\r\n .then((response) => response.json())\r\n .then((myJson) => {\r\n if (jobProgressConnection.state === 0) {\r\n // 0 = disconnected\r\n jobProgressConnection\r\n .start()\r\n .then(() =>\r\n jobProgressConnection.invoke(\"AssociateJob\", myJson.jobId)\r\n )\r\n .catch((err) => console.error(err.toString()));\r\n } else {\r\n jobProgressConnection\r\n .invoke(\"AssociateJob\", myJson.jobId)\r\n .catch((err) => console.error(err.toString()));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Runs a instant analysis tool\r\n * @param {Object} data Instant analysis configuration\r\n * @param {Function} callback Success callback\r\n * @param {Function} error Error callback\r\n */\r\n static instantAnalysis(data, callback, error) {\r\n fetch_auth(`/api/analysis/iam`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n console.log(json.stdout);\r\n if (json.error) {\r\n error(json.error);\r\n } else {\r\n // success\r\n callback(json.project);\r\n }\r\n });\r\n }\r\n /**\r\n * Runs a instant analysis tool with real time updates using signalR\r\n * @param {Object} data Instant analysis configuration\r\n * @param {Function} callback Success callback\r\n * @param {Function} error Error callback\r\n */\r\n static activeLearningSignalR(data, callback, error) {\r\n //console.debug(JSON.stringify(data));\r\n\r\n let connection = new HubConnectionBuilder()\r\n .withUrl(\"/jobprogress\")\r\n .configureLogging(LogLevel.Warning)\r\n .build();\r\n connection.serverTimeoutInMilliseconds = 5000000; // 5000 second\r\n // connection.on(\"Progress\", (line) => {\r\n // // output debug prints of python module\r\n // //console.debug(line);\r\n // });\r\n connection.on(\"StandardOutput\", (line) => {\r\n // output debug prints and warnings of python module\r\n if (line) {\r\n if (this.isJsonString(line)) {\r\n const jsonLine = JSON.parse(line);\r\n for (var k in jsonLine) {\r\n switch (k) {\r\n case \"warning\":\r\n window.showWarningSnackbar(jsonLine[\"warning\"]);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n } else {\r\n window.galleryTrainingProgress(line);\r\n }\r\n console.debug(line);\r\n }\r\n });\r\n connection.on(\"Result\", (json) => {\r\n if (json.error) {\r\n // there was an exception in python module\r\n error(json.error);\r\n } else {\r\n // success\r\n callback(json.alModel);\r\n }\r\n });\r\n\r\n fetch_auth(`/api/analysis/alm`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data),\r\n })\r\n .then((response) => response.json())\r\n .then((myJson) => {\r\n connection\r\n .start()\r\n .then(() => connection.invoke(\"AssociateJob\", myJson.jobId))\r\n .catch((err) => console.error(err.toString()));\r\n });\r\n }\r\n\r\n /**\r\n * generate path for images to render a specific region\r\n */\r\n static renderRegion(params) {\r\n return `/api/rendering/render_region?id=${params.id}&page=${params.page}&level=${params.lv}&x=${params.x}&y=${params.y}`;\r\n //return `http://localhost:${DEFAULT_PORT}/api/v1/render_region?id=${params.id}&page=${params.page}&level=${params.lv}&x=${params.x}&y=${params.y}`;\r\n }\r\n\r\n /**\r\n * generate path for thumbnail image\r\n */\r\n static renderThumbnail(id) {\r\n return `/api/rendering/render_thumbnail?id=${id}`;\r\n }\r\n\r\n /**\r\n * Get the loaction of thumbnails for a image based on its path.\r\n * @param {string} image_path Path to the image being loaded.\r\n * @returns {string} Api link to image thumbnail.\r\n */\r\n static imageThumbnail(image_path) {\r\n return `/api/project/image_thumbnail?path=${image_path}`;\r\n }\r\n\r\n /**\r\n * Get the loaction of thumbnails for a image based on its path.\r\n * @param {string} image_path Path to the image being loaded.\r\n * @returns {object} object containing uuid.\r\n */\r\n static async getFileUuid(image_path) {\r\n let obj = {};\r\n await fetch_auth(`/api/project/file_uuid?path=${image_path}`, {\r\n method: \"GET\",\r\n })\r\n .then((res) => res.json())\r\n .then((data) => {\r\n obj = data;\r\n });\r\n\r\n return obj;\r\n }\r\n\r\n /**\r\n * generate and load 3d objects\r\n * @param {Object} data Instant analysis configuration\r\n */\r\n static get3dObjects(data) {\r\n return `/api/rendering/get3dObjects?file_id=${data.fileId}&project_id=${data.projectId}&zRange=${data.zRange}&showPointCloud=${data.showPointCloud}`;\r\n }\r\n\r\n /**\r\n * check if Sony QD Job ran\r\n * @param {Object} data Instant analysis configuration\r\n */\r\n static get3DAllObjectsExists(data, callback) {\r\n fetch_auth(\r\n `/api/rendering/get3DAllObjectsExists?file_id=${data.fileId}&project_id=${data.projectId}`,\r\n {\r\n method: \"GET\",\r\n }\r\n )\r\n .then((res) => res.text())\r\n .then((data) => callback(data));\r\n }\r\n\r\n /**\r\n * check, if python server is running\r\n * @param {*} callback\r\n */\r\n static isLocalServerReady(callback) {\r\n fetch_auth(`/api/rendering/is_running`, {\r\n method: \"GET\",\r\n })\r\n .then((res) => res.text())\r\n .then((data) => callback(data.toLowerCase() === \"true\"))\r\n .catch(() => console.log(\"error is_running\"));\r\n }\r\n\r\n /**\r\n * Trigger download of file.\r\n * @param {String} id Project UUID\r\n * @param {String} exportName Name of the file to be exported. Defaults to \"report\".\r\n */\r\n static downloadReport(id, exportName = `report`) {\r\n // Add timestamp to exported file.\r\n exportName += `_${convertDateToShortIsoString(Date.now())}`;\r\n fetch_auth(`/api/project/report?id=${id}`, {\r\n method: \"GET\",\r\n })\r\n .then((response) => response.blob())\r\n .then((blob) => {\r\n var url = window.URL.createObjectURL(blob);\r\n var a = document.createElement(\"a\");\r\n a.href = url;\r\n a.download = exportName;\r\n document.body.appendChild(a); // we need to append the element to the dom -> otherwise it will not work in firefox\r\n a.click();\r\n a.remove(); //afterwards we remove the element again\r\n });\r\n }\r\n\r\n /**\r\n * Retrieve report for a specific project from backend.\r\n * @param {UUID} id Project id for which to get the report.\r\n * @param {function} callback Function processing the loaded report. Recieves a UInt8Array.\r\n * @param {function} error Fallback function on error.\r\n */\r\n static loadReport(id, callback, error) {\r\n const currentUser = authenticationService.currentUserValue;\r\n let url = `${window.location.origin}/api/project/report?id=${id}`;\r\n\r\n // Set up XHR Request\r\n let req = new XMLHttpRequest();\r\n req.open(\"GET\", url, true);\r\n req.setRequestHeader(\"Authorization\", `Bearer ${currentUser.token}`);\r\n req.responseType = \"arraybuffer\";\r\n req.onload = () => {\r\n let data = new Uint8Array(req.response);\r\n callback(data);\r\n };\r\n req.onerror = (err) => {\r\n error(err);\r\n };\r\n req.send();\r\n }\r\n\r\n /**\r\n * generate image source to report chart\r\n * @param {String} id Project ID\r\n */\r\n static renderReportChart(path) {\r\n return `/api/project/report_chart?path=${path}`;\r\n }\r\n\r\n /**\r\n * Runs a instant analysis tool with real time updates using signalR\r\n * @param {Object} data Instant analysis configuration\r\n * @param {Function} callback Success callback\r\n * @param {Function} error Error callback\r\n */\r\n static aiTrainingSignalR(\r\n data,\r\n progressCallback,\r\n successCallback,\r\n errorCallback\r\n ) {\r\n let modelType = \"none\";\r\n let isVdlModel = false;\r\n if (data.parameters && data.parameters.modelType) {\r\n modelType = data.parameters.modelType;\r\n if (modelType == \"instance segmentation\") {\r\n // check if vdl model\r\n if (data.parameters.advancedSettings.comDLArchitecture === null) {\r\n isVdlModel = true;\r\n } else if (\r\n data.parameters.advancedSettings.comDLArchitecture &&\r\n data.parameters.advancedSettings.comDLArchitecture.label ==\r\n \"Mask R-CNN VDL\"\r\n ) {\r\n isVdlModel = true;\r\n }\r\n }\r\n }\r\n\r\n jobProgressConnection.off(\"Progress\");\r\n jobProgressConnection.on(\"Progress\", (line) => {\r\n if (line) {\r\n progressCallback(line);\r\n }\r\n });\r\n jobProgressConnection.off(\"StandardOutput\");\r\n jobProgressConnection.on(\"StandardOutput\", (line) => {\r\n // output debug prints of python module\r\n if (line) {\r\n console.debug(line);\r\n if (typeof window.trainingProgress !== \"function\") return;\r\n window.trainingProgress(line);\r\n\r\n if (typeof window.updateTrainingData !== \"function\") return;\r\n window.updateTrainingData(line, modelType, isVdlModel);\r\n }\r\n });\r\n jobProgressConnection.off(\"StandardError\");\r\n jobProgressConnection.on(\"StandardError\", (line) => {\r\n // output debug prints of python module\r\n if (line) {\r\n window.trainingProgress(line);\r\n if (typeof window.updateTrainingData === \"function\") {\r\n window.updateTrainingData(line, modelType, isVdlModel);\r\n }\r\n }\r\n });\r\n jobProgressConnection.off(\"Result\");\r\n jobProgressConnection.on(\"Result\", (json) => {\r\n if (json.error) {\r\n console.log(\"training callback error:\", json);\r\n // there was an exception in python module\r\n errorCallback(json.error);\r\n } else {\r\n // success\r\n successCallback(json.project);\r\n }\r\n });\r\n\r\n fetch_auth(`/api/ai/train`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data),\r\n })\r\n .then((response) => response.json())\r\n .then((myJson) => {\r\n if (jobProgressConnection.state === 0) {\r\n jobProgressConnection\r\n .start()\r\n .then(() =>\r\n jobProgressConnection.invoke(\"AssociateJob\", myJson.jobId)\r\n )\r\n .catch((err) => console.error(err.toString()));\r\n } else {\r\n jobProgressConnection\r\n .invoke(\"AssociateJob\", myJson.jobId)\r\n .catch((err) => console.error(err.toString()));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Runs a instant analysis tool with real time updates using signalR.\r\n * New version of the previous function, Backend.aiTrainingSignalR.\r\n * @param {object} data Contains the projectId as well as the parameters for the training.\r\n */\r\n static trainModel(data) {\r\n return fetch_auth(`/api/ai/train_model`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data),\r\n }).then((response) => response.json());\r\n }\r\n\r\n /**\r\n * Get the tensorboard classification images.\r\n * @param {string} modelName Id of the closed project.\r\n * @param {int} index Function to call upon success.\r\n */\r\n static loadTensorboardConfusionMatrixImage(modelName, index) {\r\n return (\r\n SERVER_URL +\r\n `api/v1/tensorboard_results/confusion_matrix_images?modelName=${modelName}&index=${index}`\r\n );\r\n }\r\n\r\n /**\r\n * Get the tensorboard classification images.\r\n * @param {string} modelName Id of the closed project.\r\n * @param {int} index Function to call upon success.\r\n */\r\n static loadTensorboardClassificationImage(modelName, index) {\r\n return (\r\n SERVER_URL +\r\n `api/v1/tensorboard_results/classification_images?modelName=${modelName}&index=${index}`\r\n );\r\n }\r\n\r\n /**\r\n * Get the tensorboard scalars.\r\n * @param {string} modelName Id of the closed project.\r\n * @param {function} callback Function to call upon success.\r\n * @param {function} error Function to call upon error.\r\n */\r\n static loadTensorboardScalarData = (\r\n modelName = \"\",\r\n callback,\r\n error = () => {}\r\n ) => {\r\n // TBD send API Call to ASP.NET\r\n fetch_auth(`/api/ai/scalar_data?modelName=${modelName}`)\r\n .then((res) => {\r\n if (res.ok) {\r\n return res.json();\r\n } else if (!res.ok) {\r\n return {};\r\n }\r\n })\r\n .then((res) =>\r\n res.error\r\n ? error(`Error closing project ${modelName}:\\n\\n ${res.error}`)\r\n : callback(res)\r\n )\r\n .catch((err) =>\r\n error(`Error parsing response, actions failed:\\n\\n ${err}`)\r\n );\r\n };\r\n\r\n /**\r\n * Get the current training epoch from tensorboard.\r\n * @param {string} modelName Name of the model.\r\n * @param {function} callback Function to call upon success.\r\n * @param {function} error Function to call upon error.\r\n */\r\n static getTrainingEpochProgress = (\r\n modelName = \"\",\r\n callback,\r\n error = () => {}\r\n ) => {\r\n // TBD send API Call to ASP.NET\r\n fetch_auth(`/api/ai/training_epochs_progress?modelName=${modelName}`)\r\n .then((res) => {\r\n if (res.ok) {\r\n return res.json();\r\n } else if (!res.ok) {\r\n return {};\r\n }\r\n })\r\n .then((res) =>\r\n res.error\r\n ? error(\r\n `Error reading epochs progress ${modelName}:\\n\\n ${res.error}`\r\n )\r\n : callback(res)\r\n )\r\n .catch((err) =>\r\n error(`Error parsing response, actions failed:\\n\\n ${err}`)\r\n );\r\n };\r\n\r\n /**\r\n * Runs a instant analysis tool with real time updates using signalR\r\n * @param {Function} callback Success callback\r\n */\r\n static stopAITraining(callback) {\r\n fetch_auth(`/api/ai/stop_train`)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * Opens a dialog where you can select an AI model for the selected structure\r\n * @param {Function} callback\r\n */\r\n static getAIModelDialogData(callback) {\r\n fetch_auth(`/api/ai/custom_models`)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * Copies the selected AI models to {../TEMP/custom_models/verified}-folder. This folder is accessable from the AICockpit.\r\n * @param {string} verifiedAIModel selected ai model which gets copied to verified models folder\r\n * @param {Function} callback\r\n */\r\n static addCustomAIModels(verifiedAIModel, callback) {\r\n fetch_auth(`/api/ai/add_custom_models?verifiedAIModel=${verifiedAIModel}`)\r\n .then((response) => response.json())\r\n .then((res) => callback(res));\r\n }\r\n\r\n /**\r\n * Deletes selected Custom AI Model\r\n * @param {*} selectedAIModel\r\n * @param {*} callback\r\n */\r\n static deleteCustomAIModels(selectedAIModel, callback) {\r\n fetch_auth(`/api/ai/delete_custom_models`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(selectedAIModel),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * gets the sourcepath of selected verified model\r\n * @param {*} selectedAIModel\r\n * @param {*} callback\r\n */\r\n static getSelectedModelSourcepath(selectedAIModel, callback) {\r\n fetch_auth(`/api/ai/get_model_sourcepath`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(selectedAIModel),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * Get License Infos for LicensingPage\r\n * @param {function} callback Success callback\r\n */\r\n static getLicensingInfo(callback) {\r\n var requestOptions = {\r\n method: \"GET\",\r\n redirect: \"follow\",\r\n };\r\n\r\n fetch(\"/api/about/licensingInfo\", requestOptions)\r\n .then((response) => response.json())\r\n .then(callback)\r\n .catch((error) => console.log(\"error!!!!!!!!!\", error));\r\n }\r\n\r\n /**\r\n * Get Operating System\r\n * @param {Function} callback Success callback\r\n */\r\n static getOS(callback) {\r\n fetch(\"/api/about/os\")\r\n .then((response) => response.text())\r\n .then((result) => {\r\n console.log(result);\r\n callback(result);\r\n })\r\n .catch((error) => console.log(\"error\", error));\r\n }\r\n\r\n /**\r\n * Get currently logged in User\r\n * @param {Function} callback Success callback\r\n */\r\n static async getCurrentUser(callback) {\r\n try {\r\n const res = await fetch_auth(\"/api/user/current_user\");\r\n if (res.ok) {\r\n const data = await res.json();\r\n const user = data.user;\r\n user.group = data.group;\r\n if (user.group !== null) {\r\n callback(user);\r\n }\r\n } else {\r\n // Force new login on missing user\r\n authenticationService.logout();\r\n window.location.reload(true); //clear cache\r\n window.showErrorSnackbar(\r\n \"Could not authenticate user. Are you logged in?\"\r\n );\r\n return { user: { group: null, fullName: null } };\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n\r\n /**\r\n * Get user list from login-Page\r\n * @param {Function} callback Success callback\r\n */\r\n static getUserList(callback) {\r\n fetch(\"/api/login/userlist\")\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * Receives instructions on how to perform PCA in json format\r\n * Sends results in json format. Gives real time updates.\r\n * @param {JSON} graphRequestSettings Specification of the request\r\n * @param {Function} callback Success callback on json request\r\n * @param {Function} error Error callback on json request\r\n * @param {Function} progressCallback Webhook callback for progress\r\n */\r\n static requestSpectraData(\r\n graphRequestSettings,\r\n callback,\r\n error,\r\n progressCallback\r\n ) {\r\n let connection = new HubConnectionBuilder()\r\n .withUrl(\"/jobprogress\")\r\n .configureLogging(LogLevel.Warning)\r\n .build();\r\n connection.serverTimeoutInMilliseconds = 5000000; // 5000 second\r\n connection.on(\"StandardOutput\", (line) => {\r\n // output debug prints of python module\r\n if (line) {\r\n // NOTE: [MESSAGE] is kept as compatibility with independent import functions\r\n // used for Image import, background AI processes, etc.\r\n if (line.startsWith(\"[MESSAGE]\")) {\r\n // Remove [MESSAGE] and extract JSON payload\r\n progressCallback(JSON.parse(line.slice(9)));\r\n } else {\r\n console.debug(line);\r\n }\r\n }\r\n });\r\n\r\n // Add GUID for WebHook\r\n graphRequestSettings.jobId = uuidv4();\r\n connection\r\n .start()\r\n .then(() => connection.invoke(\"AssociateJob\", graphRequestSettings.jobId))\r\n .catch((err) => {\r\n console.log(\"error catch\");\r\n console.error(err.toString());\r\n });\r\n\r\n var requestOptions = {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n },\r\n body: JSON.stringify(graphRequestSettings),\r\n };\r\n\r\n fetch_auth(\"/api/analysis/pcaupdate\", requestOptions)\r\n .then((response) => response.json())\r\n .then((json) => {\r\n if (json.result.error) {\r\n // there was an exception in python module\r\n error(json.result.error);\r\n } else {\r\n // success\r\n callback(json.result);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Runs a Grid annotation tool with real time updates\r\n * @param {Object} data export Data\r\n * @param {Function} callback Success callback\r\n * @param {Function} error Error callback\r\n */\r\n static tileExport(data) {\r\n let connection = new HubConnectionBuilder()\r\n .withUrl(\"/jobprogress\")\r\n .configureLogging(LogLevel.Warning)\r\n .build();\r\n connection.serverTimeoutInMilliseconds = 5000000; // 5000 second\r\n connection.on(\"Progress\", (line) => {\r\n if (line) {\r\n console.log(\"line\", line);\r\n }\r\n });\r\n connection.on(\"StandardOutput\", (line) => {\r\n if (line) {\r\n window.tileExportProgress(line);\r\n }\r\n });\r\n connection.on(\"Result\", (json) => {\r\n if (json.error) {\r\n console.log(\"json error\");\r\n }\r\n });\r\n\r\n fetch_auth(`/api/project/tileexport`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data),\r\n })\r\n .then((response) => response.json())\r\n .then((myJson) => {\r\n connection\r\n .start()\r\n .then(() => connection.invoke(\"AssociateJob\", myJson.jobId))\r\n .catch((err) => {\r\n console.error(err.toString());\r\n console.log(\"error catch\");\r\n });\r\n });\r\n }\r\n\r\n static validateResponse(response) {\r\n if (!response.ok) {\r\n throw Error(response.statusText);\r\n }\r\n return response;\r\n }\r\n\r\n static getSocket() {\r\n const socket = io(`http://127.0.0.1:${DEFAULT_PORT}`);\r\n return socket;\r\n }\r\n\r\n static getScanSocket() {\r\n const socket = io(`http://127.0.0.1:${DEFAULT_PORT}`);\r\n return socket;\r\n }\r\n\r\n /**\r\n * connect to backend via Websocket and returns it for communication\r\n * @param {string} projectId uuid of the project\r\n */\r\n static getAnnotationSocket(projectId) {\r\n return new WebSocket(\r\n `ws://127.0.0.1:${DEFAULT_PORT}/api/anno/connect?projectId=${projectId}`\r\n );\r\n }\r\n\r\n /**\r\n * gets metadata from .hsasld file\r\n */\r\n static getFileMetadata(path, callback) {\r\n fetch(SERVER_URL + \"/api/scan/get_hsasld_meta?path=\" + path)\r\n .then((response) => {\r\n return response.json();\r\n })\r\n .then((myJson) => callback(myJson));\r\n }\r\n\r\n /**\r\n * get user actions from database\r\n * @param {func} callback returns list of all user actions\r\n */\r\n static getUserActions(date, callback) {\r\n const dateFormated = date.toISOString();\r\n fetch_auth(`/api/user/get_user_actions?date=${dateFormated}`)\r\n .then((response) => {\r\n return response.json();\r\n })\r\n .then(callback);\r\n }\r\n\r\n /**\r\n *\r\n * @param {DateTime} date\r\n */\r\n static downloadUserActions(date) {\r\n const dateFormated = date.toISOString();\r\n const dateDay = convertDateToDayString(date);\r\n fetch_auth(`/api/user/download_user_actions?date=${dateFormated}`)\r\n .then((response) => {\r\n if (response.ok) {\r\n return response.blob();\r\n } else {\r\n window.showErrorSnackbar(\"Download Failed!\");\r\n return null;\r\n }\r\n })\r\n .then((blob) => {\r\n if (blob !== null) {\r\n var url = window.URL.createObjectURL(blob);\r\n var a = document.createElement(\"a\");\r\n a.href = url;\r\n a.download = dateDay + \"_userActions.csv\";\r\n document.body.appendChild(a); // we need to append the element to the dom -> otherwise it will not work in firefox\r\n a.click();\r\n a.remove(); //afterwards we remove the element again\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Load a specific audio file to frontend.\r\n * @param {string} id UUID of the file to be loaded.\r\n * @param {function} callback Function handeling the successful response.\r\n * @param {fucntion} error Function handeling a potential error message.\r\n */\r\n static loadAudioFile(id, callback, error) {\r\n fetch_auth(`/api/audio/load_audio_file?id=${id}`)\r\n .then((res) => {\r\n if (res.ok) {\r\n return res.blob();\r\n } else {\r\n try {\r\n return res.json();\r\n } catch {\r\n return { error: `Could not load file ${id}` };\r\n }\r\n }\r\n })\r\n .then((res) => {\r\n res.error\r\n ? error(`Failed to load file ${id}:\\n\\n${res.error}`)\r\n : callback(window.URL.createObjectURL(res));\r\n })\r\n .catch((err) => error(err));\r\n }\r\n\r\n /**\r\n * sends imageData and points to backend to get a poygon using SAM\r\n *\r\n * @param {object} samData - p1, p2 and points for foreground and background with form {x: x, y: y, isForeground: boolean}\r\n **/\r\n static useSAM(data) {\r\n return fetch_auth(\"/api/ai/use_sam\", {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data),\r\n })\r\n .then((response) => response.json())\r\n .catch((error) => console.error(\"caught error:\", error));\r\n }\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\nimport Typography from \"@mui/material/Typography\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport Backend from \"../common/utils/Backend\";\r\nimport {\r\n Tabs,\r\n Tab,\r\n Paper,\r\n Container,\r\n CssBaseline,\r\n Table,\r\n TableBody,\r\n TableRow,\r\n TableCell,\r\n Grid,\r\n} from \"@mui/material\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n width: \"100%\",\r\n height: \"calc(100vh - 64px - 48px)\",\r\n overflow: \"hidden\",\r\n },\r\n paper: {\r\n marginTop: theme.spacing(8),\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n },\r\n link: {\r\n display: \"inline-block\",\r\n margin: 5,\r\n },\r\n});\r\n\r\nconst LogFilesTabComp = (props) => {\r\n const { logFiles, logFilesPython, classes } = props;\r\n\r\n return (\r\n
\r\n \r\n \r\n Analysis Log Files:\r\n {logFilesPython.map((c) => (\r\n \r\n {c}\r\n \r\n ))}\r\n \r\n \r\n Core Log Files:\r\n {logFiles.map((c) => (\r\n \r\n {c}\r\n \r\n ))}\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nLogFilesTabComp.propTypes = {\r\n classes: PropTypes.object,\r\n logFiles: PropTypes.array,\r\n logFilesPython: PropTypes.array,\r\n};\r\n\r\nconst LogFilesTab = withStyles(styles)(LogFilesTabComp);\r\n\r\nconst AboutTab = (props) => {\r\n const { version } = props;\r\n\r\n return (\r\n
\r\n Version:\r\n
\r\n

\r\n Copyright © {new Date().getFullYear()} HS Analysis GmbH - All\r\n Rights Reserved\r\n

\r\n

HSA Kit Version {version} (64-bit)

\r\n

\r\n \r\n https://www.hs-analysis.com\r\n \r\n

\r\n

\r\n support@hs-analysis.com\r\n

\r\n

This software is for research only.

\r\n {/* hidden, because not working anymore, needs to be fixed */}\r\n {/* \r\n Intranet URL ({localhostMode ? \"enabled\" : \"disabled\"}):\r\n \r\n {localhostMode && (\r\n

\r\n {intranetUrl}\r\n

\r\n )} */}\r\n
\r\n );\r\n};\r\n\r\nAboutTab.propTypes = {\r\n version: PropTypes.string,\r\n intranetUrl: PropTypes.string,\r\n localhostMode: PropTypes.bool,\r\n};\r\n\r\nconst HelpTab = (props) => {\r\n const { workflows } = props;\r\n\r\n return (\r\n
\r\n Handbook:\r\n
\r\n

\r\n \r\n Handbook.pdf\r\n \r\n

\r\n Workflows:\r\n
\r\n {workflows.map((c) => (\r\n

\r\n \r\n {c}\r\n \r\n

\r\n ))}\r\n
\r\n Help:\r\n
\r\n

\r\n support@hs-analysis.com\r\n

\r\n
\r\n );\r\n};\r\n\r\nHelpTab.propTypes = {\r\n workflows: PropTypes.array,\r\n};\r\n\r\nfunction ReleaseNotesTab(props) {\r\n const releaseNotes = props.releaseNotes;\r\n\r\n return (\r\n
\r\n ReleaseNotes:\r\n
\r\n \r\n \r\n {releaseNotes.map((c) => (\r\n \r\n {c.version}\r\n \r\n
    \r\n {c.notes.map((note) => (\r\n
  • {note}
  • \r\n ))}\r\n
\r\n
\r\n
\r\n ))}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nReleaseNotesTab.propTypes = {\r\n releaseNotes: PropTypes.array,\r\n};\r\n\r\nclass AboutPage extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n releaseNotes: \"[]\",\r\n version: \"1.0.0\",\r\n activeTab: 0,\r\n buildDate: null,\r\n canAccessLogFiles: false,\r\n filteredWorkflows: [],\r\n };\r\n this.scrollRef = React.createRef();\r\n Backend.getAbout((result) => {\r\n this.setState(result);\r\n this.setProjectTypeWorkflows(result);\r\n });\r\n\r\n Backend.getAbout((result) => {\r\n console.log(\"about result:\", result);\r\n this.setState(result);\r\n });\r\n\r\n Backend.getCurrentUser((user) => {\r\n this.setState({\r\n canAccessLogFiles: user.group.canAccessLogFiles,\r\n });\r\n });\r\n }\r\n\r\n setProjectTypeWorkflows = (aboutResult) => {\r\n if (aboutResult.workflows) {\r\n const workflows = aboutResult.workflows;\r\n Backend.getLicensingInfo((license) => {\r\n let filteredWorkflows = [];\r\n if (license.activeModules.length > 0) {\r\n filteredWorkflows = workflows.filter((workflow) => {\r\n return license.activeModules.some((activeModule) =>\r\n workflow.toLowerCase().includes(activeModule.label.toLowerCase())\r\n );\r\n });\r\n } else {\r\n filteredWorkflows = workflows;\r\n }\r\n\r\n this.setState({ filteredWorkflows });\r\n });\r\n }\r\n };\r\n\r\n handleChange = (event, newValue) => {\r\n this.scrollRef.current.scrollTo(0, 0);\r\n this.setState({ activeTab: newValue });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const {\r\n releaseNotes,\r\n version,\r\n activeTab,\r\n filteredWorkflows,\r\n intranetUrl,\r\n localhostMode,\r\n logFiles,\r\n logFilesPython,\r\n canAccessLogFiles,\r\n } = this.state;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {canAccessLogFiles && }\r\n \r\n \r\n {activeTab === 0 && (\r\n \r\n )}\r\n {activeTab === 1 && }\r\n {activeTab === 2 && (\r\n \r\n )}\r\n {activeTab === 3 && canAccessLogFiles && (\r\n \r\n )}\r\n
\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nAboutPage.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n releaseNotes: PropTypes.array,\r\n};\r\n\r\nexport default withRouter(withStyles(styles)(AboutPage));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n// import classnames from \"classnames\";\r\nimport { DialogTitle, Dialog, LinearProgress } from \"@mui/material\";\r\nimport CircularProgress from \"@mui/material/CircularProgress\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport \"./Spinloader.css\";\r\n\r\nconst SpinloaderContext = React.createContext();\r\n\r\nexport const withSpinloader = (Component) => {\r\n const WrappedComponent = (props) => (\r\n \r\n {(context) => }\r\n \r\n );\r\n\r\n WrappedComponent.displayName = `withSpinloader(${\r\n Component.displayName || Component.name || \"Component\"\r\n })`;\r\n\r\n return WrappedComponent;\r\n};\r\n\r\nconst styles = () => ({\r\n progressContainer: {\r\n position: \"fixed\",\r\n top: 64,\r\n left: 0,\r\n right: 390,\r\n bottom: 0,\r\n zIndex: 100000,\r\n margin: \"auto\",\r\n textAlign: \"center\",\r\n height: 50,\r\n },\r\n dialog: { pointerEvents: \"none\", right: 500, top: 60 },\r\n message: {\r\n display: \"inline-block\",\r\n position: \"relative\",\r\n top: -10,\r\n marginLeft: 10,\r\n },\r\n linearProgress: {\r\n height: 10,\r\n },\r\n greyedOutBackground: {\r\n background: \"rgba(0,0,0,0.5)\",\r\n top: 0,\r\n left: 0,\r\n width: \"10000px\",\r\n height: \"10000px\",\r\n position: \"fixed\",\r\n zIndex: 999999,\r\n },\r\n});\r\n\r\n// this is the main component, it has to be added at the root of the app.\r\n// all components that use withSpinloader(...) will have access to it via this.props.spinloader...\r\nclass SpinloaderProvider extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n rightWidth: 100,\r\n show: false,\r\n messagePresent: false,\r\n message: \"\",\r\n indefinite: true,\r\n progress: 0,\r\n };\r\n this.timeout = null;\r\n this.start_time = performance.now();\r\n }\r\n /**\r\n * Shows an indefinte spinloader\r\n */\r\n show() {\r\n this.start_time = performance.now();\r\n if (!this.state.show) {\r\n this.setState({\r\n show: true,\r\n messagePresent: false,\r\n message: \"\",\r\n indefinite: true,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Shows a progressbar with a prominent message above\r\n * @param {JSON} progressObject JSON Object with message and progress {message: , progress: }\r\n */\r\n showWithProgress = (progressObject) => {\r\n this.start_time = performance.now();\r\n const progress = parseInt(progressObject.progress);\r\n this.setState({\r\n show: true,\r\n messagePresent: true,\r\n message: progressObject.message + \": \" + progress + \"%\",\r\n progress: isNaN(progress) ? 0 : progress,\r\n indefinite: false,\r\n });\r\n clearTimeout(this.timeout);\r\n };\r\n\r\n showWithAutoProgress = (message, seconds) => {\r\n this.start_time = performance.now();\r\n this.setState(\r\n {\r\n show: true,\r\n messagePresent: true,\r\n message: message,\r\n progress: 0,\r\n indefinite: false,\r\n currentSecond: 0,\r\n predictedSeconds: parseInt(seconds),\r\n },\r\n () => {\r\n setTimeout(() => this.updateAutoProgress(), 1000);\r\n }\r\n );\r\n };\r\n updateAutoProgress = () => {\r\n if (this.state.show) {\r\n const progress =\r\n (100 * this.state.currentSecond) / this.state.predictedSeconds;\r\n this.setState({\r\n currentSecond: this.state.currentSecond + 1,\r\n progress: progress,\r\n });\r\n if (progress < 100) {\r\n setTimeout(() => this.updateAutoProgress(), 1000);\r\n } else {\r\n this.showWithMessage(this.state.message);\r\n }\r\n }\r\n };\r\n /**\r\n * Shows an indefinite loader with a prominent message above\r\n * @param {String} message The info to be displayed\r\n */\r\n showWithMessage = (message) => {\r\n this.start_time = performance.now();\r\n this.setState({\r\n show: true,\r\n messagePresent: true,\r\n message: message,\r\n indefinite: true,\r\n });\r\n };\r\n\r\n /**\r\n * Shows Spinloader and hides it after a defined time to prevent constant blocking of the screen\r\n * @param {int} scenesLeft Scenes to analyse. Used for delay calculation.\r\n * @param {int} timeoutSeconds Seconds to wait until hiding spinloader\r\n */\r\n showWithTimeout(scenesLeft, timeoutSeconds = 30) {\r\n this.start_time = performance.now();\r\n let waitTime = 300000;\r\n if (scenesLeft) {\r\n waitTime = scenesLeft * timeoutSeconds * 1000;\r\n waitTime = Math.max(waitTime, 60000);\r\n }\r\n this.setState({ show: true });\r\n this.timeout = setTimeout(() => this.timeoutHide(), waitTime);\r\n }\r\n\r\n /**\r\n *\r\n * @param {*} scenesLeft\r\n * @param {*} timeoutSeconds\r\n */\r\n resetTimer(scenesLeft, timeoutSeconds = 30) {\r\n let waitTime = scenesLeft * timeoutSeconds * 1000;\r\n waitTime = Math.min(waitTime, 60000);\r\n clearTimeout(this.timeout);\r\n if (scenesLeft > 0) {\r\n this.timeout = setTimeout(() => this.timeoutHide(), waitTime);\r\n } else {\r\n this.hide();\r\n }\r\n }\r\n\r\n measureTime = () => {\r\n const executionTime = (performance.now() - this.start_time) / 1000;\r\n if (executionTime > 10) {\r\n const minutes = parseInt(executionTime / 60, 10);\r\n const seconds = parseInt(executionTime % 60, 10);\r\n const logMessage = `Spinner active time: ${minutes} minutes and ${seconds} seconds!`;\r\n console.log(logMessage);\r\n window.showWarningSnackbar(logMessage);\r\n }\r\n };\r\n\r\n hide() {\r\n if (this.state.show) {\r\n this.measureTime();\r\n clearTimeout(this.timeout);\r\n this.setState({ show: false, messagePresent: false, message: \"\" });\r\n }\r\n }\r\n\r\n timeoutHide() {\r\n this.hide();\r\n window.showWarningSnackbar(\r\n \"Warning: Timeout! Process is taking especially long.\"\r\n );\r\n }\r\n\r\n hideTimeDelayed(delay) {\r\n setTimeout(() => {\r\n this.hide();\r\n }, delay);\r\n }\r\n\r\n load(func) {\r\n this.setState({ show: true });\r\n setTimeout(() => {\r\n func();\r\n this.setState({ show: false, messagePresent: false });\r\n }, 0);\r\n }\r\n\r\n setRightWidth(width) {\r\n this.setState({ rightWidth: width });\r\n }\r\n\r\n render() {\r\n const { classes } = this.props;\r\n return (\r\n this.show(),\r\n showWithTimeout: (numberScenes) => this.showWithTimeout(numberScenes),\r\n showWithProgress: (progObject) => this.showWithProgress(progObject),\r\n showWithAutoProgress: (message, seconds) =>\r\n this.showWithAutoProgress(message, seconds),\r\n showWithMessage: (message) => this.showWithMessage(message),\r\n resetTimer: (numberRestScenes) => this.resetTimer(numberRestScenes),\r\n hide: () => this.hide(),\r\n hideTimeDelayed: (delay) => this.hideTimeDelayed(delay),\r\n load: (callback) => this.load(callback),\r\n setRightWidth: (width) => this.setRightWidth(width),\r\n }}\r\n >\r\n {this.props.children}\r\n {this.state.show && (\r\n
\r\n \r\n {this.state.messagePresent ? (\r\n // Dialog option for more text\r\n \r\n \r\n \r\n
{this.state.message}
\r\n
\r\n {this.state.indefinite ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n ) : (\r\n // Normal, indefinite spinloader\r\n \r\n )}\r\n
\r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nSpinloaderProvider.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n children: PropTypes.element.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(SpinloaderProvider);\r\n","import React, { useState, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { withSpinloader } from \"../../common/components/Spinloader\";\r\nimport {\r\n TextField,\r\n Typography,\r\n CardActions,\r\n Button,\r\n Card,\r\n CardContent,\r\n Tooltip,\r\n} from \"@mui/material\";\r\n// import { makeStyles } from \"@mui/styles\";\r\n\r\n// const useStyles = makeStyles({\r\n// root: {\r\n// flexGrow: 1,\r\n// width: \"100%\",\r\n// height: \"calc(100vh - 64px - 48px)\",\r\n// overflow: \"hidden\",\r\n// },\r\n// paper: {\r\n// padding: 20,\r\n// display: \"flex\",\r\n// justifyContent: \"center\",\r\n// alignItems: \"center\",\r\n// },\r\n// });\r\n\r\nfunction SystemContainer(props) {\r\n const [settings, setSettings] = useState(null);\r\n // const classes = useStyles();\r\n\r\n useEffect(() => {\r\n Backend.readAppSettings().then((data) => {\r\n setSettings(data);\r\n });\r\n }, []);\r\n\r\n const saveClick = () => {\r\n const tempSettings = { ...settings };\r\n const { storagePath, tempPath, galleryOutputPath } = tempSettings;\r\n\r\n let collection = [storagePath, tempPath, galleryOutputPath];\r\n for (var [i, e] of collection.entries()) {\r\n e = e.replace(/\\\\/g, \"/\");\r\n while (e.includes(\"//\")) {\r\n e = e.replace(\"//\", \"/\");\r\n }\r\n if (!e.endsWith(\"/\")) {\r\n e = e + \"/\";\r\n }\r\n collection[i] = e;\r\n }\r\n tempSettings[\"storagePath\"] = collection[0];\r\n tempSettings[\"tempPath\"] = collection[1];\r\n tempSettings[\"galleryOutputPath\"] = collection[2];\r\n\r\n setSettings(tempSettings);\r\n\r\n Backend.writeAppSettings(settings, (data) => {\r\n console.log(data);\r\n });\r\n window.location.reload();\r\n };\r\n\r\n const deleteTempFilesClick = () => {\r\n window.openResponseDialog(\r\n \"Delete temporary files folder? Imported files have to be imported again. Projects will not be affected.\",\r\n (response) => {\r\n if (response) {\r\n props.spinloader.show();\r\n Backend.deleteTempFiles((result) => {\r\n props.spinloader.hide();\r\n if (result.status && result.status === 403) {\r\n window.showErrorSnackbar(\"No permission to use system actions!\");\r\n } else {\r\n if (result.success) {\r\n if (result.deleted) {\r\n window.showSuccessSnackbar(\"Temp files folder deleted!\");\r\n } else {\r\n window.showWarningSnackbar(\"No femp files folder found!\");\r\n }\r\n } else {\r\n window.showErrorSnackbar(\"Temp files folder deleting failed!\");\r\n }\r\n }\r\n });\r\n }\r\n }\r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n System Actions\r\n \r\n \r\n \r\n Delete Temp Files\r\n \r\n \r\n \r\n\r\n Job Scheduler\r\n
\r\n\r\n {settings && (\r\n \r\n \r\n {\r\n const tempSettings = { ...settings };\r\n tempSettings.schedulerStart = e.target.value;\r\n setSettings(tempSettings);\r\n }}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n inputProps={{\r\n step: 300, // 5 min\r\n }}\r\n />\r\n \r\n \r\n )}\r\n\r\n \r\n {settings && (\r\n \r\n \r\n {\r\n const tempSettings = { ...settings };\r\n tempSettings.schedulerEnd = e.target.value;\r\n setSettings(tempSettings);\r\n }}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n inputProps={{\r\n step: 300, // 5 min\r\n }}\r\n />\r\n \r\n \r\n )}\r\n
\r\n \r\n \r\n \r\n \r\n Save\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nSystemContainer.propTypes = {\r\n spinloader: PropTypes.object,\r\n canSetJobRunTimes: PropTypes.bool,\r\n canUseSystemActions: PropTypes.bool,\r\n};\r\n\r\nexport default withSpinloader(SystemContainer);\r\n","import React, { useState, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { makeStyles } from \"@mui/styles\";\r\nimport {\r\n Button,\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n TextField,\r\n DialogActions,\r\n Box,\r\n Checkbox,\r\n Tooltip,\r\n} from \"@mui/material\";\r\nimport Autocomplete from \"@mui/material/Autocomplete\";\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nimport CheckBoxOutlineBlankIcon from \"@mui/icons-material/CheckBoxOutlineBlank\";\r\nimport CheckBoxIcon from \"@mui/icons-material/CheckBox\";\r\n\r\nconst icon = ;\r\nconst checkedIcon = ;\r\n\r\nconst useStyles = makeStyles({\r\n root: {\r\n // autocomplete autside dialog possible\r\n \"& .MuiPaper-root\": {\r\n overflow: \"visible\",\r\n },\r\n \"& .MuiAutocomplete-popper\": {\r\n border: \"2px solid #0673C1\",\r\n borderRadius: \"5px\",\r\n },\r\n },\r\n});\r\n\r\nfunction UserDetailsDialog(props) {\r\n const classes = useStyles();\r\n const [user, setUser] = useState(null);\r\n const [selectedGroups, setSelectedGroups] = useState([]);\r\n\r\n useEffect(() => {\r\n // dialog open\r\n if (props.open && props.user.id) {\r\n Backend.getUserGroups(props.user.id, (response) => {\r\n let user = JSON.parse(JSON.stringify(props.user));\r\n let selectedGroups = response;\r\n setUser(user);\r\n setSelectedGroups(selectedGroups);\r\n });\r\n } else {\r\n setUser(JSON.parse(JSON.stringify(props.user)));\r\n setSelectedGroups([]);\r\n }\r\n }, [props.open, props.user]);\r\n\r\n const handleChange = (e) => {\r\n const newUser = { ...user, [e.target.name]: e.target.value };\r\n setUser(newUser);\r\n };\r\n\r\n return (\r\n \r\n User Details\r\n {user && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n option.name}\r\n isOptionEqualToValue={(option, value) =>\r\n option.id === value.id\r\n }\r\n value={selectedGroups}\r\n onChange={(event, newValue) => {\r\n setSelectedGroups(newValue);\r\n }}\r\n renderInput={(params) => (\r\n \r\n )}\r\n renderOption={(props, option, { selected }) => (\r\n
  • \r\n \r\n {option.name}\r\n
  • \r\n )}\r\n />\r\n
    \r\n \r\n
    \r\n
    \r\n )}\r\n \r\n \r\n props.onApply(user, selectedGroups)}\r\n color=\"primary\"\r\n >\r\n Apply\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nUserDetailsDialog.propTypes = {\r\n classes: PropTypes.object,\r\n open: PropTypes.bool,\r\n user: PropTypes.object,\r\n groups: PropTypes.array,\r\n onClose: PropTypes.func,\r\n onApply: PropTypes.func,\r\n create: PropTypes.bool,\r\n canEditUserGroups: PropTypes.bool,\r\n};\r\n\r\nexport default UserDetailsDialog;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport {\r\n IconButton,\r\n TableRow,\r\n TableCell,\r\n TableHead,\r\n Table,\r\n TableBody,\r\n Button,\r\n Card,\r\n CardContent,\r\n Typography,\r\n CardActions,\r\n Tooltip,\r\n Chip,\r\n} from \"@mui/material\";\r\nimport { makeStyles } from \"@mui/styles\";\r\n// Icons\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport EditIcon from \"@mui/icons-material/Edit\";\r\n\r\nimport UserDetailsDialog from \"./UserDetailsDialog\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n table: {\r\n minWidth: 650,\r\n },\r\n paper: {\r\n padding: 20,\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n },\r\n chip: {\r\n margin: 2,\r\n },\r\n}));\r\n\r\nfunction TableRowRender(props) {\r\n const { user, canEditUsers, deleteUser, handleUserEdit } = props;\r\n const classes = useStyles();\r\n\r\n const editTooltipTitle = canEditUsers\r\n ? \"Edit user details\"\r\n : \"No Permission!\";\r\n const deleteTooltipTitle = canEditUsers\r\n ? \"Delete user forever\"\r\n : \"No Permission!\";\r\n\r\n return (\r\n \r\n \r\n {user.fullName}\r\n \r\n {user.email}\r\n \r\n {user.groups.map((group, groupIdx) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n {user.fullName !== \"HSA\" && [\r\n \r\n \r\n handleUserEdit(user)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n ,\r\n \r\n \r\n deleteUser(user.id)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n ,\r\n ]}\r\n \r\n \r\n );\r\n}\r\n\r\nTableRowRender.propTypes = {\r\n user: PropTypes.object.isRequired,\r\n canEditUsers: PropTypes.bool.isRequired,\r\n deleteUser: PropTypes.func.isRequired,\r\n handleUserEdit: PropTypes.func.isRequired,\r\n};\r\n\r\nfunction UsersContainer(props) {\r\n const [userDetails, setUserDetails] = useState(null);\r\n const [create, setCreate] = useState(false);\r\n const classes = useStyles();\r\n\r\n useEffect(() => {\r\n props.updateGroups();\r\n }, []);\r\n\r\n const handleBackendResponse = (res, successCallback) => {\r\n if (res.success !== undefined && res.success === true) {\r\n successCallback();\r\n } else if (res.status !== undefined && res.status === 403) {\r\n window.showErrorSnackbar(\"No permission to edit users!\");\r\n } else {\r\n window.showErrorSnackbar(\"Something went wrong!\");\r\n }\r\n };\r\n\r\n const onUserEdit = (e, userGroups) => {\r\n if (create) {\r\n Backend.createUser(e, (res) => {\r\n handleBackendResponse(res, () => {\r\n Backend.updateUserGroups(res.user.id, userGroups, () => {\r\n props.updateUserList();\r\n });\r\n });\r\n });\r\n } else {\r\n Backend.updateUser(e, (res) => {\r\n handleBackendResponse(res, () => {\r\n Backend.updateUserGroups(e.id, userGroups, () => {\r\n props.updateUserList();\r\n });\r\n });\r\n });\r\n }\r\n setUserDetails(null);\r\n setCreate(false);\r\n };\r\n\r\n const deleteUser = (id) => {\r\n window.openResponseDialog(\"Delete user forever?\", (response) => {\r\n if (response) {\r\n Backend.deleteUser(id, (res) => {\r\n handleBackendResponse(res, () => {\r\n props.updateUserList();\r\n });\r\n });\r\n }\r\n });\r\n };\r\n\r\n const newUserClick = () => {\r\n setUserDetails({\r\n email: \"\",\r\n fullName: \"\",\r\n role: \"User\",\r\n password: \"\",\r\n });\r\n setCreate(true);\r\n };\r\n\r\n return (\r\n \r\n \r\n Users\r\n \r\n \r\n \r\n Full Name\r\n Email\r\n Groups\r\n Actions\r\n \r\n \r\n \r\n {props.users &&\r\n props.users.map((user) => (\r\n \r\n ))}\r\n \r\n
    \r\n
    \r\n \r\n \r\n Add new User\r\n \r\n \r\n {\r\n setUserDetails(null);\r\n setCreate(false);\r\n }}\r\n canEditUserGroups={props.canEditUserGroups}\r\n />\r\n
    \r\n );\r\n}\r\n\r\nUsersContainer.propTypes = {\r\n open: PropTypes.bool,\r\n groups: PropTypes.array,\r\n updateGroups: PropTypes.func,\r\n users: PropTypes.array,\r\n updateUserList: PropTypes.func,\r\n canEditUsers: PropTypes.bool,\r\n canEditUserGroups: PropTypes.bool,\r\n};\r\n\r\nexport default UsersContainer;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport { FormControl, InputLabel, Select, MenuItem } from \"@mui/material\";\r\n\r\nconst styles = {\r\n root: {},\r\n selectContainer: {\r\n margin: \"10px 0\",\r\n },\r\n};\r\n\r\nclass CustomListSelector extends React.Component {\r\n render() {\r\n const { classes, optionsList, selectedIdx, onChange } = this.props;\r\n return (\r\n
    \r\n \r\n \r\n {this.props.label}\r\n \r\n onChange(e.target.value)}\r\n >\r\n {optionsList.map((value, idx) => (\r\n \r\n {value}\r\n \r\n ))}\r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nCustomListSelector.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n label: PropTypes.string.isRequired,\r\n selectedIdx: PropTypes.number.isRequired,\r\n optionsList: PropTypes.array.isRequired,\r\n onChange: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(CustomListSelector);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n Button,\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n TextField,\r\n DialogActions,\r\n FormGroup,\r\n FormControlLabel,\r\n Checkbox,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport CustomListSelector from \"../../globalComponents/CustomListSelector\";\r\nconst styles = () => ({\r\n container: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr 1fr\",\r\n marginTop: 5,\r\n },\r\n column: {\r\n border: \"2px solid rgb(218, 218, 218)\",\r\n padding: 10,\r\n },\r\n columnHeadline: { fontSize: 16, marginBottom: 10 },\r\n});\r\nconst defaultCheckboxAdminData = {\r\n canImportProjects: {\r\n label: \"Import Projects\",\r\n checked: false,\r\n },\r\n canAccessLogFiles: {\r\n label: \"Access Log Files\",\r\n checked: false,\r\n },\r\n canExportModels: {\r\n label: \"Export AI Models\",\r\n checked: false,\r\n },\r\n canImportModels: {\r\n label: \"Import AI Models\",\r\n checked: false,\r\n },\r\n canEditGroups: {\r\n label: \"Edit Group\",\r\n checked: false,\r\n },\r\n canAccessAdminPage: {\r\n label: \"Access Admin Page\",\r\n checked: false,\r\n },\r\n canUseSystemActions: {\r\n label: \"Use System Actions\",\r\n checked: false,\r\n },\r\n canSetJobRunTimes: {\r\n label: \"Set Job Run Times\",\r\n checked: false,\r\n },\r\n canAccessLicensingPage: {\r\n label: \"Access Licensing Page\",\r\n checked: false,\r\n },\r\n canEditUsers: {\r\n label: \"Edit Users\",\r\n checked: false,\r\n },\r\n canEditAutoImportSettings: {\r\n label: \"Edit auto import settings\",\r\n checked: false,\r\n },\r\n canEditUserGroups: {\r\n label: \"Edit User Groups\",\r\n checked: false,\r\n },\r\n canAccessAllUserActions: {\r\n label: \"Access All User Actions\",\r\n checked: false,\r\n },\r\n canCreateModules: {\r\n label: \"Create Project Modules\",\r\n checked: false,\r\n },\r\n};\r\n\r\nconst defaultCheckboxProjectData = {\r\n isProjectVisible: {\r\n label: \"Project visible for group members\",\r\n checked: false,\r\n },\r\n canOpenProject: {\r\n label: \"Open project\",\r\n checked: false,\r\n },\r\n canAccessResults: {\r\n label: \"Access Results\",\r\n checked: false,\r\n },\r\n canComment: {\r\n label: \"Comment\",\r\n checked: false,\r\n },\r\n canAnnotate: {\r\n label: \"Annotate\",\r\n checked: false,\r\n },\r\n canEditStructures: {\r\n label: \"Edit structures\",\r\n checked: false,\r\n },\r\n canRunJob: {\r\n label: \"Run job\",\r\n checked: false,\r\n },\r\n canAccessAITab: {\r\n label: \"Access AI Tab\",\r\n checked: false,\r\n },\r\n canEditAITabSettings: {\r\n label: \"Edit AI Tab Settings\",\r\n checked: false,\r\n },\r\n canTrainModel: {\r\n label: \"Train models\",\r\n checked: false,\r\n },\r\n canEditProjectProperties: {\r\n label: \"Edit project properties\",\r\n checked: false,\r\n },\r\n};\r\n\r\nclass GroupDetailsDialog extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n groupName: props.group === null ? \"\" : props.group.name,\r\n nameError: false,\r\n presetAdminIdx: 0,\r\n presetProjectIdx: 0,\r\n };\r\n this.checkboxAdminData = JSON.parse(\r\n JSON.stringify(defaultCheckboxAdminData)\r\n );\r\n this.checkboxProjectData = JSON.parse(\r\n JSON.stringify(defaultCheckboxProjectData)\r\n );\r\n\r\n this.presetAdminOptionsList = [\r\n \"Not Selected\",\r\n \"Minimal\",\r\n \"User\",\r\n \"User AI\",\r\n \"Admin\",\r\n \"Super Admin\",\r\n ];\r\n this.presetProjectOptionsList = [\r\n \"Not Selected\",\r\n \"No Presets\",\r\n \"Viewing\",\r\n \"Annotating\",\r\n \"Annotating and Training\",\r\n \"Admin\",\r\n ];\r\n }\r\n componentDidMount = () => {\r\n this.updateCheckboxes();\r\n };\r\n resetDetails = () => {\r\n this.checkboxAdminData = JSON.parse(\r\n JSON.stringify(defaultCheckboxAdminData)\r\n );\r\n this.checkboxProjectData = JSON.parse(\r\n JSON.stringify(defaultCheckboxProjectData)\r\n );\r\n this.setState({ groupName: \"\" });\r\n };\r\n updateCheckboxes = () => {\r\n if (this.props.group !== null) {\r\n for (const [key, value] of Object.entries(this.props.group)) {\r\n if (typeof value === \"boolean\") {\r\n if (this.checkboxAdminData[key]) {\r\n this.checkboxAdminData[key].checked = value;\r\n } else if (this.checkboxProjectData[key]) {\r\n this.checkboxProjectData[key].checked = value;\r\n }\r\n } else if (key === \"name\") {\r\n this.setState({\r\n groupName: value,\r\n });\r\n }\r\n }\r\n }\r\n this.setState({\r\n presetAdminIdx: 0,\r\n presetProjectIdx: 0,\r\n });\r\n };\r\n componentDidUpdate = (prevProps) => {\r\n if (prevProps.group === null && this.props.group !== null) {\r\n this.updateCheckboxes();\r\n }\r\n };\r\n\r\n onApply = () => {\r\n let group = {\r\n name: this.state.groupName,\r\n };\r\n for (const [key, value] of Object.entries(this.checkboxAdminData)) {\r\n group[key] = value.checked;\r\n }\r\n for (const [key, value] of Object.entries(this.checkboxProjectData)) {\r\n group[key] = value.checked;\r\n }\r\n if (this.props.group) {\r\n group.id = this.props.group.id;\r\n Backend.updateGroup(group, (res) => {\r\n if (res === true || res.success === true) {\r\n this.resetDetails();\r\n this.props.onApply();\r\n window.showSuccessSnackbar(\"saved!\");\r\n }\r\n });\r\n } else {\r\n Backend.createGroup(group, (res) => {\r\n if (res.success === true) {\r\n this.resetDetails();\r\n this.props.onApply();\r\n window.showSuccessSnackbar(\"Group created!\");\r\n }\r\n });\r\n }\r\n };\r\n\r\n onClose = () => {\r\n this.resetDetails();\r\n this.props.onClose();\r\n };\r\n\r\n // set checkbox, if user has that permission\r\n setcheckboxAdminDataValue = (key, value) => {\r\n if (this.props.user.group[key]) {\r\n this.checkboxAdminData[key].checked = value;\r\n }\r\n };\r\n\r\n onAdminPresetChange = (value) => {\r\n if (value === 0) return; // no changes\r\n let updateObject = {\r\n presetAdminIdx: value,\r\n };\r\n for (let key of Object.keys(this.checkboxAdminData)) {\r\n this.setcheckboxAdminDataValue(key, false);\r\n }\r\n\r\n switch (value) {\r\n case 5: // Super Admin\r\n this.setcheckboxAdminDataValue(\"canCreateModules\", true);\r\n // falls through\r\n case 4: //Admin\r\n this.setcheckboxAdminDataValue(\"canEditGroups\", true);\r\n this.setcheckboxAdminDataValue(\"canAccessAdminPage\", true);\r\n this.setcheckboxAdminDataValue(\"canUseSystemActions\", true);\r\n this.setcheckboxAdminDataValue(\"canSetJobRunTimes\", true);\r\n this.setcheckboxAdminDataValue(\"canAccessLicensingPage\", true);\r\n this.setcheckboxAdminDataValue(\"canEditUsers\", true);\r\n this.setcheckboxAdminDataValue(\"canEditAutoImportSettings\", true);\r\n this.setcheckboxAdminDataValue(\"canEditUserGroups\", true);\r\n this.setcheckboxAdminDataValue(\"canAccessAllUserActions\", true);\r\n // falls through\r\n case 3: // User AI\r\n this.setcheckboxAdminDataValue(\"canExportModels\", true);\r\n this.setcheckboxAdminDataValue(\"canImportModels\", true);\r\n // falls through\r\n case 2: // User\r\n this.setcheckboxAdminDataValue(\"canAccessLogFiles\", true);\r\n this.setcheckboxAdminDataValue(\"canImportProjects\", true);\r\n }\r\n if (\r\n this.state.groupName === \"\" ||\r\n this.presetAdminOptionsList.includes(this.state.groupName)\r\n ) {\r\n this.updateGroupName(this.presetAdminOptionsList[value]);\r\n }\r\n this.setState(updateObject);\r\n };\r\n\r\n // if validation to check needed, set here\r\n setCheckboxProjectData = (key, value) => {\r\n this.checkboxProjectData[key].checked = value;\r\n };\r\n\r\n onProjectPresetChange = (value) => {\r\n if (value === 0) return; // no changes\r\n let updateObject = {\r\n presetProjectIdx: value,\r\n };\r\n\r\n for (let key of Object.keys(this.checkboxProjectData)) {\r\n this.setCheckboxProjectData(key, false);\r\n }\r\n\r\n switch (value) {\r\n case 5: // Admin\r\n this.setCheckboxProjectData(\"canEditProjectProperties\", true);\r\n // falls through\r\n case 4: // Annotating and Training\r\n this.setCheckboxProjectData(\"canTrainModel\", true);\r\n this.setCheckboxProjectData(\"canEditAITabSettings\", true);\r\n this.setCheckboxProjectData(\"canAccessAITab\", true);\r\n // falls through\r\n case 3: // Annotating\r\n this.setCheckboxProjectData(\"canEditStructures\", true);\r\n this.setCheckboxProjectData(\"canAnnotate\", true);\r\n this.setCheckboxProjectData(\"canComment\", true);\r\n this.setCheckboxProjectData(\"canRunJob\", true);\r\n // falls through\r\n case 2: // Viewing\r\n this.setCheckboxProjectData(\"canAccessResults\", true);\r\n this.setCheckboxProjectData(\"canOpenProject\", true);\r\n }\r\n this.setState(updateObject);\r\n };\r\n\r\n onAdminPermissionCheckboxChange = (e, item) => {\r\n item.checked = e.target.checked;\r\n this.forceUpdate();\r\n };\r\n\r\n onProjectPermissionCheckboxChange = (e, key, item) => {\r\n item.checked = e.target.checked;\r\n if (key === \"canOpenProject\" && !item.checked) {\r\n this.checkboxProjectData.canEditProjectProperties.checked = false;\r\n this.checkboxProjectData.canTrainModel.checked = false;\r\n this.checkboxProjectData.canEditAITabSettings.checked = false;\r\n this.checkboxProjectData.canAccessAITab.checked = false;\r\n this.checkboxProjectData.canEditStructures.checked = false;\r\n this.checkboxProjectData.canAnnotate.checked = false;\r\n this.checkboxProjectData.canComment.checked = false;\r\n this.checkboxProjectData.canAccessResults.checked = false;\r\n this.checkboxProjectData.canRunJob.checked = false;\r\n } else if (key === \"canAccessAITab\" && !item.checked) {\r\n this.checkboxProjectData.canEditAITabSettings.checked = false;\r\n this.checkboxProjectData.canTrainModel.checked = false;\r\n }\r\n this.forceUpdate();\r\n };\r\n\r\n updateGroupName = (newGroupName) => {\r\n let nameError = newGroupName === \"\";\r\n if (!nameError) {\r\n let groupWithSameName = this.props.groups.find(\r\n (group) => group.name === newGroupName\r\n );\r\n nameError = !(typeof groupWithSameName === \"undefined\");\r\n if (this.props.group) {\r\n if (groupWithSameName && this.props.group.id === groupWithSameName.id) {\r\n nameError = false;\r\n }\r\n }\r\n }\r\n this.setState({\r\n groupName: newGroupName,\r\n nameError: nameError,\r\n });\r\n };\r\n\r\n render() {\r\n const { groupName, nameError, presetAdminIdx, presetProjectIdx } =\r\n this.state;\r\n const { classes, open } = this.props;\r\n\r\n return (\r\n \r\n Group Details\r\n \r\n {\r\n this.updateGroupName(e.target.value);\r\n }}\r\n />\r\n
    \r\n
    \r\n \r\n Admin Permissions:\r\n \r\n \r\n\r\n \r\n {Object.keys(this.checkboxAdminData).map((key, idx) => {\r\n const item = this.checkboxAdminData[key];\r\n return (\r\n {\r\n this.onAdminPermissionCheckboxChange(e, item);\r\n }}\r\n />\r\n }\r\n label={item.label}\r\n />\r\n );\r\n })}\r\n \r\n
    \r\n
    \r\n \r\n Default Project Permissions:\r\n \r\n \r\n \r\n {Object.keys(this.checkboxProjectData).map((key, idx) => {\r\n const item = this.checkboxProjectData[key];\r\n return (\r\n {\r\n this.onProjectPermissionCheckboxChange(\r\n e,\r\n key,\r\n item\r\n );\r\n }}\r\n />\r\n }\r\n label={item.label}\r\n />\r\n );\r\n })}\r\n \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nGroupDetailsDialog.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n open: PropTypes.bool,\r\n user: PropTypes.object,\r\n group: PropTypes.object,\r\n groups: PropTypes.array,\r\n onClose: PropTypes.func,\r\n onApply: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(GroupDetailsDialog);\r\n","import React, { useState, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport {\r\n IconButton,\r\n TableRow,\r\n TableCell,\r\n TableHead,\r\n Table,\r\n TableBody,\r\n Button,\r\n Card,\r\n CardContent,\r\n Typography,\r\n CardActions,\r\n Tooltip,\r\n} from \"@mui/material\";\r\nimport { makeStyles } from \"@mui/styles\";\r\n\r\n// Icons\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport EditIcon from \"@mui/icons-material/Edit\";\r\n\r\nimport GroupDetailsDialog from \"./GroupDetailsDialog\";\r\n\r\nconst useStyles = makeStyles({\r\n paper: {\r\n padding: 20,\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n },\r\n});\r\n\r\nfunction GroupsContainer(props) {\r\n const [groupDetailsOpen, setGroupDetailsOpen] = useState(false);\r\n const [group, setGroup] = useState(null);\r\n\r\n const classes = useStyles();\r\n const { user, userGroupIds } = props;\r\n\r\n useEffect(() => {\r\n props.updateGroups();\r\n }, []);\r\n\r\n const newGroupClick = () => {\r\n setGroup(null);\r\n setGroupDetailsOpen(true);\r\n };\r\n\r\n const deleteGroup = (id) => {\r\n window.openResponseDialog(\"Delete Group forever?\", (response) => {\r\n if (response) {\r\n Backend.deleteGroup(id, (res) => {\r\n if (res.success === true) {\r\n props.updateGroups();\r\n window.showSuccessSnackbar(\"Group deleted!\");\r\n }\r\n });\r\n }\r\n });\r\n };\r\n\r\n const editGroup = (group) => {\r\n setGroup(group);\r\n setGroupDetailsOpen(true);\r\n };\r\n\r\n return (\r\n \r\n \r\n Groups\r\n \r\n \r\n \r\n Group Name\r\n Actions\r\n \r\n \r\n \r\n {props.groups &&\r\n props.groups.map((group, idx) => {\r\n const groupCanBeEdited =\r\n props.isSuperAdmin ||\r\n (user.group.canEditGroups === true &&\r\n !userGroupIds.includes(group.id));\r\n return (\r\n \r\n \r\n {group.name}\r\n \r\n \r\n {idx > 0 && [\r\n \r\n \r\n editGroup(group)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n ,\r\n \r\n \r\n deleteGroup(group.id)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n ,\r\n ]}\r\n \r\n \r\n );\r\n })}\r\n \r\n
    \r\n
    \r\n \r\n \r\n Add new Group\r\n \r\n \r\n {\r\n setGroupDetailsOpen(false);\r\n setGroup(null);\r\n }}\r\n onApply={() => {\r\n setGroupDetailsOpen(false);\r\n setGroup(null);\r\n props.updateGroups();\r\n }}\r\n />\r\n
    \r\n );\r\n}\r\n\r\nGroupsContainer.propTypes = {\r\n groups: PropTypes.array,\r\n updateGroups: PropTypes.func,\r\n user: PropTypes.object.isRequired,\r\n isSuperAdmin: PropTypes.bool,\r\n userGroupIds: PropTypes.array.isRequired,\r\n};\r\n\r\nexport default GroupsContainer;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport {\r\n Button,\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n TextField,\r\n IconButton,\r\n Grid,\r\n ListItem,\r\n ListItemButton,\r\n ListItemText,\r\n ListItemIcon,\r\n List,\r\n Tooltip,\r\n DialogActions,\r\n} from \"@mui/material\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { Folder, ArrowUpward } from \"@mui/icons-material\";\r\nimport { makeStyles } from \"@mui/styles\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n list: {\r\n height: 400,\r\n border: \"2px solid rgb(218, 218, 218)\",\r\n minHeight: \"400px\",\r\n maxHeight: \"500px\",\r\n width: \"100%\",\r\n overflowY: \"auto\",\r\n },\r\n content: { paddingTop: 0, width: 800 },\r\n folderIcon: { color: \"#FFE896\" },\r\n itemText: { overflow: \"hidden\", textOverflow: \"ellipsis\" },\r\n}));\r\n\r\nconst FolderChooser = (props) => {\r\n const { onClose, storagePath, open, isRelative, title } = props;\r\n const classes = useStyles();\r\n const [dirfiles, setDirFiles] = useState([]);\r\n const [currentPath, setCurrentPath] = useState(\"\");\r\n\r\n useEffect(() => {\r\n if (open) {\r\n updateFolderList(\"\");\r\n }\r\n }, [open]);\r\n\r\n const updateFolderList = (currentPath) => {\r\n // load list of available project types from backend\r\n Backend.walkDir(currentPath, isRelative, (e) => {\r\n let filteredDirFiles = e.filter((entry) => {\r\n if (entry.type === \"directory\") {\r\n let sameMrxsFile = e.find((element) => {\r\n return element.path === entry.path + \".mrxs\";\r\n });\r\n return typeof sameMrxsFile === \"undefined\";\r\n } else {\r\n return true;\r\n }\r\n });\r\n // write received info into state\r\n setCurrentPath(currentPath);\r\n setDirFiles(filteredDirFiles);\r\n });\r\n };\r\n\r\n return (\r\n onClose()} maxWidth=\"lg\" open={open}>\r\n {title}\r\n \r\n \r\n \r\n {currentPath && (\r\n \r\n \r\n \r\n {\r\n updateFolderList(\r\n currentPath.substring(0, currentPath.lastIndexOf(\"/\"))\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {dirfiles.map((e, id) => {\r\n if (e.type === \"file\") {\r\n return null;\r\n }\r\n let path =\r\n e.path.length < 5 ? e.path : e.path.replace(/^.*[\\\\/]/, \"\");\r\n return (\r\n updateFolderList(e.path)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n
    \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n};\r\n\r\nFolderChooser.propTypes = {\r\n title: PropTypes.string.isRequired,\r\n onClose: PropTypes.func,\r\n open: PropTypes.bool,\r\n storagePath: PropTypes.string.isRequired,\r\n isRelative: PropTypes.bool.isRequired,\r\n};\r\n\r\nexport default FolderChooser;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport {\r\n TextField,\r\n Typography,\r\n CardActions,\r\n Button,\r\n Card,\r\n CardContent,\r\n Tooltip,\r\n ListItem,\r\n List,\r\n ListItemText,\r\n ListItemAvatar,\r\n Avatar,\r\n ListItemSecondaryAction,\r\n IconButton,\r\n} from \"@mui/material\";\r\nimport FolderIcon from \"@mui/icons-material/Folder\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport FolderChooser from \"./FolderChooser\";\r\n\r\nconst ImporterContainer = ({ canEditAutoImportSettings }) => {\r\n const [settings, setSettings] = useState(null);\r\n const [showFolderChooser, setShowFolderChooser] = useState(false);\r\n\r\n useEffect(() => {\r\n Backend.readImporterSettings((data) => {\r\n // convert string to array\r\n if (data.importerFolders) data.folders = data.importerFolders.split(\";\");\r\n else data.folders = [];\r\n setSettings(data);\r\n });\r\n }, []);\r\n\r\n const saveClick = () => {\r\n const newSettings = { ...settings };\r\n newSettings.importerFolders = newSettings.folders.join(\";\");\r\n Backend.writeImporterSettings(newSettings, (res) => {\r\n if (res.status === 403) {\r\n window.showErrorSnackbar(\"No permission to edit auto import settings!\");\r\n } else if (res.success === true) {\r\n window.showSuccessSnackbar(\"Auto Import Settings saved!\");\r\n } else {\r\n window.openErrorSnackbar(\"Auto Import Settings saving failed!\");\r\n console.log(res);\r\n }\r\n });\r\n };\r\n const addDirectoryClick = () => {\r\n setShowFolderChooser(true);\r\n };\r\n\r\n const handleClose = (path) => {\r\n if (path) {\r\n const newSettings = { ...settings };\r\n newSettings.folders.push(path);\r\n setSettings(newSettings);\r\n }\r\n setShowFolderChooser(false);\r\n };\r\n\r\n const removeDirectoryClick = (path) => {\r\n const newSettings = { ...settings };\r\n newSettings.folders = newSettings.folders.filter((e) => e !== path);\r\n setSettings(newSettings);\r\n };\r\n\r\n if (!settings) return null;\r\n return (\r\n \r\n \r\n Auto Import Settings\r\n \r\n {settings.folders.map((folder, folderIdx) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n removeDirectoryClick(folder)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n }\r\n onClick={addDirectoryClick}\r\n >\r\n Add Directory\r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n {\r\n const newSettings = { ...settings };\r\n newSettings.importerStart = e.target.value;\r\n setSettings(newSettings);\r\n }}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n inputProps={{\r\n step: 300, // 5 min\r\n }}\r\n name=\"Textfield\"\r\n />\r\n \r\n \r\n\r\n \r\n \r\n \r\n {\r\n const newSettings = { ...settings };\r\n newSettings.importerEnd = e.target.value;\r\n setSettings(newSettings);\r\n }}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n inputProps={{\r\n step: 300, // 5 min\r\n }}\r\n name=\"Textfield\"\r\n />\r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n {\r\n const newSettings = { ...settings };\r\n newSettings.importerNewerThan = e.target.value;\r\n setSettings(newSettings);\r\n }}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n inputProps={{\r\n step: 300, // 5 min\r\n }}\r\n name=\"Textfield\"\r\n />\r\n \r\n \r\n
    \r\n \r\n \r\n Save\r\n \r\n \r\n
    \r\n );\r\n};\r\n\r\nImporterContainer.propTypes = {\r\n canEditAutoImportSettings: PropTypes.bool.isRequired,\r\n};\r\n\r\nexport default ImporterContainer;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport classNames from \"classnames\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n Button,\r\n IconButton,\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n ImageListItem,\r\n ImageList,\r\n DialogActions,\r\n} from \"@mui/material\";\r\n\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nconst styles = () => ({\r\n dialogContent: {\r\n paddingTop: 0,\r\n maxWidth: 900,\r\n minWidth: 750,\r\n },\r\n tileBar: {\r\n position: \"absolute\",\r\n left: \"0\",\r\n bottom: \"0\",\r\n width: \"100%\",\r\n height: \"auto\",\r\n padding: \"14px\",\r\n fontFamily: \"Roboto, Helvetica, Arial, sans-serif\",\r\n fontSize: \"1em\",\r\n color: \"white\",\r\n background: \"rgba(0,0,0,0.5)\",\r\n },\r\n projectTile: {\r\n cursor: \"pointer\",\r\n \"&:hover\": {\r\n background: \"#AAA\",\r\n },\r\n },\r\n projectTileSelected: {\r\n background: \"#1BA1E2!important\",\r\n },\r\n projectTilesList: {\r\n maxHeight: \"500px\",\r\n padding: 3,\r\n },\r\n deleteButton: {\r\n position: \"absolute\",\r\n bottom: 0,\r\n right: 0,\r\n zIndex: 10,\r\n },\r\n test: {\r\n background: \"green\",\r\n },\r\n});\r\n\r\nconst ProjectModuleTiles = (props) => {\r\n const {\r\n classes,\r\n availableTypes,\r\n projectType,\r\n onProjectType,\r\n onProjectTypeChange,\r\n } = props;\r\n\r\n return (\r\n \r\n \r\n {availableTypes.map((tile) => (\r\n onProjectType(tile.name)}\r\n className={classNames(\r\n classes.projectTile,\r\n projectType === tile.name && classes.projectTileSelected\r\n )}\r\n >\r\n {tile.isUserModule && (\r\n {\r\n Backend.deleteProjectModuleType(tile.name, () => {\r\n window.showSuccessSnackbar(\r\n \"Project Type \" + tile.name + \" sucessfully deleted!\"\r\n );\r\n onProjectTypeChange();\r\n });\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n )}\r\n\r\n \r\n
    {tile.label}
    \r\n \r\n ))}\r\n \r\n
    \r\n );\r\n};\r\n\r\nProjectModuleTiles.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n availableTypes: PropTypes.array,\r\n projectType: PropTypes.string,\r\n onProjectType: PropTypes.func,\r\n onProjectTypeChange: PropTypes.func,\r\n};\r\nclass ModuleSelectionDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this._isMounted = false;\r\n\r\n this.state = {\r\n submitted: false,\r\n projectTypes: [],\r\n selectedProjectType: null,\r\n projectType: \"\",\r\n };\r\n this.updateProjectTypes();\r\n }\r\n\r\n componentDidMount = () => {\r\n this._isMounted = true;\r\n };\r\n\r\n componentWillUnmount = () => {\r\n this._isMounted = false;\r\n };\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n updateProjectTypes = () => {\r\n Backend.loadAvailableProjectTypes((projectTypes) => {\r\n // order project types by order attribute\r\n projectTypes = projectTypes.sort((a, b) => a.order - b.order);\r\n\r\n // write received info into state\r\n this.setMountedState({\r\n projectTypes: projectTypes,\r\n });\r\n });\r\n };\r\n\r\n componentDidUpdate(prevProps) {\r\n // on open dialog\r\n if (prevProps.open !== this.props.open && this.props.open) {\r\n this.updateProjectTypes();\r\n }\r\n }\r\n\r\n onProjectType = (e) => {\r\n if (this.props.project) {\r\n window.openWarningDialog(\r\n \"Project already created and the Project Type can't be changed afterwards.\\nPlease create a new Project instead.\"\r\n );\r\n } else {\r\n this.setMountedState({ projectType: e });\r\n }\r\n };\r\n\r\n handleClose = () => {\r\n this.props.onClose();\r\n };\r\n\r\n handleOK = () => {\r\n let selectedProjectType = this.state.projectTypes.find(\r\n (item) => item.name === this.state.projectType\r\n );\r\n this.props.onSelectProject(selectedProjectType);\r\n };\r\n\r\n render() {\r\n const { classes, ...other } = this.props;\r\n const { projectType, projectTypes } = this.state;\r\n\r\n return (\r\n \r\n Project Module\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nModuleSelectionDialog.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n onClose: PropTypes.func,\r\n onSelectProject: PropTypes.func,\r\n open: PropTypes.bool,\r\n project: PropTypes.object,\r\n};\r\n\r\nexport default withStyles(styles)(ModuleSelectionDialog);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport ModuleSelectionDialog from \"./ModuleSelectionDialog\";\r\nimport {\r\n Grid,\r\n Typography,\r\n IconButton,\r\n Card,\r\n CardContent,\r\n Tooltip,\r\n Button,\r\n} from \"@mui/material\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport {\r\n faImages,\r\n faCube,\r\n faFillDrip,\r\n faPen,\r\n faPencilRuler,\r\n faDrawPolygon,\r\n faClone,\r\n faMousePointer,\r\n faCamera,\r\n faDownload,\r\n faSquareFull,\r\n faTable,\r\n faThLarge,\r\n faBrain,\r\n faHandPointer,\r\n} from \"@fortawesome/free-solid-svg-icons\";\r\nimport { faCircle } from \"@fortawesome/free-regular-svg-icons\";\r\nimport RateReviewIcon from \"@mui/icons-material/RateReview\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport {\r\n ViewQuilt,\r\n Save,\r\n ZoomOutMap,\r\n CheckBoxOutlineBlank,\r\n ZoomIn,\r\n} from \"@mui/icons-material\";\r\nimport PublishIcon from \"@mui/icons-material/Publish\";\r\nimport GetAppIcon from \"@mui/icons-material/GetApp\";\r\nimport SortIcon from \"@mui/icons-material/Sort\";\r\nimport ScatterPlotIcon from \"@mui/icons-material/ScatterPlot\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n width: \"100%\",\r\n height: \"calc(100vh - 64px - 48px)\",\r\n overflow: \"hidden\",\r\n },\r\n paper: {\r\n padding: 20,\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n },\r\n activeColor: {\r\n color: theme.palette.primary.main,\r\n },\r\n textIcon: {\r\n fontSize: 18,\r\n fontWeight: \"bold\",\r\n },\r\n tileContainer: {\r\n position: \"relative\",\r\n width: 270,\r\n height: 180,\r\n overflow: \"hidden\",\r\n },\r\n textInputField: {\r\n width: \"calc(100% - 320px)\",\r\n },\r\n previewDiv: {\r\n cursor: \"pointer\",\r\n background: \"gray\",\r\n color: \"white\",\r\n top: \"50%\",\r\n width: \"100%\",\r\n position: \"relative\",\r\n height: 180,\r\n textAlign: \"center\",\r\n fontSize: 40,\r\n lineHeight: \"150px\",\r\n },\r\n tileImage: {\r\n width: \"100%\",\r\n position: \"relative\",\r\n cursor: \"pointer\",\r\n },\r\n previewIcon: {\r\n marginTop: \"-8px\",\r\n },\r\n tileBar: {\r\n position: \"absolute\",\r\n left: \"0\",\r\n bottom: \"0\",\r\n width: \"100%\",\r\n height: \"auto\",\r\n padding: \"14px\",\r\n fontFamily: \"Roboto, Helvetica, Arial, sans-serif\",\r\n fontSize: \"1em\",\r\n color: \"white\",\r\n background: \"rgba(0,0,0,0.5)\",\r\n },\r\n middleStructuresColumn: {\r\n float: \"left\",\r\n marginRight: 10,\r\n },\r\n});\r\n\r\nclass ModuleCreationContainer extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this._isMounted = false;\r\n this.state = {\r\n isDevState: false,\r\n previewFile: null,\r\n previewImgUrl: \"\",\r\n dialogOpen: false,\r\n selectedProject: null,\r\n name: \"\",\r\n moduleIdError: false,\r\n moduleLabelError: false,\r\n previewError: false,\r\n noStructuresError: false,\r\n project: {\r\n isUserModule: true,\r\n label: \"\",\r\n description: \"\",\r\n annotations: \"pixel\",\r\n order: 0,\r\n metaData: [\r\n \"Datum\",\r\n \"Versuchsnummer\",\r\n \"AK Verdünnung\",\r\n \"Mitarbeiter\",\r\n \"Färbung\",\r\n \"AK\",\r\n ],\r\n ProjectProperties: {\r\n AutomaticBaseRoiWholeImage: false,\r\n Hidden: false,\r\n HideSubMenus: false,\r\n Online: false,\r\n PreventOverlap: true,\r\n PreventOverlapSame: true,\r\n },\r\n ProjectStringProperties: {\r\n SideBarWidth: \"\",\r\n },\r\n toolsInProject: {\r\n GalleryTool: true,\r\n TilesTool: false,\r\n AdjustLayoutTool: true,\r\n FilterAnnotationsTool: true,\r\n PlotNearestTool: false,\r\n DrawRectangleAnnotationTool: true,\r\n DrawEllipseAnnotationTool: true,\r\n DrawPixelAnnotationTool: true,\r\n DrawRegionAnnotationTool: true,\r\n SelectRegionAnnotationTool: true,\r\n CopyRegionAnnotationTool: true,\r\n FillHoleAnnotationTool: true,\r\n OtherTools: true,\r\n CommentTool: true,\r\n ScreenshotTool: true,\r\n ZoomOriginalTool: true,\r\n ZoomInOutTool: true,\r\n ZoomFitTool: true,\r\n SaveTool: true,\r\n LandmarkTool: true,\r\n RoiResizeTool: true,\r\n HeatmapTool: true,\r\n SaveImagesTool: false,\r\n PassiveLearningTool: false,\r\n ApplyModelTool: false,\r\n RoiTab: true,\r\n AICockpit: true,\r\n ResultTab: false,\r\n AITrainingTool: false,\r\n ShowALTabTool: false,\r\n GridTool: false,\r\n GridAnnotationTool: true,\r\n GalleryTrainingTool: false,\r\n },\r\n structures: [\r\n {\r\n id: 1,\r\n label: \"Base ROI\",\r\n color: \"rgba(0, 0, 0, 0.0)\",\r\n inversed: \"true\",\r\n toolNames: [\"iam_base_roi\"],\r\n },\r\n ],\r\n dynamicStructure: {\r\n label: \"Structure {}\",\r\n toolNames: [],\r\n },\r\n models: [],\r\n job: \"job_simple_analysis\",\r\n },\r\n };\r\n\r\n Backend.loadReducedAvailableProjectTypes((projectTypes) => {\r\n if (\r\n projectTypes.some((projectType) => projectType.name === \"testProject\")\r\n ) {\r\n this.setMountedState({ isDevState: true });\r\n }\r\n });\r\n }\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n }\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n setProject = (obj) => {\r\n let projectObject = this.state.project;\r\n const structureKeys = [\r\n \"id\",\r\n \"label\",\r\n \"color\",\r\n \"toolNames\",\r\n \"inversed\",\r\n \"parentId\",\r\n \"classificationSubtype\",\r\n ];\r\n\r\n Object.keys(projectObject).forEach((key) => {\r\n if (key in obj) {\r\n if (key === \"structures\") {\r\n projectObject[\"structures\"] = [];\r\n for (let structure of obj[\"structures\"]) {\r\n let structureObj = {};\r\n for (let k of structureKeys) {\r\n if (k in structure) {\r\n structureObj[k] = structure[k];\r\n }\r\n }\r\n projectObject[\"structures\"].push(structureObj);\r\n }\r\n } else {\r\n projectObject[key] = obj[key];\r\n }\r\n }\r\n });\r\n this.setMountedState({ project: projectObject });\r\n };\r\n\r\n handleStructureSelect = ({ target }) => {\r\n let uploadedFile = target.files[0];\r\n if (typeof uploadedFile === \"undefined\") return false;\r\n\r\n if (\r\n !(uploadedFile.type === \"\" && uploadedFile.name.endsWith(\".strhsa\")) &&\r\n uploadedFile.type !== \"application/json\"\r\n ) {\r\n window.showErrorSnackbar(\"Wrong file type == \" + uploadedFile.type);\r\n return false;\r\n }\r\n\r\n if (uploadedFile) {\r\n let readFile = new FileReader();\r\n readFile.onload = (e) => {\r\n let contents = e.target.result;\r\n let structures = JSON.parse(contents);\r\n let resultStructures = [];\r\n for (let structure of structures) {\r\n let tempStructure = {\r\n id: structure.id,\r\n label: structure.label,\r\n color: structure.color,\r\n toolNames: structure.toolNames ? structure.toolNames : [],\r\n };\r\n if (structure.inversed) {\r\n tempStructure.inversed = structure.inversed;\r\n }\r\n if (structure.parentId) {\r\n tempStructure.parentId = structure.parentId;\r\n }\r\n if (structure.classificationSubtype) {\r\n tempStructure.classificationSubtype =\r\n structure.classificationSubtype;\r\n }\r\n resultStructures.push(tempStructure);\r\n }\r\n this.setProject({\r\n structures: resultStructures,\r\n });\r\n this.setMountedState({\r\n noStructuresError: false,\r\n });\r\n };\r\n readFile.readAsText(uploadedFile);\r\n } else {\r\n console.log(\"Failed to load file\");\r\n }\r\n };\r\n\r\n handlePreviewSelect = ({ target }) => {\r\n if (target.files.length > 0) {\r\n this.setMountedState({\r\n previewError: false,\r\n previewFile: target.files[0],\r\n previewImgUrl: window.URL.createObjectURL(target.files[0]),\r\n });\r\n }\r\n };\r\n\r\n renderIcon(param) {\r\n switch (param) {\r\n case \"GalleryTool\":\r\n return ;\r\n case \"3DVisualisation\":\r\n return ;\r\n case \"TilesTool\":\r\n return ;\r\n case \"FilterAnnotationsTool\":\r\n return ;\r\n case \"PlotNearestTool\":\r\n return ;\r\n case \"AdjustLayoutTool\":\r\n return ;\r\n case \"DrawRectangleAnnotationTool\":\r\n return ;\r\n case \"DrawPixelAnnotationTool\":\r\n return ;\r\n case \"DrawMagicWandAnnotationTool\":\r\n return ;\r\n case \"DrawRegionAnnotationTool\":\r\n return ;\r\n case \"DrawEllipseAnnotationTool\":\r\n return ;\r\n case \"FillHoleAnnotationTool\":\r\n return ;\r\n case \"SelectRegionAnnotationTool\":\r\n return ;\r\n case \"TilesClassificationTool\":\r\n return ;\r\n case \"CopyRegionAnnotationTool\":\r\n return ;\r\n case \"AITrainingTool\":\r\n return ;\r\n case \"GridTool\":\r\n return ;\r\n case \"OtherTools\":\r\n return ;\r\n case \"SaveImagesTool\":\r\n return ;\r\n case \"CommentTool\":\r\n return ;\r\n case \"ScreenshotTool\":\r\n return ;\r\n case \"ZoomOriginalTool\":\r\n return
    1:X
    ;\r\n case \"ZoomFitTool\":\r\n return ;\r\n case \"ZoomInOutTool\":\r\n return ;\r\n case \"SaveTool\":\r\n return ;\r\n case \"PassiveLearningTool\":\r\n case \"RoiTab\":\r\n return ;\r\n case \"AICockpit\":\r\n case \"ShowALTabTool\":\r\n case \"ApplyModelTool\":\r\n return ;\r\n default:\r\n return ;\r\n }\r\n }\r\n\r\n onCreateProjectType = () => {\r\n let missingInput = false;\r\n if (this.state.name === \"\") {\r\n window.showErrorSnackbar(\"Please set a Module ID\");\r\n this.setMountedState({\r\n moduleIdError: true,\r\n });\r\n missingInput = true;\r\n }\r\n if (this.state.project.label === \"\") {\r\n this.setMountedState({\r\n moduleLabelError: true,\r\n });\r\n window.showErrorSnackbar(\"Please set a Module Name\");\r\n }\r\n if (this.state.previewImgUrl === \"\") {\r\n this.setMountedState({\r\n previewError: true,\r\n });\r\n window.showErrorSnackbar(\"Please select a Preview Image\");\r\n missingInput = true;\r\n }\r\n if (this.state.previewImgUrl.includes(\"data:image\")) {\r\n this.setMountedState({\r\n previewError: true,\r\n });\r\n window.showErrorSnackbar(\"Please select your own Preview Image\");\r\n missingInput = true;\r\n }\r\n if (this.state.project.structures.length === 0) {\r\n this.setMountedState({\r\n noStructuresError: true,\r\n });\r\n window.showErrorSnackbar(\"Please select a valid structures file\");\r\n missingInput = true;\r\n }\r\n if (missingInput) return;\r\n Backend.loadReducedAvailableProjectTypes((projectTypes) => {\r\n if (projectTypes.find((item) => item.name === this.state.name)) {\r\n window.showErrorSnackbar(\r\n \"Project Module with ID \" + this.state.name + \" already exists!\"\r\n );\r\n this.setMountedState({ moduleIdError: true });\r\n return;\r\n }\r\n\r\n let projectObject = this.state.project;\r\n projectObject.isUserModule = true;\r\n\r\n // create json file\r\n Backend.createProjectModuleTypeJsonFile(\r\n this.state.name,\r\n projectObject,\r\n (response) => {\r\n if (response.success) {\r\n // if json file was created, create image with same name as well\r\n Backend.createProjectModuleTypeImage(\r\n this.state.name,\r\n this.state.previewFile,\r\n (response) => {\r\n if (response.success) {\r\n window.showSuccessSnackbar(\r\n \"Project Module \" +\r\n this.state.project.label +\r\n \" succesfully created\"\r\n );\r\n }\r\n }\r\n );\r\n }\r\n }\r\n );\r\n });\r\n };\r\n renderPreviewImage = () => {\r\n let imagePreview;\r\n if (this.state.previewImgUrl === \"\") {\r\n imagePreview = (\r\n document.getElementById(\"selectImage\").click()}\r\n className={this.props.classes.previewDiv}\r\n >\r\n {\" \"}\r\n Preview\r\n \r\n \r\n );\r\n } else {\r\n imagePreview = (\r\n document.getElementById(\"selectImage\").click()}\r\n src={this.state.previewImgUrl}\r\n className={this.props.classes.tileImage}\r\n alt=\"\"\r\n />\r\n );\r\n }\r\n return (\r\n \r\n {imagePreview}\r\n \r\n \r\n );\r\n };\r\n\r\n onSelectProject = (projectType) => {\r\n console.log(\"projectType:\", projectType);\r\n this.setMountedState({\r\n name: projectType.name,\r\n dialogOpen: false,\r\n });\r\n this.setProject(projectType);\r\n };\r\n\r\n exportSelectedProjectType = () => {\r\n Backend.loadReducedAvailableProjectTypes((projectTypes) => {\r\n if (projectTypes.find((item) => item.name === this.state.name)) {\r\n Backend.exportProjectTypes(\r\n [this.state.name],\r\n this.state.name,\r\n (response) => {\r\n window.showSuccessSnackbar(\"Project Module exported!\");\r\n console.log(\"response:\", response);\r\n }\r\n );\r\n } else {\r\n window.showErrorSnackbar(\"module does not exist!\");\r\n }\r\n });\r\n };\r\n\r\n exportNewProjectTypes = () => {\r\n Backend.loadAvailableProjectTypes((projectTypes) => {\r\n let ownProjectTypes = projectTypes\r\n .filter((item) => item.isUserModule)\r\n .map((item) => item.name);\r\n if (ownProjectTypes.length > 0) {\r\n Backend.exportProjectTypes(\r\n ownProjectTypes,\r\n \"project_modules\",\r\n (response) => {\r\n window.showSuccessSnackbar(\"Project Modules exported!\");\r\n console.log(\"response:\", response);\r\n }\r\n );\r\n } else {\r\n window.showErrorSnackbar(\"No Project Modules created to export!\");\r\n }\r\n });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { isDevState } = this.state;\r\n return (\r\n \r\n \r\n \r\n \r\n Create Project Module\r\n \r\n \r\n {Object.keys(this.state.project.toolsInProject).map(\r\n (key, idx) => (\r\n \r\n {\r\n let toolsInProjectObject =\r\n this.state.project.toolsInProject;\r\n toolsInProjectObject[key] = !toolsInProjectObject[key];\r\n this.setProject({\r\n toolsInProject: toolsInProjectObject,\r\n });\r\n }}\r\n size=\"large\"\r\n >\r\n {this.renderIcon(key)}\r\n \r\n \r\n )\r\n )}\r\n \r\n\r\n \r\n
    \r\n
    \r\n {this.renderPreviewImage()}\r\n\r\n
    \r\n {this.state.project.label}\r\n
    \r\n
    \r\n
    \r\n \r\n document.getElementById(\"selectStructures\").click()\r\n }\r\n >\r\n \r\n {this.state.project.structures.length} Structures\r\n {\" \"}\r\n \r\n
    \r\n\r\n this.exportSelectedProjectType()}\r\n >\r\n Export selected Project Module\r\n \r\n
    \r\n this.exportNewProjectTypes()}\r\n >\r\n Export all new Project Modules\r\n \r\n
    \r\n {\r\n document.getElementById(\"selectImportFile\").click();\r\n }}\r\n >\r\n Import Project Modules\r\n \r\n\r\n {\r\n console.log(\"file:\", e.target.files);\r\n if (e.target.files.length > 0) {\r\n Backend.importProjectTypes(\r\n e.target.files[0],\r\n (response) => {\r\n console.log(\"response:\", response);\r\n }\r\n );\r\n }\r\n }}\r\n />\r\n
    \r\n
    \r\n this.setMountedState({ dialogOpen: true })}\r\n >\r\n Open existing Project Modules\r\n \r\n this.setMountedState({ dialogOpen: false })}\r\n onSelectProject={this.onSelectProject}\r\n />\r\n
    \r\n \r\n this.setMountedState({\r\n name: e.target.value,\r\n moduleIdError: false,\r\n })\r\n }\r\n />\r\n \r\n this.setProject({\r\n label: e.target.value,\r\n moduleLabelError: false,\r\n })\r\n }\r\n />\r\n \r\n this.setProject({ description: e.target.value })\r\n }\r\n />\r\n
    \r\n
    \r\n
    \r\n \r\n create new Project Type\r\n \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nModuleCreationContainer.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(ModuleCreationContainer);\r\n","import React from \"react\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport VisibilityIcon from \"@mui/icons-material/Visibility\";\r\nimport VisibilityOffIcon from \"@mui/icons-material/VisibilityOff\";\r\n\r\nimport { styled } from \"@mui/material/styles\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nconst StyledIconButton = styled(IconButton)(({ theme, checked }) => ({\r\n color: \"#757575\",\r\n padding: 12,\r\n \"& svg\": {\r\n fontSize: \"1.5rem\",\r\n ...(checked && {\r\n color: theme.palette.primary.main,\r\n }),\r\n },\r\n}));\r\nconst EyeIconButton = (props) => {\r\n const { checked, onClick, ...rest } = props;\r\n\r\n return (\r\n \r\n {checked ? : }\r\n \r\n );\r\n};\r\n\r\nEyeIconButton.propTypes = {\r\n checked: PropTypes.bool,\r\n onClick: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default EyeIconButton;\r\n","import { isInt } from \"./Utils\";\r\n\r\n/**\r\n * Predetermined colors to be used.\r\n */\r\nexport const presetColors = [\r\n \"#e6194b\",\r\n \"#3cb44b\",\r\n \"#ffe119\",\r\n \"#4363d8\",\r\n \"#f58231\",\r\n \"#911eb4\",\r\n \"#46f0f0\",\r\n \"#f032e6\",\r\n \"#bcf60c\",\r\n \"#fabebe\",\r\n \"#008080\",\r\n \"#e6beff\",\r\n \"#9a6324\",\r\n \"#fffac8\",\r\n \"#800000\",\r\n \"#aaffc3\",\r\n \"#808000\",\r\n \"#ffd8b1\",\r\n \"#000075\",\r\n \"#808080\",\r\n \"#000000\",\r\n];\r\n\r\n/**\r\n * Get a random color, the first 21 colors are predetermined.\r\n * @param {int} colorIdx Optional. Used when querying a color and wanting to use the predetermined colors. Defaults to -1.\r\n * @returns {string} A string representing a color #01234EF.\r\n */\r\nexport function getRandomColor(colorIdx = null) {\r\n if (colorIdx !== null && (!isInt(colorIdx) || colorIdx < 0))\r\n throw TypeError(\r\n `colorIdx must be of type integer >= 0, received ${typeof colorIdx}: ${colorIdx}`\r\n );\r\n\r\n var letters = \"0123456789ABCDEF\";\r\n var color = \"#\";\r\n if (colorIdx >= 0 && colorIdx < presetColors.length) {\r\n color = presetColors[colorIdx];\r\n colorIdx++;\r\n } else {\r\n for (var i = 0; i < 6; i++) {\r\n color += letters[Math.floor(Math.random() * 16)];\r\n }\r\n }\r\n return color;\r\n}\r\n\r\n/**\r\n * Get a color currently not used in structures.\r\n * @param {array} structures Existing structures.\r\n * @returns {string} A string representing a color #01234EF.\r\n */\r\nexport function getUnusedColor(structures) {\r\n if (!Array.isArray(structures))\r\n throw TypeError(\r\n `structures must be of type Array, received ${typeof structures}: ${structures}`\r\n );\r\n\r\n let counter = 0;\r\n let color = getRandomColor(counter);\r\n while (structures.some((s) => s.color === color) && counter < 50) {\r\n counter++;\r\n color = getRandomColor(counter);\r\n }\r\n return color;\r\n}\r\n","import React, { useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { HexAlphaColorPicker } from \"react-colorful\";\r\nimport { makeStyles } from \"@mui/styles\";\r\nimport \"../../css/colorpicker.css\";\r\nimport { presetColors } from \"../utils/RandomColorGenerator\";\r\n\r\nconst useStyles = makeStyles({\r\n popover: {\r\n position: \"relative\",\r\n },\r\n pickerContainer: {\r\n position: \"fixed\",\r\n zIndex: \"2\",\r\n marginRight: \"10px\",\r\n padding: \"16px\",\r\n borderRadius: \"5px\",\r\n background: \"#33333a\",\r\n boxShadow: \"0 6px 12px #999\",\r\n },\r\n color: {\r\n width: \"36px\",\r\n height: \"14px\",\r\n borderRadius: \"2px\",\r\n },\r\n mainSwatch: {\r\n padding: \"5px\",\r\n background: \"#fff\",\r\n borderRadius: \"1px\",\r\n boxShadow: \"0 0 0 1px rgba(0,0,0,.1)\",\r\n display: \"inline-block\",\r\n cursor: \"pointer\",\r\n marginTop: 6,\r\n },\r\n cover: {\r\n position: \"fixed\",\r\n top: \"0px\",\r\n right: \"0px\",\r\n bottom: \"0px\",\r\n left: \"0px\",\r\n zIndex: \"1\",\r\n },\r\n pickerSwatches: {\r\n display: \"flex\",\r\n flexWrap: \"wrap\",\r\n paddingTop: \"12px\",\r\n justifyContent: \"center\",\r\n },\r\n pickerSwatch: {\r\n width: \"20px\",\r\n aspectRatio: \"1\",\r\n margin: \"4px\",\r\n border: \"none\",\r\n padding: 0,\r\n borderRadius: \"4px\",\r\n cursor: \"pointer\",\r\n outline: \"none\",\r\n },\r\n});\r\n\r\n/**\r\n * Color picker that uses the SketchPicker from react-colorful.\r\n * @param {string} color The color to display as a hex string.\r\n * @param {function} handleChange Callback function that receives the new color as a hex string.\r\n * @param {function} onClose Callback function that is called when the color picker is closed.\r\n * @param {bool} includeWhite Flag if the color white should be included in the color swatches.\r\n * @returns\r\n */\r\nconst SketchColorPicker = (props) => {\r\n const { color, handleChange, onClose, includeWhite } = props;\r\n const [displayColorPicker, setDisplayColorPicker] = useState(false);\r\n const [xPosition, setXPosition] = useState(0);\r\n const [yPosition, setYPosition] = useState(0);\r\n\r\n let colorsForSwatches = presetColors;\r\n if (includeWhite) {\r\n colorsForSwatches = [\"#ffffff\", ...presetColors];\r\n }\r\n\r\n const handleClick = (e) => {\r\n let x = e.clientX;\r\n let y = e.clientY;\r\n if (window.innerHeight - e.clientY < 330) {\r\n y -= 250;\r\n }\r\n if (window.innerWidth - e.clientX < 330) {\r\n x -= 150;\r\n }\r\n setXPosition(x);\r\n setYPosition(y);\r\n setDisplayColorPicker(true);\r\n e.stopPropagation();\r\n };\r\n\r\n const handleClose = (e) => {\r\n setDisplayColorPicker(false);\r\n e.stopPropagation();\r\n onClose();\r\n };\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n {displayColorPicker && [\r\n
    ,\r\n \r\n \r\n
    \r\n {colorsForSwatches.map((presetColor) => (\r\n {\r\n handleChange(presetColor);\r\n e.stopPropagation();\r\n }}\r\n />\r\n ))}\r\n
    \r\n
    ,\r\n ]}\r\n
    \r\n );\r\n};\r\n\r\nSketchColorPicker.propTypes = {\r\n color: PropTypes.string.isRequired,\r\n handleChange: PropTypes.func,\r\n onClose: PropTypes.func,\r\n includeWhite: PropTypes.bool,\r\n};\r\n\r\nSketchColorPicker.defaultProps = {\r\n handleChange: () => {},\r\n onClose: () => {},\r\n includeWhite: false,\r\n};\r\n\r\nexport default SketchColorPicker;\r\n","import React, {\r\n useState,\r\n useRef,\r\n useImperativeHandle,\r\n forwardRef,\r\n} from \"react\";\r\nimport MuiTextField from \"@mui/material/TextField\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport { makeStyles } from \"@mui/styles\";\r\nimport SketchColorPicker from \"./../../common/components/SketchColorPicker\";\r\n\r\nconst useStyles = makeStyles({\r\n root: {\r\n marginBottom: 20,\r\n },\r\n selectFieldDatatype: {\r\n width: 300,\r\n marginRight: 5,\r\n },\r\n selectFieldDefault: {\r\n lineHeight: \"40px\",\r\n \"& .MuiIconButton-root\": {\r\n display: \"none\",\r\n },\r\n \"& .MuiSelect-select\": {\r\n height: \"22px\",\r\n \"& >div\": {\r\n display: \"none\",\r\n },\r\n },\r\n },\r\n defaultSelectInput: {\r\n lineHeight: \"40px\",\r\n \"& .MuiSelect-select\": {\r\n height: \"22px\",\r\n },\r\n },\r\n fab: {\r\n marginLeft: \"auto !important\",\r\n },\r\n\r\n newItem: {\r\n \"& >form\": {\r\n width: \"100%\",\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr auto\",\r\n },\r\n },\r\n});\r\n\r\n/* eslint-disable react/prop-types */\r\nconst CaseSettingsEditableOptionsMenu = (\r\n { data: { defaultValue, items }, idx },\r\n forwardedRef\r\n) => {\r\n const [newSelectionItemValue, setNewSelectionItemValue] = useState(\"\");\r\n const [selectedValue, setSelectedValue] = useState(defaultValue);\r\n const [selectionItems, setSelectionItems] = useState(items);\r\n const newItemInputRef = useRef(null);\r\n\r\n const classes = useStyles();\r\n\r\n const getOptionsData = () => {\r\n return {\r\n defaultValue: selectedValue,\r\n items: selectionItems,\r\n };\r\n };\r\n\r\n useImperativeHandle(forwardedRef, () => ({\r\n getOptionsData,\r\n }));\r\n\r\n const handleOnChangeDefault = (e) => {\r\n setSelectedValue(e.target.value);\r\n };\r\n\r\n const handleOnUpdateSelectionItem = (e) => {\r\n setNewSelectionItemValue(e.target.value);\r\n };\r\n\r\n const handleOnAddSelectionItem = (e) => {\r\n e.preventDefault();\r\n if (\r\n !newSelectionItemValue ||\r\n selectionItems.map((item) => item.label).includes(newSelectionItemValue)\r\n ) {\r\n setTimeout(() => {\r\n newItemInputRef.current.focus();\r\n }, 0);\r\n return;\r\n }\r\n const newSelectionItems = [\r\n ...selectionItems,\r\n { label: newSelectionItemValue, color: \"#ffffff\" },\r\n ];\r\n setSelectedValue(newSelectionItemValue);\r\n setNewSelectionItemValue(\"\");\r\n setSelectionItems(newSelectionItems);\r\n setTimeout(() => {\r\n newItemInputRef.current.focus();\r\n }, 0);\r\n };\r\n\r\n const handleOnDeleteSelectionItem = (e, itemIdx) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const updatedItems = [...selectionItems];\r\n updatedItems.splice(itemIdx, 1);\r\n if (selectedValue === selectionItems[itemIdx] && updatedItems.length > 0) {\r\n setSelectedValue(updatedItems[0]);\r\n } else if (updatedItems.length === 0) {\r\n setSelectedValue(\"\");\r\n }\r\n setSelectionItems(updatedItems);\r\n newItemInputRef.current.focus();\r\n };\r\n\r\n return (\r\n \r\n None\r\n {selectionItems.map((item, itemIdx) => (\r\n \r\n {item.label}\r\n\r\n {\r\n setSelectionItems((prevItems) => {\r\n const newItems = [...prevItems];\r\n newItems[itemIdx].color = newColor;\r\n return newItems;\r\n });\r\n }}\r\n />\r\n \r\n handleOnDeleteSelectionItem(e, itemIdx)}\r\n >\r\n \r\n \r\n \r\n \r\n ))}\r\n e.stopPropagation()}\r\n className={classes.newItem}\r\n >\r\n
    \r\n e.stopPropagation()}\r\n onChange={handleOnUpdateSelectionItem}\r\n inputRef={newItemInputRef}\r\n />\r\n e.stopPropagation()}>\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nCaseSettingsEditableOptionsMenu.displayName = \"CaseSettingsEditableOptionsMenu\";\r\n\r\nexport default forwardRef(CaseSettingsEditableOptionsMenu);\r\n","import React, { useRef, forwardRef, useImperativeHandle } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport {\r\n ListItem,\r\n TextField,\r\n MenuItem,\r\n Tooltip,\r\n IconButton,\r\n} from \"@mui/material\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport EyeIconButton from \"./EyeIconButton\";\r\nimport CaseSettingsEditableOptionsMenu from \"./CaseSettingsEditableOptionsMenu\";\r\nimport DragIndicatorIcon from \"@mui/icons-material/DragIndicator\";\r\n\r\nimport { makeStyles } from \"@mui/styles\";\r\n\r\nconst useStyles = makeStyles({\r\n selectFieldDatatype: {\r\n width: 300,\r\n marginRight: 5,\r\n },\r\n});\r\n\r\nconst types = {\r\n text: \"Text\",\r\n options: \"Options\",\r\n date: \"Date\",\r\n textArea: \"Text Area\",\r\n};\r\n\r\nconst CaseSettingsListItem = forwardRef((props, forwardedRef) => {\r\n const caseSettingsEditableOptionsMenuRef = useRef(null);\r\n\r\n const { data, idx, onDeleteRow } = props;\r\n const classes = useStyles();\r\n const [label, setLabel] = React.useState(data.label);\r\n const [dataType, setDataType] = React.useState(data.type);\r\n const [defaultValue, setDefaultValue] = React.useState(data.defaultValue);\r\n const [visible, setVisible] = React.useState(data.visible);\r\n\r\n const isDisabled = data.label === \"Case Acc#\";\r\n\r\n const getCaseData = () => {\r\n let items = [];\r\n let returnDefaultValue = defaultValue;\r\n if (dataType === types.options) {\r\n const optionsData =\r\n caseSettingsEditableOptionsMenuRef.current.getOptionsData();\r\n items = dataType === types.options ? optionsData.items : data.items;\r\n returnDefaultValue = optionsData.defaultValue;\r\n }\r\n\r\n return {\r\n label,\r\n type: dataType,\r\n defaultValue: returnDefaultValue,\r\n visible,\r\n items,\r\n };\r\n };\r\n\r\n useImperativeHandle(forwardedRef, () => ({\r\n getCaseData,\r\n }));\r\n\r\n return (\r\n \r\n {!isDisabled && (\r\n \r\n )}\r\n setDataType(e.target.value)}\r\n >\r\n {Object.keys(types).map((key, idx) => {\r\n return (\r\n \r\n {types[key]}\r\n \r\n );\r\n })}\r\n \r\n setLabel(e.target.value)}\r\n />\r\n {dataType === types.options && (\r\n \r\n )}\r\n {dataType === types.date && (\r\n {\r\n setDefaultValue(e.target.value);\r\n }}\r\n >\r\n None\r\n Current Date\r\n \r\n )}\r\n {dataType === types.text && (\r\n {\r\n setDefaultValue(e.target.value);\r\n }}\r\n />\r\n )}\r\n {dataType === types.textArea && (\r\n {\r\n setDefaultValue(e.target.value);\r\n }}\r\n />\r\n )}\r\n \r\n \r\n setVisible((prevValue) => !prevValue)}\r\n />\r\n \r\n \r\n\r\n \r\n \r\n onDeleteRow(idx)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n );\r\n});\r\n\r\nCaseSettingsListItem.displayName = \"CaseSettingsListItem\";\r\n\r\nCaseSettingsListItem.propTypes = {\r\n data: PropTypes.object.isRequired,\r\n idx: PropTypes.number.isRequired,\r\n onDeleteRow: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default CaseSettingsListItem;\r\n","import React, { useRef, useEffect } from \"react\";\r\nimport {\r\n Typography,\r\n Tooltip,\r\n Card,\r\n CardContent,\r\n CardActions,\r\n Button,\r\n Fab,\r\n} from \"@mui/material\";\r\n\r\nimport { DragDropContext, Droppable, Draggable } from \"react-beautiful-dnd\";\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\n// Icons\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\n\r\nimport { makeStyles } from \"@mui/styles\";\r\n\r\nimport CaseSettingsListItem from \"./CaseSettingsListItem\";\r\n\r\nconst useStyles = makeStyles({\r\n root: {\r\n marginBottom: 20,\r\n },\r\n selectFieldDatatype: {\r\n width: 300,\r\n marginRight: 5,\r\n },\r\n selectFieldDefault: {\r\n lineHeight: \"40px\",\r\n \"& .MuiIconButton-root\": {\r\n display: \"none\",\r\n },\r\n \"& .MuiSelect-select\": {\r\n height: \"22px\",\r\n },\r\n },\r\n defaultSelectInput: {\r\n lineHeight: \"40px\",\r\n \"& .MuiSelect-select\": {\r\n height: \"22px\",\r\n },\r\n },\r\n fab: {\r\n marginLeft: \"auto !important\",\r\n },\r\n});\r\n\r\nconst toColumnName = (inputString) => {\r\n return inputString\r\n .replace(/[^0-9a-zA-Z ]/g, \"\")\r\n .toLowerCase()\r\n .replace(/\\s+/g, \"_\");\r\n};\r\n\r\nconst CaseSettingsContainer = () => {\r\n const classes = useStyles();\r\n const cardContentRef = useRef(null); // create a ref\r\n const [caseCols, setCaseCols] = React.useState([]);\r\n const [listHeight, setListHeight] = React.useState(window.innerHeight - 350);\r\n const [savedAppsettings, setSavedAppsettings] = React.useState({});\r\n const [appsettings, setAppsettings] = React.useState({});\r\n\r\n React.useEffect(() => {\r\n Backend.readAppSettings().then((newAppsettings) => {\r\n const caseColumns = newAppsettings.caseColumns.map((caseCol) => {\r\n if (caseCol.items === null) {\r\n caseCol.items = [];\r\n }\r\n caseCol.visible =\r\n typeof caseCol.visible === \"undefined\" || caseCol.visible === \"true\";\r\n\r\n return caseCol;\r\n });\r\n setCaseCols(caseColumns);\r\n setAppsettings(newAppsettings);\r\n setSavedAppsettings(newAppsettings);\r\n });\r\n const handleResize = () => {\r\n setListHeight(window.innerHeight - 350);\r\n };\r\n\r\n window.addEventListener(\"resize\", handleResize);\r\n\r\n // Cleanup function to remove the event listener when the component unmounts or the effect runs again\r\n return () => {\r\n window.removeEventListener(\"resize\", handleResize);\r\n };\r\n }, []);\r\n\r\n // Create a ref for each CaseSettingsListItem\r\n const caseColRefs = useRef([]);\r\n useEffect(() => {\r\n caseColRefs.current = caseColRefs.current.slice(0, caseCols.length);\r\n }, [caseCols]);\r\n\r\n const isAppsettingsValid = () => {\r\n return Object.keys(appsettings).length > 4;\r\n };\r\n\r\n const onDeleteRow = (idx) => {\r\n setCaseCols((prevValues) => {\r\n let newCaseCols = [...prevValues];\r\n newCaseCols.splice(idx, 1);\r\n return newCaseCols;\r\n });\r\n };\r\n\r\n const handleConfirmation = async (deleteColumnData, newAppsettings) => {\r\n const continueSave = await window.openConfirmationDialog(\r\n deleteColumnData.length > 1\r\n ? \"Possible Data Loss detected\"\r\n : \"No Data loss detected!\",\r\n deleteColumnData.length > 1\r\n ? deleteColumnData.map((item, idx) =>
    {item}
    )\r\n : \"The changes seem to not have any effect on already existing Cases.\"\r\n );\r\n if (continueSave) {\r\n Backend.writeAppSettings(newAppsettings, (response) => {\r\n if (response.success) {\r\n window.showSuccessSnackbar(\"Case Settings saved!\");\r\n setSavedAppsettings(newAppsettings);\r\n } else {\r\n window.showErrorSnackbar(\r\n \"Something went wrong! Case Settings no saved!\"\r\n );\r\n }\r\n });\r\n }\r\n };\r\n\r\n const getValidatedCaseCols = () => {\r\n const result = caseCols.map((_, idx) => {\r\n const caseCol = caseColRefs.current[idx].getCaseData();\r\n const caseColIdx = savedAppsettings.caseColumns.findIndex(\r\n (caseColumn) => caseColumn.name === caseCol.name\r\n );\r\n if (caseColIdx === -1) {\r\n caseCol.name = toColumnName(caseCol.label);\r\n }\r\n return caseCol;\r\n });\r\n return result;\r\n };\r\n\r\n const onSave = () => {\r\n if (isAppsettingsValid()) {\r\n let newAppsettings = appsettings;\r\n newAppsettings.caseColumns = getValidatedCaseCols();\r\n\r\n // Same with writeAppSettings, to write table\r\n Backend.getPossibleCaseSettingsChanges(newAppsettings, (response) => {\r\n if (response.criticalColumns) {\r\n let deleteColumnData = [\r\n \"Do you really want to accept this change. You will lose the following Data of existing Cases?\",\r\n ];\r\n for (const [key, value] of Object.entries(response.criticalColumns)) {\r\n const column = savedAppsettings.caseColumns.find(\r\n (item) => item.name === key\r\n );\r\n deleteColumnData.push(\r\n `${column ? column.label : key} with ${value} non empty ${\r\n value === 1 ? \"entry\" : \"entries\"\r\n }!`\r\n );\r\n }\r\n handleConfirmation(deleteColumnData, newAppsettings);\r\n }\r\n });\r\n } else {\r\n window.showErrorSnackbar(\"Error: Something went wrong!\");\r\n }\r\n };\r\n\r\n const onDragEnd = (result) => {\r\n if (!result.destination) {\r\n return;\r\n }\r\n\r\n setCaseCols((prevValues) => {\r\n let newCaseCols = [...prevValues];\r\n const [reorderedItem] = newCaseCols.splice(result.source.index, 1);\r\n newCaseCols.splice(result.destination.index, 0, reorderedItem);\r\n return newCaseCols;\r\n });\r\n };\r\n\r\n const addRow = () => {\r\n setCaseCols((prevCaseCols) => [\r\n ...prevCaseCols,\r\n {\r\n name: \"case_setting_\" + prevCaseCols.length,\r\n label: \"Case Setting \" + prevCaseCols.length,\r\n type: \"Text\",\r\n defaultValue: \"\",\r\n items: [],\r\n },\r\n ]);\r\n const cardContentEl = cardContentRef.current; // get the DOM element\r\n if (cardContentEl) {\r\n cardContentEl.scrollTo({\r\n top: cardContentEl.scrollHeight,\r\n behavior: \"smooth\",\r\n });\r\n setTimeout(\r\n () =>\r\n cardContentEl.scrollTo({\r\n top: cardContentEl.scrollHeight,\r\n behavior: \"smooth\",\r\n }),\r\n 100\r\n );\r\n }\r\n };\r\n\r\n const caseAccCol = caseCols.find((caseCol) => caseCol.label === \"Case Acc#\");\r\n\r\n const renderCol = (idx, data) => {\r\n return (\r\n (caseColRefs.current[idx] = el)}\r\n data={data}\r\n idx={idx}\r\n onDeleteRow={onDeleteRow}\r\n />\r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n Case Settings\r\n {caseAccCol && renderCol(0, caseAccCol)}\r\n \r\n \r\n {(provided) => (\r\n
    \r\n {caseCols.map((data, idx) => {\r\n if (data.label === \"Case Acc#\") {\r\n return null;\r\n }\r\n return (\r\n \r\n {(provided) => {\r\n return (\r\n \r\n {renderCol(idx, data)}\r\n
    \r\n );\r\n }}\r\n \r\n );\r\n })}\r\n
    {provided.placeholder}
    \r\n
    \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n Save\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\nexport default CaseSettingsContainer;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { Tabs, Tab, Container, Paper } from \"@mui/material\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport SystemContainer from \"./components/SystemContainer\";\r\nimport UsersContainer from \"./components/UsersContainer\";\r\nimport GroupsContainer from \"./components/GroupsContainer\";\r\nimport ImporterContainer from \"./components/ImporterContainer\";\r\nimport ModuleCreationContainer from \"./components/ModuleCreationContainer\";\r\nimport Backend from \"../common/utils/Backend\";\r\nimport CaseSettingsContainer from \"./components/CaseSettingsContainer\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n width: \"100%\",\r\n height: \"calc(100vh - 64px)\",\r\n overflow: \"auto\",\r\n },\r\n paper: {\r\n marginTop: theme.spacing(8),\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n },\r\n rootContent: {\r\n margin: 0,\r\n width: \"100%\",\r\n },\r\n});\r\n\r\nconst ActiveTab = Object.freeze({\r\n Users: 0,\r\n Groups: 1,\r\n Cases: 2,\r\n System: 3,\r\n Import: 4,\r\n ModuleCreation: 5,\r\n});\r\n\r\nclass AdminPage extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n groups: [],\r\n users: [],\r\n userGroupIds: [],\r\n isSuperAdmin: false,\r\n activeTab: ActiveTab.Users,\r\n user: {\r\n group: {\r\n canEditGroups: false,\r\n canEditUserGroups: false,\r\n canEditUsers: false,\r\n canSetJobRunTimes: false,\r\n canCreateModules: false,\r\n canUseSystemActions: false,\r\n canEditAutoImportSettings: false,\r\n },\r\n },\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.updateUserList();\r\n this.updateUser();\r\n }\r\n\r\n updateUser = () => {\r\n Backend.getCurrentUser((user) => {\r\n this.setState({\r\n user,\r\n });\r\n });\r\n };\r\n\r\n countPermissions = (group) => {\r\n let result = Object.values(group).reduce((accumulator, currentValue) => {\r\n if (currentValue === true) return accumulator + 1;\r\n else return accumulator;\r\n }, 0);\r\n return result;\r\n };\r\n\r\n updateGroups = () => {\r\n this.updateUser();\r\n Backend.loadGroupList((data) => {\r\n const groups = data.sort((a, b) => {\r\n if (a.name === \"Super Admin\") return -1;\r\n if (b.name === \"Super Admin\") return 1;\r\n return this.countPermissions(b) - this.countPermissions(a);\r\n });\r\n this.setState({ groups }, this.updateUserList);\r\n });\r\n };\r\n\r\n updateUserList = () => {\r\n Backend.loadUserList((data) => {\r\n this.setState({ users: data });\r\n });\r\n Backend.getCurrentUserGroups((response) => {\r\n const { groups } = this.state;\r\n\r\n const userGroupIds = response.map((item) => item.id);\r\n\r\n let isSuperAdmin = false;\r\n if (groups.length > 0) {\r\n const superAdminId = groups.find(\r\n (group) => group.name === \"Super Admin\"\r\n ).id;\r\n isSuperAdmin = userGroupIds.includes(superAdminId);\r\n }\r\n\r\n this.setState({ userGroupIds, isSuperAdmin });\r\n });\r\n };\r\n\r\n saveClick = () => {};\r\n\r\n onTabChange = (event, newValue) => {\r\n this.setState({ activeTab: newValue });\r\n };\r\n\r\n render() {\r\n const { user, userGroupIds, activeTab } = this.state;\r\n const { classes } = this.props;\r\n let activeComponent;\r\n switch (activeTab) {\r\n case ActiveTab.Users:\r\n activeComponent = (\r\n \r\n );\r\n break;\r\n case ActiveTab.Groups:\r\n activeComponent = (\r\n \r\n );\r\n break;\r\n case ActiveTab.Cases:\r\n activeComponent = ;\r\n break;\r\n case ActiveTab.System:\r\n activeComponent = (\r\n \r\n );\r\n break;\r\n case ActiveTab.Import:\r\n activeComponent = (\r\n \r\n );\r\n break;\r\n case ActiveTab.ModuleCreation:\r\n activeComponent = ;\r\n break;\r\n default:\r\n activeComponent = null;\r\n }\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {user.group.canCreateModules && (\r\n \r\n )}\r\n \r\n {activeComponent}\r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nAdminPage.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(AdminPage);\r\n","// Framework imports\r\nimport React, { useState, useEffect, useContext, useRef } from \"react\";\r\nimport { PropTypes } from \"prop-types\";\r\n\r\n// Package imports\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\n// HSA imports\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { roundToDecimal } from \"../../common/utils/Utils\";\r\n\r\nimport Structure from \"../../common/components/Structure\";\r\nimport {\r\n AudioRoi,\r\n ModificationStatus,\r\n RoiType,\r\n AnnotationAction,\r\n saveAnnotations,\r\n exportAnnotations,\r\n importAnnotations,\r\n deleteAllAnnotations,\r\n} from \"../../common/components/RoiTypes\";\r\nimport { AudioViewerContext } from \"../AudioViewer\";\r\nimport { AudioFileContext } from \"./AudioFileContainer\";\r\nimport { Tooltip } from \"@mui/material\";\r\n\r\n/**\r\n * Collected (reusable) styles for page elements.\r\n */\r\nconst styles = {\r\n root: {\r\n width: \"100%\",\r\n height: \"30px\",\r\n display: \"grid\",\r\n gridTemplateColumns: \"auto 1fr\",\r\n },\r\n label: {\r\n padding: \"0 5px\",\r\n whiteSpace: \"nowrap\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n },\r\n canvasContainer: {\r\n width: \"100%\",\r\n userSelect: \"none\",\r\n overflow: \"hidden\",\r\n },\r\n};\r\n\r\n/**\r\n * Distance in px to determine if something is nearby.\r\n */\r\nconst DELTA = 5;\r\n\r\n/**\r\n * Displays audio annotations of a given audio file / stream per structure.\r\n * Allows the creation, modification, and deletion of annotations per structure.\r\n * @param {object} file The file being annotated.\r\n * @param {object} structure The structure being annotated.\r\n * @param {bool} saveNow Request to save the annotations of this item.\r\n * @param {function} reportSaveStatus A way to report the current save status back. Receives (bool isSaved).\r\n * @param {bool} removeOverlaps Optional. Whether or not to remove overlaps between neighboring annotations. Defaults to true.\r\n * @param {number} mouseX Current horizontal mouse position relative to drawing canvas.\r\n * @param {function} setMouseX Set the current horizontal mouse position relative to drawing canvas. Receives (number mouseX)\r\n * @param {bool} isVisible Optional. Whether the annotation item is visible or not. Defaults to true.\r\n * @returns React node for AudioAnnotationItem\r\n */\r\nexport default function AudioAnnotationItem(props) {\r\n const {\r\n file,\r\n structure,\r\n saveNow,\r\n reportSaveStatus,\r\n removeOverlaps = true,\r\n mouseX,\r\n setMouseX,\r\n isVisible = true,\r\n visibleTimeRange,\r\n ...other\r\n } = props;\r\n\r\n const prevTimeRange = useRef(visibleTimeRange);\r\n\r\n // External project and file information\r\n const AudioViewer = useContext(AudioViewerContext);\r\n const { containerWidth } = AudioViewer;\r\n const AudioFile = useContext(AudioFileContext);\r\n const { isDrawing, setIsDrawing } = AudioViewer;\r\n\r\n // Canvas where annotations are drawn.\r\n const canvasContainer = React.useRef();\r\n const canvas = React.useRef();\r\n const [canvasWidth, setCanvasWidth] = useState(100);\r\n const [cursor, setCursor] = useState(\"inherit\");\r\n const [isKeyboardDrawing, setKeyboardDrawing] = useState(false);\r\n\r\n // Annotations\r\n const [annotations, setAnnotations] = useState([]);\r\n const data = React.useRef({\r\n currentAnnotation: null,\r\n actionState: null,\r\n }).current;\r\n\r\n //#region Effects\r\n\r\n // Load annotations on first render\r\n useEffect(() => {\r\n // Load annotations only for this file\r\n Backend.loadAnnotationsFromDB(\r\n AudioViewer.project.id,\r\n RoiType.AudioRoi,\r\n { fileId: file.id, structure: structure.id },\r\n (newRois) => setAnnotations(newRois),\r\n (err) =>\r\n window.showErrorSnackbar(\r\n `Could not load annotations of file ${file.label}:\\n${err}`\r\n )\r\n );\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!isDrawing && data.actionState !== null) {\r\n endAnnotation();\r\n }\r\n }, [isDrawing]);\r\n\r\n // Ensure to update canvas when annotations are updated\r\n useEffect(() => {\r\n updateCanvas();\r\n }, [\r\n annotations,\r\n mouseX,\r\n AudioFile.timestamp,\r\n AudioViewer.structures,\r\n AudioViewer.selectedStructure,\r\n visibleTimeRange,\r\n ]);\r\n\r\n // Resizing\r\n useEffect(() => {\r\n handleResize();\r\n }, [containerWidth]);\r\n\r\n // Save annotations on request\r\n useEffect(() => {\r\n if (!saveNow) return;\r\n saveAnnotations(\r\n AudioViewer.project.id,\r\n file,\r\n structure,\r\n RoiType.AudioRoi,\r\n annotations,\r\n (newAnnos) => {\r\n setAnnotations(newAnnos);\r\n reportSaveStatus(true);\r\n },\r\n () => reportSaveStatus(false)\r\n );\r\n }, [saveNow]);\r\n\r\n // Perform predefined actions on request\r\n useEffect(() => {\r\n // Find relevant export tasks for this structure/file combination\r\n const allTasks = AudioViewer.childActions;\r\n const ownTasks = AudioViewer.childActions.filter(\r\n (a) => a.fileId === file.id && a.structureId === structure.id\r\n );\r\n\r\n // None found -> Do nothing\r\n if (ownTasks.length === 0) return;\r\n\r\n ownTasks.forEach((task) => {\r\n switch (task.task) {\r\n case AnnotationAction.Save:\r\n // Save all annotations of this structure to database.\r\n saveAnnotations(\r\n AudioViewer.project.id,\r\n file,\r\n structure,\r\n RoiType.AudioRoi,\r\n annotations,\r\n (newAnnos) => {\r\n setAnnotations(newAnnos);\r\n reportSaveStatus(true);\r\n },\r\n () => reportSaveStatus(false)\r\n );\r\n break;\r\n\r\n case AnnotationAction.Export:\r\n // Export annotations to file.\r\n exportAnnotations(\r\n AudioViewer.user.fullName,\r\n AudioViewer.project,\r\n file,\r\n structure,\r\n RoiType.AudioRoi,\r\n annotations\r\n );\r\n break;\r\n\r\n case AnnotationAction.Import:\r\n // Import annotations from previously exported file.\r\n importAnnotations(\r\n RoiType.AudioRoi,\r\n annotations,\r\n file,\r\n structure,\r\n (newAnnos) => {\r\n setAnnotations(newAnnos);\r\n reportSaveStatus(false);\r\n window.showSuccessSnackbar(\r\n `Successfully imported annotations for ${structure.label}`\r\n );\r\n },\r\n (err) => {\r\n window.showErrorSnackbar(err);\r\n }\r\n );\r\n break;\r\n\r\n case AnnotationAction.DeleteAll:\r\n // Delete all annotations of this structure.\r\n deleteAllAnnotations(annotations, structure, (annos) => {\r\n setAnnotations(annos);\r\n reportSaveStatus(false);\r\n });\r\n\r\n break;\r\n\r\n default:\r\n console.error(\r\n `Unsupported action, received ${typeof task.task}: ${task.task}`\r\n );\r\n }\r\n\r\n // Remove task when completed\r\n allTasks.splice(\r\n allTasks.findIndex(\r\n (a) =>\r\n a.fileId === file.id &&\r\n a.structureId === structure.id &&\r\n a.task === task.task\r\n ),\r\n 1\r\n );\r\n });\r\n\r\n // Update global tasks\r\n AudioViewer.setChildActions(allTasks);\r\n }, [AudioViewer.childActions]);\r\n\r\n /**\r\n * Update Annotation on timestamp change.\r\n */\r\n useEffect(() => {\r\n if (!isKeyboardDrawing) return;\r\n if (!AudioViewer.isDrawing) return;\r\n if (!data.currentAnnotation?.x1) return;\r\n\r\n if (\r\n prevTimeRange.current &&\r\n prevTimeRange.current[0] !== visibleTimeRange[0]\r\n ) {\r\n const timeDeltaX = visibleTimeRange[0] - prevTimeRange.current[0];\r\n const pixelDeltaX =\r\n timeDeltaX *\r\n (canvasWidth / (visibleTimeRange[1] - visibleTimeRange[0]));\r\n\r\n updateAnnotation(\r\n data.currentAnnotation.x1 - pixelDeltaX,\r\n timestampToPx(AudioFile.timestamp)\r\n );\r\n prevTimeRange.current = visibleTimeRange;\r\n return;\r\n }\r\n\r\n updateAnnotation(\r\n data.currentAnnotation.x1,\r\n timestampToPx(AudioFile.timestamp)\r\n );\r\n }, [AudioFile.timestamp]);\r\n\r\n useEffect(() => {\r\n /**\r\n * Decide what happens on any keypress event.\r\n * @param {KeyboardEvent} e Keypress event.\r\n */\r\n const handleKeyPress = (e) => {\r\n if (AudioFile.disableKeyboardShortcuts) return;\r\n if (structure !== AudioViewer.selectedStructure) return;\r\n\r\n if (e.shiftKey) {\r\n // Key + Shiftkey\r\n switch (e.code) {\r\n case \"Enter\":\r\n if (AudioViewer.isDrawing) {\r\n // End drawing\r\n setKeyboardDrawing(false);\r\n setIsDrawing(false);\r\n endAnnotation();\r\n } else {\r\n // Begin drawing\r\n setKeyboardDrawing(true);\r\n setIsDrawing(true);\r\n data.actionState = \"deleting\";\r\n initializeAnnotation(\r\n timestampToPx(AudioFile.timestamp),\r\n \"deleting\"\r\n );\r\n }\r\n e.preventDefault();\r\n return;\r\n default:\r\n return;\r\n }\r\n }\r\n\r\n // Normal Key presses\r\n switch (e.code) {\r\n case \"Enter\":\r\n if (AudioViewer.isDrawing) {\r\n // End drawing\r\n setKeyboardDrawing(false);\r\n setIsDrawing(false);\r\n endAnnotation();\r\n } else {\r\n // Begin drawing\r\n setKeyboardDrawing(true);\r\n setIsDrawing(true);\r\n data.actionState = \"drawing\";\r\n initializeAnnotation(timestampToPx(AudioFile.timestamp), \"drawing\");\r\n }\r\n e.preventDefault();\r\n return;\r\n default:\r\n return;\r\n }\r\n };\r\n window.addEventListener(\"keydown\", handleKeyPress);\r\n return () => {\r\n window.removeEventListener(\"keydown\", handleKeyPress);\r\n };\r\n }, [AudioViewer.selectedStructure, AudioFile.timestamp, canvasWidth]);\r\n\r\n //#endregion\r\n //#region Helper functions\r\n\r\n /**\r\n * Get cursor positioon in canvas-coordinates.\r\n * @param {event} e Mouse event.\r\n * @returns {array} [x, y] position of cursor relative to canvas.\r\n */\r\n const getX = (e) => {\r\n const drawRect = canvas.current.getBoundingClientRect();\r\n const x = e.pageX - drawRect.x;\r\n return x;\r\n };\r\n\r\n /**\r\n * Check if an annotaion beginning or end is close to a horizontal mouse position.\r\n * @param {number} value Value to check against.\r\n * @param {number} x Horizontal position of cursor.\r\n * @returns {boolean} Whether the cursor is within the delta of the value to compare to.\r\n */\r\n const isValueNearby = (value, x) => {\r\n return x > value - DELTA && x < value + DELTA;\r\n };\r\n\r\n /**\r\n * Convert a pixel value to a timestamp proportional to the canvas width and audio duration.\r\n * @param {int} pxValue Pixel value of an annotation relative to its drawing canvas.\r\n * @returns {number} Timestamp of audio file with 3 digit precision.\r\n */\r\n const pxToTimestamp = (pxValue) => {\r\n return roundToDecimal(\r\n (pxValue / canvasWidth) * AudioFile.audio.duration(),\r\n 3\r\n );\r\n };\r\n\r\n /**\r\n * Convert a timestamp to a pixel value proportional to the canvas width and audio duration.\r\n * @param {number} timestampValue Timestamp of audiofile.\r\n * @returns {number} Pixel value of an annotation relative to its drawing canvas.\r\n */\r\n const timestampToPx = (timestampValue) => {\r\n const startTime = visibleTimeRange[0];\r\n const endTime =\r\n visibleTimeRange[1] > 0\r\n ? visibleTimeRange[1]\r\n : AudioFile.audio.duration();\r\n const visibleDuration = endTime - startTime;\r\n const visibleTimeStampValue = timestampValue - startTime;\r\n return roundToDecimal(\r\n (visibleTimeStampValue / visibleDuration) * canvasWidth,\r\n 1\r\n );\r\n };\r\n\r\n const timeAsPx = (timeValue) => {\r\n const visibleTimeStampValue = timeValue;\r\n return roundToDecimal(\r\n (visibleTimeStampValue / AudioFile.audio.duration()) * canvasWidth,\r\n 1\r\n );\r\n };\r\n\r\n const isOverlapping = (anno1, anno2) => {\r\n // return !(anno1.maxX < anno2.minX && anno1.minX > anno2.maxX);\r\n return !(anno1.maxX < anno2.minX || anno1.minX > anno2.maxX);\r\n };\r\n\r\n const isInside = (anno1, anno2) => {\r\n return (\r\n Math.min(anno1.minX, anno1.maxX) > Math.min(anno2.minX, anno2.maxX) &&\r\n Math.max(anno1.minX, anno1.maxX) < Math.max(anno2.minX, anno2.maxX)\r\n );\r\n };\r\n\r\n const isValueInside = (value, anno) => {\r\n return value > anno.minX && value < anno.maxX;\r\n };\r\n\r\n const getCanvasWidth = () => {\r\n return canvasContainer.current?.getBoundingClientRect().width;\r\n };\r\n\r\n const getPixelAnnotations = () => {\r\n // Show nothing with invisible annotations\r\n if (!structure.annotationsAreVisible) return [];\r\n return annotations\r\n .filter((a) => a.modificationStatus !== ModificationStatus.Deleted)\r\n .map((anno) => {\r\n return convertToPixelAnnotation(anno);\r\n });\r\n };\r\n\r\n /**\r\n * Get start and end of a saved AudioRoi, so it can be displayed inside canvas.\r\n * @param {AudioRoi} anno Annotation to display inside canvas.\r\n * @returns {object} Annotaion consisting of minX and maxX in px.\r\n */\r\n const convertToPixelAnnotation = (anno) => {\r\n return {\r\n minX: timestampToPx(anno.startTime),\r\n maxX: timestampToPx(anno.endTime),\r\n };\r\n };\r\n\r\n /**\r\n * Methods to execute on canvas resize\r\n */\r\n const handleResize = () => {\r\n setCanvasWidth(getCanvasWidth());\r\n setMouseX(Math.random()); //force update\r\n updateCanvas();\r\n };\r\n //#endregion\r\n\r\n //#region Annotation Operations\r\n\r\n /**\r\n * Initializes a new annotation on its first creation.\r\n * @param {number} x Hozizontal mouse position in px realtive to annotation canvas.\r\n * @param {string} newActionState Action state of canvas. Can be drawing, deleting, grab, grabbing, null.\r\n * @returns\r\n */\r\n const initializeAnnotation = (x, newActionState) => {\r\n prevTimeRange.current = visibleTimeRange;\r\n updateAnnotation(x, x);\r\n if (newActionState !== \"drawing\") return;\r\n\r\n for (let annoIdx in annotations) {\r\n const audioAnno = annotations[annoIdx];\r\n if (audioAnno.modificationStatus === ModificationStatus.Deleted) continue;\r\n const anno = convertToPixelAnnotation(audioAnno);\r\n\r\n if (isValueNearby(anno.minX, x)) {\r\n updateAnnotation(anno.maxX, x);\r\n annotations.splice(annoIdx, 1);\r\n break;\r\n } else if (isValueNearby(anno.maxX, x)) {\r\n updateAnnotation(anno.minX, x);\r\n annotations.splice(annoIdx, 1);\r\n break;\r\n } else if (isValueInside(x, anno)) {\r\n updateAnnotation(anno.minX, anno.maxX);\r\n annotations.splice(annoIdx, 1);\r\n if (!isKeyboardDrawing) setCursor(\"grabbing\");\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Updates an annotation with updated coordinates.\r\n * @param {number} x1 1st horizontal coordinate in px relative to canvas.\r\n * @param {number} x2 2nd horizontal coordinate in px relative to canvas.\r\n */\r\n const updateAnnotation = (x1, x2) => {\r\n data.currentAnnotation = {\r\n x1: x1,\r\n x2: x2,\r\n minX: Math.min(x1, x2),\r\n maxX: Math.max(x1, x2),\r\n };\r\n };\r\n\r\n /**\r\n * Convert a temporary, pixel-based annotation to an AudioRoi object and save it.\r\n * @param {object} tmpAnn Temporary, pixel-based annotation with minX and maxX properties.\r\n * @param {array} modifiedAnnotations Optional. Modified existing annotations to use instead of current annotatations. Defaults to current annotations.\r\n * @returns {AudioRoi} Completed AudioRoi object.\r\n */\r\n const finalizeAnnotation = (tmpAnn, modifiedAnnotations = annotations) => {\r\n const minX = Math.max(0, pxToTimestamp(tmpAnn.minX));\r\n const maxX = Math.min(\r\n pxToTimestamp(tmpAnn.maxX),\r\n AudioFile.audio.duration()\r\n );\r\n\r\n let tmpAnnotations = modifiedAnnotations;\r\n\r\n // Do not create zero-width annotations\r\n if (isNaN(minX) || isNaN(maxX) || minX === maxX) return;\r\n\r\n const newAnnotation = new AudioRoi(\r\n uuidv4(),\r\n file.id,\r\n structure.id,\r\n false,\r\n AudioViewer.user.id,\r\n ModificationStatus.Added,\r\n minX,\r\n maxX,\r\n 0,\r\n 32000,\r\n [0]\r\n );\r\n\r\n // Add new annotation\r\n tmpAnnotations.push(newAnnotation);\r\n setAnnotations(tmpAnnotations);\r\n\r\n // Mark annotations as changed\r\n reportSaveStatus(false);\r\n };\r\n\r\n const getAnnotationTransformed = (minX, maxX) => {\r\n if (visibleTimeRange[1] > 0) {\r\n const audioDuration = AudioFile.audio.duration();\r\n const deltaX = maxX - minX;\r\n const visibleDuration = visibleTimeRange[1] - visibleTimeRange[0];\r\n const factor = visibleDuration / audioDuration;\r\n const delatXTransofrmed = deltaX * factor;\r\n const minTimestampPx = timeAsPx(visibleTimeRange[0]);\r\n minX = minX * factor + minTimestampPx;\r\n maxX = minX + delatXTransofrmed;\r\n }\r\n return { minX, maxX };\r\n };\r\n\r\n const mergeOverlappingAnnotations = () => {\r\n let existingAnnotations = annotations;\r\n let { minX, maxX } = getAnnotationTransformed(\r\n data.currentAnnotation.minX,\r\n data.currentAnnotation.maxX\r\n );\r\n\r\n existingAnnotations\r\n .filter((a) => a.modificationStatus !== ModificationStatus.Deleted)\r\n .forEach((existingAnno) => {\r\n const anno = convertToPixelAnnotation(existingAnno);\r\n const transformedAnnot = getAnnotationTransformed(anno.minX, anno.maxX);\r\n if (isOverlapping(transformedAnnot, { minX, maxX })) {\r\n minX = Math.min(transformedAnnot.minX, minX);\r\n maxX = Math.max(transformedAnnot.maxX, maxX);\r\n // Delete modified existing annotation\r\n if (existingAnno.modificationStatus === ModificationStatus.Saved) {\r\n // Mark saved annotation as to delete.\r\n existingAnno.modificationStatus = ModificationStatus.Deleted;\r\n\r\n // Mark annotations as changed\r\n reportSaveStatus(false);\r\n } else {\r\n // Remove annotation not yet saved to database\r\n const existingAnnoIdx = existingAnnotations.findIndex(\r\n (a) => a.id === existingAnno.id\r\n );\r\n if (existingAnnoIdx > -1) {\r\n existingAnnotations.splice(existingAnnoIdx, 1);\r\n }\r\n }\r\n }\r\n });\r\n\r\n finalizeAnnotation({ minX, maxX });\r\n };\r\n\r\n const removeOverlapsFromAnnotation = () => {\r\n let { minX, maxX } = getAnnotationTransformed(\r\n data.currentAnnotation.minX,\r\n data.currentAnnotation.maxX\r\n );\r\n const annos = getPixelAnnotations();\r\n for (const anno of annos.sort((a, b) => a.minX - b.minX)) {\r\n let tempAnno = getAnnotationTransformed(anno.minX, anno.maxX);\r\n let minAnno = Math.min(tempAnno.minX, tempAnno.maxX);\r\n let maxAnno = Math.max(tempAnno.minX, tempAnno.maxX);\r\n if (isOverlapping({ minX, maxX }, tempAnno)) {\r\n if (isInside(tempAnno, { minX, maxX })) {\r\n if (minAnno - minX > 0) {\r\n const newAnnotation = { minX, maxX: minAnno };\r\n finalizeAnnotation(newAnnotation);\r\n }\r\n minX = maxAnno;\r\n } else {\r\n if (maxX > minAnno && maxX < maxAnno) {\r\n maxX = minAnno;\r\n }\r\n if (minX < maxAnno && minX > minAnno) {\r\n minX = maxAnno;\r\n }\r\n }\r\n }\r\n }\r\n if (maxX - minX > 0) {\r\n finalizeAnnotation({ minX, maxX });\r\n }\r\n };\r\n\r\n /**\r\n * Deletes existing annotations in selected area.\r\n * @param {object} deletionArea Object containing minX and maxX of area to delete.\r\n */\r\n const deleteAnnotation = (deletionArea) => {\r\n deletionArea = getAnnotationTransformed(\r\n deletionArea.minX,\r\n deletionArea.maxX\r\n );\r\n let existingAnnotations = annotations;\r\n const newAnnotations = [];\r\n for (let existingAnno of existingAnnotations.filter(\r\n (a) => a.modificationStatus !== ModificationStatus.Deleted\r\n )) {\r\n let anno = convertToPixelAnnotation(existingAnno);\r\n anno = getAnnotationTransformed(anno.minX, anno.maxX);\r\n if (!isOverlapping(deletionArea, anno)) continue;\r\n\r\n // Deleting area inside of an annotation.\r\n if (isInside(deletionArea, anno)) {\r\n newAnnotations.push({\r\n minX: anno.minX,\r\n maxX: deletionArea.minX,\r\n });\r\n newAnnotations.push({\r\n minX: deletionArea.maxX,\r\n maxX: anno.maxX,\r\n });\r\n }\r\n // Deleting an overlapping portion of an annotation.\r\n else if (!isInside(anno, deletionArea)) {\r\n if (isValueInside(anno.minX, deletionArea)) {\r\n anno.minX = deletionArea.maxX;\r\n } else {\r\n anno.maxX = deletionArea.minX;\r\n }\r\n newAnnotations.push(anno);\r\n }\r\n // Delete modified existing annotation\r\n if (existingAnno.modificationStatus === ModificationStatus.Saved) {\r\n // Mark saved annotation as to delete.\r\n existingAnno.modificationStatus = ModificationStatus.Deleted;\r\n\r\n // Mark annotations as changed\r\n reportSaveStatus(false);\r\n } else {\r\n // Remove annotation not yet saved to database\r\n existingAnnotations.splice(\r\n existingAnnotations.indexOf(existingAnno),\r\n 1\r\n );\r\n }\r\n }\r\n\r\n // Save all modified annotations\r\n for (const newAnno of newAnnotations) {\r\n finalizeAnnotation(newAnno, existingAnnotations);\r\n }\r\n\r\n // Only deleted annotations -> Save those to delete\r\n if (newAnnotations.length === 0) setAnnotations(existingAnnotations);\r\n };\r\n\r\n /**\r\n * Decides on how to proceed after finishing an annotation drawing.\r\n */\r\n const endAnnotation = () => {\r\n switch (data.actionState) {\r\n case \"drawing\":\r\n case \"grab\":\r\n case \"grabbing\":\r\n if (removeOverlaps) {\r\n removeOverlapsFromAnnotation();\r\n } else {\r\n mergeOverlappingAnnotations();\r\n }\r\n break;\r\n\r\n case \"deleting\":\r\n deleteAnnotation(data.currentAnnotation);\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n\r\n data.currentAnnotation = null;\r\n data.actionState = null;\r\n updateCanvas();\r\n };\r\n //#endregion\r\n\r\n //#region User Interactions\r\n const onMouseDown = (e) => {\r\n // Do nothing with invisible annotations\r\n if (!structure.annotationsAreVisible) return;\r\n\r\n AudioViewer.setSelectedStructure(structure);\r\n\r\n setIsDrawing(true);\r\n let newActionState = null;\r\n if (e.buttons === 1) {\r\n newActionState = \"drawing\";\r\n } else if (e.buttons === 2) {\r\n newActionState = \"deleting\";\r\n if (cursor !== \"inherit\") {\r\n setCursor(\"inherit\");\r\n }\r\n }\r\n if (newActionState !== null) {\r\n data.actionState = newActionState;\r\n }\r\n const x = getX(e);\r\n initializeAnnotation(x, newActionState);\r\n e.preventDefault();\r\n e.stopPropagation();\r\n };\r\n\r\n /**\r\n * Changes the look of the cursor depending on its proximity to an annotation.\r\n * @param {number} x Horizontal position of cursor.\r\n */\r\n const updateCursor = (x) => {\r\n let updatedCursor = \"inherit\";\r\n for (const audioAnno of annotations.filter(\r\n (anno) => anno.modificationStatus !== ModificationStatus.Deleted\r\n )) {\r\n const anno = convertToPixelAnnotation(audioAnno);\r\n if (isValueNearby(anno.minX, x) || isValueNearby(anno.maxX, x)) {\r\n updatedCursor = \"w-resize\";\r\n break;\r\n } else if (isValueInside(x, anno)) {\r\n updatedCursor = \"grab\";\r\n break;\r\n }\r\n }\r\n if (cursor !== updatedCursor) {\r\n setCursor(updatedCursor);\r\n }\r\n };\r\n\r\n /**\r\n * Updates cursor display, begins adjusts selected annotation, and updates the canvas dsiplay.\r\n * @param {event} e Mouse move event.\r\n */\r\n const onMouseMove = (e) => {\r\n // Do nothing with invisible annotations\r\n if (!structure.annotationsAreVisible) {\r\n setCursor(\"inherit\");\r\n return;\r\n }\r\n\r\n const x = getX(e);\r\n setMouseX(x);\r\n if (data.actionState === null) {\r\n updateCursor(x);\r\n }\r\n if (!data.actionState) return;\r\n\r\n if (cursor === \"grabbing\" || cursor === \"grab\") {\r\n const delta = e.movementX;\r\n updateAnnotation(\r\n data.currentAnnotation.minX + delta,\r\n data.currentAnnotation.maxX + delta\r\n );\r\n } else {\r\n updateAnnotation(data.currentAnnotation.x1, x);\r\n }\r\n updateCanvas();\r\n e.preventDefault();\r\n };\r\n\r\n /**\r\n * Ends the annotation-drawing process.\r\n * @param {event} e Mouse event when letting go of mouse.\r\n */\r\n const onMouseUp = (e) => {\r\n // Do nothing with invisible annotations\r\n if (!structure.annotationsAreVisible) return;\r\n\r\n setIsDrawing(false);\r\n endAnnotation();\r\n e.preventDefault();\r\n e.stopPropagation();\r\n };\r\n //#endregion\r\n\r\n /**\r\n * Convert all finished annotations to pixel borders.\r\n * @returns {array} All annotations as annotations defined by pixels boundries.\r\n */\r\n const updateCanvas = () => {\r\n // Ensure the canvas is present before updating.\r\n if (!canvas.current) return;\r\n\r\n const ctx = canvas.current.getContext(\"2d\");\r\n const w = ctx.canvas.width;\r\n const h = ctx.canvas.height;\r\n ctx.clearRect(0, 0, w, h);\r\n ctx.beginPath();\r\n ctx.strokeStyle = \"#000\";\r\n ctx.fillStyle = structure.color;\r\n for (let anno of getPixelAnnotations()) {\r\n ctx.rect(anno.minX, 3, anno.maxX - anno.minX, h - 3);\r\n ctx.fill();\r\n ctx.stroke();\r\n }\r\n ctx.closePath();\r\n if (data.currentAnnotation) {\r\n ctx.beginPath();\r\n if (data.actionState === \"drawing\") {\r\n ctx.fillStyle = \"transparent\";\r\n } else if (data.actionState === \"deleting\") {\r\n ctx.fillStyle = \"rgba(0,0,0,0.8)\";\r\n }\r\n ctx.rect(\r\n data.currentAnnotation.minX,\r\n 3,\r\n data.currentAnnotation.maxX - data.currentAnnotation.minX,\r\n h - 3\r\n );\r\n ctx.closePath();\r\n ctx.fill();\r\n ctx.stroke();\r\n }\r\n };\r\n\r\n if (!isVisible) return
    ;\r\n return (\r\n AudioViewer.setSelectedStructure(structure)}\r\n >\r\n \r\n \r\n {structure.label}\r\n
    \r\n \r\n
    \r\n {canvasWidth && (\r\n {\r\n e.preventDefault();\r\n }}\r\n />\r\n )}\r\n
    \r\n \r\n );\r\n}\r\n\r\nAudioAnnotationItem.propTypes = {\r\n file: PropTypes.object.isRequired,\r\n structure: PropTypes.instanceOf(Structure).isRequired,\r\n saveNow: PropTypes.bool.isRequired,\r\n reportSaveStatus: PropTypes.func.isRequired,\r\n removeOverlaps: PropTypes.bool,\r\n mouseX: PropTypes.number.isRequired,\r\n setMouseX: PropTypes.func.isRequired,\r\n isVisible: PropTypes.bool,\r\n visibleTimeRange: PropTypes.arrayOf(PropTypes.number),\r\n};\r\n","// Framework imports\r\nimport React, { useContext, useEffect, useRef, useState } from \"react\";\r\nimport { PropTypes } from \"prop-types\";\r\n\r\n// HSA imports\r\nimport AudioAnnotationItem from \"./AudioAnnotationItem\";\r\nimport { AudioViewerContext } from \"../AudioViewer\";\r\nimport { AudioFileContext } from \"./AudioFileContainer\";\r\nimport { parentStructures } from \"../../common/components/Structure\";\r\nimport { isInt } from \"../../common/utils/Utils\";\r\n\r\n/**\r\n * Collected (reusable) styles for page elements.\r\n */\r\nconst styles = {\r\n root: {\r\n width: \"100%\",\r\n background: \"#fff\",\r\n },\r\n cursorContainer: {\r\n position: \"absolute\",\r\n display: \"grid\",\r\n top: 0,\r\n height: \"100%\",\r\n width: \"100%\",\r\n pointerEvents: \"none\",\r\n },\r\n cursor: {\r\n zIndex: 10,\r\n position: \"relative\",\r\n top: 0,\r\n height: \"100%\",\r\n width: 0,\r\n\r\n borderLeft: \"2px solid black\",\r\n },\r\n};\r\n\r\n/**\r\n * Displays audio annotations of a given audio file / stream.\r\n * Allows the creation, modification, and deletion of annotations.\r\n * @param {object} file The file being annotated.\r\n * @returns React node for AudioAnnotations\r\n */\r\nexport default function AudioAnnotations(props) {\r\n const { file, labelWidth, timestampPosition, visibleTimeRange, ...other } =\r\n props;\r\n\r\n const AudioViewer = useContext(AudioViewerContext);\r\n const AudioFile = useContext(AudioFileContext);\r\n const structuresRef = useRef(AudioViewer.structures);\r\n const selectedStructureRef = useRef(AudioViewer.selectedStructure);\r\n const [savedStructures, setSavedStructures] = useState({});\r\n const [mouseX, setMouseX] = useState(0);\r\n const disableKeyboardShortcutsRef = useRef(\r\n AudioFile.disableKeyboardShortcuts\r\n );\r\n\r\n // Initial load and unload\r\n useEffect(() => {\r\n window.addEventListener(\"keydown\", handleKeyPress);\r\n return () => window.removeEventListener(\"keydown\", handleKeyPress);\r\n }, []);\r\n\r\n useEffect(() => {\r\n disableKeyboardShortcutsRef.current = AudioFile.disableKeyboardShortcuts;\r\n }, [AudioFile.disableKeyboardShortcuts]);\r\n\r\n // Update selectedStructure for handler added on start\r\n useEffect(() => {\r\n selectedStructureRef.current = AudioViewer.selectedStructure;\r\n }, [AudioViewer.selectedStructure]);\r\n\r\n // Update structures for handler added on start\r\n useEffect(() => {\r\n structuresRef.current = AudioViewer.structures;\r\n }, [AudioViewer.structures]);\r\n\r\n //Update structure save status array on change of structures\r\n useEffect(() => {\r\n setSavedStructures((prevSaveStatus) => {\r\n let newSaveStatus = prevSaveStatus;\r\n AudioViewer.structures.forEach((s) => {\r\n // Structures begin as saved\r\n newSaveStatus[s.id] =\r\n s.id in newSaveStatus ? newSaveStatus[s.id] : true;\r\n });\r\n return newSaveStatus;\r\n });\r\n }, [AudioViewer.structures]);\r\n\r\n useEffect(() => {}, [visibleTimeRange]);\r\n\r\n /**\r\n * Decide what happens on any keypress event.\r\n * @param {KeyboardEvent} e Keypress event.\r\n */\r\n const handleKeyPress = (e) => {\r\n if (disableKeyboardShortcutsRef.current) return;\r\n switch (e.code) {\r\n case \"ArrowUp\":\r\n // Select structure above currently selected\r\n switchStructure(-1);\r\n break;\r\n case \"ArrowDown\":\r\n // Select structure below currently selected\r\n switchStructure(1);\r\n break;\r\n default:\r\n return;\r\n }\r\n };\r\n\r\n /**\r\n * Sets another structure as the selected one, relative to the currently selected.\r\n * Loops around at end/beginning.\r\n * @param {int} direction The direction to look for the next structure, relative to the currently selected.\r\n */\r\n const switchStructure = (direction) => {\r\n if (!isInt(direction)) {\r\n throw TypeError(\r\n `direction must be of type int, received ${typeof direction}: ${direction}`\r\n );\r\n }\r\n if (selectedStructureRef.current === null) {\r\n if (!structuresRef.current[0]) {\r\n window.showWarningSnackbar(\"No structures present.\");\r\n return;\r\n }\r\n\r\n AudioViewer.setSelectedStructure(structuresRef.current[0]);\r\n return;\r\n }\r\n\r\n const currentlySelectedIndex = structuresRef.current.findIndex(\r\n (s) => selectedStructureRef.current.id === s.id\r\n );\r\n\r\n // Loop around at end/beginning.\r\n const newlySelectedStructure =\r\n structuresRef.current[\r\n (structuresRef.current.length +\r\n ((currentlySelectedIndex + direction) %\r\n structuresRef.current.length)) %\r\n structuresRef.current.length\r\n ];\r\n AudioViewer.setSelectedStructure(newlySelectedStructure);\r\n };\r\n\r\n /**\r\n * Updates the status of structures when modifying and/or saving.\r\n * @param {int} structureId Structure id of status to update.\r\n * @param {bool} structureSaveStatus New save status. true = saved, false = not saved.\r\n */\r\n const reportStructureSaveStatus = (structureId, structureSaveStatus) => {\r\n let tmpStatus = savedStructures;\r\n tmpStatus[structureId] = structureSaveStatus;\r\n setSavedStructures(tmpStatus);\r\n\r\n // Check if any structure is unsaved\r\n const allStructuresSaved = !Object.values(tmpStatus).some((val) => !val);\r\n\r\n // Mark file as not fully saved\r\n AudioViewer.reportFileSaveStatus(file.id, allStructuresSaved);\r\n };\r\n\r\n return (\r\n
    \r\n {AudioFile.audio !== null &&\r\n AudioViewer.structures.map((structure, idx) => {\r\n // Structures are visible when all their parents are unfolded.\r\n // Top-level structures are always visble.\r\n const parents = parentStructures(structure, AudioViewer.structures);\r\n parents.pop(); // remove structure itself\r\n const isVisible =\r\n structure.parentId === null || parents.every((p) => p.isUnfolded);\r\n\r\n return (\r\n \r\n reportStructureSaveStatus(structure.id, status)\r\n }\r\n removeOverlaps={AudioViewer.excludeToolActive}\r\n isVisible={isVisible}\r\n visibleTimeRange={visibleTimeRange}\r\n />\r\n );\r\n })}\r\n\r\n {/* Local Cursor over all audio file elements */}\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nAudioAnnotations.propTypes = {\r\n file: PropTypes.object.isRequired,\r\n disableKeyboardShortcuts: PropTypes.bool,\r\n labelWidth: PropTypes.number,\r\n hoverBarVisible: PropTypes.bool,\r\n hoverPositionX: PropTypes.number,\r\n timestampPosition: PropTypes.number,\r\n visibleTimeRange: PropTypes.array,\r\n};\r\n","// Framework Imports\r\nimport React, { useRef, useCallback, useEffect, useState } from \"react\";\r\nimport { PropTypes } from \"prop-types\";\r\n\r\n// External components\r\nimport Slider from \"@mui/material/Slider\";\r\n\r\n// HSA Imports\r\nimport { roundToDecimal } from \"../utils/Utils\";\r\n\r\n/**\r\n * A slider controllable by mousewheel when hovering over it.\r\n * @param {number} defaultValue Optional. The starting position of the slider. Defaults to 0.\r\n * @param {number} min Optional. The minimal accepted value of the slider. Defaults to 0.\r\n * @param {number} max Optional. The maximum accepted value of the slider. Defaults to 100.\r\n * @param {number} step Optional. The step size of a single step. Defaults to 1.\r\n * @param {function} onChange The function to be executed on value change. Receives {number} newValue.\r\n * @param {function} onChangeCommitted The function to be executed on final value change. Receives {number} newValue.\r\n * @returns React node.\r\n */\r\nexport default function WheelControllableSlider(props) {\r\n const {\r\n defaultValue = 0,\r\n min = 0,\r\n max = 100,\r\n step = 1,\r\n onChange = () => {},\r\n onChangeCommitted = () => {},\r\n ...other\r\n } = props;\r\n const sliderRef = useRef();\r\n const [sliderPosition, setSliderPosition] = useState(defaultValue);\r\n const sliderPostionRef = useRef(defaultValue);\r\n\r\n useEffect(() => {\r\n onChange(sliderPosition);\r\n }, [sliderPosition]);\r\n\r\n /**\r\n * Activate silder change on scroll\r\n */\r\n const sliderScrollOn = () => {\r\n sliderRef.current.addEventListener(\"wheel\", adjustSliderByScrolling);\r\n };\r\n\r\n /**\r\n * Deactivate slider change on scroll\r\n */\r\n const sliderScrollOff = () => {\r\n sliderRef.current.removeEventListener(\"wheel\", adjustSliderByScrolling);\r\n };\r\n\r\n /**\r\n * Allow slider adjustment via mousewheel.\r\n * @param {event} e Scrollevent.\r\n */\r\n const adjustSliderByScrolling = useCallback((e) => {\r\n e.preventDefault();\r\n // Round to value between 0 and 100, with a precision of 0.01\r\n // Use increments as passed along\r\n const newVal = roundToDecimal(\r\n Math.min(\r\n max,\r\n Math.max(\r\n min,\r\n -(\r\n (Math.sign(e.deltaX) + Math.sign(e.deltaY) + Math.sign(e.deltaZ)) *\r\n step\r\n ) + sliderPostionRef.current\r\n )\r\n ),\r\n 2\r\n );\r\n sliderPostionRef.current = newVal;\r\n setSliderPosition(newVal);\r\n }, []);\r\n\r\n return (\r\n {\r\n sliderPostionRef.current = value;\r\n setSliderPosition(value);\r\n onChange(value);\r\n }}\r\n onChangeCommitted={(_, value) => {\r\n sliderPostionRef.current = value;\r\n setSliderPosition(value);\r\n onChangeCommitted(value);\r\n }}\r\n value={sliderPosition}\r\n ref={sliderRef}\r\n />\r\n );\r\n}\r\n\r\nWheelControllableSlider.propTypes = {\r\n min: PropTypes.number,\r\n max: PropTypes.number,\r\n defaultValue: PropTypes.number,\r\n step: PropTypes.number,\r\n onChange: PropTypes.func,\r\n onChangeCommitted: PropTypes.func,\r\n};\r\n","// Framework imports\r\nimport React, { useState, useRef, useEffect, useContext } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// External packages\r\nimport Grid from \"@mui/material/Grid\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport PauseIcon from \"@mui/icons-material/Pause\";\r\nimport PlayArrowIcon from \"@mui/icons-material/PlayArrow\";\r\nimport SpeedIcon from \"@mui/icons-material/Speed\";\r\nimport Stack from \"@mui/material/Stack\";\r\nimport StopIcon from \"@mui/icons-material/Stop\";\r\nimport VolumeDownIcon from \"@mui/icons-material/VolumeDown\";\r\nimport VolumeUpIcon from \"@mui/icons-material/VolumeUp\";\r\nimport VolumeOffIcon from \"@mui/icons-material/VolumeOff\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\n\r\n// HSA Imports\r\nimport WheelControllableSlider from \"../../common/components/WheelControllableSlider\";\r\nimport { AudioFileContext } from \"./AudioFileContainer\";\r\n\r\n/**\r\n * Collected (reusable) styles for page elements.\r\n */\r\nconst styles = {\r\n root: {\r\n width: \"100%\",\r\n borderBottom: \"1px solid #EBEBEB\",\r\n },\r\n sliders: {\r\n minWidth: 250,\r\n },\r\n};\r\n\r\n/**\r\n * Audio Controls for a sound.\r\n * @param {Howl} audio Instance of audio referenced by scrollbar.\r\n * @returns React node for AudioControlBar.\r\n */\r\nexport default function AudioControlBar(props) {\r\n const { getWaveSurfer } = props;\r\n const waveS = getWaveSurfer();\r\n if (!waveS) return null;\r\n\r\n const AudioFile = useContext(AudioFileContext);\r\n const disableKeyboardShortcutsRef = useRef(\r\n AudioFile.disableKeyboardShortcuts\r\n );\r\n\r\n // Volume controls\r\n // const [volume, setVolume] = useState(audio.volume() * 100);\r\n const [savedVolume, setSavedVolume] = useState(waveS.media.volume * 100);\r\n\r\n useEffect(() => {\r\n // Listen for keyboard controls\r\n window.addEventListener(\"keydown\", handleKeyPress);\r\n return () => window.removeEventListener(\"keydown\", handleKeyPress);\r\n }, []);\r\n\r\n useEffect(() => {\r\n disableKeyboardShortcutsRef.current = AudioFile.disableKeyboardShortcuts;\r\n }, [AudioFile.disableKeyboardShortcuts]);\r\n\r\n /**\r\n * Decide what happens on any keypress event.\r\n * @param {KeyboardEvent} e Keypress event.\r\n */\r\n const handleKeyPress = (e) => {\r\n if (disableKeyboardShortcutsRef.current) return;\r\n if (!waveS) return;\r\n switch (e.code) {\r\n case \"Space\":\r\n // Play/Pause Audio\r\n waveS.playPause();\r\n e.preventDefault();\r\n break;\r\n case \"ArrowLeft\":\r\n // Jump back\r\n jump(-1);\r\n break;\r\n case \"ArrowRight\":\r\n // Jump ahead\r\n jump(1);\r\n break;\r\n }\r\n };\r\n\r\n /**\r\n * Jump short distances in the audiofile. The distance depends on the length of the audiofile:\r\n * Until threshold, jump 5% of song, then jump fixed second value.\r\n * @param {number} direction The direction to jump in. Will be multiplied with the calculated interval.\r\n */\r\n const jump = (direction) => {\r\n if (typeof direction !== \"number\") {\r\n throw TypeError(\r\n `direction must be of type number, received ${typeof direction}: ${direction}`\r\n );\r\n }\r\n\r\n const PERCENTAGE_UNTIL_CUTOFF = 0.05;\r\n const FIXED_DISTANCE_SEC = 5;\r\n const DURATION_THRESHOLD_SEC =\r\n (1 / PERCENTAGE_UNTIL_CUTOFF) * FIXED_DISTANCE_SEC;\r\n\r\n const duration = waveS.getDuration();\r\n // Until threshold, jump PERCENTAGE_UNTIL_CUTOFF of song, then jump fixed second value.\r\n const interval =\r\n duration <= DURATION_THRESHOLD_SEC\r\n ? duration * PERCENTAGE_UNTIL_CUTOFF\r\n : FIXED_DISTANCE_SEC;\r\n\r\n waveS.skip(direction * interval);\r\n };\r\n\r\n\r\n return (\r\n \r\n {/* Buttons */}\r\n {waveS && !waveS.media.paused ? (\r\n \r\n waveS.pause()}>\r\n \r\n \r\n \r\n ) : (\r\n \r\n waveS.play()}>\r\n \r\n \r\n \r\n )}\r\n \r\n {\r\n if (waveS) {\r\n waveS.setTime(0);\r\n waveS.pause();\r\n }\r\n }}\r\n >\r\n \r\n \r\n \r\n\r\n \r\n {/* Volume Control */}\r\n {waveS.media.volume === 0 ? (\r\n \r\n {\r\n // audio.volume(0);\r\n waveS.setVolume(savedVolume);\r\n }}\r\n >\r\n \r\n \r\n \r\n ) : (\r\n \r\n {\r\n // audio.volume(savedVolume / 100);\r\n setSavedVolume(waveS.media.volume);\r\n waveS.setVolume(0);\r\n }}\r\n >\r\n \r\n \r\n \r\n )}\r\n {\r\n waveS.setVolume(value / 100); \r\n }}\r\n />\r\n \r\n \r\n \r\n {/* Speed Control */}\r\n \r\n \r\n \r\n {\r\n waveS.setPlaybackRate(value);\r\n }}\r\n />\r\n \r\n \r\n );\r\n}\r\n\r\nAudioControlBar.propTypes = {\r\n disableKeyboardShortcuts: PropTypes.bool,\r\n getWaveSurfer: PropTypes.func,\r\n};\r\n","// Framework imports\r\nimport React, { useState, useEffect, useContext, useRef } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { withStyles, createStyles } from \"@mui/styles\";\r\n\r\n// External packages\r\nimport WaveSurfer from \"wavesurfer.js\";\r\nimport SpectrogramPlugin from \"wavesurfer.js/dist/plugins/spectrogram\";\r\n// import TimelinePlugin from \"wavesurfer.js/dist/plugins/timeline\";\r\n\r\n// HSA Imports\r\nimport { AudioFileContext } from \"./AudioFileContainer\";\r\n\r\n// mui imports\r\nimport { Button, Tooltip } from \"@mui/material\";\r\n\r\n// icon imports\r\nimport ExpandLessIcon from \"@mui/icons-material/ExpandLess\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\n\r\n/**\r\n * Collected (reusable) styles for page elements.\r\n */\r\nconst styles = createStyles({\r\n root: {\r\n width: \"100%\",\r\n borderBottom: \"1px solid #EBEBEB\",\r\n },\r\n toggleButton: {\r\n width: \"100%\",\r\n },\r\n waveVisible: {\r\n \"& spectrogram\": {\r\n height: \"36px !important\",\r\n },\r\n },\r\n spectrogramVisible: {\r\n background: \"green\",\r\n \"& .wrapper:first-child\": {\r\n height: \"36px !important\",\r\n },\r\n },\r\n});\r\n\r\n/**\r\n * Displays the magitude spectrogram of an audio file / stream.\r\n * @returns React node for MagnitudeSpectrogram\r\n */\r\nfunction MagnitudeSpectrogram(props) {\r\n const { classes, leftWidth, setWaveSurfer, setVisibleTimeRange } = props;\r\n const AudioFile = useContext(AudioFileContext);\r\n const wavesurfer = useRef();\r\n const waveformRef = useRef();\r\n const [waveVisible, setWaveVisible] = useState(true);\r\n const [spectrogramVisible, setspectrogramVisible] = useState(true);\r\n const zoomRef = useRef(1);\r\n const [minZoom, setMinZoom] = useState(null);\r\n\r\n useEffect(() => {\r\n initWS();\r\n // add event listener for mouse wheel movement\r\n window.addEventListener(\"wheel\", zoom);\r\n return () => {\r\n // remove event listener for mouse wheel movement\r\n window.removeEventListener(\"wheel\", zoom);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (wavesurfer.current) {\r\n wavesurfer.current.setOptions({\r\n height: waveVisible ? 128 : 36,\r\n });\r\n }\r\n }, [waveVisible]);\r\n\r\n useEffect(() => {\r\n if (wavesurfer.current) {\r\n const plugins = wavesurfer.current.plugins;\r\n let spectrogramIdx = -1;\r\n for (let i = 0; i < plugins.length; i++) {\r\n if (plugins[i] instanceof SpectrogramPlugin) {\r\n spectrogramIdx = i;\r\n break;\r\n }\r\n }\r\n\r\n if (spectrogramVisible && spectrogramIdx === -1) {\r\n addSpectrogram();\r\n return;\r\n }\r\n if (!spectrogramVisible && spectrogramIdx > -1) {\r\n plugins[spectrogramIdx].destroy();\r\n plugins.splice(spectrogramIdx, 1);\r\n return;\r\n }\r\n }\r\n }, [spectrogramVisible]);\r\n\r\n useEffect(() => {\r\n if (waveVisible === false) {\r\n wavesurfer.current.height = spectrogramVisible ? 256 : 36;\r\n }\r\n }, [spectrogramVisible, waveVisible]);\r\n\r\n const zoom = (e) => {\r\n if (!wavesurfer.current) return;\r\n let zoomDelta = 0.1 * zoomRef.current;\r\n if (e.deltaY > 0) {\r\n zoomDelta = -zoomDelta;\r\n }\r\n const newZoom = zoomRef.current + zoomDelta;\r\n zoomRef.current = Math.max(getMinZoom(), newZoom);\r\n wavesurfer.current.zoom(newZoom);\r\n };\r\n\r\n const getMinZoom = () => {\r\n if (minZoom) return minZoom;\r\n if (!wavesurfer.current) return 1;\r\n const audioDuration = wavesurfer.current.getDuration();\r\n const waveformWidth = wavesurfer.current.renderer.container.clientWidth;\r\n const zoomToFit = waveformWidth / audioDuration;\r\n setMinZoom(zoomToFit);\r\n return zoomToFit;\r\n };\r\n\r\n const addSpectrogram = () => {\r\n if (wavesurfer.current && wavesurfer.current.plugins.length === 0) {\r\n wavesurfer.current.registerPlugin(\r\n SpectrogramPlugin.create({\r\n showTime: true,\r\n labels: true,\r\n })\r\n );\r\n return;\r\n }\r\n };\r\n\r\n const initWS = () => {\r\n const ws = WaveSurfer.create({\r\n container: waveformRef.current,\r\n autoCenter: false,\r\n autoScroll: true,\r\n labels: true,\r\n cursorWidth: 2,\r\n });\r\n ws.setVolume(0.1);\r\n\r\n ws.load(AudioFile.audioFileSrc);\r\n ws.on(\"timeupdate\", (currentTime) => {\r\n AudioFile.updateTimeStampPosition(currentTime);\r\n });\r\n ws.on(\"scroll\", (visibleStartTime, visibleEndTime) => {\r\n AudioFile.audio.visibleTimeRange = [visibleStartTime, visibleEndTime];\r\n\r\n setVisibleTimeRange([visibleStartTime, visibleEndTime]);\r\n });\r\n ws.on(\"zoom\", () => {\r\n const wrapper = ws.getWrapper();\r\n const parent = wrapper.parentElement;\r\n\r\n const parentWidth = parent.clientWidth;\r\n const contentWidth = wrapper.clientWidth;\r\n const duration = AudioFile.audio.duration();\r\n const currentTime = AudioFile.audio.seek();\r\n const visibleDuration = duration * (parentWidth / contentWidth);\r\n const widthToDurationFactor = parentWidth / visibleDuration;\r\n const visibleLeft = currentTime - visibleDuration / 2;\r\n const scrollLeft = Math.max(0, visibleLeft * widthToDurationFactor);\r\n parent.scrollTo(scrollLeft, 0);\r\n\r\n if (scrollLeft === 0) {\r\n AudioFile.audio.visibleTimeRange = [0, visibleDuration];\r\n setVisibleTimeRange([0, visibleDuration]);\r\n }\r\n });\r\n wavesurfer.current = ws;\r\n addSpectrogram();\r\n setWaveSurfer(ws);\r\n };\r\n\r\n const onToggleWave = () => {\r\n setWaveVisible(!waveVisible);\r\n };\r\n\r\n const onToggleSpectogram = () => {\r\n setspectrogramVisible(!spectrogramVisible);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {waveVisible ? : }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* Visualisation */}\r\n
    \r\n \r\n \r\n );\r\n}\r\n\r\nMagnitudeSpectrogram.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n timestamp: PropTypes.number,\r\n leftWidth: PropTypes.number,\r\n setWaveSurfer: PropTypes.func,\r\n setVisibleTimeRange: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(MagnitudeSpectrogram);\r\n","// Framework imports\r\nimport React, {\r\n useContext,\r\n useState,\r\n useEffect,\r\n createContext,\r\n useRef,\r\n} from \"react\";\r\nimport { PropTypes } from \"prop-types\";\r\n\r\n// External packages\r\nimport { Grid, Typography, Tooltip } from \"@mui/material\";\r\nimport { Howl } from \"howler\";\r\n\r\n// HSA Components\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\n// Audio Viewer Components\r\nimport AudioAnnotations from \"./AudioAnnotations\";\r\nimport AudioControlBar from \"./AudioControlBar\";\r\nimport MagnitudeSpectrogram from \"./MagnitudeSpectrogram\";\r\nimport { AudioViewerContext } from \"../AudioViewer\";\r\n\r\n/**\r\n * Collected (reusable) styles for page elements.\r\n */\r\n// const styles = {\r\n// root: {\r\n// width: \"100%\",\r\n// position: \"relative\",\r\n// zIndex: 1,\r\n// },\r\n// };\r\n\r\n/**\r\n * The step called within requestAnimationFrame to update the playback position.\r\n */\r\nconst step = (audio, callback) => {\r\n // Determine our current seek position.\r\n var seek = audio.seek() || 0;\r\n callback(seek);\r\n\r\n // If the audio is still playing, continue stepping.\r\n if (audio.playing()) {\r\n setTimeout(() => step(audio, callback), 30);\r\n }\r\n};\r\n\r\n/**\r\n * Makes selected data available for all children of AudioFileContainer.\r\n * Used for information that must be synced over all components per audio file,\r\n * such as the file itself, the playback position, and annotations.\r\n */\r\nexport const AudioFileContext = createContext();\r\n\r\n/**\r\n * Contains all visualisation elements of a audio file / stream.\r\n * @param {object} file The file being used.\r\n * @param {int} labelWidth Optional. The space to keep to the left for labels. Defaults to 100.\r\n * @returns React node for AudioAnnotationItem\r\n */\r\nexport default function AudioFileContainer(props) {\r\n const { file, labelWidth = 100 } = props;\r\n const AudioViewer = useContext(AudioViewerContext);\r\n\r\n // Media\r\n const audioFileSrc = useRef(null);\r\n const audio = useRef(null);\r\n const waveSurfer = useRef(null);\r\n const [timestamp, setTimestamp] = useState(0);\r\n const [timestampPosition, setTimestampPosition] = useState(0);\r\n const [visibleTimeRange, setVisibleTimeRange] = useState([0, 0]);\r\n\r\n // Layout\r\n const container = useRef();\r\n const { containerWidth } = AudioViewer;\r\n const [disableKeyboardShortcuts, setDisableKeyboardShortcuts] =\r\n useState(false);\r\n const [contentWidth, setContentWidth] = useState();\r\n const [hoverPositionX, setHoverPositionX] = useState(0);\r\n const [hoverBarVisible, setHoverBarVisible] = useState(false);\r\n const forceUpdate = React.useState({})[1].bind(null, {});\r\n\r\n const updateVisibleTimeRange = (newValue) => {\r\n if(newValue[0] !== visibleTimeRange[0] || newValue[1] !== visibleTimeRange[1]){\r\n setVisibleTimeRange(newValue);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (visibleTimeRange[1] === 0 && audio.current) {\r\n updateVisibleTimeRange([0, audio.current.duration()]);\r\n return;\r\n }\r\n if (audio.current) {\r\n const currentDuration = audio.current.duration();\r\n let newPosition;\r\n if (audio.current) {\r\n newPosition =\r\n (timestamp - visibleTimeRange[0]) /\r\n (visibleTimeRange[1] - visibleTimeRange[0]);\r\n } else {\r\n newPosition = timestamp / currentDuration;\r\n }\r\n setTimestampPosition(newPosition);\r\n }\r\n }, [timestamp, visibleTimeRange]);\r\n\r\n useEffect(() => {\r\n // Load and store assigned audio file once on first mount.\r\n Backend.loadAudioFile(\r\n file.id,\r\n (fileUrl) => {\r\n audioFileSrc.current = fileUrl;\r\n const tmpHowl = new Howl({\r\n src: [fileUrl],\r\n format: [file.sourcePath.split(\".\").pop()],\r\n volume: 0.1,\r\n onload: () => {\r\n audio.current = tmpHowl;\r\n forceUpdate();\r\n },\r\n onplay: () => {\r\n waveSurfer.current.play();\r\n\r\n // step(audio.current, setTimestamp);\r\n },\r\n onpause: () => {\r\n waveSurfer.current.pause();\r\n },\r\n onseek: () => {\r\n step(audio.current, setTimestamp)\r\n },\r\n });\r\n },\r\n (err) => {\r\n window.openErrorDialog(err);\r\n }\r\n );\r\n\r\n // the return function will be called when the component unmounts\r\n return () => {\r\n audio.current.stop();\r\n // Remove audio file when unmounting container.\r\n audio.current.unload();\r\n window.URL.revokeObjectURL(audioFileSrc.current);\r\n };\r\n }, []);\r\n\r\n // Check for resized window\r\n useEffect(() => {\r\n calcWidths();\r\n }, [containerWidth]);\r\n\r\n /**\r\n * Takes floating-point seconds and formats them to min:seconds:ms\r\n * @param {number} t Timestamp.\r\n * @returns {string} Formatted timestamp.\r\n */\r\n const valueLabelFormat = (t) => {\r\n const minutes = Math.floor(t / 60);\r\n let seconds = Math.floor(t % 60);\r\n if (seconds < 10) seconds = \"0\" + seconds;\r\n let ms = Math.floor((t % 1) * 100);\r\n if (ms < 10) ms = \"0\" + ms;\r\n let result = minutes + \":\" + seconds + \",\" + ms;\r\n return result;\r\n };\r\n\r\n const setWaveSurfer = (ws) => {\r\n waveSurfer.current = ws;\r\n forceUpdate();\r\n };\r\n\r\n const updateTimeStampPosition = (timestamp) => {\r\n setTimestamp(timestamp);\r\n };\r\n\r\n const calcWidths = () => {\r\n const boundingBox = container.current.getBoundingClientRect();\r\n setContentWidth(boundingBox?.width ? boundingBox.width - labelWidth : 0);\r\n };\r\n\r\n // Set up context for all children\r\n const context = {\r\n file: file,\r\n audio: audio.current,\r\n timestamp,\r\n audioFileSrc: audioFileSrc.current,\r\n updateTimeStampPosition,\r\n labelWidth,\r\n contentWidth,\r\n valueLabelFormat,\r\n disableKeyboardShortcuts,\r\n };\r\n\r\n const handleMouseMove = (e) => {\r\n const startX = labelWidth + 10;\r\n setHoverPositionX(Math.max(0, e.pageX - startX));\r\n };\r\n\r\n const handleMouseEnter = () => {\r\n setHoverBarVisible(true);\r\n handleContainerFocus(true)\r\n };\r\n\r\n const handleMouseLeave = () => {\r\n setHoverBarVisible(false);\r\n };\r\n\r\n const getTimeStamp = (xPos) => {\r\n if (audio.current) {\r\n return (xPos * audio.current.duration()) / contentWidth;\r\n }\r\n return xPos;\r\n };\r\n\r\n const pixelToTime = (x) => {\r\n let result = x;\r\n if (audio.current) {\r\n result = valueLabelFormat(getTimeStamp(x));\r\n }\r\n return result;\r\n };\r\n\r\n const handleContainerFocus = (value) => {\r\n setDisableKeyboardShortcuts(!value);\r\n if(value) {\r\n container.current.focus();\r\n }\r\n }\r\n\r\n return (\r\n handleContainerFocus(false)}\r\n ref={container}\r\n >\r\n {file.fileName}\r\n \r\n {audio.current && (\r\n \r\n waveSurfer.current}\r\n timestamp={timestamp}\r\n />\r\n 0 ? pixelToTime(hoverPositionX) : \"\"}\r\n placement=\"top\"\r\n followCursor\r\n >\r\n \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n )}\r\n
    \r\n \r\n );\r\n}\r\n\r\nAudioFileContainer.propTypes = {\r\n file: PropTypes.object.isRequired,\r\n labelWidth: PropTypes.number,\r\n};\r\n","import React from \"react\";\r\nimport { Grid } from \"@mui/material\";\r\nimport { PropTypes } from \"prop-types\";\r\n\r\n// HSA Components\r\nimport AudioFileContainer from \"./components/AudioFileContainer\";\r\n\r\n/**\r\n * Collected (reusable) styles for page elements.\r\n */\r\nconst styles = {\r\n root: {\r\n height: \"100%\",\r\n overflowY: \"auto\",\r\n padding: \"10px\",\r\n },\r\n};\r\n\r\n/**\r\n * The distance from the right in px before annotations, playbar, and visualizations begin.\r\n */\r\nconst LABEL_WIDTH = 100;\r\n\r\n/**\r\n * Element containing all visualisations of all audio files / streams in a project.\r\n * @param {array} files All files to be rendered in the AudioViewer.\r\n * @returns React node for AudioRenderer\r\n */\r\nexport default function AudioRenderer(props) {\r\n const { files = [], ...other } = props;\r\n return (\r\n \r\n {files.map((file) => (\r\n \r\n ))}\r\n \r\n );\r\n}\r\n\r\nAudioRenderer.propTypes = {\r\n files: PropTypes.array,\r\n};\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport SvgIcon from \"@mui/material/SvgIcon\";\r\n\r\nfunction ExclusionBoxIcon(props) {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nExclusionBoxIcon.propTypes = {\r\n color: PropTypes.string,\r\n};\r\n\r\nexport default ExclusionBoxIcon;\r\n","// Framework imports\r\nimport React, { useEffect, useContext } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { Save } from \"@mui/icons-material\";\r\n\r\n// External packages\r\nimport { Grid, IconButton, Tooltip, Divider } from \"@mui/material\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faExchangeAlt } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { AudioViewerContext } from \"./AudioViewer\";\r\nimport ExclusionBoxIcon from \"./components/ExclusionBoxIcon\";\r\n\r\n/**\r\n * Collected (reusable) styles for page elements.\r\n */\r\nconst styles = {\r\n root: {\r\n height: \"100%\",\r\n background: \"#fff\",\r\n borderLeft: \"5px solid #EBEBEB\",\r\n display: \"grid\",\r\n gridTemplateRows: \"1fr auto\",\r\n },\r\n saveButton: {\r\n color: \"primary.main\",\r\n },\r\n divider: {\r\n marginLeft: \"5px\",\r\n marginRight: \"5px\",\r\n },\r\n};\r\n\r\n/**\r\n * Vertical toolbar for quick tool selection.\r\n * @param {function} save A function to execute to save the project.\r\n * @returns React node for AudioToolBar.\r\n */\r\nexport default function AudioToolBar(props) {\r\n const { save, ...other } = props;\r\n const AudioViewer = useContext(AudioViewerContext);\r\n const { excludeToolActive, setExcludeToolActive } = AudioViewer;\r\n\r\n /**\r\n * Handle keyboard strokes.\r\n * @param {event} e KeyboardEvent.\r\n */\r\n const handleKeyDownEvent = (e) => {\r\n if (e.ctrlKey) {\r\n if (e.code === \"KeyS\") {\r\n save();\r\n e.preventDefault();\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n window.addEventListener(\"keydown\", handleKeyDownEvent);\r\n return () => window.removeEventListener(\"keydown\", handleKeyDownEvent);\r\n }, []);\r\n\r\n return (\r\n \r\n
    \r\n \r\n setExcludeToolActive(!excludeToolActive)}\r\n sx={{\r\n color: excludeToolActive ? \"primary.main\" : \"primary.inactive\",\r\n }}\r\n >\r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n AudioViewer.toggleSideBar()}>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nAudioToolBar.propTypes = {\r\n save: PropTypes.func.isRequired,\r\n};\r\n","// Copyright: HS Analysis GmbH\r\n// Author: Valentin Haas\r\n// Taken from https://mui.com/material-ui/react-tree-view/#contentcomponent-prop\r\n\r\n// Framework imports\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// External packages\r\nimport clsx from \"clsx\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport TreeItem, { useTreeItem } from \"@mui/lab/TreeItem\";\r\n\r\n/**\r\n * TreeItem component that differntiales between click on icon and click on label.\r\n * Basically a copy of the original TreeItem component with the difference that the\r\n * click on the label can be handled separately using the handleSelection function.\r\n */\r\nconst ClickAwareTreeItemContent = React.forwardRef(\r\n function ClickAwareTreeItemContent(props, ref) {\r\n const {\r\n classes,\r\n className,\r\n label,\r\n nodeId,\r\n icon: iconProp,\r\n expansionIcon,\r\n displayIcon,\r\n } = props;\r\n\r\n const {\r\n disabled,\r\n expanded,\r\n selected,\r\n focused,\r\n handleExpansion,\r\n handleSelection,\r\n preventSelection,\r\n } = useTreeItem(nodeId);\r\n\r\n const icon = iconProp || expansionIcon || displayIcon;\r\n\r\n const handleMouseDown = (event) => {\r\n preventSelection(event);\r\n };\r\n\r\n const handleExpansionClick = (event) => {\r\n handleExpansion(event);\r\n };\r\n\r\n const handleSelectionClick = (event) => {\r\n handleSelection(event);\r\n };\r\n\r\n return (\r\n \r\n
    \r\n {icon}\r\n
    \r\n \r\n {label}\r\n \r\n \r\n );\r\n }\r\n);\r\n\r\nClickAwareTreeItemContent.propTypes = {\r\n /**\r\n * Override or extend the styles applied to the component.\r\n */\r\n classes: PropTypes.object.isRequired,\r\n /**\r\n * className applied to the root element.\r\n */\r\n className: PropTypes.string,\r\n /**\r\n * The icon to display next to the tree node's label. Either a parent or end icon.\r\n */\r\n displayIcon: PropTypes.node,\r\n /**\r\n * The icon to display next to the tree node's label. Either an expansion or collapse icon.\r\n */\r\n expansionIcon: PropTypes.node,\r\n /**\r\n * The icon to display next to the tree node's label.\r\n */\r\n icon: PropTypes.node,\r\n /**\r\n * The tree node label.\r\n */\r\n label: PropTypes.node,\r\n /**\r\n * The id of the node.\r\n */\r\n nodeId: PropTypes.string.isRequired,\r\n};\r\n\r\n/**\r\n * A TreeItem that does not catch a click event when clicking on the label.\r\n * This allows to handle the click on the label separately from an icon click.\r\n * @param {object} props Same props as TreeItem.\r\n * @returns {JSX.Element} The ClickAwareTreeItem component.\r\n */\r\nexport default function ClickAwareTreeItem(props) {\r\n return ;\r\n}\r\n","// Framework imports\r\nimport React, { useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// External packages\r\nimport { Grid, IconButton } from \"@mui/material\";\r\nimport MoreVertIcon from \"@mui/icons-material/MoreVert\";\r\nimport { Menu, MenuItem, Divider } from \"@mui/material\";\r\nimport { GetApp, Publish } from \"@mui/icons-material\";\r\nimport PlaylistAdd from \"@mui/icons-material/PlaylistAdd\";\r\nimport FileCopy from \"@mui/icons-material/FileCopy\";\r\nimport ArrowDownward from \"@mui/icons-material/ArrowDownward\";\r\nimport ArrowUpward from \"@mui/icons-material/ArrowUpward\";\r\nimport Delete from \"@mui/icons-material/Delete\";\r\n\r\n// HSA Components\r\nimport Structure, {\r\n structureCanMove,\r\n moveStructure,\r\n insertStructure,\r\n deleteStructure,\r\n duplicateStructure,\r\n newStructureId,\r\n} from \"../../common/components/Structure\";\r\nimport { AnnotationAction } from \"../../common/components/RoiTypes\";\r\nimport { getUnusedColor } from \"../../common/utils/RandomColorGenerator\";\r\n\r\nconst styles = {\r\n menuIcon: { marginRight: \"16px\" },\r\n};\r\n\r\n/**\r\n * All options and operations associated with structures in a project.\r\n * @param {object} structure The structure the menu referrs to.\r\n * @param {array} structures All structures of a project.\r\n * @param {function} setStructures Update all structures of a project. Receives (array structures).\r\n * @param {function} triggerAction Flag a structure to have it's annotations exported. Receives (Structure structure, AnnotationAction: action).\r\n * @returns React node for StructureOptionMenu.\r\n */\r\nexport default function StructureOptionMenu(props) {\r\n const { structure, structures, setStructures, triggerAction, ...other } =\r\n props;\r\n if (!(structure instanceof Structure)) {\r\n throw TypeError(\r\n `structure must be of type Structure, received ${typeof structure}: ${structure}`\r\n );\r\n }\r\n if (!Array.isArray(structures)) {\r\n throw TypeError(\r\n `structures must be of type Array, received ${typeof structures}: ${structures}`\r\n );\r\n }\r\n\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const [menuOpen, setMenuOpen] = useState(false);\r\n\r\n /**\r\n * Add a child structure to an exisisting parentstructure.\r\n * @param {bool} isStructure Whether the new substructure is a sub-structure (true) or sub-class (false).\r\n */\r\n const addChild = (isStructure) => {\r\n let newStructure = new Structure(\r\n newStructureId(structures),\r\n isStructure\r\n ? `Substructure of ${structure.label}`\r\n : `Subclass of ${structure.label}`,\r\n isStructure,\r\n getUnusedColor(structures),\r\n true,\r\n structure.id,\r\n 0,\r\n false,\r\n true,\r\n false,\r\n structure.nestingDepth + 1,\r\n 0\r\n );\r\n setStructures(insertStructure(newStructure, structures));\r\n setMenuOpen(false);\r\n };\r\n\r\n const onDuplicateStructure = () => {\r\n setStructures(duplicateStructure(structure, structures));\r\n setMenuOpen(false);\r\n };\r\n\r\n const onExportAnnotations = () => {\r\n triggerAction(structure, AnnotationAction.Export);\r\n setMenuOpen(false);\r\n };\r\n\r\n const onImportAnnotations = () => {\r\n triggerAction(structure, AnnotationAction.Import);\r\n setMenuOpen(false);\r\n };\r\n\r\n return (\r\n \r\n {\r\n setAnchorEl(event.currentTarget);\r\n setMenuOpen((oldState) => !oldState);\r\n }}\r\n >\r\n \r\n \r\n {menuOpen && (\r\n {\r\n setAnchorEl(null);\r\n setMenuOpen(false);\r\n }}\r\n >\r\n addChild(true)}\r\n disabled={!structure.isStructure || !structure.isDynamic}\r\n >\r\n \r\n Add substructure\r\n \r\n addChild(false)}\r\n disabled={!structure.isDynamic}\r\n >\r\n \r\n Add subclass\r\n \r\n \r\n \r\n Duplicate structure\r\n \r\n \r\n \r\n Export annotations\r\n \r\n \r\n \r\n Import annotations\r\n \r\n \r\n \r\n setStructures(moveStructure(structure, -1, structures))\r\n }\r\n disabled={\r\n // !structure.isDynamic ||\r\n !structureCanMove(structure, -1, structures)\r\n }\r\n >\r\n \r\n Move structure up\r\n \r\n \r\n setStructures(moveStructure(structure, +1, structures))\r\n }\r\n disabled={\r\n // !structure.isDynamic ||\r\n !structureCanMove(structure, +1, structures)\r\n }\r\n >\r\n \r\n Move structure down\r\n \r\n \r\n \r\n setStructures(\r\n deleteStructure(structure, structures, (struct) =>\r\n triggerAction(struct, AnnotationAction.DeleteAll)\r\n )\r\n )\r\n }\r\n disabled={!structure.isDynamic}\r\n >\r\n \r\n Delete structure\r\n \r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nStructureOptionMenu.propTypes ==\r\n {\r\n structure: PropTypes.instanceOf(Structure).isRequired,\r\n structures: PropTypes.array.isRequired,\r\n setStructures: PropTypes.func.isRequired,\r\n triggerAction: PropTypes.func.isRequired,\r\n };\r\n","// Framework imports\r\nimport React, { useState, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// External packages\r\nimport AccountTreeIcon from \"@mui/icons-material/AccountTree\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Grid from \"@mui/material/Grid\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport StopIcon from \"@mui/icons-material/Stop\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport Visibility from \"@mui/icons-material/Visibility\";\r\nimport VisibilityOff from \"@mui/icons-material/VisibilityOff\";\r\n\r\n// HSA packages\r\nimport ClickAwareTreeItem from \"../../common/components/ClickAwareTreeItem\";\r\nimport Structure from \"../../common/components/Structure\";\r\nimport SketchColorPicker from \"../../common/components/SketchColorPicker\";\r\nimport StructureOptionMenu from \"./StructureOptionMenu\";\r\nimport { theme } from \"../../index\";\r\n\r\nconst styles = {\r\n structure: {\r\n width: \"100%\",\r\n display: \"grid\",\r\n overflow: \"hidden\",\r\n alignItems: \"center\",\r\n },\r\n structureElement: { marginRight: \"10px\" },\r\n inputElement: {\r\n width: \"100%\",\r\n textOverflow: \"ellipsis\",\r\n overflow: \"hidden\",\r\n whiteSpace: \"nowrap\",\r\n },\r\n structureIcon: {\r\n color: \"primary.inactive\",\r\n padding: \"3px\",\r\n },\r\n};\r\n\r\n/**\r\n * Structure items that can be used inside a mui TreeView.\r\n * Will render children depending on childrens presence.\r\n * @param {object} structure The structure to use.\r\n * @param {array} structures All structures of a project.\r\n * @param {Structure} selectedStructure Optional. The currently selected structure. Default: null.\r\n * @returns {JSX.Element} The structure item.\r\n */\r\nexport default function RecursiveStructureItem(props) {\r\n const {\r\n structure,\r\n structures,\r\n selectedStructure = null,\r\n trainingSettings = null,\r\n setTrainingSettings = () => {},\r\n ...other\r\n } = props;\r\n const leftSpacing =\r\n structure.nestingDepth > 0 ? structure.nestingDepth * 17 : 0;\r\n\r\n return structure.hasChildren ? (\r\n \r\n }\r\n >\r\n {structures\r\n .filter((s) => s.parentId === structure.id)\r\n .map((structure) => (\r\n \r\n ))}\r\n \r\n ) : (\r\n \r\n }\r\n />\r\n );\r\n}\r\n\r\nRecursiveStructureItem.propTypes = {\r\n structure: PropTypes.instanceOf(Structure).isRequired,\r\n structures: PropTypes.array.isRequired,\r\n setStructures: PropTypes.func,\r\n selectedStructure: PropTypes.instanceOf(Structure),\r\n setSelectedStructure: PropTypes.func,\r\n triggerAction: PropTypes.func,\r\n isLocked: PropTypes.bool,\r\n isInSelectionMode: PropTypes.bool,\r\n trainingSettings: PropTypes.object,\r\n setTrainingSettings: PropTypes.func,\r\n};\r\n\r\n/**\r\n * Structure display with options.\r\n * @param {object} structure The structure to use.\r\n * @param {array} structures All structures of a project.\r\n * @param {function} setStructures Optional. Update all structures of a project. Receives (array structures). Default: () => {}.\r\n * @param {function} setSelectedStructure Optional. Set the currrently selected structure. Receives (uint id | null). Default: () => {}.\r\n * @param {function} triggerAction Optional. Flag a structure to have it's annotations exported. Receives (Structure structure). Default: () => {}.\r\n * @param {bool} isLocked Optional. Flag if the tree is locked. Default: false.\r\n * @param {bool} isInSelectionMode Optional. Flag if the tree is in selection mode. Default: false.\r\n * @param {function} updateChoosability Optional. Triggers update of choosability of all structures. Default: () => {}.\r\n * @returns React node for StructureItem.\r\n */\r\nexport function StructureItem(props) {\r\n const {\r\n structure,\r\n structures,\r\n setStructures = () => {},\r\n setSelectedStructure = () => {},\r\n triggerAction = () => {},\r\n isLocked = false,\r\n isInSelectionMode = false,\r\n updateChoosability = () => {},\r\n trainingSettings = null,\r\n setTrainingSettings = () => {},\r\n ...other\r\n } = props;\r\n\r\n // TODO: Remove copies, work directly on structure object\r\n const [label, setLabel] = useState(structure.label);\r\n const [color, setColor] = useState(structure.color);\r\n const [isChosen, setIsChosen] = useState(structure.isChosen);\r\n const [annotationsAreVisible, setAnnotationVisibility] = useState(\r\n structure.annotationsAreVisible\r\n );\r\n\r\n useEffect(() => updateStructure(), [annotationsAreVisible, isChosen]);\r\n useEffect(() => updateChoosability(), [isChosen, structure.isChosen]);\r\n\r\n useEffect(() => {\r\n setLabel(structure.label);\r\n setColor(structure.color);\r\n setIsChosen(structure.isChosen);\r\n setAnnotationVisibility(structure.annotationsAreVisible);\r\n }, [structures]);\r\n\r\n /**\r\n * Updates the structure within the structures array.\r\n * @returns {void}\r\n */\r\n const updateStructure = () => {\r\n const tmpStructures = structures;\r\n const tmpStructure = tmpStructures.find((s) => s.id === structure.id);\r\n tmpStructure.isChosen = isChosen;\r\n\r\n if (isLocked) return;\r\n tmpStructure.label = label;\r\n tmpStructure.color = color;\r\n tmpStructure.annotationsAreVisible = annotationsAreVisible;\r\n\r\n // Write updates\r\n setStructures(tmpStructures.map((s) => s));\r\n };\r\n\r\n return (\r\n setSelectedStructure(structure)}\r\n {...other}\r\n >\r\n {\r\n setIsChosen((old) => !old);\r\n updateStructure();\r\n // update training settings\r\n setTrainingSettings(() => {\r\n trainingSettings.structures = structures\r\n .map((item) => {\r\n if (item.id === structure.id) {\r\n item.isChosen = !structure.isChosen;\r\n }\r\n return item;\r\n })\r\n .filter((s) => s.isChosen);\r\n return trainingSettings;\r\n });\r\n }}\r\n />\r\n \r\n {structure.isStructure ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n setLabel(e.target.value)}\r\n onBlur={updateStructure}\r\n />\r\n \r\n {!isLocked && (\r\n \r\n {\r\n setAnnotationVisibility((old) => !old);\r\n e.stopPropagation();\r\n }}\r\n >\r\n {annotationsAreVisible ? : }\r\n \r\n \r\n )}\r\n \r\n {\r\n if (isLocked) return;\r\n setColor(newColor);\r\n }}\r\n onClose={updateStructure}\r\n />\r\n \r\n {!isLocked && (\r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nStructureItem.propTypes = {\r\n structure: PropTypes.instanceOf(Structure).isRequired,\r\n structures: PropTypes.array.isRequired,\r\n setStructures: PropTypes.func,\r\n setSelectedStructure: PropTypes.func,\r\n triggerAction: PropTypes.func,\r\n isLocked: PropTypes.bool,\r\n isInSelectionMode: PropTypes.bool,\r\n updateChoosability: PropTypes.func,\r\n trainingSettings: PropTypes.object,\r\n setTrainingSettings: PropTypes.func,\r\n};\r\n","// Framework imports\r\nimport React, { useState, useEffect } from \"react\";\r\nimport { PropTypes } from \"prop-types\";\r\n\r\n// External imports\r\nimport {\r\n Grid,\r\n IconButton,\r\n TextField,\r\n Tooltip,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport TreeView from \"@mui/lab/TreeView\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\r\nimport {\r\n Add,\r\n Delete,\r\n GetApp,\r\n Publish,\r\n Visibility,\r\n VisibilityOff,\r\n} from \"@mui/icons-material\";\r\n\r\n// HSA Imports\r\nimport Structure, {\r\n exportStructures,\r\n importStructures,\r\n insertStructure,\r\n newStructureId,\r\n} from \"../../common/components/Structure\";\r\nimport { AnnotationAction } from \"../../common/components/RoiTypes\";\r\nimport RecursiveStructureItem from \"./StructureItem\";\r\nimport { getUnusedColor } from \"../../common/utils/RandomColorGenerator\";\r\n\r\nconst styles = {\r\n root: {\r\n display: \"grid\",\r\n gridTemplateRows: \"auto auto auto 1fr\",\r\n height: \"100%\",\r\n overflow: \"hidden\",\r\n },\r\n structureButtons: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr auto auto auto auto\",\r\n },\r\n structureList: {\r\n overflow: \"auto\",\r\n },\r\n newStructure: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"auto 1fr\",\r\n paddingRight: \"10px\",\r\n },\r\n};\r\n\r\n/**\r\n * Displays all structures of a project in a collapsible manner.\r\n * @param {object} project The project the strucuture tree referrs to.\r\n * @param {object} user The current user.\r\n * @param {array} structures Optional. All structures of a project. Default: [].\r\n * @param {function} setStructures Optional. Update all structures of a project. Receives (array structures). Default: () => {}.\r\n * @param {Structure} selectedStructure Optional. The currently selected structure. Default: null.\r\n * @param {function} setSelectedStructure Optional. Set the currently selected structure. Receives (Structure structure). Default: () => {}.\r\n * @param {function} triggerAction Optional. Flag a structure to perform an AnnotationAction. Receives (Structure: structure, AnnotationAction: action). Default: () => {}.\r\n * @param {boolean} isLocked Optional. Flag if the structure tree is locked. When locked, no modifications are possible and symbols are hidden. Default: false.\r\n * @param {function} allowChoices Optional. Flag if the structure tree should allow choices. Default: false.\r\n * @param {boolean|function} structureSelectability Optional. Evalaute or determine if a structure is selectable. A function receives (Structure: structure) and returns (boolean: isSelectable).\r\n * @param {boolean} allStructuresEnabled Optional. Flag if all structures are enabled. Overrides structureSelectability. Default: true.\r\n * @returns React node for StructureTree.\r\n */\r\nexport default function StructureTree(props) {\r\n const {\r\n project,\r\n user,\r\n structures = [],\r\n setStructures = () => {},\r\n selectedStructure = null,\r\n setSelectedStructure = () => {},\r\n triggerAction = () => {},\r\n isLocked = false,\r\n allowChoices: isInSelectionMode = false,\r\n structureSelectability = true,\r\n allStructuresEnabled = true,\r\n trainingSettings = null,\r\n setTrainingSettings = () => {},\r\n ...other\r\n } = props;\r\n\r\n const [allRoisHidden, setAllRoisHidden] = useState(false);\r\n const [newStructureName, setNewStructureName] = useState(\"\");\r\n\r\n useEffect(() => {\r\n updateStructureSelectability();\r\n }, [allStructuresEnabled]);\r\n\r\n /**\r\n * Toggles all structures to be either shown or hidden\r\n */\r\n const toggleAllRoisHidden = () => {\r\n const updatedStructures = structures.map((s) => {\r\n s.annotationsAreVisible = !allRoisHidden;\r\n return s;\r\n });\r\n setAllRoisHidden(!allRoisHidden);\r\n setStructures(updatedStructures);\r\n };\r\n\r\n /**\r\n * Determines if the structure can be selected.\r\n * @param {Structure} structure The structure to be checked.\r\n * @returns {bool} True if the structure can be selected, false otherwise.\r\n */\r\n const canBeChosen = (structure) => {\r\n if (typeof structureSelectability === \"function\") {\r\n return isInSelectionMode && structureSelectability(structure);\r\n }\r\n return isInSelectionMode && structureSelectability;\r\n };\r\n\r\n const updateStructureSelectability = () => {\r\n setStructures(\r\n structures.map((s) => {\r\n s.canBeChosen = canBeChosen(s);\r\n return s;\r\n })\r\n );\r\n };\r\n\r\n /**\r\n * Add a new structure to bottom of top-level structures.\r\n * @param {string} label The name of the new structure.\r\n */\r\n const addNewStructure = (label) => {\r\n if (isLocked) return;\r\n\r\n if (typeof label !== \"string\") {\r\n throw TypeError(\r\n `label must be of type string, received ${typeof label}: ${label}`\r\n );\r\n }\r\n\r\n // Do not allow structures without name\r\n if (label === \"\") {\r\n window.showWarningSnackbar(\"Please name the structure before adding it\");\r\n return;\r\n }\r\n\r\n setStructures(\r\n insertStructure(\r\n new Structure(\r\n newStructureId(structures),\r\n label,\r\n true,\r\n getUnusedColor(structures),\r\n true,\r\n null,\r\n 0,\r\n false,\r\n true,\r\n false,\r\n 0,\r\n 0\r\n ),\r\n structures\r\n )\r\n );\r\n setNewStructureName(\"\");\r\n };\r\n\r\n return (\r\n \r\n {!isLocked && (\r\n \r\n {`Structures (${structures.length})`}\r\n \r\n {\r\n if (selectedStructure) {\r\n triggerAction(selectedStructure, AnnotationAction.DeleteAll);\r\n } else {\r\n window.showWarningSnackbar(\"Please select structure first.\");\r\n }\r\n }}\r\n >\r\n \r\n \r\n \r\n 0\r\n ? \"Hide all structures [Shift] + [R]\"\r\n : \"Show all structures [Shift] + [R]\"\r\n }\r\n >\r\n \r\n {allRoisHidden ? : }\r\n \r\n \r\n \r\n \r\n exportStructures(user.fullName, project, structures)\r\n }\r\n >\r\n \r\n \r\n \r\n \r\n \r\n importStructures(\r\n newStructureId(structures),\r\n (newStructs) => {\r\n setStructures(newStructs);\r\n window.showSuccessSnackbar(\r\n `Successfully imported ${newStructs.length} structures`\r\n );\r\n },\r\n (err) => window.showErrorSnackbar(err)\r\n )\r\n }\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n }\r\n defaultExpandIcon={}\r\n expanded={structures\r\n .filter((s) => s.isUnfolded)\r\n .map((s) => s.id.toString())}\r\n onNodeToggle={(_, expandedNodeIds) => {\r\n let newStructures = structures.map((s) => {\r\n s.isUnfolded = expandedNodeIds.includes(s.id.toString())\r\n ? true\r\n : false;\r\n return s;\r\n });\r\n setStructures(newStructures);\r\n }}\r\n >\r\n {structures\r\n .filter((s) => s instanceof Structure && s.parentId === null)\r\n .map((structure) => (\r\n setStructures(structures)}\r\n selectedStructure={selectedStructure}\r\n setSelectedStructure={setSelectedStructure}\r\n triggerAction={triggerAction}\r\n isLocked={isLocked}\r\n isInSelectionMode={isInSelectionMode}\r\n updateChoosability={() => updateStructureSelectability()}\r\n trainingSettings={trainingSettings}\r\n setTrainingSettings={setTrainingSettings}\r\n />\r\n ))}\r\n \r\n {!isLocked && (\r\n \r\n \r\n addNewStructure(newStructureName)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n setNewStructureName(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n addNewStructure(newStructureName);\r\n }\r\n }}\r\n />\r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nStructureTree.propTypes = {\r\n project: PropTypes.object.isRequired,\r\n user: PropTypes.object,\r\n structures: PropTypes.array,\r\n setStructures: PropTypes.func,\r\n selectedStructure: PropTypes.instanceOf(Structure),\r\n setSelectedStructure: PropTypes.func,\r\n triggerAction: PropTypes.func,\r\n isLocked: PropTypes.bool,\r\n allowChoices: PropTypes.bool,\r\n structureSelectability: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),\r\n allStructuresEnabled: PropTypes.bool,\r\n trainingSettings: PropTypes.object,\r\n setTrainingSettings: PropTypes.func,\r\n};\r\n","// Framework imports\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n// import { styled } from \"@mui/system\";\r\n\r\nimport { AudioViewerContext } from \"../AudioViewer\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport { Typography, Tooltip, IconButton, ListItemButton } from \"@mui/material\";\r\n\r\n// Icons\r\nimport RemoveCircleIcon from \"@mui/icons-material/RemoveCircle\";\r\nimport AddCircleIcon from \"@mui/icons-material/AddCircle\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n previewImageContainer: {\r\n position: \"relative\",\r\n },\r\n importText: {\r\n padding: 5,\r\n fontWeight: \"bold\",\r\n lineHeight: \"45px\",\r\n display: \"inline-block\",\r\n },\r\n lineThrough1: {\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n pointerEvents: \"none\",\r\n background:\r\n \"linear-gradient(to bottom right, transparent calc(50% - 1px), red, transparent calc(50% + 1px) )\",\r\n },\r\n lineThrough2: {\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n pointerEvents: \"none\",\r\n background:\r\n \"linear-gradient(to top right, transparent calc(50% - 1px), red, transparent calc(50% + 1px) )\",\r\n },\r\n sceneItem: {\r\n position: \"relative\",\r\n display: \"inline-block\",\r\n width: \"fit-content\",\r\n paddingLeft: \"5px\",\r\n objectFit: \"contain\",\r\n // border: \"1px solid #ccc!important\",\r\n cursor: \"pointer\",\r\n \"& button\": {\r\n padding: 0,\r\n visibility: \"hidden\",\r\n zIndex: 999999,\r\n width: 0,\r\n height: 0,\r\n },\r\n \"&:hover\": {\r\n boxShadow: \"1px 1px 2px #333\",\r\n \"& button\": {\r\n visibility: \"visible\",\r\n zIndex: 999999999999,\r\n },\r\n },\r\n },\r\n excludeButton: {\r\n position: \"absolute\",\r\n top: 0,\r\n right: 0,\r\n },\r\n});\r\n\r\n/**\r\n * Displays all Audio Files of the project.\r\n */\r\nconst AudioFileTree = (props) => {\r\n const { classes } = props;\r\n const AudioViewer = React.useContext(AudioViewerContext);\r\n const { selectedFile } = AudioViewer;\r\n const { files } = AudioViewer.project;\r\n const selectedFileIdx =\r\n files && selectedFile\r\n ? files.findIndex((file) => file.id === selectedFile.id)\r\n : 0;\r\n\r\n const onExcludeAudioFileToggle = (e, file) => {\r\n file.excluded = !file.excluded;\r\n AudioViewer.updateFiles(files);\r\n e.preventDefault();\r\n e.stopPropagation();\r\n };\r\n\r\n const onSelectFile = (file) => {\r\n AudioViewer.updateSelectedFile(file);\r\n };\r\n\r\n const hasNotExcludedScenes = () => {\r\n const result = files.some((file) => !file.excluded);\r\n return result;\r\n };\r\n\r\n const onExcludeFilesToggle = () => {\r\n const exludedValue = hasNotExcludedScenes();\r\n AudioViewer.updateFiles(\r\n files.map((file) => {\r\n file.excluded = exludedValue;\r\n return file;\r\n })\r\n );\r\n };\r\n\r\n return (\r\n
    \r\n {files && [\r\n \r\n \r\n {\"Files (\" + files.length + \"):\"}\r\n \r\n \r\n {\r\n const toExclude = hasNotExcludedScenes(files);\r\n onExcludeFilesToggle(\r\n files.filter((file) => file.excludeScene !== toExclude),\r\n toExclude\r\n );\r\n }}\r\n >\r\n {hasNotExcludedScenes(files) ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n
    ,\r\n
    \r\n {files.map((file, fileIdx) => (\r\n //
    \r\n // {\r\n // file.visible = e.target.checked;\r\n // AudioViewer.updateFiles(files);\r\n // }}\r\n // />\r\n // }\r\n // />\r\n //
    \r\n \r\n onSelectFile(file)}\r\n >\r\n
    \r\n
    {file.fileName}
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n onExcludeAudioFileToggle(e, file)}\r\n // onClick={() =>\r\n // onExcludeFilesToggle([file.visilbe], !sceneFile.excludeScene)\r\n // }\r\n >\r\n {file.excluded ? : }\r\n \r\n \r\n \r\n ))}\r\n ,\r\n ]}\r\n \r\n );\r\n};\r\n\r\nAudioFileTree.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(AudioFileTree);\r\n","// Copyright HS Analysis GmbH, 2023\r\n// Author: Valentin Haas\r\n\r\n// HSA imports\r\nimport { isInt } from \"../utils/Utils\";\r\nimport Structure from \"./Structure\";\r\n\r\n// #region Option sets for the AI training\r\n\r\n// Shared data structures for the AI training\r\n// Keep in sync with:\r\n// Source\\HSA-KIT\\Models\\AITrainingSettings.cs\r\n// Source\\HSA-KIT\\modules\\hsa\\core\\ai\\models.py\r\n// Source\\HSA-KIT\\ClientApp\\src\\common\\components\\AITrainingSettings.jsx\r\n\r\n/**\r\n * All principle dataset creation approaches.\r\n */\r\nexport const DatasetApproach = Object.freeze({\r\n ImageFileBased: 0,\r\n ImageObjectBased: 1,\r\n ImageSlidingWindow: 2,\r\n AudioFileBased: 10,\r\n AudioSlidingWindow: 11,\r\n});\r\n\r\n/**\r\n * Readable names for the principle dataset creation approaches.\r\n */\r\nexport const DatasetApproachNames = Object.freeze({\r\n [DatasetApproach.ImageFileBased]: \"File Based\",\r\n [DatasetApproach.ImageObjectBased]: \"Object Based\",\r\n [DatasetApproach.ImageSlidingWindow]: \"Sliding Window\",\r\n [DatasetApproach.AudioFileBased]: \"File Based\",\r\n [DatasetApproach.AudioSlidingWindow]: \"Sliding Window\",\r\n});\r\n\r\n/**\r\n * Abbreviations for the principle dataset creation approaches.\r\n */\r\nexport const DatasetApproachShort = Object.freeze({\r\n [DatasetApproach.ImageFileBased]: \"i-fb\",\r\n [DatasetApproach.ImageObjectBased]: \"i-ob\",\r\n [DatasetApproach.ImageSlidingWindow]: \"i-sw\",\r\n [DatasetApproach.AudioFileBased]: \"a-fb\",\r\n [DatasetApproach.AudioSlidingWindow]: \"a-sw\",\r\n});\r\n\r\n/**\r\n * All training model types.\r\n */\r\nexport const DatasetType = Object.freeze({\r\n ImageClassification: 0,\r\n ImageObjectDetection: 1,\r\n ImageSegmentation: 2,\r\n ImageInstanceSegmentation: 3,\r\n AudioClassification: 10,\r\n AudioSequenceDetection: 11,\r\n AudioSequenceSegmentation: 12,\r\n AudioSequenceInstanceSegmentation: 13,\r\n});\r\n\r\n/**\r\n * Readable names for the training model types.\r\n */\r\nexport const DatasetTypeNames = Object.freeze({\r\n [DatasetType.ImageClassification]: \"Classification\",\r\n [DatasetType.ImageObjectDetection]: \"Object Detection\",\r\n [DatasetType.ImageSegmentation]: \"Segmentation\",\r\n [DatasetType.ImageInstanceSegmentation]: \"Instance Segmentation\",\r\n [DatasetType.AudioClassification]: \"Classification\",\r\n [DatasetType.AudioSequenceDetection]: \"Object Detection\",\r\n [DatasetType.AudioSequenceSegmentation]: \"Segmentation\",\r\n [DatasetType.AudioSequenceInstanceSegmentation]: \"Instance Segmentation\",\r\n});\r\n\r\n/**\r\n * Abbreviations for the training model types.\r\n */\r\nexport const DatasetTypeShort = Object.freeze({\r\n [DatasetType.ImageClassification]: \"i-cl\",\r\n [DatasetType.ImageObjectDetection]: \"i-od\",\r\n [DatasetType.ImageSegmentation]: \"i-seg\",\r\n [DatasetType.ImageInstanceSegmentation]: \"i-iseg\",\r\n [DatasetType.AudioClassification]: \"a-cl\",\r\n [DatasetType.AudioSequenceDetection]: \"a-sd\",\r\n [DatasetType.AudioSequenceSegmentation]: \"a-seg\",\r\n [DatasetType.AudioSequenceInstanceSegmentation]: \"a-iseg\",\r\n});\r\n\r\n/**\r\n * A collection of all image dataset types.\r\n */\r\nexport const ImageDatasetTypes = [\r\n DatasetType.ImageClassification,\r\n DatasetType.ImageObjectDetection,\r\n DatasetType.ImageSegmentation,\r\n DatasetType.ImageInstanceSegmentation,\r\n];\r\n\r\n/**\r\n * A collection of all audio dataset types.\r\n */\r\nexport const AudioDatasetTypes = [\r\n DatasetType.AudioClassification,\r\n DatasetType.AudioSequenceDetection,\r\n DatasetType.AudioSequenceSegmentation,\r\n DatasetType.AudioSequenceInstanceSegmentation,\r\n];\r\n\r\n/**\r\n * A collection of all image dataset approaches.\r\n */\r\nexport const ImageDatasetApproaches = [\r\n DatasetApproach.ImageFileBased,\r\n DatasetApproach.ImageObjectBased,\r\n DatasetApproach.ImageSlidingWindow,\r\n];\r\n\r\n/**\r\n * A collection of all audio dataset approaches.\r\n */\r\nexport const AudioDatasetApproaches = [\r\n DatasetApproach.AudioFileBased,\r\n DatasetApproach.AudioSlidingWindow,\r\n];\r\n\r\n/**\r\n * All principle training data types.\r\n */\r\nexport const TrainingDataTypes = Object.freeze({\r\n Image: 0,\r\n Audio: 1,\r\n});\r\n\r\n/**\r\n * Mapping of training data types to project types.\r\n */\r\nconst _trainingDataTypebyModuleName = Object.freeze({\r\n AudioAnnotator: TrainingDataTypes.Audio,\r\n});\r\n\r\n/**\r\n * Returns the training data type for a given module.\r\n * @param {string} projectType The name of the module currently loaded to get the training data type for.\r\n * @returns {TrainingDataTypes} The training data type for the given module. Defaults to trainingDataTypes.Image.\r\n */\r\nexport const trainingDataTypebyModuleName = (projectType = \"\") => {\r\n return _trainingDataTypebyModuleName[projectType] || TrainingDataTypes.Image;\r\n};\r\n\r\n/**\r\n * All available metrics for training.\r\n */\r\nexport const Metrics = Object.freeze({\r\n Accuracy: 0,\r\n});\r\nexport const MetricsNames = Object.freeze({\r\n [Metrics.Accuracy]: \"Accuracy\",\r\n});\r\n\r\n/**\r\n * All available loss functions for training.\r\n */\r\nexport const LossFunction = Object.freeze({\r\n CrossEntropy: 0,\r\n Dice: 1,\r\n CrossEntropyDice: 2,\r\n});\r\nexport const LossFunctionNames = Object.freeze({\r\n [LossFunction.CrossEntropy]: \"Cross Entropy\",\r\n [LossFunction.Dice]: \"Dice\",\r\n [LossFunction.CrossEntropyDice]: \"Cross Entropy + Dice\",\r\n});\r\n\r\n/**\r\n * All available optimizers for training.\r\n */\r\nexport const Optimizer = Object.freeze({\r\n Adam: 0,\r\n AdamW: 1,\r\n SGD: 2,\r\n});\r\nexport const OptimizerNames = Object.freeze({\r\n [Optimizer.Adam]: \"Adam\",\r\n [Optimizer.AdamW]: \"AdamW\",\r\n [Optimizer.SGD]: \"SGD\",\r\n});\r\n\r\n// #endregion\r\n\r\n// region Default values\r\nconst _DefaultDatasetTypeMappings = Object.freeze({\r\n AudioAnnotator: DatasetType.AudioSequenceDetection,\r\n});\r\n\r\n/**\r\n * Get a default model type for a given project type.\r\n * @param {string} projectType The type of the project to get the default model type for.\r\n * @returns {DatasetType} The default model type for the given project type.\r\n */\r\nexport const DefaultDatasetType = (projectType = \"\") => {\r\n return (\r\n _DefaultDatasetTypeMappings[projectType] ||\r\n DatasetType.ImageInstanceSegmentation\r\n );\r\n};\r\n\r\nconst _DefaultDatasetApproachMappings = Object.freeze({\r\n AudioAnnotator: DatasetApproach.AudioFileBased,\r\n});\r\n\r\n/**\r\n * Get a default dataset approach for a given project type.\r\n * @param {string} projectType The type of the project to get the default dataset approach for.\r\n * @returns {DatasetApproach} The default dataset approach for the given project type.\r\n */\r\nexport const DefaultDatasetApproach = (projectType = \"\") => {\r\n return (\r\n _DefaultDatasetApproachMappings[projectType] ||\r\n DatasetApproach.ImageSlidingWindow\r\n );\r\n};\r\n\r\n// #endregion\r\n\r\n// #region Data structures for each individual settings page\r\n/**\r\n * All parameters of AI Training that are not model specific.\r\n * @param {number} epochs Number of epochs to train.\r\n * @param {number} earlyStopping Number of epochs to wait for early stopping.\r\n * @param {number} batchSize Batch size for training.\r\n * @param {number[]} metrics Metrics to use for training.\r\n * @param {string[]} lossFunctions Loss functions to use for training.\r\n * @param {string} optimizer Optimizer to use for training.\r\n * @param {number} learningRate Learning rate to use for training.\r\n */\r\nexport class TrainingParameters {\r\n constructor({\r\n epochs = 1,\r\n earlyStopping = 500,\r\n batchSize = 2,\r\n metrics = [Metrics.Accuracy],\r\n lossFunctions = [LossFunction.CrossEntropy, LossFunction.Dice],\r\n optimizer = Optimizer.AdamW,\r\n learningRate = 1e-4,\r\n } = {}) {\r\n // Input validation\r\n if (!isInt(epochs) || epochs <= 0)\r\n throw TypeError(\r\n `epochs must be of type integer > 0, received ${typeof epochs}: ${epochs}`\r\n );\r\n if (!isInt(earlyStopping) || earlyStopping < 0)\r\n throw TypeError(\r\n `earlyStopping must be of type integer >= 0, received ${typeof earlyStopping}: ${earlyStopping}`\r\n );\r\n if (!isInt(batchSize) || batchSize < 1)\r\n throw TypeError(\r\n `batchSize must be of type integer >= 1, received ${typeof batchSize}: ${batchSize}`\r\n );\r\n if (!Array.isArray(metrics) || metrics.length === 0)\r\n throw TypeError(\r\n `metrics must be of type array with at least one element, received ${typeof metrics}: ${metrics}`\r\n );\r\n for (const metric of metrics) {\r\n if (!isInt(metric) || !Object.values(Metrics).includes(metric))\r\n throw TypeError(\r\n `metrics must be of type array with elements of type Metrics with one of the following values: ${Object.values(\r\n Metrics\r\n )}, received ${typeof metric}: ${metric}`\r\n );\r\n }\r\n\r\n if (!Array.isArray(lossFunctions) || lossFunctions.length === 0)\r\n throw TypeError(\r\n `lossFunctions must be of type array with at least one element, received ${typeof lossFunctions}: ${lossFunctions}`\r\n );\r\n for (const lossFunction of lossFunctions) {\r\n if (\r\n !isInt(lossFunction) ||\r\n !Object.values(LossFunction).includes(lossFunction)\r\n )\r\n throw TypeError(\r\n `lossFunctions must be of type array with elements of type LossFunction with one of the following values: ${Object.values(\r\n LossFunction\r\n )}, received ${typeof lossFunction}: ${lossFunction}`\r\n );\r\n }\r\n\r\n if (!isInt(optimizer) || !Object.values(Optimizer).includes(optimizer))\r\n throw TypeError(\r\n `optimizer must be of type Optimizer with one of the following values: ${Object.values(\r\n Optimizer\r\n )}, received ${typeof optimizer}: ${optimizer}`\r\n );\r\n if (typeof learningRate !== \"number\" || learningRate <= 0)\r\n throw TypeError(\r\n `learningRate must be of type number > 0, received ${typeof learningRate}: ${learningRate}`\r\n );\r\n\r\n this.epochs = epochs;\r\n this.earlyStopping = earlyStopping;\r\n this.batchSize = batchSize;\r\n this.metrics = metrics;\r\n this.lossFunctions = lossFunctions;\r\n this.optimizer = optimizer;\r\n this.learningRate = learningRate;\r\n }\r\n}\r\n\r\n/**\r\n * All meta data of an AI Training.\r\n * @param {string} name Name of the AI Model.\r\n * @param {string} version Version of the AI Model.\r\n * @param {string} description Description of the AI Model.\r\n * @param {boolean} isNewModel Whether the model is new or not.\r\n */\r\nexport class ModelMetaData {\r\n constructor({\r\n name = \"\",\r\n version = \"\",\r\n description = \"\",\r\n isNewModel = true,\r\n } = {}) {\r\n if (typeof name !== \"string\")\r\n throw TypeError(\r\n `name must be of type string, received ${typeof name}: ${name}`\r\n );\r\n if (typeof version !== \"string\")\r\n throw TypeError(\r\n `modelVersion must be of type string, received ${typeof version}: ${version}`\r\n );\r\n if (typeof description !== \"string\")\r\n throw TypeError(\r\n `modelDescription must be of type string, received ${typeof description}: ${description}`\r\n );\r\n if (typeof isNewModel !== \"boolean\")\r\n throw TypeError(\r\n `isNewModel must be of type boolean, received ${typeof isNewModel}: ${isNewModel}`\r\n );\r\n this.name = name;\r\n this.version = version;\r\n this.description = description;\r\n this.isNewModel = isNewModel;\r\n }\r\n}\r\n\r\n/**\r\n * All dataset specific parameters of an AI Training.\r\n * @param {DatasetApproach} datasetApproach Approach to create the dataset. Must be one of the values of DatasetApproach. Default: ImageFileBased.\r\n * @param {DatasetType} datasetType Type of the dataset used. Must be one of the values of DatasetType. Default: ImageClassification.\r\n * @param {boolean} datasetOnly Whether only the dataset should be created or not, without training. Default: false.\r\n * @param {boolean} useExistingDataset Whether an existing dataset should be used or not for training. Default: false.\r\n */\r\nexport class DatasetParameters {\r\n constructor({\r\n datasetApproach = DatasetApproach.ImageSlidingWindow,\r\n datasetType = DatasetType.ImageClassification,\r\n datasetOnly = false,\r\n useExistingDataset = false,\r\n } = {}) {\r\n if (\r\n !isInt(datasetApproach) ||\r\n !Object.values(DatasetApproach).includes(datasetApproach)\r\n )\r\n throw TypeError(\r\n `datasetApproach must be of type DatasetApproach with one of the following values: ${Object.values(\r\n DatasetApproach\r\n )}, received ${typeof datasetApproach}: ${datasetApproach}`\r\n );\r\n if (\r\n !isInt(datasetType) ||\r\n !Object.values(DatasetType).includes(datasetType)\r\n )\r\n throw TypeError(\r\n `datasetType must be of type DatasetType with one of the following values: ${Object.values(\r\n DatasetType\r\n )}, received ${typeof datasetType}: ${datasetType}`\r\n );\r\n if (typeof datasetOnly !== \"boolean\")\r\n throw TypeError(\r\n `datasetOnly must be of type boolean, received ${typeof datasetOnly}: ${datasetOnly}`\r\n );\r\n if (typeof useExistingDataset !== \"boolean\")\r\n throw TypeError(\r\n `useExistingDataset must be of type boolean, received ${typeof useExistingDataset}: ${useExistingDataset}`\r\n );\r\n this.datasetApproach = datasetApproach;\r\n this.datasetType = datasetType;\r\n this.datasetOnly = datasetOnly;\r\n this.useExistingDataset = useExistingDataset;\r\n }\r\n}\r\n\r\n/**\r\n * General class for all dataset specific parameters of an AI Training.\r\n */\r\nexport class DatasetMeta {\r\n constructor() {}\r\n}\r\n\r\n/**\r\n * All model specific parameters of an image model AI Training.\r\n * @param {DatasetType} datasetType Type of the dataset used. Must be one of the values of DatasetType. Default: ImageClassification.\r\n * @param {number} inputChannels Number of input channels. Can be 1 for grayscale images, 3 for RGB images, or more for multispectral images.\r\n * @param {Array} fluorescenceChannels List of fluorescence channels. Default: [].\r\n * @param {number} spatialDims Number of spatial dimensions. Can be 2 for 2D images or 3 for 3D images.\r\n * @param {number} imageWidth Width of an dataset image.\r\n * @param {number} imageHeight Height of an dataset image.\r\n * @param {number} numberOfClasses Number of classes to predict.\r\n */\r\nexport class ImageDatasetMeta extends DatasetMeta {\r\n constructor({\r\n datasetType = DatasetType.ImageClassification,\r\n inputChannels = 3,\r\n fluorescenceChannels = [],\r\n spatialDims = 2,\r\n imageWidth = 512,\r\n imageHeight = 512,\r\n numberOfClasses = 2,\r\n pyramidLevel = -1,\r\n } = {}) {\r\n super();\r\n\r\n // Input validation\r\n if (\r\n !isInt(datasetType) ||\r\n !Object.values(DatasetType).includes(datasetType)\r\n )\r\n throw TypeError(\r\n `datasetType must be of type DatasetType with one of the following values: ${Object.values(\r\n DatasetType\r\n )}, received ${typeof datasetType}: ${datasetType}`\r\n );\r\n if (!isInt(inputChannels) || inputChannels < 1)\r\n throw TypeError(\r\n `inputChannels must be of type integer >= 1, received ${typeof inputChannels}: ${inputChannels}`\r\n );\r\n if (!Array.isArray(fluorescenceChannels))\r\n throw TypeError(\r\n `fluorescenceChannels must be of type array, received ${typeof fluorescenceChannels}: ${fluorescenceChannels}`\r\n );\r\n if (!isInt(spatialDims) || spatialDims < 2 || spatialDims > 3)\r\n throw TypeError(\r\n `spatialDims must be of type integer >= 2 and <= 3, received ${typeof spatialDims}: ${spatialDims}`\r\n );\r\n if (!isInt(imageWidth) || imageWidth < 1)\r\n throw TypeError(\r\n `imageWidth must be of type integer >= 1, received ${typeof imageWidth}: ${imageWidth}`\r\n );\r\n if (!isInt(imageHeight) || imageHeight < 1)\r\n throw TypeError(\r\n `imageHeight must be of type integer >= 1, received ${typeof imageHeight}: ${imageHeight}`\r\n );\r\n if (!isInt(numberOfClasses) || numberOfClasses < 2)\r\n throw TypeError(\r\n `numberOfClasses must be of type integer >= 2, received ${typeof numberOfClasses}: ${numberOfClasses}`\r\n );\r\n if (!isInt(pyramidLevel) || pyramidLevel < -1)\r\n throw TypeError(\r\n `pyramidLevel must be of type integer >= -1, received ${typeof pyramidLevel}: ${pyramidLevel}`\r\n );\r\n\r\n // Set parameters\r\n this.datasetType = datasetType;\r\n this.inputChannels = inputChannels;\r\n this.fluorescenceChannels = fluorescenceChannels;\r\n this.spatialDims = spatialDims;\r\n this.imageWidth = imageWidth;\r\n this.imageHeight = imageHeight;\r\n this.numberOfClasses = numberOfClasses;\r\n this.pyramidLevel = pyramidLevel;\r\n }\r\n}\r\n\r\n/**\r\n * All model specific parameters of an audio model AI Training.\r\n * @param {DatasetType} datasetType Type of the dataset used. Must be one of the values of DatasetType. Default: AudioClassification.\r\n * @param {number} sequenceLengthSeconds Length of an audio sequence in seconds. 0 for full length. Default: 0.\r\n * @param {number} sequenceOverlapSeconds Overlap of audio sequences in seconds. Negative values for gaps between sequences. Default: 0.\r\n * @param {number} numberOfClasses Number of classes to predict. Default: 1.\r\n */\r\nexport class AudioDatasetMeta extends DatasetMeta {\r\n constructor({\r\n datasetType = DatasetType.AudioClassification,\r\n sequenceLengthSeconds = 0,\r\n sequenceOverlapSeconds = 0,\r\n numberOfClasses = 1,\r\n } = {}) {\r\n super();\r\n\r\n // Input validation\r\n if (\r\n !isInt(datasetType) ||\r\n !Object.values(DatasetType).includes(datasetType)\r\n )\r\n throw TypeError(\r\n `datasetType must be of type DatasetType with one of the following values: ${Object.values(\r\n DatasetType\r\n )}, received ${typeof datasetType}: ${datasetType}`\r\n );\r\n if (typeof sequenceLengthSeconds !== \"number\" || sequenceLengthSeconds < 0)\r\n throw TypeError(\r\n `sequenceLengthSeconds must be of type number >= 0, received ${typeof sequenceLengthSeconds}: ${sequenceLengthSeconds}`\r\n );\r\n if (typeof sequenceOverlapSeconds !== \"number\")\r\n throw TypeError(\r\n `sequenceOverlapSeconds must be of type number, received ${typeof sequenceOverlapSeconds}: ${sequenceOverlapSeconds}`\r\n );\r\n\r\n if (!isInt(numberOfClasses) || numberOfClasses < 1)\r\n throw TypeError(\r\n `numberOfClasses must be of type integer >= 1, received ${typeof numberOfClasses}: ${numberOfClasses}`\r\n );\r\n\r\n // Set parameters\r\n this.datasetType = datasetType;\r\n this.sequenceLengthSeconds = sequenceLengthSeconds;\r\n this.sequenceOverlapSeconds = sequenceOverlapSeconds;\r\n this.numberOfClasses = numberOfClasses;\r\n }\r\n}\r\n\r\n/**\r\n * Mapping of model parameters to dataset types.\r\n */\r\nconst _ModelParameterMappping = Object.freeze({\r\n [DatasetType.ImageClassification]: new ImageDatasetMeta(\r\n DatasetType.ImageClassification\r\n ),\r\n [DatasetType.ImageObjectDetection]: new ImageDatasetMeta(\r\n DatasetType.ImageObjectDetection\r\n ),\r\n [DatasetType.ImageSegmentation]: new ImageDatasetMeta(\r\n DatasetType.ImageSegmentation\r\n ),\r\n [DatasetType.ImageInstanceSegmentation]: new ImageDatasetMeta(\r\n DatasetType.ImageInstanceSegmentation\r\n ),\r\n [DatasetType.AudioClassification]: new AudioDatasetMeta(\r\n DatasetType.AudioClassification\r\n ),\r\n [DatasetType.AudioSequenceDetection]: new AudioDatasetMeta(\r\n DatasetType.AudioSequenceDetection\r\n ),\r\n [DatasetType.AudioSequenceSegmentation]: new AudioDatasetMeta(\r\n DatasetType.AudioSequenceSegmentation\r\n ),\r\n [DatasetType.AudioSequenceInstanceSegmentation]: new AudioDatasetMeta(\r\n DatasetType.AudioSequenceInstanceSegmentation\r\n ),\r\n});\r\n\r\n/**\r\n * Returns the model parameters for a given dataset type.\r\n * @param {DatasetType} datasetType The type of the dataset to get the model parameters for.\r\n * @returns {DatasetMeta}\r\n */\r\nexport const getModelParameters = (datasetType) => {\r\n return _ModelParameterMappping[datasetType] || new DatasetMeta();\r\n};\r\n\r\n// #endregion\r\n\r\n/**\r\n * All settings of an AI Training.\r\n * @param {Uuid} projectId ID of the project to train on.\r\n * @param {ModelMetaData} metaData Meta data of the AI Model.\r\n * @param {DatasetParameters} datasetParameters Dataset specific parameters of the AI Training.\r\n * @param {TrainingParameters} trainingParameters Training specific parameters of the AI Training.\r\n * @param {DatasetMeta} modelParameters Model specific parameters of the AI Training.\r\n * @param {Structure[]} structures Structures to train on.\r\n * @param {String} trainingStatus status of the AI Training.\r\n */\r\nexport default class AITrainingSettings {\r\n constructor(\r\n projectId,\r\n projectType,\r\n metaData = new ModelMetaData(),\r\n datasetParameters = new DatasetParameters(),\r\n trainingParameters = new TrainingParameters(),\r\n modelParameters = new DatasetMeta(),\r\n structures = []\r\n ) {\r\n // Input validation\r\n // if (!isUuid(projectId))\r\n // throw TypeError(\r\n // `projectId must be of type uuid, received ${typeof projectId}: ${projectId}`\r\n // );\r\n if (typeof projectType !== \"string\")\r\n throw TypeError(\r\n `projectType must be of type string, received ${typeof projectType}: ${projectType}`\r\n );\r\n if (!(metaData instanceof ModelMetaData))\r\n throw TypeError(\r\n `metaData must be of type ModelMetaData, received ${typeof metaData}: ${metaData}`\r\n );\r\n if (!(datasetParameters instanceof DatasetParameters))\r\n throw TypeError(\r\n `datasetParameters must be of type DatasetParameters, received ${typeof datasetParameters}: ${datasetParameters}`\r\n );\r\n if (!(trainingParameters instanceof TrainingParameters))\r\n throw TypeError(\r\n `trainingParameters must be of type TrainingParameters, received ${typeof trainingParameters}: ${trainingParameters}`\r\n );\r\n if (!(modelParameters instanceof DatasetMeta))\r\n throw TypeError(\r\n `modelParameters must be of type DatasetMeta, received ${typeof modelParameters}: ${modelParameters}`\r\n );\r\n if (!Array.isArray(structures))\r\n throw TypeError(\r\n `structures must be of type array, received ${typeof structures}: ${structures}`\r\n );\r\n\r\n for (const structure of structures) {\r\n if (!(structure instanceof Structure))\r\n throw TypeError(\r\n `structures must be of type array with elements of type Structure, received ${typeof structure}: ${structure}`\r\n );\r\n }\r\n\r\n // Set parameters\r\n this.projectId = projectId;\r\n this.projectType = projectType;\r\n this.metaData = metaData;\r\n this.datasetParameters = datasetParameters;\r\n this.trainingParameters = trainingParameters;\r\n this.modelParameters = modelParameters;\r\n this.structures = structures;\r\n }\r\n}\r\n","// Copyright: HS Analysis GmbH, 2023\r\n// Author: Valentin Haas\r\n\r\n// Framework imports\r\nimport React, { useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// External packages\r\nimport { ValidatorForm } from \"react-material-ui-form-validator\";\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport Stepper from \"@mui/material/Stepper\";\r\nimport Step from \"@mui/material/Step\";\r\nimport StepButton from \"@mui/material/StepButton\";\r\nimport MobileStepper from \"@mui/material/MobileStepper\";\r\nimport KeyboardArrowLeft from \"@mui/icons-material/KeyboardArrowLeft\";\r\nimport KeyboardArrowRight from \"@mui/icons-material/KeyboardArrowRight\";\r\n\r\n// HSA packages\r\n\r\nconst styles = {\r\n dialog: {\r\n overflowY: \"hidden\",\r\n minHeight: \"100%\",\r\n \"& .MuiPaperRoot\": {\r\n maxWidth: \"none\",\r\n },\r\n \"& .MuiDialogContentRoot\": {\r\n padding: 0,\r\n },\r\n },\r\n dialogContent: {\r\n padding: 0,\r\n },\r\n content: {\r\n width: 900,\r\n height: 500,\r\n overflowY: \"auto\",\r\n },\r\n stepper: {\r\n width: \"76%\",\r\n left: \"12%\",\r\n position: \"relative\",\r\n marginBottom: \"-50px\",\r\n paddingBottom: \"10px\",\r\n marginTop: \"25px\",\r\n background: \"#fafafa\",\r\n },\r\n};\r\n\r\n/**\r\n * General dialog with a stepper and a form.\r\n * Takes an array of steps and displays them in the stepper.\r\n * The content of the steps is displayed in the form.\r\n * @param {boolean} isOpen Whether the dialog is open or not.\r\n * @param {function} setOpen Function to set the open state of the dialog.\r\n * @param {array} steps Array of steps to display in the dialog. Steps are objects with a title and content.\r\n * @param {function} onSubmit Async function to call when the form is completed and the submit button is pressed. In case of error, should return the page to jump to.\r\n * @param {string} submitMessage Optional. Message to display on the submit button. Default: \"Submit\"\r\n * @param {function} onNext Optional. Function to call when the next button is pressed. Called with the currently active step. Default: () => {}\r\n * @param {function} onBack Optional. Function to call when the back button is pressed. Called with the currently active step. Default: () => {}\r\n *\r\n * @returns {JSX.Element} A dialog with a stepper and a form.\r\n */\r\nexport default function StepperDialog(props) {\r\n const {\r\n isOpen,\r\n setOpen,\r\n steps = [],\r\n onSubmit,\r\n submitMessage = \"Submit\",\r\n onNext = () => {},\r\n onBack = () => {},\r\n ...other\r\n } = props;\r\n const [activeStep, setActiveStep] = useState(0);\r\n\r\n /**\r\n * Continues to the next step. If the last step is reached, the onSubmit function is called.\r\n * @returns {void}\r\n */\r\n const handleNext = async () => {\r\n // If it has a validate function, validate the current step\r\n if (\"validate\" in steps[activeStep]) {\r\n const validated = await steps[activeStep].validate();\r\n if (!validated) {\r\n return;\r\n }\r\n }\r\n if (activeStep === steps.length - 1) {\r\n await onSubmit()\r\n .then(() => {\r\n setOpen(false);\r\n })\r\n .catch((pageToJumpTo) => {\r\n if (pageToJumpTo !== null && pageToJumpTo !== undefined) {\r\n setActiveStep(pageToJumpTo);\r\n }\r\n });\r\n return;\r\n }\r\n\r\n onNext(activeStep);\r\n setActiveStep((prevActiveStep) => prevActiveStep + 1);\r\n };\r\n\r\n /**\r\n * Goes back to the previous step. If the first step is reached, nothing happens.\r\n */\r\n const handleBack = () => {\r\n onBack(activeStep);\r\n setActiveStep((prevActiveStep) => prevActiveStep - 1);\r\n };\r\n\r\n return (\r\n setOpen(false)}\r\n keepMounted\r\n style={styles.dialog}\r\n maxWidth=\"lg\"\r\n >\r\n \r\n \r\n {steps[activeStep]?.title ?? \"\"}\r\n \r\n {steps[activeStep]?.content ?? <>Fail}\r\n \r\n \r\n
    \r\n \r\n {steps.map((step, index) => {\r\n const stepProps = {};\r\n const buttonProps = {};\r\n return (\r\n \r\n {\r\n // If it has a validate function, validate the current step\r\n if (\"validate\" in steps[activeStep]) {\r\n const validated = await steps[activeStep].validate();\r\n if (!validated) {\r\n return;\r\n }\r\n }\r\n setActiveStep(index);\r\n }}\r\n {...buttonProps}\r\n >\r\n {step.title ?? index}\r\n \r\n \r\n );\r\n })}\r\n \r\n\r\n \r\n {activeStep === steps.length - 1\r\n ? submitMessage\r\n : steps[activeStep]?.nextButton ?? \"Next\"}\r\n \r\n \r\n }\r\n backButton={\r\n \r\n \r\n {steps[activeStep]?.backButton ?? \"Back\"}\r\n \r\n }\r\n />\r\n
    \r\n
    \r\n \r\n );\r\n}\r\n\r\nStepperDialog.propTypes = {\r\n isOpen: PropTypes.bool,\r\n setOpen: PropTypes.func.isRequired,\r\n steps: PropTypes.array.isRequired,\r\n onSubmit: PropTypes.func.isRequired,\r\n submitMessage: PropTypes.string,\r\n onNext: PropTypes.func,\r\n onBack: PropTypes.func,\r\n};\r\n","// Copyright: HS Analysis GmbH, 2023\r\n// Author: Valentin Haas\r\n\r\n// Framework imports\r\nimport React, { useEffect, useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// External packages\r\nimport DialogContentText from \"@mui/material/DialogContentText\";\r\nimport Grid from \"@mui/material/Grid\";\r\nimport Button from \"@mui/material/Button\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\r\nimport { Typography } from \"@mui/material\";\r\n\r\n// HSA packages\r\nimport {\r\n DatasetTypeShort,\r\n DatasetApproachShort,\r\n} from \"../../../common/components/AITrainingSettings\";\r\n\r\nconst styles = {\r\n modelSelButtonContainer: {\r\n marginBottom: \"10px\",\r\n },\r\n modelSelButton: {\r\n width: \"20%\",\r\n marginRight: \"5px\",\r\n },\r\n existingModel: {\r\n minWidth: 200,\r\n marginRight: \"5px\",\r\n },\r\n existingVersion: {\r\n minWidth: 100,\r\n },\r\n};\r\n\r\n/**\r\n * Component to display the model metadata selection in the AI training dialog.\r\n * @param {AITrainingSettings} trainingSettings All settings for the AI training, as defined in the AITrainingSettings class.\r\n * @param {function} setTrainingSettings Function to set the training settings.\r\n * @param {array} existingAiModels Array of existing AI models.\r\n * @param {boolean} nameInUse Whether the model name is already used in the existing AI models.\r\n * @param {boolean} containsInvalidChar Whether the model name contains invalid characters.\r\n * @returns {JSX.Element} The component to display.\r\n */\r\nexport default function ModelMetaData(props) {\r\n const {\r\n trainingSettings,\r\n setTrainingSettings,\r\n existingAiModels,\r\n nameInUse,\r\n containsInvalidChar,\r\n } = props;\r\n\r\n const [useHSANamingFormat, setUseHSANamingFormat] = useState(true);\r\n const [modelName, setModelName] = useState(\"\");\r\n\r\n const modelVersion = trainingSettings.metaData.version;\r\n const isNewModel = trainingSettings.metaData.isNewModel;\r\n\r\n useEffect(() => {\r\n let initialModelName = trainingSettings.structures[0].label;\r\n if (useHSANamingFormat) {\r\n trainingSettings.metaData.name = getHSAModelName(initialModelName);\r\n } else {\r\n trainingSettings.metaData.name = modelName;\r\n }\r\n setTrainingSettings(trainingSettings);\r\n setModelName(initialModelName);\r\n }, []);\r\n\r\n /**\r\n * Generates the HSA model name based on the user-defined model name and the training settings.\r\n * @param {string} name The user-defined model name.\r\n * @returns {string} The HSA model name, based on the user-defined model name and the training settings.\r\n */\r\n const getHSAModelName = (name) => {\r\n const nameParts = [name];\r\n\r\n if (trainingSettings.datasetParameters.datasetType) {\r\n nameParts.push(\r\n DatasetTypeShort[trainingSettings.datasetParameters.datasetType]\r\n );\r\n }\r\n\r\n // Structure indices that are used for training\r\n if (trainingSettings.structures.length > 0) {\r\n nameParts.push(\r\n trainingSettings.structures[0].label +\r\n (trainingSettings.structures.length > 1\r\n ? \"(\" + trainingSettings.structures.length.toString() + \")\"\r\n : \"\")\r\n );\r\n }\r\n\r\n // Dataset approach that is used for training\r\n if (trainingSettings.datasetParameters.datasetApproach) {\r\n nameParts.push(\r\n DatasetApproachShort[trainingSettings.datasetParameters.datasetApproach]\r\n );\r\n }\r\n\r\n // Image height that is used for training\r\n if (trainingSettings.modelParameters.imageHeight) {\r\n nameParts.push(`${trainingSettings.modelParameters.imageHeight}px`);\r\n }\r\n\r\n // Pyramid level that is used for training\r\n if (trainingSettings.modelParameters.pyramidLevel) {\r\n nameParts.push(trainingSettings.modelParameters.pyramidLevel.toString());\r\n }\r\n\r\n // Input channels that are used for training\r\n if (trainingSettings.modelParameters.fluorescenceChannels) {\r\n if (trainingSettings.modelParameters.fluorescenceChannels.length === 0) {\r\n // Brightfield\r\n nameParts.push(\r\n trainingSettings.modelParameters.inputChannels === 3 ? \"rgb\" : \"grey\"\r\n );\r\n } else {\r\n // Fluorescence\r\n nameParts.push(\r\n JSON.stringify(\r\n trainingSettings.modelParameters.fluorescenceChannels\r\n ).replace(/\"/g, \"\")\r\n );\r\n }\r\n }\r\n\r\n return nameParts.join(\"_\");\r\n };\r\n\r\n return (\r\n <>\r\n \r\n
    \r\n You can train a new model from scratch or start training based on an\r\n existing model:\r\n
      \r\n
    • \r\n Train from scratch: type in name of your model\r\n
    • \r\n
    • \r\n Use existing model: select existing model name\r\n and version\r\n
    • \r\n
    \r\n
    \r\n \r\n {/* Two buttons next to each other, choosing between new or existing */}\r\n \r\n {\r\n if (trainingSettings.metaData.isNewModel) return;\r\n trainingSettings.metaData.name = \"\";\r\n trainingSettings.metaData.version = \"\";\r\n trainingSettings.metaData.isNewModel = true;\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n >\r\n New Model\r\n \r\n {\r\n if (!trainingSettings.metaData.isNewModel) return;\r\n trainingSettings.metaData.name = \"\";\r\n trainingSettings.metaData.version = \"\";\r\n trainingSettings.metaData.isNewModel = false;\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n >\r\n Existing Model\r\n \r\n \r\n {/* If new model is selected, show text field to enter model name */}\r\n {isNewModel && isNewModel !== null && (\r\n
    \r\n
    \r\n '\r\n : \"\"\r\n }\r\n onChange={(e) => {\r\n setModelName(e.target.value);\r\n if (useHSANamingFormat) {\r\n trainingSettings.metaData.name = getHSAModelName(\r\n e.target.value\r\n );\r\n } else {\r\n trainingSettings.metaData.name = e.target.value;\r\n }\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n />\r\n
    \r\n
    \r\n {\r\n setUseHSANamingFormat(e.target.checked);\r\n if (e.target.checked) {\r\n trainingSettings.metaData.name =\r\n getHSAModelName(modelName);\r\n } else {\r\n trainingSettings.metaData.name = modelName;\r\n }\r\n }}\r\n color=\"primary\"\r\n />\r\n }\r\n label=\"Using HSA naming convention\"\r\n />\r\n
    \r\n {useHSANamingFormat && (\r\n
    \r\n \r\n {\"Model Name: \"}\r\n \r\n {trainingSettings.metaData.name.slice(0, modelName.length)}\r\n \r\n {trainingSettings.metaData.name.slice(modelName.length)}\r\n \r\n
    \r\n )}\r\n
    \r\n )}\r\n {/* If existing model is selected, show dropdown to select model name and version */}\r\n {!trainingSettings.metaData.isNewModel &&\r\n trainingSettings.metaData.isNewModel !== null && (\r\n <>\r\n aiModel.name === modelName)\r\n ?.label ?? \"\"\r\n }\r\n error={modelName === \"\"}\r\n helperText={modelName === \"\" ? \"Please select a model\" : \"\"}\r\n style={styles.existingModel}\r\n onChange={(e) => {\r\n trainingSettings.metaData.name = e.target.value;\r\n trainingSettings.metaData.version = \"\";\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n >\r\n {existingAiModels.map((aiModel) => (\r\n \r\n {aiModel.name}\r\n \r\n )) ?? []}\r\n \r\n {\r\n trainingSettings.metaData.version = e.target.value;\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n >\r\n {existingAiModels\r\n .find((aiModel) => aiModel.name === modelName)\r\n ?.versions.map((version) => (\r\n \r\n {version.label}\r\n \r\n )) ?? [\"\"]}\r\n \r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nModelMetaData.propTypes = {\r\n trainingSettings: PropTypes.object.isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n existingAiModels: PropTypes.array,\r\n nameInUse: PropTypes.bool,\r\n containsInvalidChar: PropTypes.bool,\r\n};\r\n\r\nModelMetaData.defaultProps = {\r\n existingAiModels: [],\r\n nameInUse: false,\r\n containsInvalidChar: false,\r\n};\r\n","// Copyright: HS Analysis GmbH, 2023\r\n// Author: Valentin Haas\r\n\r\n// Framework imports\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// External packages\r\nimport DialogContentText from \"@mui/material/DialogContentText\";\r\nimport ImageListItem from \"@mui/material/ImageListItem\";\r\nimport ImageListItemBar from \"@mui/material/ImageListItemBar\";\r\nimport ImageList from \"@mui/material/ImageList\";\r\n\r\n// HSA packages\r\nimport { DatasetType } from \"../../../common/components/AITrainingSettings\";\r\n\r\nconst styles = {\r\n images: {\r\n width: \"100%\",\r\n maxHeight: 350,\r\n objectFit: \"cover\",\r\n },\r\n projectTile: {\r\n cursor: \"pointer\",\r\n padding: 1,\r\n \"&:hover\": {\r\n background: \"#AAA\",\r\n },\r\n },\r\n projectTileSelected: {\r\n background: \"#1BA1E2!important\",\r\n },\r\n tileHeadline: {\r\n textAlign: \"center\",\r\n padding: 0,\r\n marginBottom: 4,\r\n lineHeight: \"32px\",\r\n },\r\n};\r\n\r\nconst datasetOptions = Object.freeze({\r\n default: {\r\n classification: {\r\n title: \"Classification\",\r\n description: \"Assign objects to different classes.\",\r\n src: \"img/classification_default.jpg\",\r\n alt: \"Classification Img\",\r\n datasetType: DatasetType.ImageClassification,\r\n },\r\n objectDetection: {\r\n title: \"Object Detection\",\r\n description: \"Detect objects and draw bounding box around it.\",\r\n src: \"img/object_detection_default.jpg\",\r\n alt: \"Object Detection Img\",\r\n datasetType: DatasetType.ImageObjectDetection,\r\n },\r\n segmentation: {\r\n title: \"Segmentation\",\r\n description: \"Detect objects and draw exact border around object.\",\r\n src: \"img/segmentation_default.jpg\",\r\n alt: \"Segmentation Img\",\r\n datasetType: DatasetType.ImageSegmentation,\r\n },\r\n instanceSegmentation: {\r\n title: \"Instance Segmentation\",\r\n description: \"Segmentation + differentiate between touching objects.\",\r\n src: \"img/instance_segmentation_default.jpg\",\r\n alt: \"Instance Segmentation Img\",\r\n datasetType: DatasetType.ImageInstanceSegmentation,\r\n },\r\n },\r\n med: {\r\n classification: {\r\n title: \"Classification\",\r\n description: \"Assign objects to different classes.\",\r\n src: \"img/classification_med.jpg\",\r\n alt: \"Classification Img\",\r\n datasetType: DatasetType.ImageClassification,\r\n },\r\n objectDetection: {\r\n title: \"Object Detection\",\r\n description: \"Detect objects and draw bounding box around it.\",\r\n src: \"img/object_detection_med.jpg\",\r\n alt: \"Object Detection Img\",\r\n datasetType: DatasetType.ImageObjectDetection,\r\n },\r\n segmentation: {\r\n title: \"Segmentation\",\r\n description: \"Detect objects and draw exact border around object.\",\r\n src: \"img/segmentation_med.jpg\",\r\n alt: \"Segmentation Img\",\r\n datasetType: DatasetType.ImageSegmentation,\r\n },\r\n instanceSegmentation: {\r\n title: \"Instance Segmentation\",\r\n description: \"Segmentation + differentiate between touching objects.\",\r\n src: \"img/instance_segmentation_med.jpg\",\r\n alt: \"Instance Segmentation Img\",\r\n datasetType: DatasetType.ImageInstanceSegmentation,\r\n },\r\n },\r\n audio: {\r\n classification: {\r\n title: \"Audio Classification\",\r\n description: \"Assigns audio clips to different classes.\",\r\n src: \"img/classification_default.jpg\",\r\n alt: \"Audio Classification Image\",\r\n datasetType: DatasetType.AudioClassification,\r\n },\r\n objectDetection: {\r\n title: \"Sequence Detection\",\r\n description:\r\n \"Detect sequences within audio and marks them in audio stream.\",\r\n src: \"img/object_detection_default.jpg\",\r\n alt: \"Sequence Detection Image\",\r\n datasetType: DatasetType.AudioSequenceDetection,\r\n },\r\n segmentation: {\r\n title: \"Sequence Segmentation\",\r\n description:\r\n \"Detect sequences and draw exact border around time and frequency.\",\r\n src: \"img/segmentation_default.jpg\",\r\n alt: \"Sequence Segmentation Image\",\r\n datasetType: DatasetType.AudioSequenceSegmentation,\r\n },\r\n instanceSegmentation: {\r\n title: \"Sequence Instance Segmentation\",\r\n description:\r\n \"Sequence Segmentation + differentiate between touching tracks.\",\r\n src: \"img/instance_segmentation_default.jpg\",\r\n alt: \"Instance Segmentation Image\",\r\n datasetType: DatasetType.AudioSequenceInstanceSegmentation,\r\n },\r\n },\r\n});\r\n\r\nconst mapModuleToModelOptions = Object.freeze({\r\n AudioAnnotator: datasetOptions.audio,\r\n});\r\n\r\n/**\r\n * Component to select the model type for the training.\r\n * @param {AITrainingSettings} trainingSettings The collected training settings.\r\n * @param {function} setTrainingSettings The function to set the training settings.\r\n * @param {string} projectType The project type. Used to determine the selectable model options.\r\n * @returns {JSX.Element} The component to select the model type for the training.\r\n */\r\nexport default function ModelTypeSelection(props) {\r\n const { trainingSettings, setTrainingSettings } = props;\r\n const model_options =\r\n mapModuleToModelOptions[props.projectType] ?? datasetOptions.default;\r\n\r\n return (\r\n
    \r\n <>\r\n \r\n
    \r\n Choose the model type for your training:\r\n
      \r\n {Object.keys(model_options).map((option) => {\r\n return (\r\n
    • \r\n {model_options[option].title}:{\" \"}\r\n {model_options[option].description}\r\n
    • \r\n );\r\n })}\r\n
    \r\n
    \r\n \r\n \r\n {Object.keys(model_options).map((option) => (\r\n {\r\n trainingSettings.datasetParameters.datasetType =\r\n model_options[option].datasetType;\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n >\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n
    \r\n );\r\n}\r\n\r\nModelTypeSelection.propTypes = {\r\n trainingSettings: PropTypes.object.isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n projectType: PropTypes.string,\r\n};\r\n","// Copyright: HS Analysis GmbH, 2023\r\n// Author: Valentin Haas\r\n\r\n// Framework imports\r\nimport React, { useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// External packages\r\nimport DialogContentText from \"@mui/material/DialogContentText\";\r\nimport Grid from \"@mui/material/Grid\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\n// HSA packages\r\nimport Structure, {\r\n parentStructures,\r\n childStructures,\r\n} from \"../../../common/components/Structure\";\r\nimport StructureTree from \"../../../audioViewer/sidebar/StructureTree\";\r\nimport AITrainingSettings from \"../../../common/components/AITrainingSettings\";\r\n\r\nconst styles = {\r\n root: {\r\n overflow: \"hidden\",\r\n display: \"grid\",\r\n gridTemplateRows: \"auto 1fr\",\r\n },\r\n};\r\n\r\n/**\r\n * View to choose which structures should be used for training.\r\n * @param {AITrainingSettings} trainingSettings The training settings.\r\n * @param {function} setTrainingSettings The function to set the training settings.\r\n * @param {object} project The project the strucuture tree referrs to.\r\n * @param {object} user The current user.\r\n * @param {array} structures The structures to display.\r\n * @param {function} setStructures The function to set the structures.\r\n * @param {boolean} allStructuresEnabled True if all structures are enabled, false otherwise.\r\n * @param {function} setAllStructuresEnabled The function to set the allStructuresEnabled flag.\r\n * @returns {JSX.Element} The selection view.\r\n */\r\nexport default function StructureSelection(props) {\r\n const {\r\n trainingSettings,\r\n setTrainingSettings,\r\n project,\r\n structures = [],\r\n setStructures = () => {},\r\n allStructuresEnabled = false,\r\n setAllStructuresEnabled = () => {},\r\n } = props;\r\n\r\n useEffect(() => {\r\n setTrainingSettings(() => {\r\n trainingSettings.structures = structures.filter((s) => s.isChosen);\r\n return trainingSettings;\r\n });\r\n }, [structures]);\r\n\r\n /**\r\n * Checks if a structure can be selected.\r\n * @param {Structure} structure The structure to check.\r\n * @returns {boolean} True if the structure can be selected, false otherwise.\r\n */\r\n const structureCanBeSelected = (structure) => {\r\n // Override if all structures are enabled.\r\n if (allStructuresEnabled) return true;\r\n\r\n // Structure is not selectable if it has no objects.\r\n if (structure.totalObjectCount <= 0) return false;\r\n\r\n // Check if any parent is selected\r\n const anyParentSelected = parentStructures(structure, structures)\r\n .slice(0, -1) // Remove the structure itself\r\n .some((parent) => parent.isChosen);\r\n\r\n // Check if any child is selected\r\n const anyChildSelected = childStructures(structure, structures)\r\n .slice(1) // Remove the structure itself\r\n .some((child) => child.isChosen);\r\n\r\n return !(anyParentSelected || anyChildSelected);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n Select all structures that should be detected/classified by your\r\n model:\r\n \r\n \r\n \r\n setAllStructuresEnabled(e.target.checked)}\r\n />\r\n }\r\n label={\r\n Enable all structures\r\n }\r\n />\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nStructureSelection.propTypes = {\r\n trainingSettings: PropTypes.instanceOf(AITrainingSettings).isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n project: PropTypes.object.isRequired,\r\n structures: PropTypes.arrayOf(PropTypes.instanceOf(Structure)),\r\n setStructures: PropTypes.func,\r\n allStructuresEnabled: PropTypes.bool,\r\n setAllStructuresEnabled: PropTypes.func,\r\n};\r\n","// Copyright HS Analysis GmbH, 2023\r\n// Author: Valentin Haas\r\n\r\n// Framework imports\r\nimport React, { useState, useEffect } from \"react\";\r\nimport { PropTypes } from \"prop-types\";\r\n\r\n// External imports\r\nimport { floor } from \"mathjs\";\r\n\r\n// Material UI imports\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\n// HSA Imports\r\nimport AITrainingSettings, {\r\n DatasetApproach,\r\n DatasetApproachNames,\r\n TrainingDataTypes,\r\n Optimizer,\r\n OptimizerNames,\r\n LossFunction,\r\n LossFunctionNames,\r\n Metrics,\r\n MetricsNames,\r\n} from \"../../../common/components/AITrainingSettings\";\r\n\r\n// #region Commonly used settings\r\n/**\r\n * A text field to select the dataset approach.\r\n * @param {AITrainingSettings} trainingSettings The training settings object.\r\n * @param {function} setTrainingSettings The function to set/update the training settings object.\r\n * @param {trainingDataTypes} trainingDataType The type of the training data.\r\n * @returns {JSX.Element} The component JSX.\r\n */\r\nexport function DatasetApproachSelection(props) {\r\n const { trainingSettings, setTrainingSettings, trainingDataType } = props;\r\n\r\n return (\r\n {\r\n trainingSettings.datasetParameters.datasetApproach = e.target.value;\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n >\r\n {Object.values(DatasetApproach)\r\n .filter((value) => floor(value / 10) === trainingDataType)\r\n .map((value) => {\r\n return (\r\n \r\n {DatasetApproachNames[value]}\r\n \r\n );\r\n })}\r\n \r\n );\r\n}\r\n\r\nDatasetApproachSelection.propTypes = {\r\n trainingSettings: PropTypes.instanceOf(AITrainingSettings).isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n trainingDataType: PropTypes.oneOf(Object.values(TrainingDataTypes))\r\n .isRequired,\r\n};\r\n\r\n/**\r\n * A number selection field to select the number of epochs.\r\n * @param {AITrainingSettings} trainingSettings The training settings object.\r\n * @param {function} setTrainingSettings The function to set/update the training settings object.\r\n * @returns {JSX.Element} The component JSX.\r\n */\r\nexport function EpochSelection(props) {\r\n const { trainingSettings, setTrainingSettings } = props;\r\n\r\n return (\r\n {\r\n trainingSettings.trainingParameters.epochs = e.target.value;\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n InputProps={{ inputProps: { min: 1 } }}\r\n />\r\n );\r\n}\r\n\r\nEpochSelection.propTypes = {\r\n trainingSettings: PropTypes.instanceOf(AITrainingSettings).isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n};\r\n\r\n// #endregion\r\n\r\n// #region Model Settings\r\n\r\n/**\r\n * A number selection field to select the model learning rate.\r\n * @param {AITrainingSettings} trainingSettings The training settings object.\r\n * @param {function} setTrainingSettings The function to set/update the training settings object.\r\n * @returns {JSX.Element} The component JSX.\r\n * @returns\r\n */\r\nexport function LearningRateSelection(props) {\r\n const { trainingSettings, setTrainingSettings } = props;\r\n\r\n return (\r\n {\r\n trainingSettings.trainingParameters.learningRate = e.target.value;\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n />\r\n );\r\n}\r\n\r\nLearningRateSelection.propTypes = {\r\n trainingSettings: PropTypes.instanceOf(AITrainingSettings).isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n};\r\n\r\n/**\r\n * A number selection field to select the model batch size.\r\n * @param {AITrainingSettings} trainingSettings The training settings object.\r\n * @param {function} setTrainingSettings The function to set/update the training settings object.\r\n * @returns {JSX.Element} The component JSX.\r\n */\r\nexport function BatchSizeSelection(props) {\r\n const { trainingSettings, setTrainingSettings } = props;\r\n\r\n return (\r\n {\r\n trainingSettings.trainingParameters.batchSize = e.target.value;\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n />\r\n );\r\n}\r\n\r\nBatchSizeSelection.propTypes = {\r\n trainingSettings: PropTypes.instanceOf(AITrainingSettings).isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n};\r\n\r\n/**\r\n * A number selection field to select the early stopping limit.\r\n * @param {AITrainingSettings} trainingSettings The training settings object.\r\n * @param {function} setTrainingSettings The function to set/update the training settings object.\r\n * @returns {JSX.Element} The component JSX.\r\n */\r\nexport function EarlyStoppingLimitSelection(props) {\r\n const { trainingSettings, setTrainingSettings } = props;\r\n\r\n return (\r\n {\r\n trainingSettings.trainingParameters.earlyStopping = e.target.value;\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n />\r\n );\r\n}\r\n\r\nEarlyStoppingLimitSelection.propTypes = {\r\n trainingSettings: PropTypes.instanceOf(AITrainingSettings).isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n};\r\n\r\n/**\r\n * A list of optimizers to select one from.\r\n * @param {AITrainingSettings} trainingSettings The training settings object.\r\n * @param {function} setTrainingSettings The function to set/update the training settings object.\r\n * @returns {JSX.Element} The component JSX.\r\n */\r\nexport function OptimizerSelection(props) {\r\n const { trainingSettings, setTrainingSettings } = props;\r\n\r\n return (\r\n {\r\n trainingSettings.trainingParameters.optimizer = e.target.value;\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n >\r\n {Object.values(Optimizer).map((value) => {\r\n return (\r\n \r\n {OptimizerNames[value]}\r\n \r\n );\r\n })}\r\n \r\n );\r\n}\r\n\r\nOptimizerSelection.propTypes = {\r\n trainingSettings: PropTypes.instanceOf(AITrainingSettings).isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n};\r\n\r\n/**\r\n * A list of loss functions to select one or more from.\r\n * @param {AITrainingSettings} trainingSettings The training settings object.\r\n * @param {function} setTrainingSettings The function to set/update the training settings object.\r\n * @returns {JSX.Element} The component JSX.\r\n */\r\nexport function LossFunctionSelection(props) {\r\n const { trainingSettings, setTrainingSettings } = props;\r\n\r\n return (\r\n LossFunctionNames[value]\r\n ),\r\n multiple: true,\r\n renderValue: (selected) => {\r\n if (selected.length === 1) return selected[0];\r\n return `${selected.length} selected`;\r\n },\r\n }}\r\n >\r\n {Object.values(LossFunction).map((value) => (\r\n \r\n {\r\n if (\r\n trainingSettings.trainingParameters.lossFunctions.includes(\r\n value\r\n )\r\n ) {\r\n trainingSettings.trainingParameters.lossFunctions =\r\n trainingSettings.trainingParameters.lossFunctions.filter(\r\n (item) => item !== value\r\n );\r\n } else {\r\n trainingSettings.trainingParameters.lossFunctions.push(value);\r\n }\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n />\r\n \r\n \r\n ))}\r\n \r\n );\r\n}\r\n\r\nLossFunctionSelection.propTypes = {\r\n trainingSettings: PropTypes.instanceOf(AITrainingSettings).isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n};\r\n\r\n/**\r\n * A list of metrics to select one or more from.\r\n * @param {AITrainingSettings} trainingSettings The training settings object.\r\n * @param {function} setTrainingSettings The function to set/update the training settings object.\r\n * @returns {JSX.Element} The component JSX.\r\n */\r\nexport function MetricsSelection(props) {\r\n const { trainingSettings, setTrainingSettings } = props;\r\n\r\n return (\r\n MetricsNames[value]\r\n ),\r\n multiple: true,\r\n renderValue: (selected) => {\r\n if (selected.length === 1) return selected[0];\r\n return `${selected.length} selected`;\r\n },\r\n }}\r\n >\r\n {Object.values(Metrics).map((value) => (\r\n \r\n {\r\n if (trainingSettings.trainingParameters.metrics.includes(value)) {\r\n trainingSettings.trainingParameters.metrics =\r\n trainingSettings.trainingParameters.metrics.filter(\r\n (item) => item !== value\r\n );\r\n } else {\r\n trainingSettings.trainingParameters.metrics.push(value);\r\n }\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n />\r\n \r\n \r\n ))}\r\n \r\n );\r\n}\r\n\r\nMetricsSelection.propTypes = {\r\n trainingSettings: PropTypes.instanceOf(AITrainingSettings).isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n};\r\n\r\n// #endregion\r\n\r\n// #region Dataset Settings\r\n\r\n/**\r\n * A drop down menu to select whether to create a dataset, train a model or both.\r\n * @param {AITrainingSettings} trainingSettings The training settings object.\r\n * @param {function} setTrainingSettings The function to set/update the training settings object.\r\n * @returns {JSX.Element} The component JSX.\r\n */\r\nexport function DatasetCreationOptions(props) {\r\n const { trainingSettings, setTrainingSettings } = props;\r\n const creationOptions = [\r\n \"Create dataset & train model\",\r\n \"Create dataset only\",\r\n \"Use existing dataset\",\r\n ];\r\n\r\n const [selectedCreationOption, setSelectedCreationOption] = useState(\r\n \"Create dataset & train model\"\r\n );\r\n\r\n useEffect(() => {\r\n setSelectedCreationOption(\r\n trainingSettings.datasetParameters.useExistingDataset\r\n ? \"Use existing dataset\"\r\n : trainingSettings.datasetParameters.datasetOnly\r\n ? \"Create dataset only\"\r\n : \"Create dataset & train model\"\r\n );\r\n }, [\r\n trainingSettings.datasetParameters.useExistingDataset,\r\n trainingSettings.datasetParameters.datasetOnly,\r\n ]);\r\n\r\n return (\r\n {\r\n trainingSettings.datasetParameters.useExistingDataset =\r\n e.target.value === \"Use existing dataset\";\r\n trainingSettings.datasetParameters.datasetOnly =\r\n e.target.value === \"Create dataset only\";\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n >\r\n {Object.values(creationOptions).map((value) => {\r\n return (\r\n \r\n {value}\r\n \r\n );\r\n })}\r\n \r\n );\r\n}\r\n\r\nDatasetCreationOptions.propTypes = {\r\n trainingSettings: PropTypes.instanceOf(AITrainingSettings).isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n};\r\n\r\n/**\r\n * A drop down menu to select the image size from a list of predefined values, each a power of 2.\r\n * @param {AITrainingSettings} trainingSettings The training settings object.\r\n * @param {function} setTrainingSettings The function to set/update the training settings object.\r\n * @returns {JSX.Element} The component JSX.\r\n */\r\nexport function ImageSizeSelection(props) {\r\n const { trainingSettings, setTrainingSettings } = props;\r\n\r\n return (\r\n {\r\n trainingSettings.modelParameters.imageWidth = e.target.value;\r\n trainingSettings.modelParameters.imageHeight = e.target.value;\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n >\r\n {[128, 256, 512, 1024, 2048].map((value) => {\r\n return (\r\n \r\n {value + \" px\"}\r\n \r\n );\r\n })}\r\n \r\n );\r\n}\r\n\r\nImageSizeSelection.propTypes = {\r\n trainingSettings: PropTypes.instanceOf(AITrainingSettings).isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n};\r\n\r\n/**\r\n * A drop down menu to select the image pyramid level from a list of predefined values, passed as props.\r\n * @param {AITrainingSettings} trainingSettings The training settings object.\r\n * @param {function} setTrainingSettings The function to set/update the training settings object.\r\n * @param {Array} pyramidLevels The pyramid levels that can be selected. Each level is an object with a level and description.\r\n * @returns {JSX.Element} The component JSX.\r\n */\r\nexport function ImagePyramidLevelSelection(props) {\r\n const { trainingSettings, setTrainingSettings, pyramidLevels } = props;\r\n\r\n return (\r\n {\r\n trainingSettings.modelParameters.pyramidLevel = e.target.value;\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n >\r\n {pyramidLevels.map((levelData) => {\r\n return (\r\n \r\n {levelData.description}\r\n \r\n );\r\n })}\r\n \r\n );\r\n}\r\n\r\nImagePyramidLevelSelection.propTypes = {\r\n trainingSettings: PropTypes.instanceOf(AITrainingSettings).isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n pyramidLevels: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n level: PropTypes.number.isRequired,\r\n description: PropTypes.string.isRequired,\r\n })\r\n ).isRequired,\r\n};\r\n\r\n/**\r\n * A drop down menu to select the image input channels from a list of predefined values, evaluated from the OME metadata.\r\n * @param {AITrainingSettings} trainingSettings The training settings object.\r\n * @param {function} setTrainingSettings The function to set/update the training settings object.\r\n * @param {OME} ome The OME metadata object.\r\n * @returns {JSX.Element} The component JSX.\r\n */\r\nexport function ImageInputChannelSelection(props) {\r\n const { trainingSettings, setTrainingSettings, ome } = props;\r\n\r\n // Check if the image is brightfield or fluorescence\r\n const isBrightfield =\r\n ome && ome.channels.length === 1 && ome.channels[0].type === \"brightfield\";\r\n\r\n useEffect(() => {\r\n if (!isBrightfield) {\r\n // Set the fluorescence channels (default: all channels are selected)\r\n trainingSettings.modelParameters.fluorescenceChannels = [];\r\n ome.channels.forEach((channel) => {\r\n trainingSettings.modelParameters.fluorescenceChannels.push(\r\n channel.name\r\n );\r\n });\r\n\r\n trainingSettings.modelParameters.inputChannels =\r\n trainingSettings.modelParameters.fluorescenceChannels.length;\r\n\r\n setTrainingSettings(trainingSettings);\r\n }\r\n }, []);\r\n\r\n return !isBrightfield > 0 ? (\r\n {\r\n if (selected.length === 1) return selected[0];\r\n return `${selected.length} selected`;\r\n },\r\n }}\r\n >\r\n {ome.channels.map((channel) => (\r\n \r\n {\r\n const index =\r\n trainingSettings.modelParameters.fluorescenceChannels.indexOf(\r\n channel.name\r\n );\r\n\r\n if (index === -1) {\r\n // Element is not in the array, so add it\r\n trainingSettings.modelParameters.fluorescenceChannels.push(\r\n channel.name\r\n );\r\n } else {\r\n // Element is already in the array, so remove it\r\n trainingSettings.modelParameters.fluorescenceChannels.splice(\r\n index,\r\n 1\r\n );\r\n }\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n />\r\n \r\n \r\n ))}\r\n \r\n ) : (\r\n {\r\n trainingSettings.modelParameters.inputChannels = e.target.value;\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n >\r\n \r\n 3 (RGB)\r\n \r\n \r\n 1 (grey)\r\n \r\n \r\n );\r\n}\r\n\r\nImageInputChannelSelection.propTypes = {\r\n trainingSettings: PropTypes.instanceOf(AITrainingSettings).isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n ome: PropTypes.object.isRequired,\r\n};\r\n\r\n/**\r\n * A number selection field to select the sequence length in seconds for audio datasets.\r\n * @param {AITrainingSettings} trainingSettings The training settings object.\r\n * @param {function} setTrainingSettings The function to set/update the training settings object.\r\n * @returns {JSX.Element} A number selection field to select the sequence length in seconds for audio datasets.\r\n */\r\nexport function AudioSequenceLengthSelection(props) {\r\n const { trainingSettings, setTrainingSettings } = props;\r\n\r\n return (\r\n {\r\n trainingSettings.modelParameters.sequenceLengthSeconds = e.target.value;\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n InputProps={{\r\n inputProps: {\r\n min: 0.001,\r\n step: 0.001,\r\n },\r\n }}\r\n />\r\n );\r\n}\r\n\r\nAudioSequenceLengthSelection.propTypes = {\r\n trainingSettings: PropTypes.instanceOf(AITrainingSettings).isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n};\r\n\r\n/**\r\n * A number selection field to select the sequence overlap in seconds for audio datasets.\r\n * @param {AITrainingSettings} trainingSettings The training settings object.\r\n * @param {function} setTrainingSettings The function to set/update the training settings object.\r\n * @returns {JSX.Element} A number selection field to select the sequence overlap in seconds for audio datasets.\r\n */\r\nexport function AudioSequenceOverlapSelection(props) {\r\n const { trainingSettings, setTrainingSettings } = props;\r\n\r\n return (\r\n {\r\n trainingSettings.modelParameters.sequenceOverlapSeconds =\r\n e.target.value;\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n InputProps={{\r\n inputProps: {\r\n step: 0.001,\r\n },\r\n }}\r\n />\r\n );\r\n}\r\n\r\nAudioSequenceOverlapSelection.propTypes = {\r\n trainingSettings: PropTypes.instanceOf(AITrainingSettings).isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n};\r\n\r\n/**\r\n * A number selection field to select the number of classes for audio datasets.\r\n * @param {AITrainingSettings} trainingSettings The training settings object.\r\n * @param {function} setTrainingSettings The function to set/update the training settings object.\r\n * @returns {JSX.Element} A number selection field to select the number of classes for audio datasets.\r\n */\r\nexport function AudioNumberOfClassesSelection(props) {\r\n const { trainingSettings, setTrainingSettings } = props;\r\n\r\n return (\r\n {\r\n trainingSettings.modelParameters.numberOfClasses = e.target.value;\r\n setTrainingSettings(trainingSettings);\r\n }}\r\n InputProps={{\r\n inputProps: {\r\n min: 1,\r\n step: 1,\r\n },\r\n }}\r\n />\r\n );\r\n}\r\n\r\nAudioNumberOfClassesSelection.propTypes = {\r\n trainingSettings: PropTypes.instanceOf(AITrainingSettings).isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n};\r\n\r\n// #endregion\r\n","// Copyright HS Analysis GmbH, 2023\r\n// Author: Valentin Haas\r\n\r\n// Framework imports\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// External imports\r\n\r\n// Material UI imports\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport Grid from \"@mui/material/Grid\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport Accordion from \"@mui/material/Accordion\";\r\nimport AccordionSummary from \"@mui/material/AccordionSummary\";\r\nimport AccordionDetails from \"@mui/material/AccordionDetails\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport HelpOutlineIcon from \"@mui/icons-material/HelpOutline\";\r\n\r\n// HSA Imports\r\nimport {\r\n BatchSizeSelection,\r\n DatasetApproachSelection,\r\n DatasetCreationOptions,\r\n EarlyStoppingLimitSelection,\r\n EpochSelection,\r\n LearningRateSelection,\r\n LossFunctionSelection,\r\n MetricsSelection,\r\n OptimizerSelection,\r\n ImageSizeSelection,\r\n ImageInputChannelSelection,\r\n ImagePyramidLevelSelection,\r\n AudioNumberOfClassesSelection,\r\n AudioSequenceLengthSelection,\r\n AudioSequenceOverlapSelection,\r\n} from \"./SettingOptions\";\r\nimport { TrainingDataTypes } from \"../../../common/components/AITrainingSettings\";\r\n\r\nconst styles = {\r\n accordion: {\r\n display: \"grid\",\r\n width: \"100%\",\r\n gridTemplateColumns: \"1fr auto\",\r\n },\r\n};\r\n\r\n/**\r\n * The most commonly adjusted settings for the dataset and model. Should be open by default.\r\n * Remaining props are passed on to child components.\r\n * @param {boolean} open Whether the accordion is open or not.\r\n * @param {function} updateOpen Function called to update the open state of the accordion in the parent component.\r\n * @returns {JSX.Element} The settings as an accordion component.\r\n */\r\nexport function CommonlyUsedCategory(props) {\r\n const { open, updateOpen } = props;\r\n\r\n const settings = [\r\n ,\r\n ,\r\n ];\r\n\r\n return (\r\n updateOpen(isExpanded)}\r\n >\r\n }>\r\n
    \r\n Common Settings\r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n {settings.map((setting, idx) => (\r\n \r\n {setting}\r\n \r\n ))}\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nCommonlyUsedCategory.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n updateOpen: PropTypes.func.isRequired,\r\n};\r\n\r\n/**\r\n * For image datasets, the pyramid levels that can be selected are calculated.\r\n * @param {OME} ome The the image ome object.\r\n * @returns {Array} Array of pyramid level objects that can be selected.\r\n */\r\nconst getPyramidLevels = (ome) => {\r\n const dropdownPyramidLevels = [{ level: -1, description: \"default\" }];\r\n if (ome.maxLevel > 0) {\r\n for (let i = ome.maxLevel; i >= 0; i--) {\r\n let zoomFactor = 2 ** (ome.maxLevel - i);\r\n let levelData = {\r\n level: i,\r\n description: \"1 : \" + zoomFactor,\r\n };\r\n if (i === 0) {\r\n levelData.description += \" (Thumbnail)\";\r\n }\r\n dropdownPyramidLevels.push(levelData);\r\n }\r\n }\r\n return dropdownPyramidLevels;\r\n};\r\n\r\n/**\r\n * Generates the image dataset settings for an image dataset.\r\n * @param {Object} ome The OME object of the image.\r\n * @returns {Array} Array of components that can be used to select the image dataset settings.\r\n */\r\nconst getImageDatasetSettings = (props) => {\r\n const { ome } = props;\r\n\r\n return [\r\n ,\r\n ,\r\n ,\r\n ];\r\n};\r\n\r\n/**\r\n * Generates the audio dataset settings for an audio dataset.\r\n * @param {Object}\r\n * @returns {Array} Array of components that can be used to select the audio dataset settings.\r\n */\r\nconst getAudioDatasetSettings = (props) => {\r\n console.log(props);\r\n return [\r\n ,\r\n ,\r\n ,\r\n ];\r\n};\r\n\r\n/**\r\n * Advanced settings specific to the dataset. Should be closed by default.\r\n * Will be different depending on the type of the training data.\r\n * Remaining props are passed on to child components.\r\n * @param {boolean} open Whether the accordion is open or not.\r\n * @param {function} updateOpen Function called to update the open state of the accordion in the parent component.\r\n * @param {TrainingDataTypes} trainingDataType The type of the training data.\r\n * @returns {JSX.Element} The settings as an accordion component.\r\n */\r\nexport function AdvancedDatasetSettings(props) {\r\n const { open, updateOpen, trainingDataType } = props;\r\n\r\n const settings = [\r\n ,\r\n ];\r\n switch (trainingDataType) {\r\n case TrainingDataTypes.Image:\r\n settings.push(...getImageDatasetSettings(props));\r\n break;\r\n\r\n case TrainingDataTypes.Audio:\r\n settings.push(...getAudioDatasetSettings(props));\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n\r\n return (\r\n updateOpen(isExpanded)}\r\n >\r\n }>\r\n
    \r\n Advanced Dataset Settings\r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n {settings.map((setting, idx) => (\r\n \r\n {setting}\r\n \r\n ))}\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nAdvancedDatasetSettings.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n updateOpen: PropTypes.func.isRequired,\r\n trainingDataType: PropTypes.oneOf(Object.values(TrainingDataTypes))\r\n .isRequired,\r\n};\r\n\r\n/**\r\n * Advanced settings specific to the model. Should be closed by default.\r\n * Remaining props are passed on to child components.\r\n * @param {boolean} open Whether the accordion is open or not.\r\n * @param {function} updateOpen Function called to update the open state of the accordion in the parent component.\r\n * @returns {JSX.Element} The settings as an accordion component.\r\n */\r\nexport function AdvancedModelSettings(props) {\r\n const { open, updateOpen } = props;\r\n\r\n const settings = [\r\n ,\r\n ,\r\n ,\r\n ,\r\n ,\r\n ,\r\n ];\r\n\r\n return (\r\n updateOpen(isExpanded)}\r\n >\r\n }>\r\n
    \r\n Advanced Model Settings\r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n {settings.map((setting, idx) => (\r\n \r\n {setting}\r\n \r\n ))}\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nAdvancedModelSettings.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n updateOpen: PropTypes.func.isRequired,\r\n};\r\n","// Copyright: HS Analysis GmbH, 2023\r\n// Author: Valentin Haas\r\n\r\n// Framework imports\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// Material UI packages\r\n\r\n// HSA packages\r\nimport AITrainingSettings, {\r\n trainingDataTypebyModuleName,\r\n} from \"../../../common/components/AITrainingSettings\";\r\n\r\nimport {\r\n CommonlyUsedCategory,\r\n AdvancedDatasetSettings,\r\n AdvancedModelSettings,\r\n} from \"./SettingCategories\";\r\n\r\n/**\r\n * Grouped setting selection options for the model and dataset.\r\n * Depending on the project type, different relevant options are available.\r\n * @param {AITrainingSettings} trainingSettings The training settings for the AI model and dataset.\r\n * @param {function} setTrainingSettings Function to update the training settings.\r\n * @param {object} ome The OME metadata for an image.\r\n * @param {string} projectType The type of the project.\r\n * @returns {JSX.Element} Accordion components allowing to adjust the model and dataset settings.\r\n */\r\nexport default function ModelAndDatasetSettings(props) {\r\n const { trainingSettings, setTrainingSettings, ome, projectType } = props;\r\n const [openAccordion, setOpenAccordion] = React.useState(\"common\");\r\n const trainingDataType = trainingDataTypebyModuleName(projectType);\r\n\r\n return (\r\n <>\r\n setOpenAccordion(isOpen ? \"common\" : null)}\r\n />\r\n setOpenAccordion(isOpen ? \"dataset\" : null)}\r\n />\r\n setOpenAccordion(isOpen ? \"model\" : null)}\r\n />\r\n \r\n );\r\n}\r\n\r\nModelAndDatasetSettings.propTypes = {\r\n trainingSettings: PropTypes.instanceOf(AITrainingSettings).isRequired,\r\n setTrainingSettings: PropTypes.func.isRequired,\r\n ome: PropTypes.object,\r\n projectType: PropTypes.string,\r\n};\r\n","// Copyright: HS Analysis GmbH, 2023\r\n// Author: Valentin Haas\r\n\r\n// Framework imports\r\nimport React, { useState, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { useHistory } from \"react-router-dom\";\r\n\r\n// External packages\r\n\r\n// HSA packages\r\nimport { parentStructures } from \"../../common/components/Structure\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport AITrainingSettings, {\r\n DefaultDatasetType,\r\n DefaultDatasetApproach,\r\n getModelParameters,\r\n DatasetApproach,\r\n} from \"../../common/components/AITrainingSettings\";\r\nimport StepperDialog from \"../../common/components/StepperDialog\";\r\nimport ModelMetaData from \"./TrainAIModelComponents/ModelMetaData\";\r\nimport ModelTypeSelection from \"./TrainAIModelComponents/ModelTypeSelection\";\r\nimport StructureSelection from \"./TrainAIModelComponents/StructureSelection\";\r\nimport ModelAndDatasetSettings from \"./TrainAIModelComponents/ModelAndDatasetSettings\";\r\n\r\nimport { withSpinloader } from \"../../common/components/Spinloader\";\r\n\r\n// export default function TrainAIModel(props) {\r\nconst TrainAIModel = (props) => {\r\n const {\r\n open,\r\n setOpen,\r\n project,\r\n structures = [],\r\n setStructures = () => {},\r\n ome,\r\n } = props;\r\n const history = useHistory();\r\n const forceUpdate = React.useReducer(() => ({}))[1];\r\n\r\n const [trainingSettings, setTrainingSettings] = useState(\r\n new AITrainingSettings(project.id, project.type)\r\n );\r\n\r\n const [aiModels, setAiModels] = useState([]);\r\n const [nameInUse, setNameInUse] = useState(false);\r\n const [containsInvalidChar, setContainsInvalidChar] = useState(false);\r\n const [allStructuresEnabled, setAllStructuresEnabled] = useState(false);\r\n\r\n useEffect(() => {\r\n Backend.getModelMetadata(\"hsa_models\", false, (models) => {\r\n setAiModels(models);\r\n\r\n // Set default dataset and model parameter types depending on project type.\r\n setTrainingSettings((prev) => {\r\n prev.datasetParameters.datasetType = DefaultDatasetType(project.type);\r\n prev.datasetParameters.datasetApproach = DefaultDatasetApproach(\r\n project.type\r\n );\r\n prev.modelParameters = getModelParameters(\r\n prev.datasetParameters.datasetType\r\n );\r\n return prev;\r\n });\r\n });\r\n }, []);\r\n\r\n useEffect(() => {\r\n validateMetaData(false);\r\n }, [trainingSettings.metaData.name, trainingSettings.metaData.version]);\r\n\r\n useEffect(() => {\r\n if (\r\n trainingSettings.datasetParameters.datasetApproach ===\r\n DatasetApproach.AudioSlidingWindow\r\n ) {\r\n setTrainingSettings((prev) => {\r\n prev.modelParameters.sequenceLengthSeconds = 5.0;\r\n prev.modelParameters.sequenceOverlapSeconds = 0.0;\r\n return prev;\r\n });\r\n } else if (\r\n trainingSettings.datasetParameters.datasetApproach ===\r\n DatasetApproach.AudioFileBased\r\n ) {\r\n setTrainingSettings((prev) => {\r\n prev.modelParameters.sequenceLengthSeconds = 0.0;\r\n prev.modelParameters.sequenceOverlapSeconds = 0.0;\r\n return prev;\r\n });\r\n }\r\n }, [trainingSettings.datasetParameters.datasetApproach]);\r\n\r\n /**\r\n * The steps of the dialog.\r\n */\r\n const steps = [\r\n {\r\n title: \"Select Model Type\",\r\n content: (\r\n {\r\n setTrainingSettings(params);\r\n forceUpdate();\r\n }}\r\n projectType={project.type}\r\n />\r\n ),\r\n validate: () => {\r\n return validateModelType();\r\n },\r\n },\r\n {\r\n title: \"Select Structures\",\r\n content: (\r\n {\r\n setTrainingSettings(params);\r\n forceUpdate();\r\n }}\r\n project={project}\r\n structures={structures}\r\n setStructures={setStructures}\r\n allStructuresEnabled={allStructuresEnabled}\r\n setAllStructuresEnabled={setAllStructuresEnabled}\r\n />\r\n ),\r\n validate: () => {\r\n return validateStructureSelection();\r\n },\r\n },\r\n {\r\n title: \"Training Settings\",\r\n content: (\r\n {\r\n setTrainingSettings(params);\r\n forceUpdate();\r\n }}\r\n projectType={project.type}\r\n ome={ome}\r\n />\r\n ),\r\n },\r\n {\r\n title: \"Model Selection\",\r\n content: (\r\n {\r\n setTrainingSettings(params);\r\n forceUpdate();\r\n }}\r\n existingAiModels={aiModels.models}\r\n nameInUse={nameInUse}\r\n containsInvalidChar={containsInvalidChar}\r\n validateEntries\r\n />\r\n ),\r\n validate: () => {\r\n return validateMetaData();\r\n },\r\n },\r\n ];\r\n\r\n //#region Validation\r\n\r\n /**\r\n * Checks if a given modelname already exists.\r\n * @param {string} valueToCheck The text to be checked.\r\n * @returns {bool} Whether or not the name already exists.\r\n */\r\n const checkNameAvailibility = (valueToCheck) => {\r\n if (aiModels.length === 0) return false;\r\n return (\r\n aiModels.models.findIndex((aiModel) => {\r\n return aiModel.meta_data.name === valueToCheck;\r\n }) >= 0\r\n );\r\n };\r\n\r\n /**\r\n * Checks if input string has forbidden characters.\r\n * @param {string} input The text to be checked.\r\n * @returns {bool} Whether or not a forbidden char is present.\r\n */\r\n const isInvalidInput = (input) => {\r\n const invalidChars = /[&#\\\\/?:*\"|<>]/g;\r\n return invalidChars.test(input);\r\n };\r\n\r\n /**\r\n * Validates the metadata of the model. Relevant for the first step of the dialog.\r\n * @param {bool} verbose Whether or not to show a warning snackbar in case of invalid metadata. Default: true.\r\n * @returns {Promise} Whether or not the metadata is valid.\r\n */\r\n const validateMetaData = async (verbose = true) => {\r\n return new Promise((resolve) => {\r\n const localNameInUse = checkNameAvailibility(\r\n trainingSettings.metaData.name\r\n );\r\n const localContainsInvalidChar = isInvalidInput(\r\n trainingSettings.metaData.name\r\n );\r\n setNameInUse(localNameInUse);\r\n setContainsInvalidChar(localContainsInvalidChar);\r\n\r\n if (trainingSettings.metaData.isNewModel) {\r\n // Check settings for a new model\r\n const isValid =\r\n trainingSettings.metaData.name !== \"\" &&\r\n !localNameInUse &&\r\n !localContainsInvalidChar;\r\n\r\n if (verbose && !isValid)\r\n window.showWarningSnackbar(\r\n \"Incomplete or invalid metadata, please check your inputs.\"\r\n );\r\n\r\n resolve(isValid);\r\n } else {\r\n // Check settings for retraining an existing model\r\n const isValid =\r\n trainingSettings.metaData.name !== \"\" &&\r\n trainingSettings.metaData.version !== \"\";\r\n\r\n if (verbose && !isValid)\r\n window.showWarningSnackbar(\r\n \"Incomplete or invalid metadata, please check your inputs.\"\r\n );\r\n\r\n resolve(isValid);\r\n }\r\n });\r\n };\r\n\r\n const validateModelType = async () => {\r\n return new Promise((resolve) => {\r\n const isValid =\r\n Boolean(trainingSettings.datasetParameters.datasetType) ||\r\n trainingSettings.datasetParameters.datasetType === 0;\r\n\r\n if (!isValid)\r\n window.showWarningSnackbar(\r\n \"Incomplete or invalid model type, please check your inputs.\"\r\n );\r\n\r\n resolve(isValid);\r\n });\r\n };\r\n\r\n const validateStructureSelection = async () => {\r\n return new Promise((resolve) => {\r\n if (allStructuresEnabled) {\r\n // Anything goes.\r\n resolve(true);\r\n return;\r\n }\r\n const parentsNotChosen = !structures\r\n .filter((s) => s.isChosen)\r\n // Check that a chosen Structure does not have a chosen parent.\r\n .some((s) => {\r\n // Remove last item from array, as it is the structure itself.\r\n return parentStructures(s, structures)\r\n .slice(0, -1)\r\n .some((p) => p.isChosen);\r\n });\r\n\r\n if (!parentsNotChosen)\r\n window.showWarningSnackbar(\r\n \"Structures cannot be chosen if one of their parents is also chosen.\"\r\n );\r\n\r\n // Check that at least one structure is chosen.\r\n const anyStructureChosen = structures.some((s) => s.isChosen);\r\n\r\n if (!anyStructureChosen)\r\n window.showWarningSnackbar(\"Please choose at least one structure.\");\r\n\r\n resolve(parentsNotChosen && anyStructureChosen);\r\n });\r\n };\r\n\r\n /**\r\n * Validates the settings of all steps using the validate() function of each step, if it exists.\r\n * @returns {int} The index of the first step that is invalid. -1 if all steps are valid.\r\n */\r\n const validateAllSettings = async () => {\r\n Promise.resolve(\r\n steps.findIndex((step) => {\r\n if (!(\"validate\" in Object.keys(step))) return false;\r\n return !step.validate();\r\n })\r\n );\r\n };\r\n //#endregion\r\n //#region Actions between steps\r\n\r\n const extractSettings = () => {\r\n // Only relevant if an existing model is used.\r\n if (trainingSettings.metaData.isNewModel) {\r\n return;\r\n }\r\n\r\n const modelUsed = aiModels.find(\r\n (aiModel) => aiModel.name === trainingSettings.metaData.name\r\n );\r\n\r\n const versionUsed = modelUsed.versions.find(\r\n (version) => version.label === trainingSettings.metaData.version\r\n );\r\n\r\n console.log(versionUsed);\r\n\r\n setTrainingSettings(trainingSettings);\r\n };\r\n\r\n const actionsBetweenSteps = (stepNo) => {\r\n switch (stepNo) {\r\n case 0:\r\n extractSettings();\r\n break;\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n //#endregion\r\n\r\n const submit = async () => {\r\n // Start training.\r\n Backend.trainModel(trainingSettings);\r\n\r\n setOpen(false);\r\n // Check if all steps are valid.\r\n const firstInvalidStep = await validateAllSettings();\r\n if (firstInvalidStep >= 0) {\r\n return firstInvalidStep;\r\n }\r\n\r\n window.showSuccessSnackbar(\"Sent training parameters.\");\r\n props.spinloader.show();\r\n\r\n // Create a promise that resolves when the Socket.IO message is received.\r\n const socketMessagePromise = new Promise((resolve) => {\r\n const socket = Backend.getSocket();\r\n socket.on(\"training_queued\", () => {\r\n props.spinloader.hide();\r\n resolve();\r\n });\r\n });\r\n\r\n // Wait for the Socket.IO message to be received.\r\n await socketMessagePromise;\r\n\r\n window.showActionSnackbar(\r\n \"Queued training.\",\r\n () => history.push(\"/ai_view\"),\r\n \"Go to AI View\",\r\n \"Stay here\"\r\n );\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nTrainAIModel.propTypes = {\r\n open: PropTypes.bool,\r\n setOpen: PropTypes.func.isRequired,\r\n project: PropTypes.object.isRequired,\r\n structures: PropTypes.array,\r\n setStructures: PropTypes.func,\r\n ome: PropTypes.object,\r\n spinloader: PropTypes.object,\r\n};\r\n\r\nexport default withSpinloader(TrainAIModel);\r\n","// Framework imports\r\nimport React, { useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Button } from \"@mui/material\";\r\n\r\n// HSA imports\r\nimport TrainAIModel from \"../../home/dialogs/TrainAIModel\";\r\n\r\n/**\r\n *\r\n * @param {object} project The current project.\r\n * @param {array} structures The structures of the current project.\r\n * @param {function} setStructures The function to set/update the structures of the current project.\r\n * @returns {JSX.Element} The AI training tab.\r\n */\r\nexport default function AiTrainingTab(props) {\r\n const { project, structures, setStructures, ome } = props;\r\n const [openTrainingDialog, setOpenTrainingDialog] = useState(false);\r\n\r\n return (\r\n
    \r\n {\r\n setOpenTrainingDialog(true);\r\n }}\r\n >\r\n Train AI\r\n \r\n \r\n
    \r\n );\r\n}\r\n\r\nAiTrainingTab.propTypes = {\r\n project: PropTypes.object.isRequired,\r\n structures: PropTypes.array,\r\n setStructures: PropTypes.func,\r\n ome: PropTypes.object,\r\n};\r\n\r\nAiTrainingTab.defaultProps = {\r\n structures: [],\r\n setStructures: () => {},\r\n};\r\n","// Framework imports\r\nimport React, { useState, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// External packages\r\nimport DockLayout from \"rc-dock\";\r\nimport \"rc-dock/dist/rc-dock.css\";\r\n\r\n// HSA imports\r\nimport \"./AudioSideBarDock.css\";\r\nimport Structure from \"../../common/components/Structure\";\r\nimport StructureTree from \"./StructureTree\";\r\nimport AudioFileTree from \"./AudioFileTree\";\r\nimport AiTrainingTab from \"./AiTrainingTab\";\r\n\r\nconst Context = React.createContext();\r\n\r\nfunction AudioSideBarDock(props) {\r\n const [init, setInit] = useState(false);\r\n const [layout, setLayout] = useState({\r\n dockbox: {\r\n mode: \"horizontal\",\r\n children: [\r\n {\r\n tabs: [\r\n { id: \"filesTab\" },\r\n { id: \"structureTreeTab\" },\r\n { id: \"aiTrainingTab\" },\r\n ],\r\n },\r\n ],\r\n },\r\n });\r\n\r\n let groups = {\r\n custom: {\r\n floatable: false,\r\n maximizable: false,\r\n },\r\n };\r\n\r\n const filesTab = {\r\n title:
    FILES
    ,\r\n content: {() => },\r\n group: \"custom\",\r\n };\r\n\r\n const structureTreeTab = {\r\n title:
    ROIS
    ,\r\n content: (\r\n \r\n {(value) => (\r\n \r\n )}\r\n \r\n ),\r\n group: \"custom\",\r\n };\r\n\r\n const aiTrainingTab = {\r\n title:
    AI
    ,\r\n content: (\r\n \r\n {(value) => (\r\n \r\n )}\r\n \r\n ),\r\n };\r\n\r\n useEffect(() => {\r\n if (!init) {\r\n setInit(true);\r\n }\r\n });\r\n\r\n const loadTab = (data) => {\r\n let { id } = data;\r\n switch (id) {\r\n case \"structureTreeTab\":\r\n return { ...structureTreeTab, id };\r\n case \"filesTab\":\r\n return { ...filesTab, id };\r\n case \"aiTrainingTab\":\r\n return { ...aiTrainingTab, id };\r\n }\r\n return { ...structureTreeTab, id };\r\n };\r\n\r\n const onLayoutChange = (newLayout) => {\r\n let newChilds = newLayout.dockbox.children;\r\n let oldChilds = layout.dockbox.children;\r\n if (JSON.stringify(newChilds) !== JSON.stringify(oldChilds)) {\r\n setLayout(newLayout);\r\n // props.persistentStorage.save(\"SidebarLayout\", newLayout);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default AudioSideBarDock; //withPersistentStorage(AudioSideBarDock);\r\n\r\nAudioSideBarDock.propTypes = {\r\n persistentStorage: PropTypes.object,\r\n project: PropTypes.object.isRequired,\r\n user: PropTypes.object,\r\n structures: PropTypes.array,\r\n setStructures: PropTypes.func,\r\n selectedStructure: PropTypes.instanceOf(Structure),\r\n setSelectedStructure: PropTypes.func,\r\n triggerAction: PropTypes.func,\r\n};\r\n","// Framework imports\r\nimport React, { useContext } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// Additional pacakges\r\nimport { Grid } from \"@mui/material\";\r\n\r\n// HSA imports\r\nimport { AudioViewerContext } from \"./AudioViewer\";\r\nimport { AnnotationAction } from \"../common/components/RoiTypes\";\r\nimport Structure from \"../common/components/Structure\";\r\n// import StructureTree from \"./sidebar/StructureTree\";\r\nimport AudioSideBarDock from \"./sidebar/AudioSideBarDock\";\r\n\r\n/**\r\n * Collected (reusable) styles for page elements.\r\n */\r\nconst styles = {\r\n root: {\r\n padding: \"5px\",\r\n height: \"100%\",\r\n background: \"#fff\",\r\n borderLeft: \"5px solid #EBEBEB\",\r\n display: \"grid\",\r\n gridTemplateRows: \"auto\",\r\n overflowY: \"auto\",\r\n },\r\n};\r\n\r\n/**\r\n * Sidebar with all detailed functions for the audio viewer.\r\n * Equivalent to the sidebar in the image viewer, only for audio options.\r\n * @param {bool} hide Is the sidebar hidden? Defaults to false.\r\n * @param {number} width The overall width of the sidebar.\r\n * @returns React node for Audio Sidebar\r\n */\r\nexport default function AudioSideBar(props) {\r\n const { hide = false, width = 455, ...other } = props;\r\n const AudioViewer = useContext(AudioViewerContext);\r\n\r\n /**\r\n * Trigger a save event for all annotations of a structure.\r\n * @param {Structure} structure The structure to save annotations for.\r\n */\r\n const triggerAction = (structure, action) => {\r\n if (!(structure instanceof Structure))\r\n throw TypeError(\r\n `structure must be of type Structure, recieved ${typeof structure}: ${structure}`\r\n );\r\n if (!Object.values(AnnotationAction).includes(action)) {\r\n throw TypeError(`Invalid action, received ${typeof action}: ${action}`);\r\n }\r\n\r\n // Do not trigger event twice.\r\n if (\r\n AudioViewer.childActions.some(\r\n (a) =>\r\n a.fileId === AudioViewer.selectedFile.id &&\r\n a.structureId === structure.id &&\r\n a.task === action\r\n )\r\n )\r\n return;\r\n\r\n AudioViewer.setChildActions([\r\n ...AudioViewer.childActions,\r\n {\r\n fileId: AudioViewer.selectedFile.id,\r\n structureId: structure.id,\r\n task: action,\r\n },\r\n ]);\r\n };\r\n\r\n return hide ? (\r\n <>\r\n ) : (\r\n \r\n AudioViewer.setSelectedStructure(s)}\r\n triggerAction={triggerAction}\r\n />\r\n \r\n );\r\n}\r\n\r\nAudioSideBar.propTypes = {\r\n hide: PropTypes.bool,\r\n width: PropTypes.number,\r\n};\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n// define the component's styling\r\nconst styles = () => ({\r\n resizesBorder: {\r\n height: \"100%\",\r\n width: \"100%\",\r\n cursor: \"col-resize\",\r\n },\r\n //invisible over whole screen, so mouse is always tracked\r\n overlayBorder: {\r\n position: \"fixed\",\r\n top: 0,\r\n left: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n zIndex: 9999999,\r\n cursor: \"col-resize\",\r\n },\r\n});\r\n\r\nclass LocalVerticalResizeBorder extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n resizeMode: false,\r\n borderWidth: 8,\r\n newWidth: props.targetWidth,\r\n };\r\n }\r\n\r\n handleMouseDown = (e) => {\r\n this.setState({ resizeMode: true, lastPageX: e.pageX, initPageX: e.pageX });\r\n };\r\n\r\n handleMouseMove = (e) => {\r\n e.preventDefault();\r\n if (!this.state.resizeMode) return;\r\n\r\n const deltaX = this.props.leftBorder\r\n ? this.state.lastPageX - e.pageX\r\n : e.pageX - this.state.lastPageX;\r\n const newWidth = this.state.newWidth + deltaX;\r\n\r\n // No min set\r\n if (this.props.min === undefined) {\r\n this.setState({ lastPageX: e.pageX, newWidth });\r\n return;\r\n }\r\n\r\n if (newWidth > this.props.min) {\r\n this.props.resizeWidth(newWidth);\r\n } else if (this.props.targetWidth > this.props.min) {\r\n this.props.resizeWidth(this.props.min);\r\n }\r\n\r\n this.setState({ lastPageX: e.pageX, newWidth });\r\n };\r\n\r\n handleMouseEnd = () => {\r\n if (!this.state.resizeMode) return;\r\n\r\n this.setState({ resizeMode: false });\r\n this.props.resizeWidth(this.props.targetWidth);\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n //const { borderWidth } = this.state;\r\n return (\r\n \r\n this.handleMouseDown(e)}\r\n onMouseMove={(e) => this.handleMouseMove(e)}\r\n onMouseLeave={(e) => this.handleMouseEnd(e)}\r\n onMouseUp={(e) => this.handleMouseEnd(e)}\r\n >\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nLocalVerticalResizeBorder.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n resizeWidth: PropTypes.func.isRequired,\r\n targetWidth: PropTypes.number.isRequired,\r\n min: PropTypes.number,\r\n leftBorder: PropTypes.bool,\r\n};\r\n\r\nexport default withStyles(styles)(LocalVerticalResizeBorder);\r\n","// Framework components\r\nimport React, { createContext, useState, useEffect, useRef } from \"react\";\r\nimport { PropTypes } from \"prop-types\";\r\n\r\n// Additional packages\r\nimport { Grid } from \"@mui/material\";\r\n\r\n// HSA KIT components\r\nimport Backend from \"../common/utils/Backend\";\r\nimport { sortStructures } from \"../common/components/Structure\";\r\n\r\n// AudioViewer components\r\nimport AudioRenderer from \"./AudioRenderer\";\r\nimport AudioToolBar from \"./AudioToolBar\";\r\nimport AudioSideBar from \"./AudioSideBar\";\r\nimport LocalVerticalResizeBorder from \"../common/components/LocalVerticalResizeBorder\";\r\n\r\n/**\r\n * Collected (reusable) styles for page elements.\r\n */\r\nconst styles = {\r\n root: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n background: \"#EBEBEB\",\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n display: \"grid\",\r\n },\r\n};\r\n\r\n/**\r\n * Makes selected data available for all children of AudioViewer.\r\n * Used for information that must be synced over all components per project,\r\n * such as structures and project id.\r\n */\r\nexport const AudioViewerContext = createContext();\r\n\r\n/**\r\n * The minimum width of the sidebar from the right side in px.\r\n */\r\nconst MIN_SIDEBAR_WIDTH = 455;\r\n\r\n/**\r\n * Overall parent component for Audio Viewer.\r\n * This component contains all parts of the audio viewer and will be called with the /audio_view route.\r\n */\r\nexport default function AudioViewer({ projectId }) {\r\n const project = useRef({});\r\n const forceUpdate = React.useReducer(() => ({}))[1];\r\n const [sideBarWidth, setSideBarWidth] = useState(MIN_SIDEBAR_WIDTH);\r\n const [hideSideBar, setHideSideBar] = useState(false);\r\n const [user, setUser] = useState(null);\r\n const [saveNow, triggerSave] = useState(false);\r\n\r\n const [files, setFiles] = useState([]);\r\n const [savedFiles, setSavedFiles] = useState({});\r\n const [selectedFile, setSelectedFile] = useState(null);\r\n\r\n const [structures, setStructures] = useState([]);\r\n const structuresRef = useRef(structures);\r\n const [allStructuresSaved, setAllStructuresSaved] = useState(true);\r\n const allStructuresSavedRef = useRef(allStructuresSaved);\r\n const [selectedStructure, setSelectedStructure] = useState(null);\r\n\r\n const [childActions, setChildActions] = useState([]);\r\n const [excludeToolActive, setExcludeToolActive] = useState(false);\r\n\r\n const [isDrawing, setIsDrawing] = useState(false);\r\n const [containerWidth, setContainerWidth] = useState(0);\r\n\r\n useEffect(() => {\r\n Backend.loadProject(\r\n {\r\n id: projectId,\r\n isOpenProject: true,\r\n },\r\n (incomingProject) => {\r\n project.current = incomingProject;\r\n setFiles(incomingProject.files);\r\n setSelectedFile(incomingProject.files[0] ?? null);\r\n window.setNavigationbarTitle(\r\n `${incomingProject.name} (${incomingProject.viewerConfig.project.label})`\r\n );\r\n },\r\n (err) => {\r\n console.error(err);\r\n window.openErrorDialog(err.toString());\r\n }\r\n );\r\n\r\n Backend.getCurrentUser((user) => setUser(user));\r\n Backend.loadStructures(\r\n projectId,\r\n (structures) => setStructures(sortStructures(structures)),\r\n (err) => console.error(err)\r\n );\r\n\r\n // Save-reminder every 10 minutes.\r\n const saveReminder = setInterval(\r\n () =>\r\n window.showActionSnackbar(\r\n \"Would you like to save your annotations?\",\r\n () => saveProject(),\r\n \"Save now\",\r\n \"Dismiss\"\r\n ),\r\n 10 * 60 * 1000\r\n );\r\n\r\n // add an event listener to the window object to listen for resize events\r\n window.addEventListener(\"resize\", handleResize);\r\n\r\n return () => {\r\n // remove the event listener to clean up\r\n window.removeEventListener(\"resize\", handleResize);\r\n clearInterval(saveReminder);\r\n Backend.closeProject(\r\n projectId,\r\n () => {},\r\n (err) =>\r\n console.warn(`Could not perform all closing actions: \\n\\n ${err}`)\r\n );\r\n };\r\n }, []);\r\n\r\n /**\r\n * Allow functions defined on load to use latest state\r\n */\r\n useEffect(() => {\r\n structuresRef.current = structures;\r\n allStructuresSavedRef.current = allStructuresSaved;\r\n }, [allStructuresSaved, structures]);\r\n\r\n // Update savestatus array on change of files\r\n useEffect(() => {\r\n setSavedFiles((prevSaveStatus) => {\r\n let newSaveStatus = prevSaveStatus;\r\n files.forEach((f) => {\r\n // Files begin as saved\r\n newSaveStatus[f.id] =\r\n f.id in newSaveStatus ? newSaveStatus[f.id] : true;\r\n });\r\n return newSaveStatus;\r\n });\r\n }, [files]);\r\n\r\n useEffect(() => {\r\n handleResize();\r\n }, [sideBarWidth, hideSideBar]);\r\n\r\n // specify what should happen when the window is resized\r\n const handleResize = () => {\r\n const currentSideBarWidth = hideSideBar ? 0 : sideBarWidth;\r\n let newWidth = window.innerWidth - currentSideBarWidth;\r\n // your resize handling code here\r\n setContainerWidth(newWidth);\r\n };\r\n\r\n /**\r\n * Updates the status of files when modifying and/or saving.\r\n * @param {uuid} fileId File id of status to update.\r\n * @param {bool} fileSaveStatus New save status. true = saved, false = not saved.\r\n */\r\n const reportFileSaveStatus = (fileId, fileSaveStatus) => {\r\n let tmpSaveStatus = savedFiles;\r\n tmpSaveStatus[fileId] = fileSaveStatus;\r\n setSavedFiles(tmpSaveStatus);\r\n\r\n // Check if any file is unsaved\r\n const allFilesSaved = !Object.values(savedFiles).some((val) => !val);\r\n if (allFilesSaved) {\r\n window.showSuccessSnackbar(\"Successfully saved all annotations.\");\r\n }\r\n };\r\n\r\n /**\r\n * Saves project, including structures.\r\n */\r\n const saveProject = () => {\r\n // Save structures\r\n if (!allStructuresSavedRef.current) {\r\n console.debug(\"Saving structures...\");\r\n Backend.saveStructures(\r\n projectId,\r\n structuresRef.current,\r\n () => {\r\n window.showSuccessSnackbar(\"Successfully saved all structures.\");\r\n setAllStructuresSaved(true);\r\n },\r\n (err) => {\r\n window.showErrorSnackbar(\r\n `Could not save structures of project\"${projectId}\": ${err}`\r\n );\r\n console.warn(err);\r\n }\r\n );\r\n }\r\n triggerSave(true);\r\n };\r\n\r\n // Reset save status\r\n useEffect(() => {\r\n if (!saveNow) return;\r\n triggerSave(false);\r\n }, [saveNow]);\r\n\r\n const toggleSideBar = () => {\r\n setHideSideBar(!hideSideBar);\r\n handleResize();\r\n };\r\n\r\n const updateFiles = (files) => {\r\n setFiles(files);\r\n forceUpdate();\r\n };\r\n\r\n const updateSelectedFile = (file) => {\r\n saveProject();\r\n setTimeout(() => setSelectedFile(file), 0);\r\n };\r\n\r\n /**\r\n * Global context for project\r\n */\r\n const context = {\r\n project: project.current,\r\n containerWidth,\r\n user,\r\n saveNow,\r\n saveProject,\r\n sideBarWidth,\r\n setSideBarWidth,\r\n toggleSideBar,\r\n triggerSave,\r\n reportFileSaveStatus,\r\n structures,\r\n setStructures: (structures) => {\r\n setStructures(structures);\r\n setAllStructuresSaved(false);\r\n },\r\n selectedStructure,\r\n setSelectedStructure,\r\n selectedFile,\r\n updateSelectedFile,\r\n childActions,\r\n setChildActions,\r\n excludeToolActive,\r\n setExcludeToolActive,\r\n isDrawing,\r\n setIsDrawing,\r\n updateFiles,\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nAudioViewer.propTypes = {\r\n projectId: PropTypes.string.isRequired,\r\n};\r\n","// Framework components\r\nimport React, { useEffect } from \"react\";\r\nimport { PropTypes } from \"prop-types\";\r\nimport { useState } from \"react\";\r\n\r\n// Material UI components\r\nimport {\r\n ListItemButton,\r\n ListItemText,\r\n LinearProgress,\r\n Button,\r\n ListItemSecondaryAction,\r\n Tooltip,\r\n} from \"@mui/material\";\r\n\r\n// HSA components\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\n/**\r\n * List item from list models in AI Viewer.\r\n */\r\nexport default function AIModelListItem({\r\n loading,\r\n name,\r\n progress,\r\n onStopTraining,\r\n selected,\r\n model,\r\n setSelectedModel,\r\n}) {\r\n const [isHovered, setIsHovered] = useState(false);\r\n const [datasetProgress, setDatasetProgress] = useState(0.0);\r\n const [trainingEpochProgress, setTrainingEpochProgress] = useState(0.0);\r\n const [trainingStatus, setTrainingStatus] = useState(\r\n model.information.trainingStatus\r\n );\r\n\r\n const getTrainingEpochProgress = () => {\r\n // get training epoch progress\r\n if (trainingStatus == \"running\") {\r\n Backend.getTrainingEpochProgress(name, (res) => {\r\n setTrainingEpochProgress(parseFloat(res));\r\n });\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const socket = Backend.getSocket();\r\n // get dataset progress\r\n socket.on(\"dataset_progress\", (data) => {\r\n const dataObj = JSON.parse(data);\r\n if (dataObj.model_name != name) return;\r\n setDatasetProgress(dataObj.progress);\r\n });\r\n\r\n // get training status\r\n socket.on(\"training_status\", (data) => {\r\n const dataObj = JSON.parse(data);\r\n if (dataObj.model_name != name) return;\r\n setTrainingStatus(dataObj.status);\r\n });\r\n\r\n // check for training progress every 10 seconds\r\n getTrainingEpochProgress();\r\n setInterval(getTrainingEpochProgress, 10 * 1000);\r\n\r\n return () => {\r\n // Clean up the effect\r\n socket.disconnect();\r\n };\r\n }, []);\r\n\r\n const renderState = () => {\r\n switch (true) {\r\n case trainingStatus == \"pending\":\r\n return Pending;\r\n case trainingStatus == \"creating dataset\":\r\n return (\r\n <>\r\n \r\n Creating Dataset\r\n \r\n \r\n \r\n );\r\n case trainingStatus == \"running\":\r\n return (\r\n <>\r\n \r\n Training Running\r\n \r\n \r\n \r\n );\r\n case trainingStatus == \"finished\":\r\n return Finished Training;\r\n case trainingStatus == \"created dataset\":\r\n return Created Dataset;\r\n case trainingStatus.includes(\"error\"):\r\n return (\r\n \r\n Error\r\n \r\n );\r\n default:\r\n return \"\";\r\n }\r\n };\r\n\r\n return (\r\n setIsHovered(true)}\r\n onMouseLeave={() => setIsHovered(false)}\r\n onClick={() => setSelectedModel(name)}\r\n disabled={loading}\r\n disableRipple\r\n >\r\n \r\n \r\n {name.replace(\"Custom - \", \"\")}\r\n \r\n \r\n }\r\n secondary={renderState()}\r\n />\r\n {progress > 0 && progress < 100 && (\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nAIModelListItem.propTypes = {\r\n loading: PropTypes.bool,\r\n name: PropTypes.string,\r\n state: PropTypes.oneOf([\"finished\", \"running\", \"pending\"]),\r\n progress: PropTypes.number,\r\n onStopTraining: PropTypes.func,\r\n selected: PropTypes.bool,\r\n model: PropTypes.object,\r\n setSelectedModel: PropTypes.func,\r\n};\r\n","// Framework components\r\nimport React from \"react\";\r\nimport { PropTypes } from \"prop-types\";\r\n\r\n// Material UI components\r\nimport { List } from \"@mui/material\";\r\n\r\n// Custom components\r\nimport AIModelListItem from \"./AIModelListItem\";\r\nimport \"./AIModelsList.css\";\r\n\r\n/**\r\n * List of models in AI Viewer.\r\n */\r\nexport default function AIModelsList({\r\n loading,\r\n AIModels,\r\n selectedModel,\r\n setSelectedModel,\r\n}) {\r\n const handleStopTraining = () => {\r\n // Dummy function for stopping training\r\n console.log(\"Stopping training...\");\r\n };\r\n\r\n return (\r\n \r\n
    \r\n {AIModels.map((item, index) => (\r\n handleStopTraining(index)}\r\n selected={item.settings.metaData.name === selectedModel}\r\n model={item}\r\n setSelectedModel={setSelectedModel}\r\n AIModels={AIModels}\r\n loading={loading}\r\n />\r\n ))}\r\n
    \r\n
    \r\n );\r\n}\r\n\r\nAIModelsList.propTypes = {\r\n loading: PropTypes.bool,\r\n AIModels: PropTypes.array.isRequired,\r\n selectedModel: PropTypes.string,\r\n setSelectedModel: PropTypes.func,\r\n};\r\n","// Framework components\r\nimport { React, useState } from \"react\";\r\nimport { PropTypes } from \"prop-types\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\n// import FilterListIcon from \"@mui/icons-material/FilterList\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport ResetIcon from \"@mui/icons-material/Replay\";\r\nimport InputBase from \"@mui/material/InputBase\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport { makeStyles } from \"@mui/styles\";\r\nimport {\r\n TextField,\r\n MenuItem,\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n Chip,\r\n} from \"@mui/material\";\r\n\r\n// Material UI components\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n width: \"100%\",\r\n },\r\n input: {\r\n marginLeft: theme.spacing(1),\r\n flex: 1,\r\n height: \"70px\",\r\n },\r\n iconButton: {\r\n padding: 10,\r\n },\r\n dialog: {\r\n width: \"500px\",\r\n },\r\n textField: {\r\n marginTop: theme.spacing(2),\r\n },\r\n chip: {\r\n marginTop: theme.spacing(1),\r\n marginRight: theme.spacing(1),\r\n },\r\n}));\r\n\r\n/**\r\n * Filter list of models in AI Viewer.\r\n */\r\nexport default function AIModelsFiltering({\r\n loading,\r\n modelFilterValue,\r\n onFilterChange,\r\n}) {\r\n const classes = useStyles();\r\n const modelTypes = [\r\n \"All\",\r\n \"Classification\",\r\n \"Segmentation\",\r\n \"Object Detection\",\r\n \"Instance Segmentation\",\r\n ];\r\n const trainingStatus = [\"All\", \"Pending\", \"Running\", \"Finished\", \"Failed\"];\r\n\r\n const [structureFilter, setStructureFilter] = useState(\"\");\r\n const [structureFilters, setStructureFilters] = useState([]); // TODO\r\n const [modelTypeFilter, setModelTypeFilter] = useState(\"All\"); // TODO\r\n const [trainingStatusFilter, setTrainingStatusFilter] = useState(\"All\"); // TODO\r\n const [open, setOpen] = useState(false);\r\n\r\n // const handleClickOpen = () => {\r\n // setOpen(true);\r\n // };\r\n\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n const handleStructureInputChange = (event) => {\r\n setStructureFilter(event.target.value);\r\n };\r\n\r\n const handleStructureInputKeyPress = (event) => {\r\n if (event.key === \"Enter\") {\r\n setStructureFilters((prevFilters) => [...prevFilters, structureFilter]);\r\n setStructureFilter(\"\");\r\n event.preventDefault();\r\n }\r\n };\r\n\r\n const handleDeleteStructureFilter = (chipToDelete) => () => {\r\n setStructureFilters((chips) =>\r\n chips.filter((chip) => chip !== chipToDelete)\r\n );\r\n };\r\n\r\n const resetFilters = () => {\r\n setStructureFilter(\"\");\r\n setStructureFilters([]);\r\n setModelTypeFilter(\"All\");\r\n setTrainingStatusFilter(\"All\");\r\n };\r\n\r\n return (\r\n \r\n {/* \r\n \r\n */}\r\n \r\n Filter Models\r\n \r\n \r\n \r\n \r\n \r\n {structureFilters.map((filter) => (\r\n \r\n ))}\r\n setModelTypeFilter(event.target.value)}\r\n className={classes.textField}\r\n fullWidth\r\n name=\"Textfield\"\r\n >\r\n {modelTypes.map((option) => (\r\n \r\n {option}\r\n \r\n ))}\r\n \r\n setTrainingStatusFilter(event.target.value)}\r\n className={classes.textField}\r\n fullWidth\r\n name=\"Textfield\"\r\n >\r\n {trainingStatus.map((option) => (\r\n \r\n {option}\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nAIModelsFiltering.propTypes = {\r\n loading: PropTypes.bool,\r\n modelFilterValue: PropTypes.string,\r\n onFilterChange: PropTypes.func,\r\n};\r\n","// Copyright HS Analysis GmbH, 2023\r\n// Author: Lukas Buess\r\n\r\n// HSA imports\r\n\r\n// Keep in sync with:\r\n// Source\\HSA-KIT\\modules\\hsa\\core\\ai\\....py\r\n// Source\\HSA-KIT\\ClientApp\\src\\common\\components\\....jsx\r\n\r\n/**\r\n * All dataset specific parameters of an AI Training.\r\n * @param {Object} systemInformation The system information object.\r\n * @param {String} systemInformation.os Operating system. Default: \"No Information!\".\r\n * @param {String} systemInformation.cpu Name of CPU. Default: \"No Information!\".\r\n * @param {String} systemInformation.gpu Name of GPU. Default: \"No Information!\".\r\n * @param {String} systemInformation.ram Amount of RAM. Default: \"No Information!\".\r\n */\r\nexport class SystemInformation {\r\n constructor(systemInformation) {\r\n let os = \"No Information!\";\r\n let cpu = \"No Information!\";\r\n let gpu = \"No Information!\";\r\n let ram = \"No Information!\";\r\n\r\n if (systemInformation) {\r\n os = systemInformation.os || os;\r\n cpu = systemInformation.cpu || cpu;\r\n gpu = systemInformation.gpu || gpu;\r\n ram = systemInformation.ram || ram;\r\n }\r\n\r\n this.os = os;\r\n this.cpu = cpu;\r\n this.gpu = gpu;\r\n this.ram = ram;\r\n }\r\n}\r\n\r\n/**\r\n * Information of an AI Training.\r\n * @param {String} creationDate Date when training was started.\r\n * @param {String} completionDate Date when training was completed.\r\n * @param {SystemInformation} systemInformation Information about the system used for training.\r\n * @param {String} trainingStatus status of the AI Training.\r\n * @param {String} errorMessage Error message if training failed.\r\n */\r\nexport class AITrainingInformation {\r\n constructor(\r\n creationDate = \"\",\r\n completionDate = \"\",\r\n systemInformation = new SystemInformation(),\r\n trainingStatus = \"pending\",\r\n errorMessage = \"\"\r\n ) {\r\n // Input validation\r\n if (typeof creationDate !== \"string\")\r\n throw TypeError(\r\n `creationDate must be of type string, received ${typeof creationDate}: ${creationDate}`\r\n );\r\n if (typeof completionDate !== \"string\")\r\n throw TypeError(\r\n `completionDate must be of type string, received ${typeof completionDate}: ${completionDate}`\r\n );\r\n if (!(systemInformation instanceof SystemInformation))\r\n throw TypeError(\r\n `systemInformation must be of type SystemInformation, received ${typeof systemInformation}: ${systemInformation}`\r\n );\r\n if (typeof trainingStatus !== \"string\")\r\n throw TypeError(\r\n `trainingStatus must be of type string, received ${typeof trainingStatus}: ${trainingStatus}`\r\n );\r\n if (typeof errorMessage !== \"string\")\r\n throw TypeError(\r\n `errorMessage must be of type string, received ${typeof errorMessage}: ${errorMessage}`\r\n );\r\n\r\n // Set parameters\r\n this.creationDate = creationDate;\r\n this.completionDate = completionDate;\r\n this.systemInformation = systemInformation;\r\n this.trainingStatus = trainingStatus;\r\n this.errorMessage = errorMessage;\r\n }\r\n}\r\n","// Copyright HS Analysis GmbH, 2023\r\n// Author: Lukas Buess\r\n\r\n// HSA imports\r\nimport AITrainingSettings from \"./AITrainingSettings.jsx\";\r\nimport { AITrainingInformation } from \"./AITrainingInformation.jsx\";\r\n\r\n/**\r\n * Information of an AI Training.\r\n * @param {AITrainingSettings} settings Settings used to train the AI model.\r\n * @param {AITrainingInformation} information Information about the AI training (e.g. progress, hardware, ...).\r\n */\r\nexport class AITrainingDataContainer {\r\n constructor(\r\n settings = new AITrainingSettings(),\r\n information = new AITrainingInformation()\r\n ) {\r\n // Input validation\r\n if (!(settings instanceof AITrainingSettings))\r\n throw TypeError(\r\n `settings must be of type AITrainingSettings, received ${typeof settings}: ${settings}`\r\n );\r\n if (!(information instanceof AITrainingInformation))\r\n throw TypeError(\r\n `information must be of type AITrainingInformation, received ${typeof information}: ${information}`\r\n );\r\n\r\n // Set parameters\r\n this.settings = settings;\r\n this.information = information;\r\n }\r\n}\r\n","import Box from \"@mui/material/Box\";\r\nimport Card from \"@mui/material/Card\";\r\nimport CardContent from \"@mui/material/CardContent\";\r\nimport {\r\n DatasetTypeNames,\r\n LossFunctionNames,\r\n MetricsNames,\r\n OptimizerNames,\r\n} from \"../../../common/components/AITrainingSettings\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport { Grid } from \"@mui/material\";\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport LinearProgress from \"@mui/material/LinearProgress\";\r\nimport { makeStyles } from \"@mui/styles\";\r\nimport MemoryIcon from \"@mui/icons-material/Memory\";\r\nimport PropTypes from \"prop-types\";\r\nimport React from \"react\";\r\nimport SettingsApplicationsIcon from \"@mui/icons-material/SettingsApplications\";\r\nimport TuneIcon from \"@mui/icons-material/Tune\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\n// Styles\r\nconst useStyles = makeStyles((theme) => ({\r\n card: {\r\n width: \"100%\",\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n boxShadow: \"0 8px 16px 0 rgba(0,0,0,0.2)\",\r\n borderRadius: \"5px\",\r\n backgroundColor: \"#f5f5f5\",\r\n paddingTop: \"16px\",\r\n paddingLeft: \"16px\",\r\n paddingRight: \"16px\",\r\n paddingBottom: \"0px\",\r\n },\r\n cardWrapper: {\r\n marginRight: theme.spacing(1),\r\n marginTop: theme.spacing(1),\r\n marginLeft: theme.spacing(1),\r\n marginBottom: theme.spacing(1),\r\n },\r\n divider: {\r\n \"&.MuiDivider-root\": {\r\n backgroundColor: \"rgb(66, 132, 243)\",\r\n opacity: \"1\",\r\n },\r\n },\r\n iconAdjust: {\r\n position: \"relative\",\r\n top: \"-2px\",\r\n },\r\n loading: {\r\n position: \"relative\",\r\n width: \"90%\",\r\n top: \"80%\",\r\n left: \"5%\",\r\n bottom: \"20%\",\r\n right: \"5%\",\r\n },\r\n loadingCard: {\r\n height: \"calc(100vh - 160px)\",\r\n width: \"100%\",\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n boxShadow: \"0 8px 16px 0 rgba(0,0,0,0.2)\",\r\n borderRadius: \"5px\",\r\n backgroundColor: \"#f5f5f5\",\r\n paddingTop: \"16px\",\r\n paddingLeft: \"16px\",\r\n paddingRight: \"16px\",\r\n paddingBottom: \"14px\",\r\n },\r\n scrollable: {\r\n height: \"calc(100vh - 140px)\",\r\n width: \"100%\",\r\n overflowY: \"auto\",\r\n },\r\n}));\r\n\r\n/**\r\n * Place that hosts settings of selected model in AI Viewer.\r\n */\r\nexport default function SelectedAIModelInformation(props) {\r\n const { loading, selectedAIModel } = props;\r\n const classes = useStyles();\r\n // const ExportTooltip = \"Export all data as .json\";\r\n const check = \"...Looking for an update...\";\r\n // const top = \"top\";\r\n\r\n const makeTopRow = () => {\r\n return (\r\n \r\n \r\n Model Information\r\n \r\n \r\n );\r\n };\r\n\r\n if (loading || selectedAIModel.settings.metaData === undefined) {\r\n return (\r\n
    \r\n
    \r\n \r\n {makeTopRow()}\r\n \r\n \r\n
    \r\n
    \r\n \r\n ML Model: "\r\n {selectedAIModel.settings.metaData.name.replace(\r\n \"Custom - \",\r\n \"\"\r\n )}\r\n "{\" \"}\r\n \r\n
    \r\n
    \r\n {check}\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n if (!loading && selectedAIModel.settings.metaData !== undefined) {\r\n return (\r\n
    \r\n
    \r\n \r\n {makeTopRow()}\r\n \r\n \r\n \r\n \r\n ML Model\r\n \r\n \r\n "\r\n {selectedAIModel.settings.metaData.name.replace(\r\n \"Custom - \",\r\n \"\"\r\n )}\r\n "\r\n \r\n \r\n Project\r\n \r\n \r\n {selectedAIModel.settings.projectType}\r\n \r\n \r\n Version\r\n \r\n \r\n "{selectedAIModel.settings.metaData.version}"\r\n \r\n \r\n Structures\r\n \r\n \r\n {selectedAIModel.settings.structures\r\n .map((obj) => obj.label)\r\n .join(\", \")}\r\n \r\n \r\n Description\r\n \r\n \r\n "{selectedAIModel.settings.metaData.description}"\r\n \r\n \r\n Starting timestamp\r\n \r\n \r\n {new Date(selectedAIModel.information.creationDate)\r\n .toDateString()\r\n .replace(\" \", \", \")}\r\n ,{\" \"}\r\n {new Date(\r\n selectedAIModel.information.creationDate\r\n ).toLocaleTimeString()}\r\n \r\n \r\n New ML Model\r\n \r\n \r\n "{String(selectedAIModel.settings.metaData.isNewModel)}\r\n "\r\n \r\n \r\n Completion timestamp\r\n \r\n \r\n {selectedAIModel.information.completionDate === undefined ||\r\n selectedAIModel.information.completionDate === \"\"\r\n ? \"\"\r\n : `${new Date(selectedAIModel.information.completionDate)\r\n .toDateString()\r\n .replace(\" \", \", \")}, ${new Date(\r\n selectedAIModel.information.completionDate\r\n ).toLocaleTimeString()}`}\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n {\" \"}\r\n Model Parameters\r\n \r\n \r\n \r\n \r\n \r\n Dataset Type\r\n \r\n \r\n {\r\n DatasetTypeNames[\r\n selectedAIModel.settings.datasetParameters.datasetType\r\n ]\r\n }\r\n \r\n \r\n Input Channels\r\n \r\n \r\n {String(\r\n selectedAIModel.settings.modelParameters.inputChannels\r\n )}\r\n \r\n \r\n Spatial Dimensions\r\n \r\n \r\n {String(\r\n selectedAIModel.settings.modelParameters.spatialDims\r\n )}\r\n \r\n \r\n Image Width\r\n \r\n \r\n {String(\r\n selectedAIModel.settings.modelParameters.imageWidth\r\n )}\r\n \r\n \r\n Image Height\r\n \r\n \r\n {String(\r\n selectedAIModel.settings.modelParameters.imageHeight\r\n )}\r\n \r\n \r\n Number of Classes\r\n \r\n \r\n {String(\r\n selectedAIModel.settings.modelParameters.numberOfClasses\r\n )}\r\n \r\n \r\n Pyramid Level\r\n \r\n \r\n {String(\r\n selectedAIModel.settings.modelParameters.pyramidLevel\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n Training\r\n Parameters\r\n \r\n \r\n \r\n \r\n \r\n Epochs\r\n \r\n \r\n {selectedAIModel.settings.trainingParameters.epochs}\r\n \r\n \r\n Early Stopping\r\n \r\n \r\n {\r\n selectedAIModel.settings.trainingParameters\r\n .earlyStopping\r\n }\r\n \r\n \r\n Batch Size\r\n \r\n \r\n {selectedAIModel.settings.trainingParameters.batchSize}\r\n \r\n \r\n Metrics\r\n \r\n \r\n {selectedAIModel.settings.trainingParameters.metrics\r\n .map((metric) => MetricsNames[metric])\r\n .join(\", \")}\r\n \r\n \r\n Loss Functions\r\n \r\n \r\n {selectedAIModel.settings.trainingParameters.lossFunctions\r\n .map((lossFunction) => LossFunctionNames[lossFunction])\r\n .join(\", \")}\r\n \r\n \r\n Optimizers\r\n \r\n \r\n {\r\n OptimizerNames[\r\n selectedAIModel.settings.trainingParameters.optimizer\r\n ]\r\n }\r\n {OptimizerNames[\r\n selectedAIModel.settings.trainingParameters.optimizer\r\n ] === \"AdamW\"\r\n ? \"(eight)\"\r\n : \"\"}\r\n \r\n \r\n Learning Rate\r\n \r\n \r\n {String(\r\n selectedAIModel.settings.trainingParameters.learningRate\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n System Information\r\n \r\n \r\n \r\n \r\n \r\n OS\r\n \r\n \r\n {selectedAIModel.information.systemInformation.os}\r\n \r\n \r\n CPU\r\n \r\n \r\n {selectedAIModel.information.systemInformation.cpu}\r\n \r\n \r\n GPU\r\n \r\n \r\n {selectedAIModel.information.systemInformation.gpu}\r\n \r\n \r\n RAM\r\n \r\n \r\n {String(selectedAIModel.information.systemInformation.ram)}\r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n return
    ;\r\n}\r\n\r\nSelectedAIModelInformation.propTypes = {\r\n loading: PropTypes.bool,\r\n selectedAIModel: PropTypes.object,\r\n};\r\n","import * as echarts from \"echarts\";\r\nimport JSZip from \"jszip\";\r\nimport { saveAs } from \"file-saver\";\r\n\r\nexport const downloadZippedChartDataAndImage = async (chartId, key, data) => {\r\n console.log(chartId);\r\n console.log(key);\r\n console.log(data);\r\n const zip = new JSZip();\r\n\r\n // Convert data to CSV format\r\n const csvData = [`x-values,y-values`];\r\n for (let i = 0; i < data.x_values.length; i++) {\r\n csvData.push(`${data.x_values[i]},${data.y_values[i]}`);\r\n }\r\n const csvContent = csvData.join(\"\\n\");\r\n\r\n // Add CSV to zip\r\n zip.file(`${key}.csv`, csvContent);\r\n\r\n // Add chart image to zip\r\n const chartElement = document.getElementById(chartId);\r\n const chartBase64 = echarts.getInstanceByDom(chartElement).getDataURL({\r\n type: \"png\",\r\n pixelRatio: 2,\r\n backgroundColor: \"rgb(245, 245, 247)\",\r\n });\r\n const base64Data = chartBase64.replace(/^data:image\\/png;base64,/, \"\");\r\n zip.file(`${key}.png`, base64Data, { base64: true });\r\n\r\n // Generate zip and prompt download\r\n zip.generateAsync({ type: \"blob\" }).then((content) => {\r\n saveAs(content, `${key}_chart-data.zip`);\r\n });\r\n};\r\n\r\nconst setColors = (label) => {\r\n const redWords = [\"loss\", \"error\"];\r\n const greyWords = [\"time\", \"memory\", \"epoch\", \"iter\"];\r\n const redColors = [\"rgb(235, 100, 53)\", \"rgb(235, 100, 53, 0.4)\"];\r\n const greyColors = [\"rgb(107, 107, 107)\", \"rgba(107, 107, 107, 0.4)\"];\r\n const defaultBlue = [\"\", \"\"];\r\n\r\n switch (true) {\r\n case redWords.some((sub) => label.toLowerCase().includes(sub)):\r\n return redColors;\r\n case greyWords.some((sub) => label.toLowerCase().includes(sub)):\r\n return greyColors;\r\n default:\r\n return defaultBlue;\r\n }\r\n};\r\n\r\nexport const setOptions = (key, data) => {\r\n const label = key;\r\n const xValues = data.x_values;\r\n const yValues = data.y_values;\r\n const xAxisName = data.x_axis;\r\n const yAxisName = data.y_axis;\r\n const [solidColor, transparentColor] = setColors(label);\r\n\r\n const options_output = {\r\n title: {\r\n text: label,\r\n x: \"center\",\r\n },\r\n xAxis: {\r\n type: \"category\",\r\n data: xValues,\r\n name: xAxisName,\r\n },\r\n yAxis: {\r\n type: \"value\",\r\n data: yValues,\r\n name: yAxisName,\r\n },\r\n dataZoom: [\r\n {\r\n type: \"slider\",\r\n start: 0,\r\n end: 100,\r\n fillerColor: transparentColor,\r\n handleColor: solidColor,\r\n handleStyle: {\r\n color: transparentColor,\r\n },\r\n },\r\n ],\r\n tooltip: {\r\n trigger: \"axis\",\r\n axisPointer: {\r\n type: \"cross\",\r\n },\r\n },\r\n series: [\r\n {\r\n showSymbol: false,\r\n type: \"line\",\r\n data: yValues,\r\n itemStyle: {\r\n color: solidColor,\r\n },\r\n },\r\n ],\r\n animationDuration: 0,\r\n };\r\n\r\n return options_output;\r\n};\r\n\r\nexport const downloadNZip = (n, chartDataKeys, chartData) => {\r\n for (let i = 0; i < n; i++) {\r\n const key = chartDataKeys[i];\r\n const data = chartData[key];\r\n downloadZippedChartDataAndImage(`chart_${i + 1}`, key, data);\r\n }\r\n};\r\n","import Box from \"@mui/material/Box\";\r\nimport Card from \"@mui/material/Card\";\r\nimport CardContent from \"@mui/material/CardContent\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport DownloadIcon from \"@mui/icons-material/Download\";\r\nimport { downloadZippedChartDataAndImage, setOptions } from \"./Utils\";\r\nimport * as echarts from \"echarts\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport { LinearProgress } from \"@mui/material\";\r\nimport { makeStyles } from \"@mui/styles\";\r\nimport PropTypes from \"prop-types\";\r\nimport React, { useEffect } from \"react\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport BarChartIcon from \"@mui/icons-material/BarChart\";\r\n\r\n// Styles\r\nconst useStyles = makeStyles((theme) => ({\r\n app: {\r\n width: \"100%\",\r\n height: \"280px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n },\r\n boxStyle: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n height: \"32px\",\r\n },\r\n card: {\r\n height: \"calc(100vh - 160px)\",\r\n width: \"100%\",\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n boxShadow: \"0 8px 16px 0 rgba(0,0,0,0.2)\",\r\n borderRadius: \"5px\",\r\n backgroundColor: \"#f5f5f5\",\r\n paddingTop: \"16px\",\r\n paddingLeft: \"16px\",\r\n paddingRight: \"16px\",\r\n paddingBottom: \"14px\",\r\n },\r\n cardContent: {\r\n overflowY: \"auto\",\r\n },\r\n cardWrapper: {\r\n marginRight: theme.spacing(1),\r\n marginTop: theme.spacing(1),\r\n marginLeft: theme.spacing(1),\r\n marginBottom: theme.spacing(1),\r\n },\r\n chartButtons: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"10px\",\r\n },\r\n chartDimension: {\r\n width: \"32vw\",\r\n maxWidth: \"1000px\",\r\n height: \"250px\",\r\n },\r\n divider: {\r\n \"&.MuiDivider-root\": {\r\n backgroundColor: \"rgb(66, 132, 243)\",\r\n opacity: \"1\",\r\n },\r\n },\r\n iconAdjust: {\r\n position: \"relative\",\r\n top: \"-2px\",\r\n },\r\n loading: {\r\n position: \"relative\",\r\n width: \"90%\",\r\n top: \"80%\",\r\n left: \"5%\",\r\n bottom: \"20%\",\r\n right: \"5%\",\r\n },\r\n scrollable: {\r\n height: \"calc(100vh - 110px)\",\r\n width: \"100%\",\r\n overflowY: \"auto\",\r\n },\r\n}));\r\n\r\nexport default function ApacheEChartsTimeSeries(props) {\r\n const { chartData, chartDataKeys, error, loading, m, n, selectedModel } =\r\n props;\r\n const classes = useStyles();\r\n const top = \"top\";\r\n\r\n useEffect(() => {\r\n if (!loading && n > 0) {\r\n const charts = [];\r\n\r\n for (let i = 0; i < n; i++) {\r\n const element = document.getElementById(`chart_${i + 1}`);\r\n charts.push(echarts.init(element));\r\n }\r\n\r\n for (let i = 0; i < n; i++) {\r\n const key = chartDataKeys[i];\r\n const data = chartData[key];\r\n charts[i].setOption(setOptions(key, data));\r\n }\r\n\r\n return () => {\r\n for (let i = 0; i < n; i++) {\r\n charts[i].dispose();\r\n }\r\n };\r\n }\r\n }, [loading, chartData]);\r\n\r\n const makeTopRow = () => {\r\n return (\r\n \r\n \r\n Training Statistics\r\n \r\n \r\n );\r\n };\r\n\r\n const setChartAndDownloadButton = (i) => {\r\n const key = chartDataKeys[i];\r\n const data = chartData[key];\r\n const chartId = `chart_${i + 1}`;\r\n const exportTooltip = \"Export data and image as .zip\";\r\n if (key && data) {\r\n return (\r\n <>\r\n \r\n
    \r\n \r\n \r\n downloadZippedChartDataAndImage(chartId, key, data)\r\n }\r\n >\r\n \r\n \r\n \r\n
    \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n );\r\n };\r\n\r\n if (error) {\r\n return
    An error occurred: {error.message}
    ;\r\n }\r\n\r\n if (loading) {\r\n const check = \"...Preparing Graphs...\";\r\n return (\r\n
    \r\n
    \r\n \r\n {makeTopRow()}\r\n \r\n \r\n
    \r\n
    \r\n \r\n ML Model: "{selectedModel.replace(\"Custom - \", \"\")}"{\" \"}\r\n \r\n
    \r\n
    \r\n {check}\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n if (!loading && n == 0) {\r\n const noData =\r\n 'There are no chart data associated with ML model \"' +\r\n selectedModel.replace(\"Custom - \", \"\") +\r\n '\".';\r\n return (\r\n
    \r\n
    \r\n \r\n {makeTopRow()}\r\n \r\n \r\n
    \r\n
    \r\n {noData}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n if (!loading && n > 0) {\r\n return (\r\n
    \r\n
    \r\n \r\n {makeTopRow()}\r\n \r\n \r\n {Array.from({ length: Math.ceil(m / 2) }, (_, i) => (\r\n
    \r\n {setChartAndDownloadButton(2 * i)}\r\n {setChartAndDownloadButton(2 * i + 1)}\r\n
    \r\n ))}\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nApacheEChartsTimeSeries.propTypes = {\r\n chartData: PropTypes.object,\r\n chartDataKeys: PropTypes.array,\r\n error: PropTypes.object,\r\n loading: PropTypes.bool,\r\n m: PropTypes.number,\r\n n: PropTypes.number,\r\n selectedModel: PropTypes.string,\r\n};\r\n","import Backend from \"../../../common/utils/Backend\";\r\n\r\nexport const handleDownload = (finalSelectedModel) => {\r\n Backend.getModelMetadata(\"hsa_models\", false, (res) => {\r\n const fetchedData = res.models;\r\n const model = fetchedData.find(\r\n (item) => item.meta_data.name === finalSelectedModel\r\n );\r\n const jsonStr = JSON.stringify(model, null, 2); // stringify with pretty-print\r\n const blob = new Blob([jsonStr], { type: \"text/json\" });\r\n const blobURL = window.URL.createObjectURL(blob);\r\n\r\n const tempLink = document.createElement(\"a\");\r\n tempLink.style.display = \"none\";\r\n tempLink.href = blobURL;\r\n tempLink.setAttribute(\"download\", finalSelectedModel + \".json\");\r\n\r\n document.body.appendChild(tempLink);\r\n tempLink.click();\r\n\r\n // Clean-up\r\n document.body.removeChild(tempLink);\r\n window.URL.revokeObjectURL(blobURL);\r\n });\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport BarChartIcon from \"@mui/icons-material/BarChart\";\r\nimport Backend from \"../common/utils/Backend\";\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport SettingsIcon from \"@mui/icons-material/Settings\";\r\n\r\nimport { Grid } from \"@mui/material\";\r\n\r\nimport AIModelsList from \"./components/AIModelsList\";\r\nimport AIModelsFiltering from \"./components/AIModelsFiltering\";\r\nimport AITrainingSettings, {\r\n TrainingParameters,\r\n ModelMetaData,\r\n DatasetParameters,\r\n ImageDatasetMeta,\r\n} from \"../common/components/AITrainingSettings\";\r\nimport {\r\n AITrainingInformation,\r\n SystemInformation,\r\n} from \"../common/components/AITrainingInformation\";\r\nimport { AITrainingDataContainer } from \"../common/components/AITrainingDataContainer\";\r\nimport { Tab, Tabs, Typography } from \"@mui/material\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport { CloudDownload, SimCardDownload } from \"@mui/icons-material\";\r\nimport CloudUploadIcon from \"@mui/icons-material/CloudUpload\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\n\r\nimport ReplayIcon from \"@mui/icons-material/Replay\";\r\nimport { makeStyles } from \"@mui/styles\";\r\nimport SelectedAIModelInformation from \"./components/dashboard-representation/SelectedAIModelInformation\";\r\nimport ApacheEChartsTimeSeries from \"./components/custom-tensorboard-representation/ApacheEChartsTimeSeries\";\r\nimport Box from \"@mui/material/Box\";\r\nimport Card from \"@mui/material/Card\";\r\nimport LinearProgress from \"@mui/material/LinearProgress\";\r\nimport { handleDownload } from \"./components/dashboard-representation/Utils\";\r\nimport { downloadNZip } from \"./components/custom-tensorboard-representation/Utils\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport Structure from \"../common/components/Structure\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n blueButton: {\r\n border: \"none\",\r\n textAlign: \"center\",\r\n verticalAlign: \"middle\",\r\n textDecoration: \"none\",\r\n display: \"inline-block\",\r\n fontSize: \"14px\",\r\n transitionDuration: \"0s\",\r\n color: \"rgb(6, 115, 193)\",\r\n },\r\n divider: {\r\n \"&.MuiDivider-root\": {\r\n backgroundColor: \"rgb(66, 132, 243)\",\r\n opacity: \"1\",\r\n },\r\n },\r\n greyButton: {\r\n border: \"none\",\r\n textAlign: \"center\",\r\n verticalAlign: \"middle\",\r\n textDecoration: \"none\",\r\n display: \"inline-block\",\r\n fontSize: \"14px\",\r\n transitionDuration: \"0s\",\r\n },\r\n iconAdjust: {\r\n position: \"relative\",\r\n top: \"-2px\",\r\n },\r\n}));\r\n\r\nconst addOneIfOdd = (nKeys) => {\r\n return nKeys % 2 == 0 ? nKeys : nKeys + 1;\r\n};\r\n\r\n/**\r\n * Overall parent component for AI Viewer.\r\n * This component contains all parts of the ai viewer and will be called with the /ai_view route.\r\n */\r\nexport default function AIViewer() {\r\n const [selectedModel, setSelectedModel] = useState(\"\");\r\n const [trainedModels, setTrainedModels] = useState([]);\r\n const [loadingOne, setLoadingOne] = useState(true);\r\n const [importingAIModel, setImportingAIModel] = useState(false);\r\n const [exportingAIModel, setExportingAIModel] = useState(false);\r\n const [exportingAIModelDataset, setExportingAIModelDataset] = useState(false);\r\n const [deletingAIModel, setDeletingAIModel] = useState(false);\r\n const [modelFilterValue, setModelFilterValue] = useState(\"\");\r\n const [selectedTab, setSelectedTab] = useState(0);\r\n\r\n const [chartDataKeys, setChartDataKeys] = useState([]);\r\n const [error, setError] = useState(null);\r\n const [m, setM] = useState(0);\r\n const [n, setN] = useState(0);\r\n const [chartData, setChartData] = useState({});\r\n const classes = useStyles();\r\n\r\n useEffect(() => {\r\n fetchData(true);\r\n return () => {};\r\n }, []);\r\n\r\n const fetchData = async (showLoading = false) => {\r\n if (showLoading) setLoadingOne(true);\r\n try {\r\n if (selectedTab === 0) {\r\n Backend.getModelMetadata(\"hsa_models\", false, (res) => {\r\n setTrainedModels(res.newModels);\r\n });\r\n }\r\n\r\n if (selectedTab === 1) {\r\n Backend.loadTensorboardScalarData(selectedModel, (res) => {\r\n setChartData(res);\r\n const resKeys = Object.keys(res);\r\n const resKeysLength = resKeys.length;\r\n setChartDataKeys(resKeys);\r\n setM(addOneIfOdd(resKeysLength));\r\n setN(resKeysLength);\r\n });\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n setError(error);\r\n } finally {\r\n console.log(\"Data fetched successfully!\");\r\n setTimeout(() => setLoadingOne(false), 625);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (selectedTab === 1) {\r\n fetchData(true);\r\n setLoadingOne(true);\r\n setTimeout(() => setLoadingOne(false), 625);\r\n }\r\n\r\n return () => {};\r\n }, [selectedModel, selectedTab]);\r\n\r\n const AIModels = [];\r\n\r\n const nTrainedModels = trainedModels.length;\r\n if (nTrainedModels > 0) {\r\n for (let i = 0; i < nTrainedModels; i++) {\r\n const model = trainedModels[i];\r\n\r\n // get AITrainingSettings\r\n const metaData = new ModelMetaData({\r\n name: model.settings.meta_data.name,\r\n version: model.settings.meta_data.version,\r\n description: model.settings.meta_data.description,\r\n isNewModel: model.settings.meta_data.is_new_model,\r\n });\r\n const datasetParameters = new DatasetParameters({\r\n datasetApproach: model.settings.dataset_parameters.dataset_approach,\r\n datasetType: model.settings.dataset_parameters.dataset_type,\r\n datasetOnly: model.settings.dataset_parameters.dataset_only,\r\n useExistingDataset:\r\n model.settings.dataset_parameters.use_existing_dataset,\r\n });\r\n const trainingParameters = new TrainingParameters({\r\n epochs: model.settings.training_parameters.epochs,\r\n earlyStopping: model.settings.training_parameters.early_stopping,\r\n batchSize: model.settings.training_parameters.batch_size,\r\n metrics: model.settings.training_parameters.metrics,\r\n lossFunctions: model.settings.training_parameters.loss_function,\r\n optimizer: model.settings.training_parameters.optimizer,\r\n learningRate: model.settings.training_parameters.learning_rate,\r\n });\r\n const modelParameters = new ImageDatasetMeta({\r\n datasetType: model.settings.model_parameters.dataset_type,\r\n inputChannels: model.settings.model_parameters.input_channels,\r\n spatialDims: model.settings.model_parameters.spatial_dims,\r\n imageWidth: model.settings.model_parameters.image_width,\r\n imageHeight: model.settings.model_parameters.image_height,\r\n numberOfClasses: model.settings.model_parameters.number_of_classes,\r\n pyramidLevel: model.settings.model_parameters.pyramid_level,\r\n });\r\n\r\n const trainingsettings = new AITrainingSettings(\r\n model.settings.project_id,\r\n model.settings.project_type ? model.settings.project_type : \"\",\r\n metaData,\r\n datasetParameters,\r\n trainingParameters,\r\n modelParameters,\r\n model.settings.structures.map((structure) =>\r\n Structure.fromObject(structure)\r\n )\r\n );\r\n\r\n // get AITrainingInformation\r\n const systemInformation = new SystemInformation(\r\n model.information.system_information\r\n );\r\n\r\n const trainingInformation = new AITrainingInformation(\r\n model.information.creation_date,\r\n model.information.completion_date,\r\n systemInformation,\r\n model.information.training_status,\r\n model.information.error_message\r\n );\r\n\r\n // initialize AIModelDataContainer\r\n const AIModelDataContainer = new AITrainingDataContainer(\r\n trainingsettings,\r\n trainingInformation\r\n );\r\n\r\n AIModels.push(AIModelDataContainer);\r\n }\r\n\r\n AIModels.sort((a, b) => {\r\n return (\r\n Date.parse(b.information.creationDate) -\r\n Date.parse(a.information.creationDate)\r\n );\r\n });\r\n }\r\n\r\n const getFilteredAIModels = (filterInput, AIModels) => {\r\n return AIModels.filter((model) => {\r\n return model.settings.metaData.name\r\n .toLowerCase()\r\n .includes(filterInput.toLowerCase());\r\n });\r\n };\r\n\r\n const filteredModels = getFilteredAIModels(modelFilterValue, AIModels);\r\n\r\n const handleFilterChange = (event) => {\r\n setModelFilterValue(event.target.value);\r\n };\r\n\r\n const updateSelectedModel = () => {\r\n if (filteredModels.length === 0) {\r\n setSelectedModel(\"\");\r\n return \"\";\r\n }\r\n\r\n setSelectedModel(filteredModels[0].settings.metaData.name);\r\n return filteredModels[0].settings.metaData.name;\r\n };\r\n\r\n const handleImportModelSelection = (e) => {\r\n let files = e.target.files;\r\n setImportingAIModel(true);\r\n Backend.importAIModels(files[0], (result) => {\r\n if (!result.success) {\r\n window.showErrorSnackbar(\"Import failed\");\r\n } else if (result.fileIsNew) {\r\n window.showSuccessSnackbar(\"Successfully imported model\");\r\n } else {\r\n window.showWarningSnackbar(\"Model already exists\");\r\n }\r\n setImportingAIModel(false);\r\n fetchData(true);\r\n });\r\n };\r\n\r\n const handleExportModel = () => {\r\n setExportingAIModel(true);\r\n var aiModel = {\r\n Name: selectedModel,\r\n };\r\n Backend.exportAIModel(JSON.stringify(aiModel), (result) => {\r\n console.log(\"Exported model\", result);\r\n setExportingAIModel(false);\r\n });\r\n };\r\n\r\n const handleExportModelDataset = () => {\r\n setExportingAIModelDataset(true);\r\n var aiModel = {\r\n Name: selectedModel,\r\n };\r\n Backend.exportAIModelDataset(JSON.stringify(aiModel), (result) => {\r\n console.log(\"Exported model dataset\", result);\r\n setExportingAIModelDataset(false);\r\n });\r\n };\r\n\r\n const handleDeleteModel = () => {\r\n window.openResponseDialog(\r\n \"Do you really want to delete this model?\",\r\n (response) => {\r\n if (response) {\r\n setDeletingAIModel(true);\r\n Backend.deleteAIModel(selectedModel, (result) => {\r\n if (result.successful) {\r\n window.showSuccessSnackbar(result.information);\r\n } else {\r\n window.showErrorSnackbar(result.information);\r\n }\r\n setDeletingAIModel(false);\r\n fetchData(true);\r\n });\r\n }\r\n }\r\n );\r\n };\r\n\r\n const styleTwo = { height: \"calc(100vh - 140px)\", background: \"#FFFFFF\" };\r\n if (AIModels.length == 0) {\r\n return (\r\n <>\r\n \r\n No AI models available\r\n \r\n \r\n document.getElementById(\"importAIModel\").click()}\r\n disabled={loadingOne}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n const handleChange = (event, newValue) => {\r\n setSelectedTab(newValue);\r\n };\r\n\r\n const setChartBlocks = (selectedTab, finalSelectedModel) => {\r\n const styleOne = { height: \"100%\", background: \"rgb(235,235,235)\" };\r\n switch (selectedTab) {\r\n case 0:\r\n return (\r\n
    \r\n \r\n item.settings.metaData.name === finalSelectedModel\r\n )}\r\n >\r\n \r\n
    \r\n );\r\n case 1:\r\n return (\r\n
    \r\n \r\n \r\n \r\n
    \r\n );\r\n default:\r\n return <>;\r\n }\r\n };\r\n\r\n if (AIModels.length > 0) {\r\n const finalSelectedModel = filteredModels.some(\r\n (model) => model.settings.metaData.name === selectedModel\r\n )\r\n ? selectedModel\r\n : updateSelectedModel();\r\n const chartBlocks = setChartBlocks(selectedTab, finalSelectedModel);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {loadingOne && Loading...}\r\n {!loadingOne && (\r\n \r\n "{selectedModel.replace(\"Custom - \", \"\")}\r\n "\r\n \r\n )}\r\n \r\n \r\n }\r\n iconPosition=\"start\"\r\n label=\"Model Information\"\r\n disabled={\r\n loadingOne ||\r\n importingAIModel ||\r\n exportingAIModel ||\r\n exportingAIModelDataset ||\r\n deletingAIModel\r\n }\r\n />\r\n }\r\n iconPosition=\"start\"\r\n label=\"Training Statistics\"\r\n disabled={\r\n loadingOne ||\r\n importingAIModel ||\r\n exportingAIModel ||\r\n exportingAIModelDataset ||\r\n deletingAIModel\r\n }\r\n />\r\n }\r\n iconPosition=\"start\"\r\n label=\"Model Settings (coming soon)\"\r\n disabled\r\n />\r\n \r\n \r\n \r\n {chartBlocks}\r\n \r\n\r\n {/* Main Part*/}\r\n \r\n \r\n
    \r\n \r\n \r\n \r\n {\r\n fetchData(true);\r\n }}\r\n disabled={loadingOne}\r\n >\r\n \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n handleDownload(finalSelectedModel)}\r\n disabled={loadingOne}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n downloadNZip(n, chartDataKeys, chartData)\r\n }\r\n disabled={loadingOne}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n handleDownload(finalSelectedModel)}\r\n disabled={true}\r\n >\r\n \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n document.getElementById(\"importAIModel\").click()\r\n }\r\n disabled={loadingOne}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n {importingAIModel && (\r\n
    \r\n {\"Importing AI Model ...\"}\r\n \r\n
    \r\n )}\r\n {exportingAIModel && (\r\n
    \r\n {\"Exporting AI Model ...\"}\r\n \r\n
    \r\n )}\r\n {exportingAIModelDataset && (\r\n
    \r\n {\"Exporting AI Model Dataset ...\"}\r\n \r\n
    \r\n )}\r\n {deletingAIModel && (\r\n
    \r\n {\"Deleting AI Model ...\"}\r\n \r\n
    \r\n )}\r\n model.settings.metaData.name === selectedModel\r\n )\r\n ? selectedModel\r\n : updateSelectedModel()\r\n }\r\n setSelectedModel={setSelectedModel}\r\n >\r\n
    \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n// AIViewer.propTypes = {};\r\n","import React, { useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// HSA\r\nimport Backend from \"../../../common/utils/Backend\";\r\n\r\n// mui\r\nimport { DialogContent, TextField, MenuItem } from \"@mui/material\";\r\nimport { makeStyles } from \"@mui/styles\";\r\nconst useStyles = makeStyles({\r\n root: {},\r\n dialogContent: {\r\n paddingTop: 5,\r\n maxWidth: 900,\r\n height: 562,\r\n },\r\n textField: {\r\n marginBottom: 10,\r\n },\r\n});\r\n\r\nconst StepCaseForm = (props) => {\r\n const { updateTrigger, caseColumns, setCaseColumns, editCase } = props;\r\n const classes = useStyles();\r\n const today = new Date().toISOString().slice(0, 10);\r\n\r\n useEffect(() => {\r\n Backend.readAppSettings().then((response) => {\r\n if (response.caseColumns) {\r\n updateCaseColumns(\r\n response.caseColumns.map((item) => {\r\n if (item.items === null) item.items = [];\r\n item.value = item.defaultValue;\r\n if (item.type === \"Date\" && item.defaultValue === \"Current Date\") {\r\n item.value = today;\r\n }\r\n // push a new ref into the refs array for each case column\r\n return item;\r\n })\r\n );\r\n }\r\n });\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (caseColumns.length === 0) return;\r\n const updatedCaseColumns = caseColumns.map((col, idx) => {\r\n const element = document.getElementById(\"row\" + idx);\r\n const textFieldValue = element.value;\r\n\r\n col.value = textFieldValue ? textFieldValue : element.innerText;\r\n return col;\r\n });\r\n setCaseColumns(updatedCaseColumns);\r\n }, [updateTrigger]);\r\n\r\n const updateCaseColumns = (newCaseColumns) => {\r\n if (editCase) {\r\n let newColumns = newCaseColumns.map((column) => {\r\n let newColumn = { ...column };\r\n if (editCase[column.name]) {\r\n newColumn.value = editCase[column.name];\r\n }\r\n return newColumn;\r\n });\r\n setCaseColumns(newColumns);\r\n } else {\r\n setCaseColumns(newCaseColumns);\r\n }\r\n };\r\n\r\n const getFieldList = () => {\r\n return caseColumns.map(({ type, label, value, items }, idx) => {\r\n const TextFieldProps = {\r\n fullWidth: true,\r\n label,\r\n defaultValue: value,\r\n id: \"row\" + idx,\r\n };\r\n\r\n if (type === \"Text area\") {\r\n return (\r\n \r\n );\r\n } else if (type === \"Options\") {\r\n return (\r\n \r\n {items.map((itemValue, itemIdx) => (\r\n \r\n {itemValue.label}\r\n \r\n ))}\r\n \r\n );\r\n } else if (type === \"Date\") {\r\n return (\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n );\r\n }\r\n });\r\n };\r\n\r\n return (\r\n \r\n {getFieldList()}\r\n \r\n );\r\n};\r\n\r\nStepCaseForm.propTypes = {\r\n editCase: PropTypes.object,\r\n updateTrigger: PropTypes.bool,\r\n caseColumns: PropTypes.array,\r\n setCaseColumns: PropTypes.func,\r\n};\r\n\r\nexport default StepCaseForm;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Grid, Button, TextField } from \"@mui/material\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = () => ({\r\n root: {},\r\n});\r\n\r\n// This is commented out since the attepts to implement an autocomplete\r\n// somehow failed. However, it took time to copy, so it stays for now.\r\n// // Product per specifications\r\n// const products = [\r\n// { label: \"Bratwurst\", abbr: \"BW\" },\r\n// { label: \"Kochpökelware\", abbr: \"KO\" },\r\n// { label: \"Rohpökelware\", abbr: \"RO\" },\r\n// { label: \"Brühwurst\", abbr: \"BR\" },\r\n// { label: \"Verarbeitugnsfleisch\", abbr: \"VA\" },\r\n// { label: \"Separatorenfleisch\", abbr: \"SP\" },\r\n// { label: \"Hackfleisch roh\", abbr: \"HA\" },\r\n// { label: \"Hackfleischerz. gegart\", abbr: \"HG\" },\r\n// { label: \"Kochwurst\", abbr: \"KO\" },\r\n// { label: \"Rohwurst\", abbr: \"RO\" },\r\n// { label: \"Aspikwaren\", abbr: \"AS\" },\r\n// { label: \"Rohfleisch\", abbr: \"RF\" },\r\n// { label: \"Gegartes Fleisch\", abbr: \"GF\" },\r\n// { label: \"Kontrollen\", abbr: \"KO\" },\r\n// { label: \"Stufenkontrollen\", abbr: \"SK\" },\r\n// { label: \"LVU\", abbr: \"LV\" },\r\n// { label: \"Zusätze\", abbr: \"ZU\" },\r\n// { label: \"Fisch\", abbr: \"FI\" },\r\n// { label: \"Vegetarische Produkte\", abbr: \"VP\" },\r\n// { label: \"Sonstiges\", abbr: \"SO\" },\r\n// ];\r\n\r\n// const products_2 = [\r\n// \"BW\",\r\n// \"KO\",\r\n// \"RO\",\r\n// \"BR\",\r\n// \"VA\",\r\n// \"SP\",\r\n// \"HA\",\r\n// \"HG\",\r\n// \"AS\",\r\n// \"RF\",\r\n// \"GF\",\r\n// \"SK\",\r\n// \"LV\",\r\n// \"ZU\",\r\n// \"FI\",\r\n// \"VP\",\r\n// \"SO\",\r\n// ];\r\n\r\nclass EmptySlideCreation extends Component {\r\n // Allow format YYYY-XXZZZZZ-FF-TT-SSS-NN\r\n allowed_formats = [\r\n /^[0-9]{4}-[0-9]{7}-[0-9_]{2}-[A-Z]{2}-[A-Z0-9_]{3}-[0-9]{2}$/,\r\n ];\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n emptyFile_name: \"\",\r\n ref_regex: React.createRef(),\r\n valid_regex: false,\r\n };\r\n }\r\n\r\n /**\r\n * Checks the input against all valid inputs and updates the status accordingly.\r\n * @param {string} input The currently typed value in the entry field.\r\n */\r\n checkFormat = (input) => {\r\n this.setState({\r\n valid_regex: this.allowed_formats.some((format) => {\r\n return format.test(input);\r\n }),\r\n });\r\n this.setState({ emptyFile_name: input });\r\n };\r\n\r\n /**\r\n * The histo classificaation module needs to work without an actual file.\r\n * Here, the interface is provided to add the relevant information to do so.\r\n * It mimics the filename structure YYYY-XXZZZZZ-FF-TT-SSS-NN\r\n * @returns empty file creation interface for histo modules\r\n */\r\n render() {\r\n return (\r\n \r\n \r\n this.checkFormat(e.target.value)}\r\n type=\"text\"\r\n variant=\"standard\"\r\n value={this.state.emptyFile_name}\r\n // Enable adding files with \"Enter\" key.\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n\r\n if (this.state.valid_regex) {\r\n // Add file with empty attribute to it\r\n this.props.addFile(\r\n e,\r\n this.state.emptyFile_name.concat(\" (empty)\")\r\n );\r\n // Clear entry field for next entry\r\n this.setState({ emptyFile_name: \"\" });\r\n }\r\n }\r\n }}\r\n />\r\n \r\n \r\n {/* Add Button */}\r\n \r\n {\r\n // Add file with empty attribute to it\r\n this.props.addFile(\r\n event,\r\n this.state.emptyFile_name.concat(\" (empty)\")\r\n );\r\n // Clear entry field for next entry\r\n this.setState({ emptyFile_name: \"\" });\r\n }}\r\n >\r\n Add Empty Slide\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nEmptySlideCreation.propTypes = {\r\n addFile: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(EmptySlideCreation);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport MoreVertIcon from \"@mui/icons-material/MoreVert\";\r\nimport {\r\n DialogContent,\r\n TextField,\r\n IconButton,\r\n Grid,\r\n Checkbox,\r\n ListItem,\r\n ListItemButton,\r\n ListItemText,\r\n ListItemIcon,\r\n List,\r\n Tooltip,\r\n ListItemSecondaryAction,\r\n Menu,\r\n MenuItem,\r\n Box,\r\n} from \"@mui/material\";\r\nimport Backend from \"../../../common/utils/Backend\";\r\nimport EmptySlideCreation from \"./EmptySlideCreation\";\r\nimport {\r\n Folder,\r\n ArrowUpward,\r\n ArrowDownward,\r\n Image,\r\n CheckBox,\r\n AddToPhotos,\r\n} from \"@mui/icons-material\";\r\n\r\nconst styles = () => ({\r\n root: {},\r\n freeHistoParameters: {},\r\n applyButton: {\r\n width: \"100%\",\r\n },\r\n dialogContent: {\r\n paddingTop: 0,\r\n maxWidth: 900,\r\n height: 562,\r\n },\r\n fileList: {\r\n border: \"2px solid rgb(218, 218, 218)\",\r\n height: \"100%\",\r\n overflowY: \"auto\",\r\n minHeight: \"calc(100% - 35px)\",\r\n maxHeight: \"500px\",\r\n },\r\n});\r\n\r\n// The openslide reader cannot work with non-ascii symbols\r\nconst non_utf8_capable_filetypes = [\"mrxs\", \"svs\", \"ndpi\", \"svslide\"];\r\n\r\nclass StepFileSelection extends Component {\r\n constructor(props) {\r\n super(props);\r\n this._isMounted = false;\r\n this.state = {\r\n dirfiles: [],\r\n currentPath: \"\",\r\n lastFileName: \"\",\r\n filterText: \"\",\r\n sortMenuOpen: false,\r\n sortBy: \"name\",\r\n sortReverse: true,\r\n };\r\n\r\n this.updateFolderList(\"\");\r\n }\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n }\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n getLastDir = (folderPath) => {\r\n let pathEnding = \"-1\";\r\n let lastSeperator = folderPath.lastIndexOf(\"/\");\r\n if (lastSeperator < 0) {\r\n lastSeperator = folderPath.lastIndexOf(String.fromCharCode(92));\r\n }\r\n if (lastSeperator > 0) {\r\n pathEnding = folderPath.substr(lastSeperator + 1, folderPath.length);\r\n }\r\n return pathEnding;\r\n };\r\n\r\n onChangeFilter(e) {\r\n let filterText = e.target.value;\r\n let { currentPath } = this.state;\r\n this.setMountedState({ filterText });\r\n this.updateFolderList(currentPath, filterText);\r\n }\r\n\r\n getFilesFromPath = (currentPath, filterText, callback, addAll = false) => {\r\n let supportedFileFormats = [];\r\n\r\n switch (this.props.formData.projectType) {\r\n case \"ProteomeAnalysis\":\r\n supportedFileFormats = [\"txt\"];\r\n break;\r\n\r\n case \"ESREvaluation\":\r\n case \"ESRTraining\":\r\n supportedFileFormats = [\"csv\"];\r\n break;\r\n\r\n case \"AudioAnnotator\":\r\n supportedFileFormats = [\"mp3\", \"wav\"];\r\n break;\r\n\r\n default:\r\n supportedFileFormats = [\r\n \"avi\",\r\n \"bmp\",\r\n \"czi\",\r\n \"dm3\",\r\n \"gif\",\r\n \"hsasld\",\r\n \"jpeg\",\r\n \"jpg\",\r\n \"lif\",\r\n \"mp4\",\r\n \"mrxs\",\r\n \"ndpi\",\r\n \"png\",\r\n \"scn\",\r\n \"svs\",\r\n \"svslide\",\r\n \"tif\",\r\n \"tiff\",\r\n // The following formats are not supported on linux systems\r\n \"isyntax\",\r\n \"nd2\",\r\n \"zvi\",\r\n ];\r\n }\r\n Object.freeze(supportedFileFormats);\r\n\r\n // load list of available files\r\n Backend.walkDir(currentPath, true, (e) => {\r\n let filteredDirFiles = e.filter((entry) => {\r\n // filter out files with not supported file formats (e.g. .xlsx)\r\n let pathParts = entry.path.split(\".\");\r\n let extension = pathParts[pathParts.length - 1].toLowerCase();\r\n let filename = pathParts[pathParts.length - 2];\r\n let path = entry.path.split(\"/\")[entry.path.split(\"/\").length - 1];\r\n let foldersToExclude = [\"DAT\", \"SCS\", \"ANS\"];\r\n let lastDir = this.getLastDir(entry.path);\r\n let sameMrxsFile = e.find((element) => {\r\n return element.path === entry.path + \".mrxs\";\r\n });\r\n if (entry.type === \"file\") {\r\n if (supportedFileFormats.indexOf(extension) < 0) {\r\n return false;\r\n }\r\n // Filter out placeholder file\r\n if (filename === \"empty_file\") {\r\n return false;\r\n }\r\n }\r\n\r\n if (filterText !== \"\") {\r\n if (path.toLowerCase().includes(filterText.toLowerCase())) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n if (entry.type === \"directory\" && !addAll) {\r\n if (foldersToExclude.includes(lastDir)) return false;\r\n return typeof sameMrxsFile === \"undefined\";\r\n } else if (entry.type === \"directory\" && addAll) {\r\n if (foldersToExclude.includes(lastDir)) return false;\r\n this.getFilesFromPath(entry.path, filterText, callback, addAll);\r\n } else {\r\n return true;\r\n }\r\n }\r\n });\r\n\r\n let sortedDirFiles = filteredDirFiles.sort((a, b) => {\r\n if (a.path > b.path) {\r\n return 1;\r\n }\r\n if (a.path < b.path) {\r\n return -1;\r\n }\r\n return 0;\r\n });\r\n\r\n callback(sortedDirFiles);\r\n });\r\n };\r\n\r\n updateFolderList = (currentPath, filterText = \"\") => {\r\n this.getFilesFromPath(currentPath, filterText, (dirfiles) => {\r\n // write received info into state\r\n this.setMountedState({\r\n currentPath: currentPath,\r\n dirfiles: dirfiles,\r\n });\r\n });\r\n };\r\n\r\n addFile = (event, fileName) => {\r\n // Ensure that only ascii-conform paths are used.\r\n if (\r\n non_utf8_capable_filetypes.includes(\r\n fileName.split(\".\").pop().toLowerCase()\r\n )\r\n ) {\r\n let hasMoreThanAscii = [...fileName].some(\r\n (char) => char.charCodeAt(0) > 127\r\n );\r\n if (hasMoreThanAscii) {\r\n window.showErrorSnackbar(\r\n \"File type does not support characters such as 'ä', 'ö', 'ü', or 'ß' in path.\"\r\n );\r\n window.openWarningDialog(\r\n \"The file \" +\r\n fileName +\r\n \" or its path contain invalid characters such as 'ä', 'ö', 'ü', or 'ß'. \\\r\n Please rename the file or its folder.\"\r\n );\r\n return;\r\n }\r\n }\r\n\r\n let { files } = this.props.formData;\r\n let { lastFileName, dirfiles } = this.state;\r\n let dirFilePaths = dirfiles.map((file) => file.path);\r\n if (event.shiftKey && lastFileName !== \"\") {\r\n let lastFileIdx = dirFilePaths.indexOf(lastFileName);\r\n if (lastFileIdx >= 0) {\r\n let fileIdx = dirFilePaths.indexOf(fileName);\r\n let firstIdx = Math.min(lastFileIdx, fileIdx);\r\n let lastIdx = Math.max(lastFileIdx, fileIdx);\r\n files = files.filter((file) => !dirFilePaths.includes(file));\r\n for (let i = firstIdx; i <= lastIdx; i++) {\r\n let fileNameToAdd = dirFilePaths[i];\r\n files.push(fileNameToAdd);\r\n }\r\n this.props.onChangeFiles(files.sort());\r\n }\r\n } else {\r\n if (files.includes(fileName)) {\r\n files = files.filter((c) => c !== fileName);\r\n } else {\r\n files.push(fileName);\r\n }\r\n this.setMountedState({ lastFileName: fileName });\r\n this.props.onChangeFiles(files.sort());\r\n }\r\n };\r\n\r\n toggleAllFiles = (currentPath) => {\r\n let { dirfiles } = this.state;\r\n let { files } = this.props.formData;\r\n if (dirfiles.filter((file) => files.includes(file.path)).length > 0) {\r\n this.removeFolder(currentPath);\r\n } else {\r\n this.addFolder(currentPath);\r\n }\r\n };\r\n\r\n addFolder = (folderPath) => {\r\n this.getFilesFromPath(\r\n folderPath,\r\n \"\",\r\n (dirfiles) => {\r\n let filePaths = dirfiles.map((file) => file.path);\r\n let { files } = this.props.formData;\r\n let filteredFiles = filePaths.filter(\r\n (file) => !files.some((x) => file === x)\r\n );\r\n let filesToAdd = files.concat(filteredFiles);\r\n this.props.onChangeFiles(filesToAdd);\r\n },\r\n true\r\n );\r\n };\r\n\r\n removeFolder = () => {\r\n let { files } = this.props.formData;\r\n let dirFilePaths = this.state.dirfiles.map((file) => file.path);\r\n let resultFiles = files.filter((file) => dirFilePaths.indexOf(file) < 0);\r\n if (files.length !== resultFiles.length) {\r\n this.props.onChangeFiles(resultFiles.sort());\r\n }\r\n };\r\n\r\n isDisabled = (relativePath) => {\r\n let { project } = this.props;\r\n if (project && project.previewImageFiles) {\r\n const projectFiles = [\r\n ...new Set(project.previewImageFiles.map((file) => file.relativePath)),\r\n ];\r\n if (projectFiles.includes(relativePath)) return true;\r\n }\r\n return false;\r\n };\r\n\r\n toggleSortMenu = () => {\r\n this.setMountedState({ sortMenuOpen: !this.state.sortMenuOpen });\r\n };\r\n\r\n setSortBy = (value) => {\r\n let { sortBy, sortReverse } = this.state;\r\n\r\n if (value === sortBy) {\r\n sortReverse = !sortReverse;\r\n } else {\r\n sortReverse = false;\r\n }\r\n\r\n let dirfiles = [];\r\n if (value === \"name\") {\r\n dirfiles = this.state.dirfiles.sort((a, b) => {\r\n if (a.path > b.path) {\r\n return 1;\r\n }\r\n if (a.path < b.path) {\r\n return -1;\r\n }\r\n return 0;\r\n });\r\n } else {\r\n dirfiles = this.state.dirfiles.sort((a, b) => {\r\n if (a.creationTime > b.creationTime) {\r\n return 1;\r\n }\r\n if (a.creationTime < b.creationTime) {\r\n return -1;\r\n }\r\n return 0;\r\n });\r\n }\r\n if (!sortReverse) {\r\n dirfiles = dirfiles.reverse();\r\n }\r\n\r\n this.setMountedState({\r\n dirfiles: dirfiles,\r\n sortMenuOpen: false,\r\n sortBy: value,\r\n sortReverse: sortReverse,\r\n });\r\n };\r\n\r\n /**\r\n * Sets an image to the default error image when there is an error.\r\n * @param {field} e The field event\r\n */\r\n image_error = (e) => {\r\n e.target.src = \"/img/image_error.svg\";\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { files } = this.props.formData;\r\n const {\r\n dirfiles,\r\n currentPath,\r\n filterText,\r\n sortMenuOpen,\r\n sortBy,\r\n sortReverse,\r\n } = this.state;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
    \r\n \r\n Your Microscope Image Files:\r\n \r\n \r\n {\r\n this.anchorEl = node;\r\n }}\r\n aria-controls=\"sort-menu\"\r\n aria-haspopup=\"true\"\r\n onClick={() => this.toggleSortMenu()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n this.toggleSortMenu()}\r\n >\r\n this.setSortBy(\"name\")}>\r\n Sort by name{\" \"}\r\n {sortBy === \"name\" && (\r\n \r\n {sortReverse ? : }\r\n \r\n )}\r\n \r\n this.setSortBy(\"date\")}>\r\n Sort by creation date{\" \"}\r\n {sortBy === \"date\" && (\r\n \r\n {sortReverse ? : }\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n
    \r\n\r\n
    \r\n \r\n this.onChangeFilter(e)}\r\n />\r\n
    \r\n \r\n {currentPath && (\r\n \r\n \r\n files.includes(file.path))\r\n .length > 0\r\n }\r\n onChange={() => this.toggleAllFiles(currentPath)}\r\n />\r\n \r\n \r\n \r\n {\r\n this.updateFolderList(\r\n currentPath.substring(\r\n 0,\r\n currentPath.lastIndexOf(\"/\")\r\n )\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {dirfiles.map((e, id) =>\r\n e.type === \"file\" ? (\r\n this.addFile(clickEvent, e.path)}\r\n >\r\n \r\n \r\n
    \r\n {\r\n \r\n }\r\n \r\n {e.path}\r\n
    \r\n \r\n \r\n }\r\n >\r\n {files.includes(e.path) ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n
    \r\n \r\n
    \r\n File Size:{\" \"}\r\n
    \r\n {e.fileSize}\r\n
    \r\n
    \r\n Creation Date:{\" \"}\r\n
    \r\n {e.creationTime}\r\n \r\n }\r\n >\r\n \r\n \r\n \r\n ) : (\r\n this.updateFolderList(e.path)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n this.addFolder(e.path)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n )\r\n )}\r\n
    \r\n
    \r\n \r\n \r\n {this.props.selectionTarget} Files:\r\n \r\n \r\n {files.map((e, i) => (\r\n \r\n this.addFile(clickEvent, e)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n
    \r\n {/* Allow slide-free projects in Hist Classification Module. */}\r\n {/* Meta-Data will need to be entered manually. */}\r\n {this.props.formData.projectType === \"HistoClassification\" && (\r\n \r\n )}\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nStepFileSelection.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n selectionTarget: PropTypes.string.isRequired,\r\n project: PropTypes.object,\r\n formData: PropTypes.object,\r\n onChangeFiles: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(StepFileSelection);\r\n","import React, { useState, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { ValidatorForm } from \"react-material-ui-form-validator\";\r\nimport { Button, Dialog, DialogTitle, MobileStepper } from \"@mui/material\";\r\nimport { KeyboardArrowLeft, KeyboardArrowRight } from \"@mui/icons-material\";\r\n\r\nimport StepCaseForm from \"./CreateCaseDialogComponents/StepCaseForm\";\r\nimport StepFileSelection from \"./CreateProjectdialogComponents/StepFileSelection\";\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nconst nextStepState = Object.freeze({\r\n NEXT: \"Next\",\r\n CREATE: \"Create\",\r\n EDIT: \"Edit\",\r\n});\r\n\r\nconst activeStepState = Object.freeze({\r\n FORM: 0,\r\n FILE_SELECTION: 1,\r\n});\r\n\r\nconst CreateCaseDialog = (props) => {\r\n const { open, setOpen, editCase } = props;\r\n const [updateTrigger, setUpdateTrigger] = useState(false);\r\n const [activeStep, setActiveStep] = useState(activeStepState.FORM);\r\n const [formData, setFormData] = useState({ files: [] });\r\n const [caseColumns, setCaseColumns] = useState([]);\r\n const [nextButtonState, setNextButtonState] = useState(nextStepState.NEXT);\r\n\r\n useEffect(() => {\r\n window.addEventListener(\"keydown\", handleKeyPress);\r\n return () => window.removeEventListener(\"keydown\", handleKeyPress);\r\n }, []);\r\n\r\n // handle open dialog and set edit case if edit mode\r\n useEffect(() => {\r\n if (open) {\r\n setActiveStep(activeStepState.FORM);\r\n setFormData({ files: [] });\r\n }\r\n if (editCase === null) {\r\n return;\r\n }\r\n setCaseColumns((prevCaseColumns) => {\r\n let newColumns = prevCaseColumns.map((column) => {\r\n let newColumn = { ...column };\r\n if (editCase[column.name]) {\r\n newColumn.value = editCase[column.name];\r\n }\r\n return newColumn;\r\n });\r\n return newColumns;\r\n });\r\n if (editCase.Files.length > 0) {\r\n setFormData((prevFormData) => {\r\n return { ...prevFormData, files: editCase.Files };\r\n });\r\n }\r\n }, [open]);\r\n\r\n useEffect(() => {\r\n if (activeStep === activeStepState.FORM) {\r\n setNextButtonState(nextStepState.NEXT);\r\n } else if (activeStep === activeStepState.FILE_SELECTION) {\r\n if (editCase) {\r\n setNextButtonState(nextStepState.EDIT);\r\n } else {\r\n setNextButtonState(nextStepState.CREATE);\r\n }\r\n }\r\n }, [activeStep]);\r\n\r\n const handleKeyPress = ({ key }) => {\r\n if (!open) return;\r\n if (key === \"Enter\") handleNext();\r\n };\r\n\r\n const handleSave = () => {\r\n const data = {\r\n files: formData.files,\r\n caseColumns: caseColumns.filter((column) => column.id !== \"FileNum\"),\r\n };\r\n if (editCase) {\r\n Backend.editCase(editCase.Id, data).then((response) => {\r\n if (response.ok) {\r\n window.showSuccessSnackbar(\"Case Created\");\r\n props.updateCases();\r\n }\r\n });\r\n } else {\r\n Backend.createCase(data).then(() => {\r\n window.showSuccessSnackbar(\"Case Created\");\r\n props.updateCases();\r\n });\r\n }\r\n };\r\n\r\n const handleNext = () => {\r\n if (activeStep === activeStepState.FILE_SELECTION) {\r\n handleSave();\r\n setOpen(false);\r\n return;\r\n }\r\n setUpdateTrigger((prevUpdateTrigger) => !prevUpdateTrigger);\r\n setActiveStep((prevActiveStep) => prevActiveStep + 1);\r\n };\r\n\r\n const handleBack = () => setActiveStep(activeStep - 1);\r\n\r\n const onChangeFiles = (e) => setFormData({ ...formData, files: e });\r\n\r\n return (\r\n <>\r\n setOpen(false)} open={open} maxWidth=\"lg\">\r\n Create New Case\r\n \r\n {activeStep === activeStepState.FORM && (\r\n \r\n )}\r\n {activeStep === activeStepState.FILE_SELECTION && (\r\n \r\n )}\r\n \r\n {nextButtonState}\r\n \r\n \r\n }\r\n backButton={\r\n \r\n \r\n {\"Back\"}\r\n \r\n }\r\n />\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nCreateCaseDialog.propTypes = {\r\n open: PropTypes.bool,\r\n setOpen: PropTypes.func,\r\n editCase: PropTypes.object,\r\n updateCases: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default CreateCaseDialog;\r\n","import React, { useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n Paper,\r\n TableSortLabel,\r\n Checkbox,\r\n Menu,\r\n MenuItem,\r\n IconButton,\r\n ListItemIcon,\r\n ListItemText,\r\n} from \"@mui/material\";\r\n\r\nimport { makeStyles } from \"@mui/styles\";\r\nimport MoreVertIcon from \"@mui/icons-material/MoreVert\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport EditIcon from \"@mui/icons-material/Edit\";\r\nimport { isColorLight } from \"../../common/utils/Utils\";\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\nconst useStyles = makeStyles({\r\n root: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n overflow: \"auto\",\r\n },\r\n caseStateContainer: {\r\n borderRadius: 5,\r\n padding: 5,\r\n width: \"100%\",\r\n textAlign: \"center\",\r\n border: \"1px solid rgba(0, 0, 0, 0.54)\",\r\n color: \"white\",\r\n },\r\n tagBox: {\r\n // <--- in case tags will be added in the future\r\n display: \"inline-block\",\r\n width: 20,\r\n height: 20,\r\n borderRadius: 5,\r\n color: \"#fff\",\r\n border: \"1px solid rgba(0, 0, 0, 0.54)\",\r\n margin: 2,\r\n },\r\n row: {\r\n cursor: \"pointer\",\r\n },\r\n});\r\n\r\nconst DynamicCaseTable = (props) => {\r\n const classes = useStyles();\r\n const { cases, onDeleteRow, columns, history } = props;\r\n\r\n const [order, setOrder] = useState(\"asc\");\r\n const [orderBy, setOrderBy] = useState(columns[0].CreationDateTime);\r\n const [columnVisibility, setColumnVisibility] = useState(\r\n columns.reduce(\r\n (acc, column) => ({ ...acc, [column.id]: column.visible }),\r\n {}\r\n )\r\n );\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n\r\n const handleRequestSort = (property) => {\r\n const isAsc = orderBy === property && order === \"asc\";\r\n setOrder(isAsc ? \"desc\" : \"asc\");\r\n setOrderBy(property);\r\n };\r\n\r\n const handleColumnVisibility = (columnId) => {\r\n setColumnVisibility((prevColumnVisibility) => ({\r\n ...prevColumnVisibility,\r\n [columnId]: !prevColumnVisibility[columnId],\r\n }));\r\n };\r\n\r\n const handleClick = (event) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const stableSort = (array, order, orderBy) => {\r\n const sortedArray = array.sort((a, b) => {\r\n const orderByA =\r\n typeof a[orderBy] === \"object\" ? a[orderBy].length : a[orderBy];\r\n const orderByB =\r\n typeof b[orderBy] === \"object\" ? b[orderBy].length : b[orderBy];\r\n if (order === \"asc\") {\r\n return orderByA < orderByB ? -1 : 1;\r\n } else {\r\n return orderByA < orderByB ? 1 : -1;\r\n }\r\n });\r\n return sortedArray;\r\n };\r\n\r\n const handleRowClick = (row) => {\r\n history.push(\"/file_view/\" + row.Id);\r\n };\r\n return (\r\n \r\n \r\n \r\n \r\n {columns.map(\r\n (column) =>\r\n columnVisibility[column.id] && (\r\n \r\n handleRequestSort(column.id)}\r\n >\r\n {column.label}\r\n \r\n \r\n )\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n {columns.map((column) => (\r\n handleColumnVisibility(column.id)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n {stableSort(cases, order, orderBy).map((row, idx) => {\r\n return (\r\n handleRowClick(row)}\r\n >\r\n {columns.map((column) => {\r\n const cellIsVisible = columnVisibility[column.id];\r\n if (!cellIsVisible) return null;\r\n let value = row[column.id];\r\n if (column.items.length > 0) {\r\n const item = column.items.find(\r\n (item) => item.label === value\r\n );\r\n if (\r\n item &&\r\n item.color !== \"#ffffff\" &&\r\n item.color !== \"#fff\"\r\n ) {\r\n value = (\r\n \r\n {row[column.id]}\r\n \r\n );\r\n }\r\n }\r\n if (value === null) value = \"\";\r\n return (\r\n \r\n {typeof value === \"object\" && value.type !== \"div\"\r\n ? value.length\r\n : value}\r\n \r\n );\r\n })}\r\n \r\n props.onEditRow(e, row)}>\r\n \r\n \r\n onDeleteRow(row)}>\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nDynamicCaseTable.propTypes = {\r\n cases: PropTypes.array.isRequired,\r\n columns: PropTypes.array.isRequired,\r\n onDeleteRow: PropTypes.func.isRequired,\r\n onEditRow: PropTypes.func.isRequired,\r\n history: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(DynamicCaseTable);\r\n","import React, { useEffect, useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Paper, Fab } from \"@mui/material\";\r\nimport CreateCaseDialog from \"../../home/dialogs/CreateCaseDialog\";\r\nimport DynamicCaseTable from \"./DynamicCaseTable\";\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport { makeStyles } from \"@mui/styles\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n overflow: \"hidden\",\r\n },\r\n fab: {\r\n position: \"absolute\",\r\n bottom: theme.spacing(2),\r\n right: theme.spacing(2),\r\n },\r\n}));\r\n\r\nconst CasesTable = (props) => {\r\n const { caseColumnsData, cases, onDeleteRow, updateCases } = props;\r\n const classes = useStyles();\r\n const [editCase, setEditCase] = useState(null);\r\n const [isCreateCaseDialogOpen, setIsCreateCaseDialogOpen] = useState(false);\r\n\r\n const onEditRow = (e, row) => {\r\n e.stopPropagation();\r\n setEditCase(row);\r\n };\r\n\r\n useEffect(() => {\r\n if (!isCreateCaseDialogOpen) {\r\n setEditCase(null);\r\n }\r\n }, [isCreateCaseDialogOpen]);\r\n\r\n useEffect(() => {\r\n if (editCase) {\r\n setIsCreateCaseDialogOpen(true);\r\n }\r\n }, [editCase]);\r\n\r\n const handleCaseDialogOpen = () => setIsCreateCaseDialogOpen(true);\r\n\r\n return (\r\n \r\n {caseColumnsData.length > 0 && (\r\n \r\n )}\r\n setIsCreateCaseDialogOpen(value)}\r\n updateCases={updateCases}\r\n />\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nCasesTable.propTypes = {\r\n caseColumnsData: PropTypes.array.isRequired,\r\n cases: PropTypes.array.isRequired,\r\n onDeleteRow: PropTypes.func.isRequired,\r\n updateCases: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default CasesTable;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Paper } from \"@mui/material\";\r\nimport CasesTable from \"./components/CasesTable\";\r\nimport Backend from \"../common/utils/Backend\";\r\nimport { makeStyles } from \"@mui/styles\";\r\n\r\nconst useStyles = makeStyles({\r\n root: {\r\n background: \"#EEEEEE\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n padding: 5,\r\n },\r\n casesContainer: {\r\n height: \"100%\",\r\n },\r\n paper: {\r\n padding: 0,\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n overflow: \"auto\",\r\n height: \"100%\",\r\n },\r\n});\r\n\r\n// orders case columns lilke appsettingsCols, if col exist, otherwise at the end\r\nconst orderCaseCols = (appsettingsCols, allCaseCalls) => {\r\n return allCaseCalls.sort((a, b) => {\r\n const aIdx = appsettingsCols.findIndex((col) => col.name === a.id);\r\n const bIdx = appsettingsCols.findIndex((col) => col.name === b.id);\r\n if (aIdx === -1 && bIdx === -1) {\r\n return 0;\r\n } else if (aIdx === -1) {\r\n return 1;\r\n } else if (bIdx === -1) {\r\n return -1;\r\n } else {\r\n return aIdx - bIdx;\r\n }\r\n });\r\n};\r\n\r\nconst CasesPage = () => {\r\n const classes = useStyles();\r\n const [cases, setCases] = useState([]);\r\n const [caseColumnsData, setCaseColumnsData] = useState([]);\r\n\r\n useEffect(() => {\r\n updateCases();\r\n }, []);\r\n\r\n const updateCases = () => {\r\n Promise.all([\r\n Backend.listCases(),\r\n Backend.readAppSettings()?.then((newAppsettings) => {\r\n return newAppsettings;\r\n }),\r\n ]).then(([casesResponse, appsettingsResponse]) => {\r\n const cases = casesResponse?.cases.map((item) => {\r\n const singleCase = item.data;\r\n singleCase.Files = item.filePaths;\r\n return singleCase;\r\n });\r\n const initCaseCols = appsettingsResponse?.caseColumns;\r\n\r\n setCases(cases);\r\n let caseColumnsData = [];\r\n if (cases.length > 0) {\r\n caseColumnsData = Object.keys(cases[0])\r\n .filter((key) => key !== \"Id\")\r\n .map((key) => ({ id: key, label: key, visible: false }));\r\n }\r\n\r\n const newCaseCols = caseColumnsData.map((caseColumn) => {\r\n const matchingCaseCol = initCaseCols?.find(\r\n (initCaseCol) => initCaseCol.name === caseColumn.id\r\n );\r\n if (matchingCaseCol && matchingCaseCol.id === \"Files\") {\r\n matchingCaseCol.visible = true;\r\n }\r\n return {\r\n id: caseColumn.id,\r\n label: matchingCaseCol?.label ?? caseColumn.label,\r\n visible: matchingCaseCol?.visible === \"true\" ?? false,\r\n items: matchingCaseCol?.items ?? [],\r\n };\r\n });\r\n\r\n // Make sure Files is always visible at the beginning\r\n newCaseCols.find((initCaseCol) => {\r\n if (initCaseCol.id === \"Files\") {\r\n initCaseCol.visible = true;\r\n }\r\n });\r\n\r\n const orderedNewCaseCols = orderCaseCols(initCaseCols, newCaseCols);\r\n setCaseColumnsData(orderedNewCaseCols);\r\n });\r\n };\r\n\r\n const onDeleteRow = (row) => {\r\n window.openResponseDialog(\"Delete Case forever?\", (response) => {\r\n if (response) {\r\n Backend.deleteCase(row.Id).then((response) => {\r\n if (response?.success) {\r\n window.showSuccessSnackbar(\"Case deleted\");\r\n } else {\r\n window.showErrorSnackbar(\"Case could not be deleted\");\r\n }\r\n updateCases();\r\n });\r\n }\r\n });\r\n };\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n
    \r\n );\r\n};\r\n\r\nexport default CasesPage;\r\n","import React, { Component } from \"react\";\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogContentText from \"@mui/material/DialogContentText\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nclass CustomDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n open: false,\r\n title: \"\",\r\n content: \"\",\r\n dialogState: \"confirm\",\r\n responseFunction: null,\r\n };\r\n\r\n window.openResponseDialog = this.handleConfirmOpen;\r\n window.openErrorDialog = this.handleErrorOpen;\r\n window.openWarningDialog = this.handleWarningOpen;\r\n window.openConfirmationDialog = this.awaitUserConfirmation;\r\n }\r\n\r\n handleConfirmOpen = (title, responseFunction) => {\r\n this.setState({\r\n title: title,\r\n content: \"\",\r\n open: true,\r\n dialogState: \"confirm\",\r\n responseFunction: responseFunction,\r\n });\r\n };\r\n\r\n /**\r\n * Promt the user for a yes/no decision that will pause program execution until the choise is made.\r\n * @param {string} title The short title of the user-prompt to show.\r\n * @param {string} content Longer content in the body of the propmt.\r\n * @returns {Promise} A promise that returns the user choise as boolean.\r\n */\r\n awaitUserConfirmation = async (title, content) => {\r\n return new Promise((resolve) => {\r\n this.setState({\r\n title: title,\r\n content: content ? content : \"\",\r\n open: true,\r\n dialogState: \"confirm\",\r\n responseFunction: (confirmed) => resolve(confirmed),\r\n });\r\n });\r\n };\r\n\r\n handleErrorOpen = (content) => {\r\n this.setState({\r\n title: \"Error\",\r\n content: content,\r\n dialogState: \"error\",\r\n open: true,\r\n });\r\n };\r\n\r\n handleWarningOpen = (title) => {\r\n this.setState({\r\n title: title,\r\n content: \"\",\r\n dialogState: \"warning\",\r\n open: true,\r\n });\r\n };\r\n\r\n handleClose = (confirmed) => {\r\n this.setState(\r\n {\r\n open: false,\r\n },\r\n this.setState({ title: \"\", content: \"\", responseFunction: null })\r\n );\r\n if (this.state.dialogState === \"confirm\" && this.state.responseFunction) {\r\n this.state.responseFunction(confirmed);\r\n }\r\n };\r\n\r\n downloadError = () => {\r\n let filename = \"hsa_error_log.txt\";\r\n let text = this.state.content;\r\n let element = document.createElement(\"a\");\r\n element.setAttribute(\r\n \"href\",\r\n \"data:text/plain;charset=utf-8,\" + encodeURIComponent(text)\r\n );\r\n element.setAttribute(\"download\", filename);\r\n\r\n element.style.display = \"none\";\r\n document.body.appendChild(element);\r\n\r\n element.click();\r\n\r\n document.body.removeChild(element);\r\n };\r\n\r\n render() {\r\n const { dialogState, open, title, content } = this.state;\r\n return (\r\n open && (\r\n this.handleClose(false)}\r\n aria-labelledby=\"responsive-dialog-title\"\r\n >\r\n {typeof title === \"object\" && title.length > 1 ? (\r\n \r\n {title.map((row, idx) => {\r\n return
    {row}
    ;\r\n })}\r\n
    \r\n ) : (\r\n {title}\r\n )}\r\n\r\n \r\n {(dialogState === \"confirm\" || dialogState === \"error\") && (\r\n \r\n {dialogState === \"confirm\" && content !== \"\" && (\r\n {content}\r\n )}\r\n {dialogState === \"error\" && (\r\n
    \r\n \r\n
    \r\n )}\r\n
    \r\n )}\r\n
    \r\n\r\n {/* Buttons */}\r\n \r\n {dialogState === \"confirm\" && (\r\n this.handleClose(false)}\r\n color=\"primary\"\r\n >\r\n Cancel\r\n \r\n )}\r\n {dialogState === \"error\" && (\r\n \r\n )}\r\n this.handleClose(true)}\r\n color=\"primary\"\r\n autoFocus\r\n >\r\n OK\r\n \r\n \r\n \r\n )\r\n );\r\n }\r\n}\r\n\r\nexport default CustomDialog;\r\n","// Adds ctx.getTransform() - returns an SVGMatrix\r\n// Adds ctx.transformedPoint(x,y) - returns an SVGPoint\r\nexport function trackTransforms(ctx) {\r\n var svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n var xform = svg.createSVGMatrix();\r\n ctx.getTransform = function () {\r\n return xform;\r\n };\r\n\r\n var savedTransforms = [];\r\n var save = ctx.save;\r\n ctx.save = function () {\r\n savedTransforms.push(xform.translate(0, 0));\r\n return save.call(ctx);\r\n };\r\n\r\n var restore = ctx.restore;\r\n ctx.restore = function () {\r\n xform = savedTransforms.pop();\r\n return restore.call(ctx);\r\n };\r\n\r\n var scale = ctx.scale;\r\n ctx.scale = function (sx, sy) {\r\n xform = xform.scaleNonUniform(sx, sy);\r\n return scale.call(ctx, sx, sy);\r\n };\r\n\r\n var rotate = ctx.rotate;\r\n ctx.rotate = function (radians) {\r\n xform = xform.rotate((radians * 180) / Math.PI);\r\n return rotate.call(ctx, radians);\r\n };\r\n\r\n var translate = ctx.translate;\r\n ctx.translate = function (dx, dy) {\r\n xform = xform.translate(dx, dy);\r\n return translate.call(ctx, dx, dy);\r\n };\r\n\r\n var transform = ctx.transform;\r\n ctx.transform = function (a, b, c, d, e, f) {\r\n var m2 = svg.createSVGMatrix();\r\n m2.a = a;\r\n m2.b = b;\r\n m2.c = c;\r\n m2.d = d;\r\n m2.e = e;\r\n m2.f = f;\r\n xform = xform.multiply(m2);\r\n return transform.call(ctx, a, b, c, d, e, f);\r\n };\r\n\r\n var setTransform = ctx.setTransform;\r\n ctx.setTransform = function (a, b, c, d, e, f) {\r\n xform.a = a;\r\n xform.b = b;\r\n xform.c = c;\r\n xform.d = d;\r\n xform.e = e;\r\n xform.f = f;\r\n return setTransform.call(ctx, a, b, c, d, e, f);\r\n };\r\n\r\n var pt = svg.createSVGPoint();\r\n ctx.transformedPoint = function (x, y) {\r\n pt.x = x;\r\n pt.y = y;\r\n try {\r\n return pt.matrixTransform(xform.inverse());\r\n } catch (e) {\r\n return pt;\r\n }\r\n };\r\n\r\n pt = svg.createSVGPoint();\r\n ctx.backTransformedPoint = function (x, y) {\r\n pt.x = x;\r\n pt.y = y;\r\n return pt.matrixTransform(xform);\r\n };\r\n}\r\n\r\n// calculate the log to a specific base\r\nexport function getBaseLog(x, y) {\r\n return Math.log(y) / Math.log(x);\r\n}\r\n","import Backend from \"../../common/utils/Backend\";\r\nimport { inv, multiply, transpose } from \"mathjs\";\r\n\r\nexport function configureImage(img, channel) {\r\n if (!img || img.width === 0) {\r\n return null;\r\n }\r\n\r\n let offScrCan = document.createElement(\"canvas\");\r\n offScrCan.width = img.width;\r\n offScrCan.height = img.height;\r\n\r\n let ctx1 = offScrCan.getContext(\"2d\");\r\n\r\n ctx1.drawImage(img, 0, 0, img.width, img.height);\r\n\r\n // do histogram manipulation\r\n if (img.width === 0) return null;\r\n let imgData = ctx1.getImageData(0, 0, img.width, img.height);\r\n let step = 4; // rgba\r\n let min = channel.min;\r\n let max = channel.max;\r\n let gamma = channel.gamma;\r\n\r\n for (let i = 0; i < imgData.data.length; i += step) {\r\n // alter r,g and b\r\n for (let j = 0; j < 3; j++) {\r\n let val = imgData.data[i + j];\r\n val = (Math.min(Math.max(val - min, 0), max) * 255) / (max - min);\r\n imgData.data[i + j] = 255 * (val / 255) ** (1 / gamma);\r\n }\r\n }\r\n ctx1.putImageData(imgData, 0, 0);\r\n return offScrCan;\r\n}\r\n\r\nvar __assign =\r\n (this && this.__assign) ||\r\n function () {\r\n __assign =\r\n Object.assign ||\r\n function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s)\r\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n };\r\n//function is necessary for procrustes calculation\r\nfunction SVD(a, options) {\r\n let _a = __assign({ u: true, v: true, eps: Math.pow(2, -52) }, options),\r\n withu = _a.u,\r\n withv = _a.v,\r\n eps = _a.eps;\r\n var tol = 1e-64 / eps;\r\n // throw error if a is not defined\r\n if (!a) {\r\n throw new TypeError(\"Matrix a is not defined\");\r\n }\r\n // Householder's reduction to bidiagonal form\r\n var n = a[0].length;\r\n var m = a.length;\r\n if (m < n) {\r\n throw new TypeError(\"Invalid matrix: m < n\");\r\n }\r\n var l1, c, f, h, s, y, z;\r\n var l = 0,\r\n g = 0,\r\n x = 0;\r\n var e = [];\r\n var u = [];\r\n var v = [];\r\n // Initialize u\r\n for (let i = 0; i < m; i++) {\r\n u[i] = new Array(n).fill(0);\r\n }\r\n // Initialize v\r\n for (let i = 0; i < n; i++) {\r\n v[i] = new Array(n).fill(0);\r\n }\r\n // Initialize q\r\n var q = new Array(n).fill(0);\r\n // Copy array a in u\r\n for (let i = 0; i < m; i++) {\r\n for (let j = 0; j < n; j++) {\r\n u[i][j] = a[i][j];\r\n }\r\n }\r\n for (let i = 0; i < n; i++) {\r\n e[i] = g;\r\n s = 0;\r\n l = i + 1;\r\n for (let j = i; j < m; j++) {\r\n s += Math.pow(u[j][i], 2);\r\n }\r\n if (s < tol) {\r\n g = 0;\r\n } else {\r\n f = u[i][i];\r\n g = f < 0 ? Math.sqrt(s) : -Math.sqrt(s);\r\n h = f * g - s;\r\n u[i][i] = f - g;\r\n for (let j = l; j < n; j++) {\r\n s = 0;\r\n for (let k = i; k < m; k++) {\r\n s += u[k][i] * u[k][j];\r\n }\r\n f = s / h;\r\n for (let k = i; k < m; k++) {\r\n u[k][j] = u[k][j] + f * u[k][i];\r\n }\r\n }\r\n }\r\n q[i] = g;\r\n s = 0;\r\n for (let j = l; j < n; j++) {\r\n s += Math.pow(u[i][j], 2);\r\n }\r\n if (s < tol) {\r\n g = 0;\r\n } else {\r\n f = u[i][i + 1];\r\n g = f < 0 ? Math.sqrt(s) : -Math.sqrt(s);\r\n h = f * g - s;\r\n u[i][i + 1] = f - g;\r\n for (let j = l; j < n; j++) {\r\n e[j] = u[i][j] / h;\r\n }\r\n for (let j = l; j < m; j++) {\r\n s = 0;\r\n for (let k = l; k < n; k++) {\r\n s += u[j][k] * u[i][k];\r\n }\r\n for (let k = l; k < n; k++) {\r\n u[j][k] = u[j][k] + s * e[k];\r\n }\r\n }\r\n }\r\n y = Math.abs(q[i]) + Math.abs(e[i]);\r\n if (y > x) {\r\n x = y;\r\n }\r\n }\r\n // Accumulation of right-hand transformations\r\n if (withv) {\r\n for (let i = n - 1; i >= 0; i--) {\r\n if (g !== 0) {\r\n h = u[i][i + 1] * g;\r\n for (let j = l; j < n; j++) {\r\n v[j][i] = u[i][j] / h;\r\n }\r\n for (let j = l; j < n; j++) {\r\n s = 0;\r\n for (let k = l; k < n; k++) {\r\n s += u[i][k] * v[k][j];\r\n }\r\n for (let k = l; k < n; k++) {\r\n v[k][j] = v[k][j] + s * v[k][i];\r\n }\r\n }\r\n }\r\n for (let j = l; j < n; j++) {\r\n v[i][j] = 0;\r\n v[j][i] = 0;\r\n }\r\n v[i][i] = 1;\r\n g = e[i];\r\n l = i;\r\n }\r\n }\r\n // Accumulation of left-hand transformations\r\n if (withu) {\r\n for (let i = n - 1; i >= 0; i--) {\r\n l = i + 1;\r\n g = q[i];\r\n for (let j = l; j < n; j++) {\r\n u[i][j] = 0;\r\n }\r\n if (g !== 0) {\r\n h = u[i][i] * g;\r\n for (let j = l; j < n; j++) {\r\n s = 0;\r\n for (let k = l; k < m; k++) {\r\n s += u[k][i] * u[k][j];\r\n }\r\n f = s / h;\r\n for (let k = i; k < m; k++) {\r\n u[k][j] = u[k][j] + f * u[k][i];\r\n }\r\n }\r\n for (let j = i; j < m; j++) {\r\n u[j][i] = u[j][i] / g;\r\n }\r\n } else {\r\n for (let j = i; j < m; j++) {\r\n u[j][i] = 0;\r\n }\r\n }\r\n u[i][i] = u[i][i] + 1;\r\n }\r\n }\r\n // Diagonalization of the bidiagonal form\r\n eps = eps * x;\r\n var testConvergence;\r\n for (let k = n - 1; k >= 0; k--) {\r\n for (let iteration = 0; iteration < 50; iteration++) {\r\n // test-f-splitting\r\n testConvergence = false;\r\n for (l = k; l >= 0; l--) {\r\n if (Math.abs(e[l]) <= eps) {\r\n testConvergence = true;\r\n break;\r\n }\r\n if (Math.abs(q[l - 1]) <= eps) {\r\n break;\r\n }\r\n }\r\n if (!testConvergence) {\r\n // cancellation of e[l] if l>0\r\n c = 0;\r\n s = 1;\r\n l1 = l - 1;\r\n for (let i = l; i < k + 1; i++) {\r\n f = s * e[i];\r\n e[i] = c * e[i];\r\n if (Math.abs(f) <= eps) {\r\n break; // goto test-f-convergence\r\n }\r\n g = q[i];\r\n q[i] = Math.sqrt(f * f + g * g);\r\n h = q[i];\r\n c = g / h;\r\n s = -f / h;\r\n if (withu) {\r\n for (let j = 0; j < m; j++) {\r\n y = u[j][l1];\r\n z = u[j][i];\r\n u[j][l1] = y * c + z * s;\r\n u[j][i] = -y * s + z * c;\r\n }\r\n }\r\n }\r\n }\r\n // test f convergence\r\n z = q[k];\r\n if (l === k) {\r\n // convergence\r\n if (z < 0) {\r\n // q[k] is made non-negative\r\n q[k] = -z;\r\n if (withv) {\r\n for (var j = 0; j < n; j++) {\r\n v[j][k] = -v[j][k];\r\n }\r\n }\r\n }\r\n break; // break out of iteration loop and move on to next k value\r\n }\r\n // Shift from bottom 2x2 minor\r\n x = q[l];\r\n y = q[k - 1];\r\n g = e[k - 1];\r\n h = e[k];\r\n f = ((y - z) * (y + z) + (g - h) * (g + h)) / (2 * h * y);\r\n g = Math.sqrt(f * f + 1);\r\n f = ((x - z) * (x + z) + h * (y / (f < 0 ? f - g : f + g) - h)) / x;\r\n // Next QR transformation\r\n c = 1;\r\n s = 1;\r\n for (let i = l + 1; i < k + 1; i++) {\r\n g = e[i];\r\n y = q[i];\r\n h = s * g;\r\n g = c * g;\r\n z = Math.sqrt(f * f + h * h);\r\n e[i - 1] = z;\r\n c = f / z;\r\n s = h / z;\r\n f = x * c + g * s;\r\n g = -x * s + g * c;\r\n h = y * s;\r\n y = y * c;\r\n if (withv) {\r\n for (let j = 0; j < n; j++) {\r\n x = v[j][i - 1];\r\n z = v[j][i];\r\n v[j][i - 1] = x * c + z * s;\r\n v[j][i] = -x * s + z * c;\r\n }\r\n }\r\n z = Math.sqrt(f * f + h * h);\r\n q[i - 1] = z;\r\n c = f / z;\r\n s = h / z;\r\n f = c * g + s * y;\r\n x = -s * g + c * y;\r\n if (withu) {\r\n for (let j = 0; j < m; j++) {\r\n y = u[j][i - 1];\r\n z = u[j][i];\r\n u[j][i - 1] = y * c + z * s;\r\n u[j][i] = -y * s + z * c;\r\n }\r\n }\r\n }\r\n e[l] = 0;\r\n e[k] = f;\r\n q[k] = x;\r\n }\r\n }\r\n // Number below eps should be zero\r\n for (let i = 0; i < n; i++) {\r\n if (q[i] < eps) q[i] = 0;\r\n }\r\n return { u: u, q: q, v: v };\r\n}\r\n\r\nfunction calculateAffineTransformation(opointBase, opointShift, bfact, tfact) {\r\n //copy arrays\r\n let pointBase = JSON.parse(JSON.stringify(opointBase));\r\n let pointShift = JSON.parse(JSON.stringify(opointShift));\r\n\r\n for (let i = 0; i < pointBase.length; i++) {\r\n pointShift[i][0] = pointShift[i][0] * tfact;\r\n pointShift[i][1] = pointShift[i][1] * tfact;\r\n pointBase[i][0] = pointBase[i][0] * bfact;\r\n pointBase[i][1] = pointBase[i][1] * bfact;\r\n }\r\n\r\n //procrustes Calculation\r\n let n = pointBase.length;\r\n let ny = pointShift.length;\r\n\r\n let muXSumX = 0;\r\n let muXSumY = 0;\r\n for (let i = 0; i < n; i++) {\r\n muXSumX += pointBase[i][0];\r\n muXSumY += pointBase[i][1];\r\n }\r\n let muYSumX = 0;\r\n let muYSumY = 0;\r\n for (let i = 0; i < ny; i++) {\r\n muYSumX += pointShift[i][0];\r\n muYSumY += pointShift[i][1];\r\n }\r\n let muX = [muXSumX / n, muXSumY / n];\r\n let muY = [muYSumX / ny, muYSumY / ny];\r\n\r\n let x0 = [];\r\n let y0 = [];\r\n for (let i = 0; i < n; i++) {\r\n x0.push([pointBase[i][0] - muX[0], pointBase[i][1] - muX[1]]);\r\n }\r\n for (let i = 0; i < ny; i++) {\r\n y0.push([pointShift[i][0] - muY[0], pointShift[i][1] - muY[1]]);\r\n }\r\n\r\n let muXSumXQ = 0;\r\n let muXSumYQ = 0;\r\n for (let i = 0; i < n; i++) {\r\n muXSumXQ += x0[i][0] ** 2;\r\n muXSumYQ += x0[i][1] ** 2;\r\n }\r\n let muYSumXQ = 0;\r\n let muYSumYQ = 0;\r\n for (let i = 0; i < ny; i++) {\r\n muYSumXQ += y0[i][0] ** 2;\r\n muYSumYQ += y0[i][1] ** 2;\r\n }\r\n let ssX = muXSumXQ + muXSumYQ;\r\n let ssY = muYSumXQ + muYSumYQ;\r\n\r\n let normX = Math.sqrt(ssX);\r\n let normY = Math.sqrt(ssY);\r\n\r\n let newX0 = [];\r\n let newY0 = [];\r\n for (let i = 0; i < n; i++) {\r\n newX0.push([x0[i][0] / normX, x0[i][1] / normX]);\r\n }\r\n for (let i = 0; i < ny; i++) {\r\n newY0.push([y0[i][0] / normY, y0[i][1] / normY]);\r\n }\r\n\r\n let a = multiply(transpose(newX0), newY0);\r\n let { u, q, v } = SVD(a);\r\n\r\n let U = JSON.parse(JSON.stringify(u));\r\n U[0][0] = u[0][1];\r\n U[0][1] = u[0][0];\r\n U[1][0] = u[1][1];\r\n U[1][1] = u[1][0];\r\n let Vt = JSON.parse(JSON.stringify(v));\r\n Vt[0][0] = v[0][1];\r\n Vt[0][1] = v[0][0];\r\n Vt[1][0] = v[1][1];\r\n Vt[1][1] = v[1][0];\r\n let s = JSON.parse(JSON.stringify(q));\r\n s[0] = q[1];\r\n s[1] = q[0];\r\n\r\n let V = transpose(Vt);\r\n\r\n let T = multiply(V, transpose(U));\r\n // reflection always at best\r\n // scaling always true\r\n // view python code for details\r\n let traceTA = 0;\r\n for (let i = 0; i < s.length; i++) {\r\n traceTA += s[i];\r\n }\r\n let b = (traceTA * normX) / normY;\r\n let Z = multiply(newY0, T);\r\n\r\n for (let i = 0; i < Z.length; i++) {\r\n Z[i][0] = normX * traceTA * Z[i][0] + muX[0];\r\n Z[i][1] = normX * traceTA * Z[i][1] + muX[1];\r\n }\r\n let c = multiply(muY, T);\r\n c[0] = muX[0] - c[0] * b;\r\n c[1] = muX[1] - c[1] * b;\r\n let R = [\r\n [T[0][0], T[0][1], 0],\r\n [T[1][0], T[1][1], 0],\r\n [0, 0, 1],\r\n ];\r\n let S = [\r\n [b, 0, 0],\r\n [0, b, 0],\r\n [0, 0, 1],\r\n ];\r\n let t = [\r\n [1, 0, c[0]],\r\n [0, 1, c[1]],\r\n [0, 0, 1],\r\n ];\r\n let Matrix = transpose(multiply(multiply(R, S), transpose(t)));\r\n return Matrix;\r\n}\r\n\r\nfunction calcOnloading(params, img) {\r\n img.onload = () => {\r\n params.counter += 1;\r\n params.imgs.push(img);\r\n if (params.counter === 2) {\r\n let str = params.imgs[0].currentSrc;\r\n //let baseHeight = null;\r\n let targetHeight = null;\r\n if (str.includes(params.baseId)) {\r\n //baseHeight = params.imgs[0].height;\r\n targetHeight = params.imgs[1].height;\r\n } else {\r\n return;\r\n }\r\n\r\n let bfact = 1; // baseHeight / params.baseOme.sizeY;\r\n let tfact = 1;\r\n let translateScale = targetHeight / params.ome.sizeY; //baseHeight / params.baseOme.sizeY;\r\n\r\n let m = calculateAffineTransformation(\r\n params.pointBase,\r\n params.pointShift,\r\n bfact,\r\n tfact\r\n );\r\n let hMat = [\r\n m[0][0],\r\n m[0][1],\r\n m[0][2],\r\n m[1][0],\r\n m[1][1],\r\n m[1][2],\r\n m[2][0],\r\n m[2][1],\r\n m[2][2],\r\n ];\r\n params.callback(hMat, translateScale);\r\n }\r\n };\r\n}\r\n\r\nexport function calculateTransformationMatrix(\r\n pointBase,\r\n pointShift,\r\n ome,\r\n baseId,\r\n targetId,\r\n baseOme,\r\n callback\r\n) {\r\n let ids = [baseId, targetId];\r\n let counter = 0;\r\n let imgs = [];\r\n let params = {\r\n counter,\r\n imgs,\r\n pointBase,\r\n pointShift,\r\n ome,\r\n baseOme,\r\n callback,\r\n baseId,\r\n };\r\n for (let i = 0; i < ids.length; i++) {\r\n let img = new Image();\r\n img.src = Backend.renderRegion({\r\n id: ids[i],\r\n page: 0,\r\n lv: 0,\r\n x: 0,\r\n y: 0,\r\n });\r\n calcOnloading(params, img);\r\n }\r\n}\r\n\r\nfunction onloading(p, i, j, visImg) {\r\n visImg.onload = () => {\r\n p.counter += 1;\r\n p.imgs.push(visImg);\r\n p.pos.push([j - p.xStart, i - p.yStart]);\r\n if (p.counter === p.tilesToLoad) {\r\n p.callback(p.imgs, p.pos);\r\n }\r\n };\r\n}\r\n\r\nfunction tileLoader(params) {\r\n for (let i = params.yStart; i <= params.yEnd; i++) {\r\n for (let j = params.xStart; j <= params.xEnd; j++) {\r\n let visImg = new Image();\r\n visImg.src = Backend.renderRegion({\r\n id: params.fileId,\r\n page: params.page,\r\n lv: params.lv,\r\n x: j,\r\n y: i,\r\n });\r\n onloading(params, i, j, visImg);\r\n }\r\n }\r\n}\r\n\r\nfunction transformPoint(x, y, m) {\r\n let a = m[0][0] * x + m[0][1] * y + m[0][2];\r\n let b = m[1][0] * x + m[1][1] * y + m[1][2];\r\n let c = m[2][0] * x + m[2][1] * y + m[2][2];\r\n if (c !== 1) {\r\n console.log(\"transformation error\");\r\n }\r\n let resultX = a / c;\r\n let resultY = b / c;\r\n return [resultX, resultY];\r\n}\r\n\r\nexport function tileRegistration(\r\n img,\r\n tileId,\r\n hMat,\r\n fact,\r\n channel,\r\n callbackPushImage\r\n) {\r\n let cv = window.cv;\r\n let splited = tileId.split(\",\");\r\n let page = parseInt(splited[0]);\r\n let lv = parseInt(splited[1]);\r\n let x = parseInt(splited[2]);\r\n let y = parseInt(splited[3]);\r\n let fileId = splited[4];\r\n let maxTile = Math.pow(2, lv);\r\n //let strin = \"-\" + page + \",\" + lv + \",\" + x + \",\" + y + \"-\";\r\n let m = [\r\n [hMat[0], hMat[1], hMat[2] * fact],\r\n [hMat[3], hMat[4], hMat[5] * fact],\r\n [hMat[6], hMat[7], hMat[8]],\r\n ];\r\n\r\n let iM = inv(m);\r\n let s = [\r\n [maxTile, 0, 0],\r\n [0, maxTile, 0],\r\n [0, 0, 1],\r\n ];\r\n m = multiply(multiply(s, m), inv(s));\r\n iM = inv(m);\r\n\r\n //get tile coordinates\r\n let tileWidth = img.width;\r\n let tileHeight = img.height;\r\n let xPosition = (x + 1) * tileWidth;\r\n let yPosition = (y + 1) * tileHeight;\r\n\r\n let pointTL = [xPosition - tileWidth, yPosition - tileHeight];\r\n let pointTR = [xPosition, yPosition - tileHeight];\r\n let pointBL = [xPosition - tileWidth, yPosition];\r\n let pointBR = [xPosition, yPosition];\r\n\r\n //reverse transfrom the tile coordinates\r\n let invPointTL = transformPoint(pointTL[0], pointTL[1], iM);\r\n let invPointTR = transformPoint(pointTR[0], pointTR[1], iM);\r\n let invPointBL = transformPoint(pointBL[0], pointBL[1], iM);\r\n let invPointBR = transformPoint(pointBR[0], pointBR[1], iM);\r\n\r\n //create rectangle around transformed coordinates\r\n let minX = Math.min(\r\n invPointTL[0],\r\n invPointTR[0],\r\n invPointBL[0],\r\n invPointBR[0]\r\n );\r\n let minY = Math.min(\r\n invPointTL[1],\r\n invPointTR[1],\r\n invPointBL[1],\r\n invPointBR[1]\r\n );\r\n let maxX = Math.max(\r\n invPointTL[0],\r\n invPointTR[0],\r\n invPointBL[0],\r\n invPointBR[0]\r\n );\r\n let maxY = Math.max(\r\n invPointTL[1],\r\n invPointTR[1],\r\n invPointBL[1],\r\n invPointBR[1]\r\n );\r\n\r\n let rectPointTL = [minX, minY];\r\n let rectPointBR = [maxX, maxY];\r\n let rectWidth = Math.abs(maxX - minX);\r\n let rectHeight = Math.abs(maxY - minY);\r\n\r\n //create mats and use them to calc needed transformation matrix\r\n let OriginRectPointTL = [\r\n invPointTL[0] - rectPointTL[0],\r\n invPointTL[1] - rectPointTL[1],\r\n ];\r\n let OriginRectPointTR = [\r\n invPointTR[0] - rectPointTL[0],\r\n invPointTR[1] - rectPointTL[1],\r\n ];\r\n let OriginRectPointBL = [\r\n invPointBL[0] - rectPointTL[0],\r\n invPointBL[1] - rectPointTL[1],\r\n ];\r\n let OriginRectPointBR = [\r\n invPointBR[0] - rectPointTL[0],\r\n invPointBR[1] - rectPointTL[1],\r\n ];\r\n\r\n let matSource = [\r\n OriginRectPointTL[0],\r\n OriginRectPointTL[1],\r\n OriginRectPointTR[0],\r\n OriginRectPointTR[1],\r\n OriginRectPointBL[0],\r\n OriginRectPointBL[1],\r\n OriginRectPointBR[0],\r\n OriginRectPointBR[1],\r\n ];\r\n\r\n matSource = cv.matFromArray(4, 1, cv.CV_32FC2, matSource);\r\n let matTarget = [0, 0, tileWidth, 0, 0, tileHeight, tileWidth, tileHeight];\r\n matTarget = cv.matFromArray(4, 1, cv.CV_32FC2, matTarget);\r\n let newMat = cv.getPerspectiveTransform(matSource, matTarget);\r\n\r\n //calculate wich tiles need to be loaded for complete information\r\n let xStart = x;\r\n let yStart = y;\r\n let xEnd = x;\r\n let yEnd = y;\r\n if (rectPointTL[0] < pointTL[0] && pointTL[0] !== 0) {\r\n let diff = pointTL[0] - rectPointTL[0];\r\n diff = diff / tileWidth;\r\n xStart = xStart - (Math.trunc(diff) + 1);\r\n if (xStart < 0) xStart = 0;\r\n }\r\n if (rectPointBR[0] > pointBR[0]) {\r\n let diff = rectPointBR[0] - pointBR[0];\r\n diff = diff / tileWidth;\r\n xEnd = xEnd + (Math.trunc(diff) + 1);\r\n if (xEnd > maxTile - 1) xEnd = maxTile - 1;\r\n }\r\n if (rectPointTL[1] < pointTL[1] && pointTL[1] !== 0) {\r\n let diff = pointTL[1] - rectPointTL[1];\r\n diff = diff / tileHeight;\r\n yStart = yStart - (Math.trunc(diff) + 1);\r\n if (yStart < 0) yStart = 0;\r\n }\r\n if (rectPointBR[1] > pointBR[1]) {\r\n let diff = rectPointBR[1] - pointBR[1];\r\n diff = diff / tileHeight;\r\n yEnd = yEnd + (Math.trunc(diff) + 1);\r\n if (yEnd > maxTile - 1) yEnd = maxTile - 1;\r\n }\r\n\r\n //create offline canvas\r\n let offScrCan = document.createElement(\"canvas\");\r\n offScrCan.width = (xEnd - xStart + 1) * tileWidth;\r\n offScrCan.height = (yEnd - yStart + 1) * tileHeight;\r\n let offsetX = 0;\r\n let offsetY = 0;\r\n\r\n //adjust canvas size\r\n if (rectPointTL[0] - pointTL[0] < 0) {\r\n offScrCan.width = offScrCan.width + Math.abs(rectPointTL[0] - pointTL[0]);\r\n offsetX = Math.abs(rectPointTL[0] - pointTL[0]);\r\n }\r\n if (rectPointBR[0] - pointBR[0] > (xEnd - xStart + 1) * tileWidth) {\r\n offScrCan.width = offScrCan.width + Math.abs(rectPointBR[0] - pointBR[0]);\r\n }\r\n if (rectPointTL[1] - pointTL[1] < 0) {\r\n offScrCan.height = offScrCan.height + Math.abs(rectPointTL[1] - pointTL[1]);\r\n offsetY = Math.abs(rectPointTL[1] - pointTL[1]);\r\n }\r\n if (rectPointBR[1] - pointBR[1] > (yEnd - yStart + 1) * tileHeight) {\r\n offScrCan.height = offScrCan.height + Math.abs(rectPointBR[1] - pointBR[1]);\r\n }\r\n\r\n let ctx = offScrCan.getContext(\"2d\");\r\n //load the tiles wich will be later drawn into offline canvas\r\n let imgs = [];\r\n let pos = [];\r\n let counter = 0;\r\n let tilesToLoad = (yEnd - yStart + 1) * (xEnd - xStart + 1);\r\n //tileloaderparams\r\n let tileLoaderParams = {\r\n yStart,\r\n yEnd,\r\n xStart,\r\n xEnd,\r\n fileId,\r\n page,\r\n lv,\r\n tilesToLoad,\r\n counter,\r\n imgs,\r\n pos,\r\n callback: (imgs, pos) => {\r\n if (imgs.length === pos.length) {\r\n for (let i = 0; i < imgs.length; i++) {\r\n let p = pos[i];\r\n ctx.drawImage(\r\n imgs[i],\r\n p[0] * tileWidth + offsetX,\r\n p[1] * tileHeight + offsetY,\r\n tileWidth,\r\n tileHeight\r\n );\r\n }\r\n } else {\r\n console.log(\"RETURN ERROR\");\r\n return;\r\n }\r\n //create rectangle with information from offline canvas\r\n let imgData = ctx.getImageData(\r\n rectPointTL[0] - xStart * tileWidth + offsetX,\r\n rectPointTL[1] - yStart * tileHeight + offsetY,\r\n rectWidth,\r\n rectHeight\r\n );\r\n //transform the rectangle\r\n let src = cv.matFromImageData(imgData);\r\n let dst = new cv.Mat();\r\n let dsize = new cv.Size(tileWidth, tileHeight);\r\n cv.warpPerspective(\r\n src,\r\n dst,\r\n newMat,\r\n dsize,\r\n cv.INTER_NEAREST,\r\n cv.BORDER_REPLICATE\r\n );\r\n\r\n let newImgData = new ImageData(\r\n new Uint8ClampedArray(dst.data),\r\n dst.cols,\r\n dst.rows\r\n );\r\n //create new canvas in tile size and draw transformation result into it\r\n let offTileCan = document.createElement(\"canvas\");\r\n offTileCan.width = tileWidth;\r\n offTileCan.height = tileHeight;\r\n let ctxTile = offTileCan.getContext(\"2d\");\r\n ctxTile.putImageData(newImgData, 0, 0);\r\n //console.log(\"REGISTERED\", page, lv, x, y, fileId);\r\n // ctxTile.font = \"100px Arial\";\r\n // ctxTile.fillStyle = \"red\";\r\n // ctxTile.textAlign = \"center\";\r\n // ctxTile.fillText(\r\n // strin,\r\n // parseInt(tileWidth / 2),\r\n // parseInt(tileHeight / 2)\r\n // );\r\n offTileCan = configureImage(offTileCan, channel);\r\n\r\n callbackPushImage(offTileCan);\r\n },\r\n };\r\n tileLoader(tileLoaderParams);\r\n}\r\n\r\n// function autoRegistration(\r\n// pointBase,\r\n// pointShift,\r\n// ome,\r\n// fileId,\r\n// activeFileId,\r\n// splitIds,\r\n// callback\r\n// ) {\r\n// //fileIdBase, fileIdShift\r\n// let cv = window.cv;\r\n// let idBase = fileId;\r\n// let idShift = fileId;\r\n// if (fileId !== activeFileId) {\r\n// idBase = activeFileId;\r\n// idShift = fileId;\r\n// } else {\r\n// idBase = splitIds[0];\r\n// idShift = splitIds[1];\r\n// }\r\n\r\n// // let ids = [fileIdBase, fileIdShift];\r\n// let ids = [idBase, idShift];\r\n// let counter = 0;\r\n// let imgs = [];\r\n\r\n// for (let i = 0; i < ids.length; i++) {\r\n// let img = new Image();\r\n// img.src = Backend.renderRegion({\r\n// id: ids[i],\r\n// page: 0,\r\n// lv: 0,\r\n// x: 0,\r\n// y: 0,\r\n// });\r\n// img.onload = () => {\r\n// counter += 1;\r\n// imgs.push(img);\r\n// if (counter === 2) {\r\n// console.log(\"Images loaded\");\r\n// // let factor = 2;\r\n// // //alot of code just to get imgs as mats\r\n\r\n// // //Image Base\r\n// // let offScrnBase = document.createElement(\"canvas\");\r\n// // offScrnBase.width = imgs[0].width;\r\n// // offScrnBase.height = imgs[0].height;\r\n// // let ctxBase = offScrnBase.getContext(\"2d\");\r\n// // ctxBase.drawImage(imgs[0], 0, 0, offScrnBase.width, offScrnBase.height);\r\n// // let imgDataBase = ctxBase.getImageData(\r\n// // 0,\r\n// // 0,\r\n// // offScrnBase.width,\r\n// // offScrnBase.height\r\n// // );\r\n// // let srcBase = cv.matFromImageData(imgDataBase);\r\n\r\n// // //Image Shift\r\n// // let offScrnShift = document.createElement(\"canvas\");\r\n// // offScrnShift.width = imgs[1].width;\r\n// // offScrnShift.height = imgs[1].height;\r\n\r\n// // let ctxShift = offScrnShift.getContext(\"2d\");\r\n// // ctxShift.drawImage(\r\n// // imgs[1],\r\n// // 0,\r\n// // 0,\r\n// // offScrnShift.width,\r\n// // offScrnShift.height\r\n// // );\r\n// // let imgDataShift = ctxShift.getImageData(\r\n// // 0,\r\n// // 0,\r\n// // offScrnShift.width,\r\n// // offScrnShift.height\r\n// // );\r\n// // let srcShift = cv.matFromImageData(imgDataShift);\r\n\r\n// // //now we have imgs as mats\r\n\r\n// // // convert 2 grayscale\r\n// // let imgBaseGray = new cv.Mat();\r\n// // let imgShiftGray = new cv.Mat();\r\n// // cv.cvtColor(srcBase, imgBaseGray, cv.COLOR_BGRA2GRAY);\r\n// // cv.cvtColor(srcShift, imgShiftGray, cv.COLOR_BGRA2GRAY);\r\n\r\n// // //resize images\r\n// // let shiftShrinkWidth = parseInt(offScrnShift.width / factor);\r\n// // let shiftShrinkHeight = parseInt(offScrnShift.height / factor);\r\n// // let imgBaseGrayShrink = new cv.Mat();\r\n// // let imgShiftGrayShrink = new cv.Mat();\r\n// // cv.resize(\r\n// // imgBaseGray,\r\n// // imgBaseGrayShrink,\r\n// // new cv.Size(\r\n// // parseInt(offScrnBase.width / factor),\r\n// // parseInt(offScrnBase.height / factor)\r\n// // ),\r\n// // cv.INTER_NEAREST\r\n// // );\r\n// // cv.resize(\r\n// // imgShiftGray,\r\n// // imgShiftGrayShrink,\r\n// // new cv.Size(shiftShrinkWidth, shiftShrinkHeight),\r\n// // cv.INTER_NEAREST\r\n// // );\r\n\r\n// // //Feature detection and matrix creation\r\n// // var t0 = performance.now();\r\n\r\n// // let kp1 = new cv.KeyPointVector();\r\n// // let kp2 = new cv.KeyPointVector();\r\n// // let dscrpt1 = new cv.Mat();\r\n// // let dscrpt2 = new cv.Mat();\r\n// // let orb = new cv.ORB(5000);\r\n\r\n// // orb.detectAndCompute(imgBaseGrayShrink, new cv.Mat(), kp1, dscrpt1);\r\n// // orb.detectAndCompute(imgShiftGrayShrink, new cv.Mat(), kp2, dscrpt2);\r\n\r\n// // let goodMatches = new cv.DMatchVector();\r\n// // let matcher = new cv.BFMatcher(cv.NORM_HAMMING, true);\r\n// // let matches = new cv.DMatchVector();\r\n\r\n// // matcher.match(dscrpt1, dscrpt2, matches);\r\n\r\n// // //let qualityCounter = 0;\r\n// // // for (let i = 0; i < matches.size(); i++) {\r\n// // // if (matches.get(i).distance < 45) {\r\n// // // qualityCounter += 1;\r\n// // // goodMatches.push_back(matches.get(i));\r\n// // // }\r\n// // // }\r\n// // // while (goodMatches.size() < matches.size() * 0.9) {\r\n// // // for (let i = 0; i < matches.size(); i++) {\r\n// // // if (matches.get(i).distance < cntr) {\r\n// // // goodMatches.push_back(matches.get(i));\r\n// // // }\r\n// // // }\r\n// // // cntr += 10;\r\n// // // }\r\n// // // top 90%\r\n// // // let arr = [];\r\n// // // for (let i = 0; i < matches.size(); i++) {\r\n// // // arr.push([i, matches.get(i).distance]);\r\n// // // }\r\n// // // arr.sort((a, b) => {\r\n// // // if (a[1] === b[1]) {\r\n// // // return 0;\r\n// // // } else {\r\n// // // return a[1] < b[1] ? -1 : 1;\r\n// // // }\r\n// // // });\r\n\r\n// // // for (let i = 0; i < matches.size() * 0.9; i++) {\r\n// // // goodMatches.push_back(matches.get(arr[i][0]));\r\n// // // }\r\n\r\n// // let points1 = [];\r\n// // let points2 = [];\r\n// // for (let i = 0; i < goodMatches.size(); i++) {\r\n// // points1.push(kp1.get(goodMatches.get(i).queryIdx).pt.x);\r\n// // points1.push(kp1.get(goodMatches.get(i).queryIdx).pt.y);\r\n// // points2.push(kp2.get(goodMatches.get(i).trainIdx).pt.x);\r\n// // points2.push(kp2.get(goodMatches.get(i).trainIdx).pt.y);\r\n// // }\r\n// // var mat1 = new cv.Mat(points1.length, 1, cv.CV_32FC2);\r\n// // mat1.data32F.set(points1);\r\n// // var mat2 = new cv.Mat(points2.length, 1, cv.CV_32FC2);\r\n// // mat2.data32F.set(points2);\r\n\r\n// // let h = cv.findHomography(mat2, mat1, cv.RANSAC);\r\n\r\n// // //get warped Image for comparison\r\n// // let dst = new cv.Mat();\r\n// // let dsize = new cv.Size(shiftShrinkWidth, shiftShrinkHeight);\r\n// // cv.warpPerspective(srcShift, dst, h, dsize);\r\n\r\n// // //check mif result is good\r\n// // let kp1Check = new cv.KeyPointVector();\r\n// // let kp2Check = new cv.KeyPointVector();\r\n// // let dscrpt1Check = new cv.Mat();\r\n// // let dscrpt2Check = new cv.Mat();\r\n// // let orbCheck = new cv.ORB(5000);\r\n\r\n// // orbCheck.detectAndCompute(\r\n// // imgBaseGrayShrink,\r\n// // new cv.Mat(),\r\n// // kp1Check,\r\n// // dscrpt1Check\r\n// // );\r\n// // orbCheck.detectAndCompute(dst, new cv.Mat(), kp2Check, dscrpt2Check);\r\n\r\n// // //let goodMatchesCheck = new cv.DMatchVector();\r\n// // let matcherCheck = new cv.BFMatcher(cv.NORM_HAMMING, true);\r\n// // let matchesCheck = new cv.DMatchVector();\r\n\r\n// // matcherCheck.match(dscrpt1Check, dscrpt2Check, matchesCheck);\r\n\r\n// // // let qualityCounterCheck = 0;\r\n// // // for (let i = 0; i < matchesCheck.size(); i++) {\r\n// // // if (matchesCheck.get(i).distance < 20) {\r\n// // // qualityCounterCheck += 1;\r\n// // // }\r\n// // // }\r\n// // if (matchesCheck.size() < matches.size() * 0.4) {\r\n// // console.log(\"probably failed\");\r\n// // }\r\n\r\n// // /*\r\n// // warp\r\n// // diff = newImgData imgDataBase\r\n// // if diff > x\r\n// // do it again\r\n// // parameterset [0,1,2,3,4...]\r\n// // if still\r\n// // return \"automatic reg not suitable\"\r\n\r\n// // */\r\n\r\n// // var t1 = performance.now();\r\n// // console.log(\"Exec Time \" + (t1 - t0) / 1000 + \" seconds.\");\r\n\r\n// // let m = [\r\n// // [h.data64F[0], h.data64F[1], h.data64F[2]],\r\n// // [h.data64F[3], h.data64F[4], h.data64F[5]],\r\n// // [h.data64F[6], h.data64F[7], h.data64F[8]],\r\n// // ];\r\n// // let s = [\r\n// // [factor, 0, 0],\r\n// // [0, factor, 0],\r\n// // [0, 0, 1],\r\n// // ];\r\n// // m = multiply(multiply(s, m), inv(s));\r\n// let m = calculateAffineTransformation(pointBase, pointShift, ome);\r\n// let hMat = [\r\n// m[0][0],\r\n// m[0][1],\r\n// m[0][2],\r\n// m[1][0],\r\n// m[1][1],\r\n// m[1][2],\r\n// m[2][0],\r\n// m[2][1],\r\n// m[2][2],\r\n// ];\r\n// callback(hMat);\r\n// }\r\n// };\r\n// }\r\n// }\r\n\r\nexport function colorInImage(img, channel) {\r\n if (!img || img.width === 0) {\r\n return null;\r\n }\r\n\r\n let offScrCan = document.createElement(\"canvas\");\r\n offScrCan.width = img.width;\r\n offScrCan.height = img.height;\r\n\r\n let ctx1 = offScrCan.getContext(\"2d\");\r\n\r\n ctx1.drawImage(img, 0, 0, img.width, img.height);\r\n\r\n // do histogram manipulation\r\n if (img.width === 0) return null;\r\n let imgData = ctx1.getImageData(0, 0, img.width, img.height);\r\n let step = 4; // rgba\r\n let min = channel.min;\r\n let max = channel.max;\r\n let gamma = channel.gamma;\r\n const maxPixelValue = 255;\r\n let rgb = false;\r\n\r\n //let rgb = true;\r\n for (let i = 0, n = imgData.data.length; i < n; i += step) {\r\n let val = imgData.data[i];\r\n // let val = imgData.data[i + (step - 1)];\r\n // if (val < maxPixelValue) rgb = false;\r\n\r\n val = (Math.min(Math.max(val - min, 0), max) * maxPixelValue) / (max - min);\r\n imgData.data[i + (step - 1)] =\r\n maxPixelValue * (val / maxPixelValue) ** (1 / gamma);\r\n }\r\n\r\n ctx1.putImageData(imgData, 0, 0);\r\n\r\n if (channel.type !== \"brightfield\" && !rgb) {\r\n // color in alpha channel\r\n ctx1.globalCompositeOperation = \"source-in\";\r\n ctx1.fillStyle = channel.color;\r\n ctx1.fillRect(0, 0, img.width, img.height);\r\n }\r\n return offScrCan;\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport classNames from \"classnames\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport Draggable from \"react-draggable\";\r\n\r\nconst maxScaleWidth = 200;\r\nconst maxScaleBarWidth = maxScaleWidth * 1.5;\r\nconst scaleUnitLabels = [\"km\", \"m\", \"mm\", \"µm\", \"nm\", \"pm\", \"fm\", \"am\", \"zm\"];\r\nconst scaleUnits = [3, 1, -3, -6, -9, -12, -15, -18, -21];\r\n\r\nconst styles = {\r\n root: {\r\n width: maxScaleBarWidth,\r\n height: 30,\r\n\r\n position: \"absolute\",\r\n bottom: 4,\r\n right: 6,\r\n color: \"#ffffff\",\r\n\r\n textAlign: \"center\",\r\n padding: 4,\r\n cursor: \"grab\",\r\n },\r\n};\r\n\r\n/**\r\n * computing data to let renderer render the scalebar as a canvas element, so it can be printed with screenshot tool\r\n */\r\nclass ScaleBar extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n grabbing: false,\r\n x: 0,\r\n y: 0,\r\n newWidth: 0,\r\n };\r\n }\r\n\r\n componentDidUpdate() {\r\n const { ome, zoom } = this.props;\r\n let scalebarMeters = ome.physicalSizeX * (maxScaleWidth / zoom);\r\n\r\n // hide if no scale information is given\r\n if (!ome.physicalSizeX) return null;\r\n\r\n let exponent = parseFloat(scalebarMeters.toExponential().split(\"e\")[1]);\r\n\r\n // find best fitting exponennt\r\n let unitExponent = 1;\r\n let unitExponentIndex = 1;\r\n for (\r\n unitExponentIndex = 0;\r\n unitExponentIndex < scaleUnits.length;\r\n unitExponentIndex++\r\n ) {\r\n if (scaleUnits[unitExponentIndex] <= exponent) {\r\n unitExponent = scaleUnits[unitExponentIndex];\r\n break;\r\n }\r\n }\r\n\r\n let mantissa = scalebarMeters / Math.pow(10, unitExponent);\r\n\r\n let roundedMantissa = mantissa;\r\n if (mantissa < 1.5) {\r\n roundedMantissa = 1;\r\n } else if (mantissa < 3.5) {\r\n roundedMantissa = 2;\r\n } else if (mantissa < 7.5) {\r\n roundedMantissa = 5;\r\n } else if (mantissa < 15) {\r\n roundedMantissa = 10;\r\n } else if (mantissa < 35) {\r\n roundedMantissa = 20;\r\n } else if (mantissa < 75) {\r\n roundedMantissa = 50;\r\n } else if (mantissa < 150) {\r\n roundedMantissa = 100;\r\n } else if (mantissa < 350) {\r\n roundedMantissa = 200;\r\n } else if (mantissa < 750) {\r\n roundedMantissa = 500;\r\n } else {\r\n roundedMantissa = 1;\r\n unitExponentIndex--;\r\n unitExponent = scaleUnits[unitExponentIndex];\r\n mantissa = scalebarMeters / Math.pow(10, unitExponent);\r\n }\r\n\r\n // round finer without skipped steps\r\n // if (mantissa < 10) {\r\n // roundedMantissa = Math.floor(mantissa / 1) * 1;\r\n // } else if (mantissa < 100) {\r\n // roundedMantissa = Math.floor(mantissa / 10) * 10;\r\n // } else if (mantissa < 1000) {\r\n // roundedMantissa = Math.floor(mantissa / 100) * 100;\r\n // }\r\n\r\n let newWidth = (maxScaleWidth * roundedMantissa) / mantissa;\r\n\r\n const fluorescence = ome.channels[0].type !== \"brightfield\";\r\n //console.log(\"setting scaleBarData1\");\r\n this.props.setScaleBarData({\r\n x: this.state.x,\r\n y: this.state.y,\r\n width: newWidth,\r\n label: roundedMantissa + \" \" + scaleUnitLabels[unitExponentIndex],\r\n color: fluorescence ? \"#fff\" : \"#000\",\r\n maxScaleWidth: maxScaleBarWidth,\r\n });\r\n }\r\n\r\n render() {\r\n const { classes, setScaleBarData } = this.props;\r\n const { grabbing } = this.state;\r\n\r\n return (\r\n {\r\n this.parentObj = e.target.offsetParent.getBoundingClientRect();\r\n this.setState({ grabbing: true });\r\n }}\r\n onStop={() => this.setState({ grabbing: false })}\r\n onDrag={(e) => {\r\n let rect = e.target.getBoundingClientRect();\r\n if (this.parentObj.right !== rect.right) {\r\n this.setState({\r\n x: rect.right - this.parentObj.right,\r\n y: rect.bottom - this.parentObj.bottom,\r\n });\r\n }\r\n }}\r\n >\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nScaleBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n ome: PropTypes.object,\r\n zoom: PropTypes.number,\r\n pointerEvents: PropTypes.bool,\r\n setScaleBarData: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(ScaleBar);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n// define the component's styling\r\nconst styles = () => ({\r\n root: {\r\n height: 300,\r\n width: 50,\r\n position: \"absolute\",\r\n bottom: 50,\r\n right: 5,\r\n opacity: 0.8,\r\n },\r\n verticalBar: {\r\n position: \"absolute\",\r\n top: -15,\r\n left: \"50%\",\r\n marginLeft: -2,\r\n width: 4,\r\n height: \"100%\",\r\n background: \"#0673C1\",\r\n },\r\n fab: {\r\n position: \"absolute\",\r\n marginTop: -15,\r\n marginLeft: -15,\r\n left: \"50%\",\r\n width: 30,\r\n height: 30,\r\n background: \"white\",\r\n color: \"#0673C1\",\r\n border: \"2px solid #0673C1\",\r\n borderRadius: \"50%\",\r\n fontSize: \"12px\",\r\n fontWeight: \"bold\",\r\n lineHeight: \"25px\",\r\n textAlign: \"center\",\r\n cursor: \"pointer\",\r\n },\r\n});\r\nconst marks = [\r\n {\r\n value: 100,\r\n level: 40,\r\n },\r\n {\r\n value: 75,\r\n level: 20,\r\n },\r\n {\r\n value: 50,\r\n level: 10,\r\n },\r\n {\r\n value: 30,\r\n level: 4,\r\n },\r\n {\r\n value: 15,\r\n level: 2,\r\n },\r\n {\r\n value: 0,\r\n level: 1,\r\n },\r\n];\r\n\r\nclass ZoomBar extends Component {\r\n isSelected = (idx) => {\r\n let zoom = this.props.zoom;\r\n let result = marks.length - 1;\r\n let max = 0;\r\n for (let i = 0; i < marks.length; i++) {\r\n let mark = marks[i];\r\n if (mark.level <= zoom && mark.level >= max) {\r\n max = mark.level;\r\n result = i;\r\n }\r\n }\r\n return result === idx;\r\n };\r\n\r\n render() {\r\n const { classes, zoom, clickable } = this.props;\r\n return (\r\n \r\n \r\n
    \r\n\r\n {marks.map((mark, idx) => {\r\n return (\r\n
    \r\n this.props.changeValue(mark.level)}\r\n >\r\n {(this.isSelected(idx) ? Math.round(zoom) : mark.level) + \"x\"}\r\n
    \r\n
    \r\n );\r\n })}\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nZoomBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n zoom: PropTypes.number,\r\n clickable: PropTypes.bool,\r\n changeValue: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(ZoomBar);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport classNames from \"classnames\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport withTheme from \"@mui/styles/withTheme\";\r\n\r\nimport { trackTransforms } from \"../utils/CanvasUtil\";\r\nimport DragIndicator from \"@mui/icons-material/DragIndicator\";\r\nimport Draggable from \"react-draggable\";\r\n\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\n\r\nconst styles = {\r\n root: {\r\n position: \"absolute\",\r\n left: 5,\r\n height: 170,\r\n width: 220,\r\n border: \"2px solid rgb(85, 85, 85)\",\r\n opacity: 0.8,\r\n },\r\n rootsidebar: {\r\n height: 170,\r\n width: 220,\r\n border: \"2px solid rgb(85, 85, 85)\",\r\n opacity: 0.8,\r\n },\r\n canvas: {\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n backgroundColor: \"#000000\",\r\n },\r\n dragIndicator: {\r\n color: \"#fff\",\r\n position: \"absolute\",\r\n top: 5,\r\n right: 5,\r\n cursor: \"grab\",\r\n },\r\n grabbing: {\r\n cursor: \"grabbing\",\r\n },\r\n};\r\n\r\nclass MiniMap extends Component {\r\n constructor(props) {\r\n super(props);\r\n if (props.componentRef) props.componentRef(this);\r\n\r\n this.state = {\r\n grabbing: false,\r\n };\r\n }\r\n\r\n componentDidMount = () => {\r\n this.initialized = false;\r\n // add zoom with mouse wheel\r\n this.canvas.addEventListener(\"mousewheel\", (e) => this.mousewheel(e), {\r\n passive: false,\r\n });\r\n\r\n // get drawing context from canvas\r\n this.ctx = this.canvas.getContext(\"2d\");\r\n\r\n // extend context with some fancy additional transformation methods\r\n trackTransforms(this.ctx);\r\n\r\n // converts the relative size css information into an absolute size which we can access\r\n this.width = this.canvas.width = this.canvas.offsetWidth;\r\n this.height = this.canvas.height = this.canvas.offsetHeight;\r\n\r\n // get bounds for correct minimap positionining\r\n let bounds = this.root.getBoundingClientRect();\r\n if (this.props.inSideBar) {\r\n bounds.x = 0;\r\n bounds.y = 0;\r\n }\r\n this.setState({\r\n x: bounds.x,\r\n y: bounds.y,\r\n });\r\n };\r\n\r\n componentWillUnmount() {\r\n this.canvas.removeEventListener(\"mousewheel\", (e) => this.mousewheel(e));\r\n }\r\n\r\n componentDidUpdate() {\r\n // redraw image when the component updates\r\n if (!this.initialized) {\r\n setTimeout(() => {\r\n this.draw();\r\n }, 500);\r\n } else if (this.initialized) {\r\n this.draw();\r\n }\r\n this.draw();\r\n }\r\n\r\n // zoom out to show the whole image\r\n zoomOut() {\r\n // center image first\r\n let pt = this.ctx.transformedPoint(\r\n (this.canvas.width - this.vw) / 2,\r\n (this.canvas.height - this.vh) / 2\r\n );\r\n this.ctx.translate(pt.x, pt.y);\r\n // calc our transformation offset\r\n pt = this.ctx.transformedPoint(\r\n this.canvas.width / 2,\r\n this.canvas.height / 2\r\n );\r\n // move to origin\r\n this.ctx.translate(pt.x, pt.y);\r\n // calc scale factor so we can fit the whole image on our screen\r\n var factor = Math.min(\r\n this.canvas.height / this.vh,\r\n this.canvas.width / this.vw\r\n );\r\n // perform scaling\r\n this.ctx.scale(factor, factor);\r\n // restore our offset\r\n this.ctx.translate(-pt.x, -pt.y);\r\n }\r\n\r\n draw() {\r\n // nothing to draw if we haven't loaded our meta data yet\r\n if (!this.props.ome || this.canvas === null) return;\r\n\r\n // Clear the entire canvas\r\n var p1 = this.ctx.transformedPoint(0, 0);\r\n var p2 = this.ctx.transformedPoint(this.canvas.width, this.canvas.height);\r\n this.ctx.clearRect(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y);\r\n this.ctx.save();\r\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n this.ctx.restore();\r\n\r\n let lv = 0,\r\n x = 0,\r\n y = 0;\r\n for (let c = 0; c < this.props.histogramConfig.channels.length; c++) {\r\n let channel = this.props.histogramConfig.channels[c];\r\n // skip disabled channels\r\n if (!channel.enabled) continue;\r\n\r\n let page = this.props.getPageForChannel(c)\r\n ? this.props.getPageForChannel(c)\r\n : 0;\r\n\r\n // load image first if missing\r\n let tileId =\r\n page + \",\" + lv + \",\" + x + \",\" + y + \",\" + this.props.fileId;\r\n let img = this.props.tiles.getVisibleImage(tileId);\r\n if (img) {\r\n // image is loaded -> draw it\r\n let img = this.props.tiles.getVisibleImage(tileId);\r\n this.imgLoaded = img.width > 0;\r\n if (this.imgLoaded) {\r\n this.vw = this.props.ome.sizeX;\r\n this.vh = this.props.ome.sizeY;\r\n\r\n let coloredImg = this.props.tiles.getColoredImage(tileId);\r\n\r\n if (coloredImg) {\r\n // composition should be difference for fluorescence\r\n // see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\r\n this.ctx.globalCompositeOperation = \"screen\";\r\n // draw colored image layer\r\n if (\r\n Object.prototype.toString.call(coloredImg) ===\r\n \"[object HTMLCanvasElement]\" &&\r\n this.props.tiles.getColoredImage(tileId)\r\n ) {\r\n this.ctx.drawImage(\r\n coloredImg,\r\n x * this.vw,\r\n y * this.vh,\r\n this.vw,\r\n this.vh\r\n );\r\n }\r\n }\r\n }\r\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n this.zoomOut();\r\n this.initialized = true;\r\n }\r\n }\r\n\r\n let mainCanvas = this.props.canvas;\r\n\r\n let screenX = this.props.position.x / this.props.zoom;\r\n let screenY = this.props.position.y / this.props.zoom;\r\n let screenW = mainCanvas.width / this.props.zoom;\r\n let screenH = mainCanvas.height / this.props.zoom;\r\n\r\n // offset of minimap in view\r\n let offsetX = -this.ctx.getTransform().e / this.ctx.getTransform().a;\r\n let offsetY = -this.ctx.getTransform().f / this.ctx.getTransform().a;\r\n\r\n // back to default overlay composition operation\r\n // see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\r\n this.ctx.globalCompositeOperation = \"source-over\";\r\n\r\n // draw screen region\r\n this.ctx.lineWidth = 2 / this.ctx.getTransform().a;\r\n this.ctx.strokeStyle = this.props.theme.palette.primary.main;\r\n this.ctx.beginPath();\r\n this.ctx.rect(screenX, screenY, screenW, screenH);\r\n this.ctx.moveTo(screenX + screenW / 2, screenY);\r\n this.ctx.lineTo(screenX + screenW / 2, offsetY);\r\n this.ctx.moveTo(screenX + screenW / 2, screenY + screenH);\r\n this.ctx.lineTo(\r\n screenX + screenW / 2,\r\n this.canvas.height / this.ctx.getTransform().a\r\n );\r\n this.ctx.moveTo(offsetX, screenY + screenH / 2);\r\n this.ctx.lineTo(screenX, screenY + screenH / 2);\r\n this.ctx.moveTo(screenX + screenW, screenY + screenH / 2);\r\n this.ctx.lineTo(\r\n this.canvas.width / this.ctx.getTransform().a,\r\n screenY + screenH / 2\r\n );\r\n this.ctx.stroke();\r\n }\r\n\r\n // returns the current zoom scale\r\n getScale() {\r\n return this.ctx.getTransform().a;\r\n }\r\n\r\n // returns position of our image\r\n getPosition() {\r\n return {\r\n x: -this.ctx.getTransform().e,\r\n y: -this.ctx.getTransform().f,\r\n };\r\n }\r\n\r\n getCtx = () => {\r\n let c = this.ctx;\r\n return c;\r\n };\r\n\r\n miniMapMouseEvent = (event) => {\r\n // transform mouse coordinates on screen to relative to minimap componenent coordinates\r\n let x = event.pageX - this.state.x;\r\n let y = event.pageY - this.state.y;\r\n // transform coordinates into world space\r\n let pt = this.ctx.transformedPoint(x, y);\r\n // let renderer navigate to clicked point\r\n this.props.onMoveTo({ x: pt.x, y: pt.y });\r\n this.props.chainMouseMove(x, y, event);\r\n };\r\n\r\n // handle dragging of the minimap region rectangle\r\n mouseDown = (event) => {\r\n this.miniMapMouseEvent(event);\r\n this.dragging = true;\r\n };\r\n\r\n // handle dragging of the minimap region rectangle\r\n mouseMove = (event) => {\r\n if (this.dragging) {\r\n this.miniMapMouseEvent(event);\r\n }\r\n };\r\n\r\n mouseUp = () => {\r\n this.dragging = false;\r\n };\r\n\r\n // zoom event in minimap\r\n mousewheel = (event) => {\r\n let x = event.pageX - this.state.x;\r\n let y = event.pageY - this.state.y;\r\n this.props.zoomMouseWheel(event, x, y);\r\n };\r\n\r\n // drag stop event of minimap\r\n stopEvent = () => {\r\n let bounds = this.root.getBoundingClientRect();\r\n if (this.props.inSideBar) {\r\n bounds.x = 0;\r\n bounds.y = 0;\r\n }\r\n this.setState({ grabbing: false, x: bounds.x, y: bounds.y });\r\n };\r\n\r\n render() {\r\n const { classes, pointerEvents } = this.props;\r\n const { grabbing } = this.state;\r\n\r\n let classToUse = this.props.inSideBar ? classes.rootsideBar : classes.root;\r\n\r\n return (\r\n this.setState({ grabbing: true })}\r\n onStop={this.stopEvent}\r\n >\r\n (this.root = c)}\r\n className={classNames(classToUse, grabbing && classes.grabbing)}\r\n style={{\r\n pointerEvents: pointerEvents ? \"all\" : \"none\",\r\n top: this.props.canvas.height - 175,\r\n zIndex: 9999,\r\n }}\r\n >\r\n {\r\n this.canvas = c;\r\n }}\r\n className={classes.canvas}\r\n onMouseDown={this.mouseDown}\r\n onMouseMove={this.mouseMove}\r\n onMouseUp={this.mouseUp}\r\n />\r\n {!this.props.inSideBar && (\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nMiniMap.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n ome: PropTypes.object,\r\n theme: PropTypes.object,\r\n zoom: PropTypes.number,\r\n onMoveTo: PropTypes.func,\r\n onScaleOnly: PropTypes.func,\r\n position: PropTypes.object,\r\n histogramConfig: PropTypes.object,\r\n canvas: PropTypes.object,\r\n pointerEvents: PropTypes.bool,\r\n inSideBar: PropTypes.bool,\r\n zoomMouseWheel: PropTypes.func,\r\n chainMouseMove: PropTypes.func,\r\n componentRef: PropTypes.func,\r\n // from withTiles\r\n tiles: PropTypes.object,\r\n fileId: PropTypes.string,\r\n getPageForChannel: PropTypes.func,\r\n};\r\n\r\nexport default withTiles(withTheme(withStyles(styles)(MiniMap)));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faLayerGroup } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { IconButton, Slider, TextField, Tooltip } from \"@mui/material\";\r\n\r\nimport {\r\n PlayCircleOutline,\r\n PauseCircleOutline,\r\n ArrowDropUp,\r\n ArrowDropDown,\r\n} from \"@mui/icons-material\";\r\n\r\nconst styles = {\r\n root: {\r\n width: 40,\r\n position: \"absolute\",\r\n top: 70,\r\n bottom: 185,\r\n left: 5,\r\n color: \"#ffffff\",\r\n\r\n padding: 0,\r\n \"& :active\": {\r\n outline: \"\",\r\n },\r\n background: \"#000000AA\",\r\n border: \"2px solid rgb(85, 85, 85)\",\r\n borderRadius: 10,\r\n },\r\n barIcon: {\r\n position: \"absolute\",\r\n left: 0,\r\n top: 4,\r\n height: 26,\r\n width: \"36px!important\",\r\n color: \"#fff\",\r\n },\r\n stepUp: {\r\n position: \"absolute\",\r\n top: 174,\r\n left: 5,\r\n padding: 0,\r\n color: \"#fff\",\r\n },\r\n stepDown: {\r\n position: \"absolute\",\r\n bottom: 32,\r\n left: 5,\r\n padding: 0,\r\n color: \"#fff\",\r\n },\r\n slider: {\r\n position: \"absolute\",\r\n top: 200,\r\n left: 2,\r\n bottom: 58,\r\n },\r\n verticalTextfield: {\r\n position: \"absolute\",\r\n left: 0,\r\n color: \"#fff\",\r\n\r\n \"& div\": {\r\n color: \"#fff\",\r\n marginTop: 4,\r\n width: \"100%\",\r\n },\r\n \"& label\": {\r\n color: \"#fff !important\",\r\n fontSize: 11,\r\n lineHeight: \"14px\",\r\n padding: 0,\r\n width: \"100%\",\r\n textAlign: \"center\",\r\n margin: 0,\r\n left: \"-5px\",\r\n },\r\n \"& input\": {\r\n marginTop: 4,\r\n padding: \"0px 0 0px\",\r\n textAlign: \"center\",\r\n },\r\n \"& .MuiOutlinedInput-input\": {\r\n \"&::-webkit-outer-spin-button, &::-webkit-inner-spin-button\": {\r\n \"-webkit-appearance\": \"none\",\r\n },\r\n },\r\n },\r\n playPauseDown: {\r\n position: \"absolute\",\r\n top: 142,\r\n padding: 5,\r\n color: \"#fff\",\r\n },\r\n playPauseUp: {\r\n position: \"absolute\",\r\n bottom: 0,\r\n padding: 5,\r\n color: \"#fff\",\r\n },\r\n};\r\n\r\nfunction ValueLabelComponent(props) {\r\n const { children, open, value } = props;\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nValueLabelComponent.propTypes = {\r\n children: PropTypes.element.isRequired,\r\n open: PropTypes.bool.isRequired,\r\n value: PropTypes.number.isRequired,\r\n};\r\n\r\nclass ZStackBar extends Component {\r\n render() {\r\n const {\r\n classes,\r\n ome,\r\n z,\r\n minZ,\r\n maxZ,\r\n zsr,\r\n onStep,\r\n onChangeZ,\r\n onChangeZValue,\r\n onChangeZSr,\r\n playing,\r\n playDirection,\r\n onPlayPause,\r\n pointerEvents,\r\n } = this.props;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n onChangeZValue(\r\n Math.max(\r\n 0,\r\n Math.min(ome.sizeZ - 1, parseInt(e.target.value, 10))\r\n )\r\n )\r\n }\r\n />\r\n \r\n \r\n {\r\n onChangeZSr(Math.max(1, parseInt(e.target.value, 10)));\r\n }}\r\n />\r\n \r\n \r\n playDirection > 0\r\n ? onPlayPause(true, -1)\r\n : onPlayPause(!playing, -1)\r\n }\r\n size=\"large\"\r\n >\r\n {playing && playDirection < 0 ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n onStep(1)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n
    \r\n \r\n
    \r\n onStep(-1)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n 0 ? \"rotate(0deg)\" : \"rotate(-90deg)\",\r\n }}\r\n onClick={() =>\r\n playDirection > 0 ? onPlayPause(!playing, 1) : onPlayPause(true, 1)\r\n }\r\n size=\"large\"\r\n >\r\n {playing && playDirection > 0 ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nZStackBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n ome: PropTypes.object,\r\n playing: PropTypes.bool,\r\n playDirection: PropTypes.number,\r\n z: PropTypes.number,\r\n minZ: PropTypes.number,\r\n maxZ: PropTypes.number,\r\n onStep: PropTypes.func,\r\n onChangeZSr: PropTypes.func,\r\n onChangeZValue: PropTypes.func,\r\n zsr: PropTypes.number,\r\n onChangeZ: PropTypes.func,\r\n onPlayPause: PropTypes.func,\r\n pointerEvents: PropTypes.bool,\r\n};\r\n\r\nexport default withStyles(styles)(ZStackBar);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faInfo } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { Typography } from \"@mui/material\";\r\n\r\nconst styles = {\r\n root: {\r\n pointerEvents: \"none\",\r\n width: \"auto\",\r\n maxWidth: \"600px\",\r\n height: 46,\r\n\r\n position: \"absolute\",\r\n top: 10,\r\n left: 5,\r\n color: \"#ffffff\",\r\n\r\n padding: 0,\r\n \"& :active\": {\r\n outline: \"\",\r\n },\r\n background: \"#000000AA\",\r\n border: \"2px solid rgb(85, 85, 85)\",\r\n borderRadius: 10,\r\n zIndex: 9999,\r\n },\r\n barIcon: {\r\n position: \"absolute\",\r\n top: -1,\r\n left: 2,\r\n height: 42,\r\n width: \"36px!important\",\r\n padding: 8,\r\n color: \"#ffffff\",\r\n },\r\n infoArea: {\r\n paddingLeft: \"40px\",\r\n paddingRight: \"10px\",\r\n right: 0,\r\n top: 0,\r\n bottom: 0,\r\n color: \"#fff\",\r\n },\r\n};\r\n\r\nclass ImageInfo extends Component {\r\n render() {\r\n const { classes, ome } = this.props;\r\n\r\n return (\r\n
    \r\n \r\n {ome && (\r\n
    \r\n \r\n {ome.fileName}{\" \"}\r\n {ome.sizeS > 1 && , Scene {ome.scene + 1}}\r\n \r\n \r\n Size: {ome.sizeX}x{ome.sizeY}\r\n \r\n
    \r\n )}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nImageInfo.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n ome: PropTypes.object,\r\n};\r\n\r\nexport default withStyles(styles)(ImageInfo);\r\n","import { IconButton, Tooltip } from \"@mui/material\";\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport classNames from \"classnames\";\r\nimport {\r\n faRuler,\r\n faStopwatch,\r\n faLayerGroup,\r\n faInfo,\r\n faTable,\r\n faInfoCircle,\r\n} from \"@fortawesome/free-solid-svg-icons\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { UnfoldMore, LinearScale, Map } from \"@mui/icons-material\";\r\n\r\nclass ToggleButton extends Component {\r\n static defaultProps = {\r\n disabled: false,\r\n };\r\n\r\n render() {\r\n const { title, name, value, icon, onToggle, classes, disabled } =\r\n this.props;\r\n\r\n return (\r\n \r\n \r\n (disabled ? {} : onToggle(name))}\r\n size=\"small\"\r\n disabled={disabled}\r\n >\r\n {icon === \"MapIcon\" && (\r\n \r\n )}\r\n {icon === \"faInfoCircle\" && }\r\n {icon === \"faRuler\" && }\r\n {icon === \"faStopwatch\" && }\r\n {icon === \"faLayerGroup\" && }\r\n {icon === \"faInfo\" && }\r\n {icon === \"LinearScaleIcon\" && (\r\n \r\n )}\r\n {icon === \"faTable\" && }\r\n {icon === \"UnfoldMore\" && (\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nToggleButton.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n title: PropTypes.string,\r\n key: PropTypes.string,\r\n value: PropTypes.bool,\r\n icon: PropTypes.string,\r\n onToggle: PropTypes.func,\r\n name: PropTypes.string,\r\n disabled: PropTypes.bool,\r\n};\r\n\r\nexport default ToggleButton;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nconst PersistentStorageContext = React.createContext();\r\n\r\nexport const withPersistentStorage = (Component) => {\r\n const WrappedComponent = (props) => (\r\n \r\n {(context) => }\r\n \r\n );\r\n\r\n WrappedComponent.displayName = `withPersistentStorage(${\r\n Component.displayName || Component.name || \"Component\"\r\n })`;\r\n\r\n return WrappedComponent;\r\n};\r\n\r\n// this is the main component, it has to be added at the root of the app.\r\n// all components that use withPersistentStorage(...) will have access to it via this.props.persistentStorage...\r\nclass PersistentStorageProvider extends Component {\r\n constructor(props) {\r\n super(props);\r\n this._isMounted = false;\r\n const loadedProjectState = JSON.parse(\r\n localStorage.getItem(this.props.projectId)\r\n );\r\n this.projectState = loadedProjectState ? loadedProjectState : {};\r\n this.projectTypeState = null;\r\n }\r\n\r\n save(key, value) {\r\n let v = JSON.stringify(value);\r\n let stateObject = { ...this.projectState }; //copy whole state for saving\r\n stateObject[key] = v;\r\n localStorage.setItem(this.props.projectId, JSON.stringify(stateObject));\r\n this.projectState[key] = v;\r\n }\r\n\r\n load(key) {\r\n if (typeof this.projectState[key] === \"string\") {\r\n try {\r\n return JSON.parse(this.projectState[key]);\r\n } catch (e) {\r\n return this.projectState[key];\r\n }\r\n } else {\r\n return this.projectState[key];\r\n }\r\n }\r\n\r\n saveProjectTypeValue(projectType, key, value) {\r\n let v = JSON.stringify(value);\r\n let stateObject = { ...this.projectTypeState }; //copy whole state for saving\r\n stateObject[key] = v;\r\n localStorage.setItem(\"local_\" + projectType, JSON.stringify(stateObject));\r\n this.projectState[key] = v;\r\n }\r\n\r\n loadProjectTypeValue(projectType, key) {\r\n if (this.projectTypeState == null) {\r\n this.projectTypeState = JSON.parse(\r\n localStorage.getItem(\"local_\" + projectType)\r\n );\r\n }\r\n if (this.projectTypeState == null) return null;\r\n if (typeof this.projectTypeState[key] === \"string\") {\r\n try {\r\n return JSON.parse(this.projectTypeState[key]);\r\n } catch (e) {\r\n return this.projectTypeState[key];\r\n }\r\n } else {\r\n return this.projectTypeState[key];\r\n }\r\n }\r\n\r\n loadAll() {\r\n let stateObject = {};\r\n for (const [key, value] of Object.entries(this.projectState)) {\r\n try {\r\n stateObject[key] = JSON.parse(value);\r\n } catch (e) {\r\n stateObject[key] = value;\r\n }\r\n }\r\n return stateObject;\r\n }\r\n\r\n render() {\r\n return (\r\n this.save(key, value),\r\n saveProjectTypeValue: (projectType, key, value) =>\r\n this.saveProjectTypeValue(projectType, key, value),\r\n load: (key) => this.load(key),\r\n loadProjectTypeValue: (projectType, key) =>\r\n this.loadProjectTypeValue(projectType, key),\r\n loadAll: () => this.loadAll(),\r\n }}\r\n >\r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nPersistentStorageProvider.propTypes = {\r\n projectId: PropTypes.string,\r\n children: PropTypes.element.isRequired,\r\n};\r\n\r\nexport default PersistentStorageProvider;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nconst ResultTabContext = React.createContext();\r\n\r\nexport const withResultTab = (Component) => {\r\n const WrappedComponent = ({ ...propsWithoutClasses }) => (\r\n \r\n {(context) => }\r\n \r\n );\r\n\r\n WrappedComponent.displayName = `withResultTab(${\r\n Component.displayName || Component.name || \"Component\"\r\n })`;\r\n\r\n return WrappedComponent;\r\n};\r\n\r\n// this is the main component, it has to be added at the root of the app.\r\n// all components that use withResultTab(...) will have access to it via this.props.resultTab...\r\nclass ResultTabProvider extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.selectedRoi = 0;\r\n this.selectedChildIndex = 1;\r\n this.selectedStructure = 0;\r\n this.changeFile = false;\r\n this.hundredTiles = false;\r\n this.rendererInitialized = false;\r\n this.rendererCanvas = null;\r\n this.rendererCtx = null;\r\n this.zoomLevelFixed = false;\r\n this.gridExists = false;\r\n this.resetPressed = false;\r\n this.selSampleSet = false;\r\n this.fileChange = false;\r\n }\r\n\r\n getSelectedRoi() {\r\n return this.selectedRoi;\r\n }\r\n\r\n setSelectedRoi(a) {\r\n this.selectedRoi = a;\r\n }\r\n\r\n getSelectedChildIndex() {\r\n return this.selectedChildIndex;\r\n }\r\n\r\n setSelectedChildIndex(a) {\r\n this.selectedChildIndex = a;\r\n }\r\n\r\n getSelectedStructure() {\r\n return this.selectedStructure;\r\n }\r\n\r\n setSelectedStructure(a) {\r\n this.selectedStructure = a;\r\n }\r\n\r\n getChangeFile() {\r\n return this.changeFile;\r\n }\r\n\r\n setChangeFile(a) {\r\n this.changeFile = a;\r\n }\r\n\r\n getHundredTiles() {\r\n return this.hundredTiles;\r\n }\r\n\r\n setHundredTiles(a) {\r\n this.hundredTiles = a;\r\n }\r\n\r\n getRendererInitialized() {\r\n return this.rendererInitialized;\r\n }\r\n\r\n setRendererInitialized(a) {\r\n this.rendererInitialized = a;\r\n }\r\n\r\n getRendererCanvas() {\r\n return this.rendererCanvas;\r\n }\r\n\r\n setRendererCanvas(a) {\r\n this.rendererCanvas = a;\r\n }\r\n\r\n getRendererCtx() {\r\n return this.rendererCtx;\r\n }\r\n\r\n setRendererCtx(a) {\r\n this.rendererCtx = a;\r\n }\r\n\r\n // returns position of our image\r\n getPosition = () => {\r\n return {\r\n x: -this.rendererCtx.getTransform().e,\r\n y: -this.rendererCtx.getTransform().f,\r\n };\r\n };\r\n\r\n // returns the current zoom scale\r\n getScale = () => {\r\n return this.rendererCtx ? this.rendererCtx.getTransform().a : 1;\r\n };\r\n\r\n /**\r\n * Is the current zoom level be fixed?\r\n * @returns {bool} Is the current zoom level fixed?\r\n */\r\n getZoomLevelFixed() {\r\n return this.zoomLevelFixed;\r\n }\r\n\r\n /**\r\n * Toggle the state of zoomLevelFixed.\r\n */\r\n toggleZoomLevelFixed() {\r\n this.zoomLevelFixed = !this.zoomLevelFixed;\r\n }\r\n\r\n /**\r\n * Set the attribute zoomLevelFixed to true or false.\r\n * @param {bool} value Should the zoom be fixed?\r\n */\r\n setZoomLevelFixed(value) {\r\n this.zoomLevelFixed = value;\r\n }\r\n\r\n getGridExists() {\r\n return this.gridExists;\r\n }\r\n\r\n setGridExists(a) {\r\n this.gridExists = a;\r\n }\r\n\r\n getResetPressed() {\r\n return this.resetPressed;\r\n }\r\n\r\n setResetPressed(a) {\r\n this.resetPressed = a;\r\n }\r\n\r\n getSelSampleSet() {\r\n return this.selSampleSet;\r\n }\r\n\r\n setSelSampleSet(a) {\r\n this.selSampleSet = a;\r\n }\r\n\r\n getFileChange() {\r\n return this.fileChange;\r\n }\r\n\r\n setFileChange(a) {\r\n this.fileChange = a;\r\n }\r\n\r\n render() {\r\n return (\r\n this.getSelectedRoi(),\r\n setSelectedRoi: (a) => this.setSelectedRoi(a),\r\n getSelectedChildIndex: () => this.getSelectedChildIndex(),\r\n setSelectedChildIndex: (a) => this.setSelectedChildIndex(a),\r\n getSelectedStructure: () => this.getSelectedStructure(),\r\n setSelectedStructure: (a) => this.setSelectedStructure(a),\r\n getChangeFile: () => this.getChangeFile(),\r\n setChangeFile: (a) => this.setChangeFile(a),\r\n getHundredTiles: () => this.getHundredTiles(),\r\n setHundredTiles: (a) => this.setHundredTiles(a),\r\n getRendererInitialized: () => this.getRendererInitialized(),\r\n setRendererInitialized: (a) => this.setRendererInitialized(a),\r\n getRendererCanvas: () => this.getRendererCanvas(),\r\n setRendererCanvas: (a) => this.setRendererCanvas(a),\r\n getRendererCtx: () => this.getRendererCtx(),\r\n setRendererCtx: (a) => this.setRendererCtx(a),\r\n getPosition: () => this.getPosition(),\r\n getScale: () => this.getScale(),\r\n getZoomLevelFixed: () => this.getZoomLevelFixed(),\r\n toggleZoomLevelFixed: () => this.toggleZoomLevelFixed(),\r\n setZoomLevelFixed: (a) => this.setZoomLevelFixed(a),\r\n getGridExists: () => this.getGridExists(),\r\n setGridExists: (a) => this.setGridExists(a),\r\n getResetPressed: () => this.getResetPressed(),\r\n setResetPressed: (a) => this.setResetPressed(a),\r\n getSelSampleSet: () => this.getSelSampleSet(),\r\n setSelSampleSet: (a) => this.setSelSampleSet(a),\r\n getFileChange: () => this.getFileChange(),\r\n setFileChange: (a) => this.setFileChange(a),\r\n }}\r\n >\r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nResultTabProvider.propTypes = {\r\n children: PropTypes.element.isRequired,\r\n};\r\n\r\nexport default ResultTabProvider;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n CircularProgress,\r\n IconButton,\r\n LinearProgress,\r\n Tooltip,\r\n Fade,\r\n Popper,\r\n Paper,\r\n} from \"@mui/material\";\r\nimport { trackTransforms, getBaseLog } from \"../viewer/utils/CanvasUtil\";\r\nimport {\r\n configureImage,\r\n colorInImage,\r\n} from \"../viewer/utils/RendererUtils\";\r\nimport Backend from \"../common/utils/Backend\";\r\nimport ScaleBar from \"../viewer/components/ScaleBar\";\r\nimport ZoomBar from \"../viewer/components/ZoomBar\";\r\nimport MiniMap from \"../viewer/components/MiniMap\";\r\nimport ZStackBar from \"../viewer/components/ZStackBar\";\r\nimport ImageInfo from \"../viewer/components/ImageInfo\";\r\nimport ToggleButton from \"../viewer/components/ToggleButton\";\r\nimport \"react-resizable/css/styles.css\";\r\n\r\nimport { withPersistentStorage } from \"../viewer/contexts/PersistentStorageContext\";\r\nimport { withTiles } from \"../viewer/contexts/TilesContext\";\r\nimport { withResultTab } from \"../viewer/contexts/ResultTabContext\";\r\nimport { ViewQuilt } from \"@mui/icons-material\";\r\nimport KeyboardArrowLeftIcon from \"@mui/icons-material/KeyboardArrowLeft\";\r\nimport KeyboardArrowRightIcon from \"@mui/icons-material/KeyboardArrowRight\";\r\n\r\n// debug flags\r\nconst FPS = false;\r\n\r\nconst styles = {\r\n canvas: {\r\n position: \"relative\",\r\n display: \"block\",\r\n width: \"100%\",\r\n backgroundColor: \"#D3D3D3\",\r\n },\r\n\r\n root: {\r\n height: \"100%\",\r\n },\r\n\r\n heatmapContainer: {\r\n pointerEvents: \"none\",\r\n position: \"absolute !important\",\r\n zIndex: \"9998\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n },\r\n\r\n toolbarButtonRoot: {\r\n color: \"#666\",\r\n position: \"absolute\",\r\n top: 5,\r\n right: 35,\r\n zIndex: 100,\r\n },\r\n toolbarButtonRootSingle: {\r\n color: \"#666\",\r\n position: \"absolute\",\r\n top: 5,\r\n right: 5,\r\n zIndex: 100,\r\n },\r\n toolbarButton: {\r\n position: \"relative\",\r\n display: \"inline-block\",\r\n\r\n width: 40,\r\n height: 40,\r\n padding: 8,\r\n margin: 0,\r\n },\r\n toolbarButtonIcon: {\r\n verticalAlign: \"-4px\",\r\n },\r\n toolbarButtonChecked: {\r\n width: 40,\r\n color: \"#0673C1\",\r\n },\r\n progress: {\r\n position: \"absolute\",\r\n margin: -20,\r\n left: \"50%\",\r\n top: \"50%\",\r\n zIndex: 1000,\r\n },\r\n fps: {\r\n position: \"absolute\",\r\n right: 50,\r\n top: 50,\r\n color: \"white\",\r\n fontSize: 20,\r\n pointerEvents: \"none\",\r\n },\r\n resizableContainer: {\r\n \"& .react-resizable-handle\": {\r\n pointerEvents: \"all\",\r\n },\r\n \"& .react-resizable-handle-se::before\": {\r\n content: \"''\",\r\n display: \"block\",\r\n position: \"absolute\",\r\n bottom: 3,\r\n right: 3,\r\n width: 6,\r\n height: 6,\r\n borderBottom: \"1px solid #0673c1\",\r\n borderRight: \"1px solid #0673c1\",\r\n },\r\n },\r\n fileNavLeftBtn: {\r\n position: \"absolute\",\r\n left: 5,\r\n top: \"50%\",\r\n marginTop: \"-40px\",\r\n \"& svg\": {\r\n fontSize: \"80px\",\r\n },\r\n },\r\n fileNavRightBtn: {\r\n position: \"absolute\",\r\n right: 5,\r\n top: \"50%\",\r\n marginTop: \"-40px\",\r\n \"& svg\": {\r\n fontSize: \"80px\",\r\n },\r\n },\r\n};\r\n\r\nNumber.prototype.toBase = function (base) {\r\n var symbols =\r\n \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\".split(\"\");\r\n var decimal = this;\r\n var conversion = \"\";\r\n\r\n if (base > symbols.length || base <= 1) {\r\n return false;\r\n }\r\n\r\n while (decimal >= 1) {\r\n conversion =\r\n symbols[decimal - base * Math.floor(decimal / base)] + conversion;\r\n decimal = Math.floor(decimal / base);\r\n }\r\n\r\n return base < 11 ? parseInt(conversion) : conversion;\r\n};\r\n\r\nconst debounce = (func, delay) => {\r\n let inDebounce;\r\n return function () {\r\n const context = this;\r\n const args = arguments;\r\n clearTimeout(inDebounce);\r\n inDebounce = setTimeout(() => func.apply(context, args), delay);\r\n };\r\n};\r\n\r\nclass Renderer extends Component {\r\n _isMounted = false;\r\n\r\n constructor(props) {\r\n super(props);\r\n // transmit context to componentRef\r\n if (props.componentRef) props.componentRef(this);\r\n\r\n this.state = {\r\n previewWidth: 100,\r\n previewHeight: 100,\r\n dragStart: null,\r\n isDrawing: false,\r\n mouseOnCanvas: false,\r\n ome: props.ome,\r\n initialized: false,\r\n initializedZ: false,\r\n initialScale: 1,\r\n tMin: 0,\r\n tMax: 0,\r\n t: 0,\r\n z: Math.floor(props.ome.sizeZ / 2),\r\n minZ: 0,\r\n maxZ: props.ome.sizeZ - 1,\r\n fps: 0,\r\n // time playback\r\n sr: 60,\r\n // z playback\r\n zsr: 60,\r\n bufferSize: 100,\r\n playing: false,\r\n playingZ: false,\r\n playDirection: 1,\r\n playDirectionZ: 1,\r\n miniMapKey: 0,\r\n // tools\r\n rois: [],\r\n selectedROI: null,\r\n limitVisibleRegions: false,\r\n layerTrees: [],\r\n previewRectChanged: false,\r\n isBrightfield:\r\n props.ome &&\r\n props.ome.channels.length === 1 &&\r\n props.ome.channels[0].type === \"brightfield\",\r\n scaleBarData: null,\r\n startY: 0,\r\n showMiniMap: true,\r\n showObjectIdx: false,\r\n miniMapReady: false,\r\n open: false,\r\n anchorEl: null,\r\n displayTimeBar: false,\r\n displayZStackBar: false,\r\n showScaleBar: true,\r\n showTimeBar: false,\r\n showZStackBar: false,\r\n showImageInfo: true,\r\n showZoomBar: true,\r\n showResultTable: false,\r\n showFileNavButtons: false,\r\n hideMiniMap: false,\r\n };\r\n this.updateCounter = 0;\r\n this.visibleRegionsLimit = 3000;\r\n this.visibleRegionsRadius = 1000;\r\n this.structureRegionLimits = [];\r\n this.slowestStructureIdx = -1;\r\n this.fastestStructureIdx = -1;\r\n this.fileIdStateData = {};\r\n\r\n this.lineIdx = 0;\r\n this.keepRendering = true;\r\n\r\n this.lastMoveTime = performance.now();\r\n\r\n this.selROI = null;\r\n window.setNewSelRoi = this.setNewSelRoi;\r\n window.getMousePositionInImage = this.getMousePositionInImage;\r\n window.setZoomLevelForGridSize = this.setZoomLevelForGridSize;\r\n\r\n // frontend cached alpha channel images\r\n this.visibleImage = [];\r\n // frontend cached colored images\r\n this.coloredImages = [];\r\n\r\n this.hMat = [];\r\n this.imgRegistered = true;\r\n this.callbackCounter = 0;\r\n\r\n this.oldVisibleRegionCount = 0;\r\n\r\n this.gridTileCount = 0;\r\n\r\n // fps history to smooth fps counter update\r\n this.lastFps = Array.from(Array(10), () => 60);\r\n\r\n this.createBackgroundPattern();\r\n this.tempLayer = null;\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n createBackgroundPattern = () => {\r\n this.backgroundPattern = document.createElement(\"canvas\");\r\n const patternContext = this.backgroundPattern.getContext(\"2d\");\r\n\r\n // Give the pattern a width and height of 50\r\n const w = 30;\r\n const h = 30;\r\n this.backgroundPattern.width = w;\r\n this.backgroundPattern.height = h;\r\n\r\n // Give the pattern a background color and draw an arc\r\n patternContext.fillStyle = \"transparent\";\r\n patternContext.strokeStyle = \"#999\";\r\n patternContext.fillRect(0, 0, w, h);\r\n patternContext.lineWidth = 1;\r\n patternContext.moveTo(-w / 2, h);\r\n patternContext.lineTo(w, -h / 2);\r\n patternContext.moveTo(0, h + h / 2);\r\n patternContext.lineTo(w + w / 2, 0);\r\n patternContext.stroke();\r\n };\r\n\r\n componentDidMount = () => {\r\n this._isMounted = true;\r\n let stateObject = {};\r\n this.canvas = document.getElementById(this.props.canvasId);\r\n\r\n // get drawing context from canvas\r\n this.ctx = this.canvas.getContext(\"2d\");\r\n\r\n // bind mouse wheel events\r\n this.canvas.addEventListener(\"DOMMouseScroll\", this.mousewheel, true);\r\n this.canvas.addEventListener(\"mousewheel\", this.mousewheel, {\r\n passive: false,\r\n });\r\n // bind mouse events\r\n window.addEventListener(\"mouseup\", this.mouseup, { passive: true });\r\n window.addEventListener(\"mousemove\", this.mousemove, { passive: true });\r\n\r\n // extend context with some fancy additional transformation methods\r\n trackTransforms(this.ctx);\r\n\r\n // converts the relative size css information into an absolute size which we can access\r\n this.canvas.width = this.canvas.offsetWidth;\r\n this.canvas.height = this.canvas.offsetHeight;\r\n\r\n // initialize position\r\n stateObject.lastX = this.canvas.width / 2;\r\n stateObject.lastY = this.canvas.height / 2;\r\n\r\n this.t0 = performance.now();\r\n\r\n let loadObject = [\r\n \"hideMiniMap\",\r\n \"showObjectIdx\",\r\n \"showMiniMap\",\r\n \"showScaleBar\",\r\n \"showTimeBar\",\r\n \"showZStackBar\",\r\n \"showImageInfo\",\r\n \"showZoomBar\",\r\n \"showResultTable\",\r\n \"showFileNavButtons\",\r\n ];\r\n\r\n let i = null;\r\n if (this.props.showFullscreen) {\r\n loadObject.forEach((element) => {\r\n i = this.props.persistentStorage.load(element + \"Full\");\r\n if (i === true || i === false) stateObject[element] = i;\r\n });\r\n } else {\r\n loadObject.forEach((element) => {\r\n i = this.props.persistentStorage.load(element);\r\n if (i === true || i === false) stateObject[element] = i;\r\n });\r\n }\r\n\r\n stateObject[\"displayTimeBar\"] = this.props.displayTimeBar;\r\n stateObject[\"displayZStackBar\"] = this.props.displayZStackBar;\r\n stateObject[\"showZStackBar\"] = this.props.showZStackBar;\r\n // stateObject[\"showTimeBar\"] = this.props.showTimeBar;\r\n\r\n this.setMountedState(stateObject, () => {\r\n this.checkMiniMapVisivility();\r\n });\r\n //set mouse postition to center of canvas\r\n this.mousePos = this.getMousePositionInImage();\r\n this.draw();\r\n };\r\n\r\n componentDidUpdate(prevProps, prevState) {\r\n const oldFileId = prevProps.fileId;\r\n const newFileId = this.props.fileId;\r\n\r\n // on file change => reset renderer cache\r\n if (oldFileId && oldFileId !== newFileId) {\r\n this.fileIdStateData[oldFileId] = prevState;\r\n\r\n if (this.fileIdStateData[newFileId]) {\r\n this.setMountedState(this.fileIdStateData[newFileId]);\r\n }\r\n\r\n setTimeout(() => this.zoomFit(), 100);\r\n this.setMountedState({\r\n miniMapKey: new Date().getTime(),\r\n });\r\n }\r\n }\r\n\r\n componentWillUnmount = () => {\r\n this._isMounted = false;\r\n // unbind mouse wheel events\r\n this.canvas.removeEventListener(\"DOMMouseScroll\", this.mousewheel);\r\n this.canvas.removeEventListener(\"mousewheel\", this.mousewheel);\r\n // unbind mouse events\r\n window.removeEventListener(\"mouseup\", this.mouseup, { passive: true });\r\n window.removeEventListener(\"mousemove\", this.mousemove, { passive: true });\r\n this.keepRendering = false;\r\n };\r\n\r\n reset = () => {\r\n // resets renderer to initial state\r\n //TODO: adapt for Splitscreen, so that not all frames are reseted\r\n this.props.tiles.clearTiles();\r\n // frontend cached alpha channel images\r\n this.props.tiles.setVisibleImage([]);\r\n // frontend cached colored images\r\n this.props.tiles.setColoredImages([]);\r\n\r\n this.setMountedState({\r\n dragStart: null,\r\n playing: false,\r\n //initialized: false,\r\n });\r\n\r\n this.loadAllTiles();\r\n // this.props.setChangingFile(false);\r\n //this.props.setAIObjects();\r\n };\r\n\r\n getPage = (c, z, t) => {\r\n // calculate page index from coordinates\r\n return (\r\n Math.round(t) * this.props.ome.channels.length * this.props.ome.sizeZ +\r\n c * this.props.ome.sizeZ +\r\n Math.round(z)\r\n );\r\n };\r\n\r\n getPageForChannel = (c) => {\r\n // calculate page index from coordinates\r\n return (\r\n Math.round(this.state.t) *\r\n this.props.ome.channels.length *\r\n this.props.ome.sizeZ +\r\n Math.round(this.state.z) * this.props.ome.channels.length +\r\n c\r\n );\r\n };\r\n\r\n getMousePosition = () => {\r\n return [this.mousePosition.mouseX, this.mousePosition.mouseY];\r\n };\r\n\r\n getMousePositionInImage = () => {\r\n let x = this.props.getMousePosition()[0];\r\n let y = this.props.getMousePosition()[1];\r\n this.lastX = x - this.canvas.getBoundingClientRect().left;\r\n this.lastY = y - this.canvas.getBoundingClientRect().top; //- this.canvas.offsetTop\r\n // calculate mouse position in image coordinates\r\n let p1 = this.getPointInCanvas({\r\n x: this.lastX,\r\n y: this.lastY,\r\n });\r\n let p2 = this.getPointInCanvas({ x: 0, y: 0 });\r\n let p3 = this.getPosition();\r\n\r\n p1.x += p2.x - p3.x / this.getScale();\r\n p1.y += p2.y - p3.y / this.getScale();\r\n\r\n return p1;\r\n };\r\n\r\n getPositionInImage = (position) => {\r\n // calculate corner points top left (position==0), bottom right (position==1), center (position==2)\r\n let X;\r\n let Y;\r\n if (position === 0) {\r\n // top left\r\n X = this.canvas.getBoundingClientRect().left;\r\n Y = this.canvas.getBoundingClientRect().top; //64 - this.canvas.offsetTop + 32; // 32 is half of blue header\r\n } else if (position === 1) {\r\n // bottom right\r\n X = this.canvas.getBoundingClientRect().right;\r\n Y = this.canvas.getBoundingClientRect().bottom;\r\n //- this.canvas.offsetTop + 32; // 32 is half of blue header\r\n } else {\r\n // center\r\n X =\r\n (this.canvas.getBoundingClientRect().left +\r\n this.canvas.getBoundingClientRect().right) /\r\n 2;\r\n Y =\r\n (this.canvas.getBoundingClientRect().top +\r\n this.canvas.getBoundingClientRect().bottom) /\r\n 2;\r\n //+32; // 32 is half of blue header\r\n }\r\n\r\n // calculate mouse position in image coordinates\r\n let p1 = this.getPointInCanvas({\r\n x: X - this.canvas.getBoundingClientRect().left,\r\n y: Y - this.canvas.getBoundingClientRect().top,\r\n });\r\n let p2 = this.getPointInCanvas({ x: 0, y: 0 });\r\n let p3 = this.getPosition();\r\n p1.x += p2.x - p3.x / this.getScale();\r\n p1.y += p2.y - p3.y / this.getScale();\r\n\r\n return p1;\r\n };\r\n\r\n getPointInCanvasCoord = (x, y) => {\r\n let pt = {\r\n x: Math.round(x * this.ctx.getTransform().a + this.ctx.getTransform().e),\r\n y: Math.round(y * this.ctx.getTransform().d + this.ctx.getTransform().f),\r\n };\r\n return pt;\r\n };\r\n\r\n getPointInCanvas = (p) => {\r\n try {\r\n let tp = this.ctx.transformedPoint(p.x, p.y);\r\n return {\r\n x: tp.x,\r\n y: tp.y,\r\n };\r\n } catch (ex) {\r\n // Skip this frame\r\n // console.error(ex);\r\n return {\r\n x: -1,\r\n y: -1,\r\n };\r\n }\r\n };\r\n\r\n mousedown = (event) => {\r\n let p1 = this.getMousePositionInImage();\r\n this.mousePos = p1;\r\n this.props.tiles.chainLeaderId = this.props.canvasId;\r\n\r\n // start dragging if middle mouse button is down or not tool selected\r\n if (event.button === 1 || event.button === 0) {\r\n let dragStart = this.getPointInCanvas({ x: this.lastX, y: this.lastY });\r\n this.setMountedState({\r\n dragStart: dragStart,\r\n });\r\n if (this.props.isChained) {\r\n if (this.props.showFullscreen) {\r\n for (const value of Object.values(this.props.splitscreenFileIds)) {\r\n let fDragStart = this.props.rendererDict[\r\n \"Full\" + value\r\n ].getPointInCanvas({\r\n x: this.lastX,\r\n y: this.lastY,\r\n });\r\n this.props.rendererDict[\"Full\" + value].setMountedState({\r\n dragStart: fDragStart,\r\n });\r\n }\r\n } else {\r\n for (const value of Object.values(this.props.chainListFileIds)) {\r\n let fDragStart = this.props.rendererDict[value].getPointInCanvas({\r\n x: this.lastX,\r\n y: this.lastY,\r\n });\r\n this.props.rendererDict[value].setMountedState({\r\n dragStart: fDragStart,\r\n });\r\n }\r\n }\r\n }\r\n\r\n this.canvas.style.cursor = \"move\";\r\n\r\n if ((event.button === 0 || event.button === 1) && event.altKey) {\r\n this.tempChainToggle = true;\r\n\r\n if (this.props.showFullscreen) {\r\n // this.props.fsChain();\r\n console.log(\"fsChain\");\r\n } else {\r\n this.props.onChangeChain(\r\n false,\r\n this.props.splitscreenIdx,\r\n this.props.fileId\r\n );\r\n }\r\n }\r\n\r\n // dont forward any event upwards\r\n event.preventDefault();\r\n return false;\r\n } else {\r\n if (!this.state.isDrawing) {\r\n this.setMountedState({ isDrawing: true });\r\n }\r\n }\r\n };\r\n\r\n mouseBusy = () => {\r\n return !this.canvas.style.cursor !== \"default\";\r\n };\r\n\r\n mousemove = () => {\r\n //event\r\n // if (this.props.resultTab.getZoomLevelFixed()) {\r\n // return;\r\n // }\r\n let p1 = this.getMousePositionInImage();\r\n if (this.state.isDrawing || this.state.mouseOnCanvas) {\r\n this.mousePos = p1;\r\n } else {\r\n this.middleMousePos();\r\n }\r\n if (this.dragROI) {\r\n // handle roi dragging\r\n this.dragROI.drag(p1, this.vw, this.vh);\r\n } else if (this.resizeROI) {\r\n // resize the roi if inside the image\r\n this.resizeROI.resize(p1, this.vw, this.vh);\r\n } else if (\r\n this.state.dragStart &&\r\n this.props.tiles.chainLeaderId === this.props.canvasId\r\n ) {\r\n // handle canvas dragging\r\n let pt = this.getPointInCanvas({ x: this.lastX, y: this.lastY });\r\n // translate canvas\r\n\r\n this.ctx.translate(\r\n pt.x - this.state.dragStart.x,\r\n pt.y - this.state.dragStart.y\r\n );\r\n if (this.props.isChained) {\r\n if (this.props.showFullscreen) {\r\n for (const value of Object.values(this.props.splitscreenFileIds)) {\r\n let fPt = this.props.rendererDict[\"Full\" + value].getPointInCanvas({\r\n x: this.lastX,\r\n y: this.lastY,\r\n });\r\n this.props.rendererDict[\"Full\" + value].chainMouseDrag(\r\n fPt.x,\r\n fPt.y\r\n );\r\n }\r\n } else {\r\n for (const value of Object.values(this.props.chainListFileIds)) {\r\n let fPt = this.props.rendererDict[value].getPointInCanvas({\r\n x: this.lastX,\r\n y: this.lastY,\r\n });\r\n this.props.rendererDict[value].chainMouseDrag(fPt.x, fPt.y);\r\n }\r\n }\r\n }\r\n this.zoomMoveActionDebounced();\r\n }\r\n\r\n this.lastMoveTime = performance.now();\r\n };\r\n\r\n chainMouseDrag = (x, y) => {\r\n if (this.props.tiles.chainLeaderId !== this.props.canvasId) {\r\n if (this.props.isChained) {\r\n this.ctx.translate(\r\n x - this.state.dragStart.x,\r\n y - this.state.dragStart.y\r\n );\r\n }\r\n }\r\n };\r\n\r\n mouseEnter = () => {\r\n this.setMountedState({ mouseOnCanvas: true });\r\n };\r\n\r\n mouseLeave = () => {\r\n this.setMountedState({ mouseOnCanvas: false });\r\n };\r\n\r\n middleMousePos = () => {\r\n let p1 = this.getPointInCanvas({ x: 0, y: 0 });\r\n let p2 = this.getPointInCanvas({\r\n x: this.canvas.width,\r\n y: this.canvas.height,\r\n });\r\n let centerX = p1.x + (p2.x - p1.x) / 2;\r\n let centerY = p1.y + (p2.y - p1.y) / 2;\r\n this.mousePos = { x: centerX, y: centerY };\r\n };\r\n\r\n mouseup = () => {\r\n // event\r\n let p1 = this.getMousePositionInImage();\r\n this.mousePos = p1;\r\n\r\n // stop dragging the canvas\r\n if (this.state.dragStart) {\r\n this.setMountedState({ dragStart: null });\r\n this.canvas.style.cursor = \"default\";\r\n }\r\n\r\n // stop dragging a roi\r\n if (this.dragROI) {\r\n this.dragROI.handleMouseUp();\r\n this.dragROI = null;\r\n }\r\n\r\n if (this.tempChainToggle) {\r\n this.tempChainToggle = false;\r\n if (this.props.showFullscreen) {\r\n // this.props.fsChain();\r\n console.log(\"fsChain\");\r\n } else {\r\n this.props.onChangeChain(\r\n true,\r\n this.props.splitscreenIdx,\r\n this.props.fileId\r\n );\r\n }\r\n }\r\n\r\n // update view\r\n this.forceUpdate();\r\n };\r\n\r\n onScaleOnly = (event) => {\r\n let delta = 0;\r\n\r\n if (event.wheelDelta) {\r\n /* IE/Opera. */\r\n delta = -(event.wheelDelta / 120);\r\n } else if (event.detail) {\r\n /* Mozilla */\r\n delta = event.detail / 3;\r\n }\r\n\r\n if (delta) {\r\n // zoom in (1) or out (-1)\r\n this.zoomDirection = delta < 0 ? 1 : -1;\r\n\r\n // set destination scale value\r\n let newZoom = this.getScale() * Math.pow(2, this.zoomDirection);\r\n\r\n // max zoom out value\r\n this.zoomValueOut = (0.75 * this.canvas.height) / this.vh;\r\n\r\n if ((0.75 * this.canvas.width) / this.vw < this.zoomValueOut) {\r\n this.zoomValueOut = (0.75 * this.canvas.width) / this.vw;\r\n }\r\n\r\n if (this.props.isActive === false && this.props.isChained) {\r\n this.zoomValueOut = this.props.showFullscreen\r\n ? this.props.rendererDict[\"Full\" + this.props.activeFileId]\r\n .zoomValueOut\r\n : this.props.rendererDict[this.props.activeFileId].zoomValueOut;\r\n }\r\n\r\n if (newZoom < this.zoomValueOut) {\r\n newZoom = this.zoomValueOut;\r\n }\r\n\r\n // Limit maximum zoom in value\r\n const maxZoomIn = 32;\r\n newZoom = newZoom > maxZoomIn ? maxZoomIn : newZoom;\r\n\r\n this.zoomTo = newZoom;\r\n // redraw ui\r\n this.forceUpdate();\r\n }\r\n\r\n // prevent other scroll actions\r\n if (event.preventDefault) {\r\n event.preventDefault();\r\n }\r\n event.returnValue = false;\r\n };\r\n\r\n mousewheel = (event) => {\r\n // save zoom destination point\r\n this.props.tiles.chainLeaderId = this.props.canvasId;\r\n if (\r\n this.state.initialized &&\r\n !event.ctrlKey\r\n // &&!this.props.resultTab.getZoomLevelFixed()\r\n ) {\r\n this.zoomPoint = {\r\n x: this.lastX,\r\n y: this.lastY, // - this.canvas.getBoundingClientRect().top,\r\n };\r\n this.onScaleOnly(event);\r\n }\r\n\r\n if (this.props.isChained) {\r\n if (this.props.showFullscreen) {\r\n for (const value of Object.values(this.props.splitscreenFileIds)) {\r\n this.props.rendererDict[\"Full\" + value].chainMousewheel(\r\n event,\r\n this.zoomPoint\r\n );\r\n }\r\n } else {\r\n for (const value of Object.values(this.props.chainListFileIds)) {\r\n this.props.rendererDict[value].chainMousewheel(event, this.zoomPoint);\r\n }\r\n }\r\n }\r\n event.preventDefault();\r\n };\r\n\r\n chainMousewheel = (event, leaderZoomPoint) => {\r\n // save zoom destination point\r\n if (this.props.tiles.chainLeaderId !== this.props.canvasId) {\r\n if (this.props.isChained) {\r\n if (\r\n this.state.initialized &&\r\n !event.ctrlKey &&\r\n !event.shiftKey\r\n // &&!this.props.resultTab.getZoomLevelFixed()\r\n ) {\r\n this.zoomPoint = leaderZoomPoint;\r\n this.onScaleOnly(event);\r\n }\r\n }\r\n event.preventDefault();\r\n } else return;\r\n };\r\n\r\n miniMapZoom = (event, x, y) => {\r\n this.props.tiles.chainLeaderId = this.props.canvasId;\r\n if (\r\n this.state.initialized &&\r\n !event.ctrlKey\r\n // &&!this.props.resultTab.getZoomLevelFixed()\r\n ) {\r\n let ctx = this.miniMapRef.getCtx();\r\n let tpt = ctx.transformedPoint(x, y);\r\n let pt = {\r\n x: tpt.x * this.ctx.getTransform().a + this.ctx.getTransform().e,\r\n y: tpt.y * this.ctx.getTransform().d + this.ctx.getTransform().f,\r\n };\r\n pt.x = Math.round(pt.x);\r\n pt.y = Math.round(pt.y);\r\n if (\r\n pt.x < this.canvas.width &&\r\n pt.x > 0 &&\r\n pt.y < this.canvas.height &&\r\n pt.y > 0\r\n ) {\r\n this.zoomPoint = pt;\r\n } else {\r\n return;\r\n }\r\n this.onScaleOnly(event);\r\n }\r\n if (this.props.isChained) {\r\n let l = this.props.showFullscreen\r\n ? this.props.splitscreenFileIds\r\n : this.props.chainListFileIds;\r\n for (const value of Object.values(l)) {\r\n if (value !== this.props.fileId) {\r\n let r = this.props.showFullscreen\r\n ? this.props.rendererDict[\"Full\" + value]\r\n : this.props.rendererDict[value];\r\n let c = r.miniMapRef.getCtx();\r\n let p = c.transformedPoint(x, y);\r\n let pt = {\r\n x: p.x * r.ctx.getTransform().a + r.ctx.getTransform().e,\r\n y: p.y * r.ctx.getTransform().d + r.ctx.getTransform().f,\r\n };\r\n pt.x = Math.round(pt.x);\r\n pt.y = Math.round(pt.y);\r\n if (\r\n pt.x < r.canvas.width &&\r\n pt.x > 0 &&\r\n pt.y < r.canvas.height &&\r\n pt.y > 0\r\n ) {\r\n r.zoomPoint = pt;\r\n } else {\r\n return;\r\n }\r\n r.chainMousewheel(event, pt);\r\n }\r\n }\r\n }\r\n event.preventDefault();\r\n };\r\n\r\n // returns the current zoom scale\r\n getScale = () => {\r\n return this.ctx ? this.ctx.getTransform().a : 1;\r\n };\r\n\r\n // returns position of our image\r\n getPosition = () => {\r\n return {\r\n x: -this.ctx.getTransform().e,\r\n y: -this.ctx.getTransform().f,\r\n };\r\n };\r\n\r\n // zoom out to show the whole image\r\n zoomOut = () => {\r\n // center image first\r\n let pt = this.getPointInCanvas({\r\n x: (this.canvas.width - this.vw) / 2,\r\n y: (this.canvas.height - this.vh) / 2,\r\n });\r\n this.ctx.translate(pt.x, pt.y);\r\n // calc our transformation offset\r\n pt = this.getPointInCanvas({\r\n x: this.canvas.width / 2,\r\n y: this.canvas.height / 2,\r\n });\r\n // move to origin\r\n this.ctx.translate(pt.x, pt.y);\r\n // calc scale factor so we can fit the whole image on our screen\r\n let factor = Math.min(\r\n this.canvas.height / this.vh,\r\n this.canvas.width / this.vw\r\n );\r\n // perform scaling\r\n this.ctx.scale(factor, factor);\r\n // restore our offset\r\n this.ctx.translate(-pt.x, -pt.y);\r\n // save initial scale into our state\r\n this.setMountedState({\r\n initialized: true,\r\n initialScale: factor,\r\n });\r\n // this.props.resultTab.setRendererInitialized(true);\r\n };\r\n\r\n moveTo = (e) => {\r\n // get curent position (center of screen) and transform into world coordinates\r\n let pt = this.getPointInCanvas({\r\n x: this.canvas.width / 2,\r\n y: this.canvas.height / 2,\r\n });\r\n // translate by the offset to the destination point\r\n this.ctx.translate(-(e.x - pt.x), -(e.y - pt.y));\r\n // redraw screen\r\n this.forceUpdate();\r\n this.zoomMoveAction();\r\n };\r\n\r\n chainMoveTo = (x, y) => {\r\n // get curent position (center of screen) and transform into world coordinates\r\n let pt = this.getPointInCanvas({\r\n x: this.canvas.width / 2,\r\n y: this.canvas.height / 2,\r\n });\r\n // translate by the offset to the destination point\r\n this.ctx.translate(-(x - pt.x), -(y - pt.y));\r\n // redraw screen\r\n this.forceUpdate();\r\n this.zoomMoveAction();\r\n };\r\n\r\n chainMouseMove = (x, y, e) => {\r\n if (this.props.isChained) {\r\n if (this.props.showFullscreen) {\r\n for (const value of Object.values(this.props.splitscreenFileIds)) {\r\n if (value !== this.props.fileId) {\r\n let ctx =\r\n this.props.rendererDict[\"Full\" + value].miniMapRef.getCtx();\r\n let pt = ctx.transformedPoint(x, y);\r\n this.props.rendererDict[\"Full\" + value].chainMoveTo(pt.x, pt.y, e);\r\n }\r\n }\r\n } else {\r\n for (const value of Object.values(this.props.chainListFileIds)) {\r\n if (value !== this.props.fileId) {\r\n let ctx = this.props.rendererDict[value].miniMapRef.getCtx();\r\n let pt = ctx.transformedPoint(x, y);\r\n this.props.rendererDict[value].chainMoveTo(pt.x, pt.y, e);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n pushColoredImage = (c, tileId, visImg) => {\r\n let channel = this.props.histogramConfig.channels[c];\r\n if (\r\n (this.props.histogramConfig.channels.length < 2 &&\r\n channel.color === \"#ffffff\") ||\r\n channel.color === -1\r\n ) {\r\n // rgb channel\r\n if (!this.props.tiles.getColoredImage(tileId)) {\r\n let colImg = configureImage(visImg, channel);\r\n this.props.tiles.pushColoredImages(colImg, tileId);\r\n // this.pushRegTile(tileId, visImg, channel);\r\n }\r\n } else {\r\n // colored images cache\r\n if (!this.props.tiles.getColoredImage(tileId) && visImg.width > 0) {\r\n let colImg = colorInImage(visImg, channel);\r\n this.props.tiles.pushColoredImages(colImg, tileId);\r\n // this.pushRegTile(tileId, visImg, channel);\r\n }\r\n }\r\n };\r\n\r\n loadAllTiles = () => {\r\n for (let lv = 0; lv < Math.min(2, this.props.ome.maxLevel + 1); lv++) {\r\n // calculate the number of grid columns for this level\r\n let cols = Math.pow(2, lv);\r\n for (let x = 0; x < cols; x++) {\r\n for (let y = 0; y < cols; y++) {\r\n for (let c = 0; c < this.props.ome.channels.length; c++) {\r\n let page = this.getPageForChannel(c);\r\n // load image first if missing\r\n let tileId =\r\n page + \",\" + lv + \",\" + x + \",\" + y + \",\" + this.props.fileId;\r\n if (!this.props.tiles.getVisibleImage(tileId)) {\r\n let visImg = new Image();\r\n visImg.src = Backend.renderRegion({\r\n id: this.props.fileId,\r\n page: page,\r\n lv: lv,\r\n x: x,\r\n y: y,\r\n });\r\n visImg.onload = () => {\r\n this.pushColoredImage(c, tileId, visImg);\r\n this.props.tiles.pushVisibleImage(visImg, tileId);\r\n // set context width and height\r\n this.props.tiles.setImgWidth(visImg.width);\r\n this.props.tiles.setImgHeight(visImg.height);\r\n };\r\n } else if (this.props.tiles.getVisibleImage(tileId).complete) {\r\n // set context width and height\r\n let img = this.props.tiles.getVisibleImage(tileId);\r\n this.props.tiles.setImgWidth(img.width);\r\n this.props.tiles.setImgHeight(img.height);\r\n this.pushColoredImage(\r\n c,\r\n tileId,\r\n this.props.tiles.getVisibleImage(tileId)\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.preloadNextFrames();\r\n\r\n // this.props.changeHiConfig(true);\r\n this.props.tiles.setHistogramConfig(this.props.histogramConfig);\r\n };\r\n\r\n preloadNextFrames = () => {\r\n if (this.state.playDirection > 0) {\r\n for (\r\n let t = this.state.t;\r\n t <\r\n Math.min(\r\n this.props.ome.sizeT - 1,\r\n this.state.t + this.state.bufferSize\r\n );\r\n t++\r\n ) {\r\n this.preloadFrame(this.state.z, t);\r\n }\r\n } else {\r\n for (\r\n let t = this.state.t;\r\n t >= Math.max(0, this.state.t - this.state.bufferSize);\r\n t--\r\n ) {\r\n this.preloadFrame(this.state.z, t);\r\n }\r\n }\r\n };\r\n\r\n preloadNextZFrames = () => {\r\n if (this.state.playDirectionZ > 0) {\r\n for (\r\n let z = this.state.z;\r\n z <\r\n Math.min(\r\n this.props.ome.sizeZ - 1,\r\n this.state.z + this.state.bufferSize\r\n );\r\n z++\r\n ) {\r\n this.preloadFrame(z, this.state.t);\r\n }\r\n } else {\r\n for (\r\n let z = this.state.z;\r\n z >= Math.max(0, this.state.z - this.state.bufferSize);\r\n z--\r\n ) {\r\n this.preloadFrame(z, this.state.t);\r\n }\r\n }\r\n };\r\n\r\n preloadFrame = (z, t) => {\r\n for (let lv = 0; lv < 1; lv++) {\r\n // calculate the number of grid columns for this level\r\n let cols = Math.pow(2, lv);\r\n for (let x = 0; x < cols; x++) {\r\n for (let y = 0; y < cols; y++) {\r\n for (let c = 0; c < this.props.ome.channels.length; c++) {\r\n let page = this.getPage(c, z, t);\r\n // load image first if missing\r\n let tileId =\r\n page + \",\" + lv + \",\" + x + \",\" + y + \",\" + this.props.fileId;\r\n if (!this.props.tiles.getVisibleImage(tileId)) {\r\n let visImg = new Image();\r\n visImg.src = Backend.renderRegion({\r\n id: this.props.fileId,\r\n page: page,\r\n lv: lv,\r\n x: x,\r\n y: y,\r\n });\r\n visImg.onload = () => {\r\n this.pushColoredImage(c, tileId, visImg);\r\n };\r\n } else if (this.props.tiles.getVisibleImage(tileId).complete) {\r\n this.pushColoredImage(\r\n c,\r\n tileId,\r\n this.props.tiles.getVisibleImage(tileId)\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n zoomToFactor = (factor) => {\r\n let scaleTarget = this.state.initialScale * factor;\r\n this.zoomTo = scaleTarget;\r\n this.zoomPoint = { x: this.canvas.width / 2, y: this.canvas.height / 2 };\r\n this.zoomDirection =\r\n this.getScale() < scaleTarget ? scaleTarget : -scaleTarget;\r\n\r\n setTimeout(() => this.forceUpdate(), 10);\r\n };\r\n\r\n zoomOriginal = () => {\r\n this.zoomOneToN(1);\r\n };\r\n\r\n zoomOneToN = (x) => {\r\n this.zoomTo = x;\r\n this.zoomPoint = { x: this.canvas.width / 2, y: this.canvas.height / 2 };\r\n this.zoomDirection = this.getScale() < x ? 1 : -1;\r\n\r\n setTimeout(() => this.forceUpdate(), 10);\r\n };\r\n\r\n zoomDelta = (delta) => {\r\n // zoom middle\r\n this.zoomPoint = { x: this.canvas.width / 2, y: this.canvas.height / 2 };\r\n // zoom in (1) or out (-1)\r\n this.zoomDirection = delta < 0 ? 1 : -1;\r\n\r\n // set destination scale value\r\n let newZoom = this.getScale() * Math.pow(1.2, this.zoomDirection);\r\n\r\n // max zoom out value\r\n if (newZoom < (0.75 * this.canvas.height) / this.vh) {\r\n newZoom = (0.75 * this.canvas.height) / this.vh;\r\n }\r\n\r\n // max zoom in value\r\n if (newZoom > (2 * this.vh) / this.canvas.height) {\r\n newZoom = (2 * this.vh) / this.canvas.height;\r\n }\r\n\r\n this.zoomTo = newZoom;\r\n\r\n // redraw ui\r\n this.forceUpdate();\r\n };\r\n\r\n zoomFit = () => {\r\n this.canvasTranform(1, 0, 0, 1, 0, 0);\r\n this.zoomOut();\r\n this.zoomMoveActionDebounced(); //to save zoomObject\r\n };\r\n\r\n /**\r\n * Performs a context.setTransform, whilst ensuring that the pixel\r\n * representation is according to zoomlevel\r\n * @param {*} a Horizontal scaling. A value of 1 results in no scaling.\r\n * @param {*} b Vertical skewing.\r\n * @param {*} c Horizontal skewing.\r\n * @param {*} d Vertical scaling. A value of 1 results in no scaling.\r\n * @param {*} e Horizontal translation (moving).\r\n * @param {*} f Vertical translation (moving).\r\n */\r\n canvasTranform = (a, b, c, d, e, f) => {\r\n // disable smoothing to see pixels of image\r\n if (this.getScale() > 5) {\r\n this.ctx.imageSmoothingEnabled = false;\r\n } else {\r\n this.ctx.imageSmoothingEnabled = true;\r\n }\r\n // Actual transformation\r\n this.ctx.setTransform(a, b, c, d, e, f);\r\n };\r\n\r\n // triggered by moving or zooming\r\n zoomMoveAction = () => {\r\n const p1 = this.getPointInCanvas({ x: 0, y: 0 });\r\n const p2 = this.getPointInCanvas({\r\n x: this.canvas.width,\r\n y: this.canvas.height,\r\n });\r\n // save current zoom and position for reload\r\n const zoomObject = {\r\n zoomRoi: true,\r\n zoomLeft: p1.x,\r\n zoomRight: p1.x + p2.x - p1.x,\r\n zoomTop: p1.y,\r\n zoomBottom: p1.y + p2.y - p1.y,\r\n };\r\n if (!this.props.showFullscreen) {\r\n this.props.persistentStorage.save(\r\n \"zoomObjectFV\" + this.props.fileId,\r\n zoomObject\r\n );\r\n }\r\n };\r\n\r\n zoomMoveActionDebounced = debounce(this.zoomMoveAction, 100);\r\n\r\n updateZ = (z, minZ = this.state.minZ, maxZ = this.state.maxZ) => {\r\n this.setMountedState({ z: z, minZ: minZ, maxZ: maxZ });\r\n this.props.updateGlobalZ(z, minZ, maxZ);\r\n };\r\n\r\n updateT = (t) => {\r\n this.setMountedState({ t: t });\r\n this.props.updateGlobalT(t);\r\n };\r\n\r\n drawVisibleImage = () => {\r\n // calc deltatime for animations and fps\r\n let t1 = performance.now();\r\n let dt = t1 - this.t0;\r\n this.t0 = t1;\r\n\r\n // calc smoothed fps\r\n this.lastFps.pop();\r\n this.lastFps = [1000 / dt, ...this.lastFps];\r\n this.fps = Math.round(\r\n this.lastFps.reduce((acc, val) => (acc += val)) / this.lastFps.length\r\n );\r\n if (FPS) {\r\n this.setMountedState({\r\n fps: this.fps,\r\n });\r\n }\r\n\r\n // time playback\r\n if (this.state.playing) {\r\n let newT =\r\n this.state.t + (dt / 60000) * this.state.sr * this.state.playDirection;\r\n if (newT >= this.props.ome.sizeT) {\r\n newT = 0;\r\n } else if (newT < 0) {\r\n newT = this.props.ome.sizeT - 0.001;\r\n }\r\n this.updateT(newT);\r\n this.preloadNextFrames();\r\n }\r\n\r\n // time playback\r\n if (this.state.playingZ) {\r\n let newZ =\r\n this.state.z +\r\n (dt / 60000) * this.state.zsr * this.state.playDirectionZ;\r\n if (newZ > this.props.ome.sizeZ - 1) {\r\n newZ = 0;\r\n } else if (newZ < 0) {\r\n newZ = this.props.ome.sizeZ - 1;\r\n } else {\r\n newZ = newZ < 0 ? this.props.ome.sizeZ - 1 : newZ;\r\n }\r\n this.updateZ(newZ);\r\n this.preloadNextZFrames();\r\n }\r\n\r\n // nothing to draw if we haven't loaded our meta data yet\r\n if ((!this.props.ome || !this.canvas) && this.keepRendering) {\r\n // request next animation frame\r\n requestAnimationFrame(() => this.draw());\r\n return;\r\n }\r\n\r\n // call the initialization if the viewer is not initalized yet\r\n if (!this.state.initialized) {\r\n // do we have our top region already loaded? (then -> this.vw is greater 0)\r\n if (this.imgLoaded && this.imgRegistered) {\r\n // do initial placement\r\n this.zoomOut();\r\n } else {\r\n this.loadAllTiles();\r\n }\r\n }\r\n\r\n // only set z once\r\n if (!this.state.initializedZ) {\r\n let z = this.props.persistentStorage.load(\"z\");\r\n if (typeof z === \"undefined\") {\r\n z = Math.floor(this.props.ome.sizeZ / 2);\r\n }\r\n let minZ = this.props.persistentStorage.load(\"minZ\");\r\n if (typeof minZ === \"undefined\") {\r\n minZ = 0;\r\n }\r\n let maxZ = this.props.persistentStorage.load(\"maxZ\");\r\n if (typeof maxZ === \"undefined\") {\r\n maxZ = this.props.ome.sizeZ - 1;\r\n }\r\n this.updateZ(z, minZ, maxZ);\r\n this.props.tiles.setZLevel(Math.floor(this.props.ome.sizeZ / 2));\r\n this.setMountedState({\r\n minZ,\r\n maxZ,\r\n initializedZ: true,\r\n });\r\n }\r\n\r\n if (this.zoomTo) {\r\n if (typeof this.zoomPoint === \"undefined\") {\r\n this.zoomPoint = { x: this.lastX, y: this.lastY };\r\n }\r\n if (this.zoomDirection > 0 && this.getScale() < this.zoomTo) {\r\n // zoom in\r\n // calc our transformation offset\r\n let pt = this.getPointInCanvas({\r\n x: this.zoomPoint.x,\r\n y: this.zoomPoint.y,\r\n });\r\n\r\n this.ctx.translate(pt.x, pt.y);\r\n // calc scale factor (zoom per second)\r\n let factor = Math.pow(20, 40 / 1000);\r\n // perform scaling\r\n this.ctx.scale(factor, factor);\r\n if (this.getScale() > this.zoomTo) {\r\n this.canvasTranform(\r\n this.zoomTo,\r\n this.ctx.getTransform().b,\r\n this.ctx.getTransform().c,\r\n this.zoomTo,\r\n this.ctx.getTransform().e,\r\n this.ctx.getTransform().f\r\n );\r\n }\r\n // restore our offset\r\n this.ctx.translate(-pt.x, -pt.y);\r\n // update screen, update scalebar etc\r\n // this.updatePreviewRect(this.props.activeTool);\r\n this.zoomMoveActionDebounced();\r\n } else if (this.zoomDirection < 0 && this.getScale() > this.zoomTo) {\r\n // zoom out\r\n // calc our transformation offset\r\n let pt = this.getPointInCanvas({\r\n x: this.zoomPoint.x,\r\n y: this.zoomPoint.y,\r\n });\r\n this.ctx.translate(pt.x, pt.y);\r\n // calc scale factor (zoom per second)\r\n let factor = Math.pow(20, -40 / 1000);\r\n // perform scaling\r\n this.ctx.scale(factor, factor);\r\n\r\n if (this.getScale() < this.zoomTo) {\r\n this.canvasTranform(\r\n this.zoomTo,\r\n this.ctx.getTransform().b,\r\n this.ctx.getTransform().c,\r\n this.zoomTo,\r\n this.ctx.getTransform().e,\r\n this.ctx.getTransform().f\r\n );\r\n }\r\n // restore our offset\r\n this.ctx.translate(-pt.x, -pt.y);\r\n // update screen, update scalebar etc\r\n\r\n // this.updatePreviewRect(this.props.activeTool);\r\n this.zoomMoveActionDebounced();\r\n } else {\r\n // we reached the destination zoom level\r\n this.zoomTo = null;\r\n }\r\n }\r\n\r\n // get world size from ome metadata\r\n this.vw = this.props.ome.sizeX;\r\n this.vh = this.props.ome.sizeY;\r\n\r\n // Clear the entire canvas\r\n let p1 = this.getPointInCanvas({ x: 0, y: 0 });\r\n let p2 = this.getPointInCanvas({\r\n x: this.canvas.width,\r\n y: this.canvas.height,\r\n });\r\n this.ctx.clearRect(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y);\r\n this.ctx.save();\r\n this.canvasTranform(1, 0, 0, 1, 0, 0);\r\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n this.ctx.restore();\r\n\r\n this.ctx.fillStyle = \"#000\";\r\n this.ctx.fillRect(0, 0, this.vw, this.vh);\r\n\r\n // get pyramid level based on scaling\r\n this.level = getBaseLog(2, (this.getScale() / this.state.initialScale) * 2);\r\n // clip our level at lower bound\r\n if (this.level < 0 || this.level === Infinity) {\r\n this.level = 0;\r\n }\r\n // clip our level at upper bound\r\n if (this.level > this.props.ome.maxLevel) {\r\n this.level = this.props.ome.maxLevel;\r\n }\r\n\r\n let lv = Math.floor(this.level);\r\n\r\n // calculate the number of grid columns for this level\r\n let cols = Math.pow(2, lv);\r\n\r\n // get visbile column indices\r\n let visX = [];\r\n for (let i = 0; i < cols; i++) {\r\n if (\r\n this.getPosition().x / this.getScale() < this.vw * ((i + 1) / cols) &&\r\n (this.getPosition().x + this.canvas.width) / this.getScale() >\r\n this.vw * (i / cols)\r\n ) {\r\n visX.push(i);\r\n }\r\n }\r\n // out of bounds, add first region\r\n if (visX.length === 0) visX.push(0);\r\n\r\n // get visbile row indices\r\n let visY = [];\r\n for (let i = 0; i < cols; i++) {\r\n if (\r\n this.getPosition().y / this.getScale() < this.vh * ((i + 1) / cols) &&\r\n (this.getPosition().y + this.canvas.height) / this.getScale() >\r\n this.vh * (i / cols)\r\n ) {\r\n visY.push(i);\r\n }\r\n }\r\n // out of bounds, add first region\r\n if (visY.length === 0) visY.push(0);\r\n\r\n for (let x of visX) {\r\n for (let y of visY) {\r\n //let page = this.getPage();\r\n //for(let page = 0; page < this.props.histogramConfig.channels.length; page++) {\r\n for (let c = 0; c < this.props.histogramConfig.channels.length; c++) {\r\n let page = this.getPageForChannel(c);\r\n let channel = this.props.histogramConfig.channels[c];\r\n\r\n // skip disabled channels\r\n if (!channel.enabled) continue;\r\n // file +tile id im string\r\n // load image first if missing\r\n let tileId =\r\n page + \",\" + lv + \",\" + x + \",\" + y + \",\" + this.props.fileId;\r\n if (\r\n this.zoomTo == null &&\r\n !this.props.tiles.getVisibleImage(tileId) &&\r\n !this.state.isLoadingTiles &&\r\n !this.props.changingFile\r\n /// TODO: Commented out to fix splitscreen, why has it been added originally?\r\n //&& this.props.tiles.getFileId() === this.props.fileId\r\n ) {\r\n let visImg = new Image();\r\n visImg.src = Backend.renderRegion({\r\n id: this.props.fileId,\r\n page: page,\r\n lv: lv,\r\n x: x,\r\n y: y,\r\n });\r\n this.props.tiles.pushVisibleImage(visImg, tileId);\r\n }\r\n\r\n let img = this.props.tiles.getVisibleImage(tileId);\r\n this.imgLoaded = img && img.complete;\r\n // see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\r\n const compositionModeFluor = \"screen\";\r\n const compositionModeBrightfield = \"lighter\";\r\n if (this.imgLoaded && this.imgRegistered) {\r\n // image is loaded -> draw it\r\n this.pushColoredImage(c, tileId, img);\r\n\r\n if (\r\n tileId.includes(this.props.activeFileId) &&\r\n (this.props.tiles.getImgWidth() !== img.width ||\r\n this.props.tiles.getImgHeight() !== img.height)\r\n ) {\r\n // set context width and height (for splitscreen and gallery)\r\n this.props.tiles.setImgWidth(img.width);\r\n this.props.tiles.setImgHeight(img.height);\r\n }\r\n\r\n // composition should be screen for fluorescence\r\n if (this.props.ome.channels[c].type === \"fluorescence\") {\r\n this.ctx.globalCompositeOperation = compositionModeFluor;\r\n } else {\r\n this.ctx.globalCompositeOperation = compositionModeBrightfield;\r\n }\r\n if (\r\n Object.prototype.toString.call(\r\n this.props.tiles.getColoredImage(tileId)\r\n ) === \"[object HTMLCanvasElement]\" &&\r\n this.props.tiles.getColoredImage(tileId)\r\n ) {\r\n // draw colored image layer\r\n this.ctx.drawImage(\r\n this.props.tiles.getColoredImage(tileId),\r\n (x * this.vw) / cols,\r\n (y * this.vh) / cols,\r\n this.vw / cols,\r\n this.vh / cols\r\n );\r\n }\r\n } else {\r\n // draw image of previus pyramid level instead\r\n let factor = 1;\r\n let parentlv = lv;\r\n while (parentlv > 0) {\r\n parentlv--;\r\n factor *= 2;\r\n // get id of that image\r\n tileId =\r\n page +\r\n \",\" +\r\n parentlv +\r\n \",\" +\r\n Math.floor(x / factor) +\r\n \",\" +\r\n Math.floor(y / factor) +\r\n \",\" +\r\n this.props.fileId;\r\n\r\n // image is loaded -> draw it\r\n let imgOld = this.props.tiles.getVisibleImage(tileId);\r\n\r\n if (imgOld && imgOld.complete) {\r\n this.pushColoredImage(c, tileId, imgOld);\r\n\r\n // composition should be screen for fluorescence\r\n // see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\r\n this.ctx.globalCompositeOperation = compositionModeFluor;\r\n // draw colored image layer\r\n if (this.props.tiles.getColoredImage(tileId)) {\r\n this.ctx.drawImage(\r\n this.props.tiles.getColoredImage(tileId),\r\n ((x % factor) * imgOld.width) / factor,\r\n ((y % factor) * imgOld.height) / factor,\r\n imgOld.width / factor,\r\n imgOld.height / factor,\r\n (x * this.vw) / cols,\r\n (y * this.vh) / cols,\r\n this.vw / cols,\r\n this.vh / cols\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // back to default overlay composition operation\r\n // see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\r\n this.ctx.globalCompositeOperation = \"source-over\";\r\n };\r\n\r\n draw = () => {\r\n this.drawVisibleImage();\r\n\r\n let p2 = this.getPointInCanvas({\r\n x: this.canvas.width,\r\n y: this.canvas.height,\r\n });\r\n\r\n this.ctx.globalAlpha = 1.0;\r\n // draw scale bar\r\n if (this.state.showScaleBar && this.state.scaleBarData) {\r\n this.ctx.beginPath();\r\n this.ctx.strokeStyle = this.state.isBrightfield ? \"black\" : \"white\";\r\n const scaleFactor = 1 / this.ctx.getTransform().a;\r\n this.ctx.lineWidth = 3 * scaleFactor;\r\n const marginRight = 5 * scaleFactor;\r\n const marginBottom = 14 * scaleFactor;\r\n const scaleWidth = (this.state.scaleBarData.width - 2) * scaleFactor;\r\n const stopLineHeight = 16 * scaleFactor;\r\n const maxScaleWidth = this.state.scaleBarData.maxScaleWidth * scaleFactor;\r\n const delta = {\r\n x: this.state.scaleBarData.x * scaleFactor,\r\n y: this.state.scaleBarData.y * scaleFactor,\r\n };\r\n const center = {\r\n x: p2.x - marginRight - maxScaleWidth / 2 + delta.x,\r\n y: p2.y - marginBottom + delta.y,\r\n };\r\n this.ctx.moveTo(center.x - scaleWidth / 2, center.y);\r\n this.ctx.lineTo(center.x - scaleWidth / 2, center.y - stopLineHeight / 2);\r\n this.ctx.lineTo(center.x - scaleWidth / 2, center.y + stopLineHeight / 2);\r\n this.ctx.lineTo(center.x - scaleWidth / 2, center.y);\r\n this.ctx.lineTo(center.x + scaleWidth / 2, center.y);\r\n this.ctx.lineTo(center.x + scaleWidth / 2, center.y - stopLineHeight / 2);\r\n this.ctx.lineTo(center.x + scaleWidth / 2, center.y + stopLineHeight / 2);\r\n this.ctx.stroke();\r\n\r\n const fontSize = 14 * scaleFactor;\r\n const fontMargin = 6 * scaleFactor;\r\n this.ctx.fillStyle = this.state.isBrightfield ? \"black\" : \"white\";\r\n this.ctx.font = \"bold \" + fontSize + \"px Arial\";\r\n this.ctx.globalAlpha = 1.0;\r\n this.ctx.textAlign = \"center\";\r\n this.ctx.textBaseline = \"bottom\";\r\n this.ctx.fillText(\r\n this.state.scaleBarData.label,\r\n center.x,\r\n center.y - fontMargin\r\n );\r\n }\r\n\r\n // check if tiles are still loading from server\r\n let isLoadingTiles = false;\r\n for (let tileId in this.props.tiles.getVisibleImages()) {\r\n if (this.props.tiles.getVisibleImage(tileId).complete === false) {\r\n isLoadingTiles = true;\r\n break;\r\n }\r\n }\r\n if (isLoadingTiles !== this.state.isLoadingTiles) {\r\n let nowTime = performance.now();\r\n this.setMountedState(\r\n {\r\n isLoadingTiles: isLoadingTiles,\r\n nowTime: nowTime,\r\n },\r\n () => {}\r\n );\r\n }\r\n\r\n // request next animation frame\r\n if (this.keepRendering) {\r\n requestAnimationFrame(() => this.draw());\r\n }\r\n };\r\n\r\n setZoomLevelForGridSize = (gridSize) => {\r\n // make initial zoomlevel\r\n this.zoomFit();\r\n // zoom in that tile is size of viewer\r\n this.ctx.scale(gridSize, gridSize);\r\n };\r\n\r\n updateFLChannels = (e) => {\r\n this.props.tiles.setHistogramConfig(e);\r\n\r\n this.setMountedState({ histogramConfig: e });\r\n\r\n // invalidate all cached coloring images\r\n this.props.tiles.setColoredImages([]);\r\n\r\n this.loadAllTiles();\r\n };\r\n\r\n onPlayPause = (e, dir) => {\r\n this.setMountedState({ playing: e, playingZ: false, playDirection: dir });\r\n };\r\n\r\n onPlayPauseZ = (e, dir) => {\r\n this.setMountedState({ playingZ: e, playing: false, playDirectionZ: dir });\r\n };\r\n\r\n onSeek = (e, v) => {\r\n this.updateT(v);\r\n };\r\n\r\n onChangeT = (e) => {\r\n this.updateT(e);\r\n };\r\n\r\n onChangeZValue = (z, minZ = this.state.minZ, maxZ = this.state.maxZ) => {\r\n this.updateZ(z, minZ, maxZ);\r\n this.props.tiles.setZLevel(z);\r\n this.props.persistentStorage.save(\"z\", z); //remember for use after project reload or reopen\r\n this.props.persistentStorage.save(\"minZ\", minZ); //remember for use after project reload or reopen\r\n this.props.persistentStorage.save(\"maxZ\", maxZ); //remember for use after project reload or reopen\r\n };\r\n\r\n onChangeZ = (e, v) => {\r\n let minZ = v[0];\r\n let z = v[1];\r\n let maxZ = v[2];\r\n this.onChangeZValue(z, minZ, maxZ);\r\n };\r\n\r\n onChangeSr = (e) => {\r\n this.setMountedState({ sr: e });\r\n };\r\n\r\n onChangeZSr = (e) => {\r\n this.setMountedState({ zsr: e });\r\n };\r\n\r\n onStep = (e) => {\r\n this.updateT(\r\n Math.min(this.props.ome.sizeT - 1, Math.max(0, this.state.t + e))\r\n );\r\n };\r\n\r\n onStepZ = (e) => {\r\n let zLevel = Math.min(\r\n this.props.ome.sizeZ - 1,\r\n Math.max(0, this.state.z + e)\r\n );\r\n this.onChangeZValue(zLevel);\r\n };\r\n\r\n onToggle = (key) => {\r\n let keyExtender = key.startsWith(\"show\") ? \"\" : this.props.fileId;\r\n //e.g. \"showMiniMap\", true\r\n if (this.props.showFullscreen) {\r\n this.props.persistentStorage.save(\r\n key + \"Full\" + keyExtender,\r\n !this.state[key]\r\n );\r\n } else {\r\n this.props.persistentStorage.save(key + keyExtender, !this.state[key]);\r\n }\r\n this.setMountedState({ [key]: !this.state[key] });\r\n };\r\n\r\n getLayoutElement = (key) => {\r\n //used to get e.g. \"showMiniMap\" via rendererRef\r\n return this.state[key];\r\n };\r\n\r\n checkMiniMapVisivility = () => {\r\n const { hideMiniMap, showMiniMap } = this.state;\r\n const hideMiniMapThresholdWidth = 600;\r\n const hideMiniMapThresholdHeight = 400;\r\n const hideRestrictions =\r\n this.canvas.width < hideMiniMapThresholdWidth ||\r\n this.canvas.height < hideMiniMapThresholdHeight;\r\n let saveString = \"hideMiniMap\"; // + this.props.fileId;\r\n if (this.props.showFullscreen) {\r\n saveString = \"hideMiniMapFull\"; // + this.props.fileId;\r\n }\r\n if (hideRestrictions && !hideMiniMap && showMiniMap) {\r\n this.props.persistentStorage.save(saveString, true);\r\n this.onToggle(\"showMiniMap\");\r\n this.setMountedState({ hideMiniMap: true });\r\n } else if (!hideRestrictions && hideMiniMap && !showMiniMap) {\r\n this.props.persistentStorage.save(saveString, false);\r\n this.onToggle(\"showMiniMap\");\r\n this.setMountedState({ hideMiniMap: false });\r\n } else if (!hideRestrictions && hideMiniMap && showMiniMap) {\r\n this.props.persistentStorage.save(saveString, false);\r\n this.setMountedState({ hideMiniMap: false });\r\n }\r\n };\r\n\r\n render = () => {\r\n const { classes, fileId, ome } = this.props; //showTimeBar project\r\n\r\n const {\r\n miniMapKey,\r\n scaleBarData,\r\n open,\r\n anchorEl,\r\n displayZStackBar,\r\n showMiniMap,\r\n showScaleBar,\r\n showZStackBar,\r\n showImageInfo,\r\n showZoomBar,\r\n showFileNavButtons,\r\n } = this.state;\r\n\r\n return (\r\n
    (this.container = el)}>\r\n \r\n {({ TransitionProps }) => (\r\n \r\n \r\n \r\n {ome && typeof ome.physicalSizeX !== \"undefined\" && (\r\n \r\n )}\r\n\r\n {displayZStackBar && (\r\n \r\n )}\r\n \r\n {\r\n \r\n }\r\n \r\n \r\n )}\r\n \r\n\r\n {this.props.splitscreenCount !== 1 && !this.props.showFullscreen && (\r\n \r\n \r\n this.setMountedState({\r\n open: !this.state.open,\r\n anchorEl: e.target,\r\n })\r\n }\r\n >\r\n \r\n \r\n \r\n )}\r\n event.preventDefault()}\r\n onMouseDown={this.mousedown}\r\n onMouseEnter={this.mouseEnter}\r\n onMouseLeave={this.mouseLeave}\r\n />\r\n {this.state.isLoadingTiles && (\r\n \r\n )}\r\n {FPS && (\r\n

    \r\n {this.state.fps + \" FPS\"}\r\n

    \r\n )}\r\n {!this.state.initialized && (\r\n \r\n )}\r\n {this.state.initialized && showMiniMap && (\r\n // !this.props.resultTab.getZoomLevelFixed() &&\r\n (this.miniMapRef = c)}\r\n fileId={fileId}\r\n key={miniMapKey}\r\n pointerEvents={\r\n !(\r\n (this.canvas.style.cursor !== \"default\")\r\n // ||\r\n // this.props.drawLayer.regionRois.length > 0\r\n )\r\n }\r\n ome={this.props.ome}\r\n histogramConfig={this.props.histogramConfig}\r\n visibleImage={this.props.tiles.getVisibleImages()}\r\n coloredImages={this.props.tiles.getColoredImages()}\r\n position={this.getPosition()}\r\n zoom={this.getScale()}\r\n canvas={this.canvas}\r\n canvasId={this.props.canvasId}\r\n onMoveTo={this.moveTo}\r\n onScaleOnly={this.onScaleOnly}\r\n getPageForChannel={this.getPageForChannel}\r\n chainMouseMove={this.chainMouseMove}\r\n zoomMouseWheel={this.miniMapZoom}\r\n />\r\n )}\r\n\r\n {this.state.initialized && showZoomBar && (\r\n this.zoomToFactor(v)}\r\n clickable={true}\r\n />\r\n )}\r\n {this.state.initialized && showScaleBar && (\r\n {\r\n if (\r\n scaleBarData === null ||\r\n scaleBarData.width !== data.width ||\r\n scaleBarData.label !== data.label ||\r\n scaleBarData.x !== data.x ||\r\n scaleBarData.y !== data.y\r\n ) {\r\n this.setMountedState({ scaleBarData: data });\r\n }\r\n }}\r\n />\r\n )}\r\n {this.state.initialized && showZStackBar && this.props.ome.sizeZ > 1 && (\r\n 0\r\n )\r\n }\r\n z={this.state.z}\r\n minZ={this.state.minZ}\r\n maxZ={this.state.maxZ}\r\n playing={this.state.playingZ}\r\n onPlayPause={this.onPlayPauseZ}\r\n zsr={this.state.zsr}\r\n onChangeZ={this.onChangeZ}\r\n onChangeZValue={this.onChangeZValue}\r\n onChangeZSr={this.onChangeZSr}\r\n playDirection={this.state.playDirectionZ}\r\n ome={this.props.ome}\r\n onStep={this.onStepZ}\r\n />\r\n )}\r\n {this.state.initialized && showImageInfo && (\r\n \r\n )}\r\n {showFileNavButtons && (\r\n \r\n
    \r\n \r\n \r\n {\r\n this.props.openPrevFile();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n
    \r\n\r\n
    \r\n ]\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n )}\r\n
    \r\n );\r\n };\r\n}\r\n\r\n// define the component's interface\r\nRenderer.propTypes = {\r\n activeFileId: PropTypes.string,\r\n canvasId: PropTypes.string,\r\n chainListFileIds: PropTypes.object,\r\n changingFile: PropTypes.bool,\r\n classes: PropTypes.object.isRequired,\r\n componentRef: PropTypes.func,\r\n displayTimeBar: PropTypes.bool,\r\n displayZStackBar: PropTypes.bool,\r\n fileId: PropTypes.string,\r\n histogramConfig: PropTypes.object,\r\n isActive: PropTypes.bool,\r\n isChained: PropTypes.bool,\r\n ome: PropTypes.object,\r\n onChangeChain: PropTypes.func,\r\n onSelectFile: PropTypes.func,\r\n openNextFile: PropTypes.func,\r\n openPrevFile: PropTypes.func,\r\n persistentStorage: PropTypes.object,\r\n rendererDict: PropTypes.object,\r\n rightSpace: PropTypes.number,\r\n showFullscreen: PropTypes.bool,\r\n showZStackBar: PropTypes.bool,\r\n splitscreenCount: PropTypes.number,\r\n splitscreenFileIds: PropTypes.array,\r\n splitscreenIdx: PropTypes.number,\r\n tiles: PropTypes.object,\r\n tzoomROI1: PropTypes.func,\r\n updateGlobalT: PropTypes.func,\r\n updateGlobalZ: PropTypes.func,\r\n zoomBottom: PropTypes.number,\r\n zoomLeft: PropTypes.number,\r\n zoomROI: PropTypes.bool,\r\n zoomRight: PropTypes.number,\r\n zoomTop: PropTypes.number,\r\n getMousePosition: PropTypes.func,\r\n};\r\n\r\nexport default withPersistentStorage(\r\n withTiles(withResultTab(withStyles(styles)(Renderer)))\r\n);\r\n","// Framework imports\r\nimport React, { useContext, useEffect, useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// External packages\r\n// import { Grid } from \"@mui/material\";\r\n\r\n// HSA Imports\r\nimport { FileViewerContext } from \"./FileViewer\";\r\nimport Backend from \"../common/utils/Backend\";\r\nimport Renderer from \"./Renderer\";\r\n\r\n/**\r\n * Collected (reusable) styles for page elements.\r\n */\r\n// const styles = {\r\n// root: {\r\n// height: \"100%\",\r\n// display: \"grid\",\r\n// borderRight: \"5px solid #EBEBEB\",\r\n// justifyContent: \"center\",\r\n// textAlign: \"center\",\r\n// background: \"#fff\",\r\n// },\r\n// img: {\r\n// with: \"800px\",\r\n// height: \"600px\",\r\n// },\r\n// };\r\n\r\n/**\r\n * Element containing all visualisations of all audio files / streams in a project.\r\n */\r\nexport default function FileRenderer(props) {\r\n const fileViewer = useContext(FileViewerContext);\r\n const [histogramConfigs, setHistogramConfigs] = useState({}); //\r\n const [omeDict, setOmeDict] = useState(null);\r\n\r\n let isChained = false;\r\n let showZStackBar = false;\r\n let displayZStackBar = false;\r\n let displayTimeBar = false;\r\n let showFullscreen = false;\r\n let zoomROI = false;\r\n let changingFile = false;\r\n let chainListFileIds = {};\r\n let rendererDict = {};\r\n\r\n //triggers on new Selected File\r\n useEffect(() => {\r\n if (!props.currentFileId) return;\r\n Backend.loadImage(\r\n { id: props.currentFileId },\r\n (ome) => {\r\n if (!ome.fileName) return;\r\n showZStackBar = ome.sizeZ > 1;\r\n displayTimeBar = ome.sizeT > 1;\r\n displayZStackBar = ome.sizeZ > 1;\r\n\r\n setOmeDict({\r\n ...omeDict,\r\n [props.currentFileId]: ome,\r\n });\r\n },\r\n (err) => window.openErrorDialog(err),\r\n () => {}\r\n );\r\n\r\n setHistogramConfigs({\r\n ...histogramConfigs,\r\n [props.currentFileId]: {\r\n channels: [\r\n {\r\n color: \"#ffffff\",\r\n enabled: true,\r\n gamma: 1,\r\n max: 250,\r\n min: 0,\r\n name: \"TL Brightfield\",\r\n type: \"brightfield\",\r\n },\r\n ],\r\n nChannels: 1,\r\n },\r\n });\r\n\r\n return () => {\r\n setOmeDict(null);\r\n };\r\n }, [props.currentFileId]);\r\n\r\n return (\r\n
    \r\n {histogramConfigs[props.currentFileId] &&\r\n omeDict &&\r\n omeDict[props.currentFileId] &&\r\n fileViewer.activeFileId && (\r\n \r\n fileViewer.setRendererDict({\r\n ...fileViewer.rendererDict,\r\n [props.currentFileId]: c,\r\n }) //currentFileId\r\n }\r\n // dimensionsUpdated={fileViewer.dimensionsUpdated}\r\n displayTimeBar={displayTimeBar}\r\n displayZStackBar={displayZStackBar}\r\n fileId={props.currentFileId}\r\n // fsChain={} setsViewerState\r\n histogramConfig={histogramConfigs[props.currentFileId]}\r\n // id={} not used\r\n isActive={fileViewer.activeFileId === props.currentFileId}\r\n isChained={isChained}\r\n ome={omeDict[props.currentFileId]}\r\n onChangeChain={() => {\r\n console.log(\"change chain\");\r\n }}\r\n onSelectFile={() => {\r\n console.log(\"selectFile\");\r\n }}\r\n // openNextFile={}\r\n // openPrevFile={}\r\n // project={}\r\n // projectId={}\r\n rendererDict={rendererDict}\r\n rightSpace={545}\r\n // setChangingFile={}, maybe need later\r\n showFullscreen={showFullscreen}\r\n showZStackBar={showZStackBar}\r\n splitscreenCount={fileViewer.splitscreenFileIds.length}\r\n splitscreenFileIds={fileViewer.splitscreenFileIds}\r\n splitscreenIdx={props.index}\r\n tZoomROI1={() => {\r\n console.log(\"TZOom\");\r\n }}\r\n updateGlobalT={() => {\r\n console.log(\"gloablT\");\r\n }}\r\n updateGlobalZ={() => {\r\n console.log(\"globalZ\");\r\n }}\r\n // viewerConfig={}\r\n zoomBottom={0}\r\n zoomLeft={0}\r\n zoomROI={zoomROI}\r\n zoomRight={0}\r\n zoomTop={0}\r\n getMousePosition={props.getMousePosition}\r\n />\r\n )}\r\n
    \r\n );\r\n}\r\n\r\nFileRenderer.propTypes = {\r\n currentFileId: PropTypes.string,\r\n index: PropTypes.number,\r\n getMousePosition: PropTypes.func,\r\n};\r\n","//Framework imports\r\nimport React, { useContext } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n//External packages\r\nimport { IconButton, Tooltip } from \"@mui/material\";\r\nimport { faExchangeAlt } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\n// HSA KIT Components\r\nimport { FileViewerContext } from \"../FileViewer\";\r\n\r\n/*\r\nFunction to toggle the toolbar.\r\nThe const \"toggle\" sets the Imagepreview and Foldertree width to 0, when these two have a value >0\r\n*/\r\n\r\nfunction ToggleButtonFV(props) {\r\n const fileViewer = useContext(FileViewerContext);\r\n // const [newPreviewWidth, setNewPreviewWidth] = useState(0);\r\n // const [newTreeWidth, setNewTreeWidth] = useState(0);\r\n\r\n const styles = {\r\n toolbarButton: {\r\n display: \"inline-block\",\r\n width: 40,\r\n height: 40,\r\n padding: 0,\r\n margin: 0,\r\n fontSize: 22,\r\n },\r\n };\r\n\r\n /*\r\n Errorfunction to toggle the Toolbar\r\n */\r\n const toggle = () => {\r\n //maybe add notification that sidebar wont toggle if no file selected\r\n if (fileViewer.selectedFile === null) return;\r\n if (fileViewer.oldPreviewWidth && fileViewer.oldTreeWidth > 0) {\r\n fileViewer.setPreviewWidth(fileViewer.oldPreviewWidth);\r\n fileViewer.setTreeWidth(fileViewer.oldTreeWidth);\r\n fileViewer.setOldPreviewWidth(0);\r\n fileViewer.setOldTreeWidth(0);\r\n } else {\r\n fileViewer.setOldPreviewWidth(fileViewer.previewWidth);\r\n fileViewer.setOldTreeWidth(fileViewer.treeWidth);\r\n fileViewer.setPreviewWidth(0);\r\n fileViewer.setTreeWidth(0);\r\n }\r\n props.updateDimensions();\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nToggleButtonFV.propTypes = {\r\n updateDimensions: PropTypes.func,\r\n};\r\n\r\nexport default ToggleButtonFV;\r\n","//Framework imports\r\nimport React, { useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\n//Imports from Project\r\nimport ToggleButtonFV from \"./components/ToggleButtonFV\";\r\nimport ToggleButton from \"../viewer/components/ToggleButton\";\r\nimport { Fade, Popper, Paper, IconButton, Tooltip } from \"@mui/material\";\r\n\r\nimport { ZoomIn, ZoomOut, ViewQuilt } from \"@mui/icons-material\";\r\nimport ZoomOutMapIcon from \"@mui/icons-material/ZoomOutMap\";\r\nimport { faCamera } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\n\r\nconst styles = {\r\n toolbar: {\r\n position: \"relative\",\r\n margin: 0,\r\n padding: 0,\r\n width: \"40px\",\r\n background: \"#fff\",\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"1fr auto\",\r\n overflowX: \"hidden\",\r\n overflowY: \"auto\",\r\n },\r\n buttonGroup: {\r\n display: \"inline-block\",\r\n height: 40,\r\n padding: 0,\r\n margin: 0,\r\n fontSize: 22,\r\n },\r\n buttonStyle: {\r\n width: \"40px\",\r\n height: \"40px\",\r\n margin: 0,\r\n display: \"inline-block\",\r\n padding: 0,\r\n fontSize: \"22px\",\r\n },\r\n textButtonStyle: {\r\n fontSize: 18,\r\n fontWeight: \"bold\",\r\n },\r\n toolbarButtonIcon: {\r\n verticalAlign: \"-4px\",\r\n },\r\n};\r\n\r\nconst style = (theme) => ({\r\n toolBar: {\r\n position: \"relative\",\r\n margin: 0,\r\n padding: 0,\r\n marginRight: 5,\r\n background: \"#fff\",\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"1fr auto\",\r\n overflowX: \"hidden\",\r\n overflowY: \"auto\",\r\n },\r\n toolbarButton: {\r\n display: \"inline-block\",\r\n width: 40,\r\n height: 40,\r\n padding: 0,\r\n margin: 0,\r\n fontSize: 22,\r\n },\r\n toolbarButtonIcon: {\r\n verticalAlign: \"-4px\",\r\n },\r\n textIcon: {\r\n fontSize: 18,\r\n fontWeight: \"bold\",\r\n },\r\n toolbarButtonChecked: {\r\n width: 40,\r\n color: theme.palette.primary.main,\r\n },\r\n divider: {\r\n marginLeft: 5,\r\n marginRight: 5,\r\n },\r\n});\r\n\r\n/*\r\nFunction to place and to style the buttons \r\n*/\r\nfunction Toolbar(props) {\r\n const [openAdjust, setOpenAdjust] = useState(false);\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n\r\n return (\r\n \r\n
    \r\n \r\n {({ TransitionProps }) => (\r\n \r\n \r\n {/* \r\n\r\n \r\n\r\n \r\n\r\n */}\r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n {/* */}\r\n \r\n \r\n )}\r\n \r\n {props.splitscreenCount === 1 && (\r\n \r\n {\r\n setOpenAdjust(!openAdjust);\r\n setAnchorEl(e.target);\r\n }}\r\n >\r\n \r\n \r\n \r\n )}\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n {\r\n props.onSaveScreenshot();\r\n }}\r\n style={{ ...styles.buttonStyle }}\r\n >\r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n {\r\n props.triggerZoomAction(\"oneToN\", 1);\r\n }}\r\n style={{ ...styles.buttonStyle, ...styles.textButtonStyle }}\r\n >\r\n {\"1:1\"}\r\n \r\n \r\n
    \r\n
    \r\n \r\n {\r\n props.triggerZoomAction(\"oneToN\", 4);\r\n }}\r\n style={{ ...styles.buttonStyle, ...styles.textButtonStyle }}\r\n >\r\n {\"1:4\"}\r\n \r\n \r\n
    \r\n
    \r\n \r\n {\r\n props.triggerZoomAction(\"oneToN\", 10);\r\n }}\r\n style={{ ...styles.buttonStyle, ...styles.textButtonStyle }}\r\n >\r\n {\"1:10\"}\r\n \r\n \r\n
    \r\n
    \r\n \r\n {\r\n props.triggerZoomAction(\"zoomFit\", 0);\r\n }}\r\n >\r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n {\r\n props.triggerZoomAction(\"increase\", 0);\r\n }}\r\n style={{ ...styles.buttonStyle }}\r\n >\r\n \r\n \r\n \r\n \r\n {\r\n props.triggerZoomAction(\"decrease\", 0);\r\n }}\r\n style={{ ...styles.buttonStyle }}\r\n >\r\n \r\n \r\n \r\n
    \r\n
    \r\n {props.updateDimensions && (\r\n \r\n )}\r\n
    \r\n \r\n );\r\n}\r\n\r\nToolbar.propTypes = {\r\n triggerZoomAction: PropTypes.func,\r\n onSaveScreenshot: PropTypes.func,\r\n updateDimensions: PropTypes.func,\r\n splitscreenCount: PropTypes.number,\r\n rendererRef: PropTypes.object,\r\n classes: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withStyles(style)(Toolbar);\r\n","// Framework imports\r\nimport React, { useContext, useEffect, useState, useRef } from \"react\";\r\nimport LazyLoad from \"react-lazyload\";\r\n\r\n// External packages\r\nimport { Grid, Tooltip } from \"@mui/material\";\r\n\r\n// HSA Imports\r\nimport { FileViewerContext } from \"./FileViewer\";\r\nimport Backend from \"../common/utils/Backend\";\r\nimport { theme } from \"../../src/index\";\r\n\r\n/**\r\n * Collected (reusable) styles for page elements.\r\n */\r\n\r\nconst styles = {\r\n fileBox: {\r\n minWidth: 0,\r\n width: 200,\r\n // borderLeft: \"5px solid #EBEBEB\",\r\n background: \"#fff\",\r\n overflow: \"auto\",\r\n justifyContent: \"center\",\r\n },\r\n imgContainer: {\r\n margin: \"0 10px 10px\",\r\n textAlign: \"center\",\r\n },\r\n img: {\r\n display: \"inline-block\",\r\n width: \"100%\",\r\n },\r\n placeholder: {\r\n width: \"170px\",\r\n height: \"40px\",\r\n border: \"1px solid gray\",\r\n borderWidth: 2,\r\n fontSize: 15,\r\n textAlign: \"center\",\r\n marginTop: \"20px\",\r\n marginLeft: \"auto\",\r\n marginRight: \"auto\",\r\n },\r\n};\r\n\r\n/**\r\n * Preview from the loaded images of the selected Foldertree\r\n */\r\nexport default function ImagePreview() {\r\n const labelHeight = 30;\r\n const fileViewer = useContext(FileViewerContext);\r\n const [fileList, setFileList] = useState([]);\r\n const [enterDelay, setEnterDelay] = useState(1000);\r\n const imageRefs = useRef([]);\r\n\r\n /*\r\n If you click on a tree file, the selected Image in the Imagepreview scrolls into View\r\n */\r\n // useEffect(() => {\r\n // if (fileViewer.selectedFile) {\r\n // const fileIdx = fileList.findIndex(\r\n // (file) => file.path === fileViewer.selectedFile\r\n // );\r\n // imageRefs.current[fileIdx].scrollIntoView({\r\n // behavior: \"smooth\",\r\n // });\r\n // }\r\n // }, [fileViewer.selectedFile]);\r\n\r\n /*\r\n Loading the Filelist\r\n Trigger: Selected Folder\r\n */\r\n useEffect(() => {\r\n if (fileViewer.selectedFolder) {\r\n Backend.walkDir(fileViewer.selectedFolder.path, true, (files) => {\r\n imageRefs.current = imageRefs.current.slice(0, files.length);\r\n\r\n setFileList(\r\n files\r\n .filter((file) => file.type === \"file\")\r\n .map((file) => {\r\n return file;\r\n })\r\n );\r\n });\r\n }\r\n }, [fileViewer.selectedFolder]);\r\n\r\n /*\r\n Scaling the images after changing the Imagepreview width\r\n Trigger: Changing Imagepreview width\r\n */\r\n useEffect(() => {\r\n calculatePreviewHeight();\r\n }, [fileViewer.previewWidth]);\r\n\r\n /*\r\n Set Imagepreview width\r\n Trigger: Initialise\r\n */\r\n // useEffect(() => {\r\n // fileViewer.setPreviewWidth(styles.fileBox.width);\r\n // }, []);\r\n\r\n /*\r\n Errorfunction to scale the images\r\n */\r\n const calculatePreviewHeight = () => {\r\n for (let i = 0; i < fileList.length; i++) {\r\n let element1 = imageRefs.current[i];\r\n if (element1) {\r\n const elemHeight = element1.clientHeight;\r\n if (elemHeight > 0) {\r\n fileList[i].height = elemHeight + labelHeight;\r\n }\r\n }\r\n }\r\n };\r\n\r\n return (\r\n \r\n {fileList.length > 0 ? (\r\n
    \r\n {fileList.map((file, idx) => (\r\n \r\n \r\n
    \r\n File Size:{\" \"}\r\n
    \r\n {file.fileSize}\r\n
    \r\n
    \r\n Creation Date:{\" \"}\r\n
    \r\n {file.creationTime}\r\n
    \r\n }\r\n key={file.path}\r\n enterDelay={enterDelay}\r\n onMouseEnter={() => {\r\n setEnterDelay(1000);\r\n }}\r\n >\r\n \r\n {\r\n e.dataTransfer.setData(\"text/plain\", file.path);\r\n }}\r\n ref={(el) => (imageRefs.current[idx] = el)}\r\n style={{\r\n ...styles.img,\r\n\r\n border:\r\n file.path === fileViewer.selectedFile\r\n ? \"solid 3px \" + theme.palette.primary.main\r\n : \"none\",\r\n }}\r\n src={Backend.imageThumbnail(encodeURIComponent(file.path))}\r\n alt=\"Preview Image\"\r\n onClick={() => {\r\n fileViewer.setSelFile(file.path);\r\n }}\r\n />\r\n\r\n
    \r\n {\" \"}\r\n {file.path.substring(file.path.lastIndexOf(\"/\") + 1)}\r\n
    \r\n \r\n \r\n \r\n ))}\r\n \r\n ) : (\r\n
    No selected Folder
    \r\n )}\r\n \r\n );\r\n}\r\n","// Framework imports\r\nimport React, { useEffect, useState, useContext } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// External packages\r\nimport TreeItem from \"@mui/lab/TreeItem\";\r\nimport { Tooltip } from \"@mui/material\";\r\nimport FolderOpenOutlinedIcon from \"@mui/icons-material/FolderOpenOutlined\";\r\nimport InsertDriveFileOutlinedIcon from \"@mui/icons-material/InsertDriveFileOutlined\";\r\n\r\n// HSA Packages\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { FileViewerContext } from \"../FileViewer\";\r\n\r\n/**\r\n * Collected (reusable) styles for page elements.\r\n */\r\nconst styles = {\r\n root: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"auto 1fr\",\r\n width: \"300px\",\r\n overflow: \"hidden\",\r\n },\r\n treeItem: {\r\n width: \"100%\",\r\n overflow: \"hidden\",\r\n whiteSpace: \"nowrap\",\r\n textOverflow: \"ellipsis\",\r\n },\r\n};\r\n\r\n/**\r\n * Folder of foldertree.\r\n * @param {string} path Path of folder to get files and folders from. Defaults to \"\".\r\n * @returns React render component.\r\n */\r\nexport default function RecursiveFolderEntity({ entity }) {\r\n const [dirContent, setDirContent] = useState([]);\r\n const fileViewer = useContext(FileViewerContext);\r\n\r\n useEffect(() => {\r\n if (entity.type !== \"file\") {\r\n Backend.walkDir(entity.path, true, (content) => setDirContent(content));\r\n }\r\n }, []);\r\n\r\n return entity.type === \"directory\" ? (\r\n }\r\n onClick={() => fileViewer.setSelFolder(entity)}\r\n >\r\n {dirContent.map((item) => (\r\n \r\n ))}\r\n
    \r\n ) : (\r\n }\r\n onClick={() => {\r\n fileViewer.setSelFile(entity.path);\r\n }}\r\n />\r\n );\r\n}\r\n\r\nRecursiveFolderEntity.propTypes = {\r\n entity: PropTypes.object.isRequired,\r\n};\r\n\r\n/**\r\n *styling of treeitems\r\n */\r\nexport function FolderEntity({ entity }) {\r\n const fileViewer = useContext(FileViewerContext);\r\n const path = entity.path;\r\n const endOfPath = path.substring(path.lastIndexOf(\"/\") + 1);\r\n const isSel = path === fileViewer.selectedFile;\r\n\r\n return (\r\n \r\n {entity.type === \"directory\" ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n
    {endOfPath}
    \r\n \r\n \r\n );\r\n}\r\n\r\nFolderEntity.propTypes = {\r\n entity: PropTypes.object.isRequired,\r\n};\r\n","// Framework imports\r\nimport React, { useEffect, useState, useContext } from \"react\";\r\n\r\n// External packages\r\nimport { Button, Grid } from \"@mui/material\";\r\nimport TreeView from \"@mui/lab/TreeView\";\r\nimport { Box } from \"@mui/system\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\r\n\r\n// HSA KIT Components\r\nimport RecursiveFolderEntity from \"./components/FolderEntity.jsx\";\r\nimport Backend from \"../common/utils/Backend.jsx\";\r\nimport { FileViewerContext } from \"./FileViewer\";\r\n\r\n/**\r\n * Collected (reusable) styles for page elements.\r\n */\r\nconst styles = {\r\n root: {\r\n height: \"100%\",\r\n width: 301,\r\n background: \"#fff\",\r\n // borderLeft: \"5px solid #EBEBEB\",\r\n display: \"grid\",\r\n gridTemplateRows: \"auto 1fr\",\r\n overflow: \"hidden\",\r\n },\r\n button: {\r\n height: \"100%\",\r\n width: \"100%\",\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n },\r\n};\r\n\r\n/**\r\n * Vertical Foldertree for quick folder selection.\r\n */\r\nexport default function Foldertree() {\r\n const fileViewer = useContext(FileViewerContext);\r\n const [topLevelEntities, setTLEs] = useState([]);\r\n const [expanded, setExpanded] = useState([]);\r\n const [openFolder, setOpenFolder] = useState([]);\r\n\r\n /*\r\n Loading Folder list and set Foldertree width\r\n Trigger: Initialise\r\n */\r\n useEffect(() => {\r\n Backend.walkDir(\"\", true, (entities) => {\r\n // console.debug(entities);\r\n setTLEs(entities);\r\n });\r\n // fileViewer.setTreeWidth(styles.root.width);\r\n }, []);\r\n\r\n /*\r\n Function for Button \"Open Previous/Collapse All\" \r\n */\r\n const handleCollapseAll = () => {\r\n setOpenFolder(expanded);\r\n if (expanded.length > 0) {\r\n setExpanded([]);\r\n } else {\r\n setExpanded(openFolder);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n }\r\n defaultExpandIcon={}\r\n expanded={expanded}\r\n onNodeToggle={(event, nodeIds) => setExpanded(nodeIds)}\r\n >\r\n {topLevelEntities.map((tle) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n );\r\n}\r\n","// Framework imports\r\nimport React, { useState, createContext, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Grid } from \"@mui/material\";\r\n\r\n// HSA KIT Components\r\nimport FileRenderer from \"./FileRenderer\";\r\nimport FileToolBar from \"./FileToolBar\";\r\nimport ImagePreview from \"./ImagePreview\";\r\nimport Foldertree from \"./Foldertree.jsx\";\r\nimport Backend from \"../common/utils/Backend\";\r\nimport LocalVerticalResizeBorder from \"../common/components/LocalVerticalResizeBorder\";\r\n\r\nimport { withPersistentStorage } from \"../viewer/contexts/PersistentStorageContext\";\r\nimport { withTiles } from \"../viewer/contexts/TilesContext\";\r\n\r\nimport { Tooltip, IconButton } from \"@mui/material\";\r\nimport RemoveCircleIcon from \"@mui/icons-material/RemoveCircle\";\r\n// import LinkIcon from \"@mui/icons-material/Link\";\r\n// import LinkOffIcon from \"@mui/icons-material/LinkOff\";\r\n\r\n/**\r\n * Collected (reusable) styles for page elements.\r\n */\r\nconst styles = {\r\n root: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n background: \"#EBEBEB\",\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr auto 5px auto 5px auto\",\r\n },\r\n dropfieldRoot: {\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n background: \"rgba(0, 0, 0, 0.514)\",\r\n color: \"rgb(255, 255, 255)\",\r\n zIndex: 100,\r\n pointerEvents: \"none\",\r\n border: \"dashed white 4px\",\r\n textAlign: \"center\",\r\n paddingTop: \"calc(50vh - 74px)\",\r\n fontSize: \"20px\",\r\n },\r\n rendererGridRoot: {\r\n background: \"#EBEBEB\",\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n overflowY: \"inherit\",\r\n overflowX: \"inherit\",\r\n },\r\n splitscreenGridRoot: {\r\n flexGrow: 0,\r\n margin: 0,\r\n position: \"relative\",\r\n background: \"#EBEBEB\",\r\n },\r\n activeIndicatorBorder: {\r\n position: \"absolute\",\r\n pointerEvents: \"none\",\r\n zIndex: 100,\r\n height: \"100%\",\r\n width: \"100%\",\r\n border: \"solid #0673C1 4px\",\r\n },\r\n excludeButton: {\r\n position: \"absolute\",\r\n top: 5,\r\n right: 5,\r\n zIndex: 100,\r\n },\r\n attachButton: {\r\n position: \"absolute\",\r\n top: 5,\r\n right: 40,\r\n zIndex: 100,\r\n color: \"#666\",\r\n },\r\n};\r\n\r\nexport const FileViewerContext = createContext();\r\n\r\n//to fix:\r\n//-replace objects with maps (maybe)\r\n//-check viewer functionalities\r\n//-persistent storage\r\n//-scene switch\r\n//-chaining??\r\n//-fullscreen??\r\n//-histogram??\r\n//-file compatibilty ~zstack\r\n//-highlight of splitscreenfile in preview\r\n//-screenshot data gathering?\r\n//-remove/rewrite renderer code!?\r\n\r\n/**\r\n * Overall parent component for File Viewer.\r\n * This component contains all parts of the File viewer and will be called with the /File_view route.\r\n * @returns React Object for File Viewer.\r\n */\r\nfunction FileViewer(props) {\r\n const [selectedFolder, setSelFolder] = useState(null);\r\n const [selectedFile, setSelFile] = useState(null);\r\n const [previewWidth, setPreviewWidth] = useState(210);\r\n const [oldPreviewWidth, setOldPreviewWidth] = useState(0);\r\n const [treeWidth, setTreeWidth] = useState(300);\r\n const [oldTreeWidth, setOldTreeWidth] = useState(0);\r\n const [splitscreenFileIds, setSplitscreenFileIds] = useState([]);\r\n const [activeFileId, setActiveFileId] = useState(null);\r\n const [showSplitscreenDropzone, setShowSplitscreenDropzone] = useState(false);\r\n const [containerKey, setContainerKey] = useState(new Date().getTime());\r\n const [rendererDict, setRendererDict] = useState({});\r\n const [zoomObjectDict, setZoomObjectDict] = useState({});\r\n\r\n const context = {\r\n selectedFolder,\r\n setSelFolder,\r\n selectedFile,\r\n setSelFile,\r\n previewWidth,\r\n setPreviewWidth,\r\n oldPreviewWidth,\r\n setOldPreviewWidth,\r\n treeWidth,\r\n setTreeWidth,\r\n oldTreeWidth,\r\n setOldTreeWidth,\r\n activeFileId,\r\n splitscreenFileIds,\r\n rendererDict,\r\n setRendererDict,\r\n setContainerKey,\r\n zoomObjectDict,\r\n setZoomObjectDict,\r\n updateDimensions,\r\n };\r\n\r\n let mousePosition = {\r\n mouseX: 0,\r\n mouseY: 0,\r\n };\r\n\r\n useEffect(() => {\r\n window.addEventListener(\"resize\", () => updateDimensions());\r\n window.addEventListener(\"keydown\", keyDown);\r\n return () => {\r\n window.removeEventListener(\"resize\", () => updateDimensions());\r\n window.addEventListener(\"keydown\", keyDown);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (selectedFile === null) return;\r\n handleFileChange(false, selectedFile);\r\n updateDimensions();\r\n }, [selectedFile]);\r\n\r\n useEffect(() => {\r\n document.onmousemove = (e) => {\r\n mousePosition = {\r\n mouseX: e.pageX,\r\n mouseY: e.pageY,\r\n };\r\n };\r\n });\r\n\r\n const getMousePosition = () => {\r\n return [mousePosition.mouseX, mousePosition.mouseY];\r\n };\r\n\r\n const keyDown = (e) => {\r\n console.log(\"keydown\", e);\r\n };\r\n\r\n const updateDimensions = () => {\r\n let savedT = 0;\r\n setContainerKey(new Date().getTime());\r\n if (rendererDict[activeFileId]?.state) {\r\n savedT = rendererDict[activeFileId].state.t;\r\n }\r\n if (savedT > 0 && rendererDict[activeFileId])\r\n rendererDict[activeFileId].updateT(savedT);\r\n handleSavedZoomObjects();\r\n };\r\n\r\n const handleSavedZoomObjects = () => {\r\n for (const fileId of splitscreenFileIds) {\r\n let zoomData = props.persistentStorage.load(\"zoomObjectFV\" + fileId);\r\n if (zoomData) {\r\n setZoomObjectDict({\r\n ...zoomObjectDict,\r\n [fileId]: structuredClone(zoomData),\r\n });\r\n } else {\r\n setZoomObjectDict({\r\n ...zoomObjectDict,\r\n [fileId]: {\r\n zoomRoi: false,\r\n zoomLeft: 0,\r\n zoomRight: 0,\r\n zoomTop: 0,\r\n zoomBottom: 0,\r\n },\r\n });\r\n }\r\n }\r\n };\r\n\r\n const onSaveScreenshot = () => {\r\n // const file = this.state.project.files.find(\r\n // (file) => file.id === this.state.activeFileId\r\n // );\r\n\r\n let img = rendererDict[activeFileId].canvas;\r\n\r\n // let ctx = img.getContext(\"2d\");\r\n\r\n // ctx.save();\r\n // let a = ctx.getTransform().a;\r\n // let d = ctx.getTransform().d;\r\n // let e = ctx.getTransform().e;\r\n // let f = ctx.getTransform().f;\r\n // ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n\r\n // let fontSize = 20;\r\n // ctx.font = fontSize + \"px Arial\";\r\n\r\n // // Box-Position\r\n // let x = 10;\r\n // let y = 10;\r\n // let width = ctx.measureText(projectName).width + 10;\r\n // let height = parseInt(fontSize, 10) + 10;\r\n\r\n // // Draw Box-Border\r\n // ctx.fillStyle = \"black\";\r\n // let thickness = 1;\r\n // ctx.fillRect(\r\n // x - thickness,\r\n // y - thickness,\r\n // width + thickness * 2,\r\n // height + thickness * 2\r\n // );\r\n\r\n // // Draw Box\r\n // // ctx.globalAlpha = 0.8;\r\n // ctx.fillStyle = \"white\";\r\n // ctx.fillRect(x, y, width, height);\r\n\r\n // // Add Text\r\n // // ctx.globalAlpha = 1;\r\n // ctx.textAlign = \"left\";\r\n // ctx.textBaseline = \"top\";\r\n // ctx.fillStyle = \"black\";\r\n // ctx.fillText(projectName, 15, 15);\r\n\r\n // ctx.setTransform(a, 0, 0, d, e, f);\r\n // ctx.restore();\r\n\r\n img = img.toDataURL(\"image/jpeg\", 0.9);\r\n\r\n // if (\r\n // this.state.project.type.includes(\"HistoPointCounting\") ||\r\n // this.state.project.type.includes(\"HistoClassification\")\r\n // ) {\r\n // const fileName = file.fileName.split(\".\").slice(0, -1).join(\".\");\r\n // let lastIndex = file.sourcePath.replace(/\\\\/g, \"/\").lastIndexOf(\"/\");\r\n // const folderPath = file.sourcePath.substring(0, lastIndex + 1);\r\n // Backend.saveScreenshot(\r\n // folderPath,\r\n // fileName,\r\n // this.dataURItoBlob(img),\r\n // (response) => {\r\n // window.showSuccessSnackbar(\r\n // \"Screenshot saved here: \" + response.savePath\r\n // );\r\n // }\r\n // );\r\n // } else {\r\n let link = document.createElement(\"a\");\r\n\r\n // projekt_methode_filename_SceneNr_001.png\r\n let screenShotName = `${selectedFile}_S.jpg`;\r\n\r\n link.download = screenShotName;\r\n link.href = img.replace(\"image/jpeg\", \"image/octet-stream\");\r\n link.click();\r\n // }\r\n };\r\n\r\n const triggerZoomAction = (action, n) => {\r\n switch (action) {\r\n case \"zoomFit\":\r\n rendererDict[activeFileId].zoomFit();\r\n break;\r\n case \"oneToN\":\r\n rendererDict[activeFileId].zoomOneToN(n);\r\n break;\r\n case \"increase\":\r\n rendererDict[activeFileId].zoomDelta(-1);\r\n break;\r\n case \"decrease\":\r\n rendererDict[activeFileId].zoomDelta(1);\r\n break;\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n const handleFileChange = async (dropTriggered, file) => {\r\n let fileId = await fetchFileId(file);\r\n if (dropTriggered || splitscreenFileIds.length === 0) {\r\n addToSplitscreen(fileId);\r\n } else {\r\n removeRenderer(activeFileId);\r\n changeFile(fileId);\r\n }\r\n setActiveFileId(fileId);\r\n updateDimensions();\r\n };\r\n\r\n const removeRenderer = (fileId) => {\r\n let dict = rendererDict;\r\n delete dict[fileId];\r\n setRendererDict(dict);\r\n };\r\n\r\n const fetchFileId = async (file) => {\r\n let fileId = await Backend.getFileUuid(file);\r\n if (!fileId.uuid || typeof fileId.uuid !== \"string\") return;\r\n return fileId.uuid;\r\n };\r\n\r\n const addToSplitscreen = (fileId) => {\r\n let fileIds = splitscreenFileIds.slice();\r\n fileIds.push(fileId);\r\n setSplitscreenFileIds(fileIds);\r\n updateDimensions();\r\n };\r\n\r\n const onExcludeSplitscreen = (index, e) => {\r\n let ids = splitscreenFileIds.slice();\r\n let activeId = activeFileId;\r\n\r\n removeRenderer(ids[index]);\r\n if (activeFileId === ids[index]) {\r\n ids.splice(index, 1);\r\n activeId = ids[Math.max(index - 1, 0)];\r\n } else {\r\n ids.splice(index, 1);\r\n }\r\n\r\n //persistent storage stuff\r\n //chain stuff\r\n //...\r\n setActiveFileId(activeId);\r\n setSplitscreenFileIds(ids);\r\n updateDimensions();\r\n e.stopPropagation();\r\n };\r\n\r\n const changeFile = (newFileId) => {\r\n let fileIds = splitscreenFileIds.slice();\r\n let idx = fileIds.indexOf(newFileId);\r\n\r\n if (idx === -1) {\r\n let currentIdx = fileIds.indexOf(activeFileId);\r\n fileIds[currentIdx] = newFileId;\r\n setActiveFileId(newFileId);\r\n setSplitscreenFileIds(fileIds);\r\n }\r\n };\r\n\r\n const onDropFile = (e) => {\r\n e.preventDefault();\r\n let path = e.dataTransfer.getData(\"Text\");\r\n handleFileChange(true, path);\r\n setShowSplitscreenDropzone(false);\r\n };\r\n\r\n const setActiveView = (currentFileId) => {\r\n if (activeFileId === currentFileId) return;\r\n setActiveFileId(currentFileId);\r\n };\r\n\r\n const getSplitscreenGridLayout = () => {\r\n return splitscreenFileIds.length === 4\r\n ? 6\r\n : splitscreenFileIds.length > 2\r\n ? 4\r\n : splitscreenFileIds.length > 1\r\n ? 6\r\n : 12;\r\n };\r\n\r\n const getSplitscreenGridLayoutHeight = () => {\r\n return splitscreenFileIds.length === 4\r\n ? \"50%\"\r\n : splitscreenFileIds.length > 6\r\n ? \"33.333333333%\"\r\n : splitscreenFileIds.length > 3\r\n ? \"50%\"\r\n : \"100%\";\r\n };\r\n\r\n return (\r\n \r\n \r\n {\r\n setShowSplitscreenDropzone(true);\r\n }}\r\n onDragLeave={() => {\r\n setShowSplitscreenDropzone(false);\r\n }}\r\n onDragOver={(e) => e.preventDefault()}\r\n onDrop={(e) => {\r\n onDropFile(e);\r\n }}\r\n key={containerKey}\r\n >\r\n {showSplitscreenDropzone && (\r\n
    \r\n Drop file here for split screen.\r\n
    \r\n )}\r\n {splitscreenFileIds.map((currentFileId, index) => (\r\n 1 && \"1px solid\",\r\n height: getSplitscreenGridLayoutHeight(),\r\n zIndex: currentFileId === activeFileId ? \"0\" : \"1\",\r\n }}\r\n onClick={\r\n splitscreenFileIds.length > 1\r\n ? () => setActiveView(currentFileId)\r\n : undefined\r\n }\r\n >\r\n \r\n {currentFileId === activeFileId &&\r\n splitscreenFileIds.length > 1 && (\r\n
    \r\n )}\r\n {splitscreenFileIds.length > 1 && (\r\n \r\n onExcludeSplitscreen(index, e)}\r\n >\r\n \r\n \r\n \r\n )}\r\n {/* {splitscreenFileIds.length > 1 && (\r\n \r\n \r\n // this.onChainSplitscreen(index, currentFileId, e)\r\n console.log(\"chain\", e)\r\n }\r\n >\r\n {currentFileId === activeFileId ? ( // this.chainList[index]\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )} */}\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n
    \r\n {\r\n setPreviewWidth(newWidth);\r\n }}\r\n />\r\n
    \r\n \r\n
    \r\n {\r\n setTreeWidth(newWidth);\r\n }}\r\n />\r\n
    \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nFileViewer.propTypes = {\r\n persistentStorage: PropTypes.object,\r\n tiles: PropTypes.object,\r\n};\r\n\r\nexport default withPersistentStorage(withTiles(FileViewer));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { TextValidator } from \"react-material-ui-form-validator\";\r\nimport classNames from \"classnames\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\nimport {\r\n DialogContent,\r\n ImageListItem,\r\n ImageList,\r\n ImageListItemBar,\r\n Grid,\r\n FormHelperText,\r\n TextField,\r\n} from \"@mui/material\";\r\n\r\nconst styles = () => ({\r\n dialogContent: {\r\n paddingTop: 0,\r\n maxWidth: 900,\r\n height: 562,\r\n },\r\n tileBar: {\r\n whiteSpace: \"normal !important\",\r\n },\r\n projectTile: {\r\n cursor: \"pointer\",\r\n padding: 5,\r\n overflow: \"hidden\",\r\n border: \"1px solid black\",\r\n \"&:hover\": {\r\n background: \"#AAA\",\r\n },\r\n },\r\n projectTileSelected: {\r\n background: \"#1BA1E2!important\",\r\n },\r\n projectTilesList: {\r\n maxHeight: 437,\r\n padding: 3,\r\n },\r\n expiredMarker: {\r\n color: \"red\",\r\n border: \"2px solid red\",\r\n position: \"absolute\",\r\n top: 5,\r\n right: 5,\r\n zIndex: 1,\r\n background: \"rgba(255,255,255,0.9)\",\r\n padding: \"2px 5px 5px 5px\",\r\n },\r\n expiringMarker: {\r\n color: \"darkorange\",\r\n border: \"2px solid darkorange\",\r\n position: \"absolute\",\r\n top: 8,\r\n right: 8,\r\n zIndex: 1,\r\n background: \"rgba(255,255,255,0.9)\",\r\n padding: \"2px 5px 5px 5px\",\r\n lineHeight: \"16px\",\r\n },\r\n});\r\n\r\nclass StepProjectModuleSelection extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n searchText: \"\",\r\n };\r\n this.imageListItemRefs = [];\r\n }\r\n\r\n onChangeFilter = (e) => {\r\n let searchText = e.target.value;\r\n this.setState({ searchText });\r\n this.imageListItemRefs = [];\r\n };\r\n\r\n isInView = (el) => {\r\n if (\r\n !this.imageList ||\r\n this.imageList.getBoundingClientRect().height === 0\r\n ) {\r\n this.imageList = document.getElementById(\"ImageList\");\r\n if (\r\n this.imageList &&\r\n this.imageList.getAttribute(\"listener\") !== \"true\"\r\n ) {\r\n this.imageList.addEventListener(\"scroll\", this.handleImageListScroll);\r\n }\r\n }\r\n let result = false;\r\n if (this.imageList && el) {\r\n let parentTop = this.imageList.getBoundingClientRect().top;\r\n let parentHeight = this.imageList.getBoundingClientRect().height;\r\n let elTop = el.getBoundingClientRect().top;\r\n let elHeight = el.getBoundingClientRect().height;\r\n\r\n result = elTop + elHeight > parentTop && elTop < parentTop + parentHeight;\r\n }\r\n return result;\r\n };\r\n\r\n handleImageListScroll = () => {\r\n this.forceUpdate();\r\n };\r\n\r\n render() {\r\n const {\r\n classes,\r\n availableTypes,\r\n projectType,\r\n onProjectType,\r\n name,\r\n onChangeName,\r\n onSaveName,\r\n } = this.props;\r\n\r\n // Check for selected histo modules.\r\n let isHistoModule =\r\n projectType.includes(\"HistoClassification\") ||\r\n projectType.includes(\"HistoPointCounting\");\r\n\r\n return (\r\n \r\n \r\n \r\n onSaveName(e.target.value)}\r\n onChange={(e) => onChangeName(e.target.value)}\r\n style={{ marginTop: 0 }}\r\n type=\"text\"\r\n validators={isHistoModule ? [] : [\"required\"]}\r\n value={isHistoModule ? \"Will be filled in automatically\" : name}\r\n variant=\"standard\"\r\n // select all text if component is defined\r\n onFocus={(e) => e.target.select()}\r\n />\r\n \r\n \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n\r\n \r\n Project Type\r\n \r\n \r\n {availableTypes\r\n .filter((row) => {\r\n let searchContent = row.label.toLowerCase();\r\n if (row.projectProperties.Hidden) return false;\r\n let toSearch = this.state.searchText.toLowerCase();\r\n return searchContent.includes(toSearch);\r\n })\r\n .map((availableType) => (\r\n {\r\n if (!this.imageListItemRefs[availableType.name]) {\r\n this.imageListItemRefs[availableType.name] = el;\r\n this.forceUpdate();\r\n }\r\n }}\r\n key={availableType.name}\r\n onClick={() => onProjectType(availableType)}\r\n className={classNames(\r\n classes.projectTile,\r\n projectType === availableType.name &&\r\n classes.projectTileSelected\r\n )}\r\n >\r\n {availableType.projectProperties.WIP && (\r\n
    WIP
    \r\n )}\r\n {availableType.isValid === false &&\r\n availableType.expirationDate && (\r\n
    \r\n Expired on{\" \"}\r\n {availableType.expirationDate.replace(\"T00:00:00\", \"\")}!\r\n
    \r\n )}\r\n {availableType.isValid && availableType.expiresInDays < 32 && (\r\n
    \r\n Expires in {availableType.expiresInDays} days!\r\n
    \r\n )}\r\n\r\n {this.isInView(this.imageListItemRefs[availableType.name]) && (\r\n \r\n )}\r\n\r\n \r\n\r\n {/*
    {availableType.label}
    */}\r\n \r\n ))}\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nStepProjectModuleSelection.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n name: PropTypes.string,\r\n projectType: PropTypes.string,\r\n onChangeName: PropTypes.func,\r\n onSaveName: PropTypes.func,\r\n availableTypes: PropTypes.array,\r\n onProjectType: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(StepProjectModuleSelection);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n TextField,\r\n MenuItem,\r\n FormControl,\r\n Checkbox,\r\n RadioGroup,\r\n FormControlLabel,\r\n FormLabel,\r\n} from \"@mui/material\";\r\n\r\nconst styles = {\r\n paddingContainer: {\r\n padding: 10,\r\n },\r\n formItem: {\r\n width: \"100%\",\r\n marginBottom: 20,\r\n },\r\n numberInput: {\r\n width: 50,\r\n marginRight: 10,\r\n },\r\n applyButton: {\r\n width: \"100%\",\r\n },\r\n hidden: {\r\n display: \"none\",\r\n },\r\n};\r\n\r\nclass ProteomSettings extends Component {\r\n render() {\r\n const { classes, metaData, projectStringProperties, onChangeMetaData } =\r\n this.props;\r\n if (typeof projectStringProperties === \"undefined\") return
    ;\r\n return (\r\n
    \r\n \r\n onChangeMetaData(\"Channel\", e.target.value)}\r\n value={metaData.Channel}\r\n >\r\n {projectStringProperties.Channel.split(\",\").map((value, index) => (\r\n \r\n {value}\r\n \r\n ))}\r\n \r\n \r\n\r\n \r\n onChangeMetaData(\"Proteome\", e.target.value)}\r\n value={metaData.Proteome}\r\n >\r\n {projectStringProperties.Proteome.split(\",\").map((value, index) => (\r\n \r\n {value}\r\n \r\n ))}\r\n \r\n \r\n\r\n \r\n Epitope type\r\n \r\n \r\n onChangeMetaData(\"Continues\", e.currentTarget.checked)\r\n }\r\n checked={Boolean(metaData.Continues)}\r\n />\r\n }\r\n label=\"Continuous\"\r\n />\r\n \r\n onChangeMetaData(\"Discontinues\", e.currentTarget.checked)\r\n }\r\n checked={Boolean(metaData.Discontinues)}\r\n />\r\n }\r\n label=\"Discontinuous\"\r\n />\r\n \r\n \r\n \r\n Epitope length\r\n
    \r\n {\r\n if (e.target.value < metaData.EpitopeLengthMax) {\r\n onChangeMetaData(\"EpitopeLengthMin\", e.target.value);\r\n }\r\n }}\r\n value={metaData.EpitopeLengthMin}\r\n className={classes.numberInput}\r\n />\r\n {\r\n if (e.target.value > metaData.EpitopeLengthMin) {\r\n onChangeMetaData(\"EpitopeLengthMax\", e.target.value);\r\n }\r\n }}\r\n value={metaData.EpitopeLengthMax}\r\n className={classes.numberInput}\r\n />\r\n
    \r\n
    \r\n \r\n \r\n Minimum score (do not show results with lower score)\r\n \r\n
    \r\n onChangeMetaData(\"MinScore\", e.target.value)}\r\n inputProps={{ step: \"0.01\" }}\r\n value={metaData.MinScore}\r\n className={classes.numberInput}\r\n />\r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nProteomSettings.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n metaData: PropTypes.object,\r\n projectProperties: PropTypes.object,\r\n projectStringProperties: PropTypes.object,\r\n onChangeMetaData: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(ProteomSettings);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport ProteomSettings from \"../../../proteomViewer/components/ProteomSettings\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport {\r\n DialogContent,\r\n TextField,\r\n FormHelperText,\r\n FormControlLabel,\r\n Checkbox,\r\n} from \"@mui/material\";\r\n\r\nconst styles = () => ({\r\n root: {},\r\n dialogContent: {\r\n paddingTop: 0,\r\n maxWidth: 900,\r\n height: 562,\r\n },\r\n});\r\n\r\nclass StepMetaData extends Component {\r\n render() {\r\n const {\r\n classes,\r\n formData,\r\n onChangeMetaData,\r\n projectProperties,\r\n projectStringProperties,\r\n } = this.props;\r\n const metaData = formData.metaData;\r\n return (\r\n \r\n \r\n Meta Data for Project !\r\n \r\n {formData.projectType.includes(\"ProteomeAnalysis\") ? (\r\n \r\n ) : (\r\n Object.keys(metaData).map((metaField, i) => (\r\n
    \r\n {metaData[metaField] === true || metaData[metaField] === false ? (\r\n \r\n onChangeMetaData(metaField, e.currentTarget.checked)\r\n }\r\n name=\"checkedB\"\r\n color=\"primary\"\r\n />\r\n }\r\n label={metaField}\r\n />\r\n ) : (\r\n onChangeMetaData(metaField, e.target.value)}\r\n />\r\n )}\r\n {/* onChangeMetaData(metaField, null)}\r\n >\r\n \r\n */}\r\n
    \r\n ))\r\n )}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nStepMetaData.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n formData: PropTypes.object.isRequired,\r\n projectProperties: PropTypes.object,\r\n projectStringProperties: PropTypes.object,\r\n onChangeMetaData: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(StepMetaData);\r\n","// Framework imports\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport { ValidatorForm } from \"react-material-ui-form-validator\";\r\n\r\n// External packages\r\nimport {\r\n Button,\r\n Dialog,\r\n DialogTitle,\r\n MobileStepper,\r\n Divider,\r\n} from \"@mui/material\";\r\nimport { KeyboardArrowLeft, KeyboardArrowRight } from \"@mui/icons-material\";\r\n\r\n// HSA modules\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { viewerType } from \"../../common/utils/Utils\";\r\nimport { authenticationService } from \"../../common/services\";\r\n\r\nimport StepProjectModuleSelection from \"./CreateProjectdialogComponents/StepProjectModuleSelection\";\r\nimport StepMetaData from \"./CreateProjectdialogComponents/StepMetaData\";\r\nimport StepFileSelection from \"./CreateProjectdialogComponents/StepFileSelection\";\r\nimport { withStyles } from \"@mui/styles\";\r\n\r\nconst styles = {\r\n divider: {\r\n height: \"1px\", // Modify this to adjust the thickness\r\n backgroundColor: \"rgb(148,148,148)\", // You can also change the color here\r\n },\r\n};\r\nclass CreateProjectDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n submitted: false,\r\n activeStep: 0,\r\n projectTypes: [],\r\n formData: {\r\n name: props.newdefaultname,\r\n projectType: \"\",\r\n metaData: {},\r\n files: [],\r\n projectProperties: {},\r\n projectStringProperties: {},\r\n groups: [],\r\n },\r\n };\r\n\r\n this.user = null;\r\n\r\n Backend.loadAvailableProjectTypes((projectTypes) => {\r\n const { formData } = this.state;\r\n // order project types by order attribute\r\n projectTypes = projectTypes.sort((a, b) => a.order - b.order);\r\n Backend.getLicensingInfo((license) => {\r\n if (license.activeModules.length > 0) {\r\n if (license.licenseStatus !== \"VALID\") {\r\n authenticationService.logout();\r\n this.props.history.push(\"/licensing\");\r\n return;\r\n }\r\n\r\n projectTypes = projectTypes.map((projectType) => {\r\n if (license.activeModules.length > 0) {\r\n let activeModule = license.activeModules.find(\r\n (x) => x.name === projectType.name\r\n );\r\n if (activeModule) {\r\n projectType.expirationDate = activeModule.expirationDate;\r\n projectType.isValid = !activeModule.isExpired;\r\n projectType.expiresInDays = activeModule.expiresInDays;\r\n } else {\r\n projectType.isValid = false;\r\n }\r\n } else {\r\n projectType.isValid = true;\r\n }\r\n return projectType;\r\n });\r\n\r\n projectTypes = projectTypes.filter(\r\n (projectType) => typeof projectType.expirationDate !== \"undefined\"\r\n );\r\n if (projectTypes.length > 0) {\r\n // select default project type\r\n let firstValidProjectType = projectTypes.find((pt) => pt.isValid);\r\n if (firstValidProjectType) {\r\n formData.projectType = firstValidProjectType.name;\r\n for (let metaField of projectTypes.find(\r\n (c) => c.name === formData.projectType\r\n ).metaData) {\r\n // use existing value or init dict entry with empty string\r\n formData.metaData[metaField] =\r\n metaField === \"Datum\" || metaField === \"Date\"\r\n ? this.getDate()\r\n : formData.metaData[metaField] || \"\";\r\n }\r\n }\r\n }\r\n }\r\n // write received info into state\r\n this.setState({\r\n projectTypes: projectTypes,\r\n formData,\r\n metaData: {},\r\n files: [],\r\n });\r\n\r\n Backend.getCurrentUser((user) => {\r\n // const { formData } = this.state;\r\n this.user = user;\r\n });\r\n Backend.getCurrentUserGroups((response) => {\r\n let formData = this.state.formData;\r\n formData.groups = response;\r\n this.setState({ formData });\r\n });\r\n });\r\n });\r\n }\r\n\r\n handleKeyPress = (event) => {\r\n if (!this.props.open) return;\r\n\r\n if (event.key === \"Enter\") {\r\n this.handleNext();\r\n }\r\n };\r\n\r\n componentDidMount = () => {\r\n document.addEventListener(\"keyup\", this.handleKeyPress);\r\n };\r\n\r\n componentWillUnmount = () => {\r\n document.removeEventListener(\"keyup\", this.handleKeyPress);\r\n };\r\n\r\n componentDidUpdate = (prevProps) => {\r\n // on open dialog\r\n if (prevProps.open !== this.props.open && this.props.open) {\r\n const { formData } = this.state;\r\n if (this.props.project) {\r\n formData.files = [\r\n ...new Set(\r\n this.props.project.previewImageFiles.map(\r\n (file) => file.relativePath\r\n )\r\n ),\r\n ];\r\n formData.name = this.props.project.name;\r\n formData.projectType = this.props.project.type;\r\n } else {\r\n formData.files = [];\r\n formData.name = this.props.newdefaultname;\r\n }\r\n this.setState({\r\n submitted: false,\r\n activeStep: 0,\r\n formData,\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Defines what happens when the next button is pressed.\r\n * When moving a step forward, checks are made to see if the next option is necessary.\r\n * When finishing the final step, project is created or updated.\r\n */\r\n handleNext = () => {\r\n if (this.props.project && this.state.activeStep === 0) {\r\n this.onSaveName();\r\n this.setState({ activeStep: 2 });\r\n return;\r\n }\r\n const { formData } = this.state;\r\n if (this.state.activeStep >= 2) {\r\n if (this.state.formData.files.length === 0) {\r\n return;\r\n }\r\n // last step -> submit data\r\n this.setState({ submitted: true });\r\n if (this.props.project) {\r\n //this.onSaveName(this.props.project.name);\r\n Backend.updateProjectFiles(this.props.project.id, formData, () => {\r\n this.setState({ submitted: false });\r\n this.handleClose();\r\n });\r\n } else {\r\n if (\r\n formData.projectType.includes(\"HistoClassification\") ||\r\n formData.projectType.includes(\"HistoPointCounting\")\r\n ) {\r\n let name = formData.files[0];\r\n name = name.replace(/\\\\/g, \"/\");\r\n let name_array = name.split(\"/\");\r\n name = name_array[name_array.length - 1];\r\n name = name.split(\".\")[0];\r\n name_array = name.split(\"-\");\r\n let i = 0;\r\n while (i < name_array.length - 1) {\r\n if (i === 0) {\r\n name = name_array[i];\r\n } else {\r\n name = name + \"-\" + name_array[i];\r\n }\r\n i = i + 1;\r\n }\r\n\r\n formData.name = name;\r\n this.setState({ formData: formData });\r\n }\r\n Backend.createProject(this.state.formData, (e) => {\r\n this.setState({ submitted: false });\r\n this.handleClose();\r\n if (formData.projectType.includes(\"ProteomeAnalysis\")) {\r\n Backend.loadProject(\r\n {\r\n id: e.projectId,\r\n },\r\n (project) => {\r\n Backend.getCurrentUser((user) => {\r\n const projectModel = {\r\n name: project.name,\r\n user: user.fullName,\r\n id: project.id,\r\n readableId: project.readableId,\r\n metaData: JSON.parse(project.metaData),\r\n type: project.type,\r\n tools: project.viewerConfig.project.tools,\r\n job: project.viewerConfig.project.job,\r\n files: project.files,\r\n };\r\n Backend.saveProject(projectModel, (data) => {\r\n if (data.success) {\r\n this.props.handleActiveTabChange(0);\r\n Backend.setProjectsPending([project.id], () => {\r\n console.log(\"job ready to start!\");\r\n });\r\n }\r\n });\r\n });\r\n }\r\n );\r\n } else {\r\n this.props.history.push(\r\n viewerType(formData.projectType) + e.projectId\r\n );\r\n }\r\n });\r\n }\r\n } else {\r\n let nextStep = this.state.activeStep + 1;\r\n if (formData.projectType === \"\") {\r\n window.showWarningSnackbar(\"Please select a Project Module!\");\r\n return;\r\n }\r\n\r\n if (nextStep === 1 && Object.keys(formData.metaData).length === 0) {\r\n nextStep++;\r\n }\r\n this.setState({ activeStep: nextStep, formData });\r\n }\r\n };\r\n\r\n handleBack = () => {\r\n const { formData } = this.state;\r\n if (this.state.activeStep === 0) {\r\n this.props.onClose();\r\n } else {\r\n if (this.props.project) {\r\n this.setState({ activeStep: 0 });\r\n return;\r\n }\r\n let prevStep = this.state.activeStep - 1;\r\n\r\n if (prevStep === 1 && Object.keys(formData.metaData).length === 0) {\r\n prevStep--;\r\n }\r\n formData.files = [];\r\n this.setState({ activeStep: prevStep, formData: formData });\r\n }\r\n };\r\n\r\n handleClose = () => {\r\n this.props.onClose();\r\n };\r\n\r\n uploadFile() {\r\n Backend.uploadFile(\r\n this.state.files[0],\r\n (e) => {\r\n this.setState({ completed: e });\r\n },\r\n () => {\r\n this.handleClose();\r\n }\r\n );\r\n }\r\n\r\n onChangeName = (e) => {\r\n const { formData } = this.state;\r\n formData.name = e;\r\n this.setState({ formData });\r\n if (this.props.project) {\r\n let project = this.props.project;\r\n project.name = e;\r\n }\r\n };\r\n\r\n onSaveName = () => {\r\n if (this.props.project) {\r\n Backend.renameProject(\r\n this.props.project.id,\r\n this.props.project.name,\r\n () => {\r\n console.log(\"project name changed to:\", this.props.project.name);\r\n }\r\n );\r\n }\r\n };\r\n\r\n /**\r\n * Fills in project parameters for saving.\r\n * Checks for valid expiration date and gives expiration notice.\r\n * @param {Object} e Selected module from step 0, including properties.\r\n */\r\n onProjectType = (e) => {\r\n let formData = this.state.formData;\r\n formData.projectProperties = e.projectProperties;\r\n formData.projectStringProperties = e.ProjectStringProperties;\r\n formData.metaData = e.metaData;\r\n formData.toolsInProject = e.toolsInProject;\r\n this.setState({ formData: formData });\r\n\r\n if (!e.isValid && e.expirationDate) {\r\n window.openWarningDialog(\r\n \"This Project Module expired on \" +\r\n e.expirationDate.replace(\"T00:00:00\", \"\") +\r\n \".\\nPlease contact HS Analysis GmbH to updated the licence!\"\r\n );\r\n return;\r\n }\r\n if (this.props.project) {\r\n window.openWarningDialog(\r\n \"Project already created and the Project Type can't be changed afterwards.\\nPlease create a new Project instead.\"\r\n );\r\n } else {\r\n const { formData, projectTypes } = this.state;\r\n formData.projectType = e.name;\r\n formData.metaData = {};\r\n\r\n let selectedProjectType = projectTypes.find(\r\n (pt) => pt.name === formData.projectType\r\n );\r\n if (\r\n (\"selectedProjectType\",\r\n selectedProjectType &&\r\n selectedProjectType.name.includes(\"ProteomeAnalysis\"))\r\n ) {\r\n formData.projectStringProperties =\r\n selectedProjectType.projectStringProperties;\r\n formData.projectProperties = selectedProjectType.projectProperties;\r\n for (const [key, value] of Object.entries(\r\n formData.projectStringProperties\r\n )) {\r\n formData.metaData[key] = value.split(\",\")[0];\r\n }\r\n for (const [key, value] of Object.entries(formData.projectProperties)) {\r\n formData.metaData[key] = value;\r\n }\r\n }\r\n\r\n for (let metaField of projectTypes.find((c) => c.name === e.name)\r\n .metaData) {\r\n // use existing value or init dict entry with empty string\r\n formData.metaData[metaField] =\r\n metaField === \"Datum\" || metaField === \"Date\"\r\n ? this.getDate()\r\n : formData.metaData[metaField] || \"\";\r\n }\r\n this.setState({ formData });\r\n }\r\n };\r\n\r\n onChangeMetaData = (field, e) => {\r\n const { formData } = this.state;\r\n if (e === null) {\r\n // delete field\r\n delete formData.metaData[field];\r\n } else {\r\n // update fiel value\r\n formData.metaData[field] = e;\r\n }\r\n this.setState({ formData });\r\n };\r\n\r\n onChangeFiles = (e) => {\r\n const { formData } = this.state;\r\n formData.files = e;\r\n this.setState({ formData });\r\n };\r\n\r\n getDate = () => {\r\n let today = new Date();\r\n let dd = String(today.getDate()).padStart(2, \"0\");\r\n let mm = String(today.getMonth() + 1).padStart(2, \"0\");\r\n let yyyy = today.getFullYear();\r\n today = dd + \".\" + mm + \".\" + yyyy;\r\n return today;\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { activeStep, formData, projectTypes, submitted } = this.state;\r\n\r\n return (\r\n \r\n Create New Project\r\n \r\n
    \r\n \r\n {activeStep === 0 && (\r\n \r\n )}\r\n {activeStep === 1 && (\r\n \r\n )}\r\n {activeStep === 2 && (\r\n \r\n )}\r\n \r\n {/* Change Next Button depending on if you're editing a project\r\n or creating a new one */}\r\n {this.props.project && this.state.activeStep > 1\r\n ? \"Save\"\r\n : \"Next\"}\r\n\r\n \r\n \r\n }\r\n backButton={\r\n \r\n \r\n {\"Back\"}\r\n \r\n }\r\n />\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nCreateProjectDialog.propTypes = {\r\n project: PropTypes.object,\r\n onClose: PropTypes.func,\r\n selectedValue: PropTypes.string,\r\n newdefaultname: PropTypes.string,\r\n handleActiveTabChange: PropTypes.func,\r\n open: PropTypes.bool,\r\n history: PropTypes.object,\r\n classes: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withRouter(withStyles(styles)(CreateProjectDialog));\r\n","// Framework imports\r\nimport React, { useState, useRef, useEffect } from \"react\";\r\nimport { PropTypes } from \"prop-types\";\r\n\r\n/**\r\n * Only load the visible children of a (long) list.\r\n * @param {Array} children Children to be rendered only whne in rendering area.\r\n * @param {number} maxContainerHeight The maximum allowed height of the container in pixels.\r\n * @param {number} elementHeight The height of a single element. all elements assumed to be the same height.\r\n * @param {number} offsetElements Optional. The number of elements to be preloaded outside of visible area. Defaults to 2.\r\n * @returns\r\n */\r\nconst LazyRender = React.forwardRef((props, ref) => {\r\n const {\r\n children,\r\n maxContainerHeight,\r\n elementHeight,\r\n offsetElements = 2,\r\n } = props;\r\n const containerRef = useRef();\r\n\r\n const [scrollPositionTop, setScrollPositionTop] = useState(0);\r\n const [containerHeight, setContainerHeight] = useState(100);\r\n\r\n useEffect(() => {\r\n setContainerHeight(containerRef.current.clientHeight);\r\n containerRef.current.addEventListener(\"scroll\", (e) => handleScroll(e));\r\n return containerRef.current.removeEventListener(\"scroll\", (e) =>\r\n handleScroll(e)\r\n );\r\n }, []);\r\n\r\n useEffect(() => {\r\n setContainerHeight(containerRef.current.clientHeight);\r\n }, [children.length]);\r\n\r\n /**\r\n * Update position and container properties on scroll.\r\n * @param {event} e Scrollevent.\r\n */\r\n const handleScroll = (e) => {\r\n setScrollPositionTop(e.target.scrollTop);\r\n };\r\n\r\n /**\r\n * Scrolls smoothly to the bottom of the list\r\n */\r\n const scrollBottom = () => {\r\n if (containerRef.current) {\r\n const { scrollHeight, clientHeight } = containerRef.current;\r\n containerRef.current.scrollTo({\r\n top: scrollHeight - clientHeight,\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * The placeholder to put in place of a non-rendered element\r\n */\r\n const placeholder = (key) => (\r\n
    \r\n );\r\n\r\n /**\r\n * Determine if an element should be rendered depending on its position.\r\n * @param {int} idx The index of the element in an arrray.\r\n * @returns {Boolean} Whether an element sould be rendered.\r\n */\r\n function isInView(idx) {\r\n const pos = idx * elementHeight;\r\n\r\n const minRendered = scrollPositionTop - offsetElements * elementHeight;\r\n const maxRendered =\r\n scrollPositionTop + containerHeight + offsetElements * elementHeight;\r\n\r\n const shouldBeRendered = pos >= minRendered && pos <= maxRendered;\r\n return shouldBeRendered;\r\n }\r\n\r\n // make scrollBottom() callable from parent component\r\n React.useImperativeHandle(ref, () => ({\r\n scrollBottom,\r\n }));\r\n\r\n return (\r\n \r\n {children.map((c, i) => (isInView(i) ? c : placeholder(i)))}\r\n
    \r\n );\r\n});\r\n\r\nLazyRender.propTypes = {\r\n children: PropTypes.array.isRequired,\r\n maxContainerHeight: PropTypes.number.isRequired,\r\n elementHeight: PropTypes.number.isRequired,\r\n offsetElements: PropTypes.number,\r\n};\r\n\r\nLazyRender.displayName = \"LazyRender\";\r\nexport default LazyRender;\r\n","// Framework imports\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// External packages\r\nimport CheckIcon from \"@mui/icons-material/Check\";\r\nimport Accordion from \"@mui/material/Accordion\";\r\nimport AccordionSummary from \"@mui/material/AccordionSummary\";\r\nimport AccordionDetails from \"@mui/material/AccordionDetails\";\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogContentText from \"@mui/material/DialogContentText\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport InputAdornment from \"@mui/material/InputAdornment\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport ContentCopyIcon from \"@mui/icons-material/ContentCopy\";\r\nimport ErrorIcon from \"@mui/icons-material/Error\";\r\n\r\n// HSA imports\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport LazyRender from \"../../common/components/LazyRender\";\r\n\r\nconst styles = () => ({\r\n root: {},\r\n dialogContent: {\r\n paddingTop: 0,\r\n maxWidth: 900,\r\n minWidth: 750,\r\n },\r\n});\r\n\r\n/**\r\n * Enum for project action mode.\r\n */\r\nexport const ProjectActionMode = Object.freeze({\r\n Import: 0,\r\n Update: 1,\r\n});\r\n\r\n/**\r\n * Content of the dialog, depending on the project action mode.\r\n */\r\nconst _dialogContent = Object.freeze({\r\n [ProjectActionMode.Import]: {\r\n title: \"Map Files of Imported Project\",\r\n text: \"An exported project does not contain image files, only their respective names. \",\r\n },\r\n [ProjectActionMode.Update]: {\r\n title: \"Re-Map Missing Files\",\r\n text: \"Not all files previously associated with this project could be found in their original location. \",\r\n },\r\n});\r\n\r\nclass FindFilesDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n formData: props.formData ?? {\r\n fileMappings: [],\r\n },\r\n openAccordion: null,\r\n dialogIsOpen: Boolean(props.open),\r\n onSuccess: props.onSuccess ?? (() => {}),\r\n };\r\n }\r\n\r\n /**\r\n * Open/Show FindFilesDialog.\r\n * Main way to open this dialog.\r\n * @param {JSON} formData File mappings, mapping previous to new files.\r\n */\r\n show(formData, onSuccess = () => {}) {\r\n this.setState({ dialogIsOpen: true, formData, onSuccess: onSuccess });\r\n }\r\n\r\n /**\r\n * Close FindFilesDialog. Resets state.\r\n */\r\n handleClose = () => {\r\n this.setState({\r\n dialogIsOpen: false,\r\n openAccordion: null,\r\n formData: {\r\n fileMappings: [],\r\n projects: [],\r\n },\r\n });\r\n };\r\n\r\n /**\r\n * Submit all updated filepaths to backend for check and - if successfull - project completion.\r\n */\r\n handleSubmit = () => {\r\n const { formData } = this.state;\r\n const { projectActionMode } = this.props;\r\n Backend.checkFileMappings(\r\n formData,\r\n projectActionMode,\r\n (res) => {\r\n // Incomplete file mappings\r\n if (!res.allUniquelyMapped) {\r\n window.showWarningSnackbar(\r\n `Not all files could be uniquely associated. Please adapt the paths of all missing or duplicate paths.`\r\n );\r\n this.setState({ formData: res });\r\n return;\r\n }\r\n // Import completed without changes\r\n this.handleClose();\r\n this.state.onSuccess();\r\n\r\n \r\n },\r\n // Error\r\n (err) => {\r\n console.error(err);\r\n window.openWarningDialog(err);\r\n }\r\n );\r\n };\r\n\r\n /**\r\n * Generates a formatted file list, so that all three types of files may ues the same code.\r\n * @param {Array} files Files to map to screen.\r\n * @returns {div} Files mapped and formatted.\r\n */\r\n generateFileList(files) {\r\n return (\r\n \r\n {files.map((f) => (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n ) : f.found ? (\r\n // Files found\r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n // Missing files\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n }}\r\n disabled\r\n margin=\"dense\"\r\n label=\"Old Path\"\r\n fullWidth\r\n variant=\"filled\"\r\n />\r\n {\r\n f.newPath = e.target.value;\r\n this.forceUpdate();\r\n }}\r\n margin=\"dense\"\r\n label=\"New Path\"\r\n fullWidth\r\n error={!f.found || f.duplicatePath}\r\n />\r\n
    \r\n ))}\r\n
    \r\n );\r\n }\r\n\r\n render() {\r\n const { dialogIsOpen, formData } = this.state;\r\n const { classes, projectActionMode } = this.props;\r\n // Only show unique source files, not one per scene of file.\r\n const uniqueFiles = formData.fileMappings\r\n .filter(\r\n (mapping, index, array) =>\r\n array.findIndex(\r\n (el) => el.file.sourcePath === mapping.file.sourcePath\r\n ) === index\r\n )\r\n .sort((a, b) => a.file.sourcePath.localeCompare(b.file.sourcePath));\r\n\r\n const filesFound = uniqueFiles.filter((f) => f.found);\r\n const duplicates = uniqueFiles.filter((f) => f.duplicatePath);\r\n const missing = uniqueFiles.filter((f) => !f.found && !f.duplicatePath);\r\n\r\n return (\r\n \r\n \r\n {_dialogContent[projectActionMode].title}\r\n \r\n \r\n \r\n {_dialogContent[projectActionMode].text}\r\n Please select the corresponding files from your hard drive.\r\n \r\n {\r\n this.setState({ openAccordion: expanded ? \"found\" : null });\r\n }}\r\n >\r\n \r\n {`Files Found (${filesFound.length})`}\r\n \r\n \r\n \r\n No further action needed. These files could automatically be\r\n associated with existing files inside your slides folder.\r\n \r\n {this.generateFileList(filesFound)}\r\n \r\n \r\n {\r\n this.setState({ openAccordion: expanded ? \"missing\" : null });\r\n }}\r\n >\r\n \r\n {`Files Missing (${missing.length})`}\r\n \r\n \r\n \r\n These files could not be automatically found inside your slides\r\n folder. Perhaps their names have changed or they need to be\r\n added again. Please insert missing files to the slides folder or\r\n specify their new name.\r\n \r\n {this.generateFileList(missing)}\r\n \r\n \r\n {\r\n this.setState({ openAccordion: expanded ? \"duplicate\" : null });\r\n }}\r\n >\r\n \r\n {`Duplicate Files (${duplicates.length})`}\r\n \r\n \r\n \r\n Multiple of the imported files have been associated with the\r\n same file inside your slides folder. It could not be\r\n automatically determined which on is correct, so the first one\r\n was chosen. It is not allowed to have the same file twice in a\r\n project, therefore, please inspect all duplicated and specify\r\n their correct path.\r\n \r\n {this.generateFileList(duplicates)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nFindFilesDialog.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n projectActionMode: PropTypes.number.isRequired,\r\n formData: PropTypes.object,\r\n open: PropTypes.bool,\r\n onSuccess: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(FindFilesDialog);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nclass CustomSvgIcon extends React.Component {\r\n render() {\r\n const { name, width, height, stroke, vertAlign } = this.props;\r\n switch (name) {\r\n case \"GrabCutIcon\":\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n case \"SAMIcon\":\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n case \"ResultsIcon\":\r\n return (\r\n \r\n \r\n \r\n );\r\n case \"HeatmapIcon\":\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n case \"ResetZoomIcon\":\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n}\r\n\r\nCustomSvgIcon.propTypes = {\r\n name: PropTypes.string,\r\n width: PropTypes.string,\r\n height: PropTypes.string,\r\n stroke: PropTypes.string,\r\n vertAlign: PropTypes.string,\r\n};\r\n\r\nexport default CustomSvgIcon;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport Button from \"@mui/material/Button\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport EditIcon from \"@mui/icons-material/Edit\";\r\nimport PlayArrowIcon from \"@mui/icons-material/PlayArrow\";\r\nimport TimerIcon from \"@mui/icons-material/Timer\";\r\nimport LinearProgress from \"@mui/material/LinearProgress\";\r\nimport FileCopyIcon from \"@mui/icons-material/FileCopy\";\r\nimport StopIcon from \"@mui/icons-material/Stop\";\r\n\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport CustomSvgIcon from \"../../globalComponents/CustomSvgIcon\";\r\nimport { convertDate } from \"../../common/utils/Localization\";\r\n\r\nconst ProjectsTableRow = (props) => {\r\n const {\r\n classes,\r\n projectTypes,\r\n isSelected,\r\n project,\r\n handleClick,\r\n handleSelectOneClick,\r\n onEditProject,\r\n history,\r\n handleActiveTabChange,\r\n user,\r\n } = props;\r\n\r\n /**\r\n * Returns Label of a project type\r\n * @param {String} type Project type string\r\n */\r\n const labelFromProjectType = () => {\r\n if (!projectTypes) return project.type;\r\n let resultObject = projectTypes.find((c) => c.name === project.type);\r\n return resultObject ? resultObject.label : project.type;\r\n };\r\n\r\n const handleContextmenu = (e) => {\r\n e.preventDefault();\r\n handleSelectOneClick(e, project);\r\n };\r\n\r\n const onCancelRowClick = (e) => {\r\n e.stopPropagation();\r\n Backend.cancelJob(project.id);\r\n };\r\n\r\n // Sets job state for project to pending, so that it can be run, when no other job is running\r\n const onRunRowClick = (e) => {\r\n e.stopPropagation();\r\n Backend.setProjectsPending([project.id], () => {\r\n console.log(\"project state changed to pending:\", project.id);\r\n });\r\n };\r\n\r\n const onDuplicateSingleClick = (e) => {\r\n e.stopPropagation();\r\n Backend.duplicateProjects([project.id], () => {\r\n handleActiveTabChange(0);\r\n });\r\n };\r\n\r\n const onProjectStateClick = (e, id) => {\r\n e.stopPropagation();\r\n Backend.loadProjectMessage(id)\r\n .then((jsonResponse) => {\r\n if (jsonResponse.message) {\r\n console.log(jsonResponse.message);\r\n }\r\n })\r\n .catch((error) => {\r\n console.log(\"Error:\", error);\r\n });\r\n };\r\n\r\n const onProjectErrorStateClick = (e, id) => {\r\n e.stopPropagation();\r\n Backend.loadProjectMessage(id)\r\n .then((jsonResponse) => {\r\n if (jsonResponse.message) {\r\n window.openErrorDialog(jsonResponse.message);\r\n }\r\n })\r\n .catch((error) => {\r\n console.log(\"Error:\", error);\r\n });\r\n };\r\n\r\n /**\r\n * Set job state for project to timed\r\n * @param {MouseEvent} e\r\n */\r\n const onSetTimedClick = (e) => {\r\n e.stopPropagation();\r\n Backend.setProjectsTimed([project.id], () => {\r\n console.log(\"project state changed to timed:\", project.id);\r\n });\r\n };\r\n\r\n //Updates label style according to project state\r\n const labelFromState = () => {\r\n switch (project.state) {\r\n case \"creating\":\r\n return (\r\n \r\n onProjectStateClick(e, project.id)}\r\n >\r\n \r\n
    {project.progress}%
    \r\n
    \r\n \r\n );\r\n case \"running\":\r\n return (\r\n \r\n onProjectStateClick(e, project.id)}\r\n >\r\n \r\n
    {project.progress}%
    \r\n \r\n \r\n );\r\n case \"success\":\r\n return (\r\n onProjectStateClick(e, project.id)}\r\n >\r\n Finished\r\n \r\n );\r\n case \"error\":\r\n return (\r\n onProjectErrorStateClick(e, project.id)}\r\n >\r\n {project.state}\r\n \r\n );\r\n default:\r\n return (\r\n onProjectStateClick(e, project.id)}>\r\n {project.state}\r\n \r\n );\r\n }\r\n };\r\n\r\n return (\r\n handleClick(event, project)}\r\n role=\"checkbox\"\r\n aria-checked={isSelected}\r\n tabIndex={-1}\r\n key={project.id}\r\n selected={isSelected}\r\n onContextMenu={handleContextmenu}\r\n >\r\n \r\n \r\n \r\n handleSelectOneClick(event, project)}\r\n />\r\n \r\n \r\n \r\n {project.readableId}\r\n \r\n \r\n {project.previewImageFiles\r\n .slice(0, Math.min(5, project.previewImageFiles.length))\r\n .map((file) => {\r\n return (\r\n
    \r\n
    \r\n {\r\n \r\n }\r\n \r\n {file.fileName}\r\n
    \r\n
    \r\n \r\n );\r\n })}\r\n
    \r\n }\r\n >\r\n {\r\n (event.target.style.display = \"none\")}\r\n width=\"60\"\r\n height=\"60\"\r\n src={Backend.renderThumbnail(\r\n project.previewImageFiles.length > 0\r\n ? project.previewImageFiles[0].id\r\n : 0\r\n )}\r\n alt=\"\"\r\n />\r\n }\r\n \r\n \r\n \r\n \r\n {project.name}\r\n \r\n\r\n {!project.type.includes(\"HistoPointCounting\") &&\r\n !project.type.includes(\"HistoClassification\") && (\r\n \r\n \r\n {\r\n onEditProject(project);\r\n e.stopPropagation();\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n {project.ownerName}\r\n {labelFromProjectType()}\r\n {labelFromState()}\r\n \r\n {convertDate(project.creationDateTime).toLocaleString()}\r\n \r\n \r\n {project.state === \"success\" && project.type !== \"ProteomeAnalysis\" ? (\r\n \r\n \r\n {\r\n e.stopPropagation();\r\n history.push(\"/report/\" + project.id);\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n ) : (\r\n \"\"\r\n )}\r\n {project.state === \"success\" && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {!project.type.includes(\"HistoPointCounting\") &&\r\n !project.type.includes(\"HistoClassification\") && (\r\n \r\n {project.state === \"running\" ||\r\n project.state === \"timed\" ||\r\n project.state === \"pending\" ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n {!project.canRun ||\r\n project.state === \"running\" ||\r\n project.state === \"pending\" ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nProjectsTableRow.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n user: PropTypes.object,\r\n projectTypes: PropTypes.array.isRequired,\r\n isSelected: PropTypes.bool.isRequired,\r\n project: PropTypes.object.isRequired,\r\n handleClick: PropTypes.func.isRequired,\r\n handleSelectOneClick: PropTypes.func.isRequired,\r\n onEditProject: PropTypes.func.isRequired,\r\n history: PropTypes.object.isRequired,\r\n handleActiveTabChange: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default ProjectsTableRow;\r\n","// Copyright HS-Analysis GmbH, 2019\r\n\r\n// Framework imports\r\nimport React, { useRef } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\n// External imports\r\nimport classNames from \"classnames\";\r\n\r\n// Material UI imports\r\nimport { lighten, darken } from \"@mui/material/styles\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport CloudDownload from \"@mui/icons-material/CloudDownload\";\r\nimport CloudUpload from \"@mui/icons-material/CloudUpload\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport FileCopy from \"@mui/icons-material/FileCopy\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport PlayArrowIcon from \"@mui/icons-material/PlayArrow\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport Merge from \"@mui/icons-material/MergeType\";\r\nimport Tab from \"@mui/material/Tab\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport TableSortLabel from \"@mui/material/TableSortLabel\";\r\nimport Tabs from \"@mui/material/Tabs\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport TimerIcon from \"@mui/icons-material/Timer\";\r\nimport Toolbar from \"@mui/material/Toolbar\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\n// HSA imports\r\nimport \"./../../css/tooltip.css\";\r\nimport { authenticationService } from \"../../common/services\";\r\nimport { viewerType } from \"../../common/utils/Utils\";\r\nimport { withSpinloader } from \"../../common/components/Spinloader\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport FindFilesDialog, { ProjectActionMode } from \"../dialogs/FindFilesDialog\";\r\nimport ProjectsTableRow from \"./ProjectsTableRow\";\r\n\r\nfunction desc(a, b, orderBy) {\r\n if (b[orderBy] < a[orderBy]) {\r\n return -1;\r\n }\r\n if (b[orderBy] > a[orderBy]) {\r\n return 1;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction stableSort(array, cmp) {\r\n const stabilizedThis = array.map((el, index) => [el, index]);\r\n stabilizedThis.sort((a, b) => {\r\n const order = cmp(a[0], b[0]);\r\n if (order !== 0) return order;\r\n return a[1] - b[1];\r\n });\r\n return stabilizedThis.map((el) => el[0]);\r\n}\r\n\r\nfunction getSorting(order, orderBy) {\r\n return order === \"desc\"\r\n ? (a, b) => desc(a, b, orderBy)\r\n : (a, b) => -desc(a, b, orderBy);\r\n}\r\n\r\nconst rows = [\r\n { id: \"readableId\", numeric: false, disablePadding: false, label: \"ID\" },\r\n { id: \"thumbnail\", numeric: false, disablePadding: true, label: \"Preview\" },\r\n { id: \"name\", numeric: false, disablePadding: true, label: \"Name\" },\r\n { id: \"creator\", numeric: false, disablePadding: false, label: \"Creator\" },\r\n { id: \"type\", numeric: true, disablePadding: false, label: \"Method\" },\r\n { id: \"state\", numeric: true, disablePadding: false, label: \"State\" },\r\n {\r\n id: \"creationDateTime\",\r\n numeric: true,\r\n disablePadding: false,\r\n label: \"Created\",\r\n },\r\n { id: \"actions\", numeric: false, disablePadding: false, label: \"Actions\" },\r\n];\r\n\r\nclass EnhancedTableHead extends React.Component {\r\n createSortHandler = (property) => (event) => {\r\n this.props.onRequestSort(event, property);\r\n };\r\n\r\n render() {\r\n const { onSelectAllClick, order, orderBy, numSelected } = this.props;\r\n\r\n return (\r\n \r\n \r\n \r\n 0}\r\n onChange={onSelectAllClick}\r\n />\r\n \r\n {rows.map(\r\n (row) => (\r\n \r\n \r\n \r\n {row.label}\r\n \r\n \r\n \r\n ),\r\n this\r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nEnhancedTableHead.propTypes = {\r\n numSelected: PropTypes.number.isRequired,\r\n onRequestSort: PropTypes.func.isRequired,\r\n onSelectAllClick: PropTypes.func.isRequired,\r\n order: PropTypes.string.isRequired,\r\n orderBy: PropTypes.string.isRequired,\r\n rowCount: PropTypes.number.isRequired,\r\n};\r\n\r\nconst toolbarStyles = (theme) => ({\r\n root: {\r\n paddingRight: theme.spacing(1),\r\n display: \"grid\",\r\n gridTemplateColumns: \"auto auto 1fr auto auto auto\",\r\n },\r\n searchIcon: {\r\n fill: \"lightgray\",\r\n marginTop: 8,\r\n marginLeft: 20,\r\n },\r\n searchField: {\r\n marginLeft: 6,\r\n marginTop: 0,\r\n maxWidth: 300,\r\n },\r\n highlight:\r\n theme.palette.mode === \"light\"\r\n ? {\r\n color: theme.palette.secondary.main,\r\n backgroundColor: lighten(theme.palette.secondary.light, 0.85),\r\n }\r\n : {\r\n color: theme.palette.text.primary,\r\n backgroundColor: theme.palette.secondary.dark,\r\n },\r\n spacer: {\r\n flex: \"1 1 100%\",\r\n },\r\n actions: {\r\n color: theme.palette.text.secondary,\r\n },\r\n title: {\r\n flex: \"0 0 auto\",\r\n },\r\n});\r\n\r\nlet EnhancedTableToolbar = (props) => {\r\n const {\r\n numSelected,\r\n classes,\r\n onDeleteClick,\r\n onRunSelectedClick,\r\n onTimedRunSelectedClick,\r\n onDuplicateSelectedClick,\r\n onMergeSelectedClick,\r\n onImportClick,\r\n onExportClick,\r\n searchText,\r\n onChangeFilter,\r\n user,\r\n } = props;\r\n const canOpenProject = true; //TODO: Fix user.group.canOpenProject\r\n\r\n const fileUploader = useRef(null);\r\n\r\n const onChangeFile = (event) => {\r\n props.spinloader.show();\r\n event.stopPropagation();\r\n event.preventDefault();\r\n onImportClick(event.target.files);\r\n event.target.value = \"\";\r\n };\r\n\r\n return (\r\n 0,\r\n })}\r\n >\r\n
    \r\n {numSelected > 0 ? (\r\n \r\n {numSelected} selected\r\n \r\n ) : (\r\n Projects\r\n )}\r\n
    \r\n \r\n \r\n\r\n
    \r\n
    \r\n {numSelected > 0 ? (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n <>\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n ) : (\r\n \r\n \r\n fileUploader.current.click()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n
    \r\n \r\n );\r\n};\r\n\r\nEnhancedTableToolbar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n numSelected: PropTypes.number.isRequired,\r\n onDeleteClick: PropTypes.func,\r\n onImportClick: PropTypes.func,\r\n onExportClick: PropTypes.func,\r\n onRunSelectedClick: PropTypes.func,\r\n onTimedRunSelectedClick: PropTypes.func,\r\n searchText: PropTypes.string,\r\n onChangeFilter: PropTypes.func,\r\n onDuplicateSelectedClick: PropTypes.func,\r\n onMergeSelectedClick: PropTypes.func,\r\n spinloader: PropTypes.object,\r\n user: PropTypes.object,\r\n};\r\n\r\nEnhancedTableToolbar = withStyles(toolbarStyles)(EnhancedTableToolbar);\r\n\r\nconst styles = () => ({\r\n root: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"auto auto 1fr\",\r\n },\r\n table: {\r\n minWidth: 1020,\r\n },\r\n tableRow: {\r\n cursor: \"pointer\",\r\n },\r\n tableWrapper: {\r\n overflowX: \"auto\",\r\n height: \"100%\",\r\n },\r\n creatingJobBar: {\r\n backgroundColor: darken(\"#216DC0\", 0.3),\r\n },\r\n input: {\r\n width: \"calc(100% - 48px)\",\r\n },\r\n progressBarContainer: {\r\n position: \"relative\",\r\n },\r\n progressBar: {\r\n position: \"absolute\",\r\n left: 0,\r\n top: 0,\r\n width: \"100%\",\r\n lineHeight: \"20px\",\r\n textAlign: \"center\",\r\n },\r\n});\r\n\r\nclass ProjectsTable extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this._isMounted = false;\r\n this.state = {\r\n order: \"desc\",\r\n orderBy: \"changeDateTime\",\r\n selected: [],\r\n page: 0,\r\n searchText: \"\",\r\n topScrollPos: 0,\r\n bottomScrollPos: 0,\r\n };\r\n this.tableContainerRef = React.createRef();\r\n }\r\n\r\n componentDidMount = () => {\r\n this._isMounted = true;\r\n const tableContainerEl = this.tableContainerRef.current;\r\n tableContainerEl.addEventListener(\"scroll\", this.handleScroll);\r\n this.handleScroll();\r\n Backend.loadAvailableProjectTypes((e) => {\r\n this.setState({\r\n projectTypes: e,\r\n projectTypesNames: e.map((projectType) => projectType.name),\r\n });\r\n });\r\n };\r\n\r\n componentWillUnmount = () => {\r\n const tableContainerEl = this.tableContainerRef.current;\r\n tableContainerEl.removeEventListener(\"scroll\", this.handleScroll);\r\n this._isMounted = false;\r\n };\r\n\r\n handleScroll = () => {\r\n const scrollTop = this.tableContainerRef.current.scrollTop;\r\n // const scrollHeight = this.tableContainerRef.current.scrollHeight;\r\n const clientHeight = this.tableContainerRef.current.clientHeight;\r\n\r\n this.setState({\r\n topScrollPos: scrollTop,\r\n bottomScrollPos: scrollTop + clientHeight,\r\n });\r\n };\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n onChangeFilter = (e) => {\r\n let searchText = e.target.value;\r\n this.setState({ searchText });\r\n };\r\n\r\n handleRequestSort = (event, property) => {\r\n const orderBy = property;\r\n let order = \"desc\";\r\n\r\n if (this.state.orderBy === property && this.state.order === \"desc\") {\r\n order = \"asc\";\r\n }\r\n\r\n this.setState({ order, orderBy });\r\n };\r\n\r\n handleSelectAllClick = (event) => {\r\n if (event.target.checked) {\r\n this.setState(() => ({\r\n selected: this.props.projects\r\n .filter((project) => {\r\n return this.isJobVisible(project);\r\n })\r\n .map((project) => project.id),\r\n }));\r\n } else {\r\n this.setState({ selected: [] });\r\n }\r\n };\r\n\r\n handleSelectOneClick = (e, project) => {\r\n let selectedObject = this.state.selected;\r\n let selectedIndex = selectedObject.indexOf(project.id);\r\n if (selectedIndex !== -1) selectedObject.splice(selectedIndex, 1);\r\n else selectedObject.push(project.id);\r\n this.setState(() => ({\r\n selected: selectedObject,\r\n }));\r\n e.stopPropagation();\r\n };\r\n\r\n handleClick = (event, project) => {\r\n if (!project.canOpen) {\r\n window.showWarningSnackbar(\"Opening this project forbidden by owner!\");\r\n } else if (this.props.serverIsRunning) {\r\n if (\r\n project.state === \"error\" ||\r\n project.state === \"success\" ||\r\n project.state === \"ready\" ||\r\n project.state === \"pending\" ||\r\n project.state === \"timed\" ||\r\n project.state === \"running\"\r\n ) {\r\n this.props.history.push(viewerType(project.type) + project.id);\r\n }\r\n } else {\r\n window.showWarningSnackbar(\"Local API Server not ready!\");\r\n }\r\n };\r\n\r\n handleContextmenu = (event, project) => {\r\n if (!this.isSelected(project.id)) {\r\n const { selected } = this.state;\r\n selected.push(project.id);\r\n this.setState({ selected });\r\n }\r\n event.preventDefault();\r\n return false;\r\n };\r\n\r\n isSelected = (id) => this.state.selected.indexOf(id) !== -1;\r\n\r\n onRunSelectedClick = () => {\r\n let projects = this.props.projects;\r\n let projectIds = [];\r\n for (let project of projects) {\r\n for (let id of this.state.selected) {\r\n if (id === project.id && project.canRun) {\r\n projectIds.push(id);\r\n }\r\n }\r\n }\r\n Backend.setProjectsPending(projectIds, () => {\r\n this.setState({ selected: [] });\r\n });\r\n };\r\n\r\n onTimedRunSelectedClick = () => {\r\n let projects = this.props.projects;\r\n let projectIds = [];\r\n for (let project of projects) {\r\n for (let id of this.state.selected) {\r\n if (id === project.id && project.canRun) {\r\n projectIds.push(id);\r\n }\r\n }\r\n }\r\n Backend.setProjectsTimed(projectIds, () => {\r\n console.log(\"projects state changed to timed:\", projectIds);\r\n this.setState({ selected: [] });\r\n });\r\n };\r\n\r\n /**\r\n * Import / Export Projects\r\n */\r\n onImportClick = (files) => {\r\n Backend.importProjects(files[0], (res) => {\r\n if (res.status === 403) {\r\n window.showErrorSnackbar(\"No Permission to import projects!\");\r\n } else {\r\n this.ImportProjectsDialog.show(res);\r\n this.setState({ selected: [] });\r\n }\r\n this.props.spinloader.hide();\r\n });\r\n };\r\n\r\n onExportClick = () => {\r\n this.props.spinloader.show();\r\n let exportName = \"\";\r\n let numSelected = 0;\r\n for (let project of this.props.projects) {\r\n if (this.state.selected.includes(project.id)) {\r\n if (numSelected === 0) {\r\n exportName += project.name;\r\n }\r\n numSelected++;\r\n }\r\n }\r\n if (numSelected > 1) {\r\n exportName += \"+\" + (numSelected - 1);\r\n }\r\n\r\n Backend.exportProjects(this.state.selected, exportName, () => {\r\n this.props.spinloader.hide();\r\n this.setState({ selected: [] });\r\n });\r\n };\r\n\r\n /**\r\n * Delete selected projects\r\n */\r\n onDeleteClick = () => {\r\n window.openResponseDialog(\r\n \"Do you really want to delete this project?\",\r\n (response) => {\r\n if (response) {\r\n Backend.deleteProjects(this.state.selected, () => {\r\n this.setState({ selected: [] });\r\n });\r\n // get projectnames for selected projectIDs\r\n let projects = this.props.projects.filter((project) =>\r\n this.state.selected.includes(project.id)\r\n );\r\n let projectNames = [];\r\n projects.forEach(function (element) {\r\n projectNames.push(element.name);\r\n });\r\n Backend.deleteGalleryExport(projectNames, () => {\r\n this.setState({ selected: [] });\r\n });\r\n }\r\n }\r\n );\r\n };\r\n\r\n onDuplicateSelectedClick = () => {\r\n Backend.duplicateProjects(this.state.selected, () => {\r\n this.setState({ selected: [] });\r\n this.props.handleActiveTabChange(0);\r\n });\r\n };\r\n\r\n onMergeSelectedClick = () => {\r\n let projectType = null;\r\n let projectTypesEqual = true;\r\n for (const selectedProjectId of this.state.selected) {\r\n const selectedProject = this.props.projects.find(\r\n (project) => project.id === selectedProjectId\r\n );\r\n if (projectType === null) {\r\n projectType = selectedProject.type;\r\n } else {\r\n if (projectType !== selectedProject.type) {\r\n projectTypesEqual = false;\r\n break;\r\n }\r\n }\r\n }\r\n if (projectTypesEqual) {\r\n Backend.mergeProjects(this.state.selected, (result) => {\r\n if (!result.success) {\r\n window.showErrorSnackbar(\"Merge failed!\");\r\n }\r\n this.setState({ selected: [] });\r\n this.props.handleActiveTabChange(0);\r\n });\r\n } else {\r\n window.showErrorSnackbar(\"Merge not possible. Types are not equal!\");\r\n }\r\n };\r\n\r\n handleChange = (event, value) => {\r\n if (value !== this.props.activeTab) {\r\n if (value === 1) {\r\n window.document.title = `Finished - HSA Kit ${window.version}`;\r\n } else {\r\n window.document.title = `Projects - HSA Kit ${window.version}`;\r\n }\r\n this.props.handleActiveTabChange(value);\r\n if (this.state.selected.length > 0) {\r\n this.setState({\r\n selected: [],\r\n });\r\n }\r\n }\r\n };\r\n\r\n countFinished(countOther) {\r\n let result = this.props.projects.length;\r\n if (this.props.projects.length > 0) {\r\n result = this.props.projects.reduce(\r\n (acc, cur) => acc + (cur.state === \"success\" ? 1 : 0),\r\n 0\r\n );\r\n }\r\n if (countOther) {\r\n result = this.props.projects.length - result;\r\n }\r\n return result;\r\n }\r\n\r\n isInView = (idx) => {\r\n const { topScrollPos, bottomScrollPos } = this.state;\r\n const headerSpace = 60;\r\n const rowHeight = 81; //including bottom border\r\n\r\n const idxTop = rowHeight * idx + headerSpace;\r\n const idxBottom = idxTop + rowHeight;\r\n\r\n return idxBottom >= topScrollPos && idxTop <= bottomScrollPos;\r\n };\r\n\r\n isJobVisible = (row) => {\r\n const { activeTab } = this.props;\r\n const { searchText } = this.state;\r\n let showJob = false;\r\n //filter if pending or finished\r\n if (searchText !== \"\") {\r\n if (!row.name.toLowerCase().includes(searchText.toLowerCase())) {\r\n return false;\r\n }\r\n }\r\n if (activeTab === 1) {\r\n showJob = row.state === \"success\";\r\n } else {\r\n showJob = row.state !== \"success\";\r\n }\r\n if (this.state.projectTypesNames) {\r\n //filter if job project module exists (release version)\r\n if (showJob) {\r\n return this.state.projectTypesNames.includes(row.type);\r\n } else {\r\n return false;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n render() {\r\n const { classes, projects, activeTab, spinloader, user } = this.props;\r\n const { order, orderBy, selected, searchText } = this.state;\r\n\r\n if (typeof this.props.user.group === \"undefined\") {\r\n authenticationService.logout();\r\n }\r\n\r\n const sortedProjects = stableSort(\r\n projects,\r\n getSorting(order, orderBy)\r\n ).filter((row) => {\r\n return this.isJobVisible(row);\r\n });\r\n\r\n return (\r\n \r\n (this.ImportProjectsDialog = c)}\r\n projectActionMode={ProjectActionMode.Import}\r\n />\r\n (this.FindMissingFiles = c)}\r\n projectActionMode={ProjectActionMode.Update}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {sortedProjects.map((project, idx) => {\r\n const isSelected = this.isSelected(project.id);\r\n if (this.isInView(idx)) {\r\n return (\r\n \r\n );\r\n } else {\r\n return ;\r\n }\r\n })}\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nProjectsTable.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n projects: PropTypes.array,\r\n activeTab: PropTypes.number,\r\n handleActiveTabChange: PropTypes.func,\r\n onEditProject: PropTypes.func,\r\n spinloader: PropTypes.object,\r\n serverIsRunning: PropTypes.bool,\r\n history: PropTypes.object,\r\n user: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(withSpinloader(withStyles(styles)(ProjectsTable)));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { Fab, Tooltip } from \"@mui/material\";\r\nimport CircularProgress from \"@mui/material/CircularProgress\";\r\nimport Backend from \"../common/utils/Backend\";\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\n\r\nimport CreateProjectDialog from \"./dialogs/CreateProjectDialog\";\r\nimport ProjectsTable from \"./components/ProjectsTable\";\r\n\r\nimport { authenticationService } from \"../common/services\";\r\n\r\n/**\r\n * Adds leading zeros to a number\r\n * @param {Number} num Number\r\n * @param {Number} size length that the number should have\r\n * @returns {String} String of number with zero padding\r\n */\r\nfunction pad(num, size) {\r\n var s = num + \"\";\r\n while (s.length < size) s = \"0\" + s;\r\n return s;\r\n}\r\n\r\n/**\r\n * Generates a default name for new Projects like \"Project 001\"\r\n * @param {Object[]} data List of Projects\r\n * @returns {String} Smart Default name for a new project\r\n */\r\nfunction incrementDefaultName(data) {\r\n let newDefaultName = \"Project 001\";\r\n let maxProjNum = 0;\r\n for (let proj of data) {\r\n if (proj.name.match(\"Project [0-9][0-9][0-9]\")) {\r\n const projNum = parseInt(proj.name.replace(\"Project \", \"\"), 10);\r\n let newMaxProjNum = Math.max(maxProjNum, projNum);\r\n if (newMaxProjNum) maxProjNum = newMaxProjNum;\r\n }\r\n }\r\n newDefaultName = `Project ${pad(maxProjNum + 1, 3)}`;\r\n return newDefaultName;\r\n}\r\n\r\nconst styles = (theme) => ({\r\n root: { height: \"100%\", overflow: \"hidden\" },\r\n fab: {\r\n position: \"absolute\",\r\n bottom: theme.spacing(2),\r\n right: theme.spacing(2),\r\n },\r\n});\r\n\r\nclass HomePage extends Component {\r\n constructor(props) {\r\n super(props);\r\n this._isMounted = false;\r\n this.state = {\r\n editableProject: null,\r\n projects: [],\r\n open: false,\r\n newDefaultName: \"Project 001\",\r\n activeTab: 0,\r\n serverIsRunning: false,\r\n user: { group: {} },\r\n };\r\n\r\n Backend.getCurrentUser((user) => {\r\n if (user.fullName === null) {\r\n authenticationService.logout();\r\n window.location.reload(true); //clear cache\r\n } else {\r\n this.setState({ user });\r\n }\r\n });\r\n this.checkPythonServer();\r\n }\r\n checkPythonServer = () => {\r\n Backend.isLocalServerReady((result) => {\r\n if (this.state.serverIsRunning !== result) {\r\n this.setMountedState({ serverIsRunning: result });\r\n }\r\n if (!result) {\r\n setTimeout(this.checkPythonServer, 2000);\r\n }\r\n });\r\n };\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n handleClickOpen = () => {\r\n Backend.getLicensingInfo((license) => {\r\n if (license.licenseStatus === \"VALID\") {\r\n this.setMountedState({\r\n editableProject: null,\r\n open: true,\r\n });\r\n } else {\r\n authenticationService.logout();\r\n this.props.history.push(\"/licensing\");\r\n }\r\n });\r\n };\r\n\r\n handleEditOpen = (project) => {\r\n this.setMountedState({\r\n editableProject: project,\r\n open: true,\r\n });\r\n };\r\n\r\n handleClose = () => {\r\n this.setMountedState({\r\n editableProject: null,\r\n open: false,\r\n });\r\n this.refreshProjects();\r\n };\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n this.refreshProjectsInterval();\r\n }\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n clearInterval(this.refreshInterval);\r\n }\r\n\r\n refreshProjectsInterval() {\r\n this.refreshProjects(() => {\r\n setTimeout(() => this.refreshProjectsInterval(), 1000);\r\n });\r\n }\r\n\r\n refreshProjects(callback) {\r\n if (!this._isMounted) return;\r\n Backend.listProjects(\r\n (data) => {\r\n let projectsChanged =\r\n JSON.stringify(this.state.projects) !== JSON.stringify(data);\r\n if (projectsChanged) {\r\n this.setMountedState({\r\n projects: data,\r\n newDefaultName: incrementDefaultName(data),\r\n });\r\n }\r\n callback();\r\n },\r\n (error) => {\r\n if (this._isMounted && callback) {\r\n console.error(\r\n \"Error loading projects, reloading page might help. Error: \" + error\r\n );\r\n callback();\r\n }\r\n }\r\n );\r\n }\r\n handleActiveTabChange = (activeTabIndex) => {\r\n if (this.state.activeTab !== activeTabIndex) {\r\n this.setMountedState({ activeTab: activeTabIndex });\r\n }\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { serverIsRunning } = this.state;\r\n return (\r\n
    \r\n \r\n \r\n {\r\n if (serverIsRunning) {\r\n this.handleClickOpen();\r\n } else {\r\n window.showWarningSnackbar(\"Local API Server not ready!\");\r\n }\r\n }}\r\n >\r\n {serverIsRunning ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nHomePage.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n history: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(withStyles(styles)(HomePage));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport Backend from \"../common/utils/Backend\";\r\n\r\nimport {\r\n Select,\r\n InputLabel,\r\n FormHelperText,\r\n FormControl,\r\n Typography,\r\n MenuItem,\r\n OutlinedInput,\r\n InputAdornment,\r\n IconButton,\r\n Tooltip,\r\n Button,\r\n} from \"@mui/material\";\r\nimport ContentCopyIcon from \"@mui/icons-material/ContentCopy\";\r\nimport ContentPasteIcon from \"@mui/icons-material/ContentPaste\";\r\nimport FileUploadIcon from \"@mui/icons-material/FileUpload\";\r\nimport { Folder } from \"@mui/icons-material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { ValidatorForm, TextValidator } from \"react-material-ui-form-validator\";\r\n\r\nimport CssBaseline from \"@mui/material/CssBaseline\";\r\nimport Paper from \"@mui/material/Paper\";\r\n\r\nimport FolderChooser from \"../admin/components/FolderChooser\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n width: \"auto\",\r\n display: \"block\", // Fix IE 11 issue.\r\n marginLeft: theme.spacing(3),\r\n marginRight: theme.spacing(3),\r\n [theme.breakpoints.up(600 + 3 * 2 * 8)]: {\r\n // [theme.breakpoints.up(500 + theme.spacing(3 * 2))]: {\r\n // In the mui v5 update, theme.spacing returns \"48px\" instead of 48.\r\n // Therefore, hardcoding the default theme.spacing multiplyer of 8.\r\n width: \"100%\",\r\n height: \"100%\",\r\n margin: 0,\r\n overflow: \"auto\",\r\n },\r\n },\r\n licensStatusContainer: {\r\n position: \"relative\",\r\n },\r\n licensingInputArea: {\r\n \"& textarea\": {\r\n overflow: \"auto !important\",\r\n minHeight: 50,\r\n maxHeight: \"184px\",\r\n },\r\n },\r\n textAreaButton: {\r\n display: \"block\",\r\n },\r\n paper: {\r\n maxWidth: 600,\r\n margin: \"20px auto\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n padding: `${theme.spacing(2)} ${theme.spacing(3)} ${theme.spacing(3)}`,\r\n },\r\n formControl: {\r\n marginTop: theme.spacing(1),\r\n },\r\n form: {\r\n width: \"100%\", // Fix IE 11 issue.\r\n marginTop: theme.spacing(1),\r\n },\r\n submit: {\r\n marginTop: theme.spacing(3),\r\n width: \"100%\",\r\n },\r\n});\r\n\r\nclass LicensingPage extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.selectedFolderPath = \"storagePath\";\r\n this.state = {\r\n licenseStatus: \"\",\r\n validationMsg: \"\",\r\n hardwareID: \"\",\r\n os: \"Windows\",\r\n expirationDate: \"\",\r\n isSubmitting: false,\r\n showStoragePathChooser: false,\r\n folderPath: \"\",\r\n showFolderChooser: false,\r\n validationObject: {\r\n storagePath: true,\r\n tempPath: true,\r\n galleryOutputPath: true,\r\n javaPath: true,\r\n },\r\n formData: {\r\n storagePath: \"\",\r\n tempPath: \"\",\r\n galleryOutputPath: \"\",\r\n javaPath: \"\",\r\n localhost: false,\r\n licenseKey: \"\",\r\n },\r\n };\r\n\r\n Backend.getLicensingInfo((result) => this.setState(result));\r\n Backend.readAppSettingsLicensing((result) => {\r\n const formData = result;\r\n this.setState({ formData });\r\n });\r\n }\r\n\r\n handleChange = (event) => {\r\n const { name, value } = event.target;\r\n this.setState((prevState) => ({\r\n formData: {\r\n ...prevState.formData,\r\n [name]: value,\r\n },\r\n }));\r\n };\r\n\r\n correctPath(path) {\r\n path = path.replace(/\\\\/g, \"/\");\r\n while (path.includes(\"//\")) {\r\n path = path.replace(\"//\", \"/\");\r\n }\r\n if (!path.endsWith(\"/\")) {\r\n path = path + \"/\";\r\n }\r\n return path;\r\n }\r\n\r\n handleSubmit = () => {\r\n this.setState({\r\n isSubmitting: true,\r\n });\r\n\r\n const { formData } = this.state;\r\n\r\n let storagePath = formData.storagePath;\r\n let tempPath = formData.tempPath;\r\n let galleryOutputPath = formData.galleryOutputPath;\r\n let javaPath = formData.javaPath;\r\n\r\n storagePath = this.correctPath(storagePath);\r\n tempPath = this.correctPath(tempPath);\r\n galleryOutputPath = this.correctPath(galleryOutputPath);\r\n\r\n formData[\"storagePath\"] = storagePath;\r\n formData[\"tempPath\"] = tempPath;\r\n formData[\"galleryOutputPath\"] = galleryOutputPath;\r\n formData[\"javaPath\"] = javaPath;\r\n\r\n this.setState({ formData });\r\n\r\n Backend.writeAppSettingsLicensing(this.state.formData, (data) => {\r\n let allValid = true;\r\n let dialogString = \"\";\r\n let validationObject = this.state.validationObject;\r\n for (const [key, value] of Object.entries(data)) {\r\n if (!value) {\r\n allValid = false;\r\n validationObject[key] = false;\r\n\r\n if (key === \"javaPath\") {\r\n dialogString += \"File not found: \";\r\n } else {\r\n dialogString += \"Folder not found: \";\r\n }\r\n dialogString += formData[key] + \"\\n\";\r\n }\r\n }\r\n if (allValid) {\r\n window.location.reload();\r\n } else {\r\n window.openWarningDialog(dialogString);\r\n this.setState({ isSubmitting: false, validationObject });\r\n }\r\n });\r\n };\r\n\r\n removeErrorStyle = (key) => {\r\n let validationObject = this.state.validationObject;\r\n if (validationObject[key] !== \"none\") {\r\n validationObject[key] = true;\r\n this.setState({ validationObject });\r\n }\r\n };\r\n\r\n handleCopyLink = () => {\r\n navigator.clipboard.writeText(this.state.hardwareID);\r\n window.showSuccessSnackbar(\"Hardware Id copyied to clipboard!\");\r\n };\r\n\r\n pasteLicenseKeyFromClipboard = () => {\r\n navigator.clipboard\r\n .readText()\r\n .then((text) => {\r\n let formData = this.state.formData;\r\n formData.licenseKey = text;\r\n this.setState({ formData });\r\n window.showSuccessSnackbar(\r\n \"License Key replaced with clipboard content!\"\r\n );\r\n })\r\n .catch((err) => {\r\n window.openErrorDialog(\"Failed to read clipboard contents: \" + err);\r\n });\r\n };\r\n\r\n readLicenseKeyFromFile = () => {\r\n const fileInput = document.createElement(\"input\");\r\n fileInput.type = \"file\";\r\n fileInput.accept = \".txt\";\r\n\r\n fileInput.onchange = () => {\r\n const file = fileInput.files[0];\r\n if (file && file.size <= 1048576) {\r\n const fileReader = new FileReader();\r\n\r\n fileReader.onload = (event) => {\r\n const fileContents = event.target.result;\r\n let formData = this.state.formData;\r\n formData.licenseKey = fileContents;\r\n this.setState({ formData });\r\n window.showSuccessSnackbar(\"License Key replaced with file content!\");\r\n };\r\n\r\n fileReader.readAsText(file);\r\n } else if (file && file.size > 1048576) {\r\n window.showErrorSnackbar(\r\n \"Selected file is too big to contain a License Key!\"\r\n );\r\n }\r\n };\r\n\r\n fileInput.click();\r\n };\r\n\r\n handleAccept = (key, path) => {\r\n this.setState((prevState) => ({\r\n formData: {\r\n ...prevState.formData,\r\n [key]: path,\r\n },\r\n }));\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { isSubmitting, error, formData } = this.state;\r\n\r\n return (\r\n
    \r\n \r\n \r\n {this.state.licenseStatus === \"INVALID\" && (\r\n

    Invalid License Key!

    \r\n )}\r\n {this.state.licenseStatus === \"CRACKED\" && (\r\n

    Cracked License Key!

    \r\n )}\r\n {this.state.licenseStatus === \"VALID\" &&

    Valid License Key

    }\r\n
    \r\n License State: \r\n {this.state.licenseStatus}\r\n
    \r\n {this.state.validationMsg !== \"\" && (\r\n \r\n Validation Message: \r\n {this.state.validationMsg}\r\n
    \r\n
    \r\n )}\r\n {this.state.expirationDate !== \"\" && (\r\n \r\n Expiration Date: \r\n {this.state.expirationDate}\r\n
    \r\n
    \r\n )}\r\n\r\n \r\n Hardware Id\r\n \r\n \r\n \r\n \r\n \r\n }\r\n label=\"Stream link\"\r\n />\r\n \r\n
    \r\n
    \r\n\r\n {this.state.licenseStatus === \"VALID\" && (\r\n \r\n )}\r\n \r\n {error && (\r\n \r\n {error}\r\n \r\n )}\r\n\r\n {\r\n if (path) {\r\n this.handleAccept(this.selectedFolderPath, path);\r\n } \r\n this.setState({ showFolderChooser: false, folderPath: \"\" });\r\n }}\r\n />\r\n this.removeErrorStyle(\"storagePath\")}\r\n fullWidth\r\n margin=\"normal\"\r\n name=\"storagePath\"\r\n label=\"Storage Path\"\r\n type=\"text\"\r\n validators={[\"required\"]}\r\n errorMessages={[\"this field is required\"]}\r\n onChange={this.handleChange}\r\n value={formData.storagePath}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n InputProps={{\r\n endAdornment: (\r\n \r\n {\r\n this.selectedFolderPath = \"storagePath\";\r\n this.setState({\r\n showFolderChooser: true,\r\n folderPath: \"\",\r\n });\r\n }}\r\n >\r\n \r\n \r\n \r\n ),\r\n }}\r\n />\r\n this.removeErrorStyle(\"tempPath\")}\r\n fullWidth\r\n margin=\"normal\"\r\n name=\"tempPath\"\r\n label=\"Data Path\"\r\n type=\"text\"\r\n validators={[\"required\"]}\r\n errorMessages={[\"this field is required\"]}\r\n onChange={this.handleChange}\r\n value={formData.tempPath}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n InputProps={{\r\n endAdornment: (\r\n \r\n {\r\n this.selectedFolderPath = \"tempPath\";\r\n this.setState({ showFolderChooser: true });\r\n }}\r\n >\r\n \r\n \r\n \r\n ),\r\n }}\r\n />\r\n this.removeErrorStyle(\"galleryOutputPath\")}\r\n fullWidth\r\n margin=\"normal\"\r\n name=\"galleryOutputPath\"\r\n label=\"Gallery Output Path\"\r\n type=\"text\"\r\n validators={[\"required\"]}\r\n errorMessages={[\"this field is required\"]}\r\n onChange={this.handleChange}\r\n value={formData.galleryOutputPath}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n InputProps={{\r\n endAdornment: (\r\n \r\n {\r\n this.selectedFolderPath = \"galleryOutputPath\";\r\n this.setState({ showFolderChooser: true });\r\n }}\r\n >\r\n \r\n \r\n \r\n ),\r\n }}\r\n />\r\n\r\n this.removeErrorStyle(\"javaPath\")}\r\n fullWidth\r\n margin=\"normal\"\r\n name=\"javaPath\"\r\n label=\"Java Path\"\r\n type=\"text\"\r\n validators={[\"required\"]}\r\n errorMessages={[\"this field is required\"]}\r\n onChange={this.handleChange}\r\n value={formData.javaPath}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n InputProps={{\r\n endAdornment: (\r\n \r\n {\r\n this.selectedFolderPath = \"javaPath\";\r\n this.setState({ showFolderChooser: true });\r\n }}\r\n >\r\n \r\n \r\n \r\n ),\r\n }}\r\n />\r\n\r\n \r\n Localhost?\r\n \r\n False\r\n True\r\n \r\n Set True to use remotely\r\n \r\n
    \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n \r\n ),\r\n }}\r\n />\r\n
    \r\n\r\n \r\n Submit\r\n \r\n
    \r\n {this.state.licenseStatus !== \"VALID\" && this.state.os !== \"Windows\" && (\r\n
    \r\n To Update LicenseKey do following steps: \r\n
    \r\n
      \r\n
    1. Get Valid License Key
    2. \r\n
    3. Open env.list
    4. \r\n
    5. Paste Valid License Key to HSA_LICENSE_KEY
    6. \r\n
    7. Shutdown docker container
    8. \r\n
    9. \r\n Restart Container with docker-compose up\r\n
    10. \r\n
    \r\n
    \r\n )}\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nLicensingPage.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(LicensingPage);\r\n","import React, { Component } from \"react\";\r\n\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\nimport Avatar from \"@mui/material/Avatar\";\r\nimport Button from \"@mui/material/Button\";\r\nimport CssBaseline from \"@mui/material/CssBaseline\";\r\nimport LockOutlinedIcon from \"@mui/icons-material/LockOutlined\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { ValidatorForm, TextValidator } from \"react-material-ui-form-validator\";\r\n\r\nimport { authenticationService } from \"../common/services\";\r\nimport Backend from \"../common/utils/Backend\";\r\n\r\nconst styles = (theme) => ({\r\n main: {\r\n width: \"auto\",\r\n display: \"block\", // Fix IE 11 issue.\r\n marginLeft: theme.spacing(3),\r\n marginRight: theme.spacing(3),\r\n // When screen sizes surpasses the theshold, change the look\r\n [theme.breakpoints.up(600 + 3 * 2 * 8)]: {\r\n // [theme.breakpoints.up(500 + theme.spacing(3 * 2))]: {\r\n // In the mui v5 update, theme.spacing returns \"48px\" instead of 48.\r\n // Therefore, hardcoding the default theme.spacing multiplyer of 8.\r\n width: 600,\r\n marginLeft: \"auto\",\r\n marginRight: \"auto\",\r\n },\r\n },\r\n paper: {\r\n marginTop: theme.spacing(8),\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n padding: `${theme.spacing(2)} ${theme.spacing(3)} ${theme.spacing(3)}`,\r\n },\r\n avatar: {\r\n margin: theme.spacing(1),\r\n backgroundColor: theme.palette.secondary.main,\r\n },\r\n form: {\r\n width: \"100%\", // Fix IE 11 issue.\r\n marginTop: theme.spacing(1),\r\n },\r\n submit: {\r\n marginTop: theme.spacing(3),\r\n },\r\n});\r\n\r\nclass LoginPage extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n formData: {\r\n email: \"\",\r\n password: \"\",\r\n },\r\n isSubmitting: false,\r\n users: null,\r\n isUsername: false,\r\n emailErrorText: \"Email or Username is not valid\",\r\n };\r\n\r\n // if mounted in Storybook and test users should be used\r\n if (props.testUserList) {\r\n console.log(\"No LicensingInfo loaded, since test users used!\");\r\n } else {\r\n // redirect if license is not VALID\r\n Backend.getLicensingInfo((license) => {\r\n if (license.licenseStatus !== \"VALID\") {\r\n authenticationService.logout();\r\n this.props.history.push(\"/licensing\");\r\n }\r\n });\r\n // redirect to home if already logged in\r\n if (authenticationService.currentUserValue) {\r\n this.props.history.push(\"/\");\r\n }\r\n }\r\n }\r\n\r\n validateEmail(email) {\r\n const re =\r\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n return re.test(String(email).toLowerCase());\r\n }\r\n\r\n validateUserOrEmail = (userList, value) => {\r\n // Backend get all users\r\n // check if valid user\r\n let valid = false;\r\n this.setState({ users: userList });\r\n\r\n // allow (and trim) spaces at the start and end of the email/mail + make sure only one space in name\r\n // https://stackoverflow.com/questions/16974664/remove-extra-spaces-in-string-javascript\r\n value = value.replace(/\\s{2,}/g, \" \").trim();\r\n\r\n userList.forEach((u) => {\r\n if (value === u.fullName) {\r\n this.setState({ isUsername: true });\r\n valid = true;\r\n } else if (value === u.email) {\r\n this.setState({ isUsername: false });\r\n valid = true;\r\n }\r\n });\r\n\r\n if (this.validateEmail(value)) {\r\n this.setState({ emailErrorText: \"No User found for given Email\" });\r\n } else {\r\n this.setState({\r\n emailErrorText: \"No User found for given Username\",\r\n });\r\n }\r\n return valid;\r\n };\r\n\r\n componentDidMount() {\r\n const { testUserList } = this.props;\r\n // if mounted in Storybook and test users should be used\r\n if (testUserList) {\r\n ValidatorForm.addValidationRule(\"isUserOrEmail\", (value) =>\r\n this.validateUserOrEmail(testUserList, value)\r\n );\r\n } else {\r\n //Create Custom Validation Rule to allow User Name and e-mail\r\n Backend.getUserList((userList) => {\r\n ValidatorForm.addValidationRule(\"isUserOrEmail\", (value) =>\r\n this.validateUserOrEmail(userList, value)\r\n );\r\n });\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n ValidatorForm.removeValidationRule(\"isUserOrEmail\");\r\n }\r\n\r\n handleChange = (event) => {\r\n const { formData } = this.state;\r\n formData[event.target.name] = event.target.value;\r\n this.setState({ formData });\r\n };\r\n\r\n handleSubmit = () => {\r\n this.setState({\r\n isSubmitting: true,\r\n });\r\n\r\n const { formData, isUsername, users } = this.state;\r\n let { email } = formData;\r\n\r\n // allow (and trim) spaces at the start and end of the email/mail + make sure only one space in name\r\n // https://stackoverflow.com/questions/16974664/remove-extra-spaces-in-string-javascript\r\n email = email.replace(/\\s{2,}/g, \" \").trim();\r\n\r\n if (isUsername) {\r\n users.forEach((user) =>\r\n user.fullName === email ? (email = user.email) : email\r\n );\r\n }\r\n\r\n authenticationService.login(email, formData.password).then(\r\n () => {\r\n // window.location.reload(true); //clear cache\r\n const { from } = this.props.location.state || {\r\n from: { pathname: \"/\" },\r\n };\r\n this.props.history.push(from);\r\n },\r\n (error) => {\r\n this.setState({\r\n error: error,\r\n isSubmitting: false,\r\n });\r\n }\r\n );\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { isSubmitting, error, formData, emailErrorText } = this.state;\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n Sign In\r\n \r\n \r\n {error && (\r\n \r\n {error}\r\n \r\n )}\r\n \r\n \r\n \r\n Sign In\r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nLoginPage.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n history: PropTypes.object,\r\n location: PropTypes.object,\r\n testUserList: PropTypes.array,\r\n};\r\n\r\nexport default withRouter(withStyles(styles)(LoginPage));\r\n","// Framework imports\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\n// External npm packages\r\nimport AppBar from \"@mui/material/AppBar\";\r\nimport Toolbar from \"@mui/material/Toolbar\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport Button from \"@mui/material/Button\";\r\nimport {\r\n Popper,\r\n Grow,\r\n Paper,\r\n ClickAwayListener,\r\n MenuList,\r\n MenuItem,\r\n SvgIcon,\r\n Tooltip,\r\n} from \"@mui/material\";\r\nimport {\r\n ArrowDropDown,\r\n Person,\r\n ExitToApp,\r\n CoPresent,\r\n Build,\r\n Info,\r\n History,\r\n} from \"@mui/icons-material\";\r\nimport PermMediaIcon from \"@mui/icons-material/PermMedia\";\r\nimport FolderCopyIcon from \"@mui/icons-material/FolderCopy\";\r\nimport WorkIcon from \"@mui/icons-material/Work\";\r\nimport BarChartIcon from \"@mui/icons-material/BarChart\";\r\nimport ScannerIcon from \"@mui/icons-material/Scanner\";\r\nimport ScreenShareIcon from \"@mui/icons-material/ScreenShare\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\n// HSA Packages\r\nimport Backend from \"../utils/Backend\";\r\nimport { authenticationService } from \"../services\";\r\nimport { viewerType } from \"../utils/Utils\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n height: \"100vh\",\r\n },\r\n grow: {\r\n flexGrow: 1,\r\n },\r\n menuButton: {\r\n marginLeft: -12,\r\n marginRight: 20,\r\n height: 50,\r\n cursor: \"pointer\",\r\n },\r\n appbarPlaceholder: theme.mixins.toolbar,\r\n headerButton: {\r\n textTransform: \"none\",\r\n height: 64,\r\n padding: \"0 20px\",\r\n borderRadius: 0,\r\n },\r\n menu: {\r\n transformOrigin: \"center top\",\r\n marginTop: 7,\r\n marginLeft: -40,\r\n minWidth: 200,\r\n },\r\n menuIcon: {\r\n marginRight: 10,\r\n color: \"#444\",\r\n },\r\n warningColor: {\r\n color: theme.palette.warning.main,\r\n },\r\n errorColor: {\r\n color: theme.palette.error.main,\r\n },\r\n});\r\n\r\nclass NavigationBar extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this._isMounted = false;\r\n this.state = {\r\n currentUser: null,\r\n open: false,\r\n headline: \"\",\r\n showDevButtons: false,\r\n resultsPath: \"\",\r\n isResultsButtonVisible: false,\r\n extraButtonState: \"\", //none, results, project\r\n scannerState: null,\r\n expirationMessage: \"\",\r\n canAccessLicensingPage: false,\r\n canAccessAdminPage: false,\r\n canAccessAITab: false,\r\n canAccessCases: false,\r\n canAccessScan: false,\r\n canAccessFileView: false,\r\n };\r\n\r\n window.setNavigationbarTitle = this.setNavigationbarTitle;\r\n }\r\n\r\n // check if report button should be shown\r\n // and check if report exist\r\n checkProjectButton = (pathname) => {\r\n let isResultsButtonVisible =\r\n pathname.includes(\"/view/\") || pathname.includes(\"/esr_view/\");\r\n if (this.state.isResultsButtonVisible !== isResultsButtonVisible) {\r\n this.setMountedState({ isResultsButtonVisible });\r\n }\r\n if (isResultsButtonVisible) {\r\n let uuid = pathname.split(\"view/\").slice(-1)[0];\r\n let dir_path = \"/\" + uuid;\r\n Backend.walkProjectDirFiles(dir_path, (result) => {\r\n let reportExists = false;\r\n for (let row of result) {\r\n if (\r\n row.path.endsWith(\"report.xlsx\") ||\r\n row.path.endsWith(\"report.xlsm\")\r\n ) {\r\n reportExists = true;\r\n break;\r\n }\r\n }\r\n this.setMountedState({\r\n resultsPath: reportExists ? \"/report/\" + uuid : \"\",\r\n extraButtonState: \"results\",\r\n });\r\n });\r\n } else {\r\n if (pathname.includes(\"report/\")) {\r\n let uuid = pathname.split(\"report/\").slice(-1)[0];\r\n Backend.loadProject({ id: uuid }, (project) => {\r\n this.setMountedState({\r\n extraButtonState: \"project\",\r\n projectPath: viewerType(project.type) + uuid,\r\n });\r\n });\r\n } else {\r\n this.setMountedState({\r\n extraButtonState: \"\",\r\n projectPath: \"\",\r\n });\r\n }\r\n }\r\n };\r\n\r\n componentDidUpdate(prevProps) {\r\n if (\r\n prevProps.location.pathname === \"/login\" &&\r\n this.props.location.pathname !== \"/login\"\r\n ) {\r\n this.updateUserGroups();\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n if (this.props.location.pathname === \"/iframe.html\") return;\r\n\r\n //on first load\r\n this.checkProjectButton(location.pathname);\r\n this.setPageHeadline();\r\n\r\n //on path change\r\n this.props.history.listen((location) => {\r\n this.setPageHeadline();\r\n this.checkProjectButton(location.pathname);\r\n });\r\n\r\n authenticationService.currentUser.subscribe((x) => {\r\n this.setMountedState({\r\n currentUser: x,\r\n });\r\n if (this.props.location.pathname !== \"/login\") {\r\n this.updateUserGroups();\r\n }\r\n });\r\n\r\n Backend.getLicensingInfo((license) => {\r\n let scannerState = \"INVALID\";\r\n let expirationMessage = \"\";\r\n if (license.activeModules.length === 0) {\r\n scannerState = \"VALID\";\r\n } else {\r\n const scannerData = license.activeModules.find(\r\n (item) => item.name === \"HSAScanner\"\r\n );\r\n if (scannerData) {\r\n const expirationDays = scannerData.expiresInDays;\r\n if (expirationDays < 31) {\r\n if (expirationDays < 0) {\r\n if (expirationDays === -1) {\r\n expirationMessage = \"Expired for 1 day!\";\r\n } else {\r\n expirationMessage = \"Expired for \" + -expirationDays + \" days!\";\r\n }\r\n } else {\r\n if (expirationDays == 1) {\r\n expirationMessage = \"Expires in 1 day!\";\r\n } else {\r\n expirationMessage = \"Expires in \" + expirationDays + \" days!\";\r\n }\r\n }\r\n }\r\n if (scannerData.isExpired) {\r\n scannerState = \"EXPIRED\";\r\n } else {\r\n scannerState = \"VALID\";\r\n }\r\n }\r\n }\r\n\r\n this.setMountedState({ scannerState, expirationMessage });\r\n });\r\n }\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n updateUserGroups = () => {\r\n Backend.getCurrentUser((user) => {\r\n if (user.group) {\r\n this.setState({\r\n canAccessLicensingPage: user.group.canAccessLicensingPage,\r\n canAccessAdminPage: user.group.canAccessAdminPage,\r\n canAccessAITab: user.group.canAccessAITab,\r\n canAccessCases: user.group.name === \"Admin\",\r\n canAccessScan: user.group.name === \"Admin\",\r\n canAccessFileView: user.group.name === \"Admin\",\r\n });\r\n }\r\n });\r\n };\r\n\r\n setNavigationbarTitle = (title) => {\r\n this.setMountedState({ headline: title });\r\n };\r\n\r\n logout = () => {\r\n authenticationService.logout();\r\n this.props.history.push(\"/login\");\r\n // window.location.reload(true);\r\n };\r\n\r\n handleMenu() {\r\n this.setMountedState((state) => ({ open: !state.open }));\r\n }\r\n\r\n handleClose(event) {\r\n if (this.anchorEl.contains(event.target)) {\r\n return;\r\n }\r\n\r\n this.setMountedState({ open: false });\r\n }\r\n\r\n setPageHeadline() {\r\n if (this.props.location.pathname === \"/iframe.html\") return;\r\n let path = window.location.href;\r\n const titleMap = {\r\n \"/view/\": \"Viewer\",\r\n \"/report/\": \"Results\",\r\n \"/admin\": \"Admin Settings\",\r\n \"/login\": \"Login\",\r\n \"/about\": \"About\",\r\n \"/cases\": \"Cases\",\r\n \"/file_view\": \"Files\",\r\n \"/ai_view\": \"AI\",\r\n \"/classroom\": \"Classroom\",\r\n \"/prediction\": \"Prediction\",\r\n \"/licensing\": \"Licenseing\",\r\n \"/scan_view\": \"Scan Viewer\",\r\n };\r\n Backend.getVersion((data) => {\r\n let title = \"Projects\";\r\n for (const pathFragment in titleMap) {\r\n if (path.includes(pathFragment)) {\r\n title = titleMap[pathFragment];\r\n break;\r\n }\r\n }\r\n\r\n const fullVersion = data.version.split(\".\");\r\n const versionLength = fullVersion.length;\r\n const version =\r\n versionLength > 3 ? fullVersion.slice(0, 3).join(\".\") : data.version;\r\n window.document.title = `${title} - HSA Kit ${version}`;\r\n });\r\n let headline = \"Home\";\r\n for (const pathFragment in titleMap) {\r\n if (path.includes(pathFragment)) {\r\n headline = titleMap[pathFragment];\r\n break;\r\n }\r\n }\r\n if (this.state.headline !== headline) {\r\n this.setMountedState({ headline: headline });\r\n }\r\n return headline;\r\n }\r\n\r\n render() {\r\n const {\r\n currentUser,\r\n open,\r\n showDevButtons,\r\n scannerState,\r\n expirationMessage,\r\n canAccessLicensingPage,\r\n canAccessAdminPage,\r\n } = this.state;\r\n const { classes } = this.props;\r\n\r\n return (\r\n \r\n \r\n this.props.history.push(\"/\")}\r\n alt=\"hsa logo\"\r\n src=\"/img/hsa_logo.png\"\r\n />\r\n \r\n {this.state.headline}\r\n \r\n \r\n {currentUser ? (\r\n \r\n {/* hidden log file download button */}\r\n {\r\n Backend.getAbout((result) => {\r\n if (result.logFiles && result.logFiles.length > 0) {\r\n let newestLogFile = result.logFiles[0];\r\n\r\n const a = document.createElement(\"a\");\r\n let url =\r\n \"api/about/logfile?name=\" +\r\n window.decodeURIComponent(newestLogFile);\r\n a.href = url;\r\n a.download = url.split(\"/\").pop();\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n }\r\n });\r\n }}\r\n >
    \r\n {\r\n this.props.history.push(\"/\");\r\n this.setState({ headline: \"Home\" });\r\n }}\r\n className={classes.headerButton}\r\n color=\"inherit\"\r\n >\r\n \r\n \r\n Projects\r\n \r\n\r\n {\r\n this.props.history.push(\"/ai_view\");\r\n this.setState({ headline: \"AI Viewer\" });\r\n }}\r\n className={classes.headerButton}\r\n color=\"inherit\"\r\n >\r\n \r\n AI\r\n \r\n\r\n this.props.history.push(\"/cases\")}\r\n className={classes.headerButton}\r\n color=\"inherit\"\r\n >\r\n \r\n Cases\r\n \r\n\r\n \r\n \r\n this.props.history.push(\"/file_view\")}\r\n className={classes.headerButton}\r\n color=\"inherit\"\r\n >\r\n \r\n Files\r\n \r\n \r\n \r\n\r\n \r\n \r\n {\r\n this.props.history.push(\"/scan_view\");\r\n }}\r\n className={classes.headerButton}\r\n color=\"inherit\"\r\n >\r\n \r\n \r\n Scan\r\n \r\n \r\n \r\n \r\n\r\n {this.state.extraButtonState !== \"\" && (\r\n \r\n {this.state.extraButtonState === \"results\" ? (\r\n \r\n this.props.history.push(this.state.resultsPath)\r\n }\r\n className={classes.headerButton}\r\n color=\"inherit\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n Results\r\n \r\n ) : (\r\n {\r\n this.props.history.push(this.state.projectPath);\r\n }}\r\n className={classes.headerButton}\r\n color=\"inherit\"\r\n >\r\n \r\n Project\r\n \r\n )}\r\n \r\n )}\r\n\r\n {showDevButtons && (\r\n \r\n this.props.history.push(\"/prediction\")}\r\n className={classes.headerButton}\r\n color=\"inherit\"\r\n >\r\n \r\n Prediction\r\n \r\n {\r\n if (window.location.href.includes(\"/view/\")) {\r\n window.toggleClassRoomChat();\r\n } else {\r\n window.openWarningDialog(\"Please open a Project first\");\r\n }\r\n }}\r\n className={classes.headerButton}\r\n color=\"inherit\"\r\n >\r\n \r\n Classroom\r\n \r\n \r\n )}\r\n\r\n {\r\n this.anchorEl = node;\r\n }}\r\n className={classes.headerButton}\r\n aria-owns={open ? \"menu-appbar\" : undefined}\r\n aria-haspopup=\"true\"\r\n onClick={() => this.handleMenu()}\r\n color=\"inherit\"\r\n >\r\n \r\n {currentUser.fullName}\r\n \r\n \r\n \r\n {({ TransitionProps }) => (\r\n \r\n \r\n this.handleClose(e)}\r\n >\r\n \r\n {canAccessAdminPage && (\r\n this.props.history.push(\"/admin\")}\r\n >\r\n \r\n Admin\r\n \r\n )}\r\n {canAccessLicensingPage && (\r\n {\r\n this.props.history.push(\"/licensing\");\r\n }}\r\n >\r\n \r\n Licensing Page\r\n \r\n )}\r\n \r\n this.props.history.push(\"/userhistory\")\r\n }\r\n >\r\n \r\n User Access History\r\n \r\n this.props.history.push(\"/about\")}\r\n >\r\n \r\n About / Help\r\n \r\n \r\n \r\n Logout\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nNavigationBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n history: PropTypes.object,\r\n location: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(withStyles(styles)(NavigationBar));\r\n","export default __webpack_public_path__ + \"static/media/p1.d8b6b771.jpg\";","export default __webpack_public_path__ + \"static/media/p2.28be19b6.jpg\";","export default __webpack_public_path__ + \"static/media/p3.79920250.jpg\";","export default __webpack_public_path__ + \"static/media/p4.bcf3e966.jpg\";","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport p1 from \"./images/p1.jpg\";\r\nimport p2 from \"./images/p2.jpg\";\r\nimport p3 from \"./images/p3.jpg\";\r\nimport p4 from \"./images/p4.jpg\";\r\n\r\nimport { Paper } from \"@mui/material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = {\r\n root: {\r\n background: \"#EEEEEE\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n overflowY: \"auto\",\r\n padding: 5,\r\n },\r\n paper: {\r\n width: 800,\r\n margin: \"10px auto\",\r\n padding: 10,\r\n \"& img\": {\r\n width: \"100%\",\r\n },\r\n },\r\n};\r\n\r\nclass PredictionPage extends Component {\r\n state = {};\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const images = [p1, p2, p3, p4];\r\n return (\r\n
    \r\n {images.map((item, idx) => (\r\n \r\n \"\"\r\n \r\n ))}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nPredictionPage.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(PredictionPage);\r\n","/**\r\n * Generates an array which references all contained structures to their parent structure.\r\n * Each row of the array starts with the child and ends with the topmost parent.\r\n * The function stops at structures or substructures.\r\n * Overlying structures will not see the subtypes contained inside the structure.\r\n * @param {Array} structures All structures, substructures, and subtypes seen in sidebar.\r\n * @returns {Array} Array of parents, child is the first entry of each row, respectively.\r\n */\r\nexport function generateParentList(structures) {\r\n let parentList = [];\r\n // First, each structure contains itself sa a minimum.\r\n for (let structure of structures) {\r\n parentList.push([structure]);\r\n }\r\n\r\n // Find all parents of a structure, bottom up.\r\n for (let idx = 0; idx < parentList.length; idx++) {\r\n let continueSearch = true;\r\n while (continueSearch) {\r\n let currentStruct = parentList[idx];\r\n // We're done when we reach the topmost layer\r\n // or if the next level would be a (sub-) structure\r\n if (\r\n !currentStruct[currentStruct.length - 1].classificationSubtype ||\r\n currentStruct[currentStruct.length - 1].parentId === 0\r\n ) {\r\n continueSearch = false;\r\n break;\r\n }\r\n\r\n // Add the parent structure to the row.\r\n parentList[idx].push(\r\n structures[\r\n getParentIndex(currentStruct[currentStruct.length - 1], structures)\r\n ]\r\n );\r\n }\r\n }\r\n\r\n return parentList;\r\n}\r\n\r\n/**\r\n * Generates an array which references all contained structures to their child structures.\r\n * Each row of the array starts with the parent and ends with the bottom-most child.\r\n * The function stops at structures or substructures.\r\n * Underlying structures will not see the subtypes contained inside the structure.\r\n * @param {Array} structures All structures, substructures, and subtypes seen in sidebar.\r\n * @returns {Array} Array of children, parent is the first entry of each row, respectively.\r\n */\r\nexport function generateChildrenList(structures) {\r\n let childrenList = [];\r\n for (let structure of structures) {\r\n childrenList.push(\r\n generateAListOfAllChildrenRecursively(structure, structures)\r\n );\r\n }\r\n return childrenList;\r\n}\r\n\r\n/**\r\n * Recursively goes down the structure tree, beginning from the given parent.\r\n * Adds all structures along the way until it reaches a structure without children.\r\n * @param {Object} structure The selected structure/substructure/subtype for this iteration.\r\n * @param {Array} structures All structures, substructures, and subtypes seen in sidebar.\r\n * @returns {Array} Array of Children when done.\r\n * @returns {Array} Object of a child in an array when child does not have a child of its own.\r\n */\r\nfunction generateAListOfAllChildrenRecursively(structure, structures) {\r\n // Continue until we reach the bottom-most layer\r\n // or if the current structure would be a (sub-) structure\r\n if (structure.hasChild) {\r\n // Add the structure itself to the tree\r\n let allChildren = [];\r\n allChildren.push(structure);\r\n\r\n // Find all children of the structure, that are subtypes, not substructures\r\n let children = structures.filter(\r\n (struct) =>\r\n struct.classificationSubtype && struct.parentId === structure.id\r\n );\r\n\r\n // Recursively add all children and children of children\r\n for (let child of children) {\r\n allChildren.push(\r\n ...generateAListOfAllChildrenRecursively(child, structures)\r\n );\r\n }\r\n return allChildren;\r\n } else {\r\n // No children, bottom-level child returns itself\r\n return [structure];\r\n }\r\n}\r\n\r\n/**\r\n * Returns index of the topmost parent structure\r\n * @param {Object} structure The selected structure/substructure/subtype from the sidebar.\r\n * @param {Array} structures All structures, substructures, and subtypes seen in sidebar.\r\n * @returns {Int} the index of the topmost parent structure.\r\n */\r\nexport function getParentIndexLayer(structure, structures) {\r\n let index = structures.findIndex((element) => element === structure);\r\n while (\r\n structures[index].subtypeLevel !== 0 &&\r\n structures[index].classificationSubtype\r\n ) {\r\n index = getParentIndex(structures[index], structures);\r\n }\r\n return structures.findIndex((element) => element === structures[index]);\r\n}\r\n\r\n/**\r\n * Returns index of the direct parent structure\r\n * @param {Object} structure The selected structure/substructure/subtype from the sidebar.\r\n * @param {Array} structures All structures, substructures, and subtypes seen in sidebar.\r\n * @returns {Int} the index of the parent structure.\r\n */\r\nexport function getParentIndex(structure, structures) {\r\n // return index of parent structure\r\n return structures.findIndex((element) => element.id === structure.parentId);\r\n}\r\n\r\n/**\r\n * Returns objects for a given structure, including its subtypes.\r\n * @param {Object} structure - The selected structure/substructure/subtype from the sidebar.\r\n * @param {Array} structures - All structures, substructures, and subtypes seen in the sidebar.\r\n * @param {List} roiLayers - Annotations of the structures ordered by structure.\r\n * @returns {List} - All ROIs for a certain structure, including its subtypes.\r\n */\r\nexport function getContainedRegionRois(structure, structures, roiLayers) {\r\n // Find the index of the given structure within the structures array\r\n const idx = structures.findIndex((struct) => struct.id === structure.id);\r\n // Generate a list of parent structures for each structure in the structures array\r\n const parentList = generateParentList(structures);\r\n\r\n // Find the direct parent of the given structure\r\n const parent = parentList[idx][parentList[idx].length - 1];\r\n\r\n // Find the index of the parent structure within the structures array\r\n const parentIdx = structures.findIndex((struct) => struct.id === parent.id);\r\n\r\n // Generate a list of children structures for each structure in the structures array,\r\n // then retrieve the children IDs for the given structure\r\n const decendantIds = generateChildrenList(structures)[idx].map(\r\n ({ id }) => id\r\n );\r\n\r\n // Filter the ROI layer of the parent structure to only include ROIs\r\n // that belong to the given structure and its decendants\r\n return roiLayers[parentIdx].layer.regionRois.filter((roi) =>\r\n decendantIds.includes(roi.structureId)\r\n );\r\n}\r\n\r\n/**\r\n * Updates the full structure tree of a structure, ensuring correctly displayed icons.\r\n * @param {Object} structure The full tree of this structure will be updated.\r\n * @param {Array} structures All structures. Contains the structure given.\r\n * @returns {Array} Updated structures.\r\n */\r\nexport function updateStructures(structure, structures) {\r\n // Check for missing strucutre import\r\n if (!structure) {\r\n console.debug(\"Error: No structure given, canceling strucutre update\");\r\n return structures;\r\n }\r\n\r\n // Get toplevel parent\r\n let toplevelParentIndex = getParentIndexLayer(structure, structures);\r\n\r\n // Not found, therefore return unedited structures\r\n if (toplevelParentIndex === -1) {\r\n console.debug(\r\n \"Error: Could not find top level parent when updating structures.\"\r\n );\r\n return structures;\r\n }\r\n\r\n // Get all children of toplevel parent\r\n let fullChildrenList = generateChildrenList(structures);\r\n let children = fullChildrenList[toplevelParentIndex];\r\n\r\n // Update their status\r\n for (let structure of children) {\r\n // Find children of currently viewed child\r\n let currentChildren = fullChildrenList.find(\r\n (children) => children[0].id === structure.id\r\n );\r\n\r\n // Update properties\r\n structure.hasChild = currentChildren.length > 0;\r\n\r\n // Find location of current structure in structures\r\n let structureIndex = structures.findIndex(\r\n (struct) => struct.id === structure.id\r\n );\r\n\r\n // Overwrite with updated properties\r\n structures[structureIndex] = structure;\r\n }\r\n\r\n return structures;\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport RBush from \"rbush\";\r\nimport { getUnusedColor } from \"../../common/utils/RandomColorGenerator\";\r\nimport {\r\n getParentIndexLayer,\r\n updateStructures,\r\n} from \"../utils/StructuresUtils\";\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nconst ProjectContext = React.createContext();\r\n\r\nexport const withProject = (Component) => {\r\n const WrappedComponent = (props) => (\r\n \r\n {(context) => }\r\n \r\n );\r\n\r\n WrappedComponent.displayName = `withProject(${\r\n Component.displayName || Component.name || \"Component\"\r\n })`;\r\n\r\n return WrappedComponent;\r\n};\r\n\r\n// this is the main component, it has to be added at the root of the app.\r\n// all components that use withProject(...) will have access to it via this.props.Project...\r\nclass ProjectProvider extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this._isMounted = false;\r\n this.state = {\r\n structures: [],\r\n roiLayers: {},\r\n commentLayers: {},\r\n selectedLayer: 0,\r\n ome: null,\r\n activeTab: 0,\r\n changingFile: false,\r\n user: \"\",\r\n isLoadingAnnotations: false,\r\n galleryImageSize: 300,\r\n userPermissions: {\r\n canImportModels: true,\r\n canExportModels: true,\r\n },\r\n groupPermissions: {\r\n canAnnotate: true,\r\n canTrainModel: true,\r\n canRunJob: true,\r\n canComment: true,\r\n canEditStructures: true,\r\n canAccessAITab: true,\r\n canEditModel: true,\r\n },\r\n annotationsReduced: false,\r\n totalRoiCount: -1,\r\n };\r\n this.usersData = {};\r\n this.aiModelRepository = [];\r\n this.aiStateObject = {};\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n }\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n\r\n // set project from viewer, when project opens\r\n initProject = (project) => {\r\n this.setMountedState({ project });\r\n // this.initSocket(project.id); // TODO: fix by changing flask-sock to socketio\r\n };\r\n\r\n initForeignHistory = () => {\r\n if (this.socket) {\r\n this.socket.send(\r\n JSON.stringify({\r\n state: \"init\",\r\n })\r\n );\r\n }\r\n };\r\n\r\n componentDidUpdate = () => {\r\n if (this.persistentStorage && this.state.project) {\r\n const structuresStateList = this.state.structures.map((structure) => {\r\n return {\r\n isUnfolded: structure.isUnfolded,\r\n showSubtypes: structure.showSubtypes,\r\n visible: structure.visible,\r\n };\r\n });\r\n this.persistentStorage.saveProjectTypeValue(\r\n this.state.project.type,\r\n \"structuresStateList\",\r\n structuresStateList\r\n );\r\n }\r\n };\r\n\r\n //remove users, that didn't send updates for 10 seconds\r\n cleanUsersData = () => {\r\n const timeNow = performance.now();\r\n for (const key of Object.keys(this.usersData)) {\r\n if (timeNow - this.usersData[key].updateTime > 10000) {\r\n console.log(\r\n \"old user deleted from usersData:\",\r\n this.usersData[key].user\r\n );\r\n delete this.usersData[key];\r\n }\r\n }\r\n };\r\n\r\n receiveSocketMessage = (data) => {\r\n if (data.state) {\r\n if (data.state === \"pos\") {\r\n data.updateTime = performance.now();\r\n this.usersData[data.uuid] = data;\r\n this.cleanUsersData();\r\n } else if (data.state === \"syncStructures\") {\r\n this.syncStructures(data.structures);\r\n } else {\r\n window.projectHistory.receive(data);\r\n }\r\n }\r\n };\r\n\r\n syncStructures = (structures) => {\r\n const { roiLayers } = this.state;\r\n const fileRoiLayers = roiLayers[this.state.fileId];\r\n const newRoiLayers = [];\r\n for (const structure of structures) {\r\n const tempRoiLayer = fileRoiLayers.find(\r\n (roiLayer) => roiLayer.id === structure.id\r\n );\r\n if (tempRoiLayer) {\r\n newRoiLayers.push(tempRoiLayer);\r\n } else {\r\n newRoiLayers.push({\r\n id: structure.id,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n });\r\n }\r\n }\r\n\r\n roiLayers[this.state.fileId] = newRoiLayers;\r\n\r\n this.setMountedState({\r\n structures: structures,\r\n roiLayers: roiLayers,\r\n });\r\n };\r\n\r\n // set web socket for communication between current viewer/user and server\r\n initSocket = (projectId) => {\r\n this.socket = Backend.getAnnotationSocket(projectId);\r\n window.projectHistory.socket = this.socket;\r\n this.socket.onmessage = (ev) => {\r\n const data = JSON.parse(ev.data);\r\n this.receiveSocketMessage(data);\r\n };\r\n\r\n Backend.getCurrentUser((user) => {\r\n this.setMountedState({ user: user.fullName });\r\n let lastSendObject = null;\r\n\r\n const intervalId = setInterval(() => {\r\n if (\r\n this.socket.readyState === 1 &&\r\n typeof window.getMousePositionInImage === \"function\"\r\n ) {\r\n const p = window.getMousePositionInImage();\r\n let objectToSend = {\r\n state: \"pos\",\r\n projectId: projectId,\r\n user: user.fullName,\r\n x: parseInt(p.x, 10),\r\n y: parseInt(p.y, 10),\r\n };\r\n // send new position, if it has changed\r\n if (\r\n lastSendObject === null ||\r\n lastSendObject.x === objectToSend.x ||\r\n lastSendObject.y === objectToSend.y\r\n ) {\r\n this.socket.send(JSON.stringify(objectToSend));\r\n }\r\n } else {\r\n console.log(\"socket not ready, readyState:\", this.socket.readyState);\r\n if (this.socket.readyState === 3) {\r\n console.log(\"socket broke, stopping interval!\");\r\n clearInterval(intervalId);\r\n }\r\n }\r\n }, 100);\r\n });\r\n };\r\n\r\n /**\r\n * Initializes the Project provider and passes a viewer component\r\n *\r\n * @param {object} viewer - Viewer Component\r\n */\r\n init = (viewer) => {\r\n this.viewer = viewer;\r\n };\r\n\r\n setChangingFile = (a) => {\r\n this.setMountedState({ changingFile: a });\r\n };\r\n\r\n setActiveTab = (tab) => {\r\n this.setMountedState({ activeTab: tab });\r\n this.activeTab = tab;\r\n this.forceUpdate();\r\n };\r\n\r\n getActiveTab = () => {\r\n return this.state.activeTab;\r\n };\r\n\r\n /**\r\n * Returns Roi Region Object\r\n *\r\n * @param {int} structureId - id of the structure\r\n * @param {int} fileId - id of the file, if undefined the currently opened file will be used\r\n */\r\n getRegionById = (structureId, fileId) => {\r\n if (!fileId) fileId = this.state.fileId;\r\n return this.state.roiLayers[fileId].find((c) => c.id === structureId);\r\n };\r\n\r\n getNumberOfChilds = (parentStructure) => {\r\n const { structures } = this.state;\r\n\r\n return structures.filter(\r\n (element) => element.parentId === parentStructure.id\r\n ).length;\r\n };\r\n\r\n importStructures = (structures) => {\r\n const { roiLayers, fileId } = this.state;\r\n\r\n for (let structure of structures) {\r\n if (structure.tools.length === 0) {\r\n if (structure.parentId > 0) {\r\n let parentStructure = structures.find(\r\n (item) => item.id === structure.parentId\r\n );\r\n if (parentStructure) {\r\n structure.tools = parentStructure.tools;\r\n }\r\n }\r\n }\r\n const roiLayer = roiLayers[fileId].find((c) => c.id === structure.id);\r\n if (!roiLayer) {\r\n roiLayers[fileId].push({\r\n id: structure.id,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n });\r\n }\r\n }\r\n\r\n this.sendStructures(structures);\r\n this.setMountedState({ structures: structures, roiLayers });\r\n };\r\n\r\n /**\r\n * Adds a new Dynamic Structure to the Project Model\r\n *\r\n * @param {string} name - Display name of the new structure\r\n */\r\n addStructure = (name, grid = false) => {\r\n const { structures, roiLayers, viewerConfig, fileId } = this.state;\r\n\r\n // findHighest id number\r\n const newLayerId = structures.reduce((a, c) => Math.max(a, c.id), 0) + 1;\r\n\r\n let newStructure = {\r\n id: newLayerId,\r\n dynamic: true,\r\n //name: name,\r\n label: name,\r\n color: grid ? \"#00000000\" : getUnusedColor(structures),\r\n visible: true,\r\n allToolNames: structures[0].allToolNames,\r\n tools: viewerConfig.project.dynamicStructure.tools,\r\n classFrequencies: {\r\n class_0: 0,\r\n class_1: 0,\r\n class_2: 0,\r\n class_3: 0,\r\n class_4: 0,\r\n class_5: 0,\r\n class_6: 0,\r\n },\r\n avgClassFrequnecy: 0,\r\n isSubtype: false,\r\n isUnfolded: true,\r\n classificationSubtype: false,\r\n parentId: 0,\r\n showSubtypes: false,\r\n subtypeLevel: 0,\r\n defaultSelected: false,\r\n };\r\n newStructure = this.viewer.alterStructure(newStructure);\r\n\r\n let newRoilayer = {\r\n id: newLayerId,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n };\r\n\r\n structures.push(newStructure);\r\n\r\n roiLayers[fileId].push(newRoilayer);\r\n\r\n this.sendStructures(structures);\r\n this.setMountedState({ structures, roiLayers });\r\n };\r\n\r\n sendStructures = (structures) => {\r\n console.log(\"sending structures wip:\", structures);\r\n // const { project } = this.state;\r\n\r\n // const toSend = {\r\n // state: \"syncStructures\",\r\n // projectId: project.id,\r\n // structures: structures,\r\n // };\r\n // this.socket.send(JSON.stringify(toSend));\r\n };\r\n\r\n addSubStructure = (parent, name, fromHistoModule) => {\r\n const { structures, roiLayers, selectedLayer, fileId } = this.state;\r\n\r\n // findHighest id number\r\n const newLayerId = structures.reduce((a, c) => Math.max(a, c.id), 0) + 1;\r\n\r\n let subStructure = {\r\n id: newLayerId,\r\n dynamic: true,\r\n parentId: parent.id,\r\n label: name ? name : parent.label,\r\n color: getUnusedColor(structures),\r\n visible: true,\r\n allToolNames: parent.allToolNames,\r\n tools: parent.tools, // what tools should be used?\r\n classFrequencies: {\r\n class_0: 0,\r\n class_1: 0,\r\n class_2: 0,\r\n class_3: 0,\r\n class_4: 0,\r\n class_5: 0,\r\n class_6: 0,\r\n },\r\n avgClassFrequnecy: 0,\r\n showSubtypes: false,\r\n isSubtype: true,\r\n parentColor: parent.color,\r\n subtypeColor: getUnusedColor(structures),\r\n isUnfolded: true,\r\n subtypeLevel: parent.subtypeLevel + 1,\r\n hasChild: false,\r\n classificationSubtype: false,\r\n defaultSelected: false,\r\n };\r\n // add substructure as last child (for now just in histo modules / for other modules check if this works too)\r\n let numberChilds = 0;\r\n if (fromHistoModule) {\r\n numberChilds = this.getNumberOfChilds(structures[selectedLayer]);\r\n }\r\n\r\n structures.splice(selectedLayer + 1 + numberChilds, 0, subStructure);\r\n const roiIndex = roiLayers[fileId].findIndex(\r\n (c) => c.id === structures[selectedLayer].id\r\n );\r\n\r\n roiLayers[fileId].splice(roiIndex + 1, 0, {\r\n id: newLayerId,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n });\r\n parent.addSubtypeText = \"\";\r\n parent.hasChild = true;\r\n\r\n this.sendStructures(structures);\r\n this.setMountedState({ structures, roiLayers });\r\n };\r\n\r\n addSubType = (parent, name, fromHistoModule) => {\r\n const { structures, roiLayers, selectedLayer, fileId } = this.state;\r\n\r\n // findHighest id number\r\n const newLayerId = structures.reduce((a, c) => Math.max(a, c.id), 0) + 1;\r\n\r\n let subStructure = {\r\n id: newLayerId,\r\n dynamic: true,\r\n parentId: parent.id,\r\n label: name ? name : parent.label,\r\n color: getUnusedColor(structures),\r\n visible: true,\r\n allToolNames: parent.allToolNames,\r\n tools: parent.tools, // what tools should be used?\r\n classFrequencies: {\r\n class_0: 0,\r\n class_1: 0,\r\n class_2: 0,\r\n class_3: 0,\r\n class_4: 0,\r\n class_5: 0,\r\n class_6: 0,\r\n },\r\n avgClassFrequnecy: 0,\r\n showSubtypes: false,\r\n isSubtype: true,\r\n isUnfolded: fromHistoModule ? false : true,\r\n subtypeLevel: parent.subtypeLevel + 1,\r\n hasChild: false,\r\n classificationSubtype: true,\r\n defaultSelected: false,\r\n };\r\n // add substructure as last child (for now just in histo modules / for other modules check if this works too)\r\n let numberChilds = 0;\r\n if (fromHistoModule) {\r\n numberChilds = this.getNumberOfChilds(structures[selectedLayer]);\r\n // for point counting module only 11 subtypes are possible because of template\r\n if (numberChilds >= 10) {\r\n window.showWarningSnackbar(\"Reached maximum amount of subtypes.\");\r\n return;\r\n }\r\n }\r\n\r\n structures.splice(selectedLayer + 1 + numberChilds, 0, subStructure);\r\n const roiIndex = roiLayers[fileId].findIndex(\r\n (c) => c.id === structures[selectedLayer].id\r\n );\r\n\r\n roiLayers[fileId].splice(roiIndex + 1 + numberChilds, 0, {\r\n id: newLayerId,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n });\r\n parent.addSubtypeText = \"\";\r\n parent.hasChild = true;\r\n this.sendStructures(structures);\r\n this.setMountedState({ structures, roiLayers });\r\n };\r\n\r\n findChilds = (subType) => {\r\n const { structures } = this.state;\r\n\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id\r\n );\r\n };\r\n\r\n /**\r\n * Removes a structure and corresponding regions from project model.\r\n *\r\n * @param {object} structure - Structure to remove.\r\n * @returns {Int} The id of the next layer to be selected.\r\n */\r\n deleteStructure = (structure) => {\r\n const { selectedLayer, fileId } = this.state;\r\n let { structures, roiLayers } = this.state;\r\n\r\n // Recursively delete all children.\r\n if (structure.hasChild) {\r\n let childs = this.findChilds(structure);\r\n for (let i = 0; i < childs.length; i++) {\r\n this.deleteStructure(childs[i]);\r\n }\r\n }\r\n\r\n let toplevelParentId = null;\r\n // In case of subtypes, find the next (sub-)structure\r\n if (structure.classificationSubtype) {\r\n toplevelParentId =\r\n structures[getParentIndexLayer(structure, structures)].id;\r\n }\r\n // Otherwise, get the direct parent\r\n else {\r\n toplevelParentId = structure.parentId;\r\n }\r\n\r\n // Delete from structure\r\n const structureIndex = structures.findIndex((c) => c.id === structure.id);\r\n structures.splice(structureIndex, 1);\r\n\r\n // Delete from ROIs.\r\n const roiIndex = roiLayers[fileId].findIndex((c) => c.id === structure.id);\r\n roiLayers[fileId].splice(roiIndex, 1);\r\n\r\n // In case of subtype, delete ROIs from containing layer.\r\n if (structure.isSubtype) {\r\n // Get structure where ROIs are stored\r\n let roiIdx = roiLayers[fileId].findIndex(\r\n (struct) => struct.id === toplevelParentId\r\n );\r\n\r\n // Only keep ROIs not from the deleted subtype\r\n let subtypesRemoved = roiLayers[fileId][roiIdx].tree\r\n .all()\r\n .filter((treeItem) => {\r\n return (\r\n treeItem.roi.isSubtype &&\r\n treeItem.roi.subtypeName !== structure.label\r\n );\r\n });\r\n\r\n // Overwrite previous ROIs\r\n roiLayers[fileId][roiIdx].tree.data.children = subtypesRemoved;\r\n }\r\n\r\n // Update children status of parent.\r\n let parentStruct = structures.find(\r\n (struct) => struct.id === structure.parentId\r\n );\r\n // Only update if there is something to update\r\n if (parentStruct) {\r\n structures = updateStructures(parentStruct, structures);\r\n }\r\n\r\n // if last layer gets deleted make selectedLayer 0\r\n let newSelectedLayer =\r\n selectedLayer >= structures.length ? 0 : selectedLayer;\r\n\r\n this.sendStructures(structures);\r\n this.setMountedState({\r\n structures,\r\n roiLayers,\r\n selectedLayer: newSelectedLayer,\r\n });\r\n\r\n return newSelectedLayer;\r\n };\r\n\r\n /**\r\n * Duplicates a structure and corresponding parameters from project model.\r\n *\r\n * @param {object} structure - Structure to remove\r\n */\r\n duplicateStructure = (structure) => {\r\n const { structures, roiLayers, fileId } = this.state;\r\n\r\n // findHighest id number\r\n const newLayerId =\r\n structures.reduce((a, c) => (a ? Math.max(a, c.id) : c.id), 0) + 1;\r\n\r\n // clone structure\r\n const pureLabel = structure.label.split(\" - copy\")[0];\r\n const copiesCount = structures.reduce(\r\n (a, c) => (c.label.startsWith(pureLabel + \" - copy\") ? a + 1 : a),\r\n 0\r\n );\r\n let newStructure = Object.assign(JSON.parse(JSON.stringify(structure)), {\r\n id: newLayerId,\r\n label:\r\n copiesCount > 0\r\n ? pureLabel + \" - copy(\" + (copiesCount + 1) + \")\"\r\n : pureLabel + \" - copy\",\r\n });\r\n\r\n let newRoilayer = {\r\n id: newLayerId,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n };\r\n\r\n structures.push(newStructure);\r\n roiLayers[fileId].push(newRoilayer);\r\n\r\n this.duplicateChildren(structure, newStructure);\r\n\r\n let newSelectedLayer = structures.findIndex((c) => c.id === newLayerId);\r\n\r\n this.sendStructures(structures);\r\n this.setMountedState({\r\n structures,\r\n roiLayers,\r\n selectedLayer: newSelectedLayer,\r\n });\r\n\r\n return newSelectedLayer;\r\n };\r\n\r\n findChildren = (structure) => {\r\n const { structures } = this.state;\r\n\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === structure.subtypeLevel + 1 &&\r\n element.parentId === structure.id\r\n );\r\n };\r\n\r\n duplicateChildren = (oldParent, newParent) => {\r\n const { structures, roiLayers, fileId } = this.state;\r\n\r\n for (let structure of this.findChildren(oldParent)) {\r\n // findHighest id number\r\n const newId =\r\n structures.reduce((a, c) => (a ? Math.max(a, c.id) : c.id)) + 1;\r\n\r\n // clone structure\r\n let newStructure = Object.assign(JSON.parse(JSON.stringify(structure)), {\r\n id: newId,\r\n parentId: newParent.id,\r\n });\r\n\r\n let newRoilayer = {\r\n id: newId,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n };\r\n\r\n structures.push(newStructure);\r\n roiLayers[fileId].push(newRoilayer);\r\n\r\n this.duplicateChildren(structure, newStructure);\r\n }\r\n };\r\n\r\n /**\r\n * Checks if a structure can be moved in a direction.\r\n *\r\n * @param {Object} selectedStructure - Structure to move\r\n * @param {int} direction - 1 is up -1 is down\r\n * @returns {bool} Move in this direction possible\r\n */\r\n canMoveStructure = (selectedStructure, direction) => {\r\n const { structures } = this.state;\r\n if (!selectedStructure.dynamic) return false;\r\n\r\n let structuresSameLevel = {\r\n structure: [],\r\n index: [],\r\n };\r\n\r\n // get structures in same level of same parent\r\n structuresSameLevel.structure = structures.filter(\r\n (element) =>\r\n element.parentId === selectedStructure.parentId &&\r\n element.subtypeLevel === selectedStructure.subtypeLevel\r\n );\r\n\r\n // if parent is selected (e.g. Base Roi)\r\n if (!selectedStructure.isSubtype) {\r\n structuresSameLevel.structure = structures.filter(\r\n (element) => element.subtypeLevel === selectedStructure.subtypeLevel\r\n );\r\n }\r\n // get indices in all structures\r\n structuresSameLevel.structure.forEach((element) =>\r\n structuresSameLevel.index.push(\r\n structures.findIndex((structure) => structure === element)\r\n )\r\n );\r\n\r\n // index of selected layer of structures in same level\r\n let index = structuresSameLevel.structure.findIndex(\r\n (structure) => structure === selectedStructure\r\n );\r\n\r\n if (direction > 0) {\r\n // if first object --> move up not possible.\r\n // Also, moving above fixed, non-dynamic structures is forbidden.\r\n if (index === 0 || !structuresSameLevel.structure[index - 1].dynamic) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n } else {\r\n // if last object --> move down not possible\r\n if (index === structuresSameLevel.structure.length - 1) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Moves a structure up or down in structure list\r\n *\r\n * @param {Object} selectedStructure - Structure to move\r\n * @param {int} direction - 1 is up -1 is down\r\n */\r\n moveStructure = (selectedStructure, direction) => {\r\n const { structures, roiLayers } = this.state;\r\n\r\n let structuresSameLevel = {\r\n structure: [],\r\n index: [],\r\n };\r\n\r\n // get structures in same level of same parent\r\n structuresSameLevel.structure = structures.filter(\r\n (element) =>\r\n element.parentId === selectedStructure.parentId &&\r\n element.subtypeLevel === selectedStructure.subtypeLevel\r\n );\r\n\r\n // if parent is selected (e.g. Base Roi)\r\n if (!selectedStructure.isSubtype) {\r\n structuresSameLevel.structure = structures.filter(\r\n (element) => element.subtypeLevel === selectedStructure.subtypeLevel\r\n );\r\n }\r\n // get indices in all structures\r\n structuresSameLevel.structure.forEach((element) =>\r\n structuresSameLevel.index.push(\r\n structures.findIndex((structure) => structure === element)\r\n )\r\n );\r\n\r\n // index of selected layer of structures in same level\r\n let index = structuresSameLevel.structure.findIndex(\r\n (structure) => structure === selectedStructure\r\n );\r\n\r\n if (direction > 0) {\r\n // if first object --> move up not possible.\r\n // Also, moving above fixed, non-dynamic structures is forbidden.\r\n if (index === 0 || !structuresSameLevel.structure[index - 1].dynamic) {\r\n window.showWarningSnackbar(\"Moving structure up not possible!\");\r\n return;\r\n }\r\n // swap two neighbor structures with subtypes\r\n // get all elements of selected structure\r\n let strt = structuresSameLevel.index[index];\r\n let ed = structuresSameLevel.index[index + 1];\r\n // if structure to move up is last structure\r\n if (!ed) {\r\n // get index first structure in same level\r\n let idxFirstSubtype = structures.findIndex(\r\n (structure) => structure === structuresSameLevel.structure[0]\r\n );\r\n for (let i = idxFirstSubtype; i < structures.length; i++) {\r\n if (structures[i].subtypeLevel < selectedStructure.subtypeLevel) {\r\n ed = i;\r\n break;\r\n }\r\n }\r\n }\r\n // Get all children of the selected structure.\r\n let allElements_1 = structures.slice(strt, ed);\r\n\r\n // delete elements to swap from structures\r\n structures.splice(structuresSameLevel.index[index], allElements_1.length);\r\n\r\n // put elements to right index in structures\r\n let start = structures.findIndex(\r\n (structure) => structure === structuresSameLevel.structure[index - 1]\r\n );\r\n for (let i = allElements_1.length - 1; i >= 0; i--) {\r\n structures.splice(start, 0, allElements_1[i]);\r\n }\r\n } else {\r\n // if last object --> move down not possible\r\n if (index === structuresSameLevel.structure.length - 1) {\r\n window.showWarningSnackbar(\"Moving structure down not possible!\");\r\n return;\r\n }\r\n\r\n // swap two neighbor structures with subtypes\r\n // get all elements of selected structure\r\n let strt = structuresSameLevel.index[index];\r\n let ed = structuresSameLevel.index[index + 1];\r\n let allElements_1 = structures.slice(strt, ed);\r\n\r\n // delete elements of first structure to swap\r\n structures.splice(structuresSameLevel.index[index], allElements_1.length);\r\n\r\n // put elements to right index in structures\r\n let start = structures.findIndex(\r\n (structure) => structure === structuresSameLevel.structure[index + 2]\r\n );\r\n\r\n // if structure to swap is last subtype\r\n let lastStructure = false;\r\n if (start === -1) {\r\n // get index of structure to swap\r\n let idxSwapStructure = structures.findIndex(\r\n (structure) => structure === structuresSameLevel.structure[index + 1]\r\n );\r\n // if it is the last structure of all structures\r\n // search next parent structure\r\n let otherParent = false;\r\n for (let i = idxSwapStructure; i < structures.length; i++) {\r\n if (structures[i].subtypeLevel < selectedStructure.subtypeLevel) {\r\n otherParent = true;\r\n }\r\n }\r\n if (!otherParent) {\r\n lastStructure = true;\r\n } else {\r\n // search next parent structure\r\n for (let i = idxSwapStructure; i < structures.length; i++) {\r\n if (structures[i].subtypeLevel < selectedStructure.subtypeLevel) {\r\n start = i;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!lastStructure) {\r\n // put all elements to index after structure to swap\r\n for (let i = allElements_1.length - 1; i >= 0; i--) {\r\n structures.splice(start, 0, allElements_1[i]);\r\n }\r\n } else {\r\n // if last structure push elements to the end\r\n for (let i = 0; i < allElements_1.length; i++) {\r\n structures.push(allElements_1[i]);\r\n }\r\n }\r\n }\r\n\r\n // Match roiLayer structure to new structure structure.\r\n // Sorts the roilayers for each scene in project by having their ID-order\r\n // match the order set by the structures.\r\n for (let sceneGUID in roiLayers) {\r\n roiLayers[sceneGUID].sort((roi_layer_a, roi_layer_b) => {\r\n // Location of the first roi-Layer Id in strcutures\r\n let index_of_roi_layer_a_in_structures = structures.findIndex(\r\n (element) => {\r\n return element.id === roi_layer_a.id;\r\n }\r\n );\r\n\r\n // Location of the second roi-Layer Id in strcutures\r\n let index_of_roi_layer_b_in_structures = structures.findIndex(\r\n (element) => {\r\n return element.id === roi_layer_b.id;\r\n }\r\n );\r\n\r\n // Check if the first index comes before the second.\r\n // Else, swap per sort algorithm.\r\n return (\r\n index_of_roi_layer_a_in_structures -\r\n index_of_roi_layer_b_in_structures\r\n );\r\n });\r\n }\r\n\r\n let newSelectedLayer = structures.findIndex((c) => c === selectedStructure);\r\n\r\n this.sendStructures(structures);\r\n this.setMountedState({ structures, selectedLayer: newSelectedLayer });\r\n return newSelectedLayer;\r\n };\r\n\r\n getProjectStringInfos = () => {\r\n const project = this.state.project;\r\n const file = project.files.find((file) => file.id === this.state.fileId);\r\n const fileName = file.fileName.split(\".\").slice(0, -1).join(\".\");\r\n let today = new Date();\r\n let dd = String(today.getDate()).padStart(2, \"0\");\r\n let mm = String(today.getMonth() + 1).padStart(2, \"0\"); //January is 0!\r\n let yyyy = today.getFullYear();\r\n today = yyyy + \"-\" + mm + \"-\" + dd;\r\n\r\n // projekt_methode_filename_SceneNr_001.png\r\n return {\r\n name: project.name,\r\n type: project.type,\r\n fileName: fileName,\r\n date: today,\r\n };\r\n };\r\n\r\n setStateNow = (newState) => {\r\n Object.assign(this.state, newState);\r\n this.forceUpdate();\r\n };\r\n\r\n setAiModelRepository = (aiModelRepository) => {\r\n this.aiModelRepository = aiModelRepository;\r\n };\r\n\r\n setAiStateObject = (aiStateObject) => {\r\n this.aiStateObject = aiStateObject;\r\n };\r\n\r\n getUserData = () => {\r\n return this.usersData;\r\n };\r\n\r\n setPersistentStorage = (persistentStorage) => {\r\n this.persistentStorage = persistentStorage;\r\n };\r\n\r\n render() {\r\n return (\r\n this.setMountedState(e, callback),\r\n forceUpdate: () => this.forceUpdate(),\r\n getRegionById: this.getRegionById,\r\n setChangingFile: this.setChangingFile,\r\n setActiveTab: this.setActiveTab,\r\n getActiveTab: this.getActiveTab,\r\n /* Handle Structures */\r\n importStructures: this.importStructures,\r\n addStructure: this.addStructure,\r\n addSubStructure: this.addSubStructure,\r\n addSubType: this.addSubType,\r\n sendStructures: this.sendStructures,\r\n deleteStructure: this.deleteStructure,\r\n moveStructure: this.moveStructure,\r\n canMoveStructure: this.canMoveStructure,\r\n duplicateStructure: this.duplicateStructure,\r\n setStateNow: this.setStateNow,\r\n getProjectStringInfos: this.getProjectStringInfos,\r\n setAiModelRepository: this.setAiModelRepository,\r\n setAiStateObject: this.setAiStateObject,\r\n /* State */\r\n ...this.state,\r\n fileRoiLayers:\r\n this.state.roiLayers && this.state.roiLayers[this.state.fileId],\r\n }}\r\n >\r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nProjectProvider.propTypes = {\r\n children: PropTypes.element.isRequired,\r\n};\r\n\r\nexport default ProjectProvider;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { RegionROI } from \"../utils/ROI\";\r\n\r\nimport { withPersistentStorage } from \"./PersistentStorageContext\";\r\nimport { withProject } from \"./ProjectContext\";\r\n\r\nimport { getParentIndexLayer } from \"../utils/StructuresUtils\";\r\n\r\nconst ProjectHistoryContext = React.createContext();\r\n\r\nexport const withProjectHistory = (Component) => {\r\n const WrappedComponent = (props) => (\r\n \r\n {(context) => }\r\n \r\n );\r\n\r\n WrappedComponent.displayName = `withProjectHistory(${\r\n Component.displayName || Component.name || \"Component\"\r\n })`;\r\n\r\n return WrappedComponent;\r\n};\r\n\r\n// this is the main component, it has to be added at the root of the app.\r\n// all components that use withProject(...) will have access to it via this.props.Project...\r\n// There is not limit for steps, since it should also be used to save new Annotations to the project\r\nclass ProjectHistoryProvider extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n canUndo: false,\r\n canRedo: false,\r\n sizeLimitReached: false,\r\n };\r\n this.socket = null;\r\n this.shownSaveHintNum = 0;\r\n window.projectHistory = this;\r\n }\r\n\r\n /**\r\n * Initializes the Project provider and passes a viewer component\r\n *\r\n * @param {object} viewer - Viewer Component\r\n */\r\n init = (viewer) => {\r\n this.viewer = viewer;\r\n this.collecting = false;\r\n this.collection = [];\r\n this.past = [];\r\n this.future = [];\r\n };\r\n\r\n send = (stepType, items) => {\r\n const toSend = {\r\n state: \"anno\",\r\n stepType,\r\n };\r\n if (stepType === \"pastHistory\") {\r\n toSend.items = items.map((item) => {\r\n return item.map((itm) => {\r\n return {\r\n add: itm.add,\r\n id: itm.id,\r\n roi: itm.roi.regions,\r\n };\r\n });\r\n });\r\n } else if (typeof items !== \"undefined\") {\r\n toSend.items = items.map((item) => {\r\n return {\r\n add: item.add,\r\n id: item.id,\r\n roi: item.roi.regions,\r\n };\r\n });\r\n }\r\n\r\n // this.socket.send(JSON.stringify(toSend));\r\n };\r\n\r\n receive = (input) => {\r\n const { structures } = this.viewer.props.projectContext;\r\n if (input.state === \"init\" && this.past) {\r\n this.send(\"pastHistory\", this.past);\r\n return;\r\n }\r\n if (input.stepType === \"pastHistory\" && input.items) {\r\n for (const inputItems of input.items) {\r\n const items = inputItems.map((item) => {\r\n const roiStructure = structures.find((str) => str.id === item.id);\r\n return {\r\n add: item.add,\r\n id: item.id,\r\n roi: new RegionROI({\r\n regions: [item.roi],\r\n structureId: item.id,\r\n color: roiStructure.color,\r\n isSubtype: roiStructure.classificationSubtype,\r\n subtypeName: roiStructure.label,\r\n }),\r\n };\r\n });\r\n this.past.push(items);\r\n this.processItem(items, \"redo\");\r\n }\r\n this.future = [];\r\n this.updateState();\r\n return;\r\n }\r\n if (input.items) {\r\n const items = input.items.map((item) => {\r\n const roiStructure = structures.find((str) => str.id === item.id);\r\n return {\r\n add: item.add,\r\n id: item.id,\r\n roi: new RegionROI({\r\n regions: [item.roi],\r\n structureId: item.id,\r\n color: roiStructure.color,\r\n isSubtype: roiStructure.classificationSubtype,\r\n subtypeName: roiStructure.label,\r\n }),\r\n };\r\n });\r\n if (input.stepType === \"redo\") {\r\n this.past.push(items);\r\n this.future = [];\r\n } else if (input.stepType === \"undo\") {\r\n this.future.push(items);\r\n }\r\n this.updateState();\r\n this.processItem(items, input.stepType);\r\n } else {\r\n if (input.stepType === \"undo\") {\r\n this.undoItem();\r\n } else if (input.stepType === \"redo\") {\r\n this.redoItem();\r\n }\r\n }\r\n };\r\n\r\n add = (items) => {\r\n if (items.length > 0) {\r\n items = items.map((item) => {\r\n item.roi = item.roi.copy();\r\n item.id = item.roi.structureId;\r\n return item;\r\n });\r\n if (this.collecting) {\r\n this.collection.push(items);\r\n } else {\r\n this.send(\"redo\", items);\r\n this.past.push(items);\r\n this.future = [];\r\n }\r\n this.updateState();\r\n if (Math.floor(this.past.length / 100) > this.shownSaveHintNum) {\r\n this.shownSaveHintNum++;\r\n window.showActionSnackbar(\r\n \"Would you like to save your \" + this.past.length + \" changes?\",\r\n this.props.projectContext.viewer.onSaveClick,\r\n \"Save now\",\r\n \"Dismiss\"\r\n );\r\n }\r\n }\r\n };\r\n\r\n //intern function, adds and removes polys for one item (history step)\r\n processItem = (items, stepType) => {\r\n if (items.length === 0) return;\r\n\r\n const { fileId, structures } = this.viewer.props.projectContext;\r\n let roiLayers = this.viewer.props.projectContext.roiLayers[fileId];\r\n\r\n for (let action of items) {\r\n let parentLayerIdx = -1;\r\n try {\r\n parentLayerIdx = getParentIndexLayer(\r\n structures.find((str) => str.id === action.id),\r\n structures\r\n );\r\n } catch (ex) {\r\n console.log(stepType, \"error:\", ex);\r\n window.showErrorSnackbar(\r\n \"Something went wrong, \" + stepType + \" ignored!\"\r\n );\r\n return;\r\n }\r\n const parentRoiLayer = roiLayers[parentLayerIdx];\r\n\r\n if (\r\n (stepType === \"redo\" && action.add) ||\r\n (stepType === \"undo\" && !action.add)\r\n ) {\r\n const overlapItems = parentRoiLayer.tree.search(action.roi.treeItem);\r\n let isSame = false;\r\n for (const treeItem of overlapItems) {\r\n if (treeItem.roi.sameBoundsWith(action.roi)) {\r\n isSame = true;\r\n break;\r\n }\r\n }\r\n if (!isSame) {\r\n parentRoiLayer.tree.insert(action.roi.treeItem);\r\n }\r\n } else {\r\n parentRoiLayer.tree.remove(action.roi.treeItem, (a, b) => {\r\n return a.roi.sameBoundsWith(b.roi);\r\n });\r\n }\r\n parentRoiLayer.layer.regionRois = parentRoiLayer.tree\r\n .all()\r\n .map((treeItem) => treeItem.roi);\r\n }\r\n };\r\n\r\n undoItem = () => {\r\n if (this.past.length > 0) {\r\n let item = this.past.pop();\r\n this.processItem(item, \"undo\");\r\n this.future.push(item);\r\n this.updateState();\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n undo = () => {\r\n const actionDone = this.undoItem();\r\n if (actionDone) {\r\n this.send(\"undo\");\r\n }\r\n };\r\n\r\n redoItem = () => {\r\n if (this.future.length > 0) {\r\n let item = this.future.pop();\r\n this.processItem(item, \"redo\");\r\n this.past.push(item);\r\n this.updateState();\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n redo = () => {\r\n const actionDone = this.redoItem();\r\n if (actionDone) {\r\n this.send(\"redo\");\r\n }\r\n };\r\n\r\n clear = () => {\r\n this.past = [];\r\n this.future = [];\r\n this.shownSaveHintNum = 0;\r\n this.updateState();\r\n };\r\n\r\n updateState = () => {\r\n this.setState({\r\n canUndo: this.past.length > 0,\r\n canRedo: this.future.length > 0,\r\n });\r\n };\r\n\r\n getHistoryLength = () => {\r\n return this.past.length;\r\n };\r\n\r\n mergePastItems(n) {\r\n if (n > 1) {\r\n let newItem = [];\r\n for (let i = 0; i < n; i++) {\r\n let item = this.past.pop();\r\n newItem.push(...item);\r\n }\r\n this.past.push(newItem);\r\n this.future = [];\r\n }\r\n }\r\n\r\n startCollection() {\r\n this.collecting = true;\r\n }\r\n\r\n addCollection() {\r\n this.collecting = false;\r\n let mergedItems = [];\r\n while (this.collection.length > 0) {\r\n const items = this.collection.pop();\r\n mergedItems.push(...items);\r\n }\r\n this.collection = [];\r\n this.add(mergedItems);\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nProjectHistoryProvider.propTypes = {\r\n historyDepth: PropTypes.number.isRequired,\r\n projectContext: PropTypes.object,\r\n children: PropTypes.element.isRequired,\r\n};\r\n\r\nexport default withPersistentStorage(withProject(ProjectHistoryProvider));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Typography } from \"@mui/material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = () => ({\r\n root: {\r\n position: \"relative\",\r\n height: \"100%\",\r\n width: \"100%\",\r\n textAlign: \"center\",\r\n },\r\n view3d: { position: \"relative\", width: \"100%\", height: 456, zIndex: 100000 },\r\n hiddenView3d: {\r\n position: \"absolute\",\r\n width: \"100%\",\r\n height: 456,\r\n visibility: \"hidden\",\r\n },\r\n});\r\n\r\nclass Preview3d extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n shownProteinId: \"\",\r\n };\r\n }\r\n addScript = (src) => {\r\n let script = document.getElementById(src);\r\n if (script === null) {\r\n script = document.createElement(\"script\");\r\n script.id = src;\r\n script.src = src;\r\n script.async = false;\r\n document.head.appendChild(script);\r\n }\r\n\r\n return script;\r\n };\r\n addStyle = (href) => {\r\n let link = document.getElementById(href);\r\n if (link === null) {\r\n link = document.createElement(\"link\");\r\n link.id = href;\r\n link.href = href;\r\n link.rel = \"stylesheet\";\r\n document.head.appendChild(link);\r\n }\r\n };\r\n initPeptide = () => {};\r\n\r\n updateProtein = () => {\r\n if (this.props.selectedRow) {\r\n if (this.state.shownProteinId !== this.props.selectedRow.proteinId) {\r\n this.getUniprotData(this.props.selectedRow, (found) => {\r\n console.log(\"result found:\", found);\r\n });\r\n }\r\n }\r\n };\r\n\r\n componentDidUpdate = () => {\r\n this.updateProtein();\r\n };\r\n\r\n getUniprotData = (selectedRow, callback) => {\r\n let proteinId = selectedRow.proteinId;\r\n let locationMin = selectedRow.location;\r\n let locationMax = selectedRow.location + selectedRow.name.length;\r\n let viewer3D = this;\r\n var xmlhttp = new XMLHttpRequest();\r\n xmlhttp.onreadystatechange = function () {\r\n if (this.readyState === 4 && this.status === 200) {\r\n //myFunction(this);\r\n let xmlDoc = this.responseXML;\r\n //let x = xmlDoc.getElementsByTagName(\"dbReference\");\r\n for (let dbReference of xmlDoc.getElementsByTagName(\"dbReference\")) {\r\n if (dbReference.getAttribute(\"type\") === \"PDB\") {\r\n let viewerId = dbReference.getAttribute(\"id\");\r\n for (let property of dbReference.childNodes) {\r\n if (\r\n property.getAttribute &&\r\n property.getAttribute(\"type\") === \"chains\"\r\n ) {\r\n let chainsArr = property.getAttribute(\"value\").split(\", \");\r\n for (let value of chainsArr) {\r\n let valueArr = value.split(\"=\");\r\n let chain = valueArr[0];\r\n let positionsArr = valueArr[1].split(\"-\");\r\n let minPos = positionsArr[0];\r\n let maxPos = positionsArr[1];\r\n if (locationMin > minPos && locationMax < maxPos) {\r\n viewer3D.openMolecule(\r\n proteinId,\r\n viewerId,\r\n chain,\r\n locationMin,\r\n locationMax\r\n );\r\n callback(true);\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n callback(false);\r\n };\r\n xmlhttp.open(\r\n \"GET\",\r\n \"https://www.uniprot.org/uniprot/\" + proteinId + \".xml\",\r\n true\r\n );\r\n xmlhttp.send();\r\n };\r\n\r\n getLiteMolScope = () => {\r\n if (typeof this.liteMolScope === \"undefined\") {\r\n let element = document.getElementById(\"litemol_1cbs\");\r\n this.liteMolScope = window.angular.element(element).isolateScope();\r\n }\r\n return this.liteMolScope;\r\n };\r\n\r\n openMolecule = (proteinId, moleculeId, chain, locationMin, locationMax) => {\r\n this.setState({ shownProteinId: proteinId });\r\n const liteMolScope = this.getLiteMolScope();\r\n liteMolScope.LiteMolComponent.destroyPlugin();\r\n liteMolScope.LiteMolComponent.createPlugin();\r\n liteMolScope.LiteMolComponent.moleculeId = moleculeId;\r\n liteMolScope.LiteMolComponent.loadMolecule();\r\n //this.liteMolScope.LiteMolComponent.colorChains(\"A\", [255, 0, 0]);\r\n setTimeout(() => {\r\n let sequenceAnnotation =\r\n liteMolScope.LiteMolComponent.loadSequenceAnnotation();\r\n console.log(\"sequenceAnnotation:\", sequenceAnnotation);\r\n liteMolScope.LiteMolComponent.colorChains(\"#nothing#\", [0, 255, 0]);\r\n console.log(\"chain:\", chain);\r\n chain =\r\n chain.split(\"/\").length > 1 ? chain.split(\"/\")[1] : chain.split(\"/\")[0];\r\n let selectionDetails = {\r\n entity_id: \"1\",\r\n struct_asym_id: chain,\r\n start_residue_number: locationMin,\r\n end_residue_number: locationMax,\r\n };\r\n liteMolScope.LiteMolComponent.highlightOn(selectionDetails);\r\n }, 1000);\r\n };\r\n\r\n initLiteMolScope = () => {\r\n console.log(\"initLiteMolScope()\");\r\n //Bootstrapping / Installing the library\r\n window.angular.element(document).ready(() => {\r\n this.litemolelem = document.getElementById(\"litemol_1cbs\");\r\n window.angular.bootstrap(document, [\"pdb.component.library\"]);\r\n });\r\n\r\n //bind to the component scope on window.onload\r\n window.onload = () => {\r\n window.liteMolElement = document.getElementById(\"litemol_1cbs\");\r\n window.liteMolScope = window.angular\r\n .element(window.liteMolElement)\r\n .isolateScope();\r\n };\r\n };\r\n\r\n componentDidMount = () => {\r\n console.log(\"Preview3d componentDidMOunt()\");\r\n this.addStyle(\r\n \"//www.ebi.ac.uk/pdbe/pdb-component-library/v1.0/css/pdb.component.library.min-1.0.0.css\"\r\n );\r\n const angularScript = this.addScript(\r\n \"https://www.ebi.ac.uk/pdbe/pdb-component-library/libs/angular.1.4.7.min.js\"\r\n );\r\n this.addScript(\r\n \"https://www.ebi.ac.uk/pdbe/pdb-component-library/libs/d3.min.js\"\r\n );\r\n this.addScript(\r\n \"https://www.ebi.ac.uk/pdbe/pdb-component-library/v1.0/js/pdb.component.library.min-1.0.0.js\"\r\n );\r\n if (typeof window.angular === \"undefined\") {\r\n angularScript.onload = () => {\r\n this.initLiteMolScope();\r\n };\r\n } else {\r\n let element = document.getElementById(\"litemol_1cbs\");\r\n element.replaceWith(window.liteMolElement);\r\n window.liteMolScope = window.angular.element(element).isolateScope();\r\n }\r\n this.updateProtein();\r\n };\r\n render() {\r\n const { classes } = this.props;\r\n\r\n return (\r\n
    \r\n {this.props.selectedRow ? (\r\n \r\n Protein ID: {this.props.selectedRow.proteinId}\r\n \r\n ) : (\r\n \r\n Please select a protein from the results to view its properties\r\n here.\r\n \r\n )}\r\n \r\n \r\n
    \r\n {this.props.selectedRow && (\r\n
    \r\n \r\n https://www.uniprot.org/uniprot/\r\n {this.props.selectedRow.proteinId}\r\n \r\n
    \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nPreview3d.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n selectedRow: PropTypes.object,\r\n};\r\n\r\nexport default withStyles(styles)(Preview3d);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from '@mui/styles/withStyles';\r\nimport { TextField, Button, Typography, Tabs, Tab } from \"@mui/material\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faCog, faDna } from \"@fortawesome/free-solid-svg-icons\";\r\n\r\nimport ProteomSettings from \"./ProteomSettings\";\r\nimport Preview3d from \"../components/Preview3d\";\r\n\r\nconst styles = {\r\n paddingContainer: {\r\n padding: 10,\r\n },\r\n formItem: {\r\n width: \"100%\",\r\n marginBottom: 20,\r\n },\r\n numberInput: {\r\n width: 50,\r\n marginRight: 10,\r\n },\r\n applyButton: {\r\n width: \"100%\",\r\n },\r\n tab: {\r\n minWidth: 395 / 3,\r\n minHeight: 44,\r\n height: 44,\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n \"& *\": {\r\n display: \"inline-block\",\r\n fontSize: \"16px\",\r\n lineHeight: \"16px\",\r\n },\r\n \"& svg\": {\r\n marginRight: \"5px\",\r\n position: \"relative\",\r\n top: \"4px\",\r\n },\r\n },\r\n};\r\n\r\nclass ProteomeSideBar extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n activeTab: 0,\r\n };\r\n\r\n window.forceSidebarUpdate = this.forceSidebarUpdate;\r\n }\r\n\r\n // // file handling, if upload need later on\r\n // componentDidMount = () => {\r\n // this.fileInputButton = document.getElementById(\"proteomFileInput\");\r\n // this.fileInputButton.addEventListener(\"change\", this.readSingleFile, false);\r\n // };\r\n\r\n // readSingleFile(e) {\r\n // let file = e.target.files[0];\r\n // if (!file) {\r\n // return;\r\n // }\r\n // let reader = new FileReader();\r\n // reader.onload = function (e) {\r\n // let contents = e.target.result;\r\n // //displayContents(contents);\r\n // let lines = contents.split(\"\\n\");\r\n // let initIdx = 0;\r\n // //important columns:\r\n // // ID => Protein ID (more)\r\n // //\r\n // for (let i = 0; i < lines.length; i++) {\r\n // lines[i] = lines[i].split(\"\\t\");\r\n // if (initIdx === 0 && lines[i].length > 10) {\r\n // initIdx = i;\r\n // }\r\n // }\r\n // let lineTable = lines.splice(initIdx, lines.length);\r\n // console.log(\"lineTable:\", initIdx, lineTable.length, lineTable);\r\n // };\r\n // reader.readAsText(file);\r\n // }\r\n\r\n // openProteomFile = () => {\r\n // this.fileInputButton.click();\r\n // };\r\n\r\n handleTabChange = (event, value) => {\r\n this.setState({ activeTab: value });\r\n };\r\n render() {\r\n const { classes, project } = this.props;\r\n const { activeTab } = this.state;\r\n\r\n return (\r\n
    \r\n \r\n }\r\n label=\"View\"\r\n />\r\n }\r\n label=\"Properties\"\r\n />\r\n \r\n {this.state.activeTab === 0 && (\r\n \r\n )}\r\n\r\n {/* */}\r\n {this.state.activeTab === 1 && (\r\n
    \r\n \r\n Analysis Properties\r\n \r\n\r\n {project && (\r\n \r\n this.props.changeProjectName(e.target.value)}\r\n className={classes.formItem}\r\n />\r\n {project.files.length > 0 && (\r\n \r\n )}\r\n\r\n \r\n \r\n )}\r\n\r\n \r\n Apply\r\n \r\n
    \r\n )}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nProteomeSideBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n selectedRow: PropTypes.object,\r\n onChangeMetaData: PropTypes.func,\r\n changeProjectName: PropTypes.func,\r\n saveAndRunProject: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(ProteomeSideBar);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport TableSortLabel from \"@mui/material/TableSortLabel\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\nimport { ArrowDropDown, ArrowDropUp } from \"@mui/icons-material\";\r\n\r\nconst rows = [\r\n {\r\n id: \"actions\",\r\n numeric: false,\r\n label: \"\",\r\n },\r\n {\r\n id: \"name\",\r\n numeric: false,\r\n label: \"Epitope\",\r\n },\r\n { id: \"score\", numeric: true, label: \"Score\" },\r\n {\r\n id: \"proteinId\",\r\n numeric: true,\r\n label: \"Protein ID\",\r\n },\r\n {\r\n id: \"ProteinName\",\r\n numeric: true,\r\n label: \"Protein name\",\r\n },\r\n { id: \"location\", numeric: true, label: \"Location\" },\r\n { id: \"epitope\", numeric: true, label: \"Epitope\" },\r\n];\r\n\r\nfunction desc(a, b, orderBy) {\r\n if (b[orderBy] < a[orderBy]) {\r\n return -1;\r\n }\r\n if (b[orderBy] > a[orderBy]) {\r\n return 1;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction stableSort(array, cmp) {\r\n const stabilizedThis = array.map((el, index) => [el, index]);\r\n stabilizedThis.sort((a, b) => {\r\n const order = cmp(a[0], b[0]);\r\n if (order !== 0) return order;\r\n return a[1] - b[1];\r\n });\r\n return stabilizedThis.map((el) => el[0]);\r\n}\r\n\r\nfunction getSorting(order, orderBy) {\r\n return order === \"desc\"\r\n ? (a, b) => desc(a, b, orderBy)\r\n : (a, b) => -desc(a, b, orderBy);\r\n}\r\n\r\nclass ProteomResultsHead extends React.Component {\r\n createSortHandler = (property) => (event) => {\r\n this.props.onRequestSort(event, property);\r\n };\r\n\r\n render() {\r\n const { order, orderBy } = this.props;\r\n\r\n return (\r\n \r\n \r\n {rows.map(\r\n (row, idx) => (\r\n \r\n {idx > 0 && idx < 3 ? (\r\n \r\n \r\n {row.label}\r\n \r\n \r\n ) : (\r\n {row.label}\r\n )}\r\n \r\n ),\r\n this\r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nProteomResultsHead.propTypes = {\r\n onRequestSort: PropTypes.func.isRequired,\r\n order: PropTypes.string.isRequired,\r\n orderBy: PropTypes.string.isRequired,\r\n rowCount: PropTypes.number.isRequired,\r\n};\r\n\r\nconst styles = () => ({\r\n root: {\r\n width: \"100%\",\r\n },\r\n table: {\r\n minWidth: 800,\r\n },\r\n tableWrapper: {\r\n overflowX: \"auto\",\r\n },\r\n});\r\n\r\nclass ProteomResults extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.counter = 0;\r\n this.epitopes = {};\r\n let allRows = [];\r\n\r\n this.state = {\r\n order: \"asc\",\r\n orderBy: \"calories\",\r\n selected: [],\r\n data: allRows,\r\n epitopes: this.epitopes,\r\n };\r\n }\r\n\r\n componentDidUpdate = (prevProps) => {\r\n if (\r\n Object.keys(prevProps.annotations).length === 0 &&\r\n Object.keys(this.props.annotations).length > 0\r\n ) {\r\n let allRows = [];\r\n for (const [key, value] of Object.entries(this.props.annotations)) {\r\n let name = key;\r\n //console.log(\"row\", key);\r\n let score = value.score;\r\n let proteinId = \"\";\r\n let proteinName = \"\";\r\n let location = \"\";\r\n let epitope = \"C\";\r\n for (let row of value.proteins) {\r\n proteinId = row.id;\r\n proteinName = row.name;\r\n location = row.content.indexOf(key, 0);\r\n allRows.push(\r\n this.createRow(\r\n name,\r\n score,\r\n proteinId,\r\n proteinName,\r\n location,\r\n epitope\r\n )\r\n );\r\n }\r\n }\r\n this.setState({ data: allRows });\r\n }\r\n };\r\n\r\n createRow(name, score, proteinId, proteinName, location, epitope) {\r\n this.counter += 1;\r\n if (typeof this.epitopes[name] === \"undefined\")\r\n this.epitopes[name] = { score: score, collapsed: true };\r\n return {\r\n id: this.counter,\r\n name,\r\n score,\r\n proteinId,\r\n proteinName,\r\n location,\r\n epitope,\r\n };\r\n }\r\n\r\n handleRequestSort = (event, property) => {\r\n const orderBy = property;\r\n let order = \"desc\";\r\n\r\n if (this.state.orderBy === property && this.state.order === \"desc\") {\r\n order = \"asc\";\r\n }\r\n\r\n this.setState({ order, orderBy });\r\n };\r\n\r\n handleClick = (row) => {\r\n this.setState({ selected: row.id });\r\n this.props.setSelectedRow(row);\r\n };\r\n\r\n handleEpitopeRowClick = (row) => {\r\n let epitopes = this.state.epitopes;\r\n epitopes[row.name].collapsed = !epitopes[row.name].collapsed;\r\n this.setState({ epitopes, selected: null });\r\n this.props.setSelectedRow(null);\r\n };\r\n\r\n isSelected = (id) => this.state.selected === id;\r\n\r\n isCollapsed = (name) => {\r\n if (this.state.epitopes && this.state.epitopes[name]) {\r\n return this.state.epitopes[name].collapsed;\r\n } else {\r\n return true;\r\n }\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { data, order, orderBy } = this.state;\r\n let tempRow = null;\r\n\r\n return (\r\n \r\n
    \r\n \r\n \r\n \r\n {stableSort(data, getSorting(order, orderBy)).map((n) => {\r\n const isSelected = this.isSelected(n.id);\r\n let epitopeRow = null;\r\n if (tempRow === null || tempRow.name !== n.name) {\r\n epitopeRow = n;\r\n }\r\n tempRow = n;\r\n return (\r\n \r\n {epitopeRow !== null && (\r\n this.handleEpitopeRowClick(n)}\r\n >\r\n \r\n {this.isCollapsed(n.name) ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n {n.name}\r\n \r\n {n.score}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {!this.isCollapsed(n.name) && (\r\n this.handleClick(n)}\r\n aria-checked={isSelected}\r\n tabIndex={-1}\r\n key={uuidv4()}\r\n selected={isSelected}\r\n >\r\n \r\n \r\n \r\n {n.proteinId}\r\n {n.proteinName}\r\n {n.location}\r\n {n.epitope}\r\n \r\n )}\r\n \r\n );\r\n })}\r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nProteomResults.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n setSelectedRow: PropTypes.func,\r\n annotations: PropTypes.object,\r\n};\r\n\r\nexport default withStyles(styles)(ProteomResults);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { IconButton, Tooltip, SvgIcon } from \"@mui/material\";\r\n\r\nimport { Save } from \"@mui/icons-material\";\r\nimport classNames from \"classnames\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n position: \"relative\",\r\n height: \"100%\",\r\n },\r\n topTools: {\r\n position: \"absolute\",\r\n top: 0,\r\n },\r\n bottomTools: {\r\n position: \"absolute\",\r\n bottom: 0,\r\n },\r\n toolbarButton: {\r\n display: \"inline-block\",\r\n width: 40,\r\n height: 40,\r\n padding: 8,\r\n margin: 0,\r\n },\r\n toolbarButtonChecked: {\r\n width: 40,\r\n color: theme.palette.primary.main,\r\n },\r\n});\r\n\r\nclass ProteomToolBar extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n if (props.project.state && props.project.state === \"success\") {\r\n let downloadPath = Backend.downloadReport(this.props.project.id);\r\n console.log(\"downloadPath:\", downloadPath);\r\n }\r\n }\r\n\r\n render() {\r\n const { classes, project } = this.props;\r\n\r\n return (\r\n
    \r\n
    \r\n {project.state && project.state === \"success\" && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nProteomToolBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n onSave: PropTypes.func,\r\n project: PropTypes.object,\r\n};\r\n\r\nexport default withStyles(styles)(ProteomToolBar);\r\n","import React, { Component } from \"react\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport ProteomeSideBar from \"./components/ProteomSideBar\";\r\nimport ProteomResults from \"./components/ProteomResults\";\r\nimport ProteomToolBar from \"./components/ProteomToolBar\";\r\nimport Backend from \"../common/utils/Backend\";\r\n\r\nconst styles = {\r\n outerContainer: {\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n background: \"#EBEBEB\",\r\n //background: \"blue\",\r\n display: \"grid\",\r\n gridTemplateColumns: \"auto 50px 456px\",\r\n },\r\n TableContainer: {\r\n background: \"white\",\r\n marginRight: 5,\r\n overflow: \"auto\",\r\n },\r\n PreviewContainer: {\r\n background: \"white\",\r\n },\r\n ToolBarContainer: {\r\n background: \"white\",\r\n margin: \"0 5px\",\r\n },\r\n SideBarContainer: {\r\n background: \"white\",\r\n },\r\n};\r\n\r\nclass ProteomeViewer extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n selectedRow: null,\r\n project: null,\r\n annotations: {},\r\n nameChanged: false,\r\n };\r\n }\r\n\r\n componentDidMount = () => {\r\n window.addEventListener(\"keydown\", this.keyDown);\r\n Backend.loadProject(\r\n {\r\n id: this.props.id,\r\n },\r\n (project) => {\r\n if (project.projectData) {\r\n project.metaData = project.projectData.metaData;\r\n project.name = project.projectData.name;\r\n } else {\r\n project.metaData = JSON.parse(project.metaData);\r\n }\r\n window.setNavigationbarTitle(\r\n `${project.name} (${project.viewerConfig.project.label})`\r\n );\r\n this.setState({ project: project });\r\n Backend.loadAnnotationsObject(\r\n { id: project.id, fileId: project.files[0].id },\r\n (result) => {\r\n if (result.annotations) {\r\n this.setState({ annotations: result.annotations });\r\n }\r\n }\r\n );\r\n }\r\n );\r\n Backend.getCurrentUser((user) => {\r\n this.setState({ user: user.fullName });\r\n });\r\n };\r\n\r\n componentWillUnmount() {\r\n window.removeEventListener(\"keydown\", this.keyDown);\r\n }\r\n /**\r\n * handle shortcut\r\n * @param {ActionEvent} e Event when keyboard button is pressed\r\n */\r\n keyDown = (e) => {\r\n if (e.ctrlKey && e.key === \"s\") {\r\n this.saveFunction((result) => console.log(\"saved:\", result));\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n setSelectedRow = (row) => {\r\n this.setState({ selectedRow: row });\r\n };\r\n\r\n createProjectModel = () => {\r\n const { project, user } = this.state;\r\n\r\n const projectModel = {\r\n name: project.name,\r\n user: user,\r\n id: project.id,\r\n readableId: project.readableId,\r\n metaData: project.metaData,\r\n type: project.type,\r\n tools: project.viewerConfig.project.tools,\r\n job: project.viewerConfig.project.job,\r\n files: project.files,\r\n };\r\n console.log(\"projectModel:\", projectModel);\r\n return projectModel;\r\n };\r\n\r\n saveFunction = (callback) => {\r\n if (this.state) {\r\n if (this.state.nameChanged) {\r\n Backend.renameProject(\r\n this.state.project.id,\r\n this.state.project.name,\r\n () => {\r\n console.log(\"project name changed to:\", this.state.project.name);\r\n }\r\n );\r\n }\r\n Backend.saveProject(this.createProjectModel(), (data) => {\r\n if (data.success) {\r\n window.showSuccessSnackbar(\"Project saved succesfully!\");\r\n callback(true);\r\n } else {\r\n window.showErrorSnackbar(\"Project couldn't be saved!\");\r\n callback(false);\r\n }\r\n });\r\n }\r\n };\r\n saveAndRunProject = () => {\r\n this.saveFunction((success) => {\r\n if (success) {\r\n Backend.setProjectsPending([this.state.project.id], () => {\r\n this.props.history.push(\"/\");\r\n });\r\n }\r\n });\r\n };\r\n\r\n onChangeMetaData = (field, e) => {\r\n this.setState((prevState) => {\r\n let project = Object.assign({}, prevState.project);\r\n project.metaData[field] = e;\r\n return { project };\r\n });\r\n };\r\n\r\n changeProjectName = (projectName) => {\r\n this.setState((prevState) => {\r\n let project = Object.assign({}, prevState.project);\r\n project.name = projectName;\r\n return { project, nameChanged: true };\r\n });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {this.state.project && (\r\n \r\n )}\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nProteomeViewer.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n id: PropTypes.string,\r\n history: PropTypes.array,\r\n};\r\n\r\nexport default withRouter(withStyles(styles)(ProteomeViewer));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\nimport Backend from \"../common/utils/Backend\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport Datasheet from \"react-datasheet\";\r\nimport \"react-datasheet/lib/react-datasheet.css\";\r\n\r\nimport XLSX from \"xlsx\";\r\nimport { Button, Tabs, Tab, Paper } from \"@mui/material\";\r\n\r\nconst styles = () => ({\r\n root: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n \"& .data-editor\": {\r\n height: \"24px !important\",\r\n boxSizing: \"border-box !important\",\r\n },\r\n \"& .value-viewer\": {\r\n padding: \"0 10px !important\",\r\n },\r\n display: \"grid\",\r\n gridTemplateRows: \"auto auto 1fr\",\r\n overflow: \"hidden\",\r\n },\r\n resultTabContent: {\r\n height: \"100%\",\r\n overflowY: \"auto\",\r\n },\r\n});\r\n\r\nclass Report extends Component {\r\n _isMounted = false;\r\n state = {\r\n activeTab: 0,\r\n settings: { tempPath: \"\" },\r\n project: undefined,\r\n charts: [],\r\n };\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n componentDidMount() {\r\n this._isMounted = true;\r\n const chartFolderPath = \"/\" + this.props.id + \"/charts/\";\r\n Backend.walkProjectDirFiles(chartFolderPath, (charts) => {\r\n this.setMountedState({ charts });\r\n });\r\n\r\n Backend.loadProject(\r\n {\r\n id: this.props.id,\r\n },\r\n (project) => {\r\n this.setMountedState({ project: project });\r\n window.setNavigationbarTitle(\r\n `Results: ${project.name} (${project.viewerConfig.project.label})`\r\n );\r\n }\r\n );\r\n\r\n Backend.loadReport(\r\n this.props.id,\r\n (data) => {\r\n let workbook = XLSX.read(data, { type: \"array\" });\r\n\r\n if (\r\n workbook.SheetNames.length === 1 &&\r\n workbook.SheetNames[0] === \"Sheet1\" &&\r\n workbook.Sheets.Sheet1.A1.v.toLowerCase().startsWith(\"error\")\r\n ) {\r\n window.showErrorSnackbar(workbook.Sheets.Sheet1.A1.v);\r\n }\r\n\r\n let sheets = workbook.SheetNames.map((sheet_name) =>\r\n XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name], {\r\n header: 1,\r\n raw: true,\r\n })\r\n );\r\n for (let i = 0; i < sheets.length; i++) {\r\n for (let j = 0; j < sheets[i].length; j++) {\r\n for (let k = 0; k < sheets[i][j].length; k++) {\r\n if (typeof sheets[i][j][k] === \"undefined\") {\r\n sheets[i][j][k] = \"\";\r\n }\r\n }\r\n }\r\n }\r\n const abc = [...Array(26)].map((val, i) => String.fromCharCode(i + 65));\r\n sheets = sheets.map((sheet) => {\r\n let rowLength = 0;\r\n let lastContentIdx = 0;\r\n for (let i = 0; i < sheet.length; i++) {\r\n if (sheet[i].length > 0) lastContentIdx = i;\r\n if (sheet[i].length > rowLength) rowLength = sheet[i].length;\r\n }\r\n sheet = sheet.filter((item, idx) => idx <= lastContentIdx);\r\n return sheet.map((row) => {\r\n row = row.map((cell) => {\r\n if (typeof cell === \"number\") {\r\n // if (sheet[0][i] && sheet[0][i].includes(\"%\")) {\r\n // cell *= 100;\r\n // }\r\n if (cell % 1 > 0 && cell < 1) {\r\n cell = cell.toFixed(6);\r\n } else if (cell % 1 > 0) {\r\n // Check if float precision exists\r\n cell = cell.toFixed(2);\r\n }\r\n } else if (\r\n typeof cell === \"string\" &&\r\n cell.includes(\"Ausreißer ignorieren\")\r\n ) {\r\n cell = \"\";\r\n }\r\n return { value: cell };\r\n });\r\n while (row.length < rowLength) {\r\n row.push({ value: \"\" });\r\n }\r\n return row;\r\n });\r\n });\r\n for (let sheet of sheets) {\r\n let addRow = new Array(sheet[0].length);\r\n addRow = sheet[0].map((v, i) => {\r\n return { value: abc[i], readOnly: true };\r\n });\r\n sheet = sheet.unshift(addRow);\r\n }\r\n for (let sheet of sheets) {\r\n for (let [index, row] of sheet.entries()) {\r\n row = row.unshift({\r\n value: index === 0 ? \"\" : index,\r\n readOnly: true,\r\n });\r\n }\r\n }\r\n\r\n this.setMountedState({\r\n workbook: workbook,\r\n array_sheets: sheets,\r\n });\r\n },\r\n (error) =>\r\n window.showErrorSnackbar(`Error loading results table: ${error}`)\r\n );\r\n }\r\n handleChange = (event, value) => {\r\n this.setMountedState({ activeTab: value });\r\n };\r\n render() {\r\n const { classes } = this.props;\r\n const { project } = this.state;\r\n return (\r\n
    \r\n
    \r\n {\r\n Backend.downloadReport(this.props.id, project.name);\r\n }}\r\n >\r\n Download Excel File\r\n \r\n \r\n (All Excel files are saved here: {this.state.settings.tempPath}\r\n reports/)\r\n \r\n
    \r\n \r\n {this.state.workbook &&\r\n this.state.workbook.SheetNames.map((tab_name, index) => (\r\n \r\n ))}\r\n {this.state.charts.length > 0 && }\r\n \r\n
    \r\n {this.state.array_sheets &&\r\n this.state.array_sheets.map((array_sheet, index) => (\r\n \r\n \r\n cell.value}\r\n onCellsChanged={() => {\r\n return;\r\n }}\r\n overflow=\"clip\"\r\n />\r\n \r\n
    \r\n ))}\r\n {this.state.array_sheets && (\r\n \r\n \r\n {this.state.charts.map((chart, idx) => (\r\n \r\n ))}\r\n \r\n
    \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nReport.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n id: PropTypes.string,\r\n history: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(withStyles(styles)(Report));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { withSpinloader } from \"../../common/components/Spinloader\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nconst ScanViewerContext = React.createContext();\r\n\r\nexport const withScanViewerContext = (Component) => {\r\n const WrappedComponent = (props) => (\r\n \r\n {(context) => }\r\n \r\n );\r\n\r\n WrappedComponent.displayName = `withScanViewerContext(${\r\n Component.displayName || Component.name || \"Component\"\r\n })`;\r\n\r\n return WrappedComponent;\r\n};\r\n\r\n/**\r\n * handles the communication with backend.\r\n * this is the main component, it has to be added at the root of the app.\r\n * all components that use withPersistentStorage(...) will have access to it via this.props.persistentStorage...\r\n */\r\nclass ScanViewerProvider extends Component {\r\n constructor(props) {\r\n super(props);\r\n this._isMounted = false;\r\n this.state = {\r\n mapVisible: true,\r\n cameraVisible: false,\r\n gridVisible: true,\r\n debugDataVisible: false,\r\n commentsVisible: true,\r\n automationVisible: true,\r\n automatedMicroscopeStatus: \"notConnected\",\r\n focusPeakingOn: true,\r\n sideBarContent: \"fluorescence\",\r\n streamReady: false,\r\n slideScanning: false,\r\n activeTab: 0,\r\n filePath: \"\",\r\n commentCount: 0,\r\n w: 400,\r\n h: 400,\r\n fluorescenceChannels: \"\",\r\n selectedChannel: \"\",\r\n cameraMinFramerate: 0,\r\n cameraMaxFramerate: 30,\r\n cameraMinExposureTime: 30,\r\n cameraMaxExposureTime: 99999,\r\n cameraMinGain: 0.1,\r\n cameraMaxGain: 12.0,\r\n cameraMinGamma: 0.0,\r\n cameraMaxGamma: 3.95,\r\n cameraMinBlackValue: 0.0,\r\n cameraMaxBlackValue: 31.9,\r\n pixelSizeCamera: 3.45,\r\n cameraColorMin: 0,\r\n cameraColorMax: 15.99,\r\n importFilePath: \"\",\r\n };\r\n this.lenseType = null;\r\n this.adapterType = null;\r\n\r\n this.channels = [];\r\n this.io = Backend.getScanSocket();\r\n this.io.on(\"connect\", () => {\r\n this.io.emit(\"scan_connect\", \"\");\r\n });\r\n\r\n this.io.on(\"scan_message\", (message_content) => {\r\n const data = JSON.parse(message_content);\r\n if (data.state) {\r\n if (data.state === \"stream_ready\") {\r\n this.setState({ streamReady: true });\r\n } else if (data.state === \"stitching_start\") {\r\n props.spinloader.show();\r\n } else if (data.state === \"stitching\") {\r\n props.spinloader.showWithProgress({\r\n message: \"Progress\",\r\n progress: data.progress,\r\n });\r\n } else if (data.state === \"stitching_end\") {\r\n props.spinloader.hide();\r\n } else if (data.state === \"camera_error\") {\r\n window.openResponseDialog(\r\n \"Camera could not be found. Retry?\",\r\n (response) => {\r\n if (!response) {\r\n this.props.history.push(\"/\");\r\n }\r\n }\r\n );\r\n } else if (data.state === \"saving_error\") {\r\n props.spinloader.hide();\r\n window.openWarningDialog(\r\n \"Number of channels not equal. Please save in separate file.\"\r\n );\r\n } else if (data.state === \"cameraParameters\") {\r\n this.setState({\r\n cameraMinFramerate: data.cameraMinFramerate,\r\n cameraMaxFramerate: data.cameraMaxFramerate,\r\n cameraMinExposureTime: data.cameraMinExposureTime,\r\n cameraMaxExposureTime: data.cameraMaxExposureTime,\r\n cameraMinGain: data.cameraMinGain,\r\n cameraMaxGain: data.cameraMaxGain,\r\n cameraMinGamma: data.cameraMinGamma,\r\n cameraMaxGamma: data.cameraMaxGamma,\r\n cameraMinBlackValue: data.cameraMinBlackValue,\r\n cameraMaxBlackValue: data.cameraMaxBlackValue,\r\n pixelSizeCamera: data.pixelSizeCamera,\r\n });\r\n } else if (data.state === \"automatedMicroscope\") {\r\n if (data.status) {\r\n this.setState({ automatedMicroscopeStatus: data.status });\r\n }\r\n } else if (data.state === \"toggle_state\") {\r\n // if (data.paused) {\r\n this.setMountedState({\r\n slideScanning: !data.paused,\r\n cameraVisible: data.cameraVisible,\r\n gridVisible: data.gridVisible,\r\n });\r\n // }\r\n }\r\n }\r\n });\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n window.addEventListener(\"beforeunload\", this.exitScanner);\r\n const cameraVisibleValue =\r\n localStorage.getItem(\"scanCameraVisible\") === \"undefined\"\r\n ? false\r\n : localStorage.getItem(\"scanCameraVisible\") === \"true\"\r\n ? true\r\n : false;\r\n const mapVisibleValue =\r\n localStorage.getItem(\"scanMapVisible\") === \"undefined\"\r\n ? true\r\n : localStorage.getItem(\"scanMapVisible\") === \"true\"\r\n ? true\r\n : false;\r\n const gridVisibleValue =\r\n localStorage.getItem(\"scanGridVisible\") === \"undefined\"\r\n ? true\r\n : localStorage.getItem(\"scanGridVisible\") === \"true\"\r\n ? true\r\n : false;\r\n const debugDataVisibleValue =\r\n localStorage.getItem(\"scanDebugDataVisible\") === \"undefined\"\r\n ? false\r\n : localStorage.getItem(\"scanDebugDataVisible\") === \"true\"\r\n ? true\r\n : false;\r\n const commentsVisibleValue =\r\n localStorage.getItem(\"scanCommentsVisible\") === \"undefined\"\r\n ? true\r\n : localStorage.getItem(\"scanCommentsVisible\") === \"true\"\r\n ? true\r\n : false;\r\n const automationVisibleValue =\r\n localStorage.getItem(\"automationVisibleValue\") === \"undefined\"\r\n ? true\r\n : localStorage.getItem(\"automationVisibleValue\") === \"true\"\r\n ? true\r\n : false;\r\n const focusPeakingOnValue =\r\n localStorage.getItem(\"focusPeakingOnValue\") === \"undefined\"\r\n ? true\r\n : localStorage.getItem(\"focusPeakingOnValue\") === \"true\"\r\n ? true\r\n : false;\r\n const sideBarContentValue = localStorage.getItem(\"scanSideBarContent\");\r\n this.setState({\r\n cameraVisible: cameraVisibleValue,\r\n mapVisible: mapVisibleValue,\r\n gridVisible: gridVisibleValue,\r\n debugDataVisible: debugDataVisibleValue,\r\n commentsVisible: commentsVisibleValue,\r\n sideBarContent: sideBarContentValue,\r\n automationVisible: automationVisibleValue,\r\n focusPeakingOn: focusPeakingOnValue,\r\n });\r\n }\r\n\r\n componentWillUnmount() {\r\n this.exitScanner();\r\n window.removeEventListener(\"beforeunload\", this.exitScanner);\r\n this._isMounted = false;\r\n }\r\n\r\n setLenseType = (lenseType) => {\r\n this.lenseType = lenseType;\r\n console.log(\"this.lenseType\", this.lenseType);\r\n };\r\n\r\n setAdapterType = (adapterType) => {\r\n this.adapterType = adapterType;\r\n console.log(\"this.adapterType\", this.adapterType);\r\n };\r\n\r\n changeScanState = (scanState) => {\r\n if (scanState === \"scan_save\") {\r\n this.changeTab(0);\r\n }\r\n if (this.io) {\r\n this.send({ state: scanState });\r\n this.setMountedState({ slideScanning: scanState === \"scan_start\" });\r\n if (scanState === \"scan_start\") {\r\n this.setState({ commentCount: 5 });\r\n } else if (scanState === \"scan_pause\") {\r\n this.setState({ commentCount: 6 });\r\n } else if (scanState === \"scan_reset\") {\r\n this.setState({ commentCount: 0 });\r\n this.channels = [];\r\n }\r\n }\r\n };\r\n\r\n send = (objectToSend) => {\r\n if (this.io?.connected) {\r\n this.io.emit(\"scan_message\", JSON.stringify(objectToSend));\r\n }\r\n };\r\n\r\n setScanRendererSize = (w, h) => {\r\n this.setState({ w: w });\r\n this.setState({ h: h });\r\n this.send({\r\n state: \"renderSize\",\r\n w: w,\r\n h: h,\r\n });\r\n };\r\n\r\n changeMicroscopeParams = (paramJson) => {\r\n paramJson.state = \"microscope_params\";\r\n this.send(paramJson);\r\n };\r\n\r\n changeImportParams = (param) => {\r\n let data = param[\"data\"];\r\n switch (param[\"action\"]) {\r\n case \"filepath\":\r\n this.setState({ importFilePath: data });\r\n break;\r\n }\r\n };\r\n\r\n moveCenter = (dx, dy) => {\r\n this.send({\r\n state: \"scan_translate\",\r\n dx: dx,\r\n dy: dy,\r\n });\r\n };\r\n\r\n sendMinimapClickPosition = (x, y) => {\r\n this.send({\r\n state: \"minimap_click\",\r\n x: x,\r\n y: y,\r\n });\r\n };\r\n\r\n sendFilePath = (filePath) => {\r\n this.setState({ filePath: filePath });\r\n this.send({\r\n state: \"file_name_change\",\r\n filePath: filePath,\r\n });\r\n };\r\n\r\n changeTab = (tabIdx) => {\r\n this.setMountedState({ activeTab: tabIdx });\r\n };\r\n\r\n exportWIP = () => {\r\n this.send({\r\n state: \"export_wip\",\r\n filePath: \"\",\r\n channels: this.channels,\r\n });\r\n this.channels = [];\r\n };\r\n\r\n importWIP = () => {\r\n this.send({\r\n state: \"import_wip\",\r\n filepath: this.state.importFilePath,\r\n });\r\n };\r\n\r\n createWSI = () => {\r\n const objectToSend = {\r\n state: \"scan_save\",\r\n filePath: this.state.filePath,\r\n channels: this.channels,\r\n lenseType: this.lenseType,\r\n adapterType: this.adapterType,\r\n };\r\n this.send(objectToSend);\r\n this.channels = [];\r\n };\r\n\r\n setWhiteBalanceState = (value) => {\r\n this.send({\r\n state: \"whiteBalance\",\r\n value: value,\r\n });\r\n };\r\n\r\n setVignetteState = (value) => {\r\n this.send({\r\n state: \"vignette\",\r\n value: value,\r\n });\r\n };\r\n\r\n setFeaturePointsState = (checked, numFeaturePoints) => {\r\n this.send({\r\n state: \"featurePoint\",\r\n checked: checked,\r\n numFeaturePoints: numFeaturePoints,\r\n });\r\n };\r\n\r\n toggleCamera = () => {\r\n const value = !this.state.cameraVisible;\r\n this.send({\r\n state: \"toggle\",\r\n target: \"camera\",\r\n value: value,\r\n });\r\n this.setMountedState({ cameraVisible: value });\r\n localStorage.setItem(\"scanCameraVisible\", value.toString());\r\n };\r\n\r\n toggleMinimap = () => {\r\n const value = !this.state.mapVisible;\r\n this.setMountedState({ mapVisible: value });\r\n localStorage.setItem(\"scanMapVisible\", value.toString());\r\n };\r\n\r\n toggleGrid = () => {\r\n const value = !this.state.gridVisible;\r\n this.send({\r\n state: \"toggle\",\r\n target: \"grid\",\r\n value: value,\r\n });\r\n this.setMountedState({ gridVisible: value });\r\n localStorage.setItem(\"scanGridVisible\", value.toString());\r\n };\r\n\r\n toggleDebugData = () => {\r\n const value = !this.state.debugDataVisible;\r\n this.setMountedState({ debugDataVisible: value });\r\n localStorage.setItem(\"scanDebugDataVisible\", value.toString());\r\n };\r\n\r\n toggleComments = () => {\r\n const value = !this.state.commentsVisible;\r\n this.setMountedState({ commentsVisible: value });\r\n localStorage.setItem(\"scanCommentsVisible\", value.toString());\r\n };\r\n\r\n toggleFluorescence = () => {\r\n let value = \"\";\r\n if (this.state.sideBarContent === \"fluorescence\") {\r\n this.setMountedState({ sideBarContent: \"microscopeSettings\" });\r\n value = \"microscopeSettings\";\r\n } else {\r\n this.setMountedState({ sideBarContent: \"fluorescence\" });\r\n value = \"fluorescence\";\r\n }\r\n localStorage.setItem(\"scanSideBarContent\", value);\r\n };\r\n\r\n updateFluorescenceParams = (paramJson) => {\r\n this.send(paramJson);\r\n };\r\n\r\n toggleAutomation = () => {\r\n const value = !this.state.automationVisible;\r\n this.setMountedState({ automationVisible: value });\r\n localStorage.setItem(\"automationVisibleValue\", value.toString());\r\n };\r\n\r\n toggleFocusPeaking = () => {\r\n if (\r\n this.state.cameraVisible == false &&\r\n this.state.focusPeakingOn == false\r\n ) {\r\n this.toggleCamera();\r\n }\r\n const value = !this.state.focusPeakingOn;\r\n this.send({\r\n state: \"toggle\",\r\n target: \"focusPeaking\",\r\n value: value,\r\n });\r\n this.setMountedState({ focusPeakingOn: value });\r\n localStorage.setItem(\"focusPeakingOnValue\", value.toString());\r\n };\r\n\r\n deleteScanArea = (deleteArea) => {\r\n console.log(\"deleteScanArea() called\", deleteArea);\r\n this.send({\r\n state: \"delete_area\",\r\n x1: deleteArea.p1.centeredX,\r\n y1: deleteArea.p1.centeredY,\r\n x2: deleteArea.p2.centeredX,\r\n y2: deleteArea.p2.centeredY,\r\n });\r\n };\r\n\r\n zoomIn = () => {\r\n this.send({\r\n state: \"zoom_in\",\r\n });\r\n };\r\n\r\n zoomOut = () => {\r\n this.send({\r\n state: \"zoom_out\",\r\n });\r\n };\r\n\r\n zoomReset = () => {\r\n this.send({\r\n state: \"zoom_reset\",\r\n });\r\n };\r\n\r\n exitScanner = () => {\r\n this.send({\r\n state: \"exit_scanner\",\r\n });\r\n this.io.disconnect();\r\n };\r\n\r\n useAutomatedMicroscope = (command, data) => {\r\n this.send({\r\n state: \"useAutomatedMicroscope\",\r\n command: command,\r\n data: data,\r\n });\r\n };\r\n\r\n render() {\r\n return (\r\n \r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nScanViewerProvider.propTypes = {\r\n children: PropTypes.element.isRequired,\r\n spinloader: PropTypes.object,\r\n history: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(withSpinloader(ScanViewerProvider));\r\n","import React, { useState, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { makeStyles } from \"@mui/styles\";\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nconst useStyles = makeStyles({\r\n root: {\r\n position: \"relative\",\r\n maxWidth: \"100%\",\r\n maxHeight: \"100%\",\r\n pointerEvents: \"none\",\r\n },\r\n deleteArea: {\r\n position: \"absolute\",\r\n left: 0,\r\n top: 0,\r\n width: 0,\r\n height: 0,\r\n border: \"2px solid red\",\r\n background: \"rgba(0, 0, 0, 0.5)\",\r\n\r\n pointerEvents: \"none\",\r\n },\r\n});\r\n\r\nfunction ScanStream({ streamKey, deleteArea }) {\r\n let deleteAreaStyle = deleteArea\r\n ? {\r\n left: Math.min(deleteArea.p1.x, deleteArea.p2.x),\r\n top: Math.min(deleteArea.p1.y, deleteArea.p2.y),\r\n width: Math.abs(deleteArea.p1.x - deleteArea.p2.x),\r\n height: Math.abs(deleteArea.p1.y - deleteArea.p2.y),\r\n }\r\n : {};\r\n const classes = useStyles();\r\n const [imageSrc, setImageSrc] = useState(\"\");\r\n\r\n useEffect(() => {\r\n const socket = Backend.getScanSocket();\r\n\r\n socket.on(streamKey, (src) => {\r\n // Release memory for the previous image\r\n setImageSrc(\"\");\r\n\r\n // Set the new image source\r\n setImageSrc(\"data:image/jpeg;base64,\" + src);\r\n });\r\n\r\n return () => {\r\n // Clean up the effect\r\n setImageSrc(\"\");\r\n socket.disconnect();\r\n };\r\n }, []);\r\n\r\n return (\r\n
    \r\n \"stream\r\n {deleteArea && (\r\n
    \r\n )}\r\n
    \r\n );\r\n}\r\n\r\nScanStream.propTypes = {\r\n streamKey: PropTypes.string.isRequired,\r\n deleteArea: PropTypes.object,\r\n};\r\n\r\nexport default ScanStream;\r\n","import React, { Component } from \"react\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport PropTypes from \"prop-types\";\r\nimport classNames from \"classnames\";\r\nimport DragIndicator from \"@mui/icons-material/DragIndicator\";\r\nimport Draggable from \"react-draggable\";\r\n\r\nimport { withScanViewerContext } from \"../contexts/ScanViewerContext\";\r\nimport ScanStream from \"./ScanStream\";\r\n\r\nconst styles = {\r\n root: {\r\n position: \"absolute\",\r\n left: 0,\r\n bottom: 0,\r\n height: 170,\r\n width: 220,\r\n border: \"2px solid rgb(85, 85, 85)\",\r\n opacity: 0.8,\r\n textAlign: \"center\",\r\n userSelect: \"none\",\r\n },\r\n streamImg: {\r\n background: \"black\",\r\n maxWidth: \"100%\",\r\n maxHeight: \"100%\",\r\n display: \"inline-block\",\r\n pointerEvents: \"all\",\r\n },\r\n dragIndicator: {\r\n color: \"#fff\",\r\n position: \"absolute\",\r\n top: 5,\r\n right: 5,\r\n cursor: \"grab\",\r\n },\r\n grabbing: {\r\n cursor: \"grabbing\",\r\n },\r\n};\r\n\r\n/**\r\n * class to render minimap and handle interaction\r\n */\r\nclass ScanMinimap extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n grabbing: false,\r\n };\r\n this.minimapRef = React.createRef();\r\n this.x = 0;\r\n this.y = 0;\r\n }\r\n\r\n /**\r\n * by clicking on the minimap move the rectangle and send data to scanViewer\r\n * @param {ActionEvent} e Mouse event\r\n */\r\n onMinimapClick = (e) => {\r\n const parentRect = this.minimapRef.current.getBoundingClientRect();\r\n const x = e.clientX - parentRect.x;\r\n const y = e.clientY - parentRect.y;\r\n this.props.scanViewerContext.sendMinimapClickPosition(x, y);\r\n };\r\n\r\n /**\r\n * Change position of minimap canvas\r\n * @param {AcitonEvent} e Mouse event\r\n * @param {Object} ui object with x,y coordinate of mouse location\r\n */\r\n handleDrag = (e, ui) => {\r\n this.x = ui.x;\r\n this.y = ui.y;\r\n };\r\n\r\n // handle dragging of the minimap region rectangle\r\n mouseDown = (event) => {\r\n this.onMinimapClick(event);\r\n this.dragging = true;\r\n event.preventDefault();\r\n };\r\n\r\n // handle dragging of the minimap region rectangle\r\n mouseMove = (event) => {\r\n if (this.dragging == true) {\r\n this.onMinimapClick(event);\r\n }\r\n event.preventDefault();\r\n };\r\n\r\n mouseUp = (event) => {\r\n this.dragging = false;\r\n event.preventDefault();\r\n };\r\n\r\n render() {\r\n const { grabbing } = this.state;\r\n const { classes } = this.props;\r\n const { mapVisible } = this.props.scanViewerContext;\r\n return (\r\n this.setState({ grabbing: true })}\r\n onDrag={this.handleDrag}\r\n onStop={() => this.setState({ grabbing: false })}\r\n >\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nScanMinimap.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n scanViewerContext: PropTypes.object.isRequired,\r\n src: PropTypes.string,\r\n};\r\n\r\nexport default withScanViewerContext(withStyles(styles)(ScanMinimap));\r\n","import React, { Component } from \"react\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport PropTypes from \"prop-types\";\r\nimport {\r\n Card,\r\n CardActions,\r\n CardContent,\r\n Button,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport { withScanViewerContext } from \"../contexts/ScanViewerContext\";\r\n\r\nconst styles = {\r\n cardStyle: {\r\n position: \"absolute\",\r\n top: 10,\r\n left: 0,\r\n minWidth: 235,\r\n width: 570,\r\n maxWidth: \"calc(100% - 16px)\",\r\n margin: 8,\r\n },\r\n previousButtonStyle: {\r\n position: \"absolute\",\r\n left: 11,\r\n },\r\n nextButtonStyle: {\r\n position: \"absolute\",\r\n left: 91,\r\n },\r\n cardContentStyle: {\r\n padding: 16,\r\n \"&:last-child\": {\r\n paddingBottom: 0,\r\n },\r\n },\r\n cardActionsStyle: {\r\n height: 37,\r\n padding: 0,\r\n \"&:last-child\": {\r\n paddingBottom: 8,\r\n },\r\n },\r\n closeButtonStyle: {\r\n position: \"absolute\",\r\n right: 8,\r\n },\r\n};\r\n\r\nconst cameraSettings = {\r\n heading: \"Camera settings\",\r\n info: [\r\n \"Start by adjusting the camera settings\",\r\n \"by adjusting the picture by using the sliders.\",\r\n \"\",\r\n \"\",\r\n \"\",\r\n \"\",\r\n \"\",\r\n ],\r\n};\r\nconst recordVignette = {\r\n heading: \"Record vignette\",\r\n info: [\r\n \"Click on the fluorescence button, if you want to scan fluorescence. And press NEXT\",\r\n \"Record the vignette to compensate camera errors.\",\r\n \"1. Move the visible picture to a mostly white area.\",\r\n \"2. Click on Record Vignette.\",\r\n \"3. Move the microscope table for about 1 to 2 seconds in different directions.\",\r\n \"4. Click on Stop Recording.\",\r\n \"5. Click on Filter Vignette.\",\r\n ],\r\n};\r\nconst fluorescenceSettings = {\r\n heading: \"Fluorescence\",\r\n info: [\r\n \"1. Add channels by typing in the name and pressing Enter or the + symbol\",\r\n \"2. Select the channel you want to scan and click on Play\",\r\n \"\",\r\n \"\",\r\n \"\",\r\n \"\",\r\n \"\",\r\n ],\r\n};\r\nconst startScan = {\r\n heading: \"Start scan\",\r\n info: [\r\n \"1. Move to the position where you want to start your scan.\",\r\n \"2. Adjust the sharpness.\",\r\n \"3. Press the Play button and start your scan.\",\r\n \"\",\r\n \"\",\r\n \"\",\r\n \"\",\r\n ],\r\n};\r\nconst duringScan = {\r\n heading: \"Scanning\",\r\n info: [\r\n \"If the rectangle is red, the picture is out of focus or the Scanner lost the picture.\",\r\n \"You can correct the sharpness benchmark in the Settings.\",\r\n \"If you finished scanning click on the Pause button.\",\r\n \"If you want to reset the scan, delete the last tiles, click on the Pause button.\",\r\n \"\",\r\n \"\",\r\n \"\",\r\n ],\r\n};\r\nconst pausedScan = {\r\n heading: \"Paused\",\r\n info: [\r\n \"To save the scan click on the Save button at the bottom of the toolbar.\",\r\n \"If you want to remove tiles, right click on the tile.\",\r\n \"If you want to reset the scan, click on the Reset button.\",\r\n \"If you scan fluorescence, you can add, delete and select other channels in the fluorescence tab.\",\r\n \"\",\r\n \"\",\r\n ],\r\n};\r\nconst saveSettings = {\r\n heading: \"Save settings\",\r\n info: [\r\n \"Select the correct lense and adapter settings.\",\r\n \"1. Input the file name, the created slide file should be called\",\r\n \"2. Select the directory where the file should be saved.\",\r\n \"3. Select whether white balancie should be applied, see preview image.\",\r\n \"4. Select the lense magnification you have used for your scan.\",\r\n \"5. Select the right adapter magnification the camera is attached to.\",\r\n \"\",\r\n ],\r\n};\r\n\r\n/**\r\n * class to render comments and handle interaction\r\n */\r\nclass ScanComments extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.texts = [\r\n //if changes happen here, make sure that right indeces are in ScanViewerContext (changeScanSettings)\r\n cameraSettings,\r\n recordVignette,\r\n fluorescenceSettings,\r\n startScan,\r\n duringScan,\r\n pausedScan,\r\n saveSettings,\r\n ];\r\n }\r\n\r\n render() {\r\n const { classes, scanViewerContext } = this.props;\r\n const { commentsVisible } = scanViewerContext;\r\n const count = scanViewerContext.commentCount;\r\n return (\r\n
    \r\n \r\n \r\n \r\n Tips:\r\n \r\n \r\n {this.texts[count].heading}\r\n \r\n \r\n {this.texts[count].info.map((row, idx) => {\r\n return (\r\n
    \r\n {row}\r\n
    \r\n );\r\n })}\r\n
    \r\n
    \r\n \r\n element == duringScan) ||\r\n count ===\r\n this.texts.findIndex((element) => element == pausedScan)\r\n }\r\n size=\"small\"\r\n onClick={() => {\r\n scanViewerContext.setState({ commentCount: count - 1 });\r\n }}\r\n >\r\n Previous\r\n \r\n element == duringScan) ||\r\n count ===\r\n this.texts.findIndex((element) => element == startScan) ||\r\n count ===\r\n this.texts.findIndex((element) => element == pausedScan)\r\n }\r\n size=\"small\"\r\n onClick={() => {\r\n scanViewerContext.setState({ commentCount: count + 1 });\r\n }}\r\n >\r\n Next\r\n \r\n {\r\n scanViewerContext.setState({ commentsVisible: false });\r\n }}\r\n >\r\n Close\r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nScanComments.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n scanViewerContext: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withScanViewerContext(withStyles(styles)(ScanComments));\r\n","import React, { Component } from \"react\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport PropTypes from \"prop-types\";\r\nimport classNames from \"classnames\";\r\nimport DragIndicator from \"@mui/icons-material/DragIndicator\";\r\nimport Draggable from \"react-draggable\";\r\n\r\nconst styles = {\r\n root: {\r\n position: \"absolute\",\r\n left: 0,\r\n top: 20,\r\n width: 280,\r\n border: \"2px solid rgb(85, 85, 85)\",\r\n opacity: 0.8,\r\n textAlign: \"left\",\r\n userSelect: \"none\",\r\n background: \"rgba(255, 255, 255, 0.95)\",\r\n padding: 8,\r\n },\r\n dragIndicator: {\r\n color: \"#000\",\r\n position: \"absolute\",\r\n top: 5,\r\n right: 5,\r\n cursor: \"grab\",\r\n },\r\n grabbing: {\r\n cursor: \"grabbing\",\r\n },\r\n debugDataKey: {\r\n width: 150,\r\n display: \"inline-block\",\r\n },\r\n debugDataValue: {\r\n display: \"inline-block\",\r\n },\r\n};\r\n\r\n/**\r\n * class to render minimap and handle interaction\r\n */\r\nclass ScanDebugData extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n grabbing: false,\r\n };\r\n this.minimapRef = React.createRef();\r\n this.x = 0;\r\n this.y = 0;\r\n }\r\n\r\n /**\r\n * Change position of minimap canvas\r\n * @param {AcitonEvent} e Mouse event\r\n * @param {Object} ui object with x,y coordinate of mouse location\r\n */\r\n handleDrag = (e, ui) => {\r\n this.x = ui.x;\r\n this.y = ui.y;\r\n };\r\n\r\n // handle dragging of the minimap region rectangle\r\n mouseDown = (event) => {\r\n this.onMinimapClick(event);\r\n this.dragging = true;\r\n event.preventDefault();\r\n };\r\n\r\n // handle dragging of the minimap region rectangle\r\n mouseMove = (event) => {\r\n if (this.dragging == true) {\r\n this.onMinimapClick(event);\r\n }\r\n event.preventDefault();\r\n };\r\n\r\n mouseUp = (event) => {\r\n this.dragging = false;\r\n event.preventDefault();\r\n };\r\n\r\n render() {\r\n const { grabbing } = this.state;\r\n const { classes, debugDataList } = this.props;\r\n const mapVisible = true;\r\n return (\r\n this.setState({ grabbing: true })}\r\n onDrag={this.handleDrag}\r\n onStop={() => this.setState({ grabbing: false })}\r\n >\r\n \r\n \r\n {debugDataList.map((data, index) => (\r\n
    \r\n
    {data.name}:
    \r\n
    {data.value}
    \r\n
    \r\n ))}\r\n \r\n\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nScanDebugData.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n scanViewerContext: PropTypes.object,\r\n src: PropTypes.string,\r\n debugDataList: PropTypes.array,\r\n};\r\n\r\nexport default withStyles(styles)(ScanDebugData);\r\n","import React, { useEffect, useState, useRef } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport ScanMinimap from \"./ScanMinimap\";\r\n// import ScanDebug from \"./ScanDebug\";\r\n// import ScanDebug2 from \"./ScanDebug2\";\r\nimport ScanComments from \"./ScanComments\";\r\nimport ScanStream from \"./ScanStream\";\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nimport { withScanViewerContext } from \"../contexts/ScanViewerContext\";\r\nimport ScanDebugData from \"./ScanDebugData\";\r\n\r\nconst styles = () => ({\r\n root: {\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n backgroundColor: \"#D3D3D3\",\r\n display: \"grid\",\r\n overflow: \"hidden\",\r\n gridTemplateRows: \"1fr\",\r\n },\r\n mainStream: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n },\r\n imgStyle: {\r\n maxWidth: \"100%\",\r\n maxHeight: \"100%\",\r\n pointerEvents: \"none\",\r\n },\r\n minimapStream: {\r\n position: \"absolute\",\r\n left: 5,\r\n bottom: 5,\r\n border: \"3px solid white\",\r\n },\r\n progressBar: {\r\n height: 10,\r\n },\r\n debugDataContainer: {\r\n position: \"absolute\",\r\n padding: 10,\r\n margin: 10,\r\n width: 330,\r\n left: 0,\r\n top: 0,\r\n background: \"white\",\r\n },\r\n debugDataKey: {\r\n width: 150,\r\n display: \"inline-block\",\r\n },\r\n debugDataValue: {\r\n display: \"inline-block\",\r\n },\r\n});\r\n\r\nconst ScanRenderer = ({ classes, scanViewerContext }) => {\r\n const { slideScanning, debugDataVisible } = scanViewerContext;\r\n // const [imageHash, setImageHash] = useState(Date.now()); // to reload stream\r\n const [deleteArea, setDeleteArea] = useState(null);\r\n const [mouseState, setMouseState] = useState(\"idle\");\r\n const [debugDataList, setDebugDataList] = useState(null);\r\n\r\n let deleteAreaRef = useRef(null);\r\n const mainStreamRef = useRef();\r\n\r\n useEffect(() => {\r\n window.onbeforeunload = () => {\r\n cleanup();\r\n };\r\n window.addEventListener(\"resize\", () => computeRendererSize());\r\n computeRendererSize();\r\n document\r\n .getElementById(\"scanMainStream\")\r\n .addEventListener(\"mousewheel\", onMouseWheel, true);\r\n\r\n const socket = Backend.getSocket();\r\n socket.on(\"debug_data\", (data) => {\r\n //parse data to json\r\n data = JSON.parse(data);\r\n if (data.data_list) {\r\n setDebugDataList(data.data_list);\r\n }\r\n });\r\n\r\n return () => {\r\n cleanup();\r\n };\r\n }, []);\r\n\r\n const onMouseWheel = (e) => {\r\n if (e.deltaY > 0) {\r\n scanViewerContext.zoomOut();\r\n } else if (e.deltaY < 0) {\r\n scanViewerContext.zoomIn();\r\n }\r\n };\r\n\r\n const computeRendererSize = () => {\r\n if (mainStreamRef.current) {\r\n const w = mainStreamRef.current.clientWidth;\r\n const h = window.innerHeight - 64;\r\n scanViewerContext.setScanRendererSize(w, h);\r\n }\r\n };\r\n\r\n const setDeleteAreaStart = (e) => {\r\n const clickPoint = getGridPoint(e);\r\n deleteAreaRef.current = {\r\n p1: clickPoint,\r\n p2: clickPoint,\r\n };\r\n };\r\n\r\n const setDeleteAreaEnd = (e) => {\r\n if (deleteAreaRef.current === null) return;\r\n deleteAreaRef.current.p2 = getGridPoint(e);\r\n setDeleteArea(deleteAreaRef.current);\r\n };\r\n\r\n const onMouseDown = (e) => {\r\n if (e.button === 0 || e.button === 1) {\r\n setMouseState(\"translate\");\r\n } else if (e.button === 2) {\r\n setMouseState(\"delete\");\r\n setDeleteAreaStart(e);\r\n }\r\n };\r\n\r\n const onMouseUp = (event) => {\r\n if (mouseState === \"delete\") {\r\n setDeleteAreaEnd(event);\r\n scanViewerContext.deleteScanArea(deleteAreaRef.current);\r\n deleteAreaRef.current = null;\r\n setDeleteArea(null);\r\n }\r\n setMouseState(\"idle\");\r\n };\r\n\r\n const onMouseMove = (event) => {\r\n if (mouseState === \"translate\") {\r\n scanViewerContext.moveCenter(event.movementX, event.movementY);\r\n } else if (mouseState === \"delete\") {\r\n setDeleteAreaEnd(event);\r\n }\r\n event.preventDefault(); // prevent image from being marked\r\n };\r\n\r\n const getGridPoint = (e) => {\r\n const parentRect = mainStreamRef.current.getBoundingClientRect();\r\n const x = e.clientX - parentRect.x;\r\n const y = e.clientY - parentRect.y;\r\n const center = [\r\n parseInt(parentRect.width / 2, 10),\r\n parseInt(parentRect.height / 2, 10),\r\n ];\r\n return {\r\n x: x,\r\n y: y,\r\n centeredX: x - center[0],\r\n centeredY: y - center[1],\r\n };\r\n };\r\n\r\n const cleanup = () => {\r\n window.removeEventListener(\"resize\", () => computeRendererSize());\r\n };\r\n\r\n return (\r\n
    \r\n e.preventDefault()}\r\n className={classes.mainStream}\r\n onMouseDown={onMouseDown}\r\n onMouseMove={onMouseMove}\r\n onMouseUp={onMouseUp}\r\n onMouseLeave={onMouseUp}\r\n >\r\n \r\n
    \r\n {slideScanning && }\r\n\r\n {/* \r\n */}\r\n\r\n {debugDataVisible && debugDataList && (\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nScanRenderer.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n scanViewerContext: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withScanViewerContext(withStyles(styles)(ScanRenderer));\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport { FormControl, InputLabel, Select, MenuItem } from \"@mui/material\";\r\n\r\nconst styles = {\r\n root: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr auto\",\r\n },\r\n sliderContainer: {\r\n margin: 0,\r\n width: \"100%\",\r\n marginTop: -16,\r\n },\r\n input: {\r\n width: 55,\r\n },\r\n iconButton: {\r\n height: 40,\r\n marginTop: 16,\r\n },\r\n};\r\n\r\nclass CustomSelector extends React.Component {\r\n render() {\r\n const { params, classes } = this.props;\r\n const selectedValue = params.options.find(\r\n (item) => item.name === params.selectedValue\r\n ).name;\r\n return (\r\n
    \r\n \r\n {params.label}\r\n params.onChange(e.target.value)}\r\n error={params.errorValue && params.errorValue === selectedValue}\r\n inputProps={{\r\n name: params.selectedValue,\r\n id: params.selectedValue,\r\n }}\r\n >\r\n {params.options.map((value) => (\r\n \r\n {value.label}\r\n \r\n ))}\r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nCustomSelector.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n params: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(CustomSelector);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n Button,\r\n Dialog,\r\n DialogContent,\r\n DialogTitle,\r\n List,\r\n ListItem,\r\n ListItemIcon,\r\n ListItemText,\r\n Tooltip,\r\n IconButton,\r\n TextField,\r\n FormControl,\r\n InputLabel,\r\n Select,\r\n MenuItem,\r\n DialogActions,\r\n Grid,\r\n Table,\r\n TableBody,\r\n TableRow,\r\n TableCell,\r\n FormGroup,\r\n FormControlLabel,\r\n Checkbox,\r\n} from \"@mui/material\";\r\n\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { withScanViewerContext } from \"../contexts/ScanViewerContext\";\r\n\r\nimport { Folder, ArrowUpward, Image, Info } from \"@mui/icons-material\";\r\nimport ScanStream from \"./ScanStream\";\r\nimport CustomSelector from \"../../globalComponents/CustomSelector\";\r\nconst styles = (theme) => ({\r\n root: {},\r\n selectFileButton: {\r\n width: \"100%\",\r\n },\r\n dialogTitle: {\r\n paddingBottom: 0,\r\n },\r\n listItem: {\r\n cursor: \"pointer\",\r\n },\r\n fileIcon: {\r\n color: theme.palette.primary.main,\r\n },\r\n upButton: {\r\n marginLeft: -12,\r\n },\r\n contentBox: {\r\n border: \"2px solid rgb(218, 218, 218)\",\r\n height: 500,\r\n overflowY: \"auto\",\r\n },\r\n resultFileRow: {\r\n display: \"grid\",\r\n overflow: \"hidden\",\r\n width: \"100%\",\r\n gridTemplateColumns: \"auto 1fr auto\",\r\n marginTop: 8,\r\n },\r\n folderPathText: {\r\n maxWidth: 200,\r\n lineHeight: \"60px\",\r\n marginRight: 5,\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n direction: \"rtl\",\r\n overflow: \"hidden\",\r\n },\r\n extensionDropDown: {\r\n marginTop: 8,\r\n marginLeft: 5,\r\n },\r\n dialogContent: {\r\n paddingTop: 0,\r\n width: 800,\r\n },\r\n whiteBalanceCheckbox: {\r\n marginLeft: 16,\r\n },\r\n scanPreview: {\r\n width: \"100%\",\r\n },\r\n});\r\n\r\n/**\r\n * dialog window for saving file\r\n */\r\nclass SelectFileDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n currentPath: \"\",\r\n inputIsValid: false,\r\n fileName: \"\",\r\n currentFiles: [],\r\n selectedExtension: props.fileFormats[0],\r\n whiteBalanceState: false,\r\n };\r\n this.updateCurrentFiles(\"\");\r\n this.lenseParams = {\r\n label: \"Lense Type\",\r\n selectedValue: \"select\",\r\n errorValue: \"select\",\r\n options: [\r\n {\r\n name: \"select\",\r\n label: \"Select Lense Type\",\r\n },\r\n {\r\n name: \"4x\",\r\n label: \"4x\",\r\n },\r\n {\r\n name: \"10x\",\r\n label: \"10x\",\r\n },\r\n {\r\n name: \"20x\",\r\n label: \"20x\",\r\n },\r\n {\r\n name: \"40x\",\r\n label: \"40x\",\r\n },\r\n {\r\n name: \"100x\",\r\n label: \"100x\",\r\n },\r\n ],\r\n onChange: (value) => {\r\n this.lenseParams.selectedValue = value;\r\n this.forceUpdate();\r\n },\r\n };\r\n this.adapterParams = {\r\n label: \"Adapter Type\",\r\n selectedValue: \"select\",\r\n errorValue: \"select\",\r\n options: [\r\n {\r\n name: \"select\",\r\n label: \"Select Adapter Type\",\r\n },\r\n {\r\n name: \"0.65x\",\r\n label: \"0.65x\",\r\n },\r\n {\r\n name: \"0.63x\",\r\n label: \"0.63x\",\r\n },\r\n {\r\n name: \"1x\",\r\n label: \"None\",\r\n },\r\n ],\r\n onChange: (value) => {\r\n this.adapterParams.selectedValue = value;\r\n this.forceUpdate();\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * when Dialog window opens: update files and\r\n * check if filename already exists -> update num Time points\r\n * @param {object} prevProps\r\n */\r\n componentDidUpdate = (prevProps) => {\r\n // if Dialog Window opens:\r\n if (!prevProps.open && this.props.open) {\r\n // update Current Files\r\n this.updateCurrentFiles(this.state.currentPath, () => {\r\n // update num time points\r\n const file = this.state.currentFiles.filter((value) => {\r\n return value.path === this.state.fileName + \".hsasld\";\r\n });\r\n if (file.length > 0) {\r\n this.onListItemClick(file[0]);\r\n }\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * update visible files of selected folder\r\n * @param {String} path filepath\r\n * @param {func} callback callback\r\n */\r\n updateCurrentFiles = (path, callback) => {\r\n const { fileFormats } = this.props;\r\n Backend.walkDir(path, true, (result) => {\r\n if (fileFormats) {\r\n result = result.filter((entry) => {\r\n if (entry.type === \"directory\") return true;\r\n let pathParts = entry.path.split(\".\");\r\n let extension = pathParts[pathParts.length - 1].toLowerCase();\r\n if (fileFormats.indexOf(extension) < 0) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n });\r\n }\r\n this.setState({ currentFiles: result, currentPath: path }, callback);\r\n });\r\n };\r\n\r\n /**\r\n * if in directory, update folder, else update textfield when clicking on file\r\n * @param {Object} item\r\n */\r\n onListItemClick = (item) => {\r\n if (item.type === \"directory\") {\r\n this.updateCurrentFiles(item.path);\r\n } else {\r\n this.setState(\r\n {\r\n fileName: item.path\r\n .replace(/^.*[\\\\/]/, \"\")\r\n .split(\".\")\r\n .slice(0, -1)\r\n .join(\".\"),\r\n },\r\n () => {\r\n this.validateFilePath();\r\n }\r\n );\r\n }\r\n };\r\n\r\n /**\r\n * set filename state and validate filepath\r\n * @param {ActionEvent} e User input in textfield\r\n */\r\n onChangeFileName = (e) => {\r\n this.setState({ fileName: e.target.value }, () => {\r\n this.validateFilePath();\r\n });\r\n };\r\n\r\n /**\r\n * assemble [currentpath]/[filename].[extension] if currentpath is available.\r\n * Else: [filename].[extension]\r\n */\r\n validateFilePath = () => {\r\n let fullFilePath = \"\";\r\n if (this.state.currentPath === \"\") {\r\n fullFilePath = this.state.fileName + \".\" + this.state.selectedExtension;\r\n } else {\r\n fullFilePath =\r\n this.state.currentPath +\r\n \"/\" +\r\n this.state.fileName +\r\n \".\" +\r\n this.state.selectedExtension;\r\n }\r\n this.changeFilePath(fullFilePath);\r\n };\r\n\r\n /**\r\n * validate file path and check if file already exists. If so, get timepoints\r\n * @param {String} fullFilePath Filepath inkl currentPath\r\n */\r\n changeFilePath = (fullFilePath) => {\r\n this.props.scanViewerContext.setState({ fullFilePath });\r\n const pathParts = fullFilePath.split(\".\");\r\n const extension = pathParts[pathParts.length - 1].toLowerCase();\r\n const fileName = fullFilePath\r\n .replace(/^.*[\\\\/]/, \"\")\r\n .split(\".\")\r\n .slice(0, -1)\r\n .join(\".\");\r\n const inputIsValid = fileName !== \"\";\r\n this.setState({ inputIsValid });\r\n\r\n if (inputIsValid) {\r\n this.props.scanViewerContext.sendFilePath(fullFilePath);\r\n }\r\n\r\n if (extension === \"hsasld\") {\r\n Backend.getFileMetadata(fullFilePath, (result) => {\r\n if (result.sizeT) {\r\n this.setState({ numTimePoints: result.sizeT });\r\n } else {\r\n this.setState({ numTimePoints: 0 });\r\n }\r\n });\r\n }\r\n };\r\n\r\n handleCancel = () => {\r\n this.props.onClose();\r\n this.setState({ whiteBalanceState: false });\r\n this.props.scanViewerContext.setWhiteBalanceState(false);\r\n };\r\n\r\n handleConfirm = () => {\r\n console.log(\"lenseParams:\", this.lenseParams);\r\n console.log(\"adapterParams:\", this.adapterParams);\r\n\r\n this.props.scanViewerContext.setLenseType(this.lenseParams.selectedValue);\r\n this.props.scanViewerContext.setAdapterType(\r\n this.adapterParams.selectedValue\r\n );\r\n this.props.onConfirm();\r\n this.setState({ whiteBalanceState: false });\r\n };\r\n render() {\r\n const { classes, fileFormats, open } = this.props;\r\n const {\r\n currentFiles,\r\n currentPath,\r\n selectedExtension,\r\n fileName,\r\n numTimePoints,\r\n inputIsValid,\r\n whiteBalanceState,\r\n } = this.state;\r\n const { filePath } = this.props.scanViewerContext;\r\n return (\r\n \r\n this.props.onClose()}>\r\n \r\n Select Result WSI File\r\n \r\n \r\n
    \r\n
    \r\n {\"/\"}\r\n {currentPath}\r\n
    \r\n \r\n \r\n Extension\r\n \r\n this.setState({ fileFormat: e.target.value })\r\n }\r\n >\r\n {fileFormats.map((fileFormat, idx) => {\r\n return (\r\n \r\n .{fileFormat}\r\n \r\n );\r\n })}\r\n \r\n \r\n
    \r\n \r\n \r\n \r\n {currentPath !== \"\" && (\r\n \r\n \r\n \r\n {\r\n this.updateCurrentFiles(\r\n currentPath.substring(\r\n 0,\r\n currentPath.lastIndexOf(\"/\")\r\n )\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {currentFiles.map((item, idx) => {\r\n return (\r\n this.onListItemClick(item)}\r\n >\r\n \r\n {item.type === \"directory\" ? (\r\n \r\n ) : (\r\n \r\n
    \r\n {\r\n \r\n }\r\n \r\n {item.path}\r\n
    \r\n \r\n \r\n }\r\n >\r\n \r\n \r\n )}\r\n
    \r\n \r\n {item.type === \"directory\" ? (\r\n
    \r\n \r\n Full Path:{\" \"}\r\n
    \r\n {item.path}\r\n \r\n ) : (\r\n
    \r\n \r\n File Size:{\" \"}\r\n
    \r\n {item.fileSize}\r\n
    \r\n \r\n Creation Date:{\" \"}\r\n \r\n {item.creationTime}\r\n \r\n )}\r\n \r\n }\r\n >\r\n \r\n {item.path.replace(/^.*[\\\\/]/, \"\")}\r\n \r\n \r\n \r\n );\r\n })}\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n {\r\n const value =\r\n whiteBalanceState === false ? true : false;\r\n this.props.scanViewerContext.setWhiteBalanceState(\r\n value\r\n );\r\n this.setState({ whiteBalanceState: value });\r\n }}\r\n />\r\n }\r\n label=\"White Balance\"\r\n />\r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n \r\n window.openWarningDialog([\r\n \"Set the used lense and adapter magnification.\",\r\n \"These values are important for the scale bar.\",\r\n ])\r\n }\r\n >\r\n \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n File Name:\r\n {this.state.fileName}\r\n \r\n \r\n Full Path:\r\n \r\n {this.state.currentPath +\r\n \"/\" +\r\n this.state.fileName +\r\n \".\" +\r\n this.state.selectedExtension}\r\n \r\n \r\n \r\n File Status:\r\n \r\n {numTimePoints > 0\r\n ? \"WSI File already exists\"\r\n : \"WSI File does not exist\"}\r\n \r\n \r\n {numTimePoints > 0 && (\r\n \r\n Time Points:\r\n {numTimePoints}\r\n \r\n )}\r\n \r\n Action on Save:\r\n \r\n {numTimePoints > 0\r\n ? \"Time Point \" +\r\n (numTimePoints + 1) +\r\n \" will be added\"\r\n : \"WSI File will be created\"}\r\n \r\n \r\n \r\n
    \r\n {numTimePoints > 0 && (\r\n \r\n )}\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n Confirm\r\n \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nSelectFileDialog.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n scanViewerContext: PropTypes.object.isRequired,\r\n fileFormats: PropTypes.array.isRequired,\r\n open: PropTypes.bool.isRequired,\r\n onClose: PropTypes.func.isRequired,\r\n onConfirm: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default withScanViewerContext(withStyles(styles)(SelectFileDialog));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { Tooltip, IconButton, Divider } from \"@mui/material\";\r\nimport {\r\n Save,\r\n Videocam,\r\n Map,\r\n GridOn,\r\n Pause,\r\n PlayArrow,\r\n RestartAlt,\r\n ZoomIn,\r\n ZoomOut,\r\n Comment,\r\n Flare,\r\n VideogameAsset,\r\n BlurOn,\r\n GetApp,\r\n Publish,\r\n} from \"@mui/icons-material\";\r\nimport CustomSvgIcon from \"../../globalComponents/CustomSvgIcon\";\r\nimport { faExchangeAlt } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport BugReportIcon from \"@mui/icons-material/BugReport\";\r\nimport { withScanViewerContext } from \"../contexts/ScanViewerContext\";\r\nimport SelectFileDialog from \"./SelectFileDialog\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n height: \"100%\",\r\n display: \"grid\",\r\n overflow: \"hidden\",\r\n gridTemplateRows: \"1fr auto\",\r\n },\r\n toolbarButton: {\r\n width: 40,\r\n color: theme.palette.primary.inactive,\r\n },\r\n toolbarButtonActive: {\r\n width: 40,\r\n color: theme.palette.primary.main,\r\n },\r\n});\r\n\r\nclass ScanToolBar extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n fileDialogOpen: false,\r\n mapVisible: true,\r\n cameraVisible: true,\r\n gridVisible: false,\r\n debugDataVisible: false,\r\n commentsVisible: false,\r\n automationVisible: false,\r\n };\r\n this.showWIPIcons = false;\r\n window.addEventListener(\"keydown\", this.keyDown);\r\n }\r\n\r\n onSave = () => {\r\n this.setState({ fileDialogOpen: false });\r\n this.props.scanViewerContext.createWSI();\r\n };\r\n\r\n onPlayPause = () => {\r\n if (this.props.scanViewerContext.slideScanning) {\r\n if (!this.props.sidebarVisible) {\r\n this.props.onToggleSidebar();\r\n }\r\n this.props.scanViewerContext.changeScanState(\"scan_pause\");\r\n } else {\r\n if (this.props.sidebarVisible) {\r\n this.props.onToggleSidebar();\r\n }\r\n this.props.scanViewerContext.changeScanState(\"scan_start\");\r\n }\r\n };\r\n\r\n /**\r\n * Handle keyboard shortcuts\r\n * @param {ActionEvent} e Keyboard keys\r\n */\r\n keyDown = (e) => {\r\n let elem = null;\r\n if (e.ctrlKey) {\r\n switch (e.key) {\r\n case \"s\":\r\n elem = document.getElementById(\"saveButtonScanToolBar\");\r\n break;\r\n case \"+\": //ctrl +\r\n elem = document.getElementById(\"zoomInScanToolBar\");\r\n break;\r\n case \"-\": // ctrl -\r\n elem = document.getElementById(\"zoomOutScanToolBar\");\r\n break;\r\n case \"=\": //ctrl digit[0]\r\n elem = document.getElementById(\"zoomResetScanToolBar\");\r\n break;\r\n case \"0\": //ctrl numpad[0]\r\n elem = document.getElementById(\"zoomResetScanToolBar\");\r\n break;\r\n }\r\n } else {\r\n return;\r\n }\r\n if (elem !== null) {\r\n elem.click();\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n render() {\r\n const { classes, onToggleSidebar } = this.props;\r\n const {\r\n mapVisible,\r\n cameraVisible,\r\n gridVisible,\r\n debugDataVisible,\r\n commentsVisible,\r\n automationVisible,\r\n focusPeakingOn,\r\n changeScanState,\r\n slideScanning,\r\n sideBarContent,\r\n } = this.props.scanViewerContext;\r\n const context = this.props.scanViewerContext;\r\n return (\r\n
    \r\n
    \r\n {slideScanning ? (\r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.showWIPIcons &&\r\n ((\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n (\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n (\r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n changeScanState(\"scan_reset\")}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.showWIPIcons &&\r\n ((),\r\n (\r\n \r\n \r\n window.openResponseDialog(\r\n \"Do you really want to import a project? The current project will be deleted.\",\r\n (response) => {\r\n if (response) {\r\n this.props.scanViewerContext.importWIP();\r\n }\r\n }\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n ),\r\n (\r\n \r\n this.props.scanViewerContext.exportWIP()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n this.setState({ fileDialogOpen: true })}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n this.setState({ fileDialogOpen: false })}\r\n fileFormats={[\"hsasld\"]}\r\n />\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nScanToolBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n scanViewerContext: PropTypes.object.isRequired,\r\n onToggleSidebar: PropTypes.func.isRequired,\r\n sidebarVisible: PropTypes.bool,\r\n};\r\n\r\nexport default withScanViewerContext(withStyles(styles)(ScanToolBar));\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n Grid,\r\n FormControl,\r\n TextField,\r\n Typography,\r\n Slider,\r\n IconButton,\r\n} from \"@mui/material\";\r\n\r\nimport InfoIcon from \"@mui/icons-material/Info\";\r\n\r\nconst styles = {\r\n root: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr auto\",\r\n },\r\n sliderContainer: {\r\n margin: 0,\r\n width: \"100%\",\r\n marginTop: -16,\r\n },\r\n input: {\r\n width: 55,\r\n },\r\n iconButton: {\r\n height: 40,\r\n marginTop: 16,\r\n },\r\n};\r\n\r\nclass CustomSlider extends React.Component {\r\n render() {\r\n const { params, classes } = this.props;\r\n return (\r\n
    \r\n
    \r\n \r\n {params.label} \r\n \r\n \r\n {\r\n params.onSliderChange(e.target.value);\r\n }}\r\n onDoubleClick={params.onDoubleClick}\r\n onChangeCommitted={params.onSliderchangeComitted}\r\n />\r\n \r\n \r\n {\r\n params.onChange(parseFloat(e.target.value));\r\n }}\r\n type=\"number\"\r\n inputProps={{\r\n step: params.step,\r\n min: this.props.min,\r\n max: this.props.max,\r\n role: \"numberInput\",\r\n }}\r\n />\r\n \r\n \r\n \r\n
    \r\n window.openWarningDialog(params.info)}\r\n >\r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nCustomSlider.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n params: PropTypes.object.isRequired,\r\n min: PropTypes.number,\r\n max: PropTypes.number,\r\n};\r\n\r\nexport default withStyles(styles)(CustomSlider);\r\n","import React, { Component } from \"react\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { withScanViewerContext } from \"../contexts/ScanViewerContext\";\r\nimport CustomSlider from \"../../globalComponents/CustomSlider\";\r\nimport {\r\n Button,\r\n Checkbox,\r\n FormControlLabel,\r\n FormGroup,\r\n IconButton,\r\n Tooltip,\r\n TextField,\r\n} from \"@mui/material\";\r\n\r\nimport {\r\n PlayArrow,\r\n Stop,\r\n Info,\r\n Home,\r\n ArrowLeft,\r\n ArrowRight,\r\n ArrowDropUp,\r\n ArrowDropDown,\r\n ArrowUpward,\r\n LockOpen,\r\n Link,\r\n ArrowDownward,\r\n CenterFocusStrong,\r\n HdrAuto,\r\n LinkOff,\r\n} from \"@mui/icons-material\";\r\n\r\nconst styles = {\r\n root: {\r\n padding: 20,\r\n height: \"100%\",\r\n overflowY: \"auto\",\r\n },\r\n OpticsRow: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr auto auto\",\r\n width: \"100%\",\r\n marginTop: 10,\r\n },\r\n OpticsSelector: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr 1fr\",\r\n width: \"100%\",\r\n },\r\n vignetteRow: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr auto auto\",\r\n width: \"100%\",\r\n marginTop: 10,\r\n marginBottom: 10,\r\n },\r\n textButton: {\r\n lineHeight: \"30px\",\r\n },\r\n checkboxLabel: {\r\n margin: \"0px !important\",\r\n },\r\n textfieldNumber: {\r\n width: \"90px\",\r\n },\r\n featurePointRow: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr auto auto\",\r\n width: \"100%\",\r\n marginTop: 15,\r\n },\r\n infoButton: {\r\n height: 40,\r\n marginTop: 16,\r\n },\r\n automationButton: {\r\n height: 40,\r\n width: 40,\r\n margin: 10,\r\n },\r\n automationButtonContainer: {\r\n width: 60,\r\n display: \"inline-block\",\r\n },\r\n automationTextfieldContainer: {\r\n width: 155,\r\n display: \"inline-block\",\r\n },\r\n automationLongTextfieldContainer: {\r\n width: 360,\r\n display: \"inline-block\",\r\n },\r\n automationTextfield: {\r\n height: 40,\r\n margin: 15,\r\n },\r\n};\r\n\r\n/**\r\n * Class to render Camera Settings, read them and send them to backend\r\n */\r\nclass ScanMicroscopeSettings extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n activeTab: 0,\r\n vignetteState: \"\",\r\n // checkedFeaturePoint: false, // for DEBUG\r\n // numFeaturePoints: 3, // for DEBUG\r\n };\r\n\r\n // sets the colors (RGB) to the chosen white balance\r\n this.lightSourceParams = {\r\n label: \"Light Source\",\r\n selectedValue: \"Daylight6500K\",\r\n info: [\r\n \"Sets the light source preset.\",\r\n \"The colors in the image will be corrected so that they are appropriate for the selected light source.\",\r\n ],\r\n options: [\r\n {\r\n name: \"Off\",\r\n label: \"Off\",\r\n },\r\n {\r\n name: \"Daylight5000K\",\r\n label: \"Daylight (5000 Kelvin)\",\r\n },\r\n {\r\n name: \"Daylight6500K\",\r\n label: \"Daylight (6500 Kelvin)\",\r\n },\r\n {\r\n name: \"Tungsten2800K\",\r\n label: \"Tungsten (2800 Kelvin)\",\r\n },\r\n ],\r\n onChange: (value) => {\r\n this.lightSourceParams.selectedValue = value;\r\n if (value === \"Off\") {\r\n this.sliderParams.red.value = 1.0;\r\n this.sliderParams.green.value = 1.0;\r\n this.sliderParams.blue.value = 1.0;\r\n } else if (value === \"Daylight5000K\") {\r\n this.sliderParams.red.value = 1.57349;\r\n this.sliderParams.green.value = 1.0;\r\n this.sliderParams.blue.value = 2.2749;\r\n } else if (value === \"Daylight6500K\") {\r\n this.sliderParams.red.value = 1.82056;\r\n this.sliderParams.green.value = 1.0;\r\n this.sliderParams.blue.value = 1.94189;\r\n } else if (value === \"Tungsten2800K\") {\r\n this.sliderParams.red.value = 1.06372;\r\n this.sliderParams.green.value = 1.0;\r\n this.sliderParams.blue.value = 4.17261;\r\n }\r\n this.forceUpdate();\r\n this.sendParams();\r\n },\r\n };\r\n\r\n this.sliderParams = {\r\n frameRate: {\r\n type: \"Slider\",\r\n label: \"Frame Rate\",\r\n info: [\r\n \"Acquisition frame rate of the camera in frames per second.\",\r\n \"Double click to reset value to default.\",\r\n ],\r\n value: 30,\r\n minKey: \"cameraMinFramerate\",\r\n maxKey: \"cameraMaxFramerate\",\r\n step: 1,\r\n standardValue: 30,\r\n },\r\n exposureTime: {\r\n type: \"Slider\",\r\n label: \"Exposure Time\",\r\n info: [\r\n \"Value of the shutter speed the camera uses.\",\r\n \"The higher the shutter speed, the darker the image \",\r\n ],\r\n value: 250,\r\n minKey: \"cameraMinExposureTime\",\r\n maxKey: \"cameraMaxExposureTime\",\r\n standardValue: 250,\r\n },\r\n gain: {\r\n type: \"Slider\",\r\n label: \"Gain\",\r\n info: [\r\n \"Value of the currently selected gain in dB.\",\r\n \"Double click to reset value to default.\",\r\n ],\r\n value: 0.1,\r\n minKey: \"cameraMinGain\",\r\n maxKey: \"cameraMaxGain\",\r\n step: 0.1,\r\n standardValue: 0.1,\r\n },\r\n gamma: {\r\n type: \"Slider\",\r\n label: \"Gamma\",\r\n info: [\r\n \"Gamma correction to be applied.\",\r\n \"Gamma correction allows you to optimize the brightness of acquired images for display on a monitor.\",\r\n \"Double click to reset value to default.\",\r\n ],\r\n value: 1.0,\r\n minKey: \"cameraMinGamma\",\r\n maxKey: \"cameraMaxGamma\",\r\n step: 0.01,\r\n standardValue: 1.0,\r\n },\r\n blackValue: {\r\n type: \"Slider\",\r\n label: \"Black Value\",\r\n info: [\r\n \"Black level value to be applied to the currently selected sensor tap.\",\r\n \"Double click to reset value to default.\",\r\n ],\r\n value: 0,\r\n minKey: \"cameraMinBlackValue\",\r\n maxKey: \"cameraMaxBlackValue\",\r\n step: 0.1,\r\n standardValue: 0,\r\n },\r\n red: {\r\n type: \"Slider\",\r\n label: \"Red\",\r\n info: [\r\n \"Sets the light source preset.\",\r\n \"The colors in the image will be corrected so that they are appropriate for the red light source.\",\r\n \"Double click to reset value to default.\",\r\n ],\r\n value: 1.82,\r\n minKey: \"cameraColorMin\",\r\n maxKey: \"cameraColorMax\",\r\n step: 0.01,\r\n },\r\n green: {\r\n type: \"Slider\",\r\n label: \"Green\",\r\n info: [\r\n \"Sets the light source preset.\",\r\n \"The colors in the image will be corrected so that they are appropriate for the green light source.\",\r\n \"Double click to reset value to default.\",\r\n ],\r\n value: 1.0,\r\n minKey: \"cameraColorMin\",\r\n maxKey: \"cameraColorMax\",\r\n step: 0.01,\r\n },\r\n blue: {\r\n type: \"Slider\",\r\n label: \"Blue\",\r\n info: [\r\n \"Sets the light source preset.\",\r\n \"The colors in the image will be corrected so that they are appropriate for the blue light source.\",\r\n \"Double click to reset value to default.\",\r\n ],\r\n value: 1.94,\r\n minKey: \"cameraColorMin\",\r\n maxKey: \"cameraColorMax\",\r\n step: 0.01,\r\n },\r\n };\r\n\r\n this.sendParams();\r\n window.addEventListener(\"keydown\", this.keyDown);\r\n }\r\n /**\r\n * create json with important values and send to backend\r\n */\r\n sendParams() {\r\n let paramJson = {\r\n lightSource: this.lightSourceParams.selectedValue,\r\n pixelSizeCamera: this.props.scanViewerContext.pixelSizeCamera,\r\n };\r\n for (const [key, value] of Object.entries(this.sliderParams)) {\r\n paramJson[key] = value.value;\r\n }\r\n // Backend.configureMicroscopeCamera(paramJson);\r\n this.props.scanViewerContext.changeMicroscopeParams(paramJson);\r\n }\r\n\r\n /**\r\n * Handle keyboard shortcuts\r\n * @param {ActionEvent} e Keyboard keys\r\n */\r\n keyDown = (e) => {\r\n let elem = null;\r\n if (e.ctrlKey) {\r\n switch (e.key) {\r\n case \"ArrowLeft\": // ctrl + left\r\n elem = document.getElementById(\"xMinusButton\");\r\n break;\r\n case \"ArrowRight\": // ctrl + right\r\n elem = document.getElementById(\"xPlusButton\");\r\n break;\r\n case \"ArrowUp\": // ctrl + up\r\n elem = document.getElementById(\"yPlusButton\");\r\n break;\r\n case \"ArrowDown\": // ctrl + down\r\n elem = document.getElementById(\"yMinusButton\");\r\n break;\r\n case \"PageUp\": // ctrl + page up\r\n elem = document.getElementById(\"zPlusButton\");\r\n break;\r\n case \"PageDown\": // ctrl + page down\r\n elem = document.getElementById(\"zMinusButton\");\r\n break;\r\n case \"a\": // ctrl + a\r\n elem = document.getElementById(\"autoFocusButton\");\r\n break;\r\n default:\r\n break;\r\n }\r\n } else {\r\n return;\r\n }\r\n\r\n if (elem !== null) {\r\n elem.click();\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n render() {\r\n const { classes, scanViewerContext } = this.props;\r\n const {\r\n vignetteState,\r\n // checkedFeaturePoint, numFeaturePoints // for DEBUG\r\n } = this.state;\r\n const { automationVisible, automatedMicroscopeStatus } =\r\n this.props.scanViewerContext;\r\n return (\r\n
    \r\n

    Settings

    \r\n {/* not in use at the moment */}\r\n {/* */}\r\n {Object.entries(this.sliderParams).map(([key, value], idx) => {\r\n let params = value;\r\n params.onChange = (value) => {\r\n this.sliderParams[key].value = value;\r\n this.forceUpdate();\r\n if (\r\n value >= scanViewerContext[params.minKey] &&\r\n value <= scanViewerContext[params.maxKey]\r\n ) {\r\n params.error = false;\r\n this.sendParams();\r\n } else {\r\n params.error = true;\r\n }\r\n };\r\n params.onSliderChange = (value) => {\r\n this.sliderParams[key].value = value;\r\n this.forceUpdate();\r\n this.sendParams();\r\n };\r\n params.onDoubleClick = () => {\r\n if (this.sliderParams[key].label === \"Red\") {\r\n switch (this.lightSourceParams.selectedValue) {\r\n case \"Off\":\r\n this.sliderParams[key].value = 1.0;\r\n break;\r\n case \"Daylight5000K\":\r\n this.sliderParams[key].value = 1.57349;\r\n break;\r\n case \"Daylight6500K\":\r\n this.sliderParams[key].value = 1.82056;\r\n break;\r\n case \"Tungsten2800K\":\r\n this.sliderParams[key].value = 1.06372;\r\n break;\r\n }\r\n } else if (this.sliderParams[key].label === \"Green\") {\r\n this.sliderParams[key].value = 1.0;\r\n } else if (this.sliderParams[key].label === \"Blue\") {\r\n switch (this.lightSourceParams.selectedValue) {\r\n case \"Off\":\r\n this.sliderParams[key].value = 1.0;\r\n break;\r\n case \"Daylight5000K\":\r\n this.sliderParams[key].value = 2.2749;\r\n break;\r\n case \"Daylight6500K\":\r\n this.sliderParams[key].value = 1.94189;\r\n break;\r\n case \"Tungsten2800K\":\r\n this.sliderParams[key].value = 4.17261;\r\n break;\r\n }\r\n } else {\r\n this.sliderParams[key].value =\r\n this.sliderParams[key].standardValue;\r\n }\r\n this.forceUpdate();\r\n this.sendParams();\r\n };\r\n return (\r\n \r\n );\r\n })}\r\n\r\n
    \r\n \r\n {\r\n const value =\r\n vignetteState === \"ready\" ? \"filtering\" : \"ready\";\r\n scanViewerContext.setVignetteState(value);\r\n this.setState({ vignetteState: value });\r\n }}\r\n />\r\n }\r\n label=\"Filter Vignette\"\r\n />\r\n \r\n {\r\n const value =\r\n vignetteState === \"\" || vignetteState === \"ready\"\r\n ? \"recording\"\r\n : \"ready\";\r\n scanViewerContext.setVignetteState(value);\r\n this.setState({ vignetteState: value });\r\n }}\r\n >\r\n {vignetteState === \"recording\" ? : }{\" \"}\r\n {vignetteState === \"recording\"\r\n ? \"Stop Recording\"\r\n : \"Record Vignette\"}\r\n \r\n \r\n window.openWarningDialog([\r\n \"To filter the vignette, a vignette must be recorded first:\",\r\n \"1. Navigate to a mostly white position.\",\r\n \"2. Record Vignette.\",\r\n \"3. Navigate around until shown vignette is not changing anymore.\",\r\n \"4. Stop Recording.\",\r\n \"5. Filter Vignette is now possible.\",\r\n ])\r\n }\r\n >\r\n \r\n \r\n
    \r\n
    \r\n {\r\n if (e.key === \"Enter\") {\r\n this.props.scanViewerContext.changeImportParams({\r\n action: \"filepath\",\r\n data: e.target.value,\r\n });\r\n }\r\n }}\r\n label=\"import Filepath\"\r\n defaultValue=\"C:\\Users\\philgrun\\Documents\\HSA-Web\\Source\\HSA-KIT\\modules\\hsa\\2022-11-30T17-27-40_wip-project.npy\"\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n />\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n {\r\n scanViewerContext.useAutomatedMicroscope(\"z_up\");\r\n }}\r\n >\r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n {\r\n scanViewerContext.useAutomatedMicroscope(\"autoscan\");\r\n }}\r\n >\r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n {\r\n scanViewerContext.useAutomatedMicroscope(\"unlock\");\r\n }}\r\n >\r\n \r\n \r\n \r\n
    \r\n \r\n \r\n {\r\n scanViewerContext.useAutomatedMicroscope(\"x_left\");\r\n }}\r\n >\r\n \r\n \r\n \r\n
    \r\n \r\n \r\n {\r\n scanViewerContext.useAutomatedMicroscope(\"y_down\");\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n scanViewerContext.useAutomatedMicroscope(\"x_right\");\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n
    \r\n \r\n {\r\n scanViewerContext.useAutomatedMicroscope(\"z_down\");\r\n }}\r\n >\r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n {\r\n scanViewerContext.useAutomatedMicroscope(\"autofocus\");\r\n }}\r\n >\r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n {\r\n scanViewerContext.useAutomatedMicroscope(\"home\");\r\n }}\r\n >\r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n {\r\n scanViewerContext.useAutomatedMicroscope(\"calibration\");\r\n }}\r\n >\r\n Calibration\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n {\r\n if (e.key === \"Enter\") {\r\n scanViewerContext.useAutomatedMicroscope(\r\n \"change_x_stepsize\",\r\n {\r\n stepsize: e.target.value,\r\n }\r\n );\r\n }\r\n }}\r\n className={classes.automationTextfield}\r\n label=\"X Stepsize [mm]\"\r\n type=\"number\"\r\n inputProps={{\r\n step: \"0.1\",\r\n }}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n defaultValue=\"0.4\"\r\n />\r\n
    \r\n
    \r\n {\r\n if (e.key === \"Enter\") {\r\n scanViewerContext.useAutomatedMicroscope(\r\n \"change_x_velocity\",\r\n {\r\n velocity: e.target.value,\r\n }\r\n );\r\n }\r\n }}\r\n className={classes.automationTextfield}\r\n label=\"X Velocity [mm/min]\"\r\n type=\"number\"\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n defaultValue=\"10\"\r\n />\r\n
    \r\n
    \r\n
    \r\n {\r\n if (e.key === \"Enter\") {\r\n scanViewerContext.useAutomatedMicroscope(\r\n \"change_y_stepsize\",\r\n {\r\n stepsize: e.target.value,\r\n }\r\n );\r\n }\r\n }}\r\n className={classes.automationTextfield}\r\n label=\"Y Stepsize [mm]\"\r\n type=\"number\"\r\n inputProps={{\r\n step: \"0.1\",\r\n }}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n defaultValue=\"0.5\"\r\n />\r\n
    \r\n
    \r\n {\r\n if (e.key === \"Enter\") {\r\n scanViewerContext.useAutomatedMicroscope(\r\n \"change_y_velocity\",\r\n {\r\n velocity: e.target.value,\r\n }\r\n );\r\n }\r\n }}\r\n className={classes.automationTextfield}\r\n label=\"Y Velocity [mm/min]\"\r\n type=\"number\"\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n defaultValue=\"10\"\r\n />\r\n
    \r\n
    \r\n {\r\n if (e.key === \"Enter\") {\r\n scanViewerContext.useAutomatedMicroscope(\r\n \"change_z_stepsize\",\r\n {\r\n stepsize: e.target.value,\r\n }\r\n );\r\n }\r\n }}\r\n className={classes.automationTextfield}\r\n label=\"Z Stepsize [mm]\"\r\n type=\"number\"\r\n inputProps={{\r\n step: \"0.05\",\r\n }}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n defaultValue=\"0.1\"\r\n />\r\n
    \r\n
    \r\n {\r\n if (e.key === \"Enter\") {\r\n scanViewerContext.useAutomatedMicroscope(\r\n \"change_z_velocity\",\r\n {\r\n velocity: e.target.value,\r\n }\r\n );\r\n }\r\n }}\r\n className={classes.automationTextfield}\r\n label=\"Z Velocity [mm/min]\"\r\n type=\"number\"\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n defaultValue=\"20\"\r\n />\r\n
    \r\n
    \r\n
    \r\n {\r\n if (e.key === \"Enter\") {\r\n scanViewerContext.useAutomatedMicroscope(\"execute_gcode\", {\r\n gcode: e.target.value,\r\n });\r\n }\r\n }}\r\n label=\"G-code\"\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n />\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n {\r\n scanViewerContext.useAutomatedMicroscope(\"show_config\");\r\n }}\r\n >\r\n show Configuration\r\n \r\n
    \r\n \r\n {/* for DEBUG use: */}\r\n {/*
    \r\n \r\n {\r\n const checked = e.target.checked;\r\n this.setState({ checkedFeaturePoint: checked });\r\n scanViewerContext.setFeaturePointsState(\r\n checked,\r\n numFeaturePoints\r\n );\r\n }}\r\n />\r\n }\r\n label=\"Show Feature Points\"\r\n />\r\n \r\n\r\n {\r\n const numberFeaturePoints = e.target.value;\r\n this.setState({ numFeaturePoints: numberFeaturePoints });\r\n scanViewerContext.setFeaturePointsState(\r\n checkedFeaturePoint,\r\n numberFeaturePoints\r\n );\r\n }}\r\n />\r\n\r\n \r\n window.openWarningDialog([\r\n \"Activates feature points and sets the number of feature points to be displayed.\",\r\n \"Feature points are points, that the computer uses for orientation. The Scanner needs them to compare the position of different images.\",\r\n \"This function is mainly for development use.\",\r\n ])\r\n }\r\n >\r\n \r\n \r\n
    */}\r\n \r\n );\r\n }\r\n}\r\n\r\nScanMicroscopeSettings.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n scanViewerContext: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withScanViewerContext(\r\n withStyles(styles)(ScanMicroscopeSettings)\r\n);\r\n","import React, { Component } from \"react\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport PropTypes from \"prop-types\";\r\nimport {\r\n Typography,\r\n TextField,\r\n Tooltip,\r\n IconButton,\r\n List,\r\n ListItem,\r\n ListItemButton,\r\n Button,\r\n} from \"@mui/material\";\r\nimport { withScanViewerContext } from \"../contexts/ScanViewerContext\";\r\nimport SketchColorPicker from \"../../common/components/SketchColorPicker\";\r\nimport { Add, Delete } from \"@mui/icons-material\";\r\nimport { getRandomColor } from \"../../common/utils/RandomColorGenerator\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n padding: 20,\r\n height: \"100%\",\r\n overflowY: \"auto\",\r\n },\r\n ChannelTextField: {\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n paddingLeft: 0,\r\n width: 345,\r\n },\r\n buttonSelected: {\r\n width: \"100%\",\r\n color: \"black\",\r\n background: theme.palette.selected.main,\r\n borderRadius: 0,\r\n },\r\n buttonUnselected: {\r\n width: \"100%\",\r\n color: \"black\",\r\n borderRadius: 0,\r\n background: \"white\",\r\n },\r\n listItemSelected: {\r\n background: theme.palette.selected.main,\r\n },\r\n listItemUnselected: {\r\n background: \"white\",\r\n },\r\n});\r\n\r\n/**\r\n * class to render fluorescence card and handle interaction\r\n */\r\nclass ScanFluorescence extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n channelName: \"\",\r\n selectedIndex: -1,\r\n };\r\n }\r\n addChannel = () => {\r\n const newItem = {\r\n label: this.state.channelName,\r\n color: getRandomColor(),\r\n };\r\n this.props.scanViewerContext.channels.push(newItem);\r\n this.emitParams(\"add_fl_channel\");\r\n this.setState({ channelName: \"\" });\r\n this.setState({\r\n selectedIndex: this.props.scanViewerContext.channels.length - 1,\r\n });\r\n };\r\n\r\n selectChannel = (index) => {\r\n this.setState({ selectedIndex: index }, () => {\r\n this.emitParams(\"change_fl_channel\");\r\n });\r\n };\r\n\r\n deleteChannel = (channel, index) => {\r\n window.openResponseDialog(\r\n \"Do you really want to delete \" + channel.label + \"?\",\r\n (response) => {\r\n if (response) {\r\n this.props.scanViewerContext.channels.splice(index, 1);\r\n this.emitParams(\"delete_fl_channel\");\r\n this.setState({\r\n selectedIndex: this.props.scanViewerContext.channels.length - 1,\r\n });\r\n }\r\n }\r\n );\r\n };\r\n\r\n emitParams = (state) => {\r\n let paramJson = {\r\n state: state,\r\n selectedChannel: this.state.selectedIndex,\r\n channels: this.props.scanViewerContext.channels,\r\n };\r\n this.props.scanViewerContext.updateFluorescenceParams(\r\n \"scan_message\",\r\n paramJson\r\n );\r\n };\r\n\r\n render() {\r\n const { selectedIndex, channelName } = this.state;\r\n const { classes } = this.props;\r\n\r\n return (\r\n
    \r\n

    Scans

    \r\n this.selectChannel(-1)}\r\n >\r\n Brightfield\r\n \r\n \r\n {\"Channels (\" + this.props.scanViewerContext.channels.length + \"):\"}\r\n \r\n \r\n {this.props.scanViewerContext.channels.map((channel, index) => (\r\n this.selectChannel(index)}\r\n >\r\n {\r\n channel.label = e.target.value;\r\n this.forceUpdate();\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" && e.target.value !== \"\") {\r\n channel.label = e.target.value;\r\n this.forceUpdate();\r\n }\r\n }}\r\n />\r\n {\r\n channel.color = color;\r\n this.forceUpdate();\r\n }}\r\n />\r\n \r\n {\r\n this.deleteChannel(channel, index);\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n {\r\n this.setState({ channelName: e.target.value });\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" && channelName !== \"\") {\r\n this.addChannel();\r\n }\r\n }}\r\n />\r\n \r\n \r\n {\r\n this.addChannel();\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nScanFluorescence.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n scanViewerContext: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withScanViewerContext(withStyles(styles)(ScanFluorescence));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport ScanRenderer from \"./components/ScanRenderer\";\r\nimport ScanToolBar from \"./components/ScanToolBar\";\r\nimport ScanMicroscopeSettings from \"./components/ScanMicroscopeSettings\";\r\nimport { withScanViewerContext } from \"./contexts/ScanViewerContext\";\r\nimport ScanFluorescence from \"./components/ScanFluorescence\";\r\n\r\nconst styles = {\r\n root: {\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n display: \"grid\",\r\n },\r\n rendererContainer: {\r\n overflow: \"hidden\",\r\n background: \"d3d3d3\",\r\n },\r\n toolBarContainer: {\r\n background: \"white\",\r\n borderLeft: \"5px solid #ebebeb\",\r\n borderRight: \"5px solid #ebebeb\",\r\n },\r\n sideBarContainer: {\r\n background: \"#fffff\",\r\n overflow: \"hidden\",\r\n },\r\n};\r\n\r\nclass ScanViewer extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n sidebarVisible: true,\r\n };\r\n }\r\n\r\n onToggleSidebar = () => {\r\n if (this.state.sidebarVisible) {\r\n const w = this.props.scanViewerContext.w + 436;\r\n const h = this.props.scanViewerContext.h;\r\n this.props.scanViewerContext.setScanRendererSize(w, h);\r\n } else {\r\n const w = this.props.scanViewerContext.w - 436;\r\n const h = this.props.scanViewerContext.h;\r\n this.props.scanViewerContext.setScanRendererSize(w, h);\r\n }\r\n this.setState({ sidebarVisible: !this.state.sidebarVisible });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { streamReady, sideBarContent } = this.props.scanViewerContext;\r\n return (\r\n \r\n
    \r\n {streamReady && }\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {sideBarContent === \"fluorescence\" ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
    \r\n \r\n );\r\n }\r\n}\r\n\r\nScanViewer.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n scanViewerContext: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withScanViewerContext(withStyles(styles)(ScanViewer));\r\n","import React, { Component } from \"react\";\r\n\r\nimport withStyles from '@mui/styles/withStyles';\r\n\r\nimport {\r\n Grid,\r\n Card,\r\n CardContent,\r\n Checkbox,\r\n FormControl,\r\n FormControlLabel\r\n} from \"@mui/material\";\r\n\r\n//import { Role } from \"../common/utils\";\r\n//import { authenticationService } from \"../common/services\";\r\n\r\n//const tabUrls = [\"/settings/\", \"/settings/admin\"];\r\n\r\nconst styles = {\r\n root: {\r\n background: \"#EEEEEE\"\r\n },\r\n paper: {\r\n padding: 20,\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\"\r\n }\r\n};\r\n\r\nclass SettingsPage extends Component {\r\n state = {};\r\n\r\n render() {\r\n //const { classes } = this.props;\r\n //const currentUser = authenticationService.currentUserValue;\r\n return (\r\n \r\n \r\n \r\n

    Preferences

    \r\n \r\n {\r\n {\r\n console.log(\"e\", e)\r\n //onChange(!includeBaseROI);\r\n //this.setState({ includeBaseROI: !includeBaseROI });\r\n }}\r\n />\r\n }\r\n label=\"Update on slider move\"\r\n />\r\n }\r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(SettingsPage);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport * as echarts from \"echarts\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = () => ({\r\n root: {\r\n position: \"relative\",\r\n height: \"100%\",\r\n },\r\n topContainer: {\r\n height: \"100%\",\r\n width: \"100%\",\r\n overflow: \"hidden\",\r\n },\r\n toolBarBorder: {\r\n position: \"absolute\",\r\n top: 0,\r\n right: 40,\r\n height: \"100%\",\r\n width: 3,\r\n background: \"#EBEBEB\",\r\n },\r\n});\r\n\r\nclass ELineChart extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n chartRef: React.createRef(),\r\n };\r\n }\r\n\r\n updateDimensions = () => {\r\n if (this.props.chart) this.props.chart.resize();\r\n };\r\n\r\n componentDidMount = async () => {\r\n await this.initChart();\r\n switch (this.props.mainChartDataShown) {\r\n case \"raw_spectra\":\r\n this.props.showRawSpectra();\r\n break;\r\n\r\n case \"analysis_results\":\r\n this.props.showAnalysisResults();\r\n break;\r\n\r\n default:\r\n this.props.requestData(\"init\");\r\n }\r\n };\r\n\r\n initChart = async () => {\r\n let chartDom = this.state.chartRef.current;\r\n //prevent context menu (right click) => so delete can be used\r\n chartDom.addEventListener(\"contextmenu\", (event) => {\r\n event.preventDefault();\r\n });\r\n\r\n let myChart = echarts.init(chartDom, { renderer: \"svg\" });\r\n this.props.setChart(myChart);\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n return (\r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nELineChart.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n project: PropTypes.object.isRequired,\r\n chart: PropTypes.object,\r\n setChart: PropTypes.func,\r\n onSave: PropTypes.func,\r\n requestData: PropTypes.func,\r\n showRawSpectra: PropTypes.func,\r\n showAnalysisResults: PropTypes.func,\r\n mainChartDataShown: PropTypes.string,\r\n};\r\n\r\nexport default withStyles(styles)(ELineChart);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nconst SpectraViewerContext = React.createContext();\r\n\r\n/**\r\n * Allow other classes to use the SpectraViewer context with withSpectraViewer().\r\n * @param {*} Component The class using the context.\r\n * @returns The Component wrapped inside the SpectraViewer.\r\n */\r\nexport const withSpectraViewer = (Component) => {\r\n const WrappedComponent = (props) => (\r\n \r\n {(context) => }\r\n \r\n );\r\n\r\n WrappedComponent.displayName = `withSpectraViewer(${\r\n Component.displayName || Component.name || \"Component\"\r\n })`;\r\n\r\n return WrappedComponent;\r\n};\r\n\r\nclass SpectraViewerProvider extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n selectedSpectrum: 0,\r\n areas: [],\r\n operationSets: [[[\"scores\", 1]]],\r\n maxScores: 0,\r\n useSavedCalcs: true,\r\n rawSpectra: [], // Permanently save spectra in frontend once loaded\r\n rawSpectraLoaded: false,\r\n pcas: [], // Permanently save pcas in frontend once loaded, only cahnge on update\r\n pcaOrder: \"asc\", // The order in which the PCAs are sorted\r\n selectedPca: null,\r\n selectedPcaId: null,\r\n focusedPca: {\r\n info: null,\r\n scores: null,\r\n approximations: null,\r\n }, // The pca which is currently being focused in analysis. Includes spectra both before and after trimming and preprocessing.\r\n analysisResults: [], // Permanently save results of analysis with focussed pca, only change on update\r\n analysisResultsLoaded: false,\r\n selectedPcaScore: 0,\r\n selectedProcessedSpectrum: 0,\r\n currentlyShownData: null,\r\n ratedSpectra: [],\r\n models: [], // AI Models provided\r\n selectedModelIdx: null,\r\n selectedModelName: null,\r\n passingCriteria: [],\r\n passingCriteria_idx: null,\r\n passingCriteria_min: 0.99,\r\n passingCriteria_max: 1.0,\r\n spectraPredictionSettings: [], // Format: {substance: \"\", concentration: 0.0}\r\n };\r\n }\r\n\r\n /**\r\n * Allows to set state of context from outside the class\r\n * @param {*} object Stateobject to be set.\r\n * @param {function} callback Function to be called after state has been updated.\r\n */\r\n setContextState = (object, callback) => {\r\n this.setState(object, callback);\r\n };\r\n\r\n /**\r\n * Saves all areas to state. Also assigns each sub-area a reference.\r\n * @param {array} areas\r\n */\r\n updateAreas = (areas) => {\r\n this.setState({\r\n areas: areas.map((area) => {\r\n area.refs = [React.createRef(), React.createRef()];\r\n return area;\r\n }),\r\n });\r\n };\r\n\r\n /**\r\n * Toggles the status of useSavedCalcs on or off.\r\n */\r\n toggleSavedCalcs = () => {\r\n this.setState({\r\n useSavedCalcs: !this.state.useSavedCalcs,\r\n });\r\n };\r\n\r\n /**\r\n * Ensure that not too many scores can be chosen.\r\n * Should no spectra be visible, all are used for pca.\r\n */\r\n setMaxScores = () => {\r\n let availableSamples = 0;\r\n availableSamples = this.state.rawSpectra.filter((el) => el.checked).length;\r\n this.setState({\r\n maxScores:\r\n availableSamples === 0\r\n ? this.state.rawSpectra.length - 1\r\n : availableSamples - 1,\r\n });\r\n };\r\n\r\n /**\r\n * Sort the pcas by a value from the result in ascending or descending order\r\n * @param {string} valueToSortBy The key used to sort the pcas\r\n * @param {string} order \"asc\" or \"desc\" for ascending or descending order respectively\r\n */\r\n sortPCAs = (valueToSortBy, order = \"desc\") => {\r\n // Sort PCAs in descending order by R² value\r\n let temp_pcas = this.state.pcas.sort((a, b) => {\r\n return b.result[valueToSortBy] - a.result[valueToSortBy];\r\n });\r\n // Invert array if decending order is wanted\r\n if (order === \"asc\") {\r\n temp_pcas.reverse();\r\n }\r\n // replace with sorted PCAs\r\n this.setState({ pcas: temp_pcas, pcaOrder: order });\r\n };\r\n\r\n render() {\r\n return (\r\n \r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nSpectraViewerProvider.propTypes = {\r\n children: PropTypes.element,\r\n};\r\n\r\nexport default SpectraViewerProvider;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n Paper,\r\n Input,\r\n Button,\r\n} from \"@mui/material\";\r\n\r\nimport { withSpectraViewer } from \"../contexts/SpectraViewerContext\";\r\n\r\nconst styles = () => ({\r\n root: {\r\n position: \"relative\",\r\n height: \"100%\",\r\n overflow: \"auto\",\r\n },\r\n paperContainer: {\r\n margin: 10,\r\n },\r\n table: {},\r\n applyButton: {\r\n margin: 10,\r\n width: \"calc(100% - 20px)\",\r\n },\r\n});\r\n\r\nclass FileParamForm extends Component {\r\n /**\r\n * Updates the input fields of the file parameters.\r\n * @param {int} index Position of spectrum in array of spectra.\r\n * @param {string} paramName Key of value to edit.\r\n * @param {string} value New value.\r\n */\r\n onFileParamChange = (index, paramName, value) => {\r\n let fileParams = this.props.fileParams.map((fileParam, idx) => {\r\n if (idx === index) {\r\n fileParam = JSON.parse(JSON.stringify(fileParam));\r\n fileParam[paramName] = value\r\n .trim()\r\n .split(\";\")\r\n .map((e) => e.trim());\r\n return fileParam;\r\n } else {\r\n return fileParam;\r\n }\r\n });\r\n\r\n this.props.spectraViewer.setState({ useSavedCalcs: false });\r\n this.props.onUpdateFileParams(fileParams);\r\n };\r\n\r\n /**\r\n * Validate input data, save project and continue to main window.\r\n * @returns {} Stay in screen on unvalidated input data\r\n */\r\n onApply = () => {\r\n let error = false;\r\n let fileParams = this.props.fileParams.map((fp) => {\r\n // Clean up input\r\n if (typeof fp.subName === \"string\") {\r\n fp.subName = fp.subName\r\n .trim()\r\n .split(\";\")\r\n .map((e) => e.trim());\r\n }\r\n if (typeof fp.subName === \"string\") {\r\n fp.concentration = fp.concentration\r\n .trim()\r\n .split(\";\")\r\n .map((e) => e.trim());\r\n }\r\n\r\n // Remove empty entries\r\n fp.subName = fp.subName.filter((e) => e === 0 || e);\r\n fp.concentration = fp.concentration.filter((e) => e === 0 || e);\r\n\r\n // Each substance must have exactly one concentration\r\n if (fp.subName.length !== fp.concentration.length) {\r\n error = true;\r\n window.showErrorSnackbar(\r\n fp.fileName + \": Mismatch of substance and concentration count.\"\r\n );\r\n // Highlight errorneous entries\r\n fp.error = error;\r\n return fp;\r\n }\r\n\r\n // All spectra must have an assigend name\r\n if (!fp.subName || fp.subName.length === 0) {\r\n error = true;\r\n // Highlight errorneous entries\r\n fp.error = error;\r\n window.showErrorSnackbar(fp.fileName + \": missing substance name.\");\r\n return fp;\r\n }\r\n\r\n // All spectra must have an assigend concentration for each substance\r\n let concentrationsOk = true;\r\n fp.concentration = fp.concentration.map((concentr) => {\r\n // Allow for 0.0 and 0,0 input values\r\n let tmp = isNaN(concentr)\r\n ? parseFloat(concentr.replace(\",\", \".\").replace(\" \", \"\"))\r\n : concentr;\r\n\r\n if (isNaN(tmp)) {\r\n concentrationsOk = false;\r\n window.showErrorSnackbar(\r\n `${fp.fileName}: Invalid input value, concentration \"${concentr}\" must be a number between 0 and 100.`\r\n );\r\n return concentr;\r\n }\r\n concentr = tmp;\r\n\r\n if (concentr < 0 || concentr > 100) {\r\n concentrationsOk = false;\r\n window.showErrorSnackbar(\r\n `${fp.fileName}: Concentration must be between 0 and 100 %, was ${concentr}.`\r\n );\r\n return concentr;\r\n }\r\n\r\n return concentr;\r\n });\r\n if (!concentrationsOk) {\r\n error = true;\r\n fp.error = error;\r\n return fp;\r\n }\r\n // Passed all tests\r\n fp.error = false;\r\n return fp;\r\n });\r\n\r\n this.props.onUpdateFileParams(fileParams);\r\n if (error) {\r\n return;\r\n }\r\n\r\n this.props.save();\r\n this.props.setInitialized(true);\r\n };\r\n\r\n render() {\r\n const { classes, fileParams } = this.props;\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n File\r\n \r\n Substance Name
    Multiple semicolon-separated entries\r\n possible\r\n
    \r\n \r\n Concentration (%)\r\n
    Multiple semicolon-separated entries possible\r\n
    \r\n
    \r\n
    \r\n \r\n {fileParams.map((fileParam, idx) => (\r\n \r\n \r\n {fileParam.fileName}\r\n \r\n \r\n {\r\n this.onFileParamChange(\r\n idx,\r\n \"subName\",\r\n e.target.value\r\n );\r\n }}\r\n error={fileParam.error}\r\n />\r\n \r\n \r\n {\r\n this.onFileParamChange(\r\n idx,\r\n \"concentration\",\r\n e.target.value\r\n );\r\n }}\r\n error={fileParam.error}\r\n />\r\n \r\n \r\n ))}\r\n \r\n
    \r\n this.onApply()}\r\n >\r\n Apply\r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nFileParamForm.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n project: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n fileParams: PropTypes.array,\r\n onUpdateFileParams: PropTypes.func,\r\n setInitialized: PropTypes.func,\r\n save: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(withStyles(styles)(FileParamForm));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n// define the component's styling\r\nconst styles = () => ({\r\n resizesBorder: {\r\n height: \"100%\",\r\n width: \"100%\",\r\n cursor: \"row-resize\",\r\n },\r\n //invisible over whole screen, so mouse is always tracked\r\n overlayBorder: {\r\n position: \"fixed\",\r\n top: 0,\r\n left: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n zIndex: 9999999,\r\n cursor: \"row-resize\",\r\n },\r\n});\r\n\r\nclass LocalHorizontalResizeBorder extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n resizeMode: false,\r\n borderHeight: 8,\r\n newHeight: props.targetHeight,\r\n };\r\n }\r\n\r\n handleMouseDown = (e) => {\r\n this.setState({ resizeMode: true, lastPageY: e.pageY, initPageY: e.pageY });\r\n };\r\n handleMouseMove = (e) => {\r\n e.preventDefault();\r\n if (this.state.resizeMode) {\r\n let deltaY = this.state.lastPageY - e.pageY;\r\n deltaY = !this.props.bottomBorder ? deltaY : -deltaY;\r\n let newHeight = this.state.newHeight + deltaY;\r\n if (newHeight > this.props.min) {\r\n this.props.resizeHeight(newHeight);\r\n } else if (this.props.targetHeight > this.props.min) {\r\n this.props.resizeHeight(this.props.min);\r\n }\r\n this.setState({ lastPageY: e.pageY, newHeight });\r\n }\r\n };\r\n handleMouseEnd = () => {\r\n if (this.state.resizeMode) {\r\n this.setState({ resizeMode: false });\r\n this.props.resizeHeight(this.props.targetHeight);\r\n }\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n return (\r\n this.handleMouseDown(e)}\r\n onMouseMove={(e) => this.handleMouseMove(e)}\r\n onMouseLeave={(e) => this.handleMouseEnd(e)}\r\n onMouseUp={(e) => this.handleMouseEnd(e)}\r\n >
    \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nLocalHorizontalResizeBorder.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n min: PropTypes.number,\r\n targetHeight: PropTypes.number,\r\n bottomBorder: PropTypes.bool,\r\n resizeHeight: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(LocalHorizontalResizeBorder);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from '@mui/styles/withStyles';\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport TableSortLabel from \"@mui/material/TableSortLabel\";\r\n\r\nfunction descendingComparator(a, b, orderBy) {\r\n if (b[orderBy] < a[orderBy]) {\r\n return -1;\r\n }\r\n if (b[orderBy] > a[orderBy]) {\r\n return 1;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction getComparator(order, orderBy) {\r\n return order === \"desc\"\r\n ? (a, b) => descendingComparator(a, b, orderBy)\r\n : (a, b) => -descendingComparator(a, b, orderBy);\r\n}\r\n\r\nfunction stableSort(array, comparator) {\r\n const stabilizedThis = array.map((el, index) => [el, index]);\r\n stabilizedThis.sort((a, b) => {\r\n const order = comparator(a[0], b[0]);\r\n if (order !== 0) return order;\r\n return a[1] - b[1];\r\n });\r\n return stabilizedThis.map((el) => el[0]);\r\n}\r\n\r\nfunction EnhancedTableHead(props) {\r\n const { classes, order, orderBy, onRequestSort, headCells } = props;\r\n const createSortHandler = (property) => (event) => {\r\n onRequestSort(event, property);\r\n };\r\n\r\n return (\r\n \r\n \r\n {headCells.map((headCell) => (\r\n \r\n \r\n {headCell.label}\r\n {orderBy === headCell.id ? (\r\n \r\n {order === \"desc\" ? \"sorted descending\" : \"sorted ascending\"}\r\n \r\n ) : null}\r\n \r\n \r\n ))}\r\n \r\n \r\n );\r\n}\r\n\r\nEnhancedTableHead.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n onRequestSort: PropTypes.func.isRequired,\r\n order: PropTypes.oneOf([\"asc\", \"desc\"]).isRequired,\r\n orderBy: PropTypes.string.isRequired,\r\n rowCount: PropTypes.number.isRequired,\r\n headCells: PropTypes.array.isRequired,\r\n};\r\n\r\nconst styles = {\r\n root: {\r\n width: \"100%\",\r\n },\r\n table: {\r\n minWidth: 750,\r\n \"& *\": {\r\n color: \"white !important\",\r\n background: \"#333333\",\r\n },\r\n },\r\n visuallyHidden: {\r\n border: 0,\r\n clip: \"rect(0 0 0 0)\",\r\n height: 1,\r\n margin: -1,\r\n overflow: \"hidden\",\r\n padding: 0,\r\n position: \"absolute\",\r\n top: 20,\r\n width: 1,\r\n },\r\n};\r\n\r\nclass CustomResultTable extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n order: \"asc\",\r\n orderBy: \"calories\",\r\n };\r\n }\r\n render() {\r\n const { classes, rows, headCells } = this.props;\r\n const { order, orderBy } = this.state;\r\n\r\n const handleRequestSort = (event, property) => {\r\n const isAsc = orderBy === property && order === \"asc\";\r\n this.setState({\r\n order: isAsc ? \"desc\" : \"asc\",\r\n orderBy: property,\r\n });\r\n };\r\n\r\n const dense = false;\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n {stableSort(rows, getComparator(order, orderBy)).map(\r\n (row, index) => {\r\n return (\r\n \r\n {headCells.map((headCell, i) => {\r\n return (\r\n {row[headCell.id]}\r\n );\r\n })}\r\n \r\n );\r\n }\r\n )}\r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nCustomResultTable.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n headCells: PropTypes.array,\r\n rows: PropTypes.array,\r\n tableHeight: PropTypes.number,\r\n};\r\n\r\nexport default withStyles(styles)(CustomResultTable);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport CustomResultTable from \"./CustomResultTable\";\r\n\r\nimport { withSpectraViewer } from \"../contexts/SpectraViewerContext\";\r\n\r\nconst styles = {\r\n root: {\r\n height: \"100%\",\r\n width: \"100%\",\r\n overflow: \"hidden\",\r\n backgroundColor: \"#333333\",\r\n color: \"#ffffff\",\r\n },\r\n mainContent: {\r\n overflow: \"hidden\",\r\n height: \"100%\",\r\n },\r\n};\r\n\r\nconst headCells = [\r\n { id: \"rmse\", numeric: true, disablePadding: true, label: \"RMSECV\" },\r\n { id: \"r2\", numeric: true, disablePadding: false, label: \"R²\" },\r\n { id: \"scores\", numeric: true, disablePadding: false, label: \"Scores\" },\r\n { id: \"areas\", numeric: false, disablePadding: false, label: \"Areas\" },\r\n { id: \"settings\", numeric: false, disablePadding: false, label: \"Settings\" },\r\n];\r\n\r\nclass SpectraBottomTableResults extends Component {\r\n render() {\r\n const { classes } = this.props;\r\n const rows = this.props.spectraViewer.pcas.map((result) => {\r\n return {\r\n r2: result.result.r2,\r\n rmse: result.result.rmse,\r\n scores: result.used_scores,\r\n areas: result.areas.toString(),\r\n settings: result.preprocessing.toString(),\r\n };\r\n });\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nSpectraBottomTableResults.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n tableHeight: PropTypes.number,\r\n setParentState: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(withStyles(styles)(SpectraBottomTableResults));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { List, ListItem, ListItemText, Typography } from \"@mui/material\";\r\n\r\nimport { withSpectraViewer } from \"../contexts/SpectraViewerContext\";\r\n\r\nconst styles = {\r\n root: {\r\n height: \"100%\",\r\n overflow: \"auto\",\r\n opacity: 0.8,\r\n backgroundColor: \"#000000\",\r\n color: \"#ffffff\",\r\n },\r\n mainContent: {\r\n overflow: \"auto\",\r\n },\r\n};\r\n\r\nclass SpectraLeftTableResults extends Component {\r\n render() {\r\n const { classes } = this.props;\r\n const { rawSpectra } = this.props.spectraViewer;\r\n return (\r\n
    \r\n
    \r\n {rawSpectra && rawSpectra.length > 0 && (\r\n \r\n \r\n \r\n Value\r\n \r\n {Object.keys(\r\n rawSpectra[this.props.spectraViewer.selectedSpectrum].meta\r\n .measurement\r\n ).map((key, idx) => {\r\n const value =\r\n rawSpectra[this.props.spectraViewer.selectedSpectrum].meta\r\n .measurement[key];\r\n return (\r\n \r\n \r\n \r\n {value.toString()}\r\n \r\n \r\n );\r\n })}\r\n \r\n )}\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nSpectraLeftTableResults.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n leftTableWidth: PropTypes.number,\r\n setParentState: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(withStyles(styles)(SpectraLeftTableResults));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport * as echarts from \"echarts\";\r\nimport ecStat from \"echarts-stat\";\r\nimport { Select, MenuItem, InputLabel, FormControl } from \"@mui/material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { withSpectraViewer } from \"../contexts/SpectraViewerContext\";\r\n\r\nconst styles = () => ({\r\n root: {\r\n position: \"relative\",\r\n height: \"100%\",\r\n width: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"auto 1fr\",\r\n },\r\n chartObject: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n },\r\n margin: {\r\n textAlign: \"center\",\r\n margin: \"10px 30px 0\",\r\n },\r\n});\r\n\r\nclass ResultChart extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.chartRef = React.createRef();\r\n this.state = {\r\n chartType: props.initChartType,\r\n };\r\n }\r\n\r\n updateDimensions = () => {\r\n if (this.resultChart) this.resultChart.resize();\r\n };\r\n\r\n componentDidUpdate = () => {\r\n this.updateDimensions();\r\n };\r\n\r\n componentDidMount = () => {\r\n this.initChart();\r\n };\r\n\r\n initChart = () => {\r\n let chartDom = this.chartRef.current;\r\n echarts.registerTransform(ecStat.transform.regression);\r\n\r\n this.resultChart = echarts.init(chartDom);\r\n\r\n this.setOption(this.state.chartType);\r\n };\r\n\r\n setOption = (chartType) => {\r\n if (this.resultChart) {\r\n this.resultChart.clear();\r\n }\r\n // ToDo\r\n // // Group PCAs with same areas and preprocessing\r\n // let pcas = this.props.spectrumViewer.pcas;\r\n // let pcaGroups = [];\r\n\r\n // pcas.forEach((pca) => {\r\n // // Find all similar pcas\r\n // let pcaGroup = pcas.filter((element) => {\r\n // if (\r\n // element.areas === pca.areas &&\r\n // element.preprocessing === pca.preprocessing\r\n // ) {\r\n // return element;\r\n // }\r\n // });\r\n // pcaGroups.push(pcaGroup);\r\n // // Remove from overall array\r\n // pcaGroup.forEach((pcaGroupElement) =>\r\n // pcas.splice(\r\n // pcas.findIndex((pcaElement) => pcaElement.id === pcaGroupElement.id),\r\n // 1\r\n // )\r\n // );\r\n // });\r\n\r\n // console.log(\"PcaGroups\", pcaGroups);\r\n\r\n let data = [];\r\n let xAxisLabel = \"Actual\";\r\n let yAxisLabel = \"Prediction\";\r\n\r\n switch (chartType) {\r\n case \"rmsecvScore\":\r\n xAxisLabel = \"Score\";\r\n yAxisLabel = \"RMSECV\";\r\n data = this.props.spectraViewer.pcas.map((item) => {\r\n return {\r\n value: [item.used_scores, item.result.rmse],\r\n };\r\n });\r\n break;\r\n\r\n case \"r2Score\":\r\n xAxisLabel = \"Score\";\r\n yAxisLabel = \"R²\";\r\n data = this.props.spectraViewer.pcas.map((item) => {\r\n return {\r\n value: [item.used_scores, item.result.r2],\r\n };\r\n });\r\n break;\r\n\r\n case \"predTrue\":\r\n data = this.props.spectraViewer.rawSpectra.map((serie, idx) => {\r\n return {\r\n itemStyle: {\r\n color: this.props.datasets[idx].color,\r\n },\r\n value: [\r\n serie.meta.substances[0].concentration,\r\n serie.meta.substances[0].predictedConcentration,\r\n ],\r\n };\r\n });\r\n break;\r\n\r\n case \"diffTrue\":\r\n data = this.props.spectraViewer.rawSpectra.map((series, idx) => {\r\n return {\r\n name: this.props.datasets[idx].name,\r\n itemStyle: {\r\n color: this.props.datasets[idx].color,\r\n },\r\n value: [\r\n series.meta.substances[0].concentration,\r\n series.meta.substances[0].concentration -\r\n series.meta.substances[0].predictedConcentration,\r\n ],\r\n };\r\n });\r\n break;\r\n\r\n default:\r\n // Empty Chart\r\n xAxisLabel = \"\";\r\n yAxisLabel = \"\";\r\n data = [];\r\n }\r\n\r\n let series = [\r\n {\r\n name: \"Markers\",\r\n type: \"line\",\r\n data: data,\r\n },\r\n ];\r\n let labels = [\"Markers\"];\r\n\r\n // Reference lines in certain charts\r\n if (chartType === \"predTrue\" || chartType === \"diffTrue\") {\r\n labels.push(\"Line\");\r\n let lineData = this.props.spectraViewer.rawSpectra.map((serie) => {\r\n if (chartType === \"diffTrue\") {\r\n return [serie.meta.substances[0].concentration, 0];\r\n } else {\r\n return [\r\n serie.meta.substances[0].concentration,\r\n serie.meta.substances[0].concentration,\r\n ];\r\n }\r\n });\r\n lineData.unshift([0, 0]);\r\n series.push({\r\n name: \"Line\",\r\n type: \"line\",\r\n data: lineData,\r\n });\r\n }\r\n\r\n let option = {\r\n legend: {\r\n data: labels,\r\n left: \"center\",\r\n bottom: 10,\r\n },\r\n grid: {\r\n top: 40,\r\n left: 60,\r\n right: 80,\r\n },\r\n tooltip: {\r\n trigger: \"axis\",\r\n axisPointer: {\r\n type: \"cross\",\r\n },\r\n },\r\n xAxis: {\r\n name: xAxisLabel,\r\n },\r\n yAxis: {\r\n type: \"value\",\r\n name: yAxisLabel,\r\n min: \"dataMin\",\r\n max: \"dataMax\",\r\n axisLabel: {\r\n show: true,\r\n interval: 1e-3,\r\n showMinLabel: false,\r\n showMaxLabel: false,\r\n },\r\n },\r\n series: series,\r\n };\r\n\r\n option && this.resultChart.setOption(option);\r\n };\r\n\r\n handleChange = (e) => {\r\n this.setState({ chartType: e.target.value }, () => {\r\n this.setOption(this.state.chartType);\r\n });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n return (\r\n
    \r\n \r\n Chart Type\r\n this.handleChange(e)}\r\n //input={}\r\n >\r\n {this.props.chartTypes.map((chartType, idx) => {\r\n return (\r\n \r\n {chartType.name}\r\n \r\n );\r\n })}\r\n \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nResultChart.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n initChartType: PropTypes.string,\r\n chartTypes: PropTypes.array,\r\n datasets: PropTypes.array,\r\n};\r\n\r\nexport default withSpectraViewer(withStyles(styles)(ResultChart));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { Fab, Grid, IconButton } from \"@mui/material\";\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport RemoveCircleIcon from \"@mui/icons-material/RemoveCircle\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport ResultChart from \"./ResultChart\";\r\nimport { withSpectraViewer } from \"../contexts/SpectraViewerContext\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n position: \"relative\",\r\n height: \"100%\",\r\n overflow: \"hidden\",\r\n },\r\n fab: {\r\n position: \"absolute\",\r\n bottom: theme.spacing(2),\r\n right: theme.spacing(2),\r\n },\r\n excludeButton: {\r\n position: \"absolute\",\r\n top: 0,\r\n right: 0,\r\n color: \"#666\",\r\n },\r\n});\r\n\r\nconst CHARTTYPES = [\r\n { value: \"rmsecvScore\", name: \"RMSECV vs Score\" },\r\n { value: \"r2Score\", name: \"R² vs Score\" },\r\n { value: \"predTrue\", name: \"Prediction vs. True value\" },\r\n { value: \"diffTrue\", name: \"Difference vs. True value\" },\r\n];\r\n\r\nclass SpectraResultCharts extends Component {\r\n componentDidMount = () => {\r\n this.props.setCurrentlyShownData(\"result_chart\");\r\n // Should none be present so far, preselect the first graph\r\n if (this.props.resultChartTypes.length === 0) {\r\n this.handleClickOpen();\r\n }\r\n };\r\n\r\n handleClickOpen = () => {\r\n let value = CHARTTYPES[this.props.resultChartTypes.length % 4].value;\r\n this.props.onUpdateResultChartTypes([\r\n ...this.props.resultChartTypes,\r\n value,\r\n ]);\r\n };\r\n\r\n onRemoveChart = (index) => {\r\n this.props.onUpdateResultChartTypes(\r\n this.props.resultChartTypes.filter((elem, idx) => idx !== index)\r\n );\r\n };\r\n\r\n render() {\r\n const { classes, resultChartTypes } = this.props;\r\n return (\r\n
    \r\n \r\n {resultChartTypes.map((initChartType, index) => (\r\n 2\r\n ? 4\r\n : resultChartTypes.length > 1\r\n ? 6\r\n : 12\r\n }\r\n style={{\r\n border: resultChartTypes.length > 1 && \"1px solid\",\r\n position: \"relative\",\r\n background: \"#EBEBEB\",\r\n height:\r\n resultChartTypes.length === 4\r\n ? \"50%\"\r\n : resultChartTypes.length > 6\r\n ? \"33.333333333%\"\r\n : resultChartTypes.length > 3\r\n ? \"50%\"\r\n : \"100%\",\r\n }}\r\n >\r\n \r\n this.onRemoveChart(index)}\r\n >\r\n \r\n \r\n \r\n ))}\r\n \r\n\r\n {resultChartTypes.length < 9 && (\r\n \r\n \r\n \r\n )}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nSpectraResultCharts.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n resultChartTypes: PropTypes.array,\r\n datasets: PropTypes.array,\r\n onUpdateResultChartTypes: PropTypes.func,\r\n setCurrentlyShownData: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(withStyles(styles)(SpectraResultCharts));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport {\r\n Button,\r\n IconButton,\r\n ListItem,\r\n ListItemText,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableRow,\r\n Tooltip,\r\n} from \"@mui/material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport {\r\n Cancel,\r\n CheckCircle,\r\n ErrorOutline,\r\n HourglassEmpty,\r\n Timeline,\r\n Visibility,\r\n VisibilityOff,\r\n} from \"@mui/icons-material\";\r\n\r\nimport SketchColorPicker from \"../../../common/components/SketchColorPicker\";\r\nimport { withSpectraViewer } from \"../../contexts/SpectraViewerContext\";\r\n\r\nconst TooltipTable = withStyles({\r\n tooltip: {\r\n background: \"#FFFFFF\",\r\n border: \"#EBEBEB solid 2px\",\r\n },\r\n})(Tooltip);\r\n\r\nclass SpectraTab extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n componentDidMount() {\r\n this.props.showRawSpectra();\r\n }\r\n\r\n /**\r\n * Determines which icon to diplay as a status of analysis results.\r\n * @param {Object} spectrum A spectrum for which analysis results can be displayed.\r\n * @returns {Tooltip} Renderable mui icon with mouseover information.\r\n */\r\n statusIcon = (spectrum) => {\r\n // In case of temporary spectra, that will not be analyzed\r\n if (spectrum.isTemporary) {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n // In case of not defined or empty rated spectra\r\n if (\r\n !this.props.spectraViewer.ratedSpectra ||\r\n this.props.spectraViewer.ratedSpectra.length === 0\r\n ) {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n // Attempt to find spectrum in array of rated spectra\r\n let spectrumRating = undefined;\r\n let spectrumWithinTolerances = undefined;\r\n let error = false;\r\n this.props.spectraViewer.ratedSpectra.some((ratedSpectrum) => {\r\n if (ratedSpectrum.id === spectrum.id) {\r\n spectrumWithinTolerances = ratedSpectrum.pass;\r\n spectrumRating = ratedSpectrum.rating;\r\n error = \"Error\" in ratedSpectrum.rating;\r\n return true;\r\n }\r\n return false;\r\n });\r\n // Define when a Spectrum is allowed to pass\r\n if (spectrumRating) {\r\n return (\r\n \r\n \r\n \r\n {Object.entries(spectrumRating).map(([key, value]) => {\r\n return (\r\n \r\n {key}\r\n \r\n {typeof value === \"number\"\r\n ? value < 0.01 && value !== 0\r\n ? value.toExponential(3)\r\n : Number(value).toFixed(6)\r\n : value}\r\n \r\n \r\n );\r\n })}\r\n \r\n
    \r\n \r\n }\r\n >\r\n {error ? (\r\n \r\n ) : spectrumWithinTolerances ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n };\r\n\r\n render() {\r\n const { spectraViewer } = this.props;\r\n return (\r\n \r\n {this.props.initialized && (\r\n this.props.toggleAll()}\r\n >\r\n Toggle visibility of all spectra\r\n \r\n )}\r\n {this.props.initialized &&\r\n // List all spectra\r\n this.props.datasets.map((item, idx) => {\r\n return (\r\n \r\n {/* Spectra */}\r\n \r\n this.props.spectraViewer.setState({ selectedSpectrum: idx })\r\n }\r\n >\r\n \r\n \r\n {item.name}\r\n
    \r\n }\r\n />\r\n \r\n {this.props.project.type === \"ESREvaluation\" &&\r\n // Statusicon used for pca compliance\r\n this.statusIcon(item)}\r\n {\r\n // Visibility Button\r\n \r\n {\r\n this.props.toggleLegend(item.name);\r\n e.stopPropagation();\r\n }}\r\n size=\"large\"\r\n >\r\n {item.checked ? : }\r\n \r\n \r\n }\r\n {\r\n item.color = newColor;\r\n this.props.updateChartData(this.props.datasets, () => {});\r\n }}\r\n />\r\n \r\n \r\n );\r\n })}\r\n {this.props.initialized && this.props.project.type !== \"ESREvaluation\" && (\r\n // Option to change spectra settings\r\n this.props.setInitialized(false)}\r\n >\r\n Change Spectra Parameters\r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nSpectraTab.propTypes = {\r\n spectraViewer: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n datasets: PropTypes.array,\r\n toggleLegend: PropTypes.func,\r\n toggleAll: PropTypes.func,\r\n initialized: PropTypes.bool,\r\n updateChartData: PropTypes.func,\r\n setInitialized: PropTypes.func,\r\n showRawSpectra: PropTypes.func,\r\n onSave: PropTypes.func,\r\n returnHome: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(SpectraTab);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n FormControlLabel,\r\n Checkbox,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n Paper,\r\n Input,\r\n Button,\r\n IconButton,\r\n Chip,\r\n} from \"@mui/material\";\r\nimport { Remove, Add, Delete } from \"@mui/icons-material\";\r\n\r\nimport { withSpectraViewer } from \"../../contexts/SpectraViewerContext\";\r\n\r\nconst styles = {\r\n applyButton: {\r\n width: \"100%\",\r\n },\r\n operationSetRow: {\r\n marginBottom: 10,\r\n },\r\n applyContainer: {\r\n display: \"grid\",\r\n gridTemplateRows: \"1fr auto\",\r\n overflow: \"hidden\",\r\n },\r\n applyMainContent: {\r\n height: \"100%\",\r\n overflow: \"auto\",\r\n borderBottom: \"2px solid #EBEBEB\",\r\n },\r\n operationButton: {\r\n width: \"100%\",\r\n justifyContent: \"left\",\r\n textAligne: \"left\",\r\n textTransform: \"none\",\r\n },\r\n chipIndikation: {\r\n width: 100,\r\n cursor: \"pointer\",\r\n },\r\n chipContainer: {\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n flexWrap: \"wrap\",\r\n listStyle: \"none\",\r\n padding: 5,\r\n margin: 0,\r\n },\r\n chip: {\r\n margin: 5,\r\n },\r\n applyBottomContent: {\r\n borderTop: \"3px solid #EBEBEB\",\r\n padding: 10,\r\n },\r\n};\r\n\r\nconst operations = {\r\n diff: {\r\n name: \"differentiate\",\r\n type: \"int\",\r\n },\r\n int: {\r\n name: \"integrate\",\r\n type: \"int\",\r\n },\r\n // pwr: {\r\n // name: \"powerTransform\",\r\n // type: \"bool\",\r\n // },\r\n minMax: {\r\n name: \"scaleMinMax\",\r\n type: \"bool\",\r\n },\r\n quant: {\r\n name: \"scaleToQuantiles\",\r\n type: \"bool\",\r\n },\r\n std: {\r\n name: \"standardize\",\r\n type: \"bool\",\r\n },\r\n vec: {\r\n name: \"vectorNorm\",\r\n type: \"bool\",\r\n },\r\n scores: {\r\n name: \"maxPCAScores\",\r\n type: \"int\",\r\n },\r\n};\r\n\r\nclass OperationsTab extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n /**\r\n * Updates the areas as they need to be updated when moving the boundaries inside the graph.\r\n * Cannot use since the direct update breaks it.\r\n */\r\n componentDidUpdate = () => {\r\n this.props.spectraViewer.areas.forEach((area) => {\r\n area.refs[0].current.value = area.coordRange[0].toFixed(3);\r\n area.refs[1].current.value = area.coordRange[1].toFixed(3);\r\n });\r\n };\r\n\r\n onAddOperationsSet = () => {\r\n let operationSetsCopy = JSON.parse(\r\n JSON.stringify(this.props.spectraViewer.operationSets)\r\n );\r\n operationSetsCopy.push([[\"scores\", 1]]);\r\n this.props.spectraViewer.setState({ operationSets: operationSetsCopy });\r\n };\r\n\r\n onRemoveOperationSet = (idx) => {\r\n let operationSetsCopy = JSON.parse(\r\n JSON.stringify(this.props.spectraViewer.operationSets)\r\n );\r\n operationSetsCopy.splice(idx, 1);\r\n this.props.spectraViewer.setState({ operationSets: operationSetsCopy });\r\n };\r\n\r\n onAddOperation = (operation) => {\r\n let operationSetsCopy = JSON.parse(\r\n JSON.stringify(this.props.spectraViewer.operationSets)\r\n );\r\n let lastSet = operationSetsCopy[operationSetsCopy.length - 1];\r\n let toAdd = true;\r\n if (lastSet.length > 1) {\r\n // Increment if there already is an incrementable value\r\n if (lastSet[lastSet.length - 2][0] === operation) {\r\n // Only non-bool types are incremented\r\n if (operations[operation].type !== \"bool\") {\r\n lastSet[lastSet.length - 2][1] += 1;\r\n }\r\n toAdd = false;\r\n }\r\n }\r\n // Create new entry\r\n if (toAdd) {\r\n lastSet.splice(lastSet.length - 1, 0, [\r\n operation,\r\n operations[operation].type === \"bool\" ? true : 1,\r\n ]);\r\n }\r\n this.props.spectraViewer.setState({ operationSets: operationSetsCopy });\r\n };\r\n\r\n onChangeChip = (setIdx, idx, value) => {\r\n let operationSetsCopy = JSON.parse(\r\n JSON.stringify(this.props.spectraViewer.operationSets)\r\n );\r\n const key = operationSetsCopy[setIdx][idx][0];\r\n if (value === -1 || operations[key].type === \"int\") {\r\n operationSetsCopy[setIdx][idx][1] += value;\r\n }\r\n if (operationSetsCopy[setIdx][idx][1] <= 0) {\r\n operationSetsCopy[setIdx].splice(idx, 1);\r\n }\r\n if (operationSetsCopy[setIdx].length === 0) {\r\n operationSetsCopy.splice(setIdx, 1);\r\n }\r\n // Update operationsets if still present\r\n if (operationSetsCopy.length > 0) {\r\n this.props.spectraViewer.setState({ operationSets: operationSetsCopy });\r\n }\r\n };\r\n\r\n onApplySettings = () => {\r\n // Check for plausible pca settings\r\n for (\r\n let idx = 0;\r\n idx < this.props.spectraViewer.operationSets.length;\r\n idx++\r\n ) {\r\n // Get scores of opset\r\n let scores = this.props.spectraViewer.operationSets.slice(-1)[0][0][1];\r\n if (scores <= 0) {\r\n this.props.throwError(\r\n \"Please select a minimum of 1 score. Possibly increase selected spectra.\"\r\n );\r\n return;\r\n } else if (scores > this.props.spectraViewer.maxScores) {\r\n this.props.throwError(\r\n `Too many scores. Increase selected spectra or reduce scores to ${this.props.spectraViewer.maxScores}`\r\n );\r\n return;\r\n }\r\n }\r\n\r\n // Calculate the pcas as required\r\n this.props.requestData(\"calculate_pcas\");\r\n // Continue to pca selection tab\r\n if (this.props.project.type === \"ESRTraining\") {\r\n this.props.setActiveTab(2);\r\n }\r\n };\r\n\r\n /**\r\n * Updates the areas in the graph after entering them into the table.\r\n * @param {int} idx The index of the area you're referring to.\r\n * @param {JSON} area The area you're referring to.\r\n */\r\n onEnterArea = (idx, area) => {\r\n let tempAreas = this.props.spectraViewer.areas;\r\n tempAreas[idx].coordRange[0] = parseFloat(area.refs[0].current.value);\r\n tempAreas[idx].coordRange[1] = parseFloat(area.refs[1].current.value);\r\n this.props.spectraViewer.updateAreas(tempAreas);\r\n this.props.chart.dispatchAction({\r\n type: \"brush\",\r\n areas: tempAreas,\r\n });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n {Object.keys(operations).map((short) => {\r\n return (\r\n \r\n {\r\n if (short !== \"scores\") this.onAddOperation(short);\r\n else this.onAddOperationsSet();\r\n }}\r\n >\r\n \r\n \r\n \r\n {operations[short].name}\r\n {short === \"scores\" ? \" (add new operations set)\" : \"\"}\r\n \r\n
    \r\n
    \r\n );\r\n })}\r\n
      \r\n {this.props.spectraViewer.operationSets.map(\r\n (operationSet, setIdx) => {\r\n return (\r\n
    1. \r\n \r\n {operationSet.map((data, idx) => {\r\n // Make sure that not too many scores are selected, but no fewer than 0\r\n data[1] = Math.max(\r\n 0,\r\n Math.min(\r\n data[1],\r\n this.props.spectraViewer.maxScores\r\n )\r\n );\r\n\r\n const removeIcon = ;\r\n let icon;\r\n\r\n let hideRemove =\r\n data[0] === \"scores\" && data[1] === 1;\r\n let hideAdd =\r\n data[0] === \"scores\" &&\r\n data[1] >= this.props.spectraViewer.maxScores;\r\n\r\n let labelValue = data[0];\r\n if (operations[data[0]].type === \"int\") {\r\n labelValue += \" \" + data[1];\r\n } else {\r\n hideAdd = true;\r\n }\r\n\r\n if (!hideAdd) {\r\n icon = ;\r\n }\r\n\r\n return (\r\n
    2. \r\n {\r\n if (!hideAdd)\r\n this.onChangeChip(setIdx, idx, 1);\r\n }}\r\n onDelete={\r\n hideRemove\r\n ? undefined\r\n : () => this.onChangeChip(setIdx, idx, -1)\r\n }\r\n deleteIcon={removeIcon}\r\n color={\r\n data[0] === \"scores\" ? \"secondary\" : \"primary\"\r\n }\r\n />\r\n
    3. \r\n );\r\n })}\r\n {this.props.spectraViewer.operationSets.length > 1 && (\r\n
    4. \r\n {\r\n this.onRemoveOperationSet(setIdx);\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n
    5. \r\n )}\r\n \r\n \r\n );\r\n }\r\n )}\r\n
    \r\n {this.props.spectraViewer.areas.length > 0 && (\r\n \r\n \r\n \r\n \r\n \r\n from\r\n to\r\n \r\n \r\n \r\n \r\n {this.props.spectraViewer.areas.map((area, idx) => (\r\n \r\n \r\n {idx}\r\n \r\n \r\n {\r\n this.onEnterArea(idx, area);\r\n }}\r\n onKeyUp={(e) => {\r\n if (e.key === \"Enter\") {\r\n this.onEnterArea(idx, area);\r\n }\r\n }}\r\n inputRef={area.refs[0]}\r\n inputProps={{\r\n \"aria-label\": \"description\",\r\n step: this.props.xAxisData.stepX,\r\n }}\r\n />\r\n \r\n \r\n {\r\n this.onEnterArea(idx, area);\r\n }}\r\n onKeyUp={(e) => {\r\n if (e.key === \"Enter\") {\r\n this.onEnterArea(idx, area);\r\n }\r\n }}\r\n inputRef={area.refs[1]}\r\n inputProps={{\r\n \"aria-label\": \"description\",\r\n step: this.props.xAxisData.stepX,\r\n }}\r\n />\r\n \r\n \r\n {\r\n let tempAreas = this.props.spectraViewer.areas;\r\n this.props.spectraViewer.areas.splice(idx, 1);\r\n this.props.spectraViewer.updateAreas(tempAreas);\r\n this.props.chart.dispatchAction({\r\n type: \"brush\",\r\n areas: tempAreas,\r\n });\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
    \r\n
    \r\n )}\r\n
    \r\n
    \r\n {this.props.initialized && (\r\n
    \r\n
    \r\n {\r\n this.props.spectraViewer.toggleSavedCalcs();\r\n }}\r\n checked={this.props.spectraViewer.useSavedCalcs}\r\n />\r\n }\r\n label=\"Use saved calculations\"\r\n />\r\n {\r\n this.onApplySettings();\r\n }}\r\n >\r\n Apply\r\n \r\n
    \r\n
    \r\n )}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nOperationsTab.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n requestData: PropTypes.func,\r\n chart: PropTypes.object,\r\n xAxisData: PropTypes.object,\r\n initialized: PropTypes.bool,\r\n setActiveTab: PropTypes.func,\r\n throwError: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(withStyles(styles)(OperationsTab));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport SwapVertIcon from \"@mui/icons-material/SwapVert\";\r\n\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\nimport {\r\n Button,\r\n FormControlLabel,\r\n Grid,\r\n MenuItem,\r\n Radio,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n TextField,\r\n Tooltip,\r\n Typography,\r\n Slider,\r\n Checkbox,\r\n} from \"@mui/material\";\r\n\r\nimport { withSpectraViewer } from \"../../contexts/SpectraViewerContext\";\r\n\r\nconst criteriaLowerBound = 0.0;\r\nconst criteriaUpperBound = 100.0;\r\n\r\nconst xValueRangeMin = 300.0;\r\nconst xValueRangeMax = 400.0;\r\n\r\nconst styles = {\r\n paddingContainer: {\r\n padding: 10,\r\n },\r\n applyButton: {\r\n width: \"100%\",\r\n },\r\n applyContainer: {\r\n display: \"grid\",\r\n overflow: \"hidden\",\r\n },\r\n applyBottomContent: {\r\n borderTop: \"3px solid #EBEBEB\",\r\n padding: 10,\r\n \"& button:first-child\": {\r\n marginBottom: 10,\r\n },\r\n },\r\n selectionContainer: {\r\n overflow: \"auto\",\r\n borderTop: \"2px solid #EBEBEB\",\r\n },\r\n minMaxInput: {\r\n marginTop: 10,\r\n },\r\n};\r\n\r\nconst TooltipTable = withStyles({\r\n tooltip: {\r\n background: \"#FFFFFF\",\r\n border: \"#EBEBEB solid 2px\",\r\n },\r\n})(Tooltip);\r\n\r\nclass ModelTab extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n tabScrollPosition: 0,\r\n scrollContainerHeight: 1000,\r\n };\r\n this.selectionContainerRef = React.createRef();\r\n }\r\n\r\n handleScroll = (e) => {\r\n const element = this.selectionContainerRef.current;\r\n this.setState({\r\n tabScrollPosition: e.target.scrollTop,\r\n scrollContainerHeight: element.clientHeight,\r\n });\r\n };\r\n\r\n /**\r\n * Rendering only visible models/pcas\r\n * @param {int} idx Index of option to check\r\n * @returns {bool} Whether or not the given index is in view\r\n */\r\n isInView = (idx) => {\r\n const pos = 91 + idx * 74; // Pixel offset\r\n return (\r\n pos + 75 >= this.state.tabScrollPosition &&\r\n pos <= this.state.tabScrollPosition + this.state.scrollContainerHeight\r\n );\r\n };\r\n\r\n componentDidMount = () => {\r\n if (this.selectionContainerRef.current) {\r\n this.selectionContainerRef.current.addEventListener(\r\n \"scroll\",\r\n this.handleScroll\r\n );\r\n }\r\n };\r\n\r\n componentWillUnmount = () => {\r\n if (this.selectionContainerRef.current) {\r\n this.selectionContainerRef.current.removeEventListener(\r\n \"scroll\",\r\n this.handleScroll\r\n );\r\n }\r\n };\r\n\r\n /**\r\n * Select a pca. Deselect previously selected pca and/or models.\r\n * @param {Clickenvent} event Clickevent when selecting pca.\r\n * @param {int} idx Index of selected pca in list of pcas.\r\n */\r\n onPCASelection = (event, idx) => {\r\n // Must be adjusted together with backend\r\n const passingCriteria = [\r\n \"r2\",\r\n \"mse\",\r\n \"rmse\",\r\n \"expl_var\",\r\n \"max_err\",\r\n \"mean_abs_err\",\r\n \"mape\",\r\n \"med_abs_err\",\r\n ];\r\n\r\n if (event.target.value) {\r\n this.props.spectraViewer.setState({\r\n selectedPca: idx,\r\n selectedPcaId: this.props.spectraViewer.pcas[idx].id,\r\n selectedModelIdx: null,\r\n selectedModelName: null,\r\n passingCriteria,\r\n passingCriteria_idx: 0,\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Select a model. Deselect previously selected model and/or pcas.\r\n * @param {Clickenvent} event Clickevent when selecting model.\r\n * @param {int} idx Index of selected model in list of models.\r\n */\r\n onModelSelection = (event, idx) => {\r\n const model = this.props.spectraViewer.models[idx];\r\n\r\n // Analysis: Set passing criteria in accordance with selected model\r\n if (\r\n model.versions[model.selectedVersionIdx].modeltype === \"spectra-analysis\"\r\n ) {\r\n let passingCriteria = [];\r\n model.versions[model.selectedVersionIdx].substances?.forEach(\r\n (substance) => {\r\n passingCriteria.push(\r\n substance.name + \" Probability\", // Must be adjusted together with backend\r\n substance.name + \" Pred. Concentration\" // Must be adjusted together with backend\r\n );\r\n }\r\n );\r\n if (event.target.value) {\r\n this.props.spectraViewer.setState({\r\n selectedPca: null,\r\n selectedPcaId: null,\r\n selectedModelIdx: idx,\r\n selectedModelName: model.name,\r\n passingCriteria,\r\n passingCriteria_idx: 0,\r\n });\r\n }\r\n }\r\n // Prediction: Set prediction susbtances options\r\n else if (\r\n model.versions[model.selectedVersionIdx].modeltype === \"spectra-predict\"\r\n ) {\r\n const oldSettings = this.props.spectraViewer.spectraPredictionSettings;\r\n let spectraPredictionSettings = model.versions[\r\n model.selectedVersionIdx\r\n ].substances.map((substance) => {\r\n const foundIdx = oldSettings.findIndex(\r\n (setting) => setting.substance === substance.name\r\n );\r\n return foundIdx >= 0\r\n ? {\r\n substance: substance.name,\r\n concentration: oldSettings[foundIdx].concentration,\r\n }\r\n : { substance: substance.name, concentration: 0.0 };\r\n });\r\n if (event.target.value) {\r\n this.props.spectraViewer.setState({\r\n selectedPca: null,\r\n selectedPcaId: null,\r\n selectedModelIdx: idx,\r\n selectedModelName: model.name,\r\n passingCriteria: [],\r\n passingCriteria_idx: null,\r\n spectraPredictionSettings,\r\n });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Begin PCA analysis for the selected spectrum adn PCA model\r\n */\r\n onPcaAnalysis = () => {\r\n if (\r\n this.props.spectraViewer.rawSpectra[\r\n this.props.spectraViewer.selectedSpectrum\r\n ].isTemporary\r\n ) {\r\n window.showWarningSnackbar(\r\n `Action not possible with temporary spectrum \"${\r\n this.props.spectraViewer.rawSpectra[\r\n this.props.spectraViewer.selectedSpectrum\r\n ].name\r\n }\"`\r\n );\r\n return;\r\n }\r\n this.props.requestData(\"true_approx_scores\");\r\n this.props.project.type === \"ESRTraining\" && this.props.setActiveTab(3);\r\n this.props.project.type === \"ESREvaluation\" && this.props.setActiveTab(2);\r\n };\r\n\r\n /**\r\n * Predict spectrum for the given settings\r\n */\r\n onPredictSpectrum = () => {\r\n this.props.requestData(\"predict_spectrum\");\r\n this.props.setActiveTab(0);\r\n };\r\n\r\n /**\r\n * Generate table with pca\r\n * @param {JSON} pca PCA object\r\n * @param {int} idx Index of the pca in the pca list\r\n * @returns interactive table with pcas\r\n */\r\n pcaStats = (pca, idx) => {\r\n return (\r\n \r\n \r\n {this.isInView(idx) && (\r\n \r\n {/* Substances used for PCA */}\r\n \r\n Substances\r\n \r\n {pca.substances\r\n .reduce((result, substance) => {\r\n return `${result}${substance.name}, `;\r\n }, \"\")\r\n .slice(0, -2)}\r\n \r\n \r\n {/* Operations used for PCA */}\r\n \r\n Preprocessing\r\n \r\n {/* More than the simple scores */}\r\n {pca.preprocessing.length === 1\r\n ? \"none\"\r\n : pca.preprocessing\r\n .slice(0, pca.preprocessing.length - 1)\r\n .reduce((result, operation) => {\r\n return `${result}${operation[0]}: ${operation[1]}, `;\r\n }, \"\")\r\n .slice(0, -2)}\r\n \r\n \r\n \r\n Scores\r\n {pca.used_scores}\r\n \r\n {/* Areas */}\r\n \r\n Areas\r\n \r\n {pca.areas.length !== 0\r\n ? pca.areas\r\n .reduce((result, area) => {\r\n return `${result}[${Number(area[0]).toFixed(\r\n 2\r\n )}, ${Number(area[1]).toFixed(2)}], `;\r\n }, \"\")\r\n .slice(0, -2)\r\n : \"full\"}\r\n \r\n \r\n {/* No. of Features used for PCA */}\r\n \r\n No. of Features\r\n {pca.features}\r\n \r\n {/* Results of PCA */}\r\n {Object.entries(pca.result).map(([key, value]) => {\r\n return (\r\n \r\n {key}\r\n {Number(value).toFixed(6)}\r\n \r\n );\r\n })}\r\n \r\n )}\r\n
    \r\n \r\n }\r\n >\r\n this.onPCASelection(e, idx)}>\r\n {this.isInView(idx) ? (\r\n \r\n \r\n {/* Radio Button */}\r\n \r\n }\r\n label=\"\"\r\n >\r\n \r\n \r\n {/* Substances */}\r\n {pca.substances\r\n .reduce((result, substance) => {\r\n return `${result} ${substance.name},`;\r\n }, \"\")\r\n .slice(0, -1)}\r\n \r\n \r\n {/* R^2 Value */}\r\n {Number(pca.result.r2).toFixed(6)}\r\n \r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n );\r\n };\r\n\r\n /**\r\n * Generate table with models\r\n * @param {JSON} mode Model object\r\n * @param {int} idx Index of the model in the model list\r\n * @returns interactive table with model\r\n */\r\n modelStats = (model, idx) => {\r\n return (\r\n \r\n \r\n \r\n {/* Substances used for PCA */}\r\n \r\n Substances\r\n \r\n {model.versions[model.selectedVersionIdx].substances\r\n ?.map((subst) => subst.name)\r\n .join(\", \")}\r\n \r\n \r\n {/* Time created */}\r\n \r\n Creation time\r\n \r\n {model.versions[model.selectedVersionIdx].datetime}\r\n \r\n \r\n \r\n
    \r\n \r\n }\r\n >\r\n this.onModelSelection(e, idx)}>\r\n \r\n {/* Radio Button */}\r\n \r\n }\r\n label=\"\"\r\n >\r\n \r\n \r\n {/* Substances */}\r\n {model.versions[model.selectedVersionIdx].substances\r\n ?.map((subst) => subst.name)\r\n .join(\", \")}\r\n \r\n \r\n {/* Version */}\r\n {model.versions.length > 1 ? (\r\n // Version-selection dropdown\r\n {\r\n // Update selected version in models\r\n let models = this.props.spectraViewer.models;\r\n models[idx].selectedVersionIdx = models[\r\n idx\r\n ].versions.findIndex(\r\n (version) => version.label === event.target.value\r\n );\r\n this.props.spectraViewer.setState({\r\n models,\r\n });\r\n this.onModelSelection(event, idx);\r\n }}\r\n >\r\n {model.versions.map((version, idx) => (\r\n \r\n {version.label}\r\n \r\n ))}\r\n \r\n ) : (\r\n model.versions[model.selectedVersionIdx].label\r\n )}\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n /**\r\n * Save the new upper and lower limits for selection criteria.\r\n * Will not go under the lower and over the upper bound set above (Usually 0 and 1).\r\n * @param {Array} newValue The new upper and lower limits to set for the criteria as array [min, max].\r\n */\r\n handleChangeCriteriaLimits = (newValue) => {\r\n this.props.spectraViewer.setState({\r\n passingCriteria_min: Math.max(Math.min(...newValue), criteriaLowerBound),\r\n passingCriteria_max: Math.min(Math.max(...newValue), criteriaUpperBound),\r\n });\r\n };\r\n\r\n /**\r\n * Set substances to predict and their respective concentrations.\r\n * @param {String} substance Name of the substance\r\n * @param {Number} concentration Concentration as a value between 0 and 100%\r\n */\r\n handleChangePredictionSettings = (substance, concentration) => {\r\n let { spectraPredictionSettings } = this.props.spectraViewer;\r\n\r\n // Limit concentration to allowed values\r\n concentration = Math.max(\r\n Math.min(concentration, criteriaUpperBound),\r\n criteriaLowerBound\r\n );\r\n\r\n // Check if value already exists, if found, update it, otherwise add it\r\n const foundIdx = spectraPredictionSettings.findIndex(\r\n (setting) => setting.substance === substance\r\n );\r\n if (foundIdx >= 0) {\r\n spectraPredictionSettings[foundIdx].concentration = concentration;\r\n } else {\r\n spectraPredictionSettings.push({\r\n substance: substance,\r\n concentration: concentration,\r\n });\r\n }\r\n\r\n // Update settings\r\n this.props.spectraViewer.setState({ spectraPredictionSettings });\r\n };\r\n\r\n /**\r\n * Set min and max values for the x-values range if user wants to set this manually\r\n * @param {Array} xValueMinMax Array with the minimum and maximum x-value\r\n */\r\n handleChangeManualXRange = (xValueMinMax) => {\r\n // Update settings\r\n this.props.spectraViewer.setState({ xValueMinMax });\r\n };\r\n\r\n /**\r\n * Component of passing criteria settings, moved out fo render for visibility\r\n * @returns Passing criteria settings element, wrapped in
    \r\n */\r\n passingCriteriaSettings = () => {\r\n const { classes, spectraViewer } = this.props;\r\n return (\r\n // Set pass/fail parameters for spectra\r\n
    \r\n Passing Criteria\r\n {/* Criteria selection | Limit Entry */}\r\n \r\n \r\n {\r\n let targetIndex = spectraViewer.passingCriteria.findIndex(\r\n (criterium) => criterium === event.target.value\r\n );\r\n this.props.spectraViewer.setState({\r\n passingCriteria_idx: targetIndex,\r\n });\r\n }}\r\n fullWidth={true}\r\n style={{ minWidth: 150 }}\r\n >\r\n {spectraViewer.passingCriteria.map((criterium) => (\r\n \r\n {criterium}\r\n \r\n ))}\r\n \r\n \r\n \r\n {/* Minimum selection */}\r\n \r\n this.handleChangeCriteriaLimits([\r\n Number(event.target.value),\r\n spectraViewer.passingCriteria_max,\r\n ])\r\n }\r\n fullWidth={true}\r\n inputProps={{\r\n min: criteriaLowerBound,\r\n max: criteriaUpperBound,\r\n type: \"number\",\r\n step: 1e-1,\r\n }}\r\n />\r\n \r\n\r\n \r\n \r\n this.handleChangeCriteriaLimits([\r\n spectraViewer.passingCriteria_min,\r\n Number(event.target.value),\r\n ])\r\n }\r\n fullWidth={true}\r\n inputProps={{\r\n min: criteriaLowerBound,\r\n max: criteriaUpperBound,\r\n type: \"number\",\r\n step: 1e-1,\r\n }}\r\n />\r\n \r\n \r\n
    \r\n );\r\n };\r\n\r\n /**\r\n * Component containing predition entry settings\r\n * @returns spectra prediction element, wrapped in
    \r\n */\r\n spectraPreditionSettings = () => {\r\n const { classes, spectraViewer } = this.props;\r\n // const model = spectraViewer.models[spectraViewer.selectedModelIdx];\r\n const model = spectraViewer.models[0]; // TODO: Change to line above\r\n const modelVersion = model?.versions[model.selectedVersionIdx];\r\n return (\r\n \r\n Prediction Settings\r\n \r\n {modelVersion?.substances.map((substance) => {\r\n return (\r\n \r\n {\r\n this.handleChangePredictionSettings(\r\n substance.name,\r\n Number(e.target.value)\r\n );\r\n }}\r\n value={\r\n spectraViewer.spectraPredictionSettings.find(\r\n (setting) => setting.substance === substance.name\r\n )?.concentration ?? 0.0\r\n }\r\n >\r\n \r\n );\r\n })}\r\n \r\n {spectraViewer.selectedPca == null &&\r\n spectraViewer.passingCriteria_idx === null &&\r\n spectraViewer.selectedModelIdx !== null && (\r\n {\r\n spectraViewer.setState({\r\n setXRangeManually: e.target.checked,\r\n });\r\n }}\r\n />\r\n }\r\n label={\"set x-value range manually\"}\r\n />\r\n )}\r\n\r\n {spectraViewer.setXRangeManually && (\r\n \r\n \r\n \r\n \r\n \r\n {\r\n this.handleChangeManualXRange(e.target.value);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
    \r\n );\r\n };\r\n\r\n render() {\r\n const { classes, spectraViewer } = this.props;\r\n return (\r\n \r\n \r\n PCA Selection\r\n {spectraViewer.pcas?.length !== 0 ? (\r\n \r\n \r\n \r\n \r\n #\r\n Substances\r\n \r\n \r\n this.props.spectraViewer.sortPCAs(\r\n \"r2\",\r\n spectraViewer.pcaOrder === \"asc\" ? \"desc\" : \"asc\"\r\n )\r\n }\r\n >\r\n R²\r\n \r\n \r\n \r\n \r\n {spectraViewer.pcas.map((pca, idx) => {\r\n return this.pcaStats(pca, idx);\r\n })}\r\n \r\n
    \r\n
    \r\n ) : (\r\n <>\r\n No PCAs found!\r\n \r\n Please use the "ESR Training" module to train PCAs\r\n with known spectra before validating further unknown ones.\r\n \r\n \r\n )}\r\n
    \r\n {this.props.project.type === \"ESREvaluation\" && (\r\n \r\n Model Selection\r\n {spectraViewer.models?.length !== 0 ? (\r\n \r\n \r\n \r\n \r\n #\r\n Substances\r\n Version\r\n \r\n \r\n \r\n {spectraViewer.models.map((model, idx) => {\r\n return this.modelStats(model, idx);\r\n })}\r\n \r\n
    \r\n
    \r\n ) : (\r\n <>\r\n No AI models found!\r\n \r\n Please import AI models before validating further unknown\r\n ones.\r\n \r\n \r\n )}\r\n \r\n )}\r\n {this.props.initialized &&\r\n this.props.project.type === \"ESREvaluation\" &&\r\n // PCA or analysis model selected\r\n (spectraViewer.selectedPca !== null ? (\r\n this.passingCriteriaSettings()\r\n ) : // AI model selected\r\n spectraViewer.selectedModelIdx !== null ? (\r\n spectraViewer.passingCriteria_idx === null ? (\r\n // Prediction Model\r\n this.spectraPreditionSettings()\r\n ) : (\r\n // Analysis model\r\n this.passingCriteriaSettings()\r\n )\r\n ) : (\r\n // Nothing or something else selected\r\n
    \r\n ))}\r\n {(this.props.initialized ||\r\n this.props.project.type === \"ESREvaluation\") && (\r\n
    \r\n {\r\n // PCA selected\r\n if (spectraViewer.selectedPca !== null) {\r\n this.onPcaAnalysis();\r\n }\r\n // Predcition model selected\r\n else if (\r\n spectraViewer.passingCriteria_idx === null &&\r\n spectraViewer.selectedModelIdx !== null\r\n ) {\r\n this.onPredictSpectrum();\r\n }\r\n }}\r\n >\r\n {\r\n // PCA selected\r\n spectraViewer.selectedPca !== null\r\n ? \"Analyse Selected Spectrum with Selected PCA\"\r\n : // Predcition model selected\r\n spectraViewer.passingCriteria_idx === null &&\r\n spectraViewer.selectedModelIdx !== null\r\n ? \"Predict Spectrum\"\r\n : // Nothing or something else selected\r\n \"Please select a PCA or prediction model\"\r\n }\r\n \r\n {\r\n this.props.onSave();\r\n if (this.props.project.type === \"ESREvaluation\") {\r\n // Check whether to use PCAs or AI models\r\n if (spectraViewer.selectedPca !== null) {\r\n this.props.requestData(\"pca_evaluation\");\r\n } else if (\r\n spectraViewer.selectedModelIdx !== null &&\r\n spectraViewer.passingCriteria_idx !== null\r\n ) {\r\n // Analysis ai model\r\n this.props.requestData(\"ai_evaluation\");\r\n }\r\n this.props.setActiveTab(0);\r\n } else if (this.props.project.type === \"ESRTraining\") {\r\n this.props.requestData(\"pca_chosen\");\r\n // Return to home screen\r\n this.props.returnHome();\r\n }\r\n }}\r\n >\r\n Select\r\n \r\n
    \r\n )}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nModelTab.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n initialized: PropTypes.bool,\r\n onSave: PropTypes.func,\r\n requestData: PropTypes.func,\r\n setActiveTab: PropTypes.func,\r\n returnHome: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(withStyles(styles)(ModelTab));\r\n","import React, { Component } from \"react\";\r\nimport { PropTypes } from \"prop-types\";\r\n\r\nimport {\r\n ListItem,\r\n IconButton,\r\n ListItemText,\r\n Tooltip,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport { VisibilityOff, Visibility } from \"@mui/icons-material\";\r\n\r\nimport { withSpectraViewer } from \"../../contexts/SpectraViewerContext\";\r\n\r\nclass AnalysisTab extends Component {\r\n graph_names = [`Original`, `Preprocessed`, `Approximated`, `Residual`];\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n componentDidMount() {\r\n this.props.showAnalysisResults();\r\n }\r\n\r\n /**\r\n * The button to display for each item, indicating its visibility.\r\n * @param {boolean} checked Whether the item is checked.\r\n * @param {Function} func The function to execute with func(name, checked) upon button press.\r\n * @param {string} name The name of the dataseries the visibility refers to.\r\n * @param {Object} iconOn The icon to diplay when series is visible.\r\n * @param {Object} iconOff The icon to diplay when series is hidden.\r\n * @returns\r\n */\r\n visbilityButton = (checked, func, name, iconOn, iconOff) => {\r\n return (\r\n \r\n {\r\n func(name, checked);\r\n e.stopPropagation();\r\n }}\r\n size=\"large\"\r\n >\r\n {checked ? iconOn : iconOff}\r\n \r\n \r\n );\r\n };\r\n\r\n onApproxToggleVisibility = (name, checked) => {\r\n // Enables/Disables all series belonging to a single approximation\r\n this.props.datasets\r\n .filter((element) => this.graph_names.includes(element.name))\r\n .forEach((element) => {\r\n // On initial load, the spectra are set to undefined\r\n if (element.checked === checked || element.checked === undefined) {\r\n this.props.toggleLegend(element.name);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Checks if a series calles by name is currently visible.\r\n * @param {string} name The name of the dataseries in the spectrum.\r\n * @returns {boolean} Is the series checked, i.e. currently visible?\r\n */\r\n checkForChecked = (name) => {\r\n let element = this.props.datasets.filter((element) =>\r\n element.name.startsWith(name)\r\n )[0];\r\n return element ? element.checked : false;\r\n };\r\n\r\n /**\r\n * Checks if any item of a group is checked.\r\n * @param {object} item Group of series referring to a single starting spectrum. Include original, preprocessed, approximation, residual.\r\n * @returns {boolean} Are any of the above checked?\r\n */\r\n checkForAnyChecked = (item) => {\r\n let checked = false;\r\n this.props.datasets\r\n .filter((element) => this.graph_names.includes(element.name))\r\n .forEach((element) => {\r\n if (element.checked) {\r\n checked = true;\r\n }\r\n });\r\n\r\n item.checked = checked;\r\n return checked;\r\n };\r\n\r\n render() {\r\n return this.props.spectraViewer.selectedPca !== null &&\r\n this.props.spectraViewer.focusedPca.info !== null ? (\r\n
    \r\n {/* Spectrum Analysis Information */}\r\n {this.props.spectraViewer.selectedPca !== null &&\r\n this.props.spectraViewer.focusedPca.approximations.map(\r\n (approximation, idx) => {\r\n let orig = `Original`;\r\n let pre = `Preprocessed`;\r\n let approx = `Approximated`;\r\n let resid = `Residual`;\r\n return (\r\n \r\n \r\n this.props.spectraViewer.setState({\r\n selectedProcessedSpectrum: idx,\r\n })\r\n }\r\n >\r\n \r\n \r\n {approximation.name}\r\n
    \r\n }\r\n />\r\n \r\n {/* Full visibility toggle */}\r\n {this.visbilityButton(\r\n this.checkForAnyChecked(approximation),\r\n this.onApproxToggleVisibility,\r\n approximation.name,\r\n ,\r\n \r\n )}\r\n {/* Original Spectrum Visibility */}\r\n {this.visbilityButton(\r\n this.checkForChecked(orig),\r\n this.props.toggleLegend,\r\n orig,\r\n ,\r\n \r\n )}\r\n {/* Preprocessed Spectra Visibility */}\r\n {this.visbilityButton(\r\n this.checkForChecked(pre),\r\n this.props.toggleLegend,\r\n pre,\r\n ,\r\n \r\n )}\r\n {/* Approximated Spectra visibility */}\r\n {this.visbilityButton(\r\n this.checkForChecked(approx),\r\n this.props.toggleLegend,\r\n approx,\r\n ,\r\n \r\n )}\r\n {/* Residual Spectra visibilty */}\r\n {this.visbilityButton(\r\n this.checkForChecked(resid),\r\n this.props.toggleLegend,\r\n resid,\r\n ,\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n )}\r\n {/* PCA Analysis Information */}\r\n {this.props.spectraViewer.focusedPca.scores.map((score, idx) => {\r\n return (\r\n \r\n \r\n this.props.spectraViewer.setState({ selectedPcaScore: idx })\r\n }\r\n >\r\n \r\n \r\n {score.name}\r\n \r\n }\r\n />\r\n \r\n {this.visbilityButton(\r\n this.checkForChecked(score.name),\r\n this.props.toggleLegend,\r\n score.name,\r\n ,\r\n \r\n )}\r\n \r\n \r\n );\r\n })}\r\n \r\n ) : (\r\n
    \r\n Please select a PCA\r\n \r\n Please select a PCA.Choose a PCA from the PCA-Tab and press the\r\n analyse button at the bottom of the tab. The spectrum selected in the\r\n spectra tab will then be analysed using the respective pca.\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nAnalysisTab.propTypes = {\r\n spectraViewer: PropTypes.object.isRequired,\r\n datasets: PropTypes.array,\r\n toggleLegend: PropTypes.func,\r\n showRawSpectra: PropTypes.func,\r\n showAnalysisResults: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(AnalysisTab);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { withSpectraViewer } from \"../contexts/SpectraViewerContext\";\r\n\r\nimport { Redirect } from \"react-router-dom\";\r\nimport { Tabs, Tab } from \"@mui/material\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport {\r\n faCog,\r\n faChartArea,\r\n faChartLine,\r\n faCheckCircle,\r\n} from \"@fortawesome/free-solid-svg-icons\";\r\n\r\nimport SpectraTab from \"./SpectraSidebarTabs/SpectraTab\";\r\nimport OperationsTab from \"./SpectraSidebarTabs/OperationsTab\";\r\nimport ModelTab from \"./SpectraSidebarTabs/ModelTab\";\r\nimport AnalysisTab from \"./SpectraSidebarTabs/AnalysisTab\";\r\n\r\nconst styles = {\r\n root: {\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"auto 1fr\",\r\n overflow: \"hidden\",\r\n },\r\n tab: {\r\n minWidth: 395 / 3,\r\n minHeight: 44,\r\n height: 44,\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n \"& *\": {\r\n display: \"inline-block\",\r\n fontSize: \"16px\",\r\n lineHeight: \"16px\",\r\n },\r\n \"& svg\": {\r\n marginRight: \"5px\",\r\n position: \"relative\",\r\n top: \"4px\",\r\n },\r\n },\r\n};\r\n\r\nclass SpectraSideBar extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n activeTab: 0,\r\n returnHome: false,\r\n };\r\n }\r\n handleTabChange = (event, value) => {\r\n this.setState({ activeTab: value });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { activeTab } = this.state;\r\n\r\n return this.props.project.type === \"ESRTraining\" ? (\r\n // ESR Training Module\r\n
    \r\n {/* Return to homescreen by rendering the following line */}\r\n {this.state.returnHome && }\r\n \r\n }\r\n label={\r\n \"Spectra (\" + this.props.spectraViewer.rawSpectra.length + \")\"\r\n }\r\n />\r\n }\r\n label=\"Settings\"\r\n />\r\n }\r\n label=\"Models\"\r\n />\r\n }\r\n label=\"Analysis\"\r\n />\r\n \r\n {this.state.activeTab === 0 && (\r\n this.setState({ returnHome: true })}\r\n />\r\n )}\r\n {this.state.activeTab === 1 && (\r\n this.setState({ activeTab: tab_no })}\r\n throwError={this.props.throwError}\r\n />\r\n )}\r\n {this.state.activeTab === 2 && (\r\n this.setState({ activeTab: value })}\r\n returnHome={() => this.setState({ returnHome: true })}\r\n />\r\n )}\r\n {this.state.activeTab === 3 && (\r\n \r\n )}\r\n
    \r\n ) : (\r\n // ESR Evaluation Module\r\n
    \r\n {/* Return to homescreen by rendering the following line */}\r\n {this.state.returnHome && }\r\n \r\n }\r\n label={\r\n \"Spectra (\" + this.props.spectraViewer.rawSpectra.length + \")\"\r\n }\r\n />\r\n }\r\n label=\"Models\"\r\n />\r\n }\r\n label=\"Analysis\"\r\n />\r\n \r\n {this.state.activeTab === 0 && (\r\n this.setState({ returnHome: true })}\r\n />\r\n )}\r\n {this.state.activeTab === 1 && (\r\n this.setState({ activeTab: value })}\r\n returnHome={() => this.setState({ returnHome: true })}\r\n />\r\n )}\r\n {this.state.activeTab === 2 && (\r\n \r\n )}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nSpectraSideBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n xAxisData: PropTypes.object,\r\n chart: PropTypes.object,\r\n datasets: PropTypes.array,\r\n initialized: PropTypes.bool,\r\n setInitialized: PropTypes.func,\r\n maxScores: PropTypes.number,\r\n toggleLegend: PropTypes.func,\r\n toggleAll: PropTypes.func,\r\n onChangeMetaData: PropTypes.func,\r\n requestData: PropTypes.func,\r\n onSave: PropTypes.func,\r\n showRawSpectra: PropTypes.func,\r\n showAnalysisResults: PropTypes.func,\r\n throwError: PropTypes.func,\r\n updateChartData: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(withStyles(styles)(SpectraSideBar));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { IconButton, Tooltip, SvgIcon } from \"@mui/material\";\r\nimport { Save } from \"@mui/icons-material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n background: \"white\",\r\n borderRight: \"5px solid #EBEBEB\",\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"1fr auto\",\r\n },\r\n toolbarButton: {\r\n width: 40,\r\n },\r\n toolbarButtonChecked: {\r\n width: 40,\r\n color: theme.palette.primary.main,\r\n },\r\n});\r\n\r\n// Only the bottom tools, top tools are part of the chart\r\nclass SpectraToolBar extends Component {\r\n render() {\r\n const { classes, showResultTable } = this.props;\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nSpectraToolBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n showResultTable: PropTypes.bool,\r\n onSave: PropTypes.func,\r\n toggleLeftTableContainer: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(SpectraToolBar);\r\n","// Framework imports\r\nimport { withRouter } from \"react-router-dom\";\r\nimport PropTypes from \"prop-types\";\r\nimport React, { Component } from \"react\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\n// External paackges\r\nimport { Tabs, Tab } from \"@mui/material\";\r\nimport ELineChart from \"./components/ELineChart\";\r\n\r\n// HSA Imports\r\nimport { withSpectraViewer } from \"./contexts/SpectraViewerContext\";\r\nimport { withSpinloader } from \"../common/components/Spinloader\";\r\nimport Backend from \"../common/utils/Backend\";\r\nimport FileParamForm from \"./components/FileParamForm\";\r\nimport LocalHorizontalResizeBorder from \"../common/components/LocalHorizontalResizeBorder\";\r\nimport LocalVerticalResizeBorder from \"../common/components/LocalVerticalResizeBorder\";\r\nimport SpectraBottomTableResults from \"./components/SpectraBottomTableResults\";\r\nimport SpectraLeftTableResults from \"./components/SpectraLeftTableResults\";\r\nimport SpectraResultCharts from \"./components/SpectraResultCharts\";\r\nimport SpectraSideBar from \"./components/SpectraSideBar\";\r\nimport SpectraToolBar from \"./components/SpectraToolBar\";\r\n\r\nconst styles = {\r\n outerContainer: {\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n background: \"#EBEBEB\",\r\n display: \"grid\",\r\n },\r\n borderBackground: {\r\n background: \"#EBEBEB\",\r\n },\r\n TableContainer: {\r\n background: \"white\",\r\n marginRight: 5,\r\n overflow: \"hidden\",\r\n width: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"auto 1fr\",\r\n },\r\n PreviewContainer: {\r\n background: \"white\",\r\n },\r\n leftTableContainer: {\r\n overflow: \"hidden\",\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr 5px\",\r\n },\r\n bottomTableContainer: {\r\n overflow: \"hidden\",\r\n display: \"grid\",\r\n gridTemplateRows: \"5px 1fr\",\r\n },\r\n ToolBarContainer: {\r\n background: \"white\",\r\n margin: \"0 5px\",\r\n },\r\n SideBarContainer: {\r\n background: \"white\",\r\n overflow: \"hidden\",\r\n display: \"grid\",\r\n gridTemplateRows: \"1fr auto\",\r\n },\r\n};\r\n\r\nclass SpectraViewer extends Component {\r\n constructor(props) {\r\n super(props);\r\n this._isMounted = false;\r\n this.state = {\r\n initialized: false,\r\n activeMainTab: 0,\r\n resultChartTypes: [],\r\n project: null,\r\n chart: null,\r\n datasets: [],\r\n fileParams: [],\r\n windowSize: [0, 0],\r\n maxScores: 0,\r\n xAxisData: {\r\n minX: 0,\r\n maxX: 0,\r\n stepX: 0.1,\r\n min: 0,\r\n max: 0,\r\n },\r\n showResultTable: false,\r\n leftTableWidth: 400,\r\n bottomTableHeight: 300,\r\n sideBarWidth: 550,\r\n mainChartDataShown: null,\r\n setXRangeManually: true,\r\n xValueMinMax: [330, 344], // default values\r\n };\r\n }\r\n\r\n /**\r\n * Initializes top level container containing all elements of the viewer.\r\n * Loads saved project from backend.\r\n */\r\n componentDidMount = () => {\r\n this._isMounted = true;\r\n window.addEventListener(\"keydown\", this.keyDown);\r\n window.addEventListener(\"resize\", () => this.updateDimensions());\r\n Backend.loadProject(\r\n {\r\n id: this.props.id,\r\n },\r\n (project) => {\r\n if (project.projectData) {\r\n project.metaData = project.projectData.metaData;\r\n project.name = project.projectData.name;\r\n } else {\r\n project.metaData = JSON.parse(project.metaData);\r\n }\r\n window.setNavigationbarTitle(\r\n `${project.name} (${project.viewerConfig.project.label})`\r\n );\r\n Backend.getCurrentUser((user) => {\r\n let areas = this.props.spectraViewer.areas;\r\n let operationSets = this.props.spectraViewer.operationSets;\r\n let useSavedCalcs = this.props.spectraViewer.useSavedCalcs;\r\n let passingCriteria = this.props.spectraViewer.passingCriteria;\r\n let passingCriteria_idx =\r\n this.props.spectraViewer.passingCriteria_idx;\r\n let passingCriteria_min =\r\n this.props.spectraViewer.passingCriteria_min;\r\n let passingCriteria_max =\r\n this.props.spectraViewer.passingCriteria_max;\r\n let datasets = [];\r\n let fileParams = [];\r\n let xAxisData = this.state.xAxisData;\r\n let setXRangeManually = true;\r\n let xValueMinMax = [330, 344]; // default values\r\n if (project.projectData) {\r\n let simpleParams = JSON.parse(project.projectData.simpleParams);\r\n useSavedCalcs = simpleParams.useSavedCalcs\r\n ? simpleParams.useSavedCalcs\r\n : true;\r\n areas = simpleParams.areas;\r\n xAxisData = simpleParams.xAxisData\r\n ? simpleParams.xAxisData\r\n : xAxisData;\r\n fileParams = simpleParams.fileParams ? simpleParams.fileParams : [];\r\n // Backwards compatibility\r\n datasets = simpleParams.datasets\r\n ? simpleParams.datasets\r\n : simpleParams.legendData;\r\n operationSets = simpleParams.operationSets\r\n ? simpleParams.operationSets\r\n : this.props.spectraViewer.operationSets;\r\n\r\n passingCriteria = simpleParams.passingCriteria\r\n ? simpleParams.passingCriteria\r\n : this.props.spectraViewer.passingCriteria;\r\n\r\n passingCriteria_idx = simpleParams.passingCriteria_idx\r\n ? simpleParams.passingCriteria_idx\r\n : this.props.spectraViewer.passingCriteria_idx;\r\n\r\n passingCriteria_min = simpleParams.passingCriteria_min\r\n ? simpleParams.passingCriteria_min\r\n : this.props.spectraViewer.passingCriteria_max;\r\n\r\n passingCriteria_max = simpleParams.passingCriteria_max\r\n ? simpleParams.passingCriteria_max\r\n : this.props.spectraViewer.passingCriteria_max;\r\n }\r\n if (fileParams.length === 0) {\r\n fileParams = project.files.map((file) => {\r\n return {\r\n fileName: file.fileName,\r\n id: file.id,\r\n subName: [],\r\n concentration: [],\r\n };\r\n });\r\n } else if (\r\n // Check for old format\r\n typeof fileParams[0].subName === \"string\" ||\r\n typeof fileParams[0].concentration === \"number\"\r\n ) {\r\n // Ensure backwards compatibility with single substance spectra\r\n fileParams = fileParams.map((file) => {\r\n // Convert to new, array-based format\r\n return {\r\n fileName: file.fileName,\r\n id: file.id,\r\n subName: file.subName\r\n ? typeof file.subName === \"string\"\r\n ? [file.subName]\r\n : file.subName\r\n : [],\r\n concentration:\r\n file.concentration || file.concentration === 0\r\n ? typeof file.concentration === \"number\"\r\n ? [file.concentration]\r\n : file.concentration\r\n : [],\r\n };\r\n });\r\n }\r\n this.setState({\r\n xAxisData,\r\n fileParams,\r\n initialized: project.projectData !== null,\r\n areas,\r\n datasets,\r\n user: user.fullName,\r\n project: this.createProjectModel(project, user.fullName),\r\n });\r\n this.props.spectraViewer.setState({\r\n operationSets,\r\n useSavedCalcs,\r\n passingCriteria,\r\n passingCriteria_idx,\r\n passingCriteria_min,\r\n passingCriteria_max,\r\n xValueMinMax,\r\n setXRangeManually,\r\n });\r\n });\r\n }\r\n );\r\n };\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n window.removeEventListener(\"keydown\", this.keyDown);\r\n window.removeEventListener(\"resize\", () => this.updateDimensions());\r\n this.props.spinloader.hide();\r\n }\r\n\r\n updateDimensions = () => {\r\n this.setState({ windowSize: [window.innerWidth, window.innerHeight] });\r\n if (this.state.chart) this.state.chart.resize();\r\n };\r\n /**\r\n * handle shortcut\r\n * @param {ActionEvent} e Event when keyboard button is pressed\r\n */\r\n keyDown = (e) => {\r\n if (e.ctrlKey && e.key === \"s\") {\r\n this.saveFunction();\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n /**\r\n * Gets all numbertype rating criteria from an list of ratedSpectra without duplicates.\r\n * @param {JSON} ratedSpectra A list of ratings, each containing criteria as keys.\r\n * @returns {List} All keys (= criteria) as strings without duplicates.\r\n */\r\n gatherAllCriteria = (ratedSpectra) => {\r\n let criteria = [];\r\n ratedSpectra.forEach(\r\n (spectrum) =>\r\n (criteria = criteria.concat(\r\n Object.keys(spectrum.rating).filter(\r\n // Only get criterium of type number not yet included in criteria\r\n (key) =>\r\n typeof spectrum.rating[key] === \"number\" &&\r\n criteria.indexOf(key) < 0\r\n )\r\n ))\r\n );\r\n return criteria;\r\n };\r\n\r\n /**\r\n * Gets data from the backend, depending on the requesttype.\r\n * @param {string} requestType Can be \"init\", \"update\", \"pca_chosen\",\r\n * \"calculate_pcas\", \"pca_evaluation\", \"ai_evaluation\", \"true_approx_scores\",\r\n * \"predict_spectrum\"\r\n */\r\n requestData = (requestType) => {\r\n const { project } = this.state;\r\n\r\n let areas = this.state.xAxisData.length\r\n ? this.props.spectraViewer.areas.map((area) => [\r\n area.coordRange[0],\r\n area.coordRange[1],\r\n ])\r\n : [];\r\n\r\n // Add substances and concetrations of spectra files\r\n let files = project.files;\r\n files = files.map((file) => {\r\n // Add checked status an graph color to file data\r\n const useAll =\r\n this.props.spectraViewer.rawSpectra.filter((el) => el.checked)\r\n .length === 0;\r\n for (let i = 0; i < this.props.spectraViewer.rawSpectra.length; i++) {\r\n if (\r\n this.props.spectraViewer.rawSpectra[i].id &&\r\n this.props.spectraViewer.rawSpectra[i].id === file.id\r\n ) {\r\n file.color = this.props.spectraViewer.rawSpectra[i].color;\r\n // Should no spectra be selected, all are used.\r\n file.checked = useAll\r\n ? true\r\n : this.props.spectraViewer.rawSpectra[i].checked;\r\n }\r\n }\r\n // Look for values in state and add theem to file properties\r\n for (let i = 0; i < this.state.fileParams.length; i++) {\r\n if (\r\n this.state.fileParams[i].id &&\r\n this.state.fileParams[i].id === file.id\r\n ) {\r\n file.id = this.state.fileParams[i].id;\r\n file.substances = this.state.fileParams[i].subName.map(\r\n (name, idx) => {\r\n return {\r\n name: name,\r\n concentration: this.state.fileParams[i].concentration[idx],\r\n };\r\n }\r\n );\r\n // Successful reading of files\r\n return file;\r\n }\r\n }\r\n\r\n return file;\r\n });\r\n let input = {\r\n id: project.id,\r\n projectType: project.type,\r\n files: files,\r\n requestType: requestType, // Definitions: see method description\r\n areaSet: areas,\r\n operations: this.props.spectraViewer.operationSets,\r\n useSavedCalcs: this.props.spectraViewer.useSavedCalcs,\r\n selectedPcaId: this.props.spectraViewer.selectedPcaId,\r\n selectedModel:\r\n this.props.spectraViewer.models[\r\n this.props.spectraViewer.selectedModelIdx\r\n ],\r\n selectedSpectrumId:\r\n this.props.spectraViewer.rawSpectra[\r\n this.props.spectraViewer.selectedSpectrum\r\n ]?.id,\r\n passingCriteria: {\r\n criterium:\r\n this.props.spectraViewer.passingCriteria[\r\n this.props.spectraViewer.passingCriteria_idx\r\n ],\r\n limits: [\r\n this.props.spectraViewer.passingCriteria_min,\r\n this.props.spectraViewer.passingCriteria_max,\r\n ],\r\n },\r\n spectraPredictionSettings:\r\n this.props.spectraViewer.spectraPredictionSettings,\r\n setXRangeManually: this.props.spectraViewer.setXRangeManually,\r\n xValueMinMax: this.props.spectraViewer.xValueMinMax,\r\n };\r\n // pca chosen simply returns to home screen\r\n if (input.requestType !== \"pca_chosen\") {\r\n this.props.spinloader.show();\r\n }\r\n\r\n Backend.requestSpectraData(\r\n input,\r\n (data) => {\r\n switch (input.requestType) {\r\n case \"pca_chosen\":\r\n // Only clean up pcas in backend, we're done in the frontend\r\n break;\r\n\r\n case \"calculate_pcas\":\r\n // Only extract the calculated pcas\r\n this.props.spectraViewer.setState({ pcas: data.pcas });\r\n this.props.spinloader.hide();\r\n break;\r\n\r\n case \"pca_evaluation\":\r\n // Analyse all selected spectra using the selected pca\r\n this.props.spectraViewer.setState({\r\n ratedSpectra: data.rated_spectra,\r\n passingCriteria: this.gatherAllCriteria(data.rated_spectra),\r\n });\r\n this.props.spinloader.hide();\r\n break;\r\n\r\n case \"ai_evaluation\":\r\n // Analyse all selected spectra using the selected ai model\r\n this.props.spectraViewer.setState({\r\n ratedSpectra: data.rated_spectra,\r\n passingCriteria: this.gatherAllCriteria(data.rated_spectra),\r\n });\r\n this.props.spinloader.hide();\r\n break;\r\n\r\n case \"true_approx_scores\":\r\n // Calculate pca approximation of a given spectrum for comparison purposes\r\n this.props.spectraViewer.setState(\r\n {\r\n focusedPca: {\r\n info: data.focusedPca.info,\r\n approximations: data.focusedPca.approximations,\r\n scores: data.focusedPca.scores,\r\n },\r\n },\r\n\r\n () =>\r\n this.props.spectraViewer.setState(\r\n {\r\n currentlyShownData: null,\r\n analysisResults: this.structurePcaAnalysisResults(),\r\n analysisResultsLoaded: true,\r\n },\r\n\r\n () => this.showAnalysisResults()\r\n )\r\n );\r\n break;\r\n\r\n case \"predict_spectrum\":\r\n // Predict a new spectrum from concentration input values.\r\n this.showPredictionResults(data.predictedSpectra);\r\n this.props.spinloader.hide();\r\n break;\r\n\r\n case \"init\":\r\n // Get exisiting models\r\n Backend.getModelMetadata(\"verified_models\", false, (model_data) => {\r\n model_data = model_data.filter((model) => {\r\n // Filter models to where any version is a spectra-analysis or a spectra-predict model\r\n if (\r\n !model.versions.some(\r\n (version) =>\r\n version.modeltype === \"spectra-analysis\" ||\r\n version.modeltype === \"spectra-predict\"\r\n )\r\n ) {\r\n return false;\r\n }\r\n\r\n // Remove any faulty versions\r\n model.versions = model.versions.filter(\r\n (version) =>\r\n version.modeltype === \"spectra-analysis\" ||\r\n version.modeltype === \"spectra-predict\"\r\n );\r\n\r\n // Select the first version as default\r\n model.selectedVersionIdx = 0;\r\n\r\n // Keep only models where versions are still present\r\n return model.versions.length > 0;\r\n });\r\n\r\n this.props.spectraViewer.setState({ models: model_data });\r\n });\r\n\r\n this.props.spectraViewer.setState(\r\n {\r\n pcas: data.pcas,\r\n rawSpectra: data.series,\r\n rawSpectraLoaded: true,\r\n currentlyShownData: null,\r\n },\r\n () => {\r\n this.showRawSpectra();\r\n }\r\n );\r\n break;\r\n\r\n case \"update\":\r\n default:\r\n this.setSeries(data.series, () => {\r\n this.props.spinloader.hide();\r\n });\r\n }\r\n return true;\r\n },\r\n (error) => {\r\n // Concatenate array of errors to single string\r\n window.openErrorDialog(\r\n error.reduce((currentValue, newValue) => {\r\n return `${currentValue}${newValue}\\n`;\r\n }, \"\")\r\n );\r\n this.props.spinloader.hide();\r\n return false;\r\n },\r\n (backendStatus) => {\r\n if (this._isMounted) {\r\n this.props.spinloader.showWithProgress(backendStatus);\r\n }\r\n }\r\n );\r\n };\r\n\r\n structurePcaAnalysisResults = () => {\r\n // Build a series of objects, that may be used to accurately display individual components of the analysis.\r\n let series = [];\r\n let total =\r\n this.props.spectraViewer.focusedPca.scores.length +\r\n this.props.spectraViewer.focusedPca.approximations.length;\r\n let current = 1;\r\n // all the pca scores\r\n this.props.spectraViewer.focusedPca.scores.forEach((score) => {\r\n this.props.spinloader.showWithProgress({\r\n message: \"Calculating series\",\r\n progress: (current++ / total) * 100,\r\n });\r\n series.push({\r\n name: score.name,\r\n checked: score.checked ? score.checked : false,\r\n type: score.type ? score.type : \"line\",\r\n symbol: score.symbol ?? \"none\",\r\n data: score.data,\r\n character: \"score\",\r\n });\r\n });\r\n\r\n // all the pca original data, processed data, approximations, and residuals\r\n this.props.spectraViewer.focusedPca.approximations.forEach(\r\n (approximation) => {\r\n this.props.spinloader.showWithProgress({\r\n message: \"Calculating series\",\r\n progress: (current++ / total) * 100,\r\n });\r\n // Match with original data\r\n this.props.spectraViewer.rawSpectra.some((rawSpectrum) => {\r\n if (rawSpectrum.id === approximation.id) {\r\n series.push({\r\n name: `Original`,\r\n checked: approximation.checked ? approximation.checked : false,\r\n type: approximation.type ? approximation.type : \"line\",\r\n symbol: approximation.symbol ?? \"none\",\r\n data: rawSpectrum.data,\r\n character: \"original spectrum\",\r\n });\r\n return true;\r\n }\r\n return false;\r\n });\r\n\r\n // Preprocessed data\r\n series.push({\r\n name: `Preprocessed`,\r\n checked: approximation.checked ? approximation.checked : false,\r\n type: approximation.type ? approximation.type : \"line\",\r\n symbol: approximation.symbol ?? \"none\",\r\n data: approximation.original_data,\r\n character: \"preprocessed spectrum\",\r\n });\r\n\r\n // Approximated Data\r\n series.push({\r\n name: `Approximated`,\r\n checked: approximation.checked ? approximation.checked : false,\r\n type: approximation.type ? approximation.type : \"line\",\r\n symbol: approximation.symbol ?? \"none\",\r\n data: approximation.approximated_data,\r\n character: \"approximated spectrum\",\r\n });\r\n\r\n // Residual data\r\n series.push({\r\n name: `Residual`,\r\n checked: approximation.checked ? approximation.checked : false,\r\n type: approximation.type ? approximation.type : \"line\",\r\n symbol: approximation.symbol ?? \"none\",\r\n data: approximation.original_data.map((orig_data, idx) => {\r\n let datapoint = [\r\n orig_data[0],\r\n approximation.approximated_data[idx][1] - orig_data[1],\r\n ];\r\n return datapoint;\r\n }),\r\n character: \"residual spectrum\",\r\n });\r\n }\r\n );\r\n return series;\r\n };\r\n\r\n /**\r\n * Displays the raw spectra as loaded from backend in graph.\r\n * @returns {bool} Successful display of raw spectra.\r\n */\r\n showRawSpectra = () => {\r\n if (\r\n this.props.spectraViewer.rawSpectraLoaded &&\r\n this.props.spectraViewer.currentlyShownData !== \"raw_spectra\"\r\n ) {\r\n this.props.spinloader.showWithMessage(\"Loading datapoints...\");\r\n setTimeout(() => {\r\n this.state.chart.clear();\r\n this.props.spectraViewer.setState({\r\n currentlyShownData: \"raw_spectra\",\r\n });\r\n this.setState({\r\n mainChartDataShown: \"raw_spectra\",\r\n });\r\n this.setSeries(this.props.spectraViewer.rawSpectra, () => {\r\n this.props.spinloader.hide();\r\n });\r\n }, 0);\r\n\r\n return true;\r\n } else if (this.props.spectraViewer.currentlyShownData === \"raw_spectra\") {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n /**\r\n * Displays the analysis results as calculated in backend in graph.\r\n * @returns {bool} Successful display of analysis results.\r\n */\r\n showAnalysisResults = () => {\r\n if (\r\n this.props.spectraViewer.analysisResultsLoaded &&\r\n this.props.spectraViewer.currentlyShownData !== \"analysis_results\"\r\n ) {\r\n this.props.spinloader.showWithMessage(\"Loading datapoints...\");\r\n setTimeout(() => {\r\n this.state.chart.clear();\r\n this.props.spectraViewer.setState({\r\n currentlyShownData: \"analysis_results\",\r\n });\r\n this.setState({\r\n mainChartDataShown: \"analysis_results\",\r\n });\r\n this.setSeries(this.props.spectraViewer.analysisResults, () => {\r\n this.props.spinloader.hide();\r\n });\r\n }, 0);\r\n return true;\r\n } else if (\r\n this.props.spectraViewer.currentlyShownData === \"analysis_results\"\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n /**\r\n * Integrate predicted spectra alongside rawSpectra.\r\n * @param {Array} spectra All predicted spectra to be shown alongside the normal, rawSpectra\r\n */\r\n showPredictionResults = (spectra) => {\r\n // Show spectra alongside normal spectra\r\n let tmpSpectra = this.props.spectraViewer.rawSpectra;\r\n // Filter out double names\r\n let existingNames = [];\r\n spectra.forEach((spectrum) => existingNames.push(spectrum.name));\r\n tmpSpectra = tmpSpectra.filter(\r\n (spectrum) => !existingNames.some((name) => name === spectrum.name)\r\n );\r\n\r\n tmpSpectra.push(...spectra);\r\n this.props.spectraViewer.setState(\r\n {\r\n rawSpectraLoaded: true,\r\n currentlyShownData: null,\r\n rawSpectra: tmpSpectra,\r\n },\r\n () => this.showRawSpectra()\r\n );\r\n };\r\n\r\n /**\r\n * Sets the top-level Apache ELineChart\r\n * @param {ELineChart} chart\r\n * @returns nothing when no chart is given.\r\n */\r\n setChart = (chart) => {\r\n this.setState({ chart });\r\n if (chart === null) {\r\n return;\r\n }\r\n // update areas while drawing for settings content in side bar\r\n chart.on(\"brush\", (params) => {\r\n this.props.spectraViewer.updateAreas(params.areas);\r\n });\r\n\r\n // Toggling a single spectrum\r\n // update checked spectras for spectra tab content in side bar\r\n chart.on(\"legendselectchanged\", (params) => {\r\n this.validateDatasets(params);\r\n });\r\n\r\n // Selecting all spectra\r\n // Update checked spectras for spectra tab content in side bar\r\n chart.on(\"legendselectall\", (params) => {\r\n this.validateDatasets(params);\r\n });\r\n\r\n // Inversing all spectra\r\n // Update checked spectras for spectra tab content in side bar\r\n chart.on(\"legendinverseselect\", (params) => {\r\n this.validateDatasets(params);\r\n });\r\n\r\n //reset to show all spectra\r\n chart.on(\"restore\", () => {\r\n this.setState({\r\n datasets: this.state.datasets.map((item) => {\r\n item.checked = true;\r\n return item;\r\n }),\r\n });\r\n });\r\n };\r\n\r\n validateDatasets = (params) => {\r\n let datasets = JSON.parse(JSON.stringify(this.state.datasets));\r\n let rawSpectra = this.props.spectraViewer.rawSpectra;\r\n let analysisResults = this.props.spectraViewer.analysisResults;\r\n\r\n for (let i = 0; i < datasets.length; i++) {\r\n let key = datasets[i].name;\r\n let checked = params.selected[key];\r\n // undefined inputs are defaulted to true by the echart.\r\n // only once specifically set, they have a boolean value.\r\n if (typeof checked !== \"undefined\") {\r\n datasets[i].checked = checked;\r\n } else {\r\n checked = true; // checked is used further down\r\n datasets[i].checked = checked;\r\n }\r\n\r\n if (this.props.spectraViewer.currentlyShownData === \"raw_spectra\") {\r\n // Update raw spectra\r\n rawSpectra.filter((spectrum) => spectrum.name === key)[0].checked =\r\n checked;\r\n } else if (\r\n this.props.spectraViewer.currentlyShownData === \"analysis_results\"\r\n ) {\r\n // Update analysis results\r\n analysisResults.filter((spectrum) => spectrum.name === key)[0].checked =\r\n checked;\r\n }\r\n }\r\n this.setState({ datasets });\r\n this.props.spectraViewer.setState({ rawSpectra, analysisResults });\r\n this.forceUpdate();\r\n };\r\n\r\n /**\r\n * Sets options for graph, including series as data\r\n * @param {array} series Datavalues for series\r\n * @param {function} callback Checks on success of this function. Is fed true or false.\r\n */\r\n setSeries = async (series, callback) => {\r\n // Graph settings\r\n let option = {\r\n animation: false,\r\n tooltip: {\r\n trigger: \"axis\",\r\n axisPointer: {\r\n type: \"cross\",\r\n },\r\n },\r\n legend: {\r\n show: false,\r\n data: series.map((item) => item.name),\r\n },\r\n grid: {\r\n left: 20,\r\n right: 20,\r\n top: 60,\r\n containLabel: true,\r\n tooltip: {\r\n show: true,\r\n },\r\n },\r\n toolbox: {\r\n dataZoom: {\r\n show: true,\r\n },\r\n feature: {\r\n dataZoom: {\r\n yAxisIndex: \"none\",\r\n },\r\n brush: {\r\n type: [\"lineX\", \"keep\", \"clear\"],\r\n },\r\n restore: {},\r\n saveAsImage: {},\r\n },\r\n //orient: \"vertical\",\r\n itemSize: 26,\r\n iconStyle: {\r\n borderWidth: 3,\r\n borderColor: \"rgba(0, 0, 0, 0.54)\",\r\n },\r\n right: 20,\r\n },\r\n brush: {\r\n xAxisIndex: \"all\",\r\n brushLink: \"all\",\r\n outOfBrush: {\r\n colorAlpha: 0.1,\r\n },\r\n },\r\n xAxis: {\r\n type: \"value\",\r\n scale: true,\r\n // minInterval: 0.01,\r\n axisLabel: {\r\n show: true,\r\n interval: 1,\r\n },\r\n },\r\n yAxis: {\r\n type: \"value\",\r\n // minInterval: 0.01,\r\n },\r\n dataZoom: [\r\n {\r\n type: \"inside\",\r\n disabled: false,\r\n },\r\n {},\r\n ],\r\n series: series,\r\n };\r\n this.state.chart.setOption(option);\r\n\r\n // Update graph contents\r\n let success = await this.updateChartData(series);\r\n callback(success);\r\n };\r\n\r\n /**\r\n * Updates graph contents.\r\n * @param {Array} series Datavalues for graphs.\r\n * @returns {bool} Success status of data update.\r\n */\r\n updateChartData = async (series) => {\r\n let minX = 10000000;\r\n let maxX = -10000000;\r\n let length = 0;\r\n series.forEach((item) => {\r\n minX = Math.min(minX, item.data[0][0]);\r\n maxX = Math.max(maxX, item.data[item.data.length - 1][0]);\r\n length = Math.max(length, item.data.length);\r\n });\r\n\r\n const xAxisData = {\r\n minX: minX,\r\n maxX: maxX,\r\n stepX: 0.1,\r\n length: length,\r\n };\r\n\r\n this.setState({ datasets: series, xAxisData });\r\n if (series.length > 0) {\r\n series.forEach((dataset) => {\r\n if (!dataset.checked) {\r\n this.state.chart.dispatchAction({\r\n type: \"legendUnSelect\",\r\n name: dataset.name,\r\n });\r\n }\r\n });\r\n }\r\n\r\n if (this.props.spectraViewer.areas.length > 0) {\r\n this.state.chart.dispatchAction({\r\n type: \"brush\",\r\n areas: this.props.spectraViewer.areas,\r\n });\r\n }\r\n this.props.spectraViewer.setMaxScores();\r\n return true;\r\n };\r\n\r\n /**\r\n * Toggles a selected dataseries on or off,\r\n * influencing the maximum amount of settable scores,\r\n * and limiting those to be included in analysis/PCA training.\r\n * @param {string} name Name of the datasereies to toggle\r\n */\r\n toggleLegend = (name) => {\r\n this.state.chart.dispatchAction({\r\n type: \"legendToggleSelect\",\r\n name: name,\r\n });\r\n this.props.spectraViewer.setMaxScores();\r\n };\r\n\r\n /**\r\n * Toggles all dataseries on or off,\r\n * including them all in the analysis/PCA training.\r\n * @param {string} name Name of the dataseries to toggle\r\n */\r\n toggleAll = () => {\r\n let spectra = this.state.datasets;\r\n this.state.chart.dispatchAction({\r\n type: \"legendAllSelect\",\r\n });\r\n\r\n // Deactivate all spectra should all be activated\r\n if (spectra.every((spectrum) => spectrum.checked)) {\r\n this.state.chart.dispatchAction({\r\n type: \"legendInverseSelect\",\r\n });\r\n }\r\n this.props.spectraViewer.setMaxScores();\r\n };\r\n\r\n setSelectedRow = (row) => {\r\n this.setState({ selectedRow: row });\r\n };\r\n\r\n onUpdateResultChartTypes = (resultChartTypes) => {\r\n this.setState({ resultChartTypes });\r\n };\r\n\r\n onUpdateFileParams = (fileParams) => {\r\n this.setState({ fileParams });\r\n };\r\n\r\n createProjectModel = (project, user) => {\r\n const projectModel = {\r\n name: project.name,\r\n user: user,\r\n id: project.id,\r\n readableId: project.readableId,\r\n metaData: project.metaData,\r\n type: project.type,\r\n tools: project.viewerConfig.project.tools,\r\n job: project.viewerConfig.project.job,\r\n files: project.files,\r\n };\r\n return projectModel;\r\n };\r\n\r\n /**\r\n * Prepares the data from state for saving.\r\n * Saves project accordingly.\r\n */\r\n saveFunction = () => {\r\n if (this.state) {\r\n let project = this.state.project;\r\n project.simpleParams = JSON.stringify({\r\n xAxisData: this.state.xAxisData,\r\n useSavedCalcs: this.props.spectraViewer.useSavedCalcs,\r\n areas: this.props.spectraViewer.areas.map((area) => {\r\n // Remove refs before saving\r\n area.refs = [];\r\n return area;\r\n }),\r\n datasets: this.state.datasets,\r\n operationSets: this.props.spectraViewer.operationSets,\r\n fileParams: this.state.fileParams,\r\n passingCriteria: this.props.spectraViewer.passingCriteria,\r\n passingCriteria_idx: this.props.spectraViewer.passingCriteria_idx,\r\n passingCriteria_min: this.props.spectraViewer.passingCriteria_min,\r\n passingCriteria_max: this.props.spectraViewer.passingCriteria_max,\r\n });\r\n Backend.saveProject(project, (data) => {\r\n if (data.success) {\r\n window.showSuccessSnackbar(\"Project saved succesfully!\");\r\n } else {\r\n window.showErrorSnackbar(\"Project could not be saved!\");\r\n }\r\n });\r\n }\r\n };\r\n\r\n onChangeMetaData = (field, e) => {\r\n this.setState((prevState) => {\r\n let project = Object.assign({}, prevState.project);\r\n project.metaData[field] = e;\r\n return { project };\r\n });\r\n };\r\n\r\n handleMainTabChange = (event, value) => {\r\n this.setState({ activeMainTab: value });\r\n };\r\n\r\n toggleLeftTableContainer = () => {\r\n this.setState({ showResultTable: !this.state.showResultTable });\r\n setTimeout(() => this.updateDimensions(), 10);\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const {\r\n initialized,\r\n project,\r\n activeMainTab,\r\n showResultTable,\r\n leftTableWidth,\r\n sideBarWidth,\r\n } = this.state;\r\n\r\n return (\r\n \r\n
    \r\n {project && (\r\n \r\n {initialized || this.state.project.type === \"ESREvaluation\" ? (\r\n \r\n \r\n \r\n\r\n {this.state.project.type !== \"ESREvaluation\" && (\r\n \r\n )}\r\n \r\n\r\n \r\n \r\n this.setState(value)}\r\n />\r\n
    \r\n {\r\n this.setState({\r\n leftTableWidth: width,\r\n });\r\n this.updateDimensions();\r\n }}\r\n />\r\n
    \r\n
    \r\n \r\n \r\n\r\n \r\n \r\n this.props.spectraViewer.setState({\r\n currentlyShownData: value,\r\n })\r\n }\r\n />\r\n \r\n
    \r\n {\r\n this.setState({\r\n bottomTableHeight: height,\r\n });\r\n this.updateDimensions();\r\n }}\r\n />\r\n
    \r\n this.setState(value)}\r\n />\r\n \r\n \r\n \r\n ) : (\r\n \r\n this.setState({ initialized: value })\r\n }\r\n save={this.saveFunction}\r\n />\r\n )}\r\n \r\n )}\r\n \r\n
    \r\n {\r\n this.setState({\r\n sideBarWidth: width,\r\n });\r\n this.updateDimensions();\r\n }}\r\n />\r\n
    \r\n
    \r\n this.saveFunction()}\r\n showResultTable={this.state.showResultTable}\r\n toggleLeftTableContainer={() => this.toggleLeftTableContainer()}\r\n />\r\n
    \r\n
    \r\n {project && (\r\n this.setState({ initialized: value })}\r\n maxScores={this.state.maxScores}\r\n toggleLegend={this.toggleLegend}\r\n toggleAll={this.toggleAll}\r\n onChangeMetaData={this.onChangeMetaData}\r\n requestData={this.requestData}\r\n onSave={() => this.saveFunction()}\r\n showRawSpectra={this.showRawSpectra}\r\n showAnalysisResults={this.showAnalysisResults}\r\n throwError={(error) => window.showErrorSnackbar(error)}\r\n updateChartData={this.setSeries}\r\n />\r\n )}\r\n
    \r\n \r\n );\r\n }\r\n}\r\n\r\nSpectraViewer.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n id: PropTypes.string,\r\n spinloader: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(\r\n withSpinloader(withSpectraViewer(withStyles(styles)(SpectraViewer)))\r\n);\r\n","import * as React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport Stack from \"@mui/material/Stack\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport { AdapterDateFns } from \"@mui/x-date-pickers/AdapterDateFns\";\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { DesktopDatePicker } from \"@mui/x-date-pickers/DesktopDatePicker\";\r\n\r\nconst styles = () => ({\r\n root: {\r\n width: 150,\r\n margin: \"0 5px\",\r\n display: \"inline-block\",\r\n },\r\n});\r\n\r\nfunction DayPicker(props) {\r\n const { classes } = props;\r\n const handleChange = (newValue) => {\r\n props.updateTable(newValue);\r\n };\r\n\r\n return (\r\n \r\n \r\n {\r\n return ;\r\n }}\r\n />\r\n \r\n \r\n );\r\n}\r\n\r\nDayPicker.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n date: PropTypes.object.isRequired,\r\n firstDate: PropTypes.object.isRequired,\r\n updateTable: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(DayPicker);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { IconButton } from \"@mui/material\";\r\nimport { NavigateBefore, NavigateNext } from \"@mui/icons-material\";\r\nimport DayPicker from \"./DayPicker\";\r\n\r\nconst styles = () => ({\r\n root: {\r\n userSelect: \"none\",\r\n display: \"inline-block\",\r\n },\r\n navButton: {\r\n position: \"relative\",\r\n top: 12,\r\n },\r\n});\r\n\r\nconst isSameDay = (someDate, compareDate) => {\r\n return (\r\n someDate.getDate() == compareDate.getDate() &&\r\n someDate.getMonth() == compareDate.getMonth() &&\r\n someDate.getFullYear() == compareDate.getFullYear()\r\n );\r\n};\r\n\r\nfunction DayPagination(props) {\r\n const handleBefore = () => {\r\n let date = new Date(props.date.getTime());\r\n date.setDate(date.getDate() - 1);\r\n props.updateTable(date);\r\n };\r\n\r\n const handleNext = () => {\r\n let date = new Date(props.date.getTime());\r\n date.setDate(date.getDate() + 1);\r\n props.updateTable(date);\r\n };\r\n const { classes } = props;\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n}\r\n\r\nDayPagination.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n date: PropTypes.object.isRequired,\r\n firstDate: PropTypes.object.isRequired,\r\n updateTable: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(DayPagination);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport clsx from \"clsx\";\r\nimport { styled } from \"@mui/material/styles\";\r\nimport { TableCell, Button } from \"@mui/material\";\r\nimport { AutoSizer, Column, Table } from \"react-virtualized\";\r\nimport { convertDate } from \"../../common/utils/Localization\";\r\nimport DayPagination from \"./DayPagination\";\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nconst classes = {\r\n flexContainer: \"ReactVirtualizedDemo-flexContainer\",\r\n tableRow: \"ReactVirtualizedDemo-tableRow\",\r\n tableRowHover: \"ReactVirtualizedDemo-tableRowHover\",\r\n tableCell: \"ReactVirtualizedDemo-tableCell\",\r\n noClick: \"ReactVirtualizedDemo-noClick\",\r\n};\r\n\r\nconst styles = () => ({\r\n root: {\r\n margin: 10,\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"auto 1fr\",\r\n },\r\n inlineBtn: {\r\n position: \"relative\",\r\n top: \"12px\",\r\n },\r\n\r\n // temporary right-to-left patch, waiting for\r\n // https://github.com/bvaughn/react-virtualized/issues/454\r\n \"& .ReactVirtualized__Table__headerRow\": {\r\n paddingRight: undefined,\r\n },\r\n [`& .${classes.flexContainer}`]: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n boxSizing: \"border-box\",\r\n },\r\n [`& .${classes.tableRow}`]: {\r\n cursor: \"pointer\",\r\n },\r\n [`& .${classes.tableCell}`]: {\r\n flex: 1,\r\n },\r\n [`& .${classes.noClick}`]: {\r\n cursor: \"initial\",\r\n },\r\n});\r\n\r\nclass MuiVirtualizedTable extends React.PureComponent {\r\n static defaultProps = {\r\n headerHeight: 48,\r\n rowHeight: 48,\r\n };\r\n\r\n getRowClassName = ({ index }) => {\r\n const { onRowClick } = this.props;\r\n\r\n return clsx(classes.tableRow, classes.flexContainer, {\r\n [classes.tableRowHover]: index !== -1 && onRowClick != null,\r\n });\r\n };\r\n\r\n cellRenderer = ({ cellData, columnIndex }) => {\r\n const { columns, rowHeight, onRowClick } = this.props;\r\n return (\r\n \r\n {cellData}\r\n \r\n );\r\n };\r\n\r\n headerRenderer = ({ label, columnIndex }) => {\r\n const { headerHeight, columns } = this.props;\r\n\r\n return (\r\n \r\n {label}\r\n \r\n );\r\n };\r\n\r\n render() {\r\n const { columns, rowHeight, headerHeight, ...tableProps } = this.props;\r\n return (\r\n \r\n {({ height, width }) => (\r\n \r\n {columns.map(({ dataKey, ...other }, index) => {\r\n return (\r\n \r\n this.headerRenderer({\r\n ...headerProps,\r\n columnIndex: index,\r\n })\r\n }\r\n className={classes.flexContainer}\r\n cellRenderer={this.cellRenderer}\r\n dataKey={dataKey}\r\n {...other}\r\n />\r\n );\r\n })}\r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nMuiVirtualizedTable.propTypes = {\r\n columns: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n dataKey: PropTypes.string.isRequired,\r\n label: PropTypes.string.isRequired,\r\n numeric: PropTypes.bool,\r\n width: PropTypes.number.isRequired,\r\n })\r\n ).isRequired,\r\n headerHeight: PropTypes.number,\r\n onRowClick: PropTypes.func,\r\n rowHeight: PropTypes.number,\r\n};\r\n\r\nconst VirtualizedTable = styled(MuiVirtualizedTable)(styles);\r\n\r\nconst columns = [\r\n { dataKey: \"time\", label: \"Time\", width: 200 },\r\n { dataKey: \"name\", label: \"Name\", width: 120 },\r\n { dataKey: \"actionType\", label: \"Action Type\", width: 120 },\r\n { dataKey: \"action\", label: \"Action\", width: 500 },\r\n];\r\n\r\nfunction UserHistoryTable(props) {\r\n const { classes, userActions } = props;\r\n\r\n let rows = [];\r\n if (userActions) {\r\n rows = userActions.map((userAction, idx) => {\r\n userAction.id = idx;\r\n userAction.time = convertDate(userAction.time).toLocaleString();\r\n return userAction;\r\n });\r\n }\r\n\r\n const onDownload = (date) => {\r\n Backend.downloadUserActions(date);\r\n };\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n onDownload(props.date)}\r\n >\r\n Download as CSV File\r\n \r\n
    \r\n
    \r\n rows[index]}\r\n columns={columns}\r\n />\r\n
    \r\n
    \r\n );\r\n}\r\n\r\nUserHistoryTable.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n date: PropTypes.object.isRequired,\r\n firstDate: PropTypes.object.isRequired,\r\n userActions: PropTypes.array.isRequired,\r\n updateTable: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(UserHistoryTable);\r\n","import React, { useState, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport Backend from \"../common/utils/Backend\";\r\nimport { Paper } from \"@mui/material\";\r\n\r\nimport UserHistoryTable from \"./components/UserHistoryTable\";\r\nimport { convertDate } from \"../common/utils/Localization\";\r\n\r\nconst styles = () => ({\r\n root: {\r\n padding: 10,\r\n height: \"100%\",\r\n },\r\n paper: {\r\n height: \"100%\",\r\n width: 1000,\r\n padding: \"10px 10px 25px\",\r\n margin: \"0 auto\",\r\n },\r\n});\r\n\r\nfunction UserHistoryPage(props) {\r\n const [userActions, setUserActions] = useState([]);\r\n const [date, setDate] = useState(new Date());\r\n const [firstDate, setFirstDate] = useState(new Date());\r\n\r\n const updateTable = (date) => {\r\n Backend.getUserActions(date, (res) => {\r\n if (res.status === 403) {\r\n window.showErrorSnackbar(\"No permission to access user history\");\r\n } else {\r\n setFirstDate(convertDate(res.firstDate));\r\n setDate(convertDate(res.date));\r\n setUserActions(res.userActions);\r\n }\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n updateTable(new Date());\r\n }, []);\r\n const { classes } = props;\r\n return (\r\n
    \r\n \r\n \r\n \r\n
    \r\n );\r\n}\r\n\r\nUserHistoryPage.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withRouter(withStyles(styles)(UserHistoryPage));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { IconButton, Tooltip, Checkbox, FormControlLabel } from \"@mui/material\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport SketchColorPicker from \"../../common/components/SketchColorPicker\";\r\n\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport {\r\n faChartArea,\r\n faUndo,\r\n faArrowsAltH,\r\n faChartLine,\r\n} from \"@fortawesome/free-solid-svg-icons\";\r\nimport { GetApp, Publish } from \"@mui/icons-material\";\r\n\r\nimport ToggleButton from \"@mui/material/ToggleButton\";\r\nimport ToggleButtonGroup from \"@mui/material/ToggleButtonGroup\";\r\nimport \"./../../css/histogram.css\";\r\n\r\nconst styles = {\r\n root: {\r\n overflow: \"visible\",\r\n },\r\n chartContainer: {\r\n height: 120,\r\n position: \"relative\",\r\n marginBottom: 0,\r\n },\r\n rangeSlider: {\r\n bottom: 12,\r\n },\r\n actionButton: {\r\n display: \"inline-block\",\r\n border: \"none\",\r\n background: \"rgba(0, 0, 0, 0.2)\",\r\n marginRight: \"2px\",\r\n height: \"35px\",\r\n },\r\n toggleContainer: {\r\n boxShadow: \"none\",\r\n display: \"inline-block\",\r\n verticalAlign: \"top\",\r\n },\r\n title: {\r\n padding: 5,\r\n fontSize: 14,\r\n },\r\n toolbar: {\r\n width: \"100%\",\r\n },\r\n toolButton: {\r\n fontSize: 18,\r\n },\r\n toolButtonRight: {\r\n fontSize: 18,\r\n float: \"right\",\r\n },\r\n grow: {\r\n flexGrow: 1,\r\n },\r\n gradientBar: {\r\n height: 5,\r\n width: \"100%\",\r\n background: \"linear-gradient(90deg, black, white)\",\r\n },\r\n dragIndicator: {\r\n color: \"#757575\",\r\n position: \"absolute\",\r\n top: 5,\r\n right: 5,\r\n cursor: \"grab\",\r\n },\r\n grabbing: {\r\n cursor: \"grabbing\",\r\n },\r\n color: {\r\n borderRadius: \"2px\",\r\n },\r\n channelLabel: {\r\n minWidth: \"42px\",\r\n lineHeight: \"18px\",\r\n },\r\n popover: {\r\n position: \"absolute\",\r\n zIndex: \"2\",\r\n },\r\n cover: {\r\n position: \"fixed\",\r\n top: \"0px\",\r\n right: \"0px\",\r\n bottom: \"0px\",\r\n left: \"0px\",\r\n },\r\n toggleBtnContent: {\r\n position: \"relative\",\r\n },\r\n};\r\n\r\n// Histogram Scale Enum\r\nconst HistogramScale = {\r\n LINEAR: \"linear\",\r\n LOGARITHMIC: \"logarithmic\",\r\n};\r\n\r\n/**\r\n * convert hex colors to rgb values with alpha\r\n * @param {String} hex Hax Color Code\r\n * @param {Number} alpha Alpha value\r\n */\r\nfunction hexToRGB(hex, alpha) {\r\n var r = parseInt(hex.slice(1, 3), 16),\r\n g = parseInt(hex.slice(3, 5), 16),\r\n b = parseInt(hex.slice(5, 7), 16);\r\n\r\n if (alpha) {\r\n return \"rgba(\" + r + \", \" + g + \", \" + b + \", \" + alpha + \")\";\r\n } else {\r\n return \"rgb(\" + r + \", \" + g + \", \" + b + \")\";\r\n }\r\n}\r\n\r\nfunction validateGamma(gamma) {\r\n return gamma > 2 ? Math.pow(gamma, 1 / 4) : gamma;\r\n}\r\n\r\n/**\r\n * Configuration of a Fluorescence Channel\r\n */\r\nexport class ChannelsConfig {\r\n constructor(omeChannels) {\r\n let nChannels = omeChannels.length;\r\n this.nChannels = nChannels;\r\n\r\n this.channels = [];\r\n for (let i = 0; i < nChannels; i++) {\r\n let color = omeChannels[i].color;\r\n if (color !== -1) {\r\n if (!isNaN(color)) {\r\n color = parseInt(color, 10);\r\n // handle negative color integers\r\n if (color < 0) color = 16777216 - color;\r\n // conver decimal to hex\r\n color = color.toString(16);\r\n // add leading zeros\r\n while (color.length < 6 || color.length % 2 !== 0) {\r\n color = \"0\" + color;\r\n }\r\n // add leading #\r\n color = \"#\" + color;\r\n }\r\n }\r\n let channelName =\r\n omeChannels[i].name === \"TL Brightfield\" ? \"RGB\" : omeChannels[i].name;\r\n\r\n channelName =\r\n channelName === \"\"\r\n ? i === 0\r\n ? \"R\"\r\n : i === 1\r\n ? \"G\"\r\n : \"B\"\r\n : channelName;\r\n this.channels[i] = {\r\n color: color,\r\n enabled: true,\r\n min: 250 * omeChannels[i].low,\r\n max: 250 * Math.min(omeChannels[i].high, 1),\r\n gamma: validateGamma(omeChannels[i].gamma),\r\n name: omeChannels[i].name,\r\n type: omeChannels[i].type,\r\n };\r\n }\r\n\r\n // default scaling is linear\r\n this.scale = HistogramScale.LOGARITHMIC;\r\n }\r\n}\r\n\r\nclass Histogram extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n let stateGamma = this.props.histogramConfig.channels[0].gamma;\r\n if (stateGamma > 2) {\r\n stateGamma = Math.pow(stateGamma, 1 / 4);\r\n }\r\n this._isMounted = false;\r\n this.state = {\r\n originalHistogramConfig: JSON.parse(\r\n JSON.stringify(props.histogramConfig)\r\n ),\r\n selectedSingleChannel: -1,\r\n selectedChannels: this.getEnabledChannels(),\r\n histograms: [],\r\n datasets: [],\r\n displayColorPicker: false,\r\n singleChannelMode: false,\r\n channelSelectMode: this.props.channelSelectMode,\r\n lastClickedChannel: -1,\r\n sliderMode: false,\r\n leftGammaValue: this.gammaFunction(0.25, stateGamma),\r\n rightGammaValue: this.gammaFunction(0.75, stateGamma),\r\n min:\r\n props.histogramConfig.channels[0].min > 250\r\n ? 0\r\n : props.histogramConfig.channels[0].min,\r\n max:\r\n props.histogramConfig.channels[0].max > 255\r\n ? 250\r\n : props.histogramConfig.channels[0].max,\r\n gamma: stateGamma,\r\n isBrightfield: this.isBrightfield(),\r\n };\r\n // load small images from backend and calculate histogram\r\n for (let c = 0; c < props.histogramConfig.nChannels; c++) {\r\n let img = new Image();\r\n img.src = Backend.renderRegion({\r\n id: props.id,\r\n page: c, // TODO calc page for complex images (timeframes and z stack)\r\n lv: 0,\r\n x: 0,\r\n y: 0,\r\n debug: false,\r\n });\r\n // wait until image is loaded succesfully\r\n img.onload = () => {\r\n // calcualte histogram\r\n let histograms = this.state.histograms;\r\n if (this.state.isBrightfield) {\r\n histograms[0] = this.calcHist(img, 0);\r\n histograms[1] = this.calcHist(img, 1);\r\n histograms[2] = this.calcHist(img, 2);\r\n } else {\r\n histograms[c] = this.calcHist(img, 0);\r\n }\r\n\r\n this.setMountedState({ histograms: histograms });\r\n if (this._isMounted) this.forceUpdate();\r\n };\r\n }\r\n }\r\n\r\n isBrightfield() {\r\n let channels = this.props.histogramConfig.channels;\r\n if (channels.length > 1) return false;\r\n return (\r\n channels[0].type === \"brightfield\" ||\r\n channels[0].name === \"TL Brightfield\" ||\r\n channels[0].name === \"RGB\"\r\n );\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n const histogramConfig = this.props.histogramConfig;\r\n this.drawGammaLine();\r\n\r\n // find all selected channels and put in channels array\r\n let channels = this.props.histogramConfig.channels\r\n .map((val, index) => (val.enabled ? index : null))\r\n .filter((val) => val !== null);\r\n if (this.state.isBrightfield) {\r\n channels = [-1];\r\n }\r\n let stateObject = {\r\n selectedChannels: channels,\r\n dimensions: {\r\n width: this.container.offsetWidth,\r\n height: 120,\r\n },\r\n };\r\n\r\n // if one channel selected, set min max state of this channel\r\n if (channels.length === 1 && channels[0] !== -1) {\r\n stateObject.min = histogramConfig.channels[channels[0]].min;\r\n stateObject.max = histogramConfig.channels[channels[0]].max;\r\n stateObject.gamma = validateGamma(\r\n histogramConfig.channels[channels[0]].gamma\r\n );\r\n }\r\n this.setMountedState(stateObject);\r\n }\r\n\r\n calcHist(img, channel) {\r\n // create a temporary canvas to convert our image into imagedata array\r\n let offScrCan = document.createElement(\"canvas\");\r\n offScrCan.width = img.width;\r\n offScrCan.height = img.height;\r\n let ctx1 = offScrCan.getContext(\"2d\");\r\n\r\n // draw image all over the canvas\r\n ctx1.drawImage(img, 0, 0, img.width, img.height);\r\n\r\n // read out image data array\r\n let imgData = ctx1.getImageData(0, 0, img.width, img.height).data;\r\n\r\n // step is 4 beacouse our data array is structured like this:\r\n // [r0,g0,b0,a0, r1,g1,b1,a1, r2,g2,b2,a2, ...]\r\n //let step = parseInt((img.width * img.height) / imgData.length, 10);\r\n //let step = 4;\r\n let step = parseInt(imgData.length / (img.width * img.height), 10);\r\n\r\n // create zeros array\r\n let histo = Array.from(Array(256), () => 1);\r\n let histo2 = Array.from(Array(256), () => 1);\r\n\r\n // count occuracys for each brightness value\r\n for (let i = 0, n = imgData.length; i < n - 1; i += step) {\r\n histo[imgData[i + channel]] += 1;\r\n }\r\n\r\n //interpolate histo values\r\n for (let i = 2; i < histo.length - 2; i++) {\r\n let sum = 0;\r\n let count = 0;\r\n for (let j = i - 2; j < i + 3; j++) {\r\n if (histo[j] > 1) {\r\n sum += histo[j];\r\n count += 1;\r\n }\r\n }\r\n if (count > 0) {\r\n histo2[i] = sum / count;\r\n } else {\r\n histo2[i] = histo[i];\r\n }\r\n }\r\n\r\n return histo2;\r\n }\r\n\r\n handleColorPickerClick = (e, index) => {\r\n this.setMountedState({\r\n selectedSingleChannel: index,\r\n displayColorPicker: !this.state.displayColorPicker,\r\n });\r\n let selectedChannels = this.state.selectedChannels;\r\n if (!selectedChannels.includes(index)) {\r\n selectedChannels.push(index);\r\n this.setMountedState({\r\n selectedChannels: selectedChannels,\r\n });\r\n }\r\n };\r\n\r\n handleColorPickerClose = () => {\r\n this.setMountedState({ displayColorPicker: false });\r\n };\r\n\r\n handleColorPickerChange = (color, channelIndex) => {\r\n if (this.state.selectedSingleChannel >= 0) {\r\n let newHistogramConfig = this.props.histogramConfig;\r\n newHistogramConfig.channels[channelIndex].color = color;\r\n this.props.onChange(newHistogramConfig);\r\n this.forceUpdateWithTimeout(10);\r\n }\r\n };\r\n\r\n handleLogLin() {\r\n let newHistogramConfig = this.props.histogramConfig;\r\n // toggle histogram scale\r\n Object.assign(newHistogramConfig, {\r\n scale:\r\n newHistogramConfig.scale === HistogramScale.LINEAR\r\n ? HistogramScale.LOGARITHMIC\r\n : HistogramScale.LINEAR,\r\n });\r\n\r\n this.props.onChange(newHistogramConfig);\r\n this.forceUpdateWithTimeout(10);\r\n }\r\n\r\n gammaFunction(x, gamma) {\r\n gamma = 2 - gamma;\r\n let y = gamma > 1 ? gamma ** 4 : gamma;\r\n return x ** y;\r\n }\r\n\r\n drawHistogramBackground() {\r\n const data = this.data;\r\n if (this.backgroundCanvas) {\r\n const max = 2 ** this.props.bitDepth - 1;\r\n let visibleStep = 50;\r\n switch (this.props.bitDepth) {\r\n case 10:\r\n visibleStep = 250;\r\n break;\r\n case 12:\r\n visibleStep = 1000;\r\n break;\r\n case 14:\r\n visibleStep = 2500;\r\n break;\r\n case 16:\r\n visibleStep = 15000;\r\n break;\r\n default:\r\n }\r\n let ctx = this.backgroundCanvas.getContext(\"2d\");\r\n let w = this.backgroundCanvas.width;\r\n let h = this.backgroundCanvas.height;\r\n ctx.clearRect(0, 0, w, h);\r\n ctx.beginPath();\r\n let step = (visibleStep * w) / max;\r\n ctx.font = \"12px Arial\";\r\n ctx.fillStyle = \"#ddd\";\r\n for (let s = step, i = 1; s < w; s += step, i++) {\r\n ctx.moveTo(s, 0);\r\n ctx.lineTo(s, h);\r\n ctx.fillText(i * visibleStep, s + 2, 12);\r\n }\r\n step = h / 5;\r\n for (let s = step; s < h; s += step) {\r\n ctx.moveTo(0, s);\r\n ctx.lineTo(w, s);\r\n }\r\n ctx.strokeStyle = \"#ddd\";\r\n ctx.closePath();\r\n ctx.stroke();\r\n\r\n let maxValues = 0;\r\n\r\n for (let i = 0; i < data.datasets.length; i++) {\r\n ctx.beginPath();\r\n for (let j = 0; j < data.datasets[i].data.length; j++) {\r\n maxValues = Math.max(maxValues, data.datasets[i].data[j]);\r\n }\r\n }\r\n\r\n for (let i = 0; i < data.datasets.length; i++) {\r\n ctx.beginPath();\r\n ctx.lineWidth = 2;\r\n ctx.strokeStyle = data.datasets[i].borderColor;\r\n ctx.fillStyle = data.datasets[i].backgroundColor;\r\n ctx.moveTo(0, h + 2);\r\n ctx.globalAlpha = 1.0;\r\n for (let j = 0; j < data.datasets[i].data.length; j++) {\r\n let count = data.datasets[i].data[j];\r\n let transformedCount = (h * count) / maxValues;\r\n ctx.lineTo(\r\n (j * w) / data.datasets[i].data.length,\r\n h - transformedCount\r\n );\r\n }\r\n ctx.lineTo(w, h + 2);\r\n ctx.fill(\"nonzero\");\r\n ctx.closePath();\r\n ctx.stroke();\r\n }\r\n }\r\n }\r\n\r\n drawGammaLine() {\r\n if (this.gammaCanvas) {\r\n const width = this.gammaCanvas.width;\r\n const height = this.gammaCanvas.height;\r\n let ctx = this.gammaCanvas.getContext(\"2d\");\r\n ctx.clearRect(0, 0, width, height);\r\n ctx.beginPath();\r\n ctx.moveTo(0, height);\r\n for (let i = 0; i < this.gammaCanvas.width; i++) {\r\n let x = i / this.gammaCanvas.width;\r\n let res = this.gammaFunction(x, this.state.gamma);\r\n ctx.lineTo(i, height - res * height);\r\n ctx.moveTo(i, height - res * height);\r\n }\r\n ctx.lineTo(this.gammaCanvas.width, 0);\r\n ctx.lineWidth = 3;\r\n ctx.strokeStyle = \"#FFFFFF\";\r\n ctx.closePath();\r\n ctx.stroke();\r\n }\r\n }\r\n\r\n // slider callback\r\n handleMinMaxRange(values, gamma) {\r\n let newHistogramConfig = this.props.histogramConfig;\r\n for (let selectedChannel of this.state.selectedChannels) {\r\n if (this.state.channelSelectMode === \"all\") {\r\n // change for all channels\r\n for (let channel of newHistogramConfig.channels) {\r\n channel.min = values[0];\r\n channel.max = values[1];\r\n channel.gamma = gamma;\r\n }\r\n } else {\r\n // change selected channel only\r\n newHistogramConfig.channels[selectedChannel].min = values[0];\r\n newHistogramConfig.channels[selectedChannel].max = values[1];\r\n newHistogramConfig.channels[selectedChannel].gamma = gamma;\r\n }\r\n }\r\n\r\n this.drawGammaLine();\r\n this.props.onChange(newHistogramConfig);\r\n this.forceUpdateWithTimeout(10);\r\n }\r\n\r\n forceUpdateWithTimeout = (delay) => {\r\n setTimeout(() => {\r\n if (this._isMounted) this.forceUpdate();\r\n }, delay);\r\n };\r\n\r\n handleGammaChange() {\r\n let newHistogramConfig = this.props.histogramConfig;\r\n for (let selectedChannel of this.state.selectedChannels) {\r\n // change selected channel only\r\n newHistogramConfig.channels[\r\n selectedChannel < 0 ? 0 : selectedChannel\r\n ].gamma = this.state.gamma;\r\n }\r\n this.props.onChange(newHistogramConfig);\r\n this.forceUpdateWithTimeout(10);\r\n }\r\n\r\n handleReset() {\r\n let isBrightfield = this.state.isBrightfield;\r\n let selectedChannels = this.state.selectedChannels;\r\n if (!isBrightfield) {\r\n let newHistogramConfig = this.props.histogramConfig;\r\n\r\n for (let i = 0; i < newHistogramConfig.channels.length; i++) {\r\n newHistogramConfig.channels[i].color =\r\n this.state.originalHistogramConfig.channels[i].color;\r\n }\r\n Object.assign(newHistogramConfig, {\r\n scale: HistogramScale.LOGARITHMIC,\r\n });\r\n this.scale = HistogramScale.LOGARITHMIC;\r\n selectedChannels = Array.from(\r\n Array(newHistogramConfig.channels.length),\r\n (x, index) => index\r\n );\r\n selectedChannels =\r\n selectedChannels.length > 0 && selectedChannels[0] === 0\r\n ? [-1]\r\n : selectedChannels;\r\n } else {\r\n selectedChannels = [0, 1, 2];\r\n }\r\n\r\n this.setMountedState({\r\n singleChannelMode: false,\r\n channelSelectMode: \"all\",\r\n selectedChannels: selectedChannels,\r\n min: 0,\r\n max: 2 ** this.props.bitDepth - 1,\r\n gamma: 1.0,\r\n leftGammaValue: 0.25,\r\n rightGammaValue: 0.75,\r\n });\r\n //this.props.onChange(newHistogramConfig);\r\n this.handleMinMaxRange([0, 250], 1.0);\r\n if (!isBrightfield) {\r\n this.updateChannels(selectedChannels);\r\n this.activateAllChannels();\r\n }\r\n }\r\n\r\n handleMinMaxFit() {\r\n const { histograms, selectedSingleChannel } = this.state;\r\n let min = 0;\r\n let max = 255;\r\n\r\n let histo = Array.from(Array(256), () => 0); //to do real 16 bit\r\n if (this.state.channelSelectMode === \"all\") {\r\n // merge all channel histograms\r\n for (let c = 0; c < histograms.length; c++) {\r\n for (let i = 0; i < histograms[c].length; i++) {\r\n histo[i] += histograms[c][i];\r\n }\r\n }\r\n } else {\r\n // use histogram of selected channel\r\n histo = histograms[selectedSingleChannel];\r\n }\r\n\r\n if (histo) {\r\n // accumulate all values\r\n let sum = histo.reduce((total, val) => total + val);\r\n\r\n // find left statistical border\r\n let leftSide = 0;\r\n for (min = 0; min < histo.length; min++) {\r\n leftSide += histo[min] / sum;\r\n if (leftSide > 0.0001) {\r\n break;\r\n }\r\n }\r\n\r\n // find right statistical border\r\n let rightSide = 0;\r\n for (max = 255; max >= 0; max--) {\r\n rightSide += histo[max] / sum;\r\n if (rightSide > 0.0001) {\r\n break;\r\n }\r\n }\r\n\r\n // apply calculated range\r\n this.handleMinMaxRange([min, max], this.state.gamma);\r\n this.setMountedState({\r\n min: min,\r\n max: max,\r\n });\r\n }\r\n }\r\n\r\n handleBestFit() {\r\n const { histograms, selectedSingleChannel } = this.state;\r\n let min = 0;\r\n let max = 255;\r\n\r\n let histo = Array.from(Array(256), () => 0);\r\n if (this.state.channelSelectMode === \"all\") {\r\n // merge all channel histograms\r\n for (let c = 0; c < histograms.length; c++) {\r\n for (let i = 0; i < histograms[c].length; i++) {\r\n histo[i] += histograms[c][i];\r\n }\r\n }\r\n } else {\r\n // use histogram of selected channel\r\n histo = histograms[selectedSingleChannel];\r\n }\r\n\r\n // accumulate all values\r\n let sum = histo.reduce((total, val) => total + val);\r\n\r\n // find left statistical border\r\n let leftSide = 0;\r\n for (min = 0; min < histo.length; min++) {\r\n leftSide += histo[min] / sum;\r\n if (leftSide > 0.0005) {\r\n break;\r\n }\r\n }\r\n\r\n // find right statistical border\r\n let rightSide = 0;\r\n for (max = 255; max >= 0; max--) {\r\n rightSide += histo[max] / sum;\r\n if (rightSide > 0.0005) {\r\n break;\r\n }\r\n }\r\n\r\n // apply calculated range\r\n this.handleMinMaxRange([min, max], this.state.gamma);\r\n this.setMountedState({\r\n min: min,\r\n max: max,\r\n });\r\n }\r\n\r\n activateAllChannels = () => {\r\n let selectedChannels = Array.from(\r\n Array(this.props.histogramConfig.nChannels),\r\n (x, index) => index\r\n );\r\n let validGamma = validateGamma(\r\n this.props.histogramConfig.channels[selectedChannels[0]].gamma\r\n );\r\n this.setMountedState({\r\n singleChannelMode: false,\r\n selectedSingleChannel: selectedChannels[0],\r\n selectedChannels: selectedChannels,\r\n channelSelectMode: \"all\",\r\n min:\r\n this.props.histogramConfig.channels[selectedChannels[0]].min > 250\r\n ? 0\r\n : this.props.histogramConfig.channels[selectedChannels[0]].min,\r\n max:\r\n this.props.histogramConfig.channels[selectedChannels[0]].max > 255\r\n ? 250\r\n : this.props.histogramConfig.channels[selectedChannels[0]].max,\r\n gamma: validGamma,\r\n leftGammaValue: this.gammaFunction(0.25, validGamma),\r\n rightGammaValue: this.gammaFunction(0.75, validGamma),\r\n });\r\n this.forceUpdateWithTimeout(10);\r\n this.props.changeChannelSelectMode(\"all\");\r\n this.updateChannels(selectedChannels);\r\n };\r\n\r\n changeChannelSelectMode = (e, value) => {\r\n value = value ? \"single\" : \"all\";\r\n let selectedChannels = this.state.selectedChannels;\r\n if (value !== \"all\") {\r\n selectedChannels = [Math.min.apply(Math, this.state.selectedChannels)];\r\n }\r\n let validGamma = validateGamma(\r\n this.props.histogramConfig.channels[selectedChannels[0]].gamma\r\n );\r\n this.setMountedState({\r\n singleChannelMode: value === \"single\",\r\n selectedSingleChannel: selectedChannels[0],\r\n selectedChannels: selectedChannels,\r\n channelSelectMode: value,\r\n min:\r\n this.props.histogramConfig.channels[selectedChannels[0]].min > 250\r\n ? 0\r\n : this.props.histogramConfig.channels[selectedChannels[0]].min,\r\n max:\r\n this.props.histogramConfig.channels[selectedChannels[0]].max > 255\r\n ? 250\r\n : this.props.histogramConfig.channels[selectedChannels[0]].max,\r\n gamma: validGamma,\r\n leftGammaValue: this.gammaFunction(0.25, validGamma),\r\n rightGammaValue: this.gammaFunction(0.75, validGamma),\r\n });\r\n this.props.changeChannelSelectMode(value);\r\n this.updateChannels(selectedChannels);\r\n };\r\n\r\n changeChannel = (value) => {\r\n //prevent deselecting all\r\n if (value.length === 0) return;\r\n\r\n if (this.state.channelSelectMode === \"single\") {\r\n value = value.filter((v) => v !== this.state.selectedChannels[0]);\r\n }\r\n let validGamma = validateGamma(\r\n this.props.histogramConfig.channels[value[0]].gamma\r\n );\r\n this.setMountedState({\r\n selectedSingleChannel: value[0],\r\n selectedChannels: value,\r\n min:\r\n this.props.histogramConfig.channels[value[0]].min > 250\r\n ? 0\r\n : this.props.histogramConfig.channels[value[0]].min,\r\n max:\r\n this.props.histogramConfig.channels[value[0]].max > 255\r\n ? 250\r\n : this.props.histogramConfig.channels[value[0]].max,\r\n gamma: validGamma,\r\n leftGammaValue: this.gammaFunction(0.25, validGamma),\r\n rightGammaValue: this.gammaFunction(0.75, validGamma),\r\n });\r\n\r\n this.updateChannels(value);\r\n };\r\n\r\n /**\r\n * Updates Channel Comfiguration in histogram like colors, etc.\r\n * @param {Number[]} selectedChannels Selected Channel Indices\r\n */\r\n updateChannels(selectedChannels) {\r\n if (selectedChannels.length > 0 && selectedChannels[0] === -1) {\r\n selectedChannels = [0];\r\n }\r\n // hide or show channel layer\r\n let newHistogramConfig = this.props.histogramConfig;\r\n for (let i = 0; i < newHistogramConfig.channels.length; i++) {\r\n newHistogramConfig.channels[i].enabled = selectedChannels.includes(i)\r\n ? true\r\n : false;\r\n }\r\n this.props.onChange(newHistogramConfig);\r\n this.forceUpdateWithTimeout(10);\r\n }\r\n\r\n getEnabledChannels() {\r\n let selectedChannels = [];\r\n for (let i = 0; i < this.props.histogramConfig.length; i++) {\r\n if (this.props.histogramConfig.channels[i].enabled) {\r\n selectedChannels.push(i);\r\n }\r\n }\r\n return selectedChannels.length > 0 ? selectedChannels : [-1];\r\n }\r\n\r\n updateRange(e) {\r\n if (!this.state.lastX) {\r\n this.setMountedState({ lastX: e.clientX });\r\n return;\r\n }\r\n if (this.state.middleBarActive) {\r\n let deltaX =\r\n (255 * (e.clientX - this.state.lastX)) / this.state.dimensions.width;\r\n let min = this.state.min;\r\n let max = this.state.max;\r\n if (deltaX < 0) {\r\n let new_min = Math.max(0, min + deltaX);\r\n deltaX = min > 0 ? new_min - min : 0;\r\n } else {\r\n let new_max = Math.min(this.state.dimensions.width, max + deltaX);\r\n deltaX = new_max < 255 ? new_max - max : 255 - max;\r\n }\r\n min = Math.max(0, min + deltaX);\r\n max = Math.min(255, max + deltaX);\r\n this.setMountedState({\r\n min: min,\r\n max: max,\r\n lastX: e.clientX,\r\n });\r\n }\r\n }\r\n\r\n renderHistogram() {\r\n const { histogramConfig } = this.props;\r\n const { histograms, dimensions } = this.state;\r\n const data = this.data;\r\n\r\n if (data.datasets.length === 0) {\r\n data.datasets = this.state.datasets;\r\n }\r\n if (data.datasets.length === 0) {\r\n return null;\r\n }\r\n if (histogramConfig.scale === HistogramScale.LOGARITHMIC) {\r\n data.datasets = data.datasets.map((dataset) => {\r\n dataset.data = dataset.data.map((p) => 10 * Math.log(p));\r\n return dataset;\r\n });\r\n }\r\n\r\n if (histograms.length === 0) {\r\n return (\r\n \r\n );\r\n }\r\n return (\r\n {\r\n e.preventDefault();\r\n }}\r\n onMouseMove={(e) => {\r\n if (e.buttons === 1) {\r\n this.updateRange(e);\r\n } else {\r\n if (\r\n this.state.leftBarActive ||\r\n this.state.middleBarActive ||\r\n this.state.rightBarActive\r\n ) {\r\n this.setMountedState({\r\n middleBarActive: false,\r\n });\r\n }\r\n }\r\n }}\r\n onMouseUp={() => {\r\n this.handleMinMaxRange(\r\n [this.state.min, this.state.max],\r\n this.state.gamma\r\n );\r\n }}\r\n >\r\n {dimensions && (\r\n \r\n {\r\n this.backgroundCanvas = c;\r\n this.drawHistogramBackground();\r\n }}\r\n />\r\n {\r\n this.setMountedState({\r\n middleBarActive: true,\r\n lastX: e.clientX,\r\n });\r\n }}\r\n >\r\n {/* Line */}\r\n {\r\n this.gammaCanvas = c;\r\n this.drawGammaLine();\r\n }}\r\n />\r\n
    \r\n (this.leftGamma = c)}\r\n value={this.state.leftGammaValue}\r\n onMouseDown={(e) => {\r\n e.stopPropagation();\r\n }}\r\n onChange={() => {\r\n let x = 0.25;\r\n let res = this.leftGamma.value;\r\n let gamma = Math.log(res) / Math.log(x);\r\n if (gamma > 1) {\r\n gamma = gamma ** 0.25;\r\n }\r\n gamma = 2 - gamma;\r\n this.setMountedState({\r\n gamma: gamma,\r\n leftGammaValue: res,\r\n rightGammaValue: this.gammaFunction(0.75, gamma),\r\n });\r\n }}\r\n onMouseUp={() => {\r\n this.handleGammaChange();\r\n this.leftGamma.blur();\r\n }}\r\n type=\"range\"\r\n min=\"0.01\"\r\n max=\"0.99\"\r\n step=\"0.01\"\r\n className=\"slider-vertical\"\r\n />\r\n
    \r\n
    \r\n (this.rightGamma = c)}\r\n value={this.state.rightGammaValue}\r\n onMouseDown={(e) => {\r\n e.stopPropagation();\r\n }}\r\n onChange={() => {\r\n let x = 0.75;\r\n let res = this.rightGamma.value;\r\n let gamma = Math.log(res) / Math.log(x);\r\n if (gamma > 1) {\r\n gamma = gamma ** 0.25;\r\n }\r\n gamma = 2 - gamma;\r\n if (gamma > 0) {\r\n this.setMountedState({\r\n gamma: gamma,\r\n leftGammaValue: this.gammaFunction(0.25, gamma),\r\n rightGammaValue: res,\r\n });\r\n }\r\n }}\r\n onMouseUp={() => {\r\n this.handleGammaChange();\r\n this.rightGamma.blur();\r\n }}\r\n type=\"range\"\r\n min=\"0.01\"\r\n max=\"0.99\"\r\n step=\"0.01\"\r\n className=\"slider-vertical\"\r\n />\r\n
    \r\n\r\n \r\n Min:{\" \"}\r\n {Math.round(\r\n (this.state.min * (2 ** this.props.bitDepth - 1)) / 255\r\n )}\r\n \r\n\r\n \r\n Max:{\" \"}\r\n {Math.round(\r\n (this.state.max * (2 ** this.props.bitDepth - 1)) / 255\r\n )}\r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n Gamma:{\" \"}\r\n {(this.state.gamma < 1\r\n ? (2 - this.state.gamma) ** 4\r\n : 2 - this.state.gamma\r\n ).toFixed(2, 10)}\r\n \r\n
    \r\n )}\r\n \r\n );\r\n }\r\n\r\n onExportHistogramParameters = () => {\r\n const strData = this.props.projectContext.getProjectStringInfos();\r\n const downloadName =\r\n strData.name +\r\n \"_\" +\r\n strData.date +\r\n \"_\" +\r\n this.props.projectContext.user +\r\n \".hishsa\";\r\n\r\n let dataStr =\r\n \"data:text/json;charset=utf-8,\" +\r\n encodeURIComponent(JSON.stringify(this.props.histogramConfig));\r\n let dlAnchorElem = document.createElement(\"a\");\r\n dlAnchorElem.setAttribute(\"href\", dataStr);\r\n dlAnchorElem.setAttribute(\"download\", downloadName);\r\n dlAnchorElem.click();\r\n dlAnchorElem.remove();\r\n };\r\n\r\n onImportHistogramParameters = (e) => {\r\n let files = e.target.files;\r\n if (files.length <= 0) return false;\r\n\r\n let fr = new FileReader();\r\n fr.onload = (e) => {\r\n try {\r\n let selectedCs = [];\r\n let loadedConfig = JSON.parse(e.target.result);\r\n if (\r\n this.props.histogramConfig.channels.length !==\r\n loadedConfig.channels.length\r\n ) {\r\n window.showErrorSnackbar(\"Not compatible with this histogram!\");\r\n return;\r\n }\r\n let newHistogramConfig = this.props.histogramConfig;\r\n let stateToSet = true;\r\n let newStateObject = {};\r\n for (let i = 0; i < loadedConfig.channels.length; i++) {\r\n let c = loadedConfig.channels[i];\r\n if (c.enabled) {\r\n selectedCs.push(i);\r\n if (stateToSet) {\r\n let validGamma = validateGamma(c.gamma);\r\n newStateObject = {\r\n min: c.min,\r\n max: c.max,\r\n gamma: validGamma,\r\n leftGammaValue: this.gammaFunction(0.25, validGamma),\r\n rightGammaValue: this.gammaFunction(0.75, validGamma),\r\n };\r\n stateToSet = false;\r\n }\r\n }\r\n }\r\n if (this.state.isBrightfield) selectedCs = [-1];\r\n\r\n newStateObject.selectedChannels = selectedCs;\r\n Object.assign(newHistogramConfig, {\r\n scale: loadedConfig.scale,\r\n });\r\n\r\n this.setMountedState(newStateObject);\r\n newHistogramConfig.channels = loadedConfig.channels;\r\n\r\n this.props.onChange(newHistogramConfig);\r\n this.forceUpdateWithTimeout(10);\r\n } catch (e) {\r\n console.log(\"import errror:\", e);\r\n window.showErrorSnackbar(\"File not supported!\");\r\n }\r\n };\r\n fr.readAsText(files.item(0));\r\n };\r\n\r\n initData() {\r\n const { histogramConfig } = this.props;\r\n const { histograms, selectedChannels } = this.state;\r\n\r\n let datasets = [];\r\n let channelsArray = histogramConfig.channels;\r\n let isBrightfield =\r\n (histograms.length === 0 || histograms.length === 3) &&\r\n histogramConfig.channels.length === 1;\r\n if (isBrightfield) {\r\n channelsArray = [\r\n {\r\n enabled: true,\r\n name: \"R\",\r\n color: \"#ff0000\",\r\n },\r\n {\r\n enabled: true,\r\n name: \"G\",\r\n color: \"#00ff00\",\r\n },\r\n {\r\n enabled: true,\r\n name: \"B\",\r\n color: \"#0000ff\",\r\n },\r\n ];\r\n }\r\n if (selectedChannels.includes(-1)) {\r\n // display all channels\r\n for (let c = 0; c < channelsArray.length; c++) {\r\n // skip disabled channels\r\n if (!channelsArray[c].enabled || !histograms[c]) continue;\r\n\r\n // push channel to dataset\r\n datasets.push({\r\n label: channelsArray[c].name,\r\n backgroundColor:\r\n channelsArray[c].color !== -1\r\n ? hexToRGB(channelsArray[c].color, 0.2)\r\n : hexToRGB(\"#000000\", 0.2),\r\n borderColor:\r\n channelsArray[c].color !== -1 ? channelsArray[c].color : \"#000000\",\r\n borderWidth: 1,\r\n data: histograms[c],\r\n });\r\n }\r\n } else {\r\n for (let selectedChannel of selectedChannels) {\r\n if (typeof histograms[selectedChannel] === \"undefined\") continue;\r\n // dispaly single selected channel\r\n datasets.push({\r\n label: channelsArray[selectedChannel].name,\r\n backgroundColor:\r\n channelsArray[selectedChannel].color !== -1\r\n ? hexToRGB(channelsArray[selectedChannel].color, 0.2)\r\n : hexToRGB(\"#000000\", 0.2),\r\n borderColor:\r\n channelsArray[selectedChannel].color !== -1\r\n ? channelsArray[selectedChannel].color\r\n : \"#000000\",\r\n borderWidth: 1,\r\n data: histograms[selectedChannel],\r\n });\r\n }\r\n }\r\n this.data = {\r\n labels: Array.from(Array(256), (x, index) => index),\r\n datasets: datasets,\r\n };\r\n }\r\n\r\n render() {\r\n const { histogramConfig, classes, projectType } = this.props;\r\n const { dimensions, isBrightfield } = this.state;\r\n\r\n this.initData();\r\n\r\n return (\r\n
    (this.container = el)}>\r\n
    \r\n \r\n this.handleReset()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n {!(\r\n projectType.includes(\"HistoPointCounting\") ||\r\n projectType.includes(\"HistoClassification\")\r\n ) && (\r\n
    \r\n \r\n this.handleLogLin()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n\r\n {!isBrightfield && (\r\n \r\n \r\n this.handleMinMaxFit()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n this.handleBestFit()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n document.getElementById(\"selectHistogramFile\").click()\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n
    \r\n )}\r\n
    \r\n
    \r\n
    \r\n {dimensions && this.renderHistogram()}\r\n
    \r\n
    \r\n
    \r\n (this.slider1 = c)}\r\n onChange={() => {\r\n this.setMountedState({\r\n min: Math.min(\r\n parseFloat(this.slider1.value),\r\n this.state.max - 5\r\n ),\r\n });\r\n }}\r\n onMouseUp={() => {\r\n let min = Math.min(\r\n parseFloat(this.slider1.value),\r\n this.state.max - 5\r\n );\r\n let max = this.state.max;\r\n this.handleMinMaxRange([min, max], this.state.gamma);\r\n this.slider1.blur();\r\n }}\r\n value={this.state.min}\r\n type=\"range\"\r\n min=\"0\"\r\n max=\"255\"\r\n className=\"slider-bar\"\r\n />\r\n {dimensions && (\r\n (this.sliderGamma = c)}\r\n style={{\r\n marginLeft: (dimensions.width / 255) * this.state.min + \"px\",\r\n width:\r\n (dimensions.width * (this.state.max - this.state.min)) /\r\n 255 +\r\n \"px\",\r\n }}\r\n onChange={() => {\r\n let gamma = parseFloat(this.sliderGamma.value);\r\n this.setMountedState({\r\n gamma: gamma,\r\n leftGammaValue: this.gammaFunction(0.25, gamma),\r\n rightGammaValue: this.gammaFunction(0.75, gamma),\r\n });\r\n this.drawGammaLine();\r\n }}\r\n onMouseUp={() => {\r\n this.handleGammaChange();\r\n this.sliderGamma.blur();\r\n }}\r\n value={this.state.gamma}\r\n type=\"range\"\r\n min=\"0.00\"\r\n max=\"1.99\"\r\n step=\"0.01\"\r\n className=\"slider\"\r\n />\r\n )}\r\n\r\n (this.slider2 = c)}\r\n onChange={() => {\r\n this.setMountedState({\r\n max: Math.max(\r\n parseFloat(this.slider2.value),\r\n this.state.min + 5\r\n ),\r\n });\r\n }}\r\n onMouseUp={() => {\r\n let min = this.state.min;\r\n let max = Math.max(this.slider2.value, min + 5);\r\n this.handleMinMaxRange([min, max], this.state.gamma);\r\n this.slider2.blur();\r\n }}\r\n value={this.state.max}\r\n type=\"range\"\r\n min=\"0\"\r\n max=\"255\"\r\n className=\"slider-bar\"\r\n />\r\n
    \r\n
    \r\n {!isBrightfield &&\r\n !(\r\n projectType.includes(\"HistoPointCounting\") ||\r\n projectType.includes(\"HistoClassification\")\r\n ) && (\r\n \r\n this.activateAllChannels()}\r\n >\r\n ALL\r\n \r\n this.changeChannel(value)}\r\n >\r\n {histogramConfig.channels.map((channel, index) => (\r\n \r\n {\r\n this.setMountedState({\r\n lastClickedChannel: index,\r\n });\r\n }}\r\n // onDoubleClick={(e) =>\r\n // this.handleColorPickerClick(e, index)\r\n // }\r\n >\r\n \r\n
    \r\n {channel.name}{\" \"}\r\n {this.state.selectedChannels.includes(index)}\r\n
    \r\n {\r\n this.handleColorPickerChange(color, index);\r\n }}\r\n />\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n this.changeChannelSelectMode(e, value)\r\n }\r\n color=\"primary\"\r\n checked={this.state.channelSelectMode === \"single\"}\r\n value=\"singleChannelMode\"\r\n />\r\n }\r\n label=\"Single Channel\"\r\n />\r\n
    \r\n )}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nHistogram.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n histogramConfig: PropTypes.object,\r\n bitDepth: PropTypes.number,\r\n channelSelectMode: PropTypes.string.isRequired,\r\n changeChannelSelectMode: PropTypes.func,\r\n id: PropTypes.string.isRequired,\r\n onChange: PropTypes.func,\r\n projectType: PropTypes.string,\r\n projectContext: PropTypes.object,\r\n};\r\n\r\nexport default withStyles(styles)(Histogram);\r\n","import { withPersistentStorage } from \"./PersistentStorageContext\";\r\nimport { withProjectHistory } from \"./ProjectHistoryContext\";\r\nimport { withProject } from \"./ProjectContext\";\r\nimport { withSpinloader } from \"../../common/components/Spinloader\";\r\n\r\n/**\r\n * Wraps often used react contexts arrour a component and saves some lines ^^\r\n *\r\n * @param {React.Component} component - React Component that will be wrapped\r\n */\r\nexport const withAllViewerContexts = (component) =>\r\n withPersistentStorage(\r\n withProjectHistory(withProject(withSpinloader(component)))\r\n );\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport ListItemAvatar from \"@mui/material/ListItemAvatar\";\r\nimport Avatar from \"@mui/material/Avatar\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n root: {\r\n background: \"white\",\r\n height: \"100%\",\r\n marginLeft: 5,\r\n },\r\n headline: {\r\n padding: 16,\r\n paddingBottom: 8,\r\n },\r\n inline: {\r\n display: \"inline\",\r\n },\r\n});\r\n\r\nconst students = [\r\n {\r\n primary: \"\",\r\n name: \"Ali Conners\",\r\n avatar: \"/static/images/avatar/1.jpg\",\r\n comment: \" — UKE\",\r\n },\r\n {\r\n primary: \"\",\r\n name: \"Scott\",\r\n avatar: \"/static/images/avatar/1.jpg\",\r\n comment: \" — KIT\",\r\n },\r\n {\r\n primary: \"\",\r\n name: \"Jennifer\",\r\n avatar: \"/static/images/avatar/1.jpg\",\r\n comment: \" — KIT\",\r\n },\r\n {\r\n primary: \"\",\r\n name: \"Alex\",\r\n avatar: \"/static/images/avatar/1.jpg\",\r\n comment: \" — KIT\",\r\n },\r\n {\r\n primary: \"\",\r\n name: \"Sandra Adams\",\r\n avatar: \"/static/images/avatar/1.jpg\",\r\n comment: \" — Tübingen\",\r\n },\r\n];\r\n\r\nclass ClassroomChat extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n render() {\r\n const { classes, classRoomChatWidth } = this.props;\r\n return (\r\n 0 ? \"block\" : \"none\",\r\n }}\r\n className={classes.root}\r\n >\r\n \r\n Classroom\r\n \r\n \r\n {students.map((student, idx) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {student.name}\r\n \r\n {student.comment}\r\n \r\n }\r\n />\r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nClassroomChat.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n classRoomChatWidth: PropTypes.number,\r\n};\r\n\r\nexport default withStyles(styles)(ClassroomChat);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { configureImage, colorInImage } from \"../utils/RendererUtils\";\r\nimport { getParentIndexLayer } from \"../utils/StructuresUtils\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport withTheme from \"@mui/styles/withTheme\";\r\nimport { Tooltip, IconButton } from \"@mui/material\";\r\nimport CircularProgress from \"@mui/material/CircularProgress\";\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\nimport { faLayerGroup } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { ArrowDropUp, ArrowDropDown } from \"@mui/icons-material\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\n\r\nconst styles = {\r\n root: {\r\n position: \"absolute\",\r\n bottom: 5,\r\n left: 5,\r\n border: \"2px solid rgb(85, 85, 85)\",\r\n opacity: 0.8,\r\n },\r\n canvas: {\r\n position: \"relative\",\r\n },\r\n zBar: {\r\n position: \"absolute\",\r\n top: 10,\r\n bottom: 16,\r\n left: 10,\r\n width: 30,\r\n transition: \"opacity 0.15s ease-in-out\",\r\n },\r\n zStepUp: {\r\n color: \"#ffffff\",\r\n position: \"absolute\",\r\n top: 28,\r\n left: 0,\r\n width: 30,\r\n height: 30,\r\n padding: 0,\r\n },\r\n zStepDown: {\r\n color: \"#ffffff\",\r\n position: \"absolute\",\r\n top: 76,\r\n left: 0,\r\n width: 30,\r\n height: 30,\r\n padding: 0,\r\n },\r\n zStackIcon: {\r\n color: \"#ffffff\",\r\n position: \"absolute\",\r\n left: 6,\r\n top: 6,\r\n },\r\n zIndex: {\r\n color: \"#ffffff\",\r\n position: \"absolute\",\r\n top: 54,\r\n left: 0,\r\n width: 30,\r\n height: 30,\r\n textAlign: \"center\",\r\n },\r\n};\r\n\r\nclass CroppedImage extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n pd: 10,\r\n zoomSpeed: 10,\r\n };\r\n\r\n this.drawingEnabled = false;\r\n this.canvasFactor1 = 1;\r\n this.left = 1;\r\n this.top = 1;\r\n this.mousepos = {\r\n x: 0,\r\n y: 0,\r\n };\r\n this.mouseOnCanvas = false;\r\n this.positionInLayer = -1;\r\n this.previousPageIndex = 0;\r\n this.loadedCount = 0;\r\n this.fullyLoadedCount = 0;\r\n this.imgs = [];\r\n this.imgs1 = [];\r\n this.visibleRegions = [];\r\n this.r = null;\r\n }\r\n\r\n componentDidMount = () => {\r\n // set index for roi\r\n this.props.roI.galleryIndex = this.props.index;\r\n\r\n // load focus Z-Stack\r\n if (this.props.roI.z) {\r\n this.props.roI.firstTimeGallery = true;\r\n this.validateZ();\r\n }\r\n\r\n // bind mouse wheel events\r\n this.canvas.addEventListener(\r\n \"DOMMouseScroll\",\r\n (e) => this.mousewheel(e),\r\n true\r\n );\r\n this.canvas.addEventListener(\"mousewheel\", (e) => this.mousewheel(e), {\r\n passive: false,\r\n });\r\n\r\n // get drawing context from canvas\r\n this.ctx = this.canvas.getContext(\"2d\");\r\n\r\n // converts the relative size css information into an absolute size which we can access\r\n this.width = this.canvas.width = this.canvas.offsetWidth;\r\n this.height = this.canvas.height = this.canvas.offsetHeight;\r\n };\r\n\r\n componentWillUnmount() {\r\n this.canvas.removeEventListener(\r\n \"DOMMouseScroll\",\r\n (e) => this.mousewheel(e),\r\n true\r\n );\r\n this.canvas.removeEventListener(\"mousewheel\", (e) => this.mousewheel(e), {\r\n passive: false,\r\n });\r\n }\r\n\r\n componentDidUpdate() {\r\n const { roI, selectedWithKey } = this.props;\r\n // if roi was selected with key --> scroll that roi is on top of screen\r\n if (roI.selected && roI.selectedWithKey && selectedWithKey) {\r\n this.props.scroll(this.canvas.getBoundingClientRect().top);\r\n }\r\n // redraw image when the component updates\r\n this.draw();\r\n }\r\n\r\n UNSAFE_componentWillUpdate() {\r\n const { roI } = this.props;\r\n // check if new page\r\n if (this.previousPageIndex !== this.props.tiles.getPageIndex()) {\r\n this.previousPageIndex = this.props.tiles.getPageIndex();\r\n // calculate zoomspeed depending on width or height of roi\r\n let imgBoundWidth = roI.bounds.right - roI.bounds.left;\r\n let imgBoundHeight = roI.bounds.bottom - roI.bounds.top;\r\n let zoomSp;\r\n if (imgBoundWidth >= imgBoundHeight) {\r\n zoomSp = imgBoundWidth * 0.1;\r\n this.setState({ zoomSpeed: zoomSp }); // 10%\r\n } else {\r\n zoomSp = imgBoundHeight * 0.1;\r\n this.setState({ zoomSpeed: zoomSp }); // 10%\r\n }\r\n // reset variables\r\n this.loadedCount = 0;\r\n this.imgs = [];\r\n this.imgs1 = [];\r\n this.setState({ pd: 10 });\r\n }\r\n this.validateZ();\r\n // reset\r\n this.loadedCount = 0;\r\n }\r\n\r\n UNSAFE_componentWillMount() {\r\n const { roI } = this.props;\r\n // calculate zoomspeed depending on width or height of roi\r\n let imgBoundWidth = roI.bounds.right - roI.bounds.left;\r\n let imgBoundHeight = roI.bounds.bottom - roI.bounds.top;\r\n let zoomSp;\r\n if (imgBoundWidth >= imgBoundHeight) {\r\n zoomSp = imgBoundWidth * 0.1; // 10%\r\n this.setState({ zoomSpeed: zoomSp });\r\n } else {\r\n zoomSp = imgBoundHeight * 0.1; // 10%\r\n this.setState({ zoomSpeed: zoomSp });\r\n }\r\n this.validateZ();\r\n }\r\n\r\n // if no z level is set --> use middle z level\r\n validateZ = () => {\r\n if (this.props.roI.z === -1) {\r\n this.props.roI.z = this.props.globalZ;\r\n }\r\n };\r\n\r\n findVisibleRois = (pd) => {\r\n const { roI, structures, selectedLayer } = this.props;\r\n // only return rois that are visible with given padding / zoom --> use tree\r\n let parentLayerIndex = getParentIndexLayer(\r\n structures[selectedLayer],\r\n structures\r\n );\r\n return this.props.tools[this.props.activeTool].roiLayers[\r\n parentLayerIndex\r\n ].tree.search({\r\n minX: roI.bounds.left - pd,\r\n minY: roI.bounds.top - pd,\r\n maxX: roI.bounds.right + pd,\r\n maxY: roI.bounds.bottom + pd,\r\n });\r\n };\r\n\r\n getPageForChannel(c) {\r\n // calculate page index for tile\r\n return (\r\n Math.round(this.props.t) *\r\n this.props.ome.channels.length *\r\n this.props.ome.sizeZ +\r\n Math.round(this.props.roI.z) * this.props.ome.channels.length +\r\n c\r\n );\r\n }\r\n\r\n areAllImagesComplete = (imgs) => {\r\n // check if given images are completely loaded\r\n let allComplete = true;\r\n imgs.forEach((element) => {\r\n if (!element.complete) {\r\n allComplete = false;\r\n }\r\n });\r\n return allComplete;\r\n };\r\n\r\n drawRoi = (ctx, roi, imgLeft, imgTop, canvasFactor) => {\r\n const opacity = roi.isObject ? 0 : this.props.opacity;\r\n ctx.globalAlpha = opacity / 2;\r\n ctx.fillStyle = roi.color;\r\n ctx.beginPath();\r\n for (let regions of roi.regions) {\r\n ctx.moveTo(\r\n (regions[0][0] - imgLeft) * canvasFactor,\r\n (regions[0][1] - imgTop) * canvasFactor\r\n );\r\n let left = imgLeft;\r\n let top = imgTop;\r\n regions.forEach(function (point) {\r\n ctx.lineTo(\r\n (point[0] - left) * canvasFactor,\r\n (point[1] - top) * canvasFactor\r\n );\r\n });\r\n }\r\n this.ctx.closePath();\r\n this.ctx.fill(\"evenodd\");\r\n if (opacity === 0) {\r\n ctx.strokeStyle = roi.color;\r\n }\r\n ctx.globalAlpha = 1;\r\n ctx.stroke();\r\n };\r\n\r\n draw() {\r\n const { roI, ome, tools, activeTool, drawLayer } = this.props;\r\n // draw image, contour, crosshair, ... in image\r\n\r\n this.canvas.height = this.props.canvasWidth;\r\n this.canvas.width = this.props.canvasWidth;\r\n\r\n // set padding (depends on zooming)\r\n let pd = 0;\r\n // check if new padding is still in whole image\r\n let boInsideImage =\r\n roI.bounds.left - this.state.pd > 0 &&\r\n roI.bounds.right + this.state.pd < ome.sizeX &&\r\n roI.bounds.top - this.state.pd > 0 &&\r\n roI.bounds.bottom + this.state.pd < ome.sizeY;\r\n if (boInsideImage) {\r\n pd = this.state.pd;\r\n } else {\r\n pd = this.state.pd - this.state.zoomSpeed; // if max. zoomed out --> do not change padding\r\n }\r\n\r\n // set image properties (dimensions) with padding\r\n let imgBottom = roI.bounds.bottom + pd;\r\n let imgTop = roI.bounds.top - pd;\r\n let imgLeft = roI.bounds.left - pd;\r\n let imgRight = roI.bounds.right + pd;\r\n let imgBoundWidth = roI.bounds.right - roI.bounds.left;\r\n let imgBoundHeight = roI.bounds.bottom - roI.bounds.top;\r\n\r\n // make bounding box to square and edge protection (that image is in whole image)\r\n if (imgBoundWidth > imgBoundHeight) {\r\n let d = (imgBoundWidth - imgBoundHeight) / 2;\r\n if (imgTop - d < 0) {\r\n // if too high\r\n imgBottom = imgBottom + d + (d - imgTop);\r\n imgTop = 0;\r\n } else if (imgBottom + d > ome.sizeY - 1) {\r\n // if too low\r\n imgTop = imgTop - d - (d - (ome.sizeY - imgBottom));\r\n imgBottom = ome.sizeY - 1;\r\n } else {\r\n imgTop = imgTop - d;\r\n imgBottom = imgBottom + d;\r\n }\r\n } else if (imgBoundWidth < imgBoundHeight) {\r\n let d = (imgBoundHeight - imgBoundWidth) / 2;\r\n if (imgLeft - d < 0) {\r\n // too far left\r\n imgRight = imgRight + d + (d - imgLeft);\r\n imgLeft = 0;\r\n } else if (imgRight + d > ome.sizeX - 1) {\r\n // too far right\r\n imgLeft = imgLeft - d - (d - (ome.sizeX - imgRight));\r\n imgRight = ome.sizeX - 1;\r\n } else {\r\n imgLeft = imgLeft - d;\r\n imgRight = imgRight + d;\r\n }\r\n }\r\n\r\n // calculate pyramid level to display roi\r\n let factorPyramidLevel =\r\n (this.props.canvasWidth * ome.sizeY) /\r\n ((imgBottom - imgTop) * this.props.tiles.getImgHeight());\r\n let level = Math.floor(this.getBaseLog(2, factorPyramidLevel));\r\n if (level < 0) {\r\n level = 0;\r\n } else if (level > ome.maxLevel) {\r\n level = ome.maxLevel;\r\n }\r\n\r\n let ctx = this.canvas.getContext(\"2d\");\r\n this.imgs = [];\r\n this.imgs1 = [];\r\n // get number of tiles in calculated level\r\n let rows = Math.pow(2, level);\r\n\r\n // get factor for width and height\r\n let factor_w =\r\n (this.props.tiles.getImgWidth() * rows) / this.props.ome.sizeX;\r\n let factor_h =\r\n (this.props.tiles.getImgHeight() * rows) / this.props.ome.sizeY;\r\n let xBound = imgLeft * factor_w;\r\n let yBound = imgTop * factor_h;\r\n let boundWidth = (imgRight - imgLeft) * factor_w;\r\n let boundHeight = (imgBottom - imgTop) * factor_h;\r\n\r\n // x- and y-Tile upper left\r\n let xTile = Math.floor(xBound / this.props.tiles.getImgWidth());\r\n let yTile = Math.floor(yBound / this.props.tiles.getImgHeight());\r\n\r\n xTile = Math.max(xTile, 0);\r\n yTile = Math.max(yTile, 0);\r\n\r\n // assume 4 tiles\r\n let rows1 = 2;\r\n let cols1 = 2;\r\n if (\r\n Math.floor(xBound / this.props.tiles.getImgWidth()) ===\r\n Math.floor((xBound + boundWidth) / this.props.tiles.getImgWidth())\r\n ) {\r\n // if left and right corner in same tile only one column\r\n cols1 = 1;\r\n }\r\n if (\r\n Math.floor(yBound / this.props.tiles.getImgHeight()) ===\r\n Math.floor((yBound + boundHeight) / this.props.tiles.getImgHeight())\r\n ) {\r\n // if upper and lower corner in same tile one row\r\n rows1 = 1;\r\n }\r\n if (xTile === Math.pow(2, level) - 1) {\r\n cols1 = 1;\r\n }\r\n if (yTile === Math.pow(2, level) - 1) {\r\n rows1 = 1;\r\n }\r\n\r\n // calculate and load tiles for roi depending on pyramide level\r\n for (let x = xTile; x < xTile + cols1; x++) {\r\n for (let y = yTile; y < yTile + rows1; y++) {\r\n for (let i = 0; i < ome.channels.length; i++) {\r\n let page = this.getPageForChannel(i);\r\n if (page === -1) {\r\n return;\r\n }\r\n let tileId =\r\n page + \",\" + level + \",\" + x + \",\" + y + \",\" + this.props.fileId;\r\n if (\r\n (!this.props.tiles.getVisibleImage(tileId) ||\r\n !this.props.tiles.getVisibleImage(tileId).complete ||\r\n roI.firstTimeGallery) &&\r\n this.props.objectToLoad.rois.includes(this.props.roI)\r\n ) {\r\n // if is not in cache and needs to get loaded in backend\r\n let vImg = new Image();\r\n vImg.src = Backend.renderRegion({\r\n id: this.props.fileId,\r\n page: page,\r\n lv: level,\r\n x: x,\r\n y: y,\r\n });\r\n this.imgs.push(vImg);\r\n this.imgs1.push([vImg, tileId]);\r\n this.props.tiles.pushVisibleImage(vImg, tileId);\r\n } else {\r\n // load tile from cache\r\n if (this.props.tiles.getVisibleImage(tileId)) {\r\n this.imgs.push(this.props.tiles.getVisibleImage(tileId));\r\n this.imgs1.push([\r\n this.props.tiles.getVisibleImage(tileId),\r\n tileId,\r\n ]);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // clear canvas\r\n ctx.clearRect(0, 0, this.props.canvasWidth, this.props.canvasWidth);\r\n ctx.save();\r\n ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n ctx.clearRect(0, 0, this.props.canvasWidth, this.props.canvasWidth);\r\n ctx.restore();\r\n\r\n // put images in canvas\r\n for (let y = 0; y < this.imgs.length; y++) {\r\n if (\r\n this.imgs[y].complete &&\r\n this.props.tiles.getColoredImage(this.imgs1[y][1])\r\n ) {\r\n // if image is finished loading --> draw\r\n let channel;\r\n let nChannels = ome.channels.length;\r\n for (let i = 0; i < nChannels; i++) {\r\n if (y % nChannels === i) {\r\n channel = this.props.tiles.getHistogramConfig().channels[i];\r\n }\r\n }\r\n\r\n if (channel.enabled) {\r\n // composition should be screen for fluorescence\r\n const compositionModeFluor = \"screen\";\r\n ctx.globalCompositeOperation = compositionModeFluor;\r\n\r\n // draw image with different channels\r\n let imageForCanvas = this.props.tiles.getColoredImage(\r\n this.imgs1[y][1]\r\n );\r\n\r\n // variables for destionation and source image\r\n let sX; // source x\r\n let sY; // source y\r\n let sWidth; // source width\r\n let sHeight; // source height\r\n let x1D; // destination x\r\n let y1D; // destination y\r\n let wD; // destination width\r\n let hD; // destination height\r\n let imgWidth = this.props.tiles.getImgWidth();\r\n let imgHeight = this.props.tiles.getImgHeight();\r\n let fktWidth = (imgWidth * (xTile + 1) - xBound) / boundWidth;\r\n let fktHeight = (imgHeight * (yTile + 1) - yBound) / boundHeight;\r\n\r\n // calculate values for destination and source image (for cropping)\r\n if (this.imgs.length === this.props.ome.channels.length) {\r\n // if roi is in 1 tile\r\n sX = xBound - xTile * imgWidth;\r\n sY = yBound - yTile * imgHeight;\r\n sWidth = boundWidth;\r\n sHeight = boundHeight;\r\n x1D = 0;\r\n y1D = 0;\r\n wD = this.props.canvasWidth;\r\n hD = this.props.canvasWidth;\r\n } else if (rows1 === 1 && y >= this.props.ome.channels.length) {\r\n // if roi is in two horizontal tiles\r\n sX = 0;\r\n sY = yBound - yTile * imgHeight;\r\n sWidth = boundWidth + xBound - imgWidth * (xTile + 1);\r\n sHeight = imgHeight * (yTile + 1) - yBound;\r\n x1D = this.props.canvasWidth * fktWidth;\r\n y1D = 0;\r\n wD = this.props.canvasWidth * (1 - fktWidth);\r\n hD = this.props.canvasWidth * fktHeight;\r\n } else if (rows1 === 1 && y < this.props.ome.channels.length) {\r\n // if roi is in two horizontal tiles\r\n sX = xBound - xTile * imgWidth;\r\n sY = yBound - yTile * imgHeight;\r\n sWidth = imgWidth * (xTile + 1) - xBound;\r\n sHeight = imgHeight * (yTile + 1) - yBound;\r\n x1D = 0;\r\n y1D = 0;\r\n wD = this.props.canvasWidth * fktWidth;\r\n hD = this.props.canvasWidth * fktHeight;\r\n } else if (y >= 0 && y < this.props.ome.channels.length) {\r\n // upper left\r\n sX = xBound - xTile * imgWidth;\r\n sY = yBound - yTile * imgHeight;\r\n sWidth = imgWidth * (xTile + 1) - xBound;\r\n sHeight = imgHeight * (yTile + 1) - yBound;\r\n x1D = 0;\r\n y1D = 0;\r\n wD = this.props.canvasWidth * fktWidth;\r\n hD = this.props.canvasWidth * fktHeight;\r\n } else if (\r\n y >= this.props.ome.channels.length &&\r\n y < this.props.ome.channels.length * 2\r\n ) {\r\n // lower left\r\n sX = xBound - xTile * imgWidth;\r\n sY = 0;\r\n sWidth = imgWidth * (xTile + 1) - xBound;\r\n sHeight = boundHeight - (imgHeight * (yTile + 1) - yBound);\r\n x1D = 0;\r\n y1D = this.props.canvasWidth * fktHeight;\r\n wD = this.props.canvasWidth * fktWidth;\r\n hD = this.props.canvasWidth * (1 - fktHeight);\r\n } else if (\r\n y >= this.props.ome.channels.length * 2 &&\r\n y < this.props.ome.channels.length * 3\r\n ) {\r\n // upper right\r\n sX = 0;\r\n sY = yBound - yTile * imgHeight;\r\n sWidth = boundWidth + xBound - imgWidth * (xTile + 1);\r\n sHeight = imgHeight * (yTile + 1) - yBound;\r\n x1D = this.props.canvasWidth * fktWidth;\r\n y1D = 0;\r\n wD = this.props.canvasWidth * (1 - fktWidth);\r\n hD = this.props.canvasWidth * fktHeight;\r\n } else {\r\n // lower right\r\n sX = 0;\r\n sY = 0;\r\n sWidth = boundWidth + xBound - imgWidth * (xTile + 1);\r\n sHeight = boundHeight - (imgHeight * (yTile + 1) - yBound);\r\n x1D = this.props.canvasWidth * fktWidth;\r\n y1D = this.props.canvasWidth * fktHeight;\r\n wD = this.props.canvasWidth * (1 - fktWidth);\r\n hD = this.props.canvasWidth * (1 - fktHeight);\r\n }\r\n\r\n ctx.imageSmoothingEnabled = true;\r\n if (imageForCanvas) {\r\n // draw loaded image canvas\r\n ctx.drawImage(\r\n imageForCanvas,\r\n sX,\r\n sY,\r\n sWidth,\r\n sHeight,\r\n x1D,\r\n y1D,\r\n wD,\r\n hD\r\n );\r\n }\r\n\r\n this.fullyLoadedCount = this.fullyLoadedCount + 1;\r\n if (this.areAllImagesComplete(this.imgs)) {\r\n this.props.roI.fullyLoaded = true;\r\n this.fullyLoadedCount = 0;\r\n if (this.props.roI === this.props.objectToLoad.roi) {\r\n // set image/roi that should be loaded next\r\n this.props.setObjectToLoad();\r\n }\r\n }\r\n roI.firstTimeGallery = false;\r\n }\r\n } else if (this.props.objectToLoad.rois.includes(this.props.roI)) {\r\n // if image is not finished loading from backend and roi is the object to load next --> load image\r\n this.imgs[y].onload = () => {\r\n let channel;\r\n let nChannels = this.props.ome.channels.length;\r\n for (let i = 0; i < nChannels; i++) {\r\n if (y % nChannels === i) {\r\n channel = this.props.tiles.getHistogramConfig().channels[i];\r\n }\r\n }\r\n\r\n if (channel.enabled) {\r\n // composition should be screen for fluorescence\r\n const compositionModeFluor = \"screen\";\r\n ctx.globalCompositeOperation = compositionModeFluor;\r\n\r\n if (channel.color === \"#ffffff\" || channel.color === -1) {\r\n // rgb channel\r\n if (\r\n this.imgs1[y] &&\r\n !this.props.tiles.getColoredImage(this.imgs1[y][1])\r\n ) {\r\n let imageForCanvas = configureImage(this.imgs[y], channel);\r\n this.props.tiles.pushColoredImages(\r\n imageForCanvas,\r\n this.imgs1[y][1]\r\n );\r\n }\r\n } else {\r\n // colored images cache\r\n if (\r\n this.imgs1[y] &&\r\n !this.props.tiles.getColoredImage(this.imgs1[y][1])\r\n ) {\r\n let imageForCanvas = colorInImage(this.imgs[y], channel);\r\n this.props.tiles.pushColoredImages(\r\n imageForCanvas,\r\n this.imgs1[y][1]\r\n );\r\n }\r\n }\r\n }\r\n\r\n this.loadedCount = this.loadedCount + 1;\r\n if (this.areAllImagesComplete(this.imgs)) {\r\n // if all images loaded --> reset images\r\n this.imgs = [];\r\n this.imgs1 = [];\r\n this.props.roI.firstTimeGallery = false;\r\n this.loadedCount = 0;\r\n this.props.roI.fullyLoaded = true;\r\n this.forceUpdate();\r\n }\r\n };\r\n }\r\n }\r\n\r\n // draw contour of roi\r\n if (this.props.contour) {\r\n this.ctx.globalCompositeOperation = \"source-over\";\r\n this.ctx.strokeStyle = this.props.isBrightfield ? \"black\" : \"white\";\r\n ctx.lineWidth = 2;\r\n let canvasFactor = this.props.canvasWidth / (imgBottom - imgTop);\r\n this.canvasFactor1 = canvasFactor;\r\n this.left = imgLeft;\r\n this.top = imgTop;\r\n\r\n if (\r\n !tools[activeTool] ||\r\n (tools[activeTool] &&\r\n tools[activeTool].name !== \"Pen\" &&\r\n tools[activeTool].name !== \"Region\" &&\r\n tools[activeTool].name !== \"Rectangle\" &&\r\n tools[activeTool].name !== \"Ellipse\") ||\r\n !tools[activeTool].layer\r\n ) {\r\n // no drawing tool enabled\r\n // only draw main roi\r\n this.drawRoi(ctx, roI, imgLeft, imgTop, canvasFactor);\r\n ctx.beginPath();\r\n } else {\r\n // drawing tool enabled\r\n if (\r\n tools[activeTool].layer.regionRois[this.props.index] &&\r\n !this.mouseOnCanvas\r\n ) {\r\n // drawing tool enabled but mouse not on canvas --> only draw main roi\r\n let r = tools[activeTool].layer.regionRois.filter(\r\n (element) => element.bounds === roI.bounds\r\n )[0];\r\n if (r) {\r\n this.r = r;\r\n // only draw main roi\r\n this.drawRoi(ctx, r, imgLeft, imgTop, canvasFactor);\r\n }\r\n }\r\n\r\n if (this.mouseOnCanvas) {\r\n // draw other contours if mouse is on canvas and tool is activated\r\n // only draw contours that are visible in image (use tree)\r\n this.visibleRegions = [];\r\n this.visibleRegions = this.findVisibleRois(this.state.pd); // also icludes main roi\r\n\r\n // draw visible regions in canvas\r\n for (let i = 0; i < this.visibleRegions.length; i++) {\r\n this.drawRoi(\r\n ctx,\r\n this.visibleRegions[i].roi,\r\n imgLeft,\r\n imgTop,\r\n canvasFactor\r\n );\r\n }\r\n\r\n // draw drawlayer\r\n if (drawLayer.regionRois.length > 0) {\r\n this.drawRoi(\r\n ctx,\r\n drawLayer.regionRois[0],\r\n imgLeft,\r\n imgTop,\r\n canvasFactor\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n // draw custom mouse cursor for pen tool\r\n if (tools[activeTool] && this.mousepos.x !== 0) {\r\n tools[activeTool].drawCustomCursor(\r\n ctx,\r\n this.mousepos,\r\n this.canvasFactor1,\r\n true\r\n );\r\n }\r\n\r\n // draw crosshair\r\n // clear overlayCanvas\r\n let ctxOv = null;\r\n if (this.canvasOverlay !== null && this.canvasOverlay) {\r\n ctxOv = this.canvasOverlay.getContext(\"2d\");\r\n this.canvasOverlay.height = this.props.canvasWidth;\r\n this.canvasOverlay.width = this.props.canvasWidth;\r\n ctxOv.clearRect(0, 0, this.props.canvasWidth, this.props.canvasWidth);\r\n ctxOv.save();\r\n ctxOv.setTransform(1, 0, 0, 1, 0, 0);\r\n ctxOv.clearRect(0, 0, this.props.canvasWidth, this.props.canvasWidth);\r\n ctxOv.restore();\r\n }\r\n if (this.props.drawCrosshair) {\r\n ctxOv.lineWidth = this.props.crosshairLineWidth;\r\n let lineLength = (this.props.canvasWidth / 2) * 0.9;\r\n let linePostion = this.props.canvasWidth / 2;\r\n let widthHeight = this.props.canvasWidth;\r\n\r\n // horizontal line left\r\n ctxOv.beginPath();\r\n ctxOv.moveTo(4, this.props.canvasWidth / 2);\r\n ctxOv.lineTo(lineLength, linePostion);\r\n ctxOv.closePath();\r\n ctxOv.strokeStyle = this.props.crosshairColor;\r\n ctxOv.globalAlpha = this.props.crosshairOpacity;\r\n ctxOv.stroke();\r\n\r\n // horizontal line right\r\n ctxOv.beginPath();\r\n ctxOv.moveTo(widthHeight - 4, linePostion);\r\n ctxOv.lineTo(widthHeight - lineLength, linePostion);\r\n ctxOv.closePath();\r\n ctxOv.strokeStyle = this.props.crosshairColor;\r\n ctxOv.globalAlpha = this.props.crosshairOpacity;\r\n ctxOv.stroke();\r\n\r\n // vertical line top\r\n ctxOv.beginPath();\r\n ctxOv.moveTo(linePostion, 4);\r\n ctxOv.lineTo(linePostion, lineLength);\r\n ctxOv.closePath();\r\n ctxOv.strokeStyle = this.props.crosshairColor;\r\n ctxOv.globalAlpha = this.props.crosshairOpacity;\r\n ctxOv.stroke();\r\n\r\n // vertical line bottom\r\n ctxOv.beginPath();\r\n ctxOv.moveTo(linePostion, widthHeight - 4);\r\n ctxOv.lineTo(linePostion, widthHeight - lineLength);\r\n ctxOv.closePath();\r\n ctxOv.strokeStyle = this.props.crosshairColor;\r\n ctxOv.globalAlpha = this.props.crosshairOpacity;\r\n ctxOv.stroke();\r\n }\r\n }\r\n\r\n getRoiStructureId = (roi) => {\r\n const { structures, selectedLayer } = this.props;\r\n // return structureId of roi\r\n if (roi.structureId === 0 && roi.subtypeName === \"\") {\r\n // run job parent elements\r\n return structures[selectedLayer].id;\r\n } else if (roi.structureId === 0) {\r\n // for old projects with no ids or after run job (structureId === 0)\r\n let idx = structures.findIndex(\r\n (element) =>\r\n element.color === roi.color && element.label === roi.subtypeName\r\n );\r\n return structures[idx].id;\r\n } else {\r\n // if new project --> just return structureId property\r\n return roi.structureId;\r\n }\r\n };\r\n\r\n getClassificationStructure = (id) => {\r\n const { structures } = this.props;\r\n // return structure for classification with given id\r\n return structures.filter((element) => element.id === id)[0];\r\n };\r\n\r\n handleCanvasClick = (e) => {\r\n const {\r\n roI,\r\n tools,\r\n structures,\r\n selectedLayer,\r\n roiLayers,\r\n activeTool,\r\n automaticTraining,\r\n classificationId,\r\n project,\r\n } = this.props;\r\n // classify and select roi\r\n\r\n // return if roi is not loaded --> return\r\n if (this.props.roI.firstTimeGallery) {\r\n if (!this.props.roI.aiAnnotated) {\r\n return;\r\n }\r\n }\r\n\r\n if (!project.type.includes(\"Histo\") && selectedLayer === 0) return; //dont allow subtype marking for baseroi\r\n\r\n // only classify and select roi if no drawing tool is activated\r\n if (\r\n !tools[activeTool] ||\r\n (tools[activeTool] &&\r\n tools[activeTool].name !== \"Pen\" &&\r\n tools[activeTool].name !== \"Region\" &&\r\n tools[activeTool].name !== \"Rectangle\" &&\r\n tools[activeTool].name !== \"Ellipse\")\r\n ) {\r\n // set clicked roi to selected = true\r\n roiLayers[selectedLayer].layer.regionRois.forEach((element) => {\r\n element.selected = false;\r\n element.selectedWithKey = false;\r\n });\r\n this.props.roI.selected = true;\r\n this.props.roI.selectedWithKey = false;\r\n if (this.props.selectedWithKey) {\r\n // set false --> no automatic scrolling\r\n this.props.setSelectedWithKey(false);\r\n }\r\n\r\n // return here in histo-point-counting module --> only select but not classify\r\n if (project.type.includes(\"HistoPointCounting\")) {\r\n this.props.updateGallery();\r\n return;\r\n }\r\n\r\n // classify roi\r\n let roiWasSubtype = roI.isSubtype && !roI.aiAnnotated;\r\n let bufferRoiId = this.getRoiStructureId(roI);\r\n\r\n let classificationStructure;\r\n if (e.nativeEvent.which === 3) {\r\n // right click\r\n classificationStructure = this.getClassificationStructure(\r\n classificationId[2]\r\n );\r\n }\r\n if (e.nativeEvent.which === 1) {\r\n // left click\r\n classificationStructure = this.getClassificationStructure(\r\n classificationId[1]\r\n );\r\n }\r\n\r\n if (typeof classificationStructure === \"undefined\") return;\r\n\r\n // set properties\r\n roI.color = classificationStructure.color;\r\n roI.isSubtype = classificationStructure.classificationSubtype\r\n ? true\r\n : false;\r\n roI.isAnnotated = classificationStructure.classificationSubtype\r\n ? true\r\n : false;\r\n roI.isLabeled = classificationStructure.classificationSubtype\r\n ? true\r\n : false;\r\n roI.subtypeName = classificationStructure.label;\r\n roI.structureId = classificationStructure.id;\r\n roI.isSelObj = false;\r\n roI.aiAnnotated = false;\r\n\r\n // increase annotationCount\r\n if (\r\n automaticTraining &&\r\n !structures[selectedLayer].classificationSubtype\r\n ) {\r\n if (roI.isSubtype && !roiWasSubtype) {\r\n // if classify unlabeled to labeled\r\n this.props.tiles.setStrAnnoCount(this.getRoiStructureId(roI), 1);\r\n } else if (roI.isSubtype && roiWasSubtype) {\r\n // if classify labeled to labeled\r\n this.props.tiles.setStrAnnoCount(this.getRoiStructureId(roI), 1);\r\n this.props.tiles.setStrAnnoCount(bufferRoiId, -1);\r\n } else if (roiWasSubtype) {\r\n // if classify labeled to unlabeled\r\n this.props.tiles.setStrAnnoCount(bufferRoiId, -1);\r\n }\r\n }\r\n\r\n // check if all images in scene are labeled\r\n //this.allImgsAnnotated();\r\n\r\n // check if start training automatically\r\n let childs = this.findChilds(structures[selectedLayer]);\r\n let structureId = structures[selectedLayer].id;\r\n let annotations =\r\n this.getNuberChildRois(childs) -\r\n this.props.tiles.getStrAnnoCountElement(structureId);\r\n if (\r\n annotations >= this.props.startData &&\r\n automaticTraining &&\r\n !this.props.alruns\r\n ) {\r\n let enoughAnnos = this.enoughAnnotations(childs);\r\n if (enoughAnnos) {\r\n this.props.tiles.setAnnotationCount(0);\r\n this.props.tiles.setParentAnnoCount(\r\n structures[selectedLayer].id,\r\n annotations\r\n );\r\n this.props.startAutomaticTraining();\r\n } else {\r\n // give warning if too less annotations\r\n this.props.giveWarning();\r\n }\r\n }\r\n // update gallery\r\n this.props.updateGallery();\r\n }\r\n };\r\n\r\n allImgsAnnotated = () => {\r\n const { selectedLayer, roiLayers } = this.props;\r\n // check if all images in scene are labeled\r\n let allImagesLabeled = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (element) => !element.isLabeled\r\n );\r\n if (allImagesLabeled.length === 0) {\r\n // set property that scene is fully annotated\r\n this.props.setFUllyAnnotated();\r\n } else if (allImagesLabeled.length > 0) {\r\n // set property that scene is annotated\r\n this.props.setAnnotated();\r\n }\r\n };\r\n\r\n getNuberChildRois = (childs) => {\r\n // get number of rois for each child\r\n let n = 0;\r\n childs.forEach((element) => {\r\n n = n + this.props.tiles.getStrAnnoCountElement(element.id);\r\n });\r\n return n;\r\n };\r\n\r\n findChilds = (structure) => {\r\n const { structures } = this.props;\r\n // return all direct classificationsubtypes\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === structure.subtypeLevel + 1 &&\r\n element.parentId === structure.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n enoughAnnotations = (childs) => {\r\n // check if enough annotations for training of dl model (at least one class with 5 annotations and one other class with 1 annotation)\r\n let minFive = false;\r\n let twoAnnotated = 0;\r\n childs.forEach((element) => {\r\n // check if minimum of five in one class\r\n if (this.props.tiles.getStrAnnoCountElement(element.id) >= 5) {\r\n minFive = true;\r\n }\r\n // check if two classes with at least one element\r\n if (this.props.tiles.getStrAnnoCountElement(element.id) >= 1) {\r\n twoAnnotated = twoAnnotated + 1;\r\n }\r\n });\r\n\r\n // if one class with at least five and one other class with at least one annotation --> enough annotations for training\r\n let enough = false;\r\n if (minFive && twoAnnotated >= 2) {\r\n enough = true;\r\n }\r\n return enough;\r\n };\r\n\r\n handleCanvasMouseDown = (e) => {\r\n const { roI, tools, activeTool, project } = this.props;\r\n // no mouse down if roi is still loading\r\n if (this.props.roI.firstTimeGallery) {\r\n return;\r\n }\r\n // set property that mouse is down\r\n this.props.tiles.setIsMousedown(true);\r\n\r\n if (this.drawingEnabled) {\r\n // get position, ... for drawing event of tool\r\n var rect = this.canvas.getBoundingClientRect();\r\n var mouseX = e.clientX - rect.left;\r\n var mouseY = e.clientY - rect.top;\r\n let p = {\r\n x: mouseX / this.canvasFactor1 + this.left,\r\n y: mouseY / this.canvasFactor1 + this.top,\r\n };\r\n if (tools[activeTool]) {\r\n tools[activeTool].mouse({\r\n event: e,\r\n p: p,\r\n color: roI.color,\r\n subtype: roI.isSubtype,\r\n name: roI.subtypeName,\r\n });\r\n }\r\n // update\r\n this.forceUpdate();\r\n }\r\n // mouse wheel click not possible in point counting module\r\n if (!project.type.includes(\"HistoPointCounting\")) {\r\n // zoom to roi in viewer when mouse wheel click\r\n if (e.nativeEvent.which === 2) {\r\n this.props.gallery(\r\n false,\r\n roI.bounds.left,\r\n roI.bounds.right,\r\n roI.bounds.top,\r\n roI.bounds.bottom\r\n );\r\n }\r\n }\r\n };\r\n\r\n handleMouseMove = (e) => {\r\n const { roI, tools, activeTool } = this.props;\r\n // no mouse move if roi is still loading\r\n if (roI.firstTimeGallery) {\r\n return;\r\n }\r\n if (this.drawingEnabled) {\r\n // set property that mouse is on canvas\r\n this.mouseOnCanvas = true;\r\n // get position, ... for drawing event of tool\r\n var rect = this.canvas.getBoundingClientRect();\r\n var mouseX = e.clientX - rect.left;\r\n var mouseY = e.clientY - rect.top;\r\n let p = {\r\n x: mouseX / this.canvasFactor1 + this.left,\r\n y: mouseY / this.canvasFactor1 + this.top,\r\n };\r\n if (\r\n (tools[activeTool] && tools.region.points.length !== 0) ||\r\n (tools[activeTool] && tools[activeTool].name === \"Pen\") ||\r\n (tools[activeTool] && tools[activeTool].name === \"Rectangle\") ||\r\n (tools[activeTool] && tools[activeTool].name === \"Ellipse\")\r\n ) {\r\n tools[activeTool].mouse({\r\n event: e,\r\n p: p,\r\n color: roI.color,\r\n subtype: roI.isSubtype,\r\n name: roI.subtypeName,\r\n });\r\n // update\r\n this.forceUpdate();\r\n }\r\n // update mouse position\r\n this.mousepos.x = e.clientX - rect.left;\r\n this.mousepos.y = e.clientY - rect.top;\r\n }\r\n };\r\n\r\n handleMouseUp = (e) => {\r\n const { roI, tools, activeTool, roiLayers, selectedLayer, structures } =\r\n this.props;\r\n // no mouse up if roi is still loading\r\n if (roI.firstTimeGallery) {\r\n return;\r\n }\r\n // set property that mouse is not down anymore\r\n this.props.tiles.setIsMousedown(false);\r\n\r\n if (\r\n this.drawingEnabled &&\r\n tools[activeTool] &&\r\n (tools[activeTool].name === \"Pen\" ||\r\n tools[activeTool].name === \"Region\" ||\r\n tools[activeTool].name === \"Rectangle\" ||\r\n tools[activeTool].name === \"Ellipse\")\r\n ) {\r\n // get position, ... for drawing event of tool\r\n var rect = this.canvas.getBoundingClientRect();\r\n var mouseX = e.clientX - rect.left;\r\n var mouseY = e.clientY - rect.top;\r\n let p = {\r\n x: mouseX / this.canvasFactor1 + this.left,\r\n y: mouseY / this.canvasFactor1 + this.top,\r\n };\r\n\r\n // get position of roi --> insert if at correct position after update\r\n // get layer which contains roi\r\n let parentLayer = getParentIndexLayer(\r\n structures[selectedLayer],\r\n structures\r\n );\r\n // get position of roi in roilayer\r\n let posInRoiLayer = roiLayers[parentLayer].layer.regionRois.findIndex(\r\n (roi) => roi === roI\r\n );\r\n if (posInRoiLayer !== -1) {\r\n this.positionInLayer = posInRoiLayer;\r\n }\r\n if (tools[activeTool]) {\r\n tools[activeTool].mouse({\r\n event: e,\r\n p: p,\r\n color: roI.color,\r\n subtype: roI.isSubtype,\r\n name: roI.subtypeName,\r\n positionInRoiLayer: this.positionInLayer,\r\n fullyLoaded: true,\r\n });\r\n }\r\n // reset object to load --> reload after drawing\r\n this.props.setObjectToLoad(false, true);\r\n // update\r\n this.forceUpdate();\r\n }\r\n };\r\n\r\n handleMouseLeave = () => {\r\n const { roI, tools, activeTool } = this.props;\r\n // no mouse leave if roi is still loading\r\n if (roI.firstTimeGallery) {\r\n return;\r\n }\r\n // set property that mouse is not on image anymore\r\n this.props.tiles.setIsOnImage(false);\r\n\r\n // if mouse is not down when leaving image --> end drawing mode\r\n if (!this.props.tiles.getIsMousedown()) {\r\n this.drawingEnabled = false;\r\n }\r\n\r\n // reset mouseposition\r\n this.mousepos.x = 0;\r\n this.mousepos.y = 0;\r\n this.mouseOnCanvas = false;\r\n if (\r\n tools[activeTool] &&\r\n (tools[activeTool].name === \"Pen\" ||\r\n tools[activeTool].name === \"Region\" ||\r\n tools[activeTool].name === \"Rectangle\" ||\r\n tools[activeTool].name === \"Ellipse\")\r\n ) {\r\n // update gallery\r\n this.props.updateGallery();\r\n }\r\n // update\r\n this.forceUpdate();\r\n };\r\n\r\n handleMouseEnter = () => {\r\n const { roI, roiLayers, selectedLayer } = this.props;\r\n if (!this.props.tiles.getIsMousedown()) {\r\n // if mouse is not down when entering image --> start drawing mode\r\n this.drawingEnabled = true;\r\n // set position and props of roi in context --> to fix stop drawing outside of image\r\n this.props.tiles.setRoiProps(this.props.roI);\r\n let posInRoiLayer = roiLayers[selectedLayer].layer.regionRois.findIndex(\r\n (roi) => roi === roI\r\n );\r\n this.props.tiles.setPositionRoi(posInRoiLayer);\r\n } else {\r\n // if mouse is already down when entering image --> do not start drawing mode becaus drawing is enabled on other image\r\n this.props.tiles.setIsInOtherImage(true);\r\n }\r\n // set property that mouse is on image\r\n this.props.tiles.setIsOnImage(true);\r\n };\r\n\r\n mousewheel = (event) => {\r\n const { roI, tools, activeTool, ome } = this.props;\r\n // only zoom if drawing / tool is activated\r\n if (\r\n tools[activeTool] &&\r\n (tools[activeTool].name === \"Pen\" ||\r\n tools[activeTool].name === \"Region\" ||\r\n tools[activeTool].name === \"Rectangle\" ||\r\n tools[activeTool].name === \"Ellipse\")\r\n ) {\r\n // check if zooming would result in zoom outside of whole image\r\n let insideImage =\r\n roI.bounds.left - this.state.pd > 0 &&\r\n roI.bounds.right + this.state.pd < ome.sizeX &&\r\n roI.bounds.top - this.state.pd > 0 &&\r\n roI.bounds.bottom + this.state.pd < ome.sizeY;\r\n\r\n if (insideImage) {\r\n if (event.deltaY < 0) {\r\n // zoom in if possible\r\n if (this.state.pd >= this.state.zoomSpeed) {\r\n this.setState({ pd: this.state.pd - this.state.zoomSpeed });\r\n } else {\r\n this.setState({ pd: 0 });\r\n }\r\n } else {\r\n // zoom out\r\n this.setState({ pd: this.state.pd + this.state.zoomSpeed });\r\n }\r\n } else {\r\n if (event.deltaY < 0) {\r\n // zoom in if possible\r\n if (this.state.pd >= this.state.zoomSpeed) {\r\n this.setState({ pd: this.state.pd - this.state.zoomSpeed });\r\n } else {\r\n this.setState({ pd: 0 });\r\n }\r\n }\r\n }\r\n\r\n // increase zoomspeed by 10%\r\n let imgBoundWidth =\r\n this.props.roI.bounds.right - this.props.roI.bounds.left;\r\n this.setState({ zoomSpeed: (imgBoundWidth + this.state.pd * 2) * 0.1 }); // 10%\r\n } else {\r\n // increase / decrease z level\r\n if (this.props.showZStackBar) {\r\n this.onZStep(event.deltaY < 0 ? 1 : -1);\r\n }\r\n }\r\n\r\n // prevent other scroll actions if there is a zstack\r\n let actTool =\r\n tools[activeTool] &&\r\n (tools[activeTool].name === \"Pen\" ||\r\n tools[activeTool].name === \"Region\" ||\r\n tools[activeTool].name === \"Rectangle\" ||\r\n tools[activeTool].name === \"Ellipse\");\r\n if (this.props.showZStackBar || actTool) {\r\n this.props.roI.firstTimeGallery = true;\r\n event.preventDefault();\r\n this.forceUpdate();\r\n }\r\n };\r\n\r\n getBaseLog(x, y) {\r\n return Math.log(y) / Math.log(x);\r\n }\r\n\r\n onZStep(deltaZ) {\r\n // change z level for roi\r\n let newZ = this.props.roI.z + deltaZ;\r\n if (newZ < 0) newZ = 0;\r\n if (newZ > this.props.ome.sizeZ - 1) newZ = this.props.ome.sizeZ - 1;\r\n if (newZ !== this.props.roI.z) {\r\n this.props.roI.firstTimeGallery = true;\r\n this.props.roI.fullyLoaded = false;\r\n this.props.roI.z = newZ;\r\n }\r\n this.forceUpdate();\r\n }\r\n\r\n render() {\r\n const { classes, ome, tools, activeTool, roI, isBrightfield } = this.props;\r\n\r\n // do not show z-stack bar in upper left while drawing\r\n const drawMode =\r\n tools[activeTool] &&\r\n (tools[activeTool].name === \"Pen\" ||\r\n tools[activeTool].name === \"Region\" ||\r\n tools[activeTool].name === \"Rectangle\" ||\r\n tools[activeTool].name === \"Ellipse\");\r\n\r\n let pixelSize = ome.physicalSizeX / Math.pow(10, -6);\r\n let unit = ome.physicalSizeXUnit;\r\n\r\n return (\r\n
    (this.root = c)}>\r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n (this.canvas = c)}\r\n className={classes.canvas}\r\n onClick={this.handleCanvasClick}\r\n onMouseDown={this.handleCanvasMouseDown}\r\n onContextMenu={(e) => {\r\n this.handleCanvasClick(e);\r\n e.preventDefault();\r\n }}\r\n onMouseMove={this.handleMouseMove}\r\n onMouseUp={this.handleMouseUp}\r\n onMouseLeave={this.handleMouseLeave}\r\n onMouseEnter={(e) => {\r\n this.handleMouseEnter(e);\r\n }}\r\n />\r\n {this.props.drawCrosshair && (\r\n (this.canvasOverlay = c)}\r\n />\r\n )}\r\n
    \r\n {ome.sizeZ > 1 && !drawMode && (\r\n
    \r\n \r\n \r\n this.onZStep(1)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n {this.props.roI.z}\r\n \r\n this.onZStep(-1)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n
    \r\n )}\r\n
    \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nCroppedImage.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n componentRef: PropTypes.func,\r\n onRefresh: PropTypes.func,\r\n ome: PropTypes.object,\r\n histogramConfig: PropTypes.object,\r\n visibleImage: PropTypes.array,\r\n coloredImages: PropTypes.array,\r\n roI: PropTypes.object,\r\n structures: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n canvasWidth: PropTypes.number,\r\n canvasWidthString: PropTypes.string,\r\n gallery: PropTypes.func,\r\n contour: PropTypes.bool,\r\n activeTool: PropTypes.string,\r\n tools: PropTypes.array,\r\n fileId: PropTypes.string,\r\n index: PropTypes.number,\r\n indexOffset: PropTypes.number,\r\n page: PropTypes.number,\r\n roiLayers: PropTypes.array,\r\n fromAI: PropTypes.bool,\r\n drawLayer: PropTypes.object,\r\n updateGallery: PropTypes.func,\r\n startData: PropTypes.number,\r\n alruns: PropTypes.bool,\r\n setAlruns: PropTypes.func,\r\n globalZ: PropTypes.number,\r\n z: PropTypes.number,\r\n t: PropTypes.number,\r\n tiles: PropTypes.object,\r\n opacity: PropTypes.number,\r\n selectedWithKey: PropTypes.bool,\r\n scroll: PropTypes.func,\r\n objectToLoad: PropTypes.object,\r\n setObjectToLoad: PropTypes.func,\r\n isBrightfield: PropTypes.bool,\r\n drawCrosshair: PropTypes.bool,\r\n crosshairLineWidth: PropTypes.number,\r\n crosshairColor: PropTypes.string,\r\n crosshairOpacity: PropTypes.number,\r\n automaticTraining: PropTypes.bool,\r\n classificationId: PropTypes.array,\r\n project: PropTypes.object,\r\n setSelectedWithKey: PropTypes.func,\r\n startAutomaticTraining: PropTypes.func,\r\n giveWarning: PropTypes.func,\r\n setFUllyAnnotated: PropTypes.func,\r\n setAnnotated: PropTypes.func,\r\n showZStackBar: PropTypes.bool,\r\n};\r\n\r\nexport default withTiles(withTheme(withStyles(styles)(CroppedImage)));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport withTheme from \"@mui/styles/withTheme\";\r\n\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nconst styles = {};\r\n\r\nclass SceneImage extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n componentDidMount = () => {};\r\n\r\n componentDidUpdate() {\r\n const { file, scroll, selectedWithKey, galleryMounted } = this.props;\r\n // if file is selected scroll to top\r\n if (file.selectedInGallery && (selectedWithKey || !galleryMounted)) {\r\n scroll(this.image.getBoundingClientRect().top);\r\n }\r\n }\r\n\r\n handleImageClick = (e) => {\r\n const { classificationId, files, file } = this.props;\r\n\r\n if (e.nativeEvent.which === 3) {\r\n // right click\r\n file.classId = classificationId[2];\r\n }\r\n if (e.nativeEvent.which === 1) {\r\n // left click\r\n file.classId = classificationId[1];\r\n }\r\n\r\n // make file selectedIngallery true and other files false\r\n files.forEach((f) => {\r\n f.selectedInGallery = false;\r\n });\r\n file.selectedInGallery = true;\r\n this.props.setSelectedWithKey(false);\r\n\r\n this.props.updateGallery();\r\n };\r\n\r\n getColorFromId = (classId) => {\r\n const { structures } = this.props;\r\n return structures.find((element) => element.id == classId).color;\r\n };\r\n\r\n getParentColor = () => {\r\n const { structures, selectedLayer } = this.props;\r\n return structures[selectedLayer].color;\r\n };\r\n\r\n render() {\r\n const { file, showFileNames } = this.props;\r\n\r\n return (\r\n \r\n \r\n {showFileNames ? file.fileName : \"\"}\r\n \r\n (this.image = i)}\r\n src={Backend.renderThumbnail(file.id)}\r\n alt=\"\"\r\n onClick={this.handleImageClick}\r\n onContextMenu={(e) => {\r\n this.handleImageClick(e);\r\n e.preventDefault();\r\n }}\r\n />\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nSceneImage.propTypes = {\r\n file: PropTypes.object,\r\n structures: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n imageSize: PropTypes.number,\r\n classificationId: PropTypes.array,\r\n scroll: PropTypes.func,\r\n files: PropTypes.array,\r\n updateGallery: PropTypes.func,\r\n setSelectedWithKey: PropTypes.func,\r\n selectedWithKey: PropTypes.bool,\r\n showFileNames: PropTypes.bool,\r\n galleryMounted: PropTypes.bool,\r\n};\r\n\r\nexport default withTheme(withStyles(styles)(SceneImage));\r\n","import React, { Component } from \"react\";\r\n\r\nimport PropTypes from \"prop-types\";\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\n\r\nclass AccuracyGraph extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n componentDidMount() {\r\n // draw graph with accuracy of single training iterations\r\n // draw horizontal lines with accuracy values (y-axis)\r\n const max = 255;\r\n let ctx = this.canvas.getContext(\"2d\");\r\n let w = this.canvas.width;\r\n let h = this.canvas.height;\r\n ctx.clearRect(0, 0, w, h);\r\n ctx.beginPath();\r\n let step = (50 * w) / max;\r\n ctx.font = \"10px Arial\";\r\n ctx.fillStyle = \"#ddd\";\r\n step = h / 5;\r\n for (let s = step, i = 1; s < h; s += step, i++) {\r\n ctx.moveTo(0, s);\r\n ctx.lineTo(w, s);\r\n ctx.fillText(100 - i * 20, 2, s - 2);\r\n }\r\n ctx.strokeStyle = \"#ddd\";\r\n ctx.closePath();\r\n ctx.stroke();\r\n\r\n // draw graph with accuracy points from training iterations\r\n if (this.props.tiles.getGraphAcc()[0]) {\r\n let ctx = this.canvas.getContext(\"2d\");\r\n\r\n let height = this.canvas.height;\r\n let y = this.props.tiles.getGraphAcc()[0];\r\n let factor = height / 100;\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(0, parseInt(-y * factor + height, 10));\r\n\r\n let arr = [];\r\n if (this.props.tiles.getGraphAcc().length <= 10) {\r\n arr = this.props.tiles.getGraphAcc();\r\n } else {\r\n let start = this.props.tiles.getGraphAcc().length - 10;\r\n arr = this.props.tiles.getGraphAcc().slice(start - 1);\r\n }\r\n\r\n // only show last 10 iterations\r\n let x = this.canvas.width / 10;\r\n let cWdt = this.canvas.width;\r\n arr.forEach(function (point) {\r\n ctx.lineTo(x, parseInt(-point * factor + height, 10));\r\n x = x + cWdt / 10;\r\n });\r\n\r\n ctx.strokeStyle = \"#FF0000\";\r\n ctx.stroke();\r\n }\r\n }\r\n\r\n componentDidUpdate() {}\r\n\r\n UNSAFE_componentWillUpdate() {\r\n // draw graph with accuracy of single training iterations\r\n if (this.props.tiles.getGraphAcc()[0]) {\r\n // draw horizontal lines with accuracy values (y-axis)\r\n const max = 255;\r\n let ctx = this.canvas.getContext(\"2d\");\r\n let w = this.canvas.width;\r\n let h = this.canvas.height;\r\n ctx.clearRect(0, 0, w, h);\r\n ctx.beginPath();\r\n let step = (50 * w) / max;\r\n ctx.font = \"10px Arial\";\r\n ctx.fillStyle = \"#ddd\";\r\n step = h / 5;\r\n for (let s = step, i = 1; s < h; s += step, i++) {\r\n ctx.moveTo(0, s);\r\n ctx.lineTo(w, s);\r\n ctx.fillText(100 - i * 20, 2, s - 2);\r\n }\r\n ctx.strokeStyle = \"#ddd\";\r\n ctx.closePath();\r\n ctx.stroke();\r\n\r\n // draw graph with accuracy points from training iterations\r\n let height = this.canvas.height;\r\n let y = this.props.tiles.getGraphAcc()[0];\r\n let factor = height / 100;\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(0, parseInt(-y * factor + height, 10));\r\n\r\n let arr = [];\r\n if (this.props.tiles.getGraphAcc().length <= 10) {\r\n arr = this.props.tiles.getGraphAcc();\r\n } else {\r\n let start = this.props.tiles.getGraphAcc().length - 10;\r\n arr = this.props.tiles.getGraphAcc().slice(start - 1);\r\n }\r\n\r\n // only show last 10 iterations\r\n let x = this.canvas.width / 10;\r\n let cWdt = this.canvas.width;\r\n arr.forEach(function (point) {\r\n ctx.lineTo(x, parseInt(-point * factor + height, 10));\r\n x = x + cWdt / 10;\r\n });\r\n\r\n ctx.strokeStyle = \"#FF0000\";\r\n ctx.stroke();\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n
    (this.root = c)}>\r\n
    \r\n Overall model progress:\r\n
    \r\n (this.canvas = c)}\r\n />\r\n
    \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nAccuracyGraph.propTypes = {\r\n ome: PropTypes.object,\r\n histogramConfig: PropTypes.object,\r\n visibleImage: PropTypes.array,\r\n coloredImages: PropTypes.array,\r\n bounds: PropTypes.object,\r\n // from withTiles\r\n tiles: PropTypes.object,\r\n};\r\n\r\n//export default withTheme(withStyles(styles)(AccuracyGraph));\r\nexport default withTiles(AccuracyGraph);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport Draggable from \"react-draggable\";\r\nimport { Resizable } from \"react-resizable\";\r\nimport classNames from \"classnames\";\r\n\r\nimport {\r\n Typography,\r\n Checkbox,\r\n Select,\r\n MenuItem,\r\n Tooltip,\r\n TextField,\r\n Card,\r\n Slider,\r\n List,\r\n ListItem,\r\n ListItemText,\r\n FormGroup,\r\n FormControlLabel,\r\n CircularProgress,\r\n Tabs,\r\n Tab,\r\n Button,\r\n} from \"@mui/material\";\r\n\r\nimport {\r\n ChatBubbleOutline,\r\n DragIndicator,\r\n Build,\r\n Keyboard,\r\n Mouse,\r\n} from \"@mui/icons-material\";\r\n\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faBrain } from \"@fortawesome/free-solid-svg-icons\";\r\n\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\nimport { withPersistentStorage } from \"../contexts/PersistentStorageContext\";\r\nimport { withAllViewerContexts } from \"../contexts/AllViewerContexts\";\r\nimport AccuracyGraph from \"./AccuracyGraph\";\r\nimport SketchColorPicker from \"../../common/components/SketchColorPicker\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = () => ({\r\n tabsContainer: {\r\n width: \"100%\",\r\n },\r\n tab: {\r\n \"& *\": {\r\n display: \"inline-block\",\r\n fontSize: \"12px\",\r\n },\r\n \"& svg\": {\r\n marginRight: \"5px\",\r\n position: \"relative\",\r\n top: \"2px\",\r\n },\r\n },\r\n flexVerticalContainer: {\r\n display: \"flex\",\r\n flexFlow: \"column\",\r\n height: \"100%\",\r\n },\r\n flexRowContentHeight: {\r\n flex: \"0 1 auto\",\r\n padding: \"10px\",\r\n },\r\n flexRowRemainingHeight: {\r\n flex: \"1 1 auto\",\r\n overflowY: \"auto\",\r\n },\r\n spacing: {\r\n padding: \"10px\",\r\n paddingBottom: 0,\r\n },\r\n dragIndicator: {\r\n position: \"absolute\",\r\n color: \"#000000\",\r\n cursor: \"grab\",\r\n bottom: 5,\r\n right: 5,\r\n },\r\n grabbing: {\r\n cursor: \"grabbing\",\r\n },\r\n toolBox: {\r\n marginLeft: \"5px\",\r\n marginRight: \"10px\",\r\n marginTop: \"7px\",\r\n display: \"inline-block\",\r\n },\r\n aiLabel: {\r\n display: \"block\",\r\n position: \"absolute\",\r\n bottom: \"11px\",\r\n right: \"4px\",\r\n background: \"black\",\r\n color: \"white\",\r\n zIndex: 99999,\r\n padding: \"0 5px\",\r\n margin: 0,\r\n },\r\n imgOuter: {\r\n \"&:hover .aiLabel\": {\r\n display: \"none\",\r\n },\r\n },\r\n});\r\n\r\nclass GalleryToolBoxes extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n grabbing: false,\r\n toolbarSize: {\r\n width: 300,\r\n height:\r\n this.props.project &&\r\n !this.props.project.type.includes(\"HistoPointCounting\")\r\n ? 355\r\n : 525,\r\n },\r\n originalToolbarHeight: 355,\r\n comboBoxSizeOptions: [\r\n \"small (200px)\",\r\n \"medium (300px)\",\r\n \"large (600px)\",\r\n \"full width\",\r\n ],\r\n showContour: false,\r\n showFileNames: true,\r\n drawCrosshair: this.props.showGallery ? false : true,\r\n crosshairColor: \"#FF0000\",\r\n crosshairOpacity: 1.0,\r\n crosshairLineWidth: 1,\r\n activeTab: 0,\r\n automaticTraining: false,\r\n };\r\n }\r\n\r\n getProjectLabel = () => {\r\n // returns project label form viewerconfig\r\n if (this.props.viewerConfig) {\r\n return this.props.viewerConfig.project.label;\r\n }\r\n };\r\n\r\n isScrollbarVisible = () => {\r\n let el = document.getElementById(\"subtypesDiv\");\r\n if (el !== null) {\r\n return el.scrollHeight > el.clientHeight;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n onResize = (event, { size }) => {\r\n let minSizeHeight = 200;\r\n size.height = size.height < minSizeHeight ? minSizeHeight : size.height;\r\n this.setState({ toolbarSize: size });\r\n };\r\n\r\n handleChangeContour = (e) => {\r\n const { setDrawContour } = this.props;\r\n setDrawContour(e.target.checked ? true : false);\r\n this.setState({ showContour: e.target.checked ? true : false });\r\n };\r\n\r\n handleChangeShowFileNames = (e) => {\r\n const { setShowFileNames } = this.props;\r\n setShowFileNames(e.target.checked ? true : false);\r\n this.setState({ showFileNames: e.target.checked ? true : false });\r\n };\r\n\r\n handleChangeCombo = (e) => {\r\n // change canvas size\r\n if (e.target.value === 1) {\r\n this.props.projectContext.setState({ galleryImageSize: 200 });\r\n } else if (e.target.value === 2) {\r\n this.props.projectContext.setState({ galleryImageSize: 300 });\r\n } else if (e.target.value === 3) {\r\n this.props.projectContext.setState({ galleryImageSize: 600 });\r\n } else {\r\n this.props.projectContext.setState({ galleryImageSize: -1 });\r\n }\r\n this.setFirstTimeGallery();\r\n this.forceUpdate();\r\n };\r\n\r\n setFirstTimeGallery = () => {\r\n // firstTimeGallery = true --> load new tiles\r\n this.props.roiLayers[this.props.selectedLayer].layer.regionRois.forEach(\r\n function (element) {\r\n element.firstTimeGallery = true;\r\n }\r\n );\r\n };\r\n\r\n getStructuresForDropDown = () => {\r\n const { structures, selectedLayer } = this.props;\r\n\r\n let parentIndex = selectedLayer;\r\n if (structures[selectedLayer].classificationSubtype) {\r\n parentIndex = this.findParentIndex();\r\n }\r\n\r\n let childs = structures.filter(\r\n (element) =>\r\n element.parentId === structures[parentIndex].id &&\r\n element.label !== \"leer [leer]\"\r\n );\r\n childs.unshift(structures[parentIndex]);\r\n return childs;\r\n };\r\n\r\n findChilds = (subType) => {\r\n const { structures } = this.props;\r\n // return direct classification subtypes of selected structure\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n findParentIndex = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // returns index of parentstructure in all structures\r\n let parentIndex = structures.findIndex(\r\n (element) => element.id === structures[selectedLayer].parentId\r\n );\r\n return parentIndex;\r\n };\r\n\r\n handleChangeFilteredStructure = (e) => {\r\n const { structures, selectedLayer } = this.props;\r\n\r\n let parentIndex = selectedLayer;\r\n if (structures[selectedLayer].classificationSubtype) {\r\n parentIndex = this.findParentIndex();\r\n }\r\n\r\n // find index of leer --> add 1 of all childs after leer\r\n // get index of class leer in childs\r\n let childs = this.findChilds(structures[parentIndex]);\r\n let emptyIdx = childs.findIndex(\r\n (element) => element.label === \"leer [leer]\"\r\n );\r\n let idx = e.target.value;\r\n if (emptyIdx >= 0 && e.target.value >= emptyIdx + 1) {\r\n idx = idx + 1;\r\n }\r\n\r\n this.props.onSelectLayer(parentIndex + idx);\r\n this.props.tiles.setStructure(structures[parentIndex + idx]);\r\n };\r\n\r\n handleChangeCrosshair = (e, fromKeyPress) => {\r\n const { setDrawCrosshair } = this.props;\r\n if (fromKeyPress) {\r\n this.setState({ drawCrosshair: this.state.drawCrosshair ? false : true });\r\n setDrawCrosshair(this.state.drawCrosshair ? false : true);\r\n } else {\r\n this.setState({ drawCrosshair: e.target.checked ? true : false });\r\n setDrawCrosshair(e.target.checked ? true : false);\r\n }\r\n };\r\n\r\n handleChangeActiveTab = (event, value) => {\r\n const { setAutomaticTraining } = this.props;\r\n this.setState({ activeTab: value });\r\n setAutomaticTraining(value === 1 ? true : false);\r\n };\r\n\r\n startTraining = (activeLearning) => {\r\n const { structures, selectedLayer } = this.props;\r\n // start training for dl model\r\n\r\n // check if selectedLayer is parent\r\n if (structures[selectedLayer].classificationSubtype) {\r\n this.props.trainingWarning(\"subtype\");\r\n return;\r\n }\r\n\r\n // check if structure has childs\r\n // check if selectedLayer is parent\r\n if (!structures[selectedLayer].hasChild) {\r\n this.props.trainingWarning(\"hasNoChilds\");\r\n return;\r\n }\r\n\r\n // check if enough objects per class\r\n let childs = this.findClassificationChilds();\r\n let enoughAnnos = this.enoughAnnotations(childs);\r\n if (!enoughAnnos) {\r\n this.props.trainingWarning(\"tooFewAnnotations\");\r\n return;\r\n }\r\n\r\n this.props.saveChangesGallery();\r\n this.props.setAlruns(true);\r\n let passiveLearning = activeLearning ? false : true;\r\n this.props.applyDL(\r\n this.props.tools[\"alm_gallery_tool\"],\r\n this.props.projectId,\r\n this.props.fileId,\r\n passiveLearning\r\n );\r\n };\r\n\r\n findClassificationChilds = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // return direct classification subtypes\r\n return structures.filter(\r\n (element) =>\r\n element.parentId === structures[selectedLayer].id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n enoughAnnotations = (childs) => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n // check if enough annotations for training of dl model (at least one class with 5 annotations and one other class with 1 annotation)\r\n let minFive = false;\r\n let twoAnnotated = 0;\r\n childs.forEach((element) => {\r\n // get number of elements for child\r\n let numberElements = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (roi) => roi.structureId === element.id\r\n ).length;\r\n\r\n // check if minimum of five in one class\r\n if (numberElements >= 5) {\r\n minFive = true;\r\n }\r\n // check if two classes with at least one element\r\n if (numberElements >= 1) {\r\n twoAnnotated = twoAnnotated + 1;\r\n }\r\n });\r\n\r\n // if one class with at least five and one other class with at least one annotation --> enough annotations for training\r\n let enough = false;\r\n if (minFive && twoAnnotated >= 2) {\r\n enough = true;\r\n }\r\n return enough;\r\n };\r\n\r\n applyModel = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // apply trained dl model to selected structure unlabeled images\r\n\r\n // check if selectedLayer is parent\r\n if (structures[selectedLayer].classificationSubtype) {\r\n this.props.trainingWarning(\"subtype\");\r\n return;\r\n }\r\n\r\n // check if structure has childs\r\n // check if selectedLayer is parent\r\n if (!structures[selectedLayer].hasChild) {\r\n this.props.trainingWarning(\"hasNoChilds\");\r\n return;\r\n }\r\n\r\n // make warning that not changing layer while applying model\r\n window.showWarningSnackbar(\r\n \"Please do not change structure while applying the model.\"\r\n );\r\n\r\n this.props.saveChangesGallery();\r\n this.props.setAlruns(true);\r\n let passiveLearning = true;\r\n let applyModel = true;\r\n this.props.applyDL(\r\n this.props.tools[\"alm_gallery_tool\"],\r\n this.props.projectId,\r\n this.props.fileId,\r\n passiveLearning,\r\n applyModel\r\n );\r\n };\r\n\r\n handleChangeMakePredictions = (e) => {\r\n const { setApplyModelAfterTraining } = this.props;\r\n // change state of make predictions after training\r\n setApplyModelAfterTraining(e.target.checked ? true : false);\r\n };\r\n\r\n checkToolInConfig = (toolName) => {\r\n // checks if tool exists in viewerconfig\r\n if (this.props.viewerConfig) {\r\n if (this.props.viewerConfig.project.toolsInProject[toolName]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n };\r\n\r\n render() {\r\n const {\r\n classes,\r\n selectedLayer,\r\n structures,\r\n roiLayers,\r\n childsGallery,\r\n childs,\r\n classificationId,\r\n showGallery,\r\n page,\r\n setCrosshairColor,\r\n setCrosshairOpacity,\r\n setCrosshairLineWidth,\r\n galleryType,\r\n } = this.props;\r\n const { grabbing, activeTab, comboBoxSizeOptions } = this.state;\r\n\r\n let comboBoxSizeValue = comboBoxSizeOptions.filter((option) =>\r\n option.includes(String(this.props.projectContext.galleryImageSize))\r\n )[0];\r\n\r\n if (this.props.projectContext.galleryImageSize == -1) {\r\n comboBoxSizeValue = \"full width\";\r\n }\r\n\r\n return (\r\n
    \r\n {showGallery && (\r\n this.setState({ grabbing: true })}\r\n onStop={() => this.setState({ grabbing: false })}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n Preview size\r\n \r\n \r\n \r\n {comboBoxSizeValue}\r\n \r\n small (200px)\r\n medium (300px)\r\n large (600px)\r\n {galleryType == \"FilesGallery\" && (\r\n full width\r\n )}\r\n \r\n \r\n\r\n {this.props.project.type.includes(\"HistoPointCounting\") && (\r\n \r\n Filter structure:\r\n element.id === structures[selectedLayer].id\r\n )}\r\n onChange={this.handleChangeFilteredStructure}\r\n >\r\n {this.getStructuresForDropDown().map((structure, idx) => (\r\n \r\n {structure.label}\r\n \r\n ))}\r\n \r\n \r\n )}\r\n\r\n {!this.props.project.type.includes(\"HistoPointCounting\") &&\r\n galleryType !== \"FilesGallery\" && (\r\n \r\n }\r\n />\r\n )}\r\n\r\n \r\n \r\n \r\n {!this.props.project.type.includes(\r\n \"HistoPointCounting\"\r\n ) && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {childsGallery.map((child, index) => (\r\n {\r\n let x = {\r\n name: child.label,\r\n color: child.color,\r\n id: child.id,\r\n };\r\n let structureId = structures[selectedLayer].id;\r\n if (\r\n e.nativeEvent.which === 3 &&\r\n classificationId[1] !== child.id\r\n ) {\r\n // right click\r\n this.props.tiles.setSingleSubtype(\r\n structureId,\r\n x,\r\n 1\r\n );\r\n classificationId[2] = child.id;\r\n } else if (\r\n e.nativeEvent.which === 1 &&\r\n classificationId[2] !== child.id\r\n ) {\r\n // left click\r\n this.props.tiles.setSingleSubtype(\r\n structureId,\r\n x,\r\n 0\r\n );\r\n classificationId[1] = child.id;\r\n }\r\n this.forceUpdate();\r\n }}\r\n >\r\n \r\n {!this.props.project.type.includes(\r\n \"HistoPointCounting\"\r\n ) &&\r\n child.id === classificationId[1] && (\r\n \r\n L\r\n \r\n )}\r\n {!this.props.project.type.includes(\r\n \"HistoPointCounting\"\r\n ) &&\r\n child.id === classificationId[2] && (\r\n \r\n R\r\n \r\n )}\r\n \r\n {!this.props.project.type.includes(\r\n \"HistoPointCounting\"\r\n )\r\n ? index\r\n : index + 1}\r\n \r\n \r\n ))}\r\n \r\n
    \r\n\r\n {!this.props.project.type.includes(\"HistoPointCounting\") &&\r\n galleryType == \"FilesGallery\" && (\r\n \r\n }\r\n />\r\n )}\r\n\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {showGallery && this.checkToolInConfig(\"GalleryTrainingTool\") && (\r\n this.setState({ grabbing: true })}\r\n onStop={() => this.setState({ grabbing: false })}\r\n >\r\n \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n \r\n Training information:\r\n \r\n\r\n
    \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n {\"Epochs: \" + this.props.progressText}\r\n \r\n\r\n
    \r\n\r\n \r\n {\"Accuracy: \" +\r\n Math.round(parseFloat(this.props.trainingAcc) * 100) +\r\n \"%\"}\r\n \r\n\r\n
    \r\n\r\n {activeTab === 1 && (\r\n
    \r\n \r\n \r\n Annotations for next training:\r\n \r\n \r\n {\r\n this.props.setStartData(Number(e.target.value));\r\n }}\r\n onMouseEnter={() => {\r\n document.getElementById(\"nAnnos\").disabled = false;\r\n this.props.tiles.setOnPageInput(true);\r\n }}\r\n onMouseLeave={() => {\r\n this.props.tiles.setOnPageInput(false);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n //not tested, because not in use\r\n this.props.tiles.setOnPageInput(false);\r\n document.getElementById(\"nAnnos\").disabled = true;\r\n }\r\n }}\r\n />\r\n
    \r\n
    \r\n )}\r\n\r\n \r\n\r\n {activeTab === 0 && (\r\n
    \r\n \r\n }\r\n />\r\n\r\n this.startTraining()}\r\n >\r\n Train model\r\n \r\n\r\n this.applyModel()}\r\n >\r\n Apply model\r\n \r\n
    \r\n )}\r\n\r\n {activeTab === 1 && (\r\n this.startTraining(true)}\r\n >\r\n Train and apply model\r\n \r\n )}\r\n\r\n {this.props.alruns && activeTab === 1 && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n )}\r\n\r\n {!this.props.showGallery && (\r\n this.setState({ grabbing: true })}\r\n onStop={() => this.setState({ grabbing: false })}\r\n >\r\n \r\n \r\n \r\n \r\n\r\n \r\n Show crosshair:\r\n \r\n \r\n
    \r\n \r\n Crosshair color:\r\n \r\n
    \r\n {\r\n this.setState({ crosshairColor: color });\r\n setCrosshairColor(color);\r\n }}\r\n />\r\n
    \r\n
    \r\n \r\n Opacity crosshair:\r\n \r\n {\r\n this.setState({ crosshairOpacity: newValue / 100 });\r\n setCrosshairOpacity(newValue / 100);\r\n }}\r\n />\r\n
    \r\n \r\n Crosshair linewidth:\r\n \r\n {\r\n this.setState({ crosshairLineWidth: Number(e.target.value) });\r\n setCrosshairLineWidth(Number(e.target.value));\r\n }}\r\n inputProps={{\r\n step: 1,\r\n min: 0,\r\n max: 30,\r\n type: \"number\",\r\n }}\r\n />\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {childs.map((child, index) => (\r\n {\r\n if (\r\n e.nativeEvent.which === 3 &&\r\n classificationId[1] !== child.id\r\n ) {\r\n // right click\r\n classificationId[2] = child.id;\r\n } else if (\r\n e.nativeEvent.which === 1 &&\r\n classificationId[2] !== child.id\r\n ) {\r\n // left click\r\n classificationId[1] = child.id;\r\n }\r\n this.forceUpdate();\r\n }}\r\n >\r\n \r\n {child.id === classificationId[1] && (\r\n \r\n L\r\n \r\n )}\r\n {child.id === classificationId[2].id && (\r\n \r\n R\r\n \r\n )}\r\n \r\n {index + 1}\r\n \r\n \r\n ))}\r\n \r\n \r\n\r\n \r\n \r\n \r\n )}\r\n\r\n {!this.props.showGallery && (\r\n this.setState({ grabbing: true })}\r\n onStop={() => this.setState({ grabbing: false })}\r\n >\r\n \r\n \r\n \r\n \r\n\r\n {\r\n roiLayers[selectedLayer].layer.regionRois[page].comment =\r\n e.target.value;\r\n this.forceUpdate();\r\n }}\r\n onMouseEnter={() => {\r\n document.getElementById(\"roiComment\").disabled = false;\r\n this.props.tiles.setOnPageInput(true);\r\n }}\r\n onMouseLeave={() => {\r\n this.props.tiles.setOnPageInput(false);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n // not tested, because not in use\r\n this.props.tiles.setOnPageInput(false);\r\n document.getElementById(\"roiComment\").disabled = true;\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nGalleryToolBoxes.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n roiLayers: PropTypes.array,\r\n structures: PropTypes.array,\r\n showGallery: PropTypes.bool,\r\n setDrawContour: PropTypes.func,\r\n setShowFileNames: PropTypes.func,\r\n viewerConfig: PropTypes.object,\r\n tiles: PropTypes.object,\r\n tools: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n page: PropTypes.number,\r\n projectId: PropTypes.string,\r\n fileId: PropTypes.string,\r\n classificationId: PropTypes.array,\r\n onSelectLayer: PropTypes.func,\r\n setDrawCrosshair: PropTypes.func,\r\n setAutomaticTraining: PropTypes.func,\r\n trainingWarning: PropTypes.func,\r\n saveChangesGallery: PropTypes.func,\r\n setAlruns: PropTypes.func,\r\n applyDL: PropTypes.func,\r\n setApplyModelAfterTraining: PropTypes.func,\r\n setCrosshairColor: PropTypes.func,\r\n setCrosshairOpacity: PropTypes.func,\r\n setCrosshairLineWidth: PropTypes.func,\r\n childsGallery: PropTypes.array,\r\n childs: PropTypes.array,\r\n progressText: PropTypes.string,\r\n trainingAcc: PropTypes.string,\r\n startData: PropTypes.number,\r\n setStartData: PropTypes.func,\r\n makePredictions: PropTypes.bool,\r\n alruns: PropTypes.bool,\r\n galleryType: PropTypes.string,\r\n projectContext: PropTypes.object,\r\n};\r\n\r\nexport default withAllViewerContexts(\r\n withPersistentStorage(withTiles(withStyles(styles)(GalleryToolBoxes)))\r\n);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport {\r\n Grid,\r\n TablePagination,\r\n Tooltip,\r\n //TextField,\r\n CircularProgress,\r\n} from \"@mui/material\";\r\n\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\nimport { withPersistentStorage } from \"../contexts/PersistentStorageContext\";\r\nimport { withAllViewerContexts } from \"../contexts/AllViewerContexts\";\r\nimport CroppedImage from \"./CroppedImage\";\r\nimport SceneImage from \"./SceneImage\";\r\nimport GalleryToolBoxes from \"./GalleryToolBoxes\";\r\nimport { getParentIndexLayer } from \"../utils/StructuresUtils\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = () => ({\r\n tabsContainer: {\r\n width: \"100%\",\r\n },\r\n tab: {\r\n minWidth: 345 / 3,\r\n \"& *\": {\r\n display: \"inline-block\",\r\n fontSize: \"20px\",\r\n lineHeight: \"18px\",\r\n },\r\n \"& svg\": {\r\n marginRight: \"5px\",\r\n position: \"relative\",\r\n top: \"2px\",\r\n },\r\n },\r\n flexVerticalContainer: {\r\n display: \"flex\",\r\n flexFlow: \"column\",\r\n height: \"100%\",\r\n },\r\n flexRowContentHeight: {\r\n flex: \"0 1 auto\",\r\n padding: \"10px\",\r\n },\r\n flexRowRemainingHeight: {\r\n flex: \"1 1 auto\",\r\n overflowY: \"auto\",\r\n },\r\n spacing: {\r\n padding: \"10px\",\r\n paddingBottom: 0,\r\n },\r\n dragIndicator: {\r\n position: \"absolute\",\r\n color: \"#000000\",\r\n cursor: \"grab\",\r\n bottom: 5,\r\n right: 5,\r\n },\r\n grabbing: {\r\n cursor: \"grabbing\",\r\n },\r\n toolBox: {\r\n marginLeft: \"5px\",\r\n marginRight: \"10px\",\r\n marginTop: \"7px\",\r\n display: \"inline-block\",\r\n },\r\n aiLabel: {\r\n display: \"block\",\r\n position: \"absolute\",\r\n bottom: \"11px\",\r\n right: \"4px\",\r\n background: \"black\",\r\n color: \"white\",\r\n zIndex: 99999,\r\n padding: \"0 5px\",\r\n margin: 0,\r\n },\r\n imgOuter: {\r\n \"&:hover .aiLabel\": {\r\n display: \"none\",\r\n },\r\n },\r\n});\r\n\r\nclass Gallery extends Component {\r\n constructor(props) {\r\n super(props);\r\n // transmit context to componentRef\r\n if (props.componentRef) props.componentRef(this);\r\n\r\n this.state = {\r\n page: 0,\r\n rowsPerPage: this.getRowsPerPageForProject(),\r\n drawContour: false,\r\n showFileNames: true,\r\n galleryMounted: false,\r\n drawCrosshair: this.props.showGallery ? false : true,\r\n crosshairColor: \"#FF0000\",\r\n crosshairOpacity: 1.0,\r\n crosshairLineWidth: 1,\r\n canvasSize: this.props.showGallery ? 300 : 750,\r\n startData: 50,\r\n automaticTraining: false,\r\n elementCount: 0,\r\n z: 0,\r\n t: 0,\r\n playingZ: false,\r\n zsr: 60,\r\n playDirectionZ: 1,\r\n selectedWithKey: false,\r\n isBrightfield:\r\n this.props.ome &&\r\n this.props.ome.channels.length === 1 &&\r\n this.props.ome.channels[0].type === \"brightfield\",\r\n objectToLoad: {\r\n index: 0,\r\n roi: null,\r\n rois: [],\r\n },\r\n progressText: \"0/50\",\r\n trainingAcc: \"0\",\r\n };\r\n\r\n this.enoughAnnosCount = 0;\r\n this.tile = [];\r\n this.pageIndex = 0;\r\n this.classificationId = [0, 0, 0];\r\n this.pageInput = \"\";\r\n this.validationAcc = 0;\r\n }\r\n\r\n setDrawContour = (e) => {\r\n // set value from toolbox component\r\n this.setState({ drawContour: e });\r\n };\r\n\r\n setShowFileNames = (e) => {\r\n // set value from toolbox component\r\n this.setState({ showFileNames: e });\r\n };\r\n\r\n setAutomaticTraining = (e) => {\r\n // set value from toolbox component\r\n this.setState({ automaticTraining: e });\r\n };\r\n\r\n setDrawCrosshair = (e) => {\r\n // set value from toolbox component\r\n this.setState({ drawCrosshair: e });\r\n };\r\n\r\n setCrosshairColor = (e) => {\r\n // set value from toolbox component\r\n this.setState({ crosshairColor: e });\r\n };\r\n\r\n setCrosshairOpacity = (e) => {\r\n // set value from toolbox component\r\n this.setState({ crosshairOpacity: e });\r\n };\r\n\r\n setCrosshairLineWidth = (e) => {\r\n // set value from toolbox component\r\n this.setState({ crosshairLineWidth: e });\r\n };\r\n\r\n setStartData = (e) => {\r\n // set value from toolbox component\r\n this.setState({ startData: e });\r\n };\r\n\r\n componentDidMount() {\r\n this.setElementCount();\r\n setTimeout(() => {\r\n this.setState({ galleryMounted: true });\r\n }, 1000);\r\n }\r\n\r\n allImagesLoaded = () => {\r\n const { tiles } = this.props;\r\n // check if all images finished loading\r\n let allImagesComplete = true;\r\n for (let value of Object.values(tiles.getVisibleImages())) {\r\n if (!value.complete) {\r\n allImagesComplete = false;\r\n }\r\n }\r\n return allImagesComplete;\r\n };\r\n\r\n setObjectToLoad = (fromChangePage, fromMount) => {\r\n const { structures, roiLayers, selectedLayer } = this.props;\r\n // set next roi for loading its images from backend or cache\r\n\r\n let idx = 0;\r\n let loadedRois;\r\n if (fromMount) {\r\n // if component mounts\r\n if (this.props.showGallery) {\r\n idx =\r\n this.props.tiles.getPage(structures[selectedLayer].id) *\r\n this.state.rowsPerPage;\r\n } else {\r\n idx =\r\n this.props.tiles.getTilePage(structures[selectedLayer].id) *\r\n this.state.rowsPerPage;\r\n }\r\n loadedRois = [];\r\n } else {\r\n // if objectToLoad was already set\r\n let pg;\r\n if (this.props.showGallery) {\r\n pg = this.props.tiles.getPage(structures[selectedLayer].id);\r\n } else {\r\n pg = this.props.tiles.getTilePage(structures[selectedLayer].id);\r\n }\r\n idx = fromChangePage\r\n ? pg * this.state.rowsPerPage\r\n : this.state.objectToLoad.index + 1;\r\n // get rois that are already loaded\r\n loadedRois = this.state.objectToLoad.rois;\r\n }\r\n\r\n // get next roi\r\n let roi;\r\n if (!structures[selectedLayer].classificationSubtype) {\r\n if (this.props.project.type.includes(\"HistoPointCounting\")) {\r\n roi = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (element) =>\r\n element.isSubtype && element.subtypeName !== \"leer [leer]\"\r\n )[idx];\r\n } else {\r\n roi = roiLayers[selectedLayer].layer.regionRois[idx];\r\n }\r\n } else {\r\n // get subtypeRois\r\n let parentIdx = getParentIndexLayer(\r\n structures[selectedLayer],\r\n structures\r\n );\r\n let subtypeRois = roiLayers[parentIdx].layer.regionRois.filter(\r\n (element) => this.isRoiSubtype(element)\r\n );\r\n roi = subtypeRois[idx];\r\n }\r\n\r\n // push new roi to loaded rois\r\n if (!loadedRois.includes(roi) && roi) {\r\n loadedRois.push(roi);\r\n }\r\n\r\n // new objectToLoad\r\n let x = {\r\n index: idx,\r\n roi: roi,\r\n rois: loadedRois,\r\n };\r\n this.setState({ objectToLoad: x });\r\n };\r\n\r\n getRowsPerPageForProject() {\r\n // checks default value for rows per page for specific modules\r\n if (this.props.showGallery) {\r\n if (this.getProjectLabel() === \"Polarity - Gallery\") {\r\n return 10;\r\n } else if (this.getProjectLabel() === \"Tiles Tool\") {\r\n return 18;\r\n } else {\r\n return 10;\r\n }\r\n } else {\r\n return 1;\r\n }\r\n }\r\n\r\n getRowsPerPageOptionsForProject() {\r\n // checks default value for rows per page options for specific modules\r\n if (this.props.showGallery) {\r\n if (this.getProjectLabel() === \"Polarity - Gallery\") {\r\n return [10, 15];\r\n } else if (this.getProjectLabel() === \"Tiles Tool\") {\r\n return [18];\r\n } else {\r\n return [10, 20];\r\n }\r\n } else {\r\n return [1];\r\n }\r\n }\r\n\r\n getProjectLabel = () => {\r\n // returns project label from viewerconfig\r\n if (this.props.viewerConfig) {\r\n return this.props.viewerConfig.project.label;\r\n }\r\n };\r\n\r\n findParentIndex = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // returns index of parentstructure in all structures\r\n let parentIndex = structures.findIndex(\r\n (element) => element.id === structures[selectedLayer].parentId\r\n );\r\n return parentIndex;\r\n };\r\n\r\n checkToolInConfig = (toolName) => {\r\n // checks if tool exists in viewerconfig\r\n if (this.props.viewerConfig) {\r\n if (this.props.viewerConfig.project.toolsInProject[toolName]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n };\r\n\r\n setElementCount = () => {\r\n const { structures, selectedLayer, roiLayers, project, galleryType } =\r\n this.props;\r\n\r\n let elCnt = 0;\r\n let structure = structures[selectedLayer];\r\n if (galleryType !== \"FilesGallery\") {\r\n // calculate number of elements in selected layer\r\n if (structure.isSubtype && structure.classificationSubtype) {\r\n // get all childNames to find rois\r\n let childNames = [];\r\n this.findAllSubtypes(true).forEach((element) => {\r\n childNames.push(element.label);\r\n });\r\n // get number of rois of subtypes in parent layer\r\n let parentIndex = getParentIndexLayer(\r\n structures[selectedLayer],\r\n structures\r\n );\r\n elCnt = roiLayers[parentIndex].layer.regionRois.filter(\r\n (element) =>\r\n element.isSubtype &&\r\n (childNames.includes(element.subtypeName) ||\r\n element.subtypeName === structure.label)\r\n ).length;\r\n } else {\r\n if (project.type.includes(\"HistoPointCounting\")) {\r\n // count only subtype objects\r\n elCnt = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (element) =>\r\n element.isSubtype && element.subtypeName !== \"leer [leer]\"\r\n ).length;\r\n } else {\r\n // count all objects in parent layer\r\n elCnt = roiLayers[selectedLayer].layer.regionRois.length;\r\n }\r\n }\r\n this.state.elementCount !== elCnt &&\r\n this.setState({ elementCount: elCnt });\r\n } else {\r\n // calculate number of files that belong to selected class\r\n if (structure.classificationSubtype) {\r\n // get all childNames to find rois\r\n let childIds = [];\r\n this.findAllSubtypes(true).forEach((element) => {\r\n childIds.push(element.id);\r\n });\r\n childIds.push(structure.id); // add selected structure\r\n elCnt = project.files.filter(\r\n (element) => element.classId && childIds.includes(element.classId)\r\n ).length;\r\n } else {\r\n elCnt = project.files.length;\r\n }\r\n\r\n this.state.elementCount !== elCnt &&\r\n this.setState({ elementCount: elCnt });\r\n }\r\n };\r\n\r\n componentDidUpdate() {\r\n const { structures, selectedLayer } = this.props;\r\n // get subtypes for selected structure\r\n let subtypes = this.props.tiles.getSubtypes(structures[selectedLayer].id);\r\n // set colors for subtypes\r\n if (subtypes[0]) {\r\n this.classificationId[1] = subtypes[0].id;\r\n }\r\n if (subtypes[1]) {\r\n this.classificationId[2] = subtypes[1].id;\r\n }\r\n this.classificationId[0] = structures[selectedLayer].id;\r\n }\r\n\r\n updateGallery = () => {\r\n // update gallery (from cropped image)\r\n this.forceUpdate();\r\n };\r\n\r\n UNSAFE_componentWillMount() {\r\n const { selectedObjects, structures, selectedLayer } = this.props;\r\n\r\n // push saved acc points to context\r\n if (this.props.tiles.getAccPoints().length === 0) {\r\n for (let i = 0; i < selectedObjects.coordinates.length; i++) {\r\n let acc = selectedObjects.coordinates[i][\"acc\"];\r\n if (Math.round(selectedObjects.coordinates[i][\"acc\"]) !== -1) {\r\n this.props.tiles.pushAccPoint(acc * 100);\r\n }\r\n }\r\n // set first iteration false if there were AL iteratoins before\r\n if (selectedObjects.coordinates.length > 1) {\r\n this.props.tiles.setFirstIteration(false);\r\n }\r\n }\r\n\r\n // set context annotations count\r\n if (this.props.tiles.getStrAnnoCount().length === 0) {\r\n let object = this.props.persistentStorage.load(\"contextObject\");\r\n if (object && object.length === this.props.structures.length) {\r\n this.props.tiles.setAnnoCount(object);\r\n } else {\r\n this.setAnnotationsContext();\r\n }\r\n }\r\n\r\n // set context slected subtypes and pages\r\n if (this.props.tiles.getSubtypesPages().length === 0) {\r\n let object = this.props.persistentStorage.load(\"subtypesPagesObject\");\r\n if (object && object.length === this.props.structures.length) {\r\n this.props.tiles.setSubtypesPages(object);\r\n } else {\r\n this.setSubtypesPagesContext();\r\n }\r\n }\r\n\r\n // set context for accuracy graph\r\n if (this.props.tiles.getGraphAcc().length === 0) {\r\n let object = this.props.persistentStorage.load(\"accGraphObject\");\r\n if (object) {\r\n this.props.tiles.setGraphAcc(object);\r\n }\r\n }\r\n\r\n // check if new dynamic structure\r\n if (this.props.tiles.getSubtypesPages().length !== structures.length) {\r\n this.setDynamicStructure();\r\n }\r\n\r\n // set page in context\r\n let page = 0;\r\n if (this.props.showGallery) {\r\n page = this.props.tiles.getPage(structures[selectedLayer].id);\r\n } else {\r\n page = this.props.tiles.getTilePage(structures[selectedLayer].id);\r\n }\r\n\r\n if (this.state.page !== page) {\r\n this.setState({ page: page });\r\n }\r\n\r\n this.setSubtypeValues();\r\n\r\n // set objectToLoad\r\n this.setObjectToLoad(false, true);\r\n\r\n // set special image size for tiles project module\r\n if (!this.props.showGallery) {\r\n this.props.projectContext.setState({ galleryImageSize: 750 });\r\n }\r\n }\r\n\r\n setDynamicStructure = () => {\r\n const { structures } = this.props;\r\n // put new dynamic structure to context\r\n\r\n // get index of new dynamic structure\r\n let dynamicIndex = 0;\r\n structures.forEach((element, idx) => {\r\n let sameId = this.props.tiles\r\n .getSubtypesPages()\r\n .filter((str) => str.id === element.id);\r\n if (sameId > -1) {\r\n dynamicIndex = idx;\r\n }\r\n });\r\n\r\n // put dynamic structure to context object\r\n this.props.tiles.pushDynamicStructureSP(\r\n structures[dynamicIndex],\r\n dynamicIndex\r\n );\r\n this.props.tiles.pushDynamicStructureAC(\r\n structures[dynamicIndex].id,\r\n dynamicIndex\r\n );\r\n };\r\n\r\n setAnnotationsContext = () => {\r\n const { structures } = this.props;\r\n // create context for annotationCount\r\n let lenStructures = structures.length;\r\n for (let i = 0; i < lenStructures; i++) {\r\n this.props.tiles.pushStrAnnoCount(structures[i].id);\r\n }\r\n };\r\n\r\n setSubtypesPagesContext = () => {\r\n const { structures } = this.props;\r\n // create context selected subtypes an pages\r\n let lenStructures = structures.length;\r\n for (let i = 0; i < lenStructures; i++) {\r\n this.props.tiles.pushSubtypesPages(structures[i].label, structures[i].id);\r\n }\r\n };\r\n\r\n findAllSubtypes = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // get all subtypes of selectedLayer (also subsubtypes)\r\n\r\n // first get all direct childs\r\n let childs = this.findChilds(structures[selectedLayer]);\r\n let allChilds = [];\r\n\r\n // search for childs of childa until no childs are checked for childs\r\n while (childs.length !== 0) {\r\n // code block to be executed\r\n childs = childs.concat(this.findChilds(childs[0]));\r\n if (!allChilds.includes(childs[0]) && childs[0].classificationSubtype) {\r\n allChilds.push(childs[0]);\r\n }\r\n childs.shift();\r\n }\r\n return allChilds;\r\n };\r\n\r\n setSubtypeValues = () => {\r\n const { structures, selectedLayer } = this.props;\r\n\r\n // get selected subtypes for classification\r\n let subtypesInContext =\r\n this.props.tiles.getSubtypes(structures[selectedLayer].id).length !== 0;\r\n\r\n if (subtypesInContext) {\r\n // set classificationIds\r\n let subtypes = this.props.tiles.getSubtypes(structures[selectedLayer].id);\r\n\r\n // set ida for subtypes\r\n if (subtypes[0]) {\r\n this.classificationId[1] = subtypes[0].id;\r\n }\r\n if (subtypes[1]) {\r\n this.classificationId[2] = subtypes[1].id;\r\n }\r\n this.classificationId[0] = structures[selectedLayer].id;\r\n } else {\r\n // put subtypes to context if not in context yet\r\n let subtype_1;\r\n subtype_1 = this.findChilds(structures[selectedLayer]);\r\n let twoSubtypes = subtype_1.slice(0, 2);\r\n this.props.tiles.setSubtypes(structures[selectedLayer].id, twoSubtypes);\r\n }\r\n };\r\n\r\n getSubtypes = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // get direct classification subtypes of selected structure\r\n let subtypes;\r\n subtypes = structures.filter(\r\n (element) =>\r\n element.classificationSubtype &&\r\n element.parentId === structures[selectedLayer].id\r\n );\r\n return subtypes;\r\n };\r\n\r\n UNSAFE_componentWillUpdate(nextProps) {\r\n const { selectedObjects, structures, selectedLayer, roiLayers } =\r\n this.props;\r\n\r\n // set isBrightfield if ome is null\r\n if (this.props.ome === null && nextProps.ome !== null) {\r\n this.setState({\r\n isBrightfield:\r\n nextProps.ome &&\r\n nextProps.ome.channels.length === 1 &&\r\n nextProps.ome.channels[0].type === \"brightfield\",\r\n });\r\n }\r\n\r\n // set subtypes for classification\r\n this.setSubtypeValues();\r\n\r\n // if parent color is white --> change it\r\n if (!structures[selectedLayer].isSubtype) {\r\n let clr = structures[selectedLayer].color;\r\n roiLayers[selectedLayer].layer.regionRois.forEach(function (element) {\r\n if (element.color === \"#FFFFFF\") {\r\n element.color = clr;\r\n }\r\n });\r\n }\r\n\r\n // find selectedObjects in roiLayers and set properties\r\n let selObjCord = selectedObjects.coordinates;\r\n if (\r\n (selObjCord &&\r\n selObjCord.length > 0 &&\r\n structures[selectedLayer].isSubtype === false) ||\r\n this.props.selObjs === true\r\n ) {\r\n if (selObjCord[0] !== null) {\r\n // set properties for selectedObjects\r\n selectedObjects.coordinates\r\n .map(\r\n (x) =>\r\n roiLayers[selectedLayer].layer.regionRois.filter(\r\n (element) =>\r\n parseInt(element.bounds.left, 10) === x.x &&\r\n parseInt(element.bounds.top, 10) === x.y &&\r\n element.isSubtype\r\n )[0]\r\n )\r\n .filter((element) => element && !element.isLabeled)\r\n .map((roi) => {\r\n roi.isSelObj = true;\r\n roi.aiAnnotated = true;\r\n return true;\r\n });\r\n }\r\n }\r\n\r\n // set layer for subtype- or parent structure i active tool\r\n let indexLayer = 0;\r\n if (\r\n structures[selectedLayer] &&\r\n structures[selectedLayer].isSubtype &&\r\n structures[selectedLayer].classificationSubtype\r\n ) {\r\n indexLayer = getParentIndexLayer(structures[selectedLayer], structures);\r\n } else {\r\n indexLayer = nextProps.selectedLayer;\r\n }\r\n if (nextProps.tools[nextProps.activeTool]) {\r\n nextProps.tools[nextProps.activeTool].setLayer({\r\n layer: nextProps.roiLayers[indexLayer].layer,\r\n ome: nextProps.ome,\r\n fileId: nextProps.fileId,\r\n projectId: nextProps.projectId,\r\n structures: nextProps.structures,\r\n roiLayers: nextProps.roiLayers,\r\n drawLayer: nextProps.drawLayer,\r\n selectedLayer: nextProps.selectedLayer,\r\n updateProject: nextProps.updateProject,\r\n commentLayer: nextProps.commentLayer,\r\n allRoiLayers: nextProps.allRoiLayers,\r\n viewerConfig_project: nextProps.viewerConfig.project,\r\n project: nextProps.project,\r\n ctx: this.ctx,\r\n histogramConfig: nextProps.histogramConfig,\r\n updateFileClasses: nextProps.updateFileClasses,\r\n });\r\n }\r\n\r\n // update elementCount\r\n this.setElementCount();\r\n\r\n // set page from context\r\n let page = 0;\r\n if (this.props.showGallery) {\r\n page = this.props.tiles.getPage(structures[selectedLayer].id);\r\n } else {\r\n page = this.props.tiles.getTilePage(structures[selectedLayer].id);\r\n }\r\n\r\n if (this.state.page !== page) {\r\n this.setState({ page: page });\r\n }\r\n\r\n // if selected structure changed --> reset object/roi to load next\r\n if (\r\n this.props.tiles.getStructure() !== this.props.tiles.getStructureBefore()\r\n ) {\r\n this.setObjectToLoad(false, true);\r\n this.props.tiles.setStructure(structures[selectedLayer]);\r\n }\r\n\r\n // check if new dynamic structure\r\n if (this.props.tiles.getSubtypesPages().length !== structures.length) {\r\n this.setDynamicStructure();\r\n }\r\n }\r\n\r\n scroll = (top) => {\r\n // scrolls that cropped image that calls function (selected image) is on top in gallery\r\n var el = document.getElementById(\"galleryWindow\");\r\n el.scrollTo({ top: el.scrollTop + top - 90, behavior: \"smooth\" });\r\n };\r\n\r\n setSelectedWithKey = (b) => {\r\n // sets variable if classifying with keys (automatic srolling) or with mouse (no automatic scrolling)\r\n this.setState({ selectedWithKey: b });\r\n };\r\n\r\n selectNewImage = (dir) => {\r\n const { galleryType } = this.props;\r\n // select next or previous roi with right or left arrow key\r\n if (!this.state.selectedWithKey) {\r\n // set selectedWith key true --> automatic scrolling enabled\r\n this.setSelectedWithKey(true);\r\n }\r\n\r\n if (galleryType !== \"FilesGallery\") {\r\n this.selectNewRoi(dir);\r\n } else {\r\n this.selectNewFile(dir);\r\n }\r\n\r\n this.forceUpdate();\r\n };\r\n\r\n selectNewRoi = (dir) => {\r\n const { selectedLayer, roiLayers, structures, project } = this.props;\r\n\r\n // if not classification structure (parent)\r\n if (!structures[selectedLayer].classificationSubtype) {\r\n let roiLay = [];\r\n if (project.type.includes(\"HistoPointCounting\")) {\r\n roiLay = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (element) =>\r\n element.isSubtype && element.subtypeName !== \"leer [leer]\"\r\n );\r\n } else {\r\n roiLay = roiLayers[selectedLayer].layer.regionRois;\r\n }\r\n\r\n // get index of currently selected roi\r\n let idx = roiLay.findIndex((element) => element.selected);\r\n\r\n if (dir === \"right\") {\r\n // right key\r\n if (roiLay[idx + 1] && roiLay[idx]) {\r\n // make next roi selected\r\n roiLay[idx + 1].selected = true;\r\n roiLay[idx + 1].selectedWithKey = true;\r\n roiLay[idx].selected = false;\r\n roiLay[idx].selectedWithKey = false;\r\n // check if change page\r\n if (idx === (this.state.page + 1) * this.state.rowsPerPage - 1) {\r\n this.setPage(this.state.page + 2);\r\n }\r\n }\r\n } else {\r\n // left key\r\n if (roiLay[idx - 1] && roiLay[idx]) {\r\n //make previous roi selected\r\n roiLay[idx - 1].selected = true;\r\n roiLay[idx - 1].selectedWithKey = true;\r\n roiLay[idx].selected = false;\r\n roiLay[idx].selectedWithKey = false;\r\n // check if change page\r\n if (idx % this.state.rowsPerPage === 0) {\r\n this.setPage(this.state.page);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // if classification structure\r\n if (structures[selectedLayer].classificationSubtype) {\r\n let parentLayer = getParentIndexLayer(\r\n structures[selectedLayer],\r\n structures\r\n );\r\n\r\n // get index of selRoi in all rois\r\n let idxSelRoi = roiLayers[parentLayer].layer.regionRois.findIndex(\r\n (element) => element.selected\r\n );\r\n\r\n // get all rois of subtype\r\n let childLabels = [];\r\n this.findChilds(structures[selectedLayer]).forEach((element) => {\r\n childLabels.push(element.label);\r\n });\r\n let subtypeRois = roiLayers[parentLayer].layer.regionRois.filter(\r\n (element) =>\r\n element.subtypeName === structures[selectedLayer].label ||\r\n childLabels.includes(element.subtypeName)\r\n );\r\n\r\n // get index of selRoi in subtype rois\r\n let idxInSubtypes = subtypeRois.findIndex((element) => element.selected);\r\n\r\n // get next or previous roi\r\n let nextRoi = subtypeRois[idxInSubtypes];\r\n if (dir === \"right\") {\r\n if (subtypeRois[idxInSubtypes + 1]) {\r\n nextRoi = subtypeRois[idxInSubtypes + 1];\r\n }\r\n } else {\r\n if (subtypeRois[idxInSubtypes - 1]) {\r\n nextRoi = subtypeRois[idxInSubtypes - 1];\r\n }\r\n }\r\n\r\n // get index of next roi\r\n let idxNextRoi = roiLayers[parentLayer].layer.regionRois.findIndex(\r\n (element) => element === nextRoi\r\n );\r\n if (idxNextRoi === -1) {\r\n return;\r\n }\r\n\r\n // set next roi selected\r\n roiLayers[parentLayer].layer.regionRois[idxNextRoi].selected = true;\r\n roiLayers[parentLayer].layer.regionRois[\r\n idxNextRoi\r\n ].selectedWithKey = true;\r\n\r\n // set selected roi to not selected\r\n if (idxNextRoi !== idxSelRoi) {\r\n roiLayers[parentLayer].layer.regionRois[idxSelRoi].selected = false;\r\n roiLayers[parentLayer].layer.regionRois[\r\n idxSelRoi\r\n ].selectedWithKey = false;\r\n }\r\n }\r\n };\r\n\r\n selectNewFile = (dir) => {\r\n const { project, structures, selectedLayer } = this.props;\r\n\r\n let visibleFiles = project.files;\r\n if (structures[selectedLayer].classificationSubtype) {\r\n visibleFiles = project.files.filter(\r\n (element) => element.classId === structures[selectedLayer].id\r\n );\r\n }\r\n\r\n // get index of currently selected file\r\n let idx = visibleFiles.findIndex((element) => element.selectedInGallery);\r\n // make file selectedIngallery true and other files false\r\n visibleFiles.forEach((f) => {\r\n f.selectedInGallery = false;\r\n });\r\n if (dir === \"right\" && project.files[idx + 1]) {\r\n visibleFiles[idx + 1].selectedInGallery = true;\r\n // check if change page\r\n if (idx === (this.state.page + 1) * this.state.rowsPerPage - 1) {\r\n this.setPage(this.state.page + 2);\r\n }\r\n } else if (dir === \"left\" && project.files[idx - 1]) {\r\n visibleFiles[idx - 1].selectedInGallery = true;\r\n // check if change page\r\n if (idx % this.state.rowsPerPage === 0) {\r\n this.setPage(this.state.page);\r\n }\r\n }\r\n };\r\n\r\n deleteSelectedRoi = () => {\r\n const { selectedLayer, roiLayers, structures } = this.props;\r\n // remove selected roi from roilayer\r\n\r\n // if not classification structure\r\n if (!structures[selectedLayer].classificationSubtype) {\r\n // get index of selected roi\r\n let idx = roiLayers[selectedLayer].layer.regionRois.findIndex(\r\n (element) => element.selected\r\n );\r\n // adjust annotation count\r\n if (\r\n this.state.automaticTraining &&\r\n roiLayers[selectedLayer].layer.regionRois[idx].isSubtype &&\r\n !roiLayers[selectedLayer].layer.regionRois[idx].aiAnnotated\r\n ) {\r\n this.props.tiles.setStrAnnoCount(\r\n roiLayers[selectedLayer].layer.regionRois[idx].structureId,\r\n -1\r\n );\r\n }\r\n // delete selected roi\r\n roiLayers[selectedLayer].layer.regionRois.splice(idx, 1);\r\n // make next roi selected true\r\n if (roiLayers[selectedLayer].layer.regionRois[idx]) {\r\n roiLayers[selectedLayer].layer.regionRois[idx].selected = true;\r\n roiLayers[selectedLayer].layer.regionRois[idx].selectedWithKey = true;\r\n }\r\n }\r\n\r\n // if classification structure\r\n if (structures[selectedLayer].classificationSubtype) {\r\n let parentLayer = getParentIndexLayer(\r\n structures[selectedLayer],\r\n structures\r\n );\r\n // get index of selected roi\r\n let idx = roiLayers[parentLayer].layer.regionRois.findIndex(\r\n (element) => element.selected\r\n );\r\n // delete selected roi\r\n roiLayers[parentLayer].layer.regionRois.splice(idx, 1);\r\n // get index of next subtype roi\r\n let childLabels = []; // all subtypenames\r\n this.findChilds(structures[selectedLayer]).forEach((element) => {\r\n childLabels.push(element.label);\r\n });\r\n let idxNext = 0; // index of next subtype\r\n // search for next roi that has is same subtype or subsubtype, ...\r\n for (\r\n let i = idx;\r\n i < roiLayers[parentLayer].layer.regionRois.length;\r\n i++\r\n ) {\r\n if (\r\n childLabels.includes(\r\n roiLayers[parentLayer].layer.regionRois[i].subtypeName\r\n ) ||\r\n roiLayers[parentLayer].layer.regionRois[i].subtypeName ===\r\n structures[selectedLayer].label\r\n ) {\r\n idxNext = i;\r\n break;\r\n }\r\n }\r\n // make next roi of subtype selected true\r\n if (roiLayers[parentLayer].layer.regionRois[idxNext]) {\r\n roiLayers[parentLayer].layer.regionRois[idxNext].selected = true;\r\n roiLayers[parentLayer].layer.regionRois[idxNext].selectedWithKey = true;\r\n }\r\n }\r\n\r\n this.forceUpdate();\r\n };\r\n\r\n handleChangePage = (page, direction) => {\r\n const { selectedLayer, structures } = this.props;\r\n // change page\r\n\r\n // change page with key shortcuts\r\n if (direction === \"down\") {\r\n page = this.state.page + 1;\r\n } else if (direction === \"up\") {\r\n page = this.state.page - 1;\r\n page = page < 0 ? 0 : page;\r\n } else {\r\n page = direction;\r\n }\r\n\r\n // set context page\r\n if (this.props.showGallery) {\r\n this.props.tiles.setPage(structures[selectedLayer].id, page);\r\n } else {\r\n this.props.tiles.setTilePage(structures[selectedLayer].id, page);\r\n }\r\n\r\n this.props.onGallerychangePage();\r\n this.setState({ page });\r\n this.props.tiles.setPageIndex(page);\r\n\r\n // prevent loading first roi on each page if changing multiple pages fast\r\n if (this.allImagesLoaded()) {\r\n this.setObjectToLoad(true);\r\n } else {\r\n let structureId = structures[selectedLayer].id;\r\n setTimeout(this.checkIfLoadNewObject, 2000, page, structureId);\r\n }\r\n\r\n // scroll to top after change page\r\n this.scrollToTop();\r\n this.forceUpdate();\r\n };\r\n\r\n checkIfLoadNewObject = (pg, prevStr) => {\r\n const { selectedLayer, structures } = this.props;\r\n let structureId = structures[selectedLayer].id;\r\n if (pg === this.state.page && prevStr === structureId) {\r\n // load object if not changed page for 2 seconds\r\n this.setObjectToLoad(true);\r\n } else {\r\n // do not load object from skipped pages\r\n }\r\n };\r\n\r\n scrollToTop = () => {\r\n // scroll to top --> eg. if change page\r\n var el = document.getElementById(\"galleryWindow\");\r\n el.scrollTop = 0;\r\n };\r\n\r\n handleChangeRowsPerPage = (event) => {\r\n // change number of elements on one page\r\n this.setState({ rowsPerPage: event.target.value });\r\n };\r\n\r\n setPage = (p) => {\r\n const { selectedLayer, structures } = this.props;\r\n // set page specific page p\r\n\r\n this.pageInput = \"\";\r\n // if p is not a number\r\n if (!p) {\r\n this.forceUpdate();\r\n return;\r\n }\r\n\r\n // if pg is negative\r\n let pg = p - 1;\r\n if (pg < 0) {\r\n this.forceUpdate();\r\n return;\r\n }\r\n\r\n // if pg is out of range --> go to last page\r\n let numObjsInLayer = this.getNumberOfElements();\r\n if (this.state.rowsPerPage * pg > numObjsInLayer) {\r\n pg = Math.ceil(numObjsInLayer / this.state.rowsPerPage) - 1;\r\n }\r\n\r\n // set context page\r\n if (this.props.showGallery) {\r\n this.props.tiles.setPage(structures[selectedLayer].id, pg);\r\n } else {\r\n this.props.tiles.setTilePage(structures[selectedLayer].id, pg);\r\n }\r\n\r\n this.props.onGallerychangePage();\r\n this.setState({ page: pg });\r\n this.props.tiles.setPageIndex(pg);\r\n this.setObjectToLoad(true);\r\n this.scrollToTop();\r\n this.forceUpdate();\r\n };\r\n\r\n getNumberOfElements = () => {\r\n const { selectedLayer, roiLayers, structures, project, galleryType } =\r\n this.props;\r\n // return number of objects of selected structure\r\n let numEls = 0;\r\n if (galleryType !== \"FilesGallery\") {\r\n if (!structures[selectedLayer].classificationSubtype) {\r\n numEls = roiLayers[selectedLayer].layer.regionRois.length;\r\n } else {\r\n let idx = this.findParentIndex();\r\n numEls = roiLayers[idx].layer.regionRois.filter(\r\n (element) => element.subtypeName === structures[idx].label\r\n ).length;\r\n }\r\n } else {\r\n if (!structures[selectedLayer].classificationSubtype) {\r\n numEls = project.files.length;\r\n } else {\r\n numEls = project.files.filter(\r\n (element) =>\r\n element.classId && element.classId == structures[selectedLayer].id\r\n ).length;\r\n }\r\n }\r\n return numEls;\r\n };\r\n\r\n classifyImageWithKey = (classId) => {\r\n const { galleryType } = this.props;\r\n // classify roi / file\r\n if (galleryType !== \"FilesGallery\") {\r\n this.classifyRoiWithKey(classId);\r\n } else {\r\n this.classifyFileWithKey(classId);\r\n }\r\n\r\n // update\r\n this.forceUpdate();\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n classifyRoiWithKey = (classId) => {\r\n const { roiLayers, selectedLayer, structures } = this.props;\r\n // classify roi with key shortcut (0 is parent, 1 is first subtype, ...)\r\n\r\n let layer = selectedLayer;\r\n if (structures[selectedLayer].classificationSubtype) {\r\n layer = getParentIndexLayer(structures[selectedLayer], structures);\r\n }\r\n // get all subtypes / childs\r\n let childs = this.findChilds(structures[selectedLayer]);\r\n // get index of selected roi that gets classified\r\n let idx = roiLayers[layer].layer.regionRois.findIndex(\r\n (element) => element.selected\r\n );\r\n\r\n // make adjustments for point-counting module\r\n if (this.props.project.type.includes(\"HistoPointCounting\")) {\r\n // if classify tile to parent --> return\r\n if (classId === 0) {\r\n return;\r\n }\r\n }\r\n\r\n // classify roi\r\n let roiWasSubtype =\r\n roiLayers[layer].layer.regionRois[idx].isSubtype &&\r\n !roiLayers[layer].layer.regionRois[idx].aiAnnotated;\r\n let bufferRoiId = roiLayers[layer].layer.regionRois[idx].structureId;\r\n\r\n // set properties of roi for classification if classifying to subtype\r\n if (childs[classId - 1]) {\r\n roiLayers[layer].layer.regionRois[idx].color = childs[classId - 1].color;\r\n roiLayers[layer].layer.regionRois[idx].isSubtype = true;\r\n roiLayers[layer].layer.regionRois[idx].isAnnotated = true;\r\n roiLayers[layer].layer.regionRois[idx].isLabeled = true;\r\n roiLayers[layer].layer.regionRois[idx].subtypeName =\r\n childs[classId - 1].label;\r\n roiLayers[layer].layer.regionRois[idx].structureId =\r\n childs[classId - 1].id;\r\n roiLayers[layer].layer.regionRois[idx].isSelObj = false;\r\n roiLayers[layer].layer.regionRois[idx].aiAnnotated = false;\r\n }\r\n\r\n // set properties of roi for classification if classifying to parent\r\n if (classId === 0) {\r\n roiLayers[layer].layer.regionRois[idx].color =\r\n structures[selectedLayer].color;\r\n roiLayers[layer].layer.regionRois[idx].isSubtype = false;\r\n roiLayers[layer].layer.regionRois[idx].isAnnotated = false;\r\n roiLayers[layer].layer.regionRois[idx].isLabeled = false;\r\n roiLayers[layer].layer.regionRois[idx].subtypeName =\r\n structures[selectedLayer].label;\r\n roiLayers[layer].layer.regionRois[idx].structureId =\r\n structures[selectedLayer].id;\r\n roiLayers[layer].layer.regionRois[idx].isSelObj = false;\r\n roiLayers[layer].layer.regionRois[idx].aiAnnotated = false;\r\n }\r\n\r\n // increase annotationCount\r\n let currentRoi = roiLayers[layer].layer.regionRois[idx];\r\n if (\r\n this.state.automaticTraining &&\r\n !structures[selectedLayer].classificationSubtype\r\n ) {\r\n if (currentRoi.isSubtype && !roiWasSubtype) {\r\n // if classify unlabeled to labeled\r\n this.props.tiles.setStrAnnoCount(currentRoi.structureId, 1);\r\n } else if (currentRoi.isSubtype && roiWasSubtype) {\r\n // if classify labeled to labeled\r\n this.props.tiles.setStrAnnoCount(currentRoi.structureId, 1);\r\n this.props.tiles.setStrAnnoCount(bufferRoiId, -1);\r\n } else if (roiWasSubtype) {\r\n // if classify labeled to unlabeled\r\n this.props.tiles.setStrAnnoCount(bufferRoiId, -1);\r\n }\r\n }\r\n\r\n // start training automatically if enough annotations\r\n if (this.state.automaticTraining) {\r\n let childs = this.findChilds(structures[selectedLayer]);\r\n let structureId = structures[selectedLayer].id;\r\n let annotations =\r\n this.getNuberChildRois(childs) -\r\n this.props.tiles.getStrAnnoCountElement(structureId);\r\n if (annotations >= this.state.startData && !this.props.alruns) {\r\n let enoughAnnos = this.enoughAnnotations(childs);\r\n\r\n if (enoughAnnos) {\r\n this.props.tiles.setAnnotationCount(0);\r\n this.props.tiles.setParentAnnoCount(\r\n structures[selectedLayer].id,\r\n annotations\r\n );\r\n this.props.startAutomaticTraining();\r\n } else {\r\n // give warning if too less annotations\r\n this.giveWarning();\r\n }\r\n }\r\n }\r\n };\r\n\r\n classifyFileWithKey = (classId) => {\r\n const { selectedLayer, structures, project } = this.props;\r\n // classify file with key shortcut (0 is parent, 1 is first subtype, ...)\r\n\r\n // get all subtypes / childs\r\n let parentStructure = structures[selectedLayer];\r\n if (structures[selectedLayer].classificationSubtype) {\r\n parentStructure = structures.filter(\r\n (element) => element.id === structures[selectedLayer].parentId\r\n )[0];\r\n }\r\n let childs = this.findChilds(parentStructure);\r\n // get index of selected roi that gets classified\r\n let idx = project.files.findIndex((element) => element.selectedInGallery);\r\n // assign classId\r\n if (childs[classId - 1]) {\r\n project.files[idx].classId = childs[classId - 1].id;\r\n }\r\n };\r\n\r\n classifyTilesGalleryWithKey = (classId) => {\r\n const { roiLayers, selectedLayer, structures } = this.props;\r\n const { page } = this.state;\r\n // classify tile with key shortcut --> function was made for project tilestool\r\n\r\n // get all subtypes / childs\r\n let childs = this.findChilds(structures[selectedLayer]);\r\n\r\n // set properties of roi for classification\r\n if (childs[classId - 1]) {\r\n roiLayers[selectedLayer].layer.regionRois[page].color =\r\n childs[classId - 1].color;\r\n roiLayers[selectedLayer].layer.regionRois[page].isSubtype = true;\r\n roiLayers[selectedLayer].layer.regionRois[page].isAnnotated = true;\r\n roiLayers[selectedLayer].layer.regionRois[page].subtypeName =\r\n childs[classId - 1].label;\r\n roiLayers[selectedLayer].layer.regionRois[page].structureId =\r\n childs[classId - 1].id;\r\n }\r\n\r\n // update\r\n this.forceUpdate();\r\n };\r\n\r\n setPageSelectedRoi = (roi) => {\r\n const { roiLayers, selectedLayer, structures } = this.props;\r\n // select correct page after shortcut from viewer in project tilestool\r\n\r\n // index of element will be page to select (beacuse only one image per page)\r\n let p = roiLayers[selectedLayer].layer.regionRois.findIndex(\r\n (element) => element === roi\r\n );\r\n // set context page\r\n if (this.props.showGallery) {\r\n this.props.tiles.setPage(structures[selectedLayer].id, p);\r\n } else {\r\n this.props.tiles.setTilePage(structures[selectedLayer].id, p);\r\n }\r\n\r\n this.setObjectToLoad(false, true);\r\n this.setState({ page: p });\r\n };\r\n\r\n giveWarning = () => {\r\n // show warning snackbar if not enought annotations for training\r\n if (this.enoughAnnosCount < 2) {\r\n this.props.trainingWarning(\"tooFewAnnotations\");\r\n this.enoughAnnosCount = this.enoughAnnosCount + 1;\r\n }\r\n };\r\n\r\n handleDivMouseDown = (e) => {\r\n // set that mouse is down\r\n this.props.tiles.setIsMousedown(true);\r\n if (this.props.tiles.getOnPageInput()) {\r\n return;\r\n } else {\r\n // // disable page input textfield\r\n // document.getElementById(\"pageInput\").disabled = true;\r\n if (document.getElementById(\"nAnnos\") !== null) {\r\n document.getElementById(\"nAnnos\").disabled = true;\r\n }\r\n if (document.getElementById(\"roiComment\") !== null) {\r\n document.getElementById(\"roiComment\").disabled = true;\r\n }\r\n }\r\n if (!this.props.showGallery) {\r\n return;\r\n }\r\n e.preventDefault();\r\n };\r\n\r\n handleDivMouseUp = (e) => {\r\n const { tools, activeTool } = this.props;\r\n // set that mouse is up\r\n this.props.tiles.setIsMousedown(false);\r\n if (\r\n !this.props.tiles.getIsOnImage() ||\r\n this.props.tiles.getIsInOtherImage()\r\n ) {\r\n // if finish drawing on other image or outside of image\r\n if (tools[activeTool]) {\r\n let p1;\r\n let prps = this.props.tiles.getRoiProps();\r\n tools[activeTool].mouse({\r\n event: e,\r\n p: p1,\r\n color: prps.color,\r\n subtype: prps.isSubtype,\r\n name: prps.subtypeName,\r\n positionInRoiLayer: -2,\r\n fullyLoaded: true,\r\n });\r\n this.props.tiles.setIsInOtherImage(false);\r\n this.forceUpdate();\r\n }\r\n }\r\n };\r\n\r\n getNuberChildRois = (childs) => {\r\n // get number of annotations of all childs (from context)\r\n let n = 0;\r\n childs.forEach((element) => {\r\n n = n + this.props.tiles.getStrAnnoCountElement(element.id);\r\n });\r\n return n;\r\n };\r\n\r\n enoughAnnotations = (childs) => {\r\n // check if enough annotations for training of dl model (at least one class with 5 annotations and one other class with 1 annotation)\r\n let minFive = false;\r\n let twoAnnotated = 0;\r\n childs.forEach((element) => {\r\n // check if minimum of five in one class\r\n if (this.props.tiles.getStrAnnoCountElement(element.id) >= 5) {\r\n minFive = true;\r\n }\r\n // check if two classes with at least one element\r\n if (this.props.tiles.getStrAnnoCountElement(element.id) >= 1) {\r\n twoAnnotated = twoAnnotated + 1;\r\n }\r\n });\r\n\r\n // if one class with at least five and one other class with at least one annotation --> enough annotations for training\r\n let enough = false;\r\n if (minFive && twoAnnotated >= 2) {\r\n enough = true;\r\n }\r\n return enough;\r\n };\r\n\r\n isRoiSubtype = (roi) => {\r\n const { structures, selectedLayer } = this.props;\r\n if (\r\n roi.subtypeName === structures[selectedLayer].label &&\r\n roi.color === structures[selectedLayer].color\r\n ) {\r\n // roi is element of selected structure\r\n return true;\r\n }\r\n\r\n // calculate childs of structure and check labels of childs\r\n let childLabels = [];\r\n let childColors = [];\r\n this.findChilds(structures[selectedLayer]).forEach((element) => {\r\n childLabels.push(element.label);\r\n childColors.push(element.color);\r\n });\r\n\r\n if (\r\n roi.isSubtype &&\r\n childLabels.includes(roi.subtypeName) &&\r\n childColors.includes(roi.color)\r\n ) {\r\n // roi is child of selected structure\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n isFileSubtype = (fileClassId) => {\r\n const { structures, selectedLayer } = this.props;\r\n if (fileClassId == structures[selectedLayer].id) {\r\n // roi is element of selected structure\r\n return true;\r\n }\r\n };\r\n\r\n findChilds = (subType) => {\r\n const { structures } = this.props;\r\n // return direct classification subtypes of selected structure\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n setProgress = (line) => {\r\n // get acc and epochs of training from backend messages\r\n let epochs = \"\";\r\n let acc = \"\";\r\n // get epoch in training\r\n if (line.includes(\"Epoch\")) {\r\n epochs = line.split(\"Epoch\")[1];\r\n if (epochs.includes(\"early stopping\")) {\r\n // if early stopping save accuracy of training in local storage and graph\r\n epochs = \"50/50\";\r\n this.props.tiles.pushGraphAcc(this.validationAcc);\r\n this.props.persistentStorage.save(\r\n \"accGraphObject\",\r\n this.props.tiles.getGraphAcc()\r\n );\r\n } else if (epochs.includes(\"50/50\")) {\r\n // if training finished save accuracy of training in local storage and graph\r\n epochs = \"50/50\";\r\n this.props.tiles.pushGraphAcc(this.validationAcc);\r\n this.props.persistentStorage.save(\r\n \"accGraphObject\",\r\n this.props.tiles.getGraphAcc()\r\n );\r\n }\r\n // set epochs for frontend text\r\n this.setState({ progressText: epochs });\r\n }\r\n // get acc in training\r\n if (line.includes(\"val_accuracy\")) {\r\n acc = line.split(\"val_accuracy: \")[1];\r\n this.validationAcc = parseFloat(acc) * 100;\r\n this.setState({ trainingAcc: acc });\r\n }\r\n };\r\n\r\n filterObjects = (element) => {\r\n if (!this.props.project.type.includes(\"HistoPointCounting\")) {\r\n return true;\r\n } else {\r\n // only show classified tiles and tiles that are not classified as \"leer\" in point counting module\r\n return element.isSubtype && element.subtypeName !== \"leer [leer]\";\r\n }\r\n };\r\n\r\n renderCroppedImage = (roi, context, id) => {\r\n const { galleryImageSize } = this.props.projectContext;\r\n return (\r\n (this.tile[id] = c)}\r\n onRefresh={() => this.forceUpdate()}\r\n ome={this.props.ome}\r\n histogramConfig={this.props.histogramConfig}\r\n visibleImage={this.visibleImage}\r\n coloredImages={this.coloredImages}\r\n roI={roi}\r\n structures={this.props.structures}\r\n selectedLayer={this.props.selectedLayer}\r\n canvasWidth={galleryImageSize}\r\n gallery={this.props.gallery}\r\n contour={this.state.drawContour}\r\n activeTool={this.props.activeTool}\r\n tools={this.props.tools}\r\n number={context.state.number}\r\n fileId={this.props.fileId}\r\n //contx={this.props.contx}\r\n visImgs={this.props.visImgs}\r\n index={id}\r\n indexOffset={this.state.page * this.state.rowsPerPage}\r\n page={this.pageIndex}\r\n roiLayers={this.props.roiLayers}\r\n classificationId={this.classificationId}\r\n fromAI={true}\r\n drawLayer={this.props.drawLayer}\r\n updateGallery={this.updateGallery}\r\n startData={this.state.startData}\r\n alruns={this.props.alruns}\r\n setAlruns={this.props.setAlruns}\r\n z={this.state.z}\r\n t={this.state.t}\r\n showZStackBar={this.props.showZStackBar}\r\n automaticTraining={this.state.automaticTraining}\r\n startAutomaticTraining={this.props.startAutomaticTraining}\r\n trainingWarning={this.props.trainingWarning}\r\n setFUllyAnnotated={this.props.setFUllyAnnotated}\r\n setAnnotated={this.props.setAnnotated}\r\n showGallery={this.props.showGallery}\r\n drawCrosshair={this.state.drawCrosshair}\r\n crosshairColor={this.state.crosshairColor}\r\n crosshairOpacity={this.state.crosshairOpacity}\r\n crosshairLineWidth={this.state.crosshairLineWidth}\r\n scroll={this.scroll}\r\n setSelectedWithKey={this.setSelectedWithKey}\r\n selectedWithKey={this.state.selectedWithKey}\r\n isBrightfield={this.state.isBrightfield}\r\n objectToLoad={this.state.objectToLoad}\r\n setObjectToLoad={this.setObjectToLoad}\r\n giveWarning={this.giveWarning}\r\n project={this.props.project}\r\n globalZ={this.props.globalZ}\r\n opacity={this.props.opacity}\r\n />\r\n );\r\n };\r\n\r\n renderSceneImage = (file) => {\r\n const { galleryImageSize } = this.props.projectContext;\r\n return (\r\n \r\n );\r\n };\r\n\r\n render() {\r\n const {\r\n structures,\r\n selectedLayer,\r\n roiLayers,\r\n project,\r\n tools,\r\n galleryType,\r\n } = this.props;\r\n const { classes, ...propsWithoutClasses } = this.props;\r\n const { page, rowsPerPage } = this.state;\r\n const { galleryImageSize } = this.props.projectContext;\r\n\r\n let params = {\r\n classificationFiles: project.files.slice(\r\n page * rowsPerPage,\r\n page * rowsPerPage + rowsPerPage\r\n ),\r\n };\r\n tools.iam_ai_inference?.onParameterChange(params);\r\n\r\n // tooltip describes how many annotations it takes for automatic start of training\r\n let toolTipCircularProgress =\r\n \"if (\" +\r\n this.state.startData +\r\n \"/\" +\r\n this.state.startData +\r\n \") training starts automatically\";\r\n\r\n // calculate number of annotations for progess in bottom right (circular progress)\r\n let childs = this.findChilds(structures[selectedLayer]);\r\n let structureId = structures[selectedLayer].id;\r\n let annotations =\r\n this.getNuberChildRois(childs) -\r\n this.props.tiles.getStrAnnoCountElement(structureId);\r\n let progress = (annotations / this.state.startData) * 100;\r\n if (annotations > this.state.startData) {\r\n progress = 100;\r\n }\r\n\r\n // get subtypes / childs of selected structure for classification\r\n let childsGallery = this.findChilds(structures[selectedLayer]);\r\n if (!this.props.project.type.includes(\"HistoPointCounting\")) {\r\n // add parent / selected layer to childs / subtypes\r\n childsGallery.unshift(structures[selectedLayer]);\r\n }\r\n\r\n // calculate rois that will be displayed in gallery depending on selected structure\r\n let roisForImages = [];\r\n if (!structures[selectedLayer].classificationSubtype) {\r\n // show all rois if parent structure (exception --> point counting module (look at filterObjects function))\r\n roisForImages = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (element) => this.filterObjects(element)\r\n );\r\n } else {\r\n // only show subtype rois if subtype structure\r\n roisForImages = roiLayers[\r\n getParentIndexLayer(structures[selectedLayer], structures)\r\n ].layer.regionRois.filter((element) => this.isRoiSubtype(element));\r\n }\r\n\r\n // calculate files that will be displayed in gallery depending on selected structure\r\n let displayedFiles = [];\r\n if (!structures[selectedLayer].classificationSubtype) {\r\n // show all files if parent structure\r\n displayedFiles = project.files;\r\n } else {\r\n // only show subtype rois if subtype structure\r\n displayedFiles = project.files.filter((element) =>\r\n this.isFileSubtype(element.classId)\r\n );\r\n }\r\n\r\n return (\r\n {\r\n e.preventDefault();\r\n }}\r\n >\r\n \r\n\r\n {this.props.galleryType == \"FilesGallery\" && (\r\n {\r\n // if scrolling manually set selected with key to false --> no more automatic scrolling\r\n if (this.state.selectedWithKey) {\r\n this.setState({ selectedWithKey: false });\r\n }\r\n }}\r\n >\r\n {displayedFiles\r\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\r\n .map((file, id) => {\r\n return (\r\n \r\n {this.renderSceneImage(file)}\r\n
    \r\n );\r\n })}\r\n \r\n )}\r\n\r\n {this.props.galleryType == \"AnnotationGallery\" && (\r\n {\r\n // if scrolling manually set selected with key to false --> no more automatic scrolling\r\n if (this.state.selectedWithKey) {\r\n this.setState({ selectedWithKey: false });\r\n }\r\n }}\r\n >\r\n \r\n {roisForImages\r\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\r\n .map((roi, id) => {\r\n // give roi correct color\r\n let clr = structures[selectedLayer].color;\r\n if (roi.color === \"#FFFFFF\") {\r\n roi.color = clr;\r\n }\r\n\r\n return (\r\n \r\n \r\n {roi.isLabeled || !roi.isSelObj ? (\r\n \r\n ) : (\r\n \r\n AI\r\n \r\n )}\r\n {!this.props.showGallery && (\r\n \r\n {roi.tileName}\r\n \r\n )}\r\n {this.renderCroppedImage(roi, this.props.tiles, id, 4)}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n )}\r\n\r\n
    \r\n \r\n `Page ${this.state.page + 1} of ${Math.ceil(\r\n this.state.elementCount / this.state.rowsPerPage\r\n )} (${this.state.elementCount} objects)`\r\n }\r\n />\r\n\r\n {this.state.automaticTraining &&\r\n !this.props.structures[this.props.selectedLayer]\r\n .classificationSubtype && (\r\n \r\n \r\n {annotations + \"/\" + this.state.startData}\r\n \r\n
    \r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nGallery.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n componentRef: PropTypes.func,\r\n roiLayers: PropTypes.array,\r\n ome: PropTypes.object,\r\n fileId: PropTypes.string,\r\n projectId: PropTypes.string,\r\n structures: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n visibleImage: PropTypes.array,\r\n coloredImages: PropTypes.array,\r\n histogramConfig: PropTypes.object,\r\n gallery: PropTypes.func,\r\n activeTool: PropTypes.string,\r\n tools: PropTypes.array,\r\n visImgs: PropTypes.array,\r\n selectedObjects: PropTypes.object,\r\n drawLayer: PropTypes.object,\r\n saveChangesGallery: PropTypes.func,\r\n applyDL: PropTypes.func,\r\n test: PropTypes.bool,\r\n updateCount: PropTypes.number,\r\n alruns: PropTypes.bool,\r\n setAlruns: PropTypes.func,\r\n graphData: PropTypes.number,\r\n updateViewer: PropTypes.func,\r\n onGallerychangePage: PropTypes.func,\r\n showZStackBar: PropTypes.bool,\r\n // from withTiles\r\n tiles: PropTypes.object,\r\n globalZ: PropTypes.number,\r\n opacity: PropTypes.number,\r\n project: PropTypes.object,\r\n viewerConfig: PropTypes.object,\r\n persistentStorage: PropTypes.object,\r\n showGallery: PropTypes.bool,\r\n galleryType: PropTypes.string,\r\n selObjs: PropTypes.bool,\r\n updateProject: PropTypes.func,\r\n commentLayer: PropTypes.object,\r\n allRoiLayers: PropTypes.array,\r\n startAutomaticTraining: PropTypes.func,\r\n trainingWarning: PropTypes.func,\r\n setFUllyAnnotated: PropTypes.func,\r\n setAnnotated: PropTypes.func,\r\n updateFileClasses: PropTypes.func,\r\n projectContext: PropTypes.object,\r\n};\r\n\r\nexport default withAllViewerContexts(\r\n withPersistentStorage(withTiles(withStyles(styles)(Gallery)))\r\n);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport Slider from \"@mui/material/Slider\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport Select from \"@mui/material/Select\";\r\nimport Radio from \"@mui/material/Radio\";\r\nimport RadioGroup from \"@mui/material/RadioGroup\";\r\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\r\nimport { IconButton } from \"@mui/material\";\r\n\r\nimport VisibilityIcon from \"@mui/icons-material/Visibility\";\r\nimport LinkIcon from \"@mui/icons-material/Link\";\r\nimport LinkOffIcon from \"@mui/icons-material/LinkOff\";\r\n\r\nconst styles = {\r\n root: {\r\n display: \"flex\",\r\n height: \"400px\",\r\n position: \"absolute\",\r\n top: \"33%\",\r\n right: \"40px\",\r\n width: \"150px\",\r\n zIndex: 100,\r\n },\r\n formControl: {\r\n minWidth: 100,\r\n maxWidth: 100,\r\n },\r\n sliderDiv: {\r\n right: \"3.5%\",\r\n top: \"25%\",\r\n width: \"80%\",\r\n height: \"50%\",\r\n position: \"inherit\",\r\n textAlign: \"center\",\r\n },\r\n upperArea: {\r\n top: \"0%\",\r\n width: \"100%\",\r\n height: \"25%\",\r\n position: \"inherit\",\r\n },\r\n upperList: {\r\n position: \"inherit\",\r\n bottom: \"10%\",\r\n right: \"3%\",\r\n width: \"70%\",\r\n },\r\n lowerArea: {\r\n top: \"75%\",\r\n width: \"100%\",\r\n height: \"25%\",\r\n position: \"inherit\",\r\n },\r\n lowerList: {\r\n position: \"inherit\",\r\n top: \"10%\",\r\n right: \"3%\",\r\n width: \"70%\",\r\n },\r\n upFormcontrol: {\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"-27px\",\r\n },\r\n lowFormcontrol: {\r\n position: \"absolute\",\r\n top: \"168px\",\r\n left: \"-27px\",\r\n },\r\n upButton: {\r\n position: \"absolute\",\r\n top: \"-4px\",\r\n left: \"50px\",\r\n color: \"#0673C1\",\r\n },\r\n lowButton: {\r\n position: \"absolute\",\r\n top: \"174px\",\r\n left: \"50px\",\r\n color: \"#0673C1\",\r\n },\r\n slider: {\r\n float: \"right\",\r\n color: \"#0673C1\",\r\n },\r\n chainButton: {\r\n position: \"absolute\",\r\n top: \"244px\",\r\n left: \"14px\",\r\n },\r\n};\r\n\r\nclass OverlaySlider extends Component {\r\n constructor(props) {\r\n super(props);\r\n if (props.componentRef) props.componentRef(this);\r\n this.state = {\r\n value: 100,\r\n upperListValue: \"\",\r\n lowerListValue: \"\",\r\n checkedUp: false,\r\n checkedLow: false,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const {\r\n activeFileId,\r\n splitscreenFileIds,\r\n fullscreenFileIds,\r\n addFile,\r\n setOpacity,\r\n } = this.props;\r\n let lowValue;\r\n\r\n activeFileId === splitscreenFileIds[0]\r\n ? (lowValue = splitscreenFileIds[1])\r\n : (lowValue = splitscreenFileIds[0]);\r\n\r\n if (fullscreenFileIds.length === 1) {\r\n addFile(lowValue, 1);\r\n } else {\r\n addFile(activeFileId, 0);\r\n addFile(lowValue, 1);\r\n }\r\n\r\n setOpacity(0, this.state.value);\r\n setOpacity(1, 100 - this.state.value);\r\n\r\n this.setState({\r\n upperListValue: activeFileId,\r\n lowerListValue: lowValue,\r\n checkedUp: true,\r\n init: false,\r\n });\r\n }\r\n\r\n componentDidUpdate() {\r\n const { activeFileId } = this.props;\r\n const { checkedUp, checkedLow, upperListValue, lowerListValue } =\r\n this.state;\r\n\r\n if (\r\n (checkedUp && upperListValue !== activeFileId) ||\r\n (checkedLow && lowerListValue !== activeFileId)\r\n ) {\r\n this.update();\r\n }\r\n }\r\n\r\n update = () => {\r\n const { activeFileId } = this.props;\r\n if (this.state.checkedUp) {\r\n this.setState({\r\n upperListValue: activeFileId,\r\n });\r\n this.props.addFile(activeFileId, 0);\r\n } else {\r\n this.setState({\r\n lowerListValue: activeFileId,\r\n });\r\n this.props.addFile(activeFileId, 1);\r\n }\r\n };\r\n\r\n fileCheck = (fileId, callback) => {\r\n if (\r\n fileId === this.state.lowerListValue ||\r\n fileId === this.state.upperListValue\r\n ) {\r\n this.setState({\r\n checkedUp: !this.state.checkedUp,\r\n checkedLow: !this.state.checkedLow,\r\n });\r\n this.state.checkedLow\r\n ? this.handleUpVisChange()\r\n : this.handleLowVisChange();\r\n }\r\n callback();\r\n };\r\n\r\n handleChange = (event, value) => {\r\n this.setState({ value });\r\n this.props.setOpacity(0, value);\r\n this.props.setOpacity(1, 100 - value);\r\n };\r\n\r\n handleUpMenuChange = (event) => {\r\n this.setState({ upperListValue: event.target.value });\r\n this.props.addFile(event.target.value, 0);\r\n if (this.state.checkedUp) this.props.setActive(event.target.value);\r\n this.setState({ init: false });\r\n };\r\n\r\n handleLowMenuChange = (event) => {\r\n this.setState({ lowerListValue: event.target.value });\r\n this.props.addFile(event.target.value, 1);\r\n if (this.state.checkedLow) this.props.setActive(event.target.value);\r\n this.setState({ init: false });\r\n };\r\n\r\n handleCheck = () => {\r\n !this.state.checkedUp\r\n ? this.props.setActive(this.state.upperListValue)\r\n : this.props.setActive(this.state.lowerListValue);\r\n\r\n this.setState({\r\n checkedUp: !this.state.checkedUp,\r\n checkedLow: !this.state.checkedLow,\r\n });\r\n };\r\n\r\n handleUpVisChange = () => {\r\n if (this.state.value !== 100) {\r\n this.setState({ value: 100 });\r\n this.props.setOpacity(0, 100);\r\n this.props.setOpacity(1, 0);\r\n } else {\r\n this.handleLowVisChange();\r\n }\r\n };\r\n\r\n handleLowVisChange = () => {\r\n if (this.state.value !== 0) {\r\n this.setState({ value: 0 });\r\n this.props.setOpacity(0, 0);\r\n this.props.setOpacity(1, 100);\r\n } else {\r\n this.handleUpVisChange();\r\n }\r\n };\r\n\r\n render() {\r\n const { classes, omeDict, fsChain, splitscreenFileIds } = this.props;\r\n const { upperListValue, lowerListValue, value, checkedUp, checkedLow } =\r\n this.state;\r\n\r\n return (\r\n \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n {splitscreenFileIds.map(\r\n (id, index) =>\r\n id !== lowerListValue &&\r\n omeDict[id] && (\r\n \r\n {omeDict[id].fileName} {omeDict[id].scene + 1}\r\n \r\n )\r\n )}\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n {splitscreenFileIds.map(\r\n (id, index) =>\r\n id !== upperListValue &&\r\n omeDict[id] && (\r\n \r\n {omeDict[id].fileName} {omeDict[id].scene + 1}\r\n \r\n )\r\n )}\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n }\r\n />\r\n \r\n }\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.props.isChained ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n value}\r\n aria-labelledby=\"discrete-slider-custom\"\r\n valueLabelDisplay=\"auto\"\r\n orientation=\"vertical\"\r\n value={value}\r\n onChange={this.handleChange}\r\n >\r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nOverlaySlider.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n componentRef: PropTypes.func,\r\n setOpacity: PropTypes.func,\r\n activeFileId: PropTypes.string,\r\n splitscreenFileIds: PropTypes.array,\r\n omeDict: PropTypes.object,\r\n addFile: PropTypes.func,\r\n setActive: PropTypes.func,\r\n fullscreenFileIds: PropTypes.array,\r\n fsChain: PropTypes.func,\r\n isChained: PropTypes.bool,\r\n rendererdict: PropTypes.object,\r\n};\r\n\r\nexport default withStyles(styles)(OverlaySlider);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n// define the component's styling\r\nconst styles = () => ({\r\n resizesBorder: {\r\n position: \"absolute\",\r\n zIndex: 9999999,\r\n height: \"100%\",\r\n right: -8,\r\n width: 12,\r\n top: 0,\r\n cursor: \"col-resize\",\r\n },\r\n overlayBorder: {\r\n position: \"fixed\",\r\n top: 0,\r\n left: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n zIndex: 9999999,\r\n cursor: \"col-resize\",\r\n },\r\n});\r\n\r\nclass VerticalResizeBorder extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n resizeMode: false,\r\n borderWidth: 8,\r\n };\r\n }\r\n\r\n handleMouseDown = (e) => {\r\n this.setState({ resizeMode: true, lastPageX: e.pageX });\r\n };\r\n handleMouseMove = (e) => {\r\n e.preventDefault();\r\n if (this.state.resizeMode) {\r\n let deltaX = this.state.lastPageX - e.pageX;\r\n this.props.resizeSideBar(deltaX, false);\r\n this.setState({ lastPageX: e.pageX });\r\n }\r\n };\r\n handleMouseEnd = () => {\r\n if (this.state.resizeMode) {\r\n this.setState({ resizeMode: false });\r\n this.props.resizeSideBar(0, true);\r\n }\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n //const { borderWidth } = this.state;\r\n return (\r\n this.handleMouseDown(e)}\r\n onMouseMove={(e) => this.handleMouseMove(e)}\r\n onMouseLeave={(e) => this.handleMouseEnd(e)}\r\n onMouseUp={(e) => this.handleMouseEnd(e)}\r\n >\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nVerticalResizeBorder.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n resizeSideBar: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(VerticalResizeBorder);\r\n","import React, { Component } from \"react\";\r\n\r\nimport PropTypes from \"prop-types\";\r\nimport classNames from \"classnames\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport {\r\n IconButton,\r\n Tooltip,\r\n Divider,\r\n Fade,\r\n Popper,\r\n Paper,\r\n} from \"@mui/material\";\r\n\r\nimport {\r\n faImages,\r\n faCube,\r\n faFillDrip,\r\n faPlus,\r\n faPen,\r\n faDrawPolygon,\r\n faClone,\r\n faMousePointer,\r\n faCamera,\r\n faDownload,\r\n faPlayCircle,\r\n faExchangeAlt,\r\n faSquareFull,\r\n faThLarge,\r\n faTh,\r\n faBrain,\r\n faChartBar,\r\n faTable,\r\n faMagic,\r\n faBraille,\r\n faFileDownload,\r\n} from \"@fortawesome/free-solid-svg-icons\";\r\nimport CastIcon from \"@mui/icons-material/Cast\";\r\nimport AllOutIcon from \"@mui/icons-material/AllOut\";\r\nimport RadioButtonCheckedIcon from \"@mui/icons-material/RadioButtonChecked\";\r\nimport { faCircle } from \"@fortawesome/free-regular-svg-icons\";\r\nimport UndoIcon from \"@mui/icons-material/Undo\";\r\nimport RedoIcon from \"@mui/icons-material/Redo\";\r\nimport RateReviewIcon from \"@mui/icons-material/RateReview\";\r\n//import IsoIcon from \"@mui/icons-material/Iso\";\r\nimport PinDropIcon from \"@mui/icons-material/PinDrop\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport {\r\n Save,\r\n ZoomOutMap,\r\n CheckBoxOutlineBlank,\r\n ZoomIn,\r\n ZoomOut,\r\n ViewQuilt,\r\n FilterAlt,\r\n} from \"@mui/icons-material\";\r\nimport SelectAllIcon from \"@mui/icons-material/SelectAll\";\r\nimport FullscreenIcon from \"@mui/icons-material/Fullscreen\";\r\nimport FullscreenExitIcon from \"@mui/icons-material/FullscreenExit\";\r\nimport FlipIcon from \"@mui/icons-material/Flip\";\r\nimport ScatterPlotIcon from \"@mui/icons-material/ScatterPlot\";\r\nimport InlineSVG from \"svg-inline-react\";\r\nimport ToggleButton from \"./ToggleButton\";\r\nimport CustomSvgIcon from \"../../globalComponents/CustomSvgIcon.jsx\";\r\n\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport VerticalResizeBorder from \"./VerticalResizeBorder\";\r\nimport { withAllViewerContexts } from \"../contexts/AllViewerContexts\";\r\nimport { withResultTab } from \"../contexts/ResultTabContext\";\r\n\r\n// enum containing all available tools\r\nexport const Tools = {\r\n NONE: \"none\",\r\n // shape anotation tools\r\n RECT_ROI: \"rect\",\r\n // pixel anotation tools\r\n PEN_ROI: \"pen\",\r\n MAGICWAND_ROI: \"magic wand\",\r\n REGIONGROWING_ROI: \"region growing\",\r\n REGIONGRABCUT_ROI: \"region grabcut\",\r\n REGION_ROI: \"region\",\r\n RECTANGLE_ROI: \"rectangle\",\r\n COMMENT_ROI: \"comment\",\r\n ELLIPSE_ROI: \"ellipse\",\r\n COPY_ROI: \"copy\",\r\n SELECTION_ROI: \"selection\",\r\n FILTERANNOTATIONS_ROI: \"smallestroi\",\r\n PLOTNEAREST_ROI: \"nearestroi\",\r\n FILL: \"fill\",\r\n IAM: \"iam\",\r\n // active learning\r\n AL: \"activeLearning\",\r\n AITRAINING: \"aiTraining\",\r\n GRIDTOOL: \"gridtool\",\r\n GRIDANNOTATIONTOOL: \"gridannotationtool\",\r\n SELECTION_Tile: \"selectiontile\",\r\n POINTCOUNTING_Tile: \"pointcountingtile\",\r\n // tileRegistration\r\n LANDMARK: \"landmark\",\r\n STREAMVIEW: \"stream view\",\r\n HEATMAP: \"heatmap\",\r\n ROIRESIZE: \"roiresize\",\r\n};\r\n\r\n// define the component's styling\r\nconst styles = (theme) => ({\r\n toolBar: {\r\n position: \"relative\",\r\n margin: 0,\r\n padding: 0,\r\n marginRight: 5,\r\n background: \"#fff\",\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"1fr auto\",\r\n overflowX: \"hidden\",\r\n overflowY: \"auto\",\r\n },\r\n toolbarButton: {\r\n display: \"inline-block\",\r\n width: 40,\r\n height: 40,\r\n padding: 0,\r\n margin: 0,\r\n fontSize: 22,\r\n },\r\n toolbarButtonIcon: {\r\n verticalAlign: \"-4px\",\r\n },\r\n textIcon: {\r\n fontSize: 18,\r\n fontWeight: \"bold\",\r\n },\r\n toolbarButtonChecked: {\r\n width: 40,\r\n color: theme.palette.primary.main,\r\n },\r\n divider: {\r\n marginLeft: 5,\r\n marginRight: 5,\r\n },\r\n});\r\n\r\nclass VerticalToolBar extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n open: false,\r\n anchorEl: null,\r\n };\r\n }\r\n\r\n componentDidMount = () => {\r\n this.setToolBarWidth(false);\r\n document.addEventListener(\"keydown\", this.handleEscKey);\r\n };\r\n\r\n componentWillUnmount() {\r\n document.removeEventListener(\"keydown\", this.handleEscKey);\r\n }\r\n\r\n // trigger on window resize: set toolbarwidth to 1 col, 2 col or 2 cols with scrollbar\r\n setToolBarWidth = (viewerToGallery) => {\r\n if (this.containerElement && this.topElement && this.bottomElement) {\r\n const { verticalToolBarWidth } = this.props;\r\n let containerHeight = this.containerElement.clientHeight;\r\n let topHeight = this.topElement.clientHeight;\r\n let bottomHeight = this.bottomElement.clientHeight;\r\n let resultWidth = verticalToolBarWidth;\r\n if (verticalToolBarWidth > 45) {\r\n if ((topHeight + bottomHeight) * 2 < containerHeight) {\r\n resultWidth = 45;\r\n } else if (containerHeight < topHeight + bottomHeight) {\r\n resultWidth = 101;\r\n } else {\r\n resultWidth = 90;\r\n }\r\n } else if (topHeight + bottomHeight > containerHeight) {\r\n resultWidth = 90;\r\n }\r\n if (verticalToolBarWidth !== resultWidth - 5) {\r\n this.props.updateToolBarWidth(resultWidth, viewerToGallery);\r\n }\r\n }\r\n };\r\n\r\n handleEscKey = (event) => {\r\n if (event.key === \"Escape\" || event.keyCode === 27) {\r\n const { onChangeTool } = this.props;\r\n onChangeTool(Tools.NONE);\r\n }\r\n };\r\n\r\n checkToolInConfig(toolName) {\r\n if (this.props.viewerConfig) {\r\n if (this.props.viewerConfig.project.toolsInProject[toolName]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n exportAllFiles = (idx, projectId) => {\r\n // export images of structure to folder in png format\r\n let fileIDs = this.props.project.files;\r\n this.props.spinloader.show();\r\n Backend.exportGallery(projectId, fileIDs[idx].id, (e) => {\r\n let str_1 = \"Export File \" + fileIDs[idx].id;\r\n let str_2 = \"Gallery exported to: \" + e.path;\r\n if (idx + 1 < this.props.project.files.length) {\r\n this.showMessage(str_1);\r\n this.exportAllFiles(idx + 1, projectId, fileIDs[idx + 1].id);\r\n } else {\r\n this.showMessage(str_1);\r\n this.showMessage(str_2);\r\n this.props.setAlruns(false);\r\n this.props.spinloader.hide();\r\n }\r\n });\r\n };\r\n\r\n exportCurrentFile = (idx, projectId, fileId) => {\r\n // export images of structure to folder in png format\r\n this.props.spinloader.show();\r\n Backend.exportGallery(projectId, fileId, (e) => {\r\n let str_1 = \"Export File \" + fileId;\r\n let str_2 = \"Gallery exported to: \" + e.path;\r\n this.showMessage(str_1);\r\n this.showMessage(str_2);\r\n this.props.setAlruns(false);\r\n this.props.spinloader.hide();\r\n });\r\n };\r\n\r\n showMessage = (x) => {\r\n window.showSuccessSnackbar(x);\r\n };\r\n\r\n setStructureIds = () => {\r\n const { structures, roiLayers } = this.props;\r\n // make sure thath all rois have structureIds --> somtimes have no ids after run iams\r\n for (let i = 0; i < structures.length; i++) {\r\n // if parent structure set structureIds because parent rois do not have ids after iam / job\r\n roiLayers[i].layer.regionRois.forEach((roi) => {\r\n // if roi is no subtype an has no structureId yet\r\n if (roi.structureId === 0 && !roi.isSubtype) {\r\n roi.structureId = structures[i].id;\r\n roi.color = structures[i].color;\r\n }\r\n });\r\n }\r\n };\r\n\r\n onSaveImages(allScenes) {\r\n // make sure that all rois have a structure id (if only run job parents do not have structureId)\r\n this.setStructureIds();\r\n // save and export images\r\n this.props.saveChangesGallery(true);\r\n this.props.setAlruns(true);\r\n\r\n if (allScenes) {\r\n // wait until saving is finished (project json) --> then start export\r\n setTimeout(() => {\r\n this.exportAllFiles(0, this.props.projectId, this.props.fileId);\r\n }, 2000);\r\n } else {\r\n // wait until saving is finished (project json) --> then start export\r\n setTimeout(() => {\r\n this.exportCurrentFile(0, this.props.projectId, this.props.fileId);\r\n }, 2000);\r\n }\r\n }\r\n\r\n setZLevelforRois = () => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n // set z level of rois to selected z level in viewer\r\n let zLevelClassification = this.props.tiles.getZLevel();\r\n roiLayers[selectedLayer].layer.regionRois.forEach((roi) => {\r\n roi.z = zLevelClassification;\r\n });\r\n };\r\n\r\n ApplyModel = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // apply trained dl model to selected structure\r\n\r\n // check if selectedLayer is parent\r\n if (structures[selectedLayer].classificationSubtype) {\r\n this.props.trainingWarning(\"subtype\");\r\n return;\r\n }\r\n\r\n // check if structure has childs\r\n // check if selectedLayer is parent\r\n if (!structures[selectedLayer].hasChild) {\r\n this.props.trainingWarning(\"hasNoChilds\");\r\n return;\r\n }\r\n\r\n // make warning that not changing layer while applying model\r\n window.showWarningSnackbar(\r\n \"Please do not change structure while applying the model.\"\r\n );\r\n\r\n // set z-Index of rois to selected z-Level\r\n this.setZLevelforRois();\r\n this.props.saveChangesGallery();\r\n this.props.setAlruns(true);\r\n let passiveLearning = true;\r\n let applyModel = true;\r\n this.props.applyDL(\r\n this.props.tools[\"alm_gallery_tool\"],\r\n this.props.projectId,\r\n this.props.fileId,\r\n passiveLearning,\r\n applyModel\r\n );\r\n };\r\n\r\n findClassificationChilds = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // return direct classification subtypes\r\n return structures.filter(\r\n (element) =>\r\n element.parentId === structures[selectedLayer].id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n enoughAnnotations = (childs) => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n // check if enough annotations for training of dl model (at least one class with 5 annotations and one other class with 1 annotation)\r\n let minFive = false;\r\n let twoAnnotated = 0;\r\n childs.forEach((element) => {\r\n // get number of elements for child\r\n let numberElements = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (roi) => roi.structureId === element.id\r\n ).length;\r\n\r\n // check if minimum of five in one class\r\n if (numberElements >= 5) {\r\n minFive = true;\r\n }\r\n // check if two classes with at least one element\r\n if (numberElements >= 1) {\r\n twoAnnotated = twoAnnotated + 1;\r\n }\r\n });\r\n\r\n // if one class with at least five and one other class with at least one annotation --> enough annotations for training\r\n let enough = false;\r\n if (minFive && twoAnnotated >= 2) {\r\n enough = true;\r\n }\r\n return enough;\r\n };\r\n\r\n onStartTraining = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // start training for dl model\r\n\r\n // check if selectedLayer is parent\r\n if (structures[selectedLayer].classificationSubtype) {\r\n this.props.trainingWarning(\"subtype\");\r\n return;\r\n }\r\n\r\n // check if structure has childs\r\n // check if selectedLayer is parent\r\n if (!structures[selectedLayer].hasChild) {\r\n this.props.trainingWarning(\"hasNoChilds\");\r\n return;\r\n }\r\n\r\n // check if enough objects per class\r\n let childs = this.findClassificationChilds();\r\n let enoughAnnos = this.enoughAnnotations(childs);\r\n if (!enoughAnnos) {\r\n this.props.trainingWarning(\"tooFewAnnotations\");\r\n return;\r\n }\r\n\r\n this.props.saveChangesGallery();\r\n this.props.setAlruns(true);\r\n let passiveLearning = true;\r\n this.props.applyDL(\r\n this.props.tools[\"alm_gallery_tool\"],\r\n this.props.projectId,\r\n this.props.fileId,\r\n passiveLearning\r\n );\r\n };\r\n\r\n saveProject = () => {\r\n // save contextObject in local storage\r\n this.props.persistentStorage.save(\r\n \"contextObject\",\r\n this.props.tiles.getStrAnnoCount()\r\n );\r\n\r\n // save SubtypesPagesObject in local storage\r\n this.props.persistentStorage.save(\r\n \"subtypesPagesObject\",\r\n this.props.tiles.getSubtypesPages()\r\n );\r\n\r\n // save project\r\n this.props.onSave();\r\n };\r\n\r\n showSubtypes = (str) => {\r\n const { structures } = this.props;\r\n // unfold subtypes when using specific tool (so suptypes are displayed in subtype color not parent color)\r\n structures.forEach(function (element) {\r\n if (element.parentId === str.id) {\r\n element.isUnfolded = true;\r\n }\r\n });\r\n\r\n this.props.projectContext.setState({ structures });\r\n };\r\n\r\n openAITrainingPopUp = () => {\r\n const { projectContext } = this.props;\r\n projectContext.aiStateObject.open = true;\r\n this.forceUpdate();\r\n };\r\n\r\n onToggleLayoutItem = (e) => {\r\n const { rendererRef } = this.props;\r\n rendererRef.onToggle(e);\r\n this.forceUpdate();\r\n };\r\n\r\n render() {\r\n const {\r\n classes,\r\n viewerConfig,\r\n structures,\r\n tools,\r\n onChangeTool,\r\n activeTool,\r\n displayTimeBar,\r\n onToggleTimeBar,\r\n displayZStackBar,\r\n showGallery,\r\n galleryType,\r\n show3DViewer,\r\n onToggle3DViewer,\r\n showPointCloud,\r\n onToggleMeshView,\r\n showTilesGallery,\r\n selectedLayer,\r\n onSaveScreenshot,\r\n onZoomDelta,\r\n onZoomFit,\r\n onZoomOriginal,\r\n onToggleSideBar,\r\n onSave,\r\n projectHistory,\r\n verticalToolBarWidth,\r\n ome,\r\n activeTab,\r\n rendererRef,\r\n annotationsAreReduced,\r\n } = this.props;\r\n\r\n const { groupPermissions } = this.props.projectContext;\r\n\r\n const { anchorEl, open } = this.state;\r\n\r\n // check which elements should be displayed in specific modules\r\n let showZoomLevels = true;\r\n let showUndoRedo = true;\r\n let showSaveTool = true;\r\n let showToggleSideBar = true;\r\n if (\r\n this.props.project &&\r\n (this.props.project.type.includes(\"HistoPointCounting\") ||\r\n this.props.project.type.includes(\"HistoClassification\"))\r\n ) {\r\n showZoomLevels = activeTab !== 1;\r\n showUndoRedo = activeTab !== 1;\r\n showSaveTool = activeTab !== 1;\r\n showToggleSideBar = activeTab !== 1;\r\n if (showGallery) {\r\n showToggleSideBar = false;\r\n }\r\n if (show3DViewer) {\r\n showToggleSideBar = false;\r\n showUndoRedo = false;\r\n showSaveTool = false;\r\n showZoomLevels = false;\r\n }\r\n }\r\n return (\r\n {\r\n this.containerElement = containerElement;\r\n }}\r\n className={classes.toolBar}\r\n style={{\r\n width: verticalToolBarWidth - 5,\r\n }}\r\n >\r\n
    \r\n {!(\r\n this.props.projectContext.activeTab > 0 &&\r\n this.props.project &&\r\n (this.props.project.type.includes(\"HistoPointCounting\") ||\r\n this.props.project.type.includes(\"HistoClassification\"))\r\n ) && (\r\n \r\n )}\r\n \r\n {({ TransitionProps }) => (\r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n )}\r\n \r\n {\r\n this.topElement = topElement;\r\n }}\r\n >\r\n {this.checkToolInConfig(\"GalleryTool\") && !show3DViewer && (\r\n \r\n {\r\n if (this.props.isImporting) {\r\n window.showWarningSnackbar(\r\n \"File import is running, please be patient!\"\r\n );\r\n return;\r\n }\r\n this.props.onToggleGallery(!showGallery);\r\n if (showGallery === true) {\r\n this.props.tiles.setGalleryVisible(false);\r\n this.props.setGalleryTool();\r\n this.props.changeToSelectedFile(); // if files gallery is active change to selected file\r\n } else {\r\n this.setToolBarWidth(true);\r\n this.props.tiles.setGalleryVisible(true);\r\n this.props.setGalleryTool();\r\n }\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n {/* ADD 3D-Converting Tool -> start converting with apply */}\r\n {this.checkToolInConfig(\"3DViewer\") && (\r\n \r\n {\r\n onToggle3DViewer(!show3DViewer);\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n {this.checkToolInConfig(\"3DPointCloudView\") && show3DViewer && (\r\n \r\n {\r\n onToggleMeshView(!showPointCloud);\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"TilesTool\") && (\r\n \r\n {\r\n this.props.onToggleTilesGallery(!showTilesGallery);\r\n this.props.setGalleryTool();\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"FilterAnnotationsTool\") &&\r\n !show3DViewer &&\r\n !showGallery &&\r\n !showTilesGallery && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.FILTERANNOTATIONS_ROI\r\n ? Tools.NONE\r\n : Tools.FILTERANNOTATIONS_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"PlotNearestTool\") &&\r\n !show3DViewer &&\r\n !showGallery &&\r\n !showTilesGallery && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.PLOTNEAREST_ROI\r\n ? Tools.NONE\r\n : Tools.PLOTNEAREST_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n {this.props.splitscreenCount > 1 && (\r\n \r\n this.props.onToggleFullscreen()}\r\n >\r\n {this.props.showFullscreen ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )}\r\n {(this.props.showFullscreen || this.props.splitscreenCount === 1) &&\r\n this.checkToolInConfig(\"AdjustLayoutTool\") &&\r\n !show3DViewer &&\r\n !showGallery &&\r\n !showTilesGallery && (\r\n \r\n \r\n this.setState({\r\n open: !this.state.open,\r\n anchorEl: e.target,\r\n })\r\n }\r\n >\r\n \r\n \r\n \r\n )}\r\n {viewerConfig && viewerConfig.project.annotations !== \"pixel\" ? (\r\n \r\n \r\n {this.checkToolInConfig(\"DrawRectangleAnnotationTool\") &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.RECT_ROI\r\n ? Tools.NONE\r\n : Tools.RECT_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n ) : (\r\n \r\n \r\n {this.checkToolInConfig(\"DrawPixelAnnotationTool\") &&\r\n galleryType !== \"FilesGallery\" &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.PEN_ROI\r\n ? Tools.NONE\r\n : Tools.PEN_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"DrawMagicWandAnnotationTool\") &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.MAGICWAND_ROI\r\n ? Tools.NONE\r\n : Tools.MAGICWAND_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"DrawRectangleAnnotationTool\") &&\r\n galleryType !== \"FilesGallery\" &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.RECTANGLE_ROI\r\n ? Tools.NONE\r\n : Tools.RECTANGLE_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"DrawEllipseAnnotationTool\") &&\r\n galleryType !== \"FilesGallery\" &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.ELLIPSE_ROI\r\n ? Tools.NONE\r\n : Tools.ELLIPSE_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"DrawRegionAnnotationTool\") &&\r\n galleryType !== \"FilesGallery\" &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.REGION_ROI\r\n ? Tools.NONE\r\n : Tools.REGION_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {[\r\n \"DrawRegionGrowingAnnotationTool\",\r\n \"DrawGrabCutAnnotationTool\",\r\n \"DrawSAMAnnotationTool\",\r\n ].some((tool) => this.checkToolInConfig(tool)) && (\r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"DrawRegionGrowingAnnotationTool\") &&\r\n !show3DViewer &&\r\n !showTilesGallery &&\r\n galleryType !== \"FilesGallery\" && (\r\n \r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.REGIONGROWING_ROI\r\n ? Tools.NONE\r\n : Tools.REGIONGROWING_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n {this.checkToolInConfig(\"RoiResizeTool\") &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.ROIRESIZE\r\n ? Tools.NONE\r\n : Tools.ROIRESIZE\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"DrawGrabCutAnnotationTool\") &&\r\n !show3DViewer &&\r\n !showTilesGallery &&\r\n galleryType !== \"FilesGallery\" && (\r\n \r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.REGIONGRABCUT_ROI\r\n ? Tools.NONE\r\n : Tools.REGIONGRABCUT_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"DrawSAMAnnotationTool\") &&\r\n !show3DViewer &&\r\n !showTilesGallery &&\r\n galleryType !== \"FilesGallery\" && (\r\n \r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.REGIONSAM_ROI\r\n ? Tools.NONE\r\n : Tools.REGIONSAM_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"HeatmapTool\") &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.HEATMAP\r\n ? Tools.NONE\r\n : Tools.HEATMAP\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {(showGallery || showTilesGallery || show3DViewer) && (\r\n \r\n )}\r\n\r\n {/*viewerConfig &&\r\n viewerConfig.project.structures[selectedLayer] &&\r\n viewerConfig.project.structures[selectedLayer].tools.map(\r\n tool =>\r\n tool.name &&\r\n tool.name === \"alm_gallery_tool\" &&\r\n showGallery &&\r\n !this.props.alruns &&\r\n this.checkToolInConfig(\"OtherTools\") && (\r\n \r\n {\r\n onChangeTool(\r\n activeTool === tool.name ? Tools.NONE : tool.name\r\n );\r\n }}\r\n >\r\n \r\n \r\n \r\n )\r\n )*/}\r\n \r\n )}\r\n\r\n {showGallery || showTilesGallery ? (\r\n \r\n ) : (\r\n \r\n \r\n {viewerConfig &&\r\n viewerConfig.project.annotations !== \"pixel\" ? (\r\n \r\n {/*this.checkToolInConfig(\"DrawRectangleAnnotationTool\") && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.RECT_ROI\r\n ? Tools.NONE\r\n : Tools.RECT_ROI\r\n )\r\n }\r\n >\r\n \r\n \r\n \r\n )*/}\r\n \r\n ) : (\r\n \r\n {this.checkToolInConfig(\"FillHoleAnnotationTool\") &&\r\n !show3DViewer && (\r\n \r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.FILL\r\n ? Tools.NONE\r\n : Tools.FILL\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"SelectRegionAnnotationTool\") &&\r\n !show3DViewer && (\r\n \r\n \r\n {\r\n onChangeTool(\r\n activeTool === Tools.SELECTION_ROI\r\n ? Tools.NONE\r\n : Tools.SELECTION_ROI\r\n );\r\n // make showsubtypes true for selected structure an unfold subtypes\r\n structures[selectedLayer].showSubtypes = true;\r\n this.showSubtypes(structures[selectedLayer]);\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"CopyRegionAnnotationTool\") &&\r\n !show3DViewer && (\r\n \r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.COPY_ROI\r\n ? Tools.NONE\r\n : Tools.COPY_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"AITrainingTool\") && !show3DViewer && (\r\n \r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.AITRAINING\r\n ? Tools.NONE\r\n : Tools.AITRAINING\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"GridTool\") &&\r\n !this.props.tiles.getHistoClassificationStarted() &&\r\n !this.props.resultTab.getGridExists() &&\r\n !show3DViewer && (\r\n \r\n \r\n {\r\n onChangeTool(\r\n activeTool === Tools.GRIDTOOL\r\n ? Tools.NONE\r\n : Tools.GRIDTOOL\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"GridAnnotationTool\") &&\r\n !show3DViewer && (\r\n \r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.GRIDANNOTATIONTOOL\r\n ? Tools.NONE\r\n : Tools.GRIDANNOTATIONTOOL\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n\r\n \r\n\r\n {this.checkToolInConfig(\"AICockpit\") && (\r\n
    \r\n {/* \r\n this.openAITrainingPopUp()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n */}\r\n \r\n {\r\n this.props.history.push(\"/ai_view\");\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n this.ADDFUNCTIONHERE()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n
    \r\n )}\r\n\r\n \r\n\r\n {structures &&\r\n structures[selectedLayer] &&\r\n structures[selectedLayer].tools.map(\r\n (tool) =>\r\n tool.name &&\r\n tools[tool.name] &&\r\n tool.name !== \"alm_gallery_tool\" &&\r\n tool.name !== \"iam_ai_inference\" &&\r\n this.checkToolInConfig(\"OtherTools\") &&\r\n !show3DViewer && (\r\n \r\n \r\n {\r\n onChangeTool(\r\n activeTool === tool.name\r\n ? Tools.NONE\r\n : tool.name\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )\r\n )}\r\n {structures &&\r\n structures[selectedLayer] &&\r\n this.props.aiUsedStructures.map(\r\n (struct, idx) =>\r\n struct.structureName &&\r\n tools[\"iam_ai_inference\"] &&\r\n structures[selectedLayer].label ===\r\n struct.structureName &&\r\n structures[selectedLayer].id === struct.id &&\r\n this.checkToolInConfig(\"OtherTools\") &&\r\n !show3DViewer && (\r\n \r\n \r\n {\r\n onChangeTool(\r\n activeTool === \"iam_ai_inference\"\r\n ? Tools.NONE\r\n : \"iam_ai_inference\",\r\n {\r\n selectedModel: struct.selectedModel,\r\n selectedVersion: struct.selectedVersion,\r\n }\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )\r\n )}\r\n
    \r\n )}\r\n\r\n {false &&\r\n this.checkToolInConfig(\"PassiveLearningTool\") &&\r\n !show3DViewer &&\r\n showGallery &&\r\n !this.props.alruns && (\r\n \r\n \r\n this.onStartTraining()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"ApplyModelTool\") &&\r\n !show3DViewer &&\r\n !showGallery &&\r\n !this.props.alruns && (\r\n \r\n \r\n this.ApplyModel()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"SaveImagesTool\") &&\r\n !show3DViewer &&\r\n showGallery &&\r\n !this.props.alruns && (\r\n \r\n \r\n this.onSaveImages(true)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n {this.checkToolInConfig(\"SaveImagesTool\") &&\r\n !show3DViewer &&\r\n showGallery &&\r\n !this.props.alruns && (\r\n \r\n this.onSaveImages(false)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n
    \r\n \r\n
    \r\n {\r\n this.bottomElement = bottomElement;\r\n }}\r\n >\r\n {!showGallery && !showTilesGallery && !show3DViewer ? (\r\n
    \r\n {this.checkToolInConfig(\"CommentTool\") && (\r\n \r\n \r\n \r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.COMMENT_ROI\r\n ? Tools.NONE\r\n : Tools.COMMENT_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.props.showFullscreen && (\r\n \r\n this.props.onToggleOverlay()}\r\n size=\"large\"\r\n >\r\n {this.props.showOverlay ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"LandmarkTool\") && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.LANDMARK\r\n ? Tools.NONE\r\n : Tools.LANDMARK\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.props.showFullscreen && this.props.showOverlay && (\r\n \r\n this.props.onToggleWindowTool()}\r\n size=\"large\"\r\n >\r\n {this.props.showWindowTool ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )}\r\n {this.checkToolInConfig(\"ScreenshotTool\") && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {this.checkToolInConfig(\"ScreenshotTool\") && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.STREAMVIEW\r\n ? Tools.NONE\r\n : Tools.STREAMVIEW\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n\r\n {this.checkToolInConfig(\"ZoomOriginalTool\") && showZoomLevels && (\r\n \r\n \r\n
    1:1
    \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"ZoomOriginalTool\") && showZoomLevels && (\r\n \r\n this.props.onZoomOneToN(0.25)}\r\n size=\"large\"\r\n >\r\n
    1:4
    \r\n \r\n
    \r\n )}\r\n\r\n {this.checkToolInConfig(\"ZoomOriginalTool\") && showZoomLevels && (\r\n \r\n this.props.onZoomOneToN(0.1)}\r\n size=\"large\"\r\n >\r\n
    1:10
    \r\n \r\n
    \r\n )}\r\n\r\n {this.checkToolInConfig(\"ZoomFitTool\") && showZoomLevels && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"ZoomInOutTool\") && showZoomLevels && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {this.checkToolInConfig(\"ZoomInOutTool\") && showZoomLevels && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n\r\n {this.checkToolInConfig(\"SaveTool\") && showToggleSideBar && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n\r\n {showUndoRedo && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {showUndoRedo && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"SaveTool\") && showSaveTool && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
    \r\n ) : (\r\n
    \r\n \r\n {this.checkToolInConfig(\"SaveTool\") &&\r\n showToggleSideBar &&\r\n !show3DViewer && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n {this.checkToolInConfig(\"SaveTool\") &&\r\n showSaveTool &&\r\n !show3DViewer && (\r\n \r\n this.saveProject()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n
    \r\n )}\r\n
    \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nVerticalToolBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n verticalToolBarWidth: PropTypes.number,\r\n viewerConfig: PropTypes.object,\r\n structures: PropTypes.array,\r\n // change view layout\r\n onToggleTimeBar: PropTypes.func,\r\n showTimeBar: PropTypes.bool,\r\n displayTimeBar: PropTypes.bool,\r\n onToggleMiniMap: PropTypes.func,\r\n showObjectIdx: PropTypes.bool,\r\n showMiniMap: PropTypes.bool,\r\n onToggleScaleBar: PropTypes.func,\r\n showScaleBar: PropTypes.bool,\r\n showGallery: PropTypes.bool,\r\n galleryType: PropTypes.string,\r\n show3DViewer: PropTypes.bool,\r\n showPointCloud: PropTypes.bool,\r\n onToggleZStackBar: PropTypes.func,\r\n showZStackBar: PropTypes.bool,\r\n displayZStackBar: PropTypes.bool,\r\n onToggleImageInfo: PropTypes.func,\r\n onToggleResultTable: PropTypes.func,\r\n showImageInfo: PropTypes.bool,\r\n showZoomBar: PropTypes.bool,\r\n onToggleGallery: PropTypes.func,\r\n // tools\r\n onChangeTool: PropTypes.func,\r\n activeTool: PropTypes.string,\r\n // change layer\r\n selectedLayer: PropTypes.number,\r\n // screenshot functions\r\n onSaveScreenshot: PropTypes.func,\r\n // zoom functions\r\n onZoomOriginal: PropTypes.func,\r\n onZoomOneToN: PropTypes.func,\r\n onZoomDelta: PropTypes.func,\r\n onZoomFit: PropTypes.func,\r\n // toggle Sidebar\r\n onToggleSideBar: PropTypes.func,\r\n // save changes\r\n onSave: PropTypes.func,\r\n resizeSideBar: PropTypes.func,\r\n // from withTiles\r\n tiles: PropTypes.object,\r\n updateToolBarWidth: PropTypes.func,\r\n isImporting: PropTypes.bool,\r\n //not ordered\r\n project: PropTypes.object,\r\n spinloader: PropTypes.object,\r\n setAlruns: PropTypes.func,\r\n roiLayers: PropTypes.array,\r\n saveChangesGallery: PropTypes.func,\r\n projectId: PropTypes.string,\r\n fileId: PropTypes.string,\r\n trainingWarning: PropTypes.func,\r\n applyDL: PropTypes.func,\r\n tools: PropTypes.array,\r\n persistentStorage: PropTypes.object,\r\n projectContext: PropTypes.object,\r\n onToggle3DViewer: PropTypes.func,\r\n onToggleMeshView: PropTypes.func,\r\n showTilesGallery: PropTypes.bool,\r\n projectHistory: PropTypes.object,\r\n ome: PropTypes.object,\r\n activeTab: PropTypes.number,\r\n rendererRef: PropTypes.object,\r\n setGalleryTool: PropTypes.func,\r\n changeToSelectedFile: PropTypes.func,\r\n onToggleTilesGallery: PropTypes.func,\r\n splitscreenCount: PropTypes.number,\r\n onToggleFullscreen: PropTypes.func,\r\n showFullscreen: PropTypes.bool,\r\n resultTab: PropTypes.object,\r\n alruns: PropTypes.bool,\r\n onToggleOverlay: PropTypes.func,\r\n showOverlay: PropTypes.bool,\r\n onToggleWindowTool: PropTypes.func,\r\n showWindowTool: PropTypes.bool,\r\n aiUsedStructures: PropTypes.array,\r\n history: PropTypes.object,\r\n annotationsAreReduced: PropTypes.bool,\r\n};\r\n\r\nexport default withAllViewerContexts(\r\n withTiles(withResultTab(withStyles(styles)(VerticalToolBar)))\r\n);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport classNames from \"classnames\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport withTheme from \"@mui/styles/withTheme\";\r\n\r\nimport DragIndicator from \"@mui/icons-material/DragIndicator\";\r\nimport Draggable from \"react-draggable\";\r\nimport { Resizable } from \"react-resizable\";\r\n\r\nimport {\r\n List,\r\n ListItem,\r\n ListItemText,\r\n Typography,\r\n IconButton,\r\n} from \"@mui/material\";\r\n\r\nimport { Remove, PlayArrow } from \"@mui/icons-material\";\r\n\r\nimport { getParentIndexLayer } from \"../utils/StructuresUtils\";\r\n\r\nconst styles = {\r\n root: {\r\n position: \"absolute\",\r\n top: 76,\r\n left: 5,\r\n height: 400,\r\n width: 500,\r\n border: \"2px solid rgb(85, 85, 85)\",\r\n opacity: 0.8,\r\n backgroundColor: \"#000000\",\r\n color: \"#ffffff\",\r\n },\r\n dragIndicator: {\r\n color: \"#fff\",\r\n position: \"absolute\",\r\n top: 5,\r\n right: 0,\r\n cursor: \"grab\",\r\n },\r\n grabbing: {\r\n cursor: \"grabbing\",\r\n },\r\n resizableContainer: {\r\n \"& .react-resizable-handle\": {\r\n pointerEvents: \"all\",\r\n },\r\n \"& .react-resizable-handle-se::before\": {\r\n content: \"''\",\r\n display: \"block\",\r\n position: \"absolute\",\r\n bottom: 3,\r\n right: 3,\r\n width: 6,\r\n height: 6,\r\n borderBottom: \"1px solid #fff\",\r\n borderRight: \"1px solid #fff\",\r\n },\r\n },\r\n};\r\n\r\nclass ResultTable extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n grabbing: false,\r\n tableSize: {\r\n width: 500,\r\n height: 499,\r\n },\r\n structuredTableValues: props.structures.map((structure) => {\r\n return {\r\n label: structure.label,\r\n id: structure.id,\r\n percentage: 0,\r\n numberObjects: 0,\r\n };\r\n }),\r\n };\r\n\r\n window.updateResultTable = this.updateResultTable;\r\n }\r\n\r\n componentDidMount = () => {\r\n this.updateResultTable();\r\n };\r\n\r\n updateResultTable = () => {\r\n const { structures } = this.props;\r\n let stateObject = [];\r\n structures.forEach((structure) => {\r\n let percentageNumber = this.getPercentageAndNumber(structure);\r\n let obj = {\r\n label: structure.label,\r\n id: structure.id,\r\n percentage: percentageNumber.percentage,\r\n numberObjects: percentageNumber.numberObjects,\r\n };\r\n stateObject.push(obj);\r\n });\r\n this.setState({ structuredTableValues: stateObject });\r\n };\r\n\r\n findChilds = (str) => {\r\n // return direct classification subtypes\r\n return this.props.structures.filter(\r\n (element) =>\r\n element.subtypeLevel === str.subtypeLevel + 1 &&\r\n element.parentId === str.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n findAllSubtypes = (structure) => {\r\n // get all subtypes of selectedLayer (also subsubtypes)\r\n\r\n // first get all direct childs\r\n let childs = this.findChilds(structure);\r\n let allChilds = [];\r\n\r\n // search for childs of childs until no childs are checked for childs\r\n while (childs.length !== 0) {\r\n // code block to be executed\r\n childs = childs.concat(this.findChilds(childs[0]));\r\n if (!allChilds.includes(childs[0]) && childs[0].classificationSubtype) {\r\n allChilds.push(childs[0]);\r\n }\r\n childs.shift();\r\n }\r\n return allChilds;\r\n };\r\n\r\n getPercentageAndNumber = (structure) => {\r\n const { allRoiLayers, fileId, structures } = this.props;\r\n\r\n let percNumb = { percentage: 0, numberObjects: 0 };\r\n\r\n // get number of all objects of structure\r\n let parentLayer = getParentIndexLayer(structure, structures);\r\n if (structure.classificationSubtype) {\r\n // for subtypes\r\n // get number of objects:\r\n\r\n // get all childNames to find rois\r\n let childIds = [];\r\n let childLabels = [];\r\n this.findAllSubtypes(structure).forEach((element) => {\r\n childIds.push(element.id);\r\n childLabels.push(element.label);\r\n });\r\n childIds.push(structure.id); // push current structure\r\n childLabels.push(structure.label); // push current structure\r\n\r\n percNumb.numberObjects = allRoiLayers[fileId][\r\n parentLayer\r\n ].layer.regionRois.filter(\r\n (element) => childIds.includes(element.structureId) /* ||\r\n childLabels.includes(element.subtypeName)*/\r\n ).length;\r\n\r\n // get percentage:\r\n // get number of parent objects\r\n let parentIdx = structures.findIndex(\r\n (element) => element.id === structure.parentId\r\n );\r\n\r\n let numberParentObjects = this.getPercentageAndNumber(\r\n structures[parentIdx]\r\n ).numberObjects;\r\n\r\n if (percNumb.numberObjects > 0 && numberParentObjects > 0) {\r\n percNumb.percentage = percNumb.numberObjects / numberParentObjects;\r\n } else {\r\n percNumb.percentage = 0;\r\n }\r\n } else {\r\n // for parent structures\r\n percNumb.numberObjects =\r\n allRoiLayers[fileId][parentLayer].layer.regionRois.length;\r\n percNumb.percentage = \"-\";\r\n }\r\n\r\n return percNumb;\r\n };\r\n\r\n renderIcon = (structure) => {\r\n if (structure.isSubtype) {\r\n return (\r\n \r\n {structure.classificationSubtype ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n }\r\n };\r\n\r\n renderRow = (structure, structureIdx) => {\r\n const { structures, selectedLayer } = this.props;\r\n let childs = this.findChilds(structures[selectedLayer]);\r\n let childIds = childs.map((obj) => {\r\n return obj.id;\r\n });\r\n let isSelected =\r\n childIds.includes(structure.id) ||\r\n structure.id === structures[selectedLayer].id;\r\n\r\n return (\r\n \r\n {this.renderIcon(structures[structureIdx])}\r\n \r\n \r\n {structure.percentage === \"-\"\r\n ? \"\"\r\n : (structure.percentage * 100).toFixed(2) + \"%\"}\r\n \r\n \r\n {structure.numberObjects}\r\n \r\n \r\n );\r\n };\r\n\r\n onResize = (event, { size }) => {\r\n // resize element\r\n let minSizeWidth = 240;\r\n let minSizeHeight = 150;\r\n let maxSizeWidth = 600;\r\n let maxSizeHeight = 1200;\r\n size.width = size.width < minSizeWidth ? minSizeWidth : size.width;\r\n size.width = size.width > maxSizeWidth ? maxSizeWidth : size.width;\r\n size.height = size.height < minSizeHeight ? minSizeHeight : size.height;\r\n size.height = size.height > maxSizeHeight ? maxSizeHeight : size.height;\r\n\r\n this.setState({ tableSize: size });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { grabbing, structuredTableValues } = this.state;\r\n\r\n return (\r\n this.setState({ grabbing: true })}\r\n onStop={() => this.setState({ grabbing: false })}\r\n >\r\n \r\n (this.root = c)}\r\n className={classNames(classes.root, grabbing && classes.grabbing)}\r\n style={{\r\n height: this.state.tableSize.height,\r\n width: this.state.tableSize.width,\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n Percentage\r\n \r\n \r\n Objects\r\n \r\n \r\n {structuredTableValues.map((structure, index) =>\r\n this.renderRow(structure, index)\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nResultTable.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n structures: PropTypes.array,\r\n allRoiLayers: PropTypes.object,\r\n fileId: PropTypes.string,\r\n selectedLayer: PropTypes.number,\r\n};\r\n\r\nexport default withTheme(withStyles(styles)(ResultTable));\r\n","\r\n\r\nfunction getDist(pointA, pointB) {\r\n\tconst dx = pointA[0] - pointB[0];\r\n\tconst dy = pointA[1] - pointB[1];\r\n\treturn Math.sqrt(dx*dx + dy*dy);\r\n}\r\n\r\nfunction getCurveDistances(startIndex, points) {\r\n\tconst distAr = [];\r\n\tfor (let i = 0; i < points.length; i++) {\r\n\t\tconst indexA = (startIndex + i) % points.length;\r\n\t\tconst indexB = (startIndex + i + 1) % points.length;\r\n\t\tconst pointA = points[indexA];\r\n\t\tconst pointB = points[indexB];\r\n\t\tconst dist = getDist(pointA, pointB);\r\n\t\tdistAr.push(dist);\r\n\t}\r\n\treturn distAr;\r\n}\r\n\r\nfunction getStartInterpolPoint(distAr, absPlace) {\r\n\tlet accLen = 0;\r\n\tfor (let i = 0; i < distAr.length; i++) {\r\n\t\taccLen += distAr[i];\r\n\t\tif (absPlace <= accLen) {\r\n\t\t\treturn {\r\n\t\t\t\tdistIndex: i,\r\n\t\t\t\tabsPlaceDist: absPlace - (accLen - distAr[i]),\r\n\t\t\t};\r\n\t\t}\r\n\t}\r\n\treturn {\r\n\t\tdistIndex: distAr.length - 1,\r\n\t\tabsPlaceDist: distAr[distAr.length - 1],\r\n\t};\r\n}\r\n\r\nfunction getPointByPlaceInCurve(startIndex, points, place) {\r\n\tconst distAr = getCurveDistances(startIndex, points);\r\n\tconst distSum = distAr.reduce((a, b) => a + b, 0);\r\n\tconst absPlace = place * distSum;\r\n\tconst { distIndex, absPlaceDist } = getStartInterpolPoint(distAr, absPlace);\r\n\tconst indA = (startIndex + distIndex) % points.length;\r\n\tconst indB = (startIndex + distIndex + 1) % points.length;\r\n\tconst pA = points[indA];\r\n\tconst pB = points[indB];\r\n\tconst k = absPlaceDist / distAr[distIndex];\r\n\treturn [\r\n\t\tpA[0] + (pB[0] - pA[0]) * k,\r\n\t\tpA[1] + (pB[1] - pA[1]) * k,\r\n\t];\r\n}\r\n\r\n\r\nfunction linearInterpol(pStart, pEnd, tStart, tEnd, t) {\r\n const k = (t - tStart) / (tEnd - tStart);\r\n return [\r\n pStart[0] + (pEnd[0] - pStart[0]) * k,\r\n pStart[1] + (pEnd[1] - pStart[1]) * k,\r\n ]\r\n}\r\n\r\nexport function getFigure(figureA, figureB, startPointIndA, startPointIndB, \r\n\tfigAIsClockwise, figBIsClockwise, pointsCount, t1, t2, t) {\r\n if (t > t2) {\r\n t = t2;\r\n }\r\n if (t < t1) {\r\n t = t1;\r\n }\r\n const delta = 1/pointsCount;\r\n const figure = [];\r\n const clockwiseSignA = figAIsClockwise ? -1 : 1;\r\n const clockwiseSignB = figBIsClockwise ? -1 : 1;\r\n for (let xInd = 0; xInd < pointsCount; xInd++) {\r\n\tconst xAInd = (startPointIndA + clockwiseSignA * xInd + pointsCount) % pointsCount; \r\n\tconst xBInd = (startPointIndB + clockwiseSignB * xInd + pointsCount) % pointsCount; \r\n\tconst xA = xAInd * delta;\r\n\tconst xB = xBInd * delta;\r\n const pointFrom = getPointByPlaceInCurve(0, figureA, xA);\r\n const pointTo = getPointByPlaceInCurve(0, figureB, xB);\r\n const point = linearInterpol(pointFrom, pointTo, t1, t2, t);\r\n figure.push(point);\r\n }\r\n return figure;\r\n}\r\n\r\nexport function predictStartPointIndex(figure, pointsCount) {\r\n\tconst delta = 1/pointsCount;\r\n\t//const figure = [];\r\n\tlet xMin = Infinity;\r\n\tlet xMax = -Infinity;\r\n\tlet yMin = Infinity;\r\n\tlet yMax = -Infinity;\r\n\tfor (let pInd = 0; pInd < pointsCount; pInd++) {\r\n\t\tconst d = pInd * delta;\r\n\t\tconst p = getPointByPlaceInCurve(0, figure, d);\r\n\t\tif (p[0] < xMin) {\r\n\t\t\txMin = p[0];\r\n\t\t}\r\n\t\tif (p[0] > xMax) {\r\n\t\t\txMax = p[0];\r\n\t\t}\r\n\t\tif (p[1] < yMin) {\r\n\t\t\tyMin = p[1];\r\n\t\t}\r\n\t\tif (p[1] > yMax) {\r\n\t\t\tyMax = p[1];\r\n\t\t}\r\n\t}\r\n\r\n\tlet minDist = Infinity;\r\n\tlet startPointIndex = 0;\r\n\tconst anchorPoint = [(xMin + xMax) / 2, yMin];\r\n\tfor (let pInd = 0; pInd < pointsCount; pInd++) {\r\n\t\tconst d = pInd * delta;\r\n\t\tconst p = getPointByPlaceInCurve(0, figure, d);\r\n\t\tconst dist = getDist(anchorPoint, p);\r\n\t\tif (dist < minDist) {\r\n\t\t\tminDist = dist;\r\n\t\t\tstartPointIndex = pInd;\r\n\t\t}\r\n\t}\r\n\treturn startPointIndex;\r\n}\r\n\r\nfunction getVec(pointA, pointB) {\r\n\treturn [pointB[0] - pointA[0], pointB[1] - pointA[1]];\r\n}\r\n\r\nexport function traversalPolylineClockwise(fig) {\r\n\tlet a = theMostLeftPointIndex(fig);\r\n\tlet aNext = (a + 1) % fig.length;\r\n\tlet aPrev = (a - 1 + fig.length) % fig.length;\r\n\tconst vPrev = getVec(fig[a], fig[aPrev]);\r\n\tconst vNext = getVec(fig[a], fig[aNext]);\r\n\treturn vPrev[0] * vNext[1] - vPrev[1] * vNext[0] < 0;\r\n}\r\n\r\nfunction theMostLeftPointIndex(fig) {\r\n\tlet ind = 0;\r\n\tlet xMin = Infinity;\r\n\tfor (let i = 0; i < fig.length; i++) {\r\n\t\tif (fig[ind][0] < xMin) {\r\n\t\t\txMin = fig[ind][0];\r\n\t\t\tind = i;\r\n\t\t}\t\r\n\t}\t\r\n\treturn ind;\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = {\r\n root: {\r\n backgroundColor: \"transparent\",\r\n margin: \"20px 0px\",\r\n height: \"30px\",\r\n position: \"relative\",\r\n },\r\n\r\n keyFrame: {\r\n position: \"absolute\",\r\n backgroundColor: \"black\",\r\n borderRadius: \"100%\",\r\n },\r\n\r\n interval: {\r\n position: \"absolute\",\r\n },\r\n};\r\n\r\nclass TimeChart extends Component {\r\n render() {\r\n const {\r\n classes,\r\n structure,\r\n keyFrames,\r\n frameWidth,\r\n interpolatedIntervals,\r\n isSelected,\r\n } = this.props;\r\n const timeChartHeight = 30;\r\n const keyFrameElSize = 8; //Math.min(frameWidth, timeChartHeight) / 2;\r\n const keyFrameEls = [];\r\n for (let keyFrame in keyFrames) {\r\n keyFrameEls.push(\r\n \r\n );\r\n }\r\n\r\n const intervalEls = [];\r\n const intervalElHeight = 2;\r\n for (let interval of interpolatedIntervals) {\r\n intervalEls.push(\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {intervalEls}\r\n {keyFrameEls}\r\n \r\n );\r\n }\r\n}\r\n\r\nTimeChart.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n structure: PropTypes.object,\r\n keyFrames: PropTypes.object,\r\n interpolatedIntervals: PropTypes.array,\r\n frameWidth: PropTypes.number,\r\n isSelected: PropTypes.bool,\r\n};\r\n\r\nexport default withStyles(styles)(TimeChart);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport { IconButton, TextField, Tooltip } from \"@mui/material\";\r\nimport {\r\n PlayCircleOutline,\r\n PauseCircleOutline,\r\n ArrowLeft,\r\n ArrowRight,\r\n} from \"@mui/icons-material\";\r\n\r\nimport {\r\n getFigure,\r\n predictStartPointIndex,\r\n traversalPolylineClockwise,\r\n} from \"../utils/GeometricInterpolation\";\r\nimport { RegionROI } from \"../utils/ROI\";\r\nimport RBush from \"rbush\";\r\n\r\nimport TimeChart from \"./TimeChart\";\r\n\r\nconst tongueWidth = 30;\r\n\r\nconst styles = {\r\n root: {\r\n padding: 0,\r\n },\r\n\r\n stepWalker: {\r\n backgroundColor: \"rgb(211,211,211)\",\r\n position: \"relative\",\r\n height: 50,\r\n },\r\n\r\n container: {\r\n position: \"relative\",\r\n // add scrolling, if needed\r\n overflow: \"auto\",\r\n boxShadow: \"0px -2px 10px 0px rgba(0,0,0,0.29)\",\r\n //border: \"2px solid rgb(0, 0, 200)\",\r\n height: \"calc(100% - 80px)\",\r\n background: \"white\",\r\n },\r\n\r\n stepLeft: {\r\n position: \"absolute\",\r\n left: 5,\r\n top: 6,\r\n padding: 0,\r\n color: \"rgb(6,115,193)\",\r\n },\r\n\r\n timeCounter: {\r\n textAlign: \"center\",\r\n color: \"rgb(6,115,193)\",\r\n },\r\n\r\n modePanel: {\r\n backgroundColor: \"rgb(211,211,211)\",\r\n position: \"relative\",\r\n boxShadow: \"0px -2px 10px 0px rgba(0,0,0,0.29)\",\r\n height: 30,\r\n },\r\n\r\n interpolate: {\r\n padding: 0,\r\n borderWidth: 0,\r\n outline: 0,\r\n display: \"inline-block\",\r\n position: \"relative\",\r\n textAlign: \"center\",\r\n left: 10,\r\n fontSize: 12 + \"px\",\r\n top: 2,\r\n color: \"rgb(6,115,193)\",\r\n height: 20,\r\n width: 100,\r\n \"&:hover\": {\r\n backgroundColor: \"#fff\",\r\n },\r\n },\r\n framerate: {\r\n marginLeft: 20,\r\n color: \"red\",\r\n width: 60,\r\n \"& div\": {\r\n color: \"black\",\r\n marginTop: 4,\r\n width: 52,\r\n },\r\n \"& label\": {\r\n color: \"rgb(6,115,193) !important\",\r\n fontSize: 10,\r\n lineHeight: \"12px\",\r\n padding: 0,\r\n margin: 0,\r\n },\r\n \"& input\": {\r\n padding: \"6px 0 0px\",\r\n fontSize: 12,\r\n },\r\n },\r\n\r\n playButtons: {\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n },\r\n\r\n playPauseForward: {\r\n marginLeft: 10,\r\n display: \"inline-block\",\r\n padding: 0,\r\n color: \"rgb(6,115,193)\",\r\n },\r\n\r\n playPauseBackward: {\r\n display: \"inline-block\",\r\n padding: 0,\r\n color: \"rgb(6,115,193)\",\r\n transform: \"scale(-1, 1)\",\r\n },\r\n\r\n stepRight: {\r\n position: \"absolute\",\r\n right: 5,\r\n top: 6,\r\n padding: 0,\r\n color: \"rgb(6,115,193)\",\r\n },\r\n\r\n resizeTongue: {\r\n backgroundColor: \"rgb(211,211,211)\",\r\n position: \"absolute\",\r\n height: 9,\r\n width: tongueWidth,\r\n marginLeft: -tongueWidth / 2,\r\n bottom: 0,\r\n left: \"50%\",\r\n boxShadow: \"0px -2px 10px -2px rgba(0,0,0,0.29)\",\r\n //boxShadow: \"1px -13px 19px 0px rgba(0,0,0,0.55)\",\r\n cursor: \"row-resize\",\r\n zIndex: 999999,\r\n },\r\n\r\n resizingLine: {\r\n backgroundColor: \"#888\",\r\n marginTop: 4,\r\n marginLeft: 4,\r\n marginRight: 4,\r\n height: 1,\r\n },\r\n};\r\n\r\nconst frameMinWidth = 14;\r\nconst frameMaxWidth = 28;\r\n\r\nclass TimeLineTool extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n dimensions: null,\r\n isResizing: false,\r\n resizePos: 0,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n document.addEventListener(\"mousemove\", this.handleResizeMouseMove);\r\n document.addEventListener(\"mouseup\", this.handleResizeMouseUp);\r\n this.setState({\r\n dimensions: {\r\n width: this.container.offsetWidth,\r\n height: this.container.offsetHeight,\r\n },\r\n });\r\n }\r\n\r\n componentWillUnmount() {\r\n document.removeEventListener(\"mousemove\", this.handleResizeMouseMove);\r\n document.removeEventListener(\"mouseup\", this.handleResizeMouseUp);\r\n }\r\n\r\n setPosByMouse(coordX) {\r\n const { dimensions } = this.state;\r\n const { ome, onChangeT } = this.props;\r\n let frameWidth = Math.floor(dimensions.width / ome.sizeT);\r\n if (frameWidth < frameMinWidth) {\r\n frameWidth = frameMinWidth;\r\n }\r\n if (frameWidth > frameMaxWidth) {\r\n frameWidth = frameMaxWidth;\r\n }\r\n // rect with borders in context of client window of the browser\r\n const rect = this.innerContainer.getBoundingClientRect();\r\n let x = Math.floor(\r\n (coordX - rect.left - this.innerContainer.clientLeft) / frameWidth\r\n );\r\n if (x < 0) {\r\n // x is frame number\r\n x = 0;\r\n }\r\n if (x >= ome.sizeT) {\r\n x = ome.sizeT - 1;\r\n }\r\n\r\n onChangeT(x);\r\n }\r\n\r\n handleMouseDown = (ev) => {\r\n if (ev.button !== 0) {\r\n return;\r\n }\r\n this.setPosByMouse(ev.clientX);\r\n };\r\n\r\n handleMouseMove = (ev) => {\r\n if (!(ev.buttons & 1)) {\r\n return;\r\n }\r\n this.setPosByMouse(ev.clientX);\r\n };\r\n\r\n searchPrevKeyFrame(curT, structureIndex, frameArray) {\r\n for (let i = curT - 1; i >= 0; i--) {\r\n const layer = this.findLayer(structureIndex, frameArray[i]);\r\n if (layer && layer.isKeyFrame) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n searchNextKeyFrame(curT, structureIndex, frameArray) {\r\n for (let i = curT + 1; i < this.props.ome.sizeT; i++) {\r\n const layer = this.findLayer(structureIndex, frameArray[i]);\r\n if (layer && layer.isKeyFrame) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n findLayer(structureIndex, frameArrayItem) {\r\n if (!frameArrayItem || !this.props.structures[structureIndex]) {\r\n return null;\r\n }\r\n for (let layer of frameArrayItem) {\r\n if (layer.id === this.props.structures[structureIndex].id) {\r\n return layer;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n getOrCreateFrameArrayItem(frame) {\r\n if (this.props.frameArray[frame]) {\r\n return this.props.frameArray[frame];\r\n }\r\n this.props.frameArray[frame] = [];\r\n return this.props.frameArray[frame];\r\n }\r\n\r\n getOrCreateRoiLayer(frameArrayItem, structureIndex) {\r\n const roiLayer = frameArrayItem.find(\r\n (x) => x.id === this.props.structures[structureIndex].id\r\n );\r\n if (roiLayer) {\r\n return roiLayer;\r\n }\r\n const newRoiLayer = {\r\n id: this.props.structures[structureIndex].id,\r\n layer: {\r\n inverted: false,\r\n regionRois: [],\r\n },\r\n tree: new RBush(),\r\n };\r\n frameArrayItem.push(newRoiLayer);\r\n return newRoiLayer;\r\n }\r\n\r\n handleInterpolation = () => {\r\n const frameArray = this.props.frameArray;\r\n const selectedLayer = this.props.selectedLayer;\r\n const curT = Math.floor(this.props.time);\r\n const layer = this.findLayer(selectedLayer, frameArray[curT]);\r\n if (!layer || (layer.isKeyFrame && layer.layer.regionRois.length > 0)) {\r\n return;\r\n }\r\n const prevKeyFrame = this.searchPrevKeyFrame(\r\n curT,\r\n selectedLayer,\r\n frameArray\r\n );\r\n const nextKeyFrame = this.searchNextKeyFrame(\r\n curT,\r\n selectedLayer,\r\n frameArray\r\n );\r\n if (prevKeyFrame < 0 || nextKeyFrame < 0) {\r\n return;\r\n }\r\n const regionRoisStart = this.findLayer(\r\n selectedLayer,\r\n frameArray[prevKeyFrame]\r\n ).layer.regionRois;\r\n const regionRoisEnd = this.findLayer(\r\n selectedLayer,\r\n frameArray[nextKeyFrame]\r\n ).layer.regionRois;\r\n const figureCount = Math.min(regionRoisStart.length, regionRoisEnd.length);\r\n const isSubtype =\r\n this.props.structures[this.props.selectedLayer].isSubtype &&\r\n this.props.structures[this.props.selectedLayer].classificationSubtype;\r\n const name = isSubtype\r\n ? this.props.structures[this.props.selectedLayer].label\r\n : \"\";\r\n const color = this.props.structures[this.props.selectedLayer].color;\r\n const pointsCount = 100;\r\n for (let frame = prevKeyFrame + 1; frame < nextKeyFrame; frame++) {\r\n const frameArrayItem = this.getOrCreateFrameArrayItem(frame);\r\n const requiredLayer = this.getOrCreateRoiLayer(\r\n frameArrayItem,\r\n selectedLayer\r\n );\r\n requiredLayer.layer.regionRois = [];\r\n }\r\n for (let figureIndex = 0; figureIndex < figureCount; figureIndex++) {\r\n const figureStart = regionRoisStart[figureIndex];\r\n const figureEnd = regionRoisEnd[figureIndex];\r\n const startPointIndexA = predictStartPointIndex(\r\n figureStart.regions,\r\n pointsCount\r\n );\r\n const startPointIndexB = predictStartPointIndex(\r\n figureEnd.regions,\r\n pointsCount\r\n );\r\n const figAIsClockwise = traversalPolylineClockwise(figureStart.regions);\r\n const figBIsClockwise = traversalPolylineClockwise(figureEnd.regions);\r\n for (let frame = prevKeyFrame + 1; frame < nextKeyFrame; frame++) {\r\n const interpolatedFigure = getFigure(\r\n figureStart.regions,\r\n figureEnd.regions,\r\n startPointIndexA,\r\n startPointIndexB,\r\n figAIsClockwise,\r\n figBIsClockwise,\r\n pointsCount,\r\n prevKeyFrame,\r\n nextKeyFrame,\r\n frame\r\n );\r\n const frameArrayItem = this.getOrCreateFrameArrayItem(frame);\r\n const requiredLayer = this.getOrCreateRoiLayer(\r\n frameArrayItem,\r\n selectedLayer\r\n );\r\n const regionRoi = new RegionROI({\r\n regions: interpolatedFigure,\r\n color1: color,\r\n subtype: isSubtype,\r\n name: name,\r\n structureId: this.props.structures[selectedLayer].id,\r\n });\r\n\r\n requiredLayer.layer.regionRois.push(regionRoi);\r\n }\r\n }\r\n this.forceUpdate();\r\n };\r\n\r\n handleResizeMouseDown = (e) => {\r\n this.setState({\r\n isResizing: true,\r\n resizePos: e.pageY,\r\n });\r\n };\r\n\r\n handleResizeMouseMove = (e) => {\r\n if (!this.state.isResizing) {\r\n return;\r\n }\r\n const newResizePos = e.pageY;\r\n const deltaY = this.state.resizePos - newResizePos;\r\n this.setState({\r\n resizePos: newResizePos,\r\n });\r\n this.props.resizeTimeLine(deltaY, false);\r\n };\r\n\r\n handleResizeMouseUp = (e) => {\r\n if (!this.state.isResizing) {\r\n return;\r\n }\r\n const newResizePos = e.pageY;\r\n const deltaY = this.state.resizePos - newResizePos;\r\n this.setState({\r\n resizePos: newResizePos,\r\n isResizing: false,\r\n });\r\n this.props.resizeTimeLine(deltaY, true);\r\n };\r\n\r\n renderContent() {\r\n const { dimensions } = this.state;\r\n const {\r\n //classes, // will be added by withStyles func\r\n // ome.sizeT --- count of frames in the videosequence\r\n ome,\r\n // time --- current frame\r\n time,\r\n structures,\r\n frameArray,\r\n } = this.props;\r\n let frameWidth = dimensions.width / ome.sizeT;\r\n let innerWidth = \"100%\";\r\n if (frameWidth < frameMinWidth) {\r\n frameWidth = frameMinWidth; // width of one frame in TimeLineTool\r\n innerWidth = frameMinWidth * ome.sizeT + \"px\";\r\n }\r\n\r\n if (frameWidth > frameMaxWidth) {\r\n frameWidth = frameMaxWidth;\r\n innerWidth = frameWidth * ome.sizeT + \"px\";\r\n }\r\n\r\n const frameSeparatorColor = \"rgb(230, 230, 230)\";\r\n const bgImage =\r\n `repeating-linear-gradient(to right, ${frameSeparatorColor}, ` +\r\n `${frameSeparatorColor} 2px, white 2px, ` +\r\n `white ${frameWidth}px)`;\r\n //console.log('structures', this.props.structures);\r\n const charts = [];\r\n if (structures && structures.length > 1) {\r\n const frameIndices = Object.keys(frameArray)\r\n .map((x) => +x)\r\n .sort((x, y) => x - y);\r\n for (\r\n let structureIndex = 1;\r\n structureIndex < structures.length;\r\n structureIndex++\r\n ) {\r\n const structure = structures[structureIndex];\r\n if (!structure.isUnfolded) {\r\n continue;\r\n }\r\n const keyFrames = {};\r\n let prevKeyFrame = -1;\r\n const interpolatedIntervals = [];\r\n if (frameArray) {\r\n for (let frameIndex of frameIndices) {\r\n if (frameArray[frameIndex]) {\r\n const frameInfo = frameArray[frameIndex];\r\n const roiLayer = frameInfo.find(\r\n (roiLayer) => roiLayer.id === structure.id\r\n );\r\n if (\r\n roiLayer &&\r\n /* roiLayer.layer && roiLayer.layer.regionRois\r\n && roiLayer.layer.regionRois.length > 0 && */ roiLayer.isKeyFrame\r\n ) {\r\n if (prevKeyFrame > -1 && frameIndex - prevKeyFrame !== 1) {\r\n const frameInfo = frameArray[prevKeyFrame + 1];\r\n if (frameInfo) {\r\n const roiLayer = frameInfo.find(\r\n (roiLayer) => roiLayer.id === structure.id\r\n );\r\n if (\r\n roiLayer &&\r\n roiLayer.layer &&\r\n roiLayer.layer.regionRois &&\r\n roiLayer.layer.regionRois.length > 0\r\n ) {\r\n interpolatedIntervals.push([prevKeyFrame, frameIndex]);\r\n }\r\n }\r\n }\r\n keyFrames[frameIndex] = true;\r\n prevKeyFrame = frameIndex;\r\n }\r\n }\r\n }\r\n }\r\n charts.push(\r\n \r\n );\r\n }\r\n }\r\n\r\n const addLength = charts.length * 50 + this.container.offsetHeight;\r\n\r\n //Fragment is used to return multiple elements on the highest hierarchy level\r\n return (\r\n (this.innerContainer = el)}\r\n >\r\n {charts}\r\n\r\n \r\n \r\n );\r\n }\r\n\r\n render() {\r\n const { dimensions } = this.state;\r\n const {\r\n classes,\r\n time,\r\n onStep,\r\n ome,\r\n onPlayPause,\r\n playing,\r\n playDirection,\r\n onChangeSr,\r\n sr,\r\n } = this.props;\r\n\r\n return (\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n \r\n \r\n onChangeSr(\r\n Math.max(1, Math.min(1500, parseInt(e.target.value, 10)))\r\n )\r\n }\r\n />\r\n \r\n
    \r\n
    \r\n onStep(-1)}\r\n disabled={time <= 0}\r\n size=\"large\"\r\n >\r\n \r\n \r\n
    \r\n {Math.floor(time) + 1}/{ome.sizeT}\r\n
    \r\n
    \r\n \r\n playDirection < 0\r\n ? onPlayPause(!playing, -1)\r\n : onPlayPause(true, -1)\r\n }\r\n size=\"large\"\r\n >\r\n {playing && playDirection < 0 ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n playDirection > 0\r\n ? onPlayPause(!playing, 1)\r\n : onPlayPause(true, 1)\r\n }\r\n size=\"large\"\r\n >\r\n {playing && playDirection > 0 ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n
    \r\n onStep(1)}\r\n disabled={time >= ome.sizeT - 1}\r\n size=\"large\"\r\n >\r\n \r\n \r\n
    \r\n
    (this.container = el)}>\r\n {dimensions && this.renderContent()}\r\n
    \r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nTimeLineTool.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n ome: PropTypes.object,\r\n playing: PropTypes.bool,\r\n time: PropTypes.number,\r\n onPlayPause: PropTypes.func,\r\n onSeek: PropTypes.func,\r\n playDirection: PropTypes.number,\r\n onChangeSr: PropTypes.func,\r\n onChangeT: PropTypes.func,\r\n sr: PropTypes.number,\r\n onStep: PropTypes.func,\r\n structures: PropTypes.array,\r\n frameArray: PropTypes.object,\r\n selectedLayer: PropTypes.number,\r\n resizeTimeLine: PropTypes.func,\r\n timeLineHeight: PropTypes.number,\r\n};\r\n\r\n// withStyles is used to apply defined styles to TimeLineTool via passed classes\r\nexport default withStyles(styles)(TimeLineTool);\r\n","// Copyright HS Analysis GmbH, 2019\r\n// Author: Sebastian Murgul, Viktor Eberhardt\r\n\r\n// Framework imports\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// Mui imports\r\nimport CircularProgress from \"@mui/material/CircularProgress\";\r\nimport Fade from \"@mui/material/Fade\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport KeyboardArrowLeftIcon from \"@mui/icons-material/KeyboardArrowLeft\";\r\nimport KeyboardArrowRightIcon from \"@mui/icons-material/KeyboardArrowRight\";\r\nimport LinearProgress from \"@mui/material/LinearProgress\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport Popper from \"@mui/material/Popper\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport ViewQuilt from \"@mui/icons-material/ViewQuilt\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\n// External imports\r\nimport h337 from \"heatmapjs\";\r\nimport { Resizable } from \"react-resizable\";\r\nimport \"react-resizable/css/styles.css\";\r\n\r\n// HSA Imports\r\nimport { trackTransforms, getBaseLog } from \"../utils/CanvasUtil\";\r\nimport {\r\n configureImage,\r\n colorInImage,\r\n tileRegistration,\r\n calculateTransformationMatrix,\r\n} from \"../utils/RendererUtils\";\r\nimport { debounce } from \"../../common/utils/Utils\";\r\nimport { getParentIndexLayer, getParentIndex } from \"../utils/StructuresUtils\";\r\nimport { RectROI, RegionROI } from \"../utils/ROI\";\r\nimport { Tools } from \"./VerticalToolBar\";\r\nimport { withPersistentStorage } from \"../contexts/PersistentStorageContext\";\r\nimport { withResultTab } from \"../contexts/ResultTabContext\";\r\nimport { withSpinloader } from \"../../common/components/Spinloader\";\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport ImageInfo from \"./ImageInfo\";\r\nimport MiniMap from \"./MiniMap\";\r\nimport RBush from \"rbush\";\r\nimport ResultTable from \"./ResultTable\";\r\nimport ScaleBar from \"./ScaleBar\";\r\nimport TimeLineTool from \"./TimeLineTool\";\r\nimport ToggleButton from \"./ToggleButton\";\r\nimport ZoomBar from \"./ZoomBar\";\r\nimport ZStackBar from \"./ZStackBar\";\r\n\r\n// debug flags\r\nconst FPS = false;\r\n\r\nconst styles = {\r\n canvas: {\r\n position: \"relative\",\r\n display: \"block\",\r\n width: \"100%\",\r\n backgroundColor: \"#D3D3D3\",\r\n },\r\n\r\n root: {\r\n height: \"100%\",\r\n },\r\n\r\n heatmapContainer: {\r\n pointerEvents: \"none\",\r\n position: \"absolute !important\",\r\n zIndex: \"9998\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n },\r\n\r\n toolbarButtonRoot: {\r\n color: \"#666\",\r\n position: \"absolute\",\r\n top: 5,\r\n right: 75,\r\n zIndex: 100,\r\n },\r\n toolbarButtonRootSingle: {\r\n color: \"#666\",\r\n position: \"absolute\",\r\n top: 5,\r\n right: 5,\r\n zIndex: 100,\r\n },\r\n toolbarButton: {\r\n position: \"relative\",\r\n display: \"inline-block\",\r\n\r\n width: 40,\r\n height: 40,\r\n padding: 8,\r\n margin: 0,\r\n },\r\n toolbarButtonIcon: {\r\n verticalAlign: \"-4px\",\r\n },\r\n toolbarButtonChecked: {\r\n width: 40,\r\n color: \"#0673C1\",\r\n },\r\n progress: {\r\n position: \"absolute\",\r\n margin: -20,\r\n left: \"50%\",\r\n top: \"50%\",\r\n zIndex: 1000,\r\n },\r\n fps: {\r\n position: \"absolute\",\r\n right: 50,\r\n top: 50,\r\n color: \"white\",\r\n fontSize: 20,\r\n pointerEvents: \"none\",\r\n },\r\n resizableContainer: {\r\n \"& .react-resizable-handle\": {\r\n pointerEvents: \"all\",\r\n },\r\n \"& .react-resizable-handle-se::before\": {\r\n content: \"''\",\r\n display: \"block\",\r\n position: \"absolute\",\r\n bottom: 3,\r\n right: 3,\r\n width: 6,\r\n height: 6,\r\n borderBottom: \"1px solid #0673c1\",\r\n borderRight: \"1px solid #0673c1\",\r\n },\r\n },\r\n fileNavLeftBtn: {\r\n position: \"absolute\",\r\n left: 5,\r\n top: \"50%\",\r\n marginTop: \"-40px\",\r\n \"& svg\": {\r\n fontSize: \"80px\",\r\n },\r\n },\r\n fileNavRightBtn: {\r\n position: \"absolute\",\r\n right: 5,\r\n top: \"50%\",\r\n marginTop: \"-40px\",\r\n \"& svg\": {\r\n fontSize: \"80px\",\r\n },\r\n },\r\n};\r\n\r\nconst colors = [\r\n \"#5470c6\",\r\n \"#91cc75\",\r\n \"#fac858\",\r\n \"#ee6666\",\r\n \"#73c0de\",\r\n \"#3ba272\",\r\n \"#fc8452\",\r\n \"#9a60b4\",\r\n \"#ea7ccc\",\r\n];\r\n\r\nNumber.prototype.toBase = function (base) {\r\n var symbols =\r\n \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\".split(\"\");\r\n var decimal = this;\r\n var conversion = \"\";\r\n\r\n if (base > symbols.length || base <= 1) {\r\n return false;\r\n }\r\n\r\n while (decimal >= 1) {\r\n conversion =\r\n symbols[decimal - base * Math.floor(decimal / base)] + conversion;\r\n decimal = Math.floor(decimal / base);\r\n }\r\n\r\n return base < 11 ? parseInt(conversion) : conversion;\r\n};\r\n\r\nclass Renderer extends Component {\r\n _isMounted = false;\r\n\r\n constructor(props) {\r\n super(props);\r\n // transmit context to componentRef\r\n if (props.componentRef) props.componentRef(this);\r\n\r\n this.state = {\r\n previewWidth: 100,\r\n previewHeight: 100,\r\n dragStart: null,\r\n ome: props.ome,\r\n initialized: false,\r\n initializedZ: false,\r\n initialScale: 1,\r\n tMin: 0,\r\n tMax: 0,\r\n t: 0,\r\n z: Math.floor(props.ome.sizeZ / 2),\r\n minZ: 0,\r\n maxZ: props.ome.sizeZ - 1,\r\n fps: 0,\r\n // time playback\r\n sr: 60,\r\n // z playback\r\n zsr: 60,\r\n bufferSize: 100,\r\n playing: false,\r\n playingZ: false,\r\n playDirection: 1,\r\n playDirectionZ: 1,\r\n miniMapKey: 0,\r\n // tools\r\n rois: [],\r\n selectedROI: null,\r\n limitVisibleRegions: false,\r\n layerTrees: [],\r\n previewRectChanged: false,\r\n isBrightfield:\r\n props.ome &&\r\n props.ome.channels.length === 1 &&\r\n props.ome.channels[0].type === \"brightfield\",\r\n scaleBarData: null,\r\n startY: 0,\r\n showMiniMap: true,\r\n showObjectIdx: false,\r\n miniMapReady: false,\r\n open: false,\r\n anchorEl: null,\r\n displayTimeBar: false,\r\n displayZStackBar: false,\r\n showScaleBar: true,\r\n showTimeBar: false,\r\n showZStackBar: false,\r\n showImageInfo: true,\r\n showZoomBar: true,\r\n showResultTable: false,\r\n showFileNavButtons: false,\r\n hideMiniMap: false,\r\n };\r\n this.isDrawing = false;\r\n this.updateCounter = 0;\r\n this.visibleRegionsLimit = 3000;\r\n this.visibleRegionsRadius = 1000;\r\n this.structureRegionLimits = [];\r\n this.slowestStructureIdx = -1;\r\n this.fastestStructureIdx = -1;\r\n this.fileIdStateData = {};\r\n\r\n this.initFrameArray();\r\n this.updateExistingStructures();\r\n\r\n this.lineIdx = 0;\r\n this.keepRendering = true;\r\n\r\n this.lastMoveTime = performance.now();\r\n\r\n this.selROI = null;\r\n window.setNewSelRoi = this.setNewSelRoi;\r\n window.getMousePositionInImage = this.getMousePositionInImage;\r\n window.setZoomLevelForGridSize = this.setZoomLevelForGridSize;\r\n\r\n // frontend cached alpha channel images\r\n this.visibleImage = [];\r\n // frontend cached colored images\r\n this.coloredImages = [];\r\n\r\n this.hMat = [];\r\n this.imgRegistered = true;\r\n this.callbackCounter = 0;\r\n\r\n this.oldVisibleRegionCount = 0;\r\n\r\n this.gridTileCount = 0;\r\n\r\n // fps history to smooth fps counter update\r\n this.lastFps = Array.from(Array(10), () => 60);\r\n\r\n this.createBackgroundPattern();\r\n this.tempLayer = null;\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n createBackgroundPattern = () => {\r\n this.backgroundPattern = document.createElement(\"canvas\");\r\n const patternContext = this.backgroundPattern.getContext(\"2d\");\r\n\r\n // Give the pattern a width and height of 50\r\n const w = 30;\r\n const h = 30;\r\n this.backgroundPattern.width = w;\r\n this.backgroundPattern.height = h;\r\n\r\n // Give the pattern a background color and draw an arc\r\n patternContext.fillStyle = \"transparent\";\r\n patternContext.strokeStyle = \"#999\";\r\n patternContext.fillRect(0, 0, w, h);\r\n patternContext.lineWidth = 1;\r\n patternContext.moveTo(-w / 2, h);\r\n patternContext.lineTo(w, -h / 2);\r\n patternContext.moveTo(0, h + h / 2);\r\n patternContext.lineTo(w + w / 2, 0);\r\n patternContext.stroke();\r\n };\r\n\r\n componentDidMount = () => {\r\n this._isMounted = true;\r\n let stateObject = {};\r\n this.canvas = document.getElementById(this.props.canvasId);\r\n this.props.resultTab.setRendererCanvas(this.canvas);\r\n // get drawing context from canvas\r\n this.ctx = this.canvas.getContext(\"2d\");\r\n this.props.resultTab.setRendererCtx(this.ctx);\r\n\r\n // bind mouse wheel events\r\n this.canvas.addEventListener(\"DOMMouseScroll\", this.mousewheel, true);\r\n this.canvas.addEventListener(\"mousewheel\", this.mousewheel, {\r\n passive: false,\r\n });\r\n // bind mouse events\r\n window.addEventListener(\"mouseup\", this.mouseup, { passive: true });\r\n window.addEventListener(\"mousemove\", this.mousemove, { passive: true });\r\n\r\n this.heatmap = h337.create({\r\n container: document.getElementById(\"heatmapDiv\"),\r\n gradient: {\r\n \".25\": \"#0000ff\",\r\n \".5\": \"#00ff00\",\r\n \".75\": \"#ffff00\",\r\n \".99\": \"#ff0000\",\r\n },\r\n maxOpacity: 0.8,\r\n minOpacity: 0,\r\n blur: 0.99,\r\n });\r\n\r\n // extend context with some fancy additional transformation methods\r\n trackTransforms(this.ctx);\r\n\r\n // converts the relative size css information into an absolute size which we can access\r\n this.canvas.width = this.canvas.offsetWidth;\r\n this.canvas.height = this.canvas.offsetHeight;\r\n\r\n // initialize position\r\n stateObject.lastX = this.canvas.width / 2;\r\n stateObject.lastY = this.canvas.height / 2;\r\n\r\n this.t0 = performance.now();\r\n\r\n let loadObject = [\r\n \"hideMiniMap\",\r\n \"showObjectIdx\",\r\n \"showMiniMap\",\r\n \"showScaleBar\",\r\n \"showTimeBar\",\r\n \"showZStackBar\",\r\n \"showImageInfo\",\r\n \"showZoomBar\",\r\n \"showResultTable\",\r\n \"showFileNavButtons\",\r\n ];\r\n\r\n let i = null;\r\n if (this.props.showFullscreen) {\r\n loadObject.forEach((element) => {\r\n i = this.props.persistentStorage.load(element + \"Full\");\r\n if (i === true || i === false) stateObject[element] = i;\r\n });\r\n } else {\r\n loadObject.forEach((element) => {\r\n i = this.props.persistentStorage.load(element);\r\n if (i === true || i === false) stateObject[element] = i;\r\n });\r\n }\r\n\r\n stateObject[\"displayTimeBar\"] = this.props.displayTimeBar;\r\n stateObject[\"displayZStackBar\"] = this.props.displayZStackBar;\r\n stateObject[\"showZStackBar\"] = this.props.showZStackBar;\r\n stateObject[\"showTimeBar\"] = this.props.showTimeBar;\r\n\r\n this.setMountedState(stateObject, () => {\r\n this.checkMiniMapVisivility();\r\n });\r\n //set mouse postition to center of canvas\r\n this.mousePos = this.getMousePositionInImage();\r\n this.draw();\r\n };\r\n\r\n loadFrameArray(frameIndex) {\r\n this.applyFrameArray(frameIndex);\r\n }\r\n\r\n initFrameArray() {\r\n const ome = this.state.ome;\r\n const frameIndex = this.state.t * ome.sizeZ + this.state.z;\r\n this.loadFrameArray(frameIndex);\r\n }\r\n\r\n // looks for annotations to visible frame excluding base roi\r\n applyFrameArray(frameIndex) {\r\n const roiLayers = this.props.roiLayers;\r\n if (Object.keys(this.props.frameArrayDict[this.props.fileId]).length === 0)\r\n return;\r\n\r\n for (let idx = 1; idx < this.props.structures.length; idx++) {\r\n const structure = this.props.structures[idx];\r\n let newRoiLayer;\r\n newRoiLayer = this.findRoiLayer(\r\n this.props.frameArrayDict[this.props.fileId][frameIndex],\r\n structure\r\n );\r\n roiLayers[idx] = newRoiLayer;\r\n }\r\n }\r\n\r\n storeRoiLayersToFrameArray(frameIndex) {\r\n let updatedFrameArrayFrame = [];\r\n for (let structure of this.props.structures) {\r\n if (structure.id === 1) {\r\n continue;\r\n }\r\n updatedFrameArrayFrame.push(\r\n this.findRoiLayer(this.props.roiLayers, structure)\r\n );\r\n }\r\n this.props.frameArrayDict[this.props.fileId][frameIndex] =\r\n updatedFrameArrayFrame;\r\n }\r\n\r\n findRoiLayer(roiLayers, structure) {\r\n const roiLayer = roiLayers\r\n ? roiLayers.find((x) => structure.id === x.id)\r\n : roiLayers;\r\n if (roiLayer === undefined) {\r\n return this.getClearedRoiLayer(structure.id);\r\n }\r\n return roiLayer;\r\n }\r\n\r\n flipRoiLayers(prevState) {\r\n const prevT = Math.floor(prevState.t);\r\n const prevZ = Math.floor(prevState.z);\r\n const curT = Math.floor(this.state.t);\r\n const curZ = Math.floor(this.state.z);\r\n const prevFrameIndex = prevT * this.state.ome.sizeZ + prevZ;\r\n const frameIndex = curT * this.state.ome.sizeZ + curZ;\r\n\r\n this.storeRoiLayersToFrameArray(prevFrameIndex);\r\n this.applyFrameArray(frameIndex);\r\n this.storeRoiLayersToFrameArray(frameIndex);\r\n }\r\n\r\n updateFrameArray() {\r\n const curT = Math.floor(this.state.t);\r\n const curZ = Math.floor(this.state.z);\r\n const frameIndex = curT * this.state.ome.sizeZ + curZ;\r\n this.storeRoiLayersToFrameArray(frameIndex);\r\n const structure = this.props.structures[this.props.selectedLayer];\r\n if (!structure) {\r\n return;\r\n }\r\n const roiLayer = this.findRoiLayer(this.props.roiLayers, structure);\r\n roiLayer.isKeyFrame = roiLayer.layer.regionRois.length > 0;\r\n }\r\n\r\n getClearedRoiLayer(id) {\r\n return {\r\n id: id,\r\n layer: {\r\n inverted: false,\r\n regionRois: [],\r\n },\r\n tree: new RBush(),\r\n };\r\n }\r\n\r\n /**\r\n * Clear roiLayers except base roi\r\n */\r\n clearRoiLayers() {\r\n for (let i = 1; i < this.props.roiLayers.length; i++) {\r\n this.props.roiLayers[i] = this.getClearedRoiLayer(\r\n this.props.roiLayers[i].id\r\n );\r\n }\r\n }\r\n\r\n removeLayersFromFrameArray(removedStructures) {\r\n for (let structureId of removedStructures) {\r\n for (let frameIndex in this.props.frameArrayDict[this.props.fileId]) {\r\n const roiLayers =\r\n this.props.frameArrayDict[this.props.fileId][frameIndex];\r\n for (let i = roiLayers.length - 1; i >= 0; i--) {\r\n if (roiLayers[i].id === structureId) {\r\n roiLayers.splice(i, 1);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n updateExistingStructures() {\r\n this.existingStructures = {};\r\n for (let structure of this.props.structures) {\r\n this.existingStructures[structure.id] = true;\r\n }\r\n }\r\n\r\n getRemovedStructures() {\r\n const removedStructures = [];\r\n for (let layerId in this.existingStructures) {\r\n if (!this.props.structures.find((x) => x.id === layerId)) {\r\n removedStructures.push(layerId);\r\n }\r\n }\r\n return removedStructures;\r\n }\r\n\r\n componentDidUpdate(prevProps, prevState) {\r\n const oldFileId = prevProps.fileId;\r\n const newFileId = this.props.fileId;\r\n const oldFrameIndex = prevState.t * prevState.ome.sizeZ + prevState.z;\r\n //const newFrameIndex = this.state.t * this.state.ome.sizeZ + this.state.z;\r\n const prevT = Math.floor(prevState.t);\r\n const prevZ = Math.floor(prevState.z);\r\n const curT = Math.floor(this.state.t);\r\n const curZ = Math.floor(this.state.z);\r\n\r\n const removedStructures = this.getRemovedStructures();\r\n this.removeLayersFromFrameArray(removedStructures);\r\n this.updateExistingStructures();\r\n\r\n if (prevT !== curT || prevZ !== curZ) {\r\n this.flipRoiLayers(prevState);\r\n }\r\n\r\n // on file change => reset renderer cache\r\n if (oldFileId && oldFileId !== newFileId) {\r\n // TODO: [BP-35] fix this part for histo modules (fix hot fix correctly)\r\n let histoModule =\r\n this.props.project.type.includes(\"HistoClassification\") ||\r\n this.props.project.type.includes(\"HistoPointCounting\");\r\n if (\r\n !this.props.frameArrayDict[newFileId][oldFrameIndex] &&\r\n !histoModule\r\n ) {\r\n this.clearRoiLayers();\r\n } else {\r\n this.applyFrameArray(oldFrameIndex);\r\n }\r\n this.fileIdStateData[oldFileId] = prevState;\r\n\r\n if (this.fileIdStateData[newFileId]) {\r\n this.setMountedState(this.fileIdStateData[newFileId]);\r\n }\r\n\r\n setTimeout(() => this.zoomFit(), 100);\r\n this.setMountedState({\r\n miniMapKey: new Date().getTime(),\r\n });\r\n }\r\n if (\r\n prevProps.loadedAnnotationsCounter !== this.props.loadedAnnotationsCounter\r\n ) {\r\n this.initFrameArray();\r\n }\r\n\r\n let idx = this.props.structures.findIndex((s) => s.label === \"Grid\");\r\n if (this.props.roiLayers[idx]) {\r\n if (idx > -1) {\r\n this.gridTileCount = this.props.roiLayers[idx].layer.regionRois.length;\r\n } else {\r\n this.gridTileCount = 0;\r\n }\r\n }\r\n }\r\n\r\n componentWillUnmount = () => {\r\n this._isMounted = false;\r\n // unbind mouse wheel events\r\n this.canvas.removeEventListener(\"DOMMouseScroll\", this.mousewheel);\r\n this.canvas.removeEventListener(\"mousewheel\", this.mousewheel);\r\n // unbind mouse events\r\n window.removeEventListener(\"mouseup\", this.mouseup, { passive: true });\r\n window.removeEventListener(\"mousemove\", this.mousemove, { passive: true });\r\n this.keepRendering = false;\r\n };\r\n\r\n reset = () => {\r\n // resets renderer to initial state\r\n //TODO: adapt for Splitscreen, so that not all frames are reseted\r\n this.props.tiles.clearTiles();\r\n // frontend cached alpha channel images\r\n this.props.tiles.setVisibleImage([]);\r\n // frontend cached colored images\r\n this.props.tiles.setColoredImages([]);\r\n\r\n this.setMountedState({\r\n dragStart: null,\r\n playing: false,\r\n //initialized: false,\r\n });\r\n\r\n this.loadAllTiles();\r\n this.props.setChangingFile(false);\r\n //this.props.setAIObjects();\r\n };\r\n\r\n updatePreviewRect = (activeTool) => {\r\n if (this.props.tools[activeTool] && this.canvas) {\r\n let p2 = this.getPointInCanvas({\r\n x: this.canvas.offsetWidth / 2,\r\n y: this.canvas.offsetHeight / 2,\r\n });\r\n this.props.tools[activeTool].setPreviewRect(p2.x, p2.y); //set position\r\n if (typeof this.props.tools[activeTool].previewRect !== \"undefined\")\r\n this.updatePreviewRectSize({\r\n width: this.props.tools[activeTool].previewRect.w,\r\n height: this.props.tools[activeTool].previewRect.h,\r\n });\r\n }\r\n };\r\n\r\n updateObjectMode = (value) => {\r\n this.objectMode = value;\r\n };\r\n\r\n UNSAFE_componentWillReceiveProps = (nextProps) => {\r\n const { structures, selectedLayer } = this.props;\r\n // set canvas context for pen tool\r\n if (\r\n structures[selectedLayer] &&\r\n structures[selectedLayer].isSubtype &&\r\n structures[selectedLayer].classificationSubtype\r\n ) {\r\n let parentIndex = getParentIndexLayer(\r\n structures[selectedLayer],\r\n structures\r\n );\r\n if (\r\n nextProps.tools[nextProps.activeTool] &&\r\n this.props.isActive &&\r\n nextProps.roiLayers[parentIndex]\r\n ) {\r\n nextProps.tools[nextProps.activeTool].setLayer({\r\n layer: nextProps.roiLayers[parentIndex].layer,\r\n ome: nextProps.ome,\r\n fileId: nextProps.fileId,\r\n projectId: nextProps.projectId,\r\n structures: nextProps.structures,\r\n roiLayers: nextProps.roiLayers,\r\n drawLayer: nextProps.drawLayer,\r\n selectedLayer: nextProps.selectedLayer,\r\n updateProject: nextProps.updateProject,\r\n commentLayer: nextProps.commentLayer,\r\n landmarkLayer: nextProps.landmarkLayer,\r\n landmarkLayers: nextProps.landmarkLayers,\r\n allRoiLayers: nextProps.allRoiLayers,\r\n viewerConfig_project: nextProps.viewerConfig.project,\r\n project: nextProps.project,\r\n ctx: this.ctx,\r\n histogramConfig: nextProps.histogramConfig,\r\n rendererDict: nextProps.rendererDict,\r\n updateObjectMode: this.updateObjectMode,\r\n splitscreenFileIds: nextProps.splitscreenFileIds,\r\n groupPermissions: this.props.projectContext.groupPermissions,\r\n spinloader: nextProps.spinloader,\r\n });\r\n }\r\n } else {\r\n let offset = 0;\r\n if (\r\n nextProps.structures[nextProps.selectedLayer - offset] &&\r\n nextProps.tools[nextProps.activeTool] &&\r\n nextProps.roiLayers &&\r\n this.props.isActive\r\n ) {\r\n nextProps.tools[nextProps.activeTool].setLayer({\r\n layer: nextProps.roiLayers.find(\r\n (x) =>\r\n x.id === nextProps.structures[nextProps.selectedLayer - offset].id\r\n ).layer,\r\n ome: nextProps.ome,\r\n fileId: nextProps.fileId,\r\n projectId: nextProps.projectId,\r\n structures: nextProps.structures,\r\n roiLayers: nextProps.roiLayers,\r\n drawLayer: nextProps.drawLayer,\r\n selectedLayer: nextProps.selectedLayer,\r\n updateProject: nextProps.updateProject,\r\n commentLayer: nextProps.commentLayer,\r\n landmarkLayer: nextProps.landmarkLayer,\r\n landmarkLayers: nextProps.landmarkLayers,\r\n allRoiLayers: nextProps.allRoiLayers,\r\n viewerConfig_project: nextProps.viewerConfig.project,\r\n project: nextProps.project,\r\n ctx: this.ctx,\r\n histogramConfig: nextProps.histogramConfig,\r\n rendererDict: nextProps.rendererDict,\r\n updateObjectMode: this.updateObjectMode,\r\n splitscreenFileIds: nextProps.splitscreenFileIds,\r\n groupPermissions: this.props.projectContext.groupPermissions,\r\n spinloader: nextProps.spinloader,\r\n });\r\n }\r\n }\r\n\r\n // update preview rect\r\n if (!nextProps.showGallery) {\r\n if (!this.state.previewRectChanged)\r\n this.setMountedState({ previewRectChanged: true });\r\n }\r\n };\r\n\r\n getPage = (c, z, t) => {\r\n // calculate page index from coordinates\r\n return (\r\n Math.round(t) * this.props.ome.channels.length * this.props.ome.sizeZ +\r\n c * this.props.ome.sizeZ +\r\n Math.round(z)\r\n );\r\n };\r\n\r\n getPageForChannel = (c) => {\r\n // calculate page index from coordinates\r\n return (\r\n Math.round(this.state.t) *\r\n this.props.ome.channels.length *\r\n this.props.ome.sizeZ +\r\n Math.round(this.state.z) * this.props.ome.channels.length +\r\n c\r\n );\r\n };\r\n\r\n getMousePositionInImage = () => {\r\n let x = window.getMousePosition()[0];\r\n let y = window.getMousePosition()[1];\r\n this.lastX = x - this.canvas.getBoundingClientRect().left;\r\n this.lastY = y - this.canvas.getBoundingClientRect().top; //- this.canvas.offsetTop\r\n\r\n // calculate mouse position in image coordinates\r\n let p1 = this.getPointInCanvas({\r\n x: this.lastX,\r\n y: this.lastY,\r\n });\r\n let p2 = this.getPointInCanvas({ x: 0, y: 0 });\r\n let p3 = this.getPosition();\r\n\r\n p1.x += p2.x - p3.x / this.getScale();\r\n p1.y += p2.y - p3.y / this.getScale();\r\n\r\n return p1;\r\n };\r\n\r\n getPositionInImage = (position) => {\r\n // calculate corner points top left (position==0), bottom right (position==1), center (position==2)\r\n let X;\r\n let Y;\r\n if (position === 0) {\r\n // top left\r\n X = this.canvas.getBoundingClientRect().left;\r\n Y = this.canvas.getBoundingClientRect().top; //64 - this.canvas.offsetTop + 32; // 32 is half of blue header\r\n } else if (position === 1) {\r\n // bottom right\r\n X = this.canvas.getBoundingClientRect().right;\r\n Y = this.canvas.getBoundingClientRect().bottom;\r\n //- this.canvas.offsetTop + 32; // 32 is half of blue header\r\n } else {\r\n // center\r\n X =\r\n (this.canvas.getBoundingClientRect().left +\r\n this.canvas.getBoundingClientRect().right) /\r\n 2;\r\n Y =\r\n (this.canvas.getBoundingClientRect().top +\r\n this.canvas.getBoundingClientRect().bottom) /\r\n 2;\r\n //+32; // 32 is half of blue header\r\n }\r\n\r\n // calculate mouse position in image coordinates\r\n let p1 = this.getPointInCanvas({\r\n x: X - this.canvas.getBoundingClientRect().left,\r\n y: Y - this.canvas.getBoundingClientRect().top,\r\n });\r\n let p2 = this.getPointInCanvas({ x: 0, y: 0 });\r\n let p3 = this.getPosition();\r\n p1.x += p2.x - p3.x / this.getScale();\r\n p1.y += p2.y - p3.y / this.getScale();\r\n\r\n return p1;\r\n };\r\n\r\n toolMouseForward = (event) => {\r\n const parentId = this.props.structures[this.props.selectedLayer].parentId;\r\n\r\n let parentIdx = this.props.structures.findIndex(\r\n (item) => item.id === parentId\r\n );\r\n parentIdx = this.props.selectedLayer > 0 ? Math.max(0, parentIdx) : -1;\r\n let p1 = this.mousePos;\r\n p1.x = p1.x < 0 ? 0 : p1.x;\r\n p1.x = p1.x > this.vw ? this.vw : p1.x;\r\n p1.y = p1.y < 0 ? 0 : p1.y;\r\n p1.y = p1.y > this.vh ? this.vh : p1.y;\r\n const isSubtype =\r\n this.props.structures[this.props.selectedLayer].isSubtype &&\r\n this.props.structures[this.props.selectedLayer].classificationSubtype;\r\n\r\n let selection = this.props.tools[this.props.activeTool].mouse({\r\n event: event,\r\n p: p1,\r\n color: this.props.structures[this.props.selectedLayer].color,\r\n subtype: isSubtype,\r\n name: isSubtype\r\n ? this.props.structures[this.props.selectedLayer].label\r\n : \"\",\r\n positionInRoiLayer: false,\r\n fullyLoaded: false,\r\n parentIdx: parentIdx,\r\n selectedId: this.props.structures[this.props.selectedLayer].id,\r\n vw: this.vw,\r\n vh: this.vh,\r\n scale: this.getScale(),\r\n renderer: this,\r\n });\r\n return selection;\r\n };\r\n\r\n getPointInCanvasCoord = (x, y) => {\r\n let pt = {\r\n x: Math.round(x * this.ctx.getTransform().a + this.ctx.getTransform().e),\r\n y: Math.round(y * this.ctx.getTransform().d + this.ctx.getTransform().f),\r\n };\r\n return pt;\r\n };\r\n\r\n getPointInCanvas = (p) => {\r\n try {\r\n let tp = this.ctx.transformedPoint(p.x, p.y);\r\n return {\r\n x: tp.x,\r\n y: tp.y,\r\n };\r\n } catch (ex) {\r\n // Skip this frame\r\n // console.error(ex);\r\n return {\r\n x: -1,\r\n y: -1,\r\n };\r\n }\r\n };\r\n\r\n mousedown = (event) => {\r\n let p1 = this.getMousePositionInImage();\r\n this.mousePos = p1;\r\n this.props.tiles.chainLeaderId = this.props.canvasId;\r\n\r\n if (this.props.tools[this.props.activeTool] && !event.ctrlKey) {\r\n // only drawing on image is allowed\r\n if (p1.x >= 0 && p1.x <= this.vw && p1.y >= 0 && p1.y <= this.vh) {\r\n let selection = this.toolMouseForward(event);\r\n // if tool is selection then save selected roi\r\n if (\r\n this.props.tools[this.props.activeTool].name === \"Selection\" &&\r\n selection\r\n ) {\r\n this.selROI = selection;\r\n this.props.setSelectedRoi(selection);\r\n if (selection.classify) {\r\n this.classifySelectedRoi(selection, true);\r\n }\r\n }\r\n }\r\n } else if (event.button === 0 && !event.ctrlKey) {\r\n if (this.props.activeTool === Tools.RECT_ROI) {\r\n // only drawing on image is allowed\r\n if (p1.x >= 0 && p1.x <= this.vw && p1.y >= 0 && p1.y <= this.vh) {\r\n // create new rectangle in drawing mode\r\n let newROI = new RectROI(this.ctx, p1.x, p1.y, 0, 0, true);\r\n // select new rectangle for resizing\r\n this.resizeROI = newROI;\r\n\r\n // update component state\r\n this.props.onChangeROIs([...this.props.rois, newROI]);\r\n }\r\n } else {\r\n // corner radius of our rectangles\r\n for (let roi of this.props.rois) {\r\n switch (roi.handleMouseDown(p1)) {\r\n case 1: // dragging\r\n this.dragROI = roi;\r\n break;\r\n case 2: // resizing\r\n this.resizeROI = roi;\r\n this.dragROI = null;\r\n return;\r\n default:\r\n // no collision\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // start dragging if middle mouse button is down or not tool selected\r\n if (\r\n event.button === 1 ||\r\n (event.button === 0 && event.ctrlKey) ||\r\n (!this.dragROI &&\r\n !this.resizeROI &&\r\n ![\r\n Tools.MAGICWAND_ROI,\r\n Tools.REGIONGROWING_ROI,\r\n Tools.REGIONGRABCUT_ROI,\r\n Tools.PEN_ROI,\r\n Tools.RectROI,\r\n Tools.REGION_ROI,\r\n Tools.RECTANGLE_ROI,\r\n Tools.COMMENT_ROI,\r\n Tools.ELLIPSE_ROI,\r\n Tools.COPY_ROI,\r\n Tools.FILL,\r\n Tools.SELECTION_ROI,\r\n Tools.GRIDANNOTATIONTOOL,\r\n Tools.LANDMARK,\r\n Tools.STREAMVIEW,\r\n ].includes(\r\n //deactivate dragging for this tools\r\n this.props.activeTool\r\n ))\r\n ) {\r\n let dragStart = this.getPointInCanvas({ x: this.lastX, y: this.lastY });\r\n this.setMountedState({\r\n dragStart: dragStart,\r\n });\r\n if (this.props.isChained) {\r\n if (this.props.showFullscreen) {\r\n for (const value of Object.values(this.props.splitscreenFileIds)) {\r\n let fDragStart = this.props.rendererDict[\r\n \"Full\" + value\r\n ].getPointInCanvas({\r\n x: this.lastX,\r\n y: this.lastY,\r\n });\r\n this.props.rendererDict[\"Full\" + value].setState({\r\n dragStart: fDragStart,\r\n });\r\n }\r\n } else {\r\n for (const value of Object.values(this.props.chainListFileIds)) {\r\n let fDragStart = this.props.rendererDict[value].getPointInCanvas({\r\n x: this.lastX,\r\n y: this.lastY,\r\n });\r\n this.props.rendererDict[value].setState({\r\n dragStart: fDragStart,\r\n });\r\n }\r\n }\r\n }\r\n\r\n this.canvas.style.cursor = \"move\";\r\n\r\n if ((event.button === 0 || event.button === 1) && event.altKey) {\r\n this.tempChainToggle = true;\r\n\r\n if (this.props.showFullscreen) {\r\n this.props.fsChain();\r\n } else {\r\n this.props.onChangeChain(\r\n false,\r\n this.props.splitscreenIdx,\r\n this.props.fileId\r\n );\r\n }\r\n }\r\n\r\n // dont forward any event upwards\r\n event.preventDefault();\r\n return false;\r\n } else {\r\n this.isDrawing = true;\r\n }\r\n };\r\n\r\n setHeatmapData = (data, maxValue, show = true) => {\r\n this.showHeatmap = show;\r\n let heatmapData = {\r\n max: maxValue,\r\n data: data,\r\n };\r\n this.heatmap.setData(heatmapData);\r\n };\r\n\r\n mouseBusy = () => {\r\n return !this.canvas.style.cursor !== \"default\";\r\n };\r\n\r\n mousemove = (event) => {\r\n if (this.props.resultTab.getZoomLevelFixed()) {\r\n return;\r\n }\r\n let p1 = this.getMousePositionInImage();\r\n if (\r\n this.isDrawing ||\r\n this.mouseOnCanvas ||\r\n (this.props.tools[this.props.activeTool] &&\r\n this.props.tools[this.props.activeTool].preventMiddleMousePos)\r\n ) {\r\n this.mousePos = p1;\r\n } else {\r\n this.middleMousePos();\r\n }\r\n if (this.dragROI) {\r\n // handle roi dragging\r\n this.dragROI.drag(p1, this.vw, this.vh);\r\n } else if (this.resizeROI) {\r\n // resize the roi if inside the image\r\n this.resizeROI.resize(p1, this.vw, this.vh);\r\n } else if (\r\n this.state.dragStart &&\r\n this.props.tiles.chainLeaderId === this.props.canvasId\r\n ) {\r\n // handle canvas dragging\r\n let pt = this.getPointInCanvas({ x: this.lastX, y: this.lastY });\r\n // translate canvas\r\n\r\n this.ctx.translate(\r\n pt.x - this.state.dragStart.x,\r\n pt.y - this.state.dragStart.y\r\n );\r\n if (this.props.isChained) {\r\n if (this.props.showFullscreen) {\r\n for (const value of Object.values(this.props.splitscreenFileIds)) {\r\n let fPt = this.props.rendererDict[\"Full\" + value].getPointInCanvas({\r\n x: this.lastX,\r\n y: this.lastY,\r\n });\r\n this.props.rendererDict[\"Full\" + value].chainMouseDrag(\r\n fPt.x,\r\n fPt.y\r\n );\r\n }\r\n } else {\r\n for (const value of Object.values(this.props.chainListFileIds)) {\r\n let fPt = this.props.rendererDict[value].getPointInCanvas({\r\n x: this.lastX,\r\n y: this.lastY,\r\n });\r\n this.props.rendererDict[value].chainMouseDrag(fPt.x, fPt.y);\r\n }\r\n }\r\n }\r\n this.zoomMoveActionDebounced();\r\n } else if (\r\n this.props.tools[this.props.activeTool] &&\r\n this.props.activeTool !== Tools.LANDMARK\r\n ) {\r\n // only drawing on image is allowed\r\n this.toolMouseForward(event);\r\n } else if (this.props.activeTool === Tools.LANDMARK) {\r\n // handle roi drawing mode\r\n if (p1.x >= 0 && p1.x <= this.vw && p1.y >= 0 && p1.y <= this.vh) {\r\n // only show crosshair if cursor on the image\r\n this.canvas.style.cursor = \"crosshair\";\r\n } else {\r\n this.canvas.style.cursor = \"default\";\r\n }\r\n this.toolMouseForward(event);\r\n } else if (this.props.activeTool === Tools.RECT_ROI) {\r\n // handle roi drawing mode\r\n if (p1.x >= 0 && p1.x <= this.vw && p1.y >= 0 && p1.y <= this.vh) {\r\n // only show crosshair if cursor on the image\r\n this.canvas.style.cursor = \"crosshair\";\r\n } else {\r\n this.canvas.style.cursor = \"default\";\r\n }\r\n } else {\r\n // handle hover events etc.\r\n this.canvas.style.cursor = \"default\";\r\n for (let roi of this.props.rois) {\r\n roi.handleMouseMove(p1);\r\n }\r\n }\r\n this.lastMoveTime = performance.now();\r\n\r\n // redraw screen\r\n //this.forceUpdate();\r\n };\r\n\r\n chainMouseDrag = (x, y) => {\r\n if (this.props.tiles.chainLeaderId !== this.props.canvasId) {\r\n if (this.props.isChained) {\r\n this.ctx.translate(\r\n x - this.state.dragStart.x,\r\n y - this.state.dragStart.y\r\n );\r\n }\r\n }\r\n };\r\n\r\n onCanvasMouseMove = () => {\r\n this.mouseOnCanvas = true;\r\n };\r\n\r\n onCanvasMouseLeave = () => {\r\n this.mouseOnCanvas = false;\r\n };\r\n\r\n middleMousePos = () => {\r\n let p1 = this.getPointInCanvas({ x: 0, y: 0 });\r\n let p2 = this.getPointInCanvas({\r\n x: this.canvas.width,\r\n y: this.canvas.height,\r\n });\r\n let centerX = p1.x + (p2.x - p1.x) / 2;\r\n let centerY = p1.y + (p2.y - p1.y) / 2;\r\n this.mousePos = { x: centerX, y: centerY };\r\n };\r\n\r\n mouseup = (event) => {\r\n let p1 = this.getMousePositionInImage();\r\n this.mousePos = p1;\r\n\r\n if (\r\n this.props.tools[this.props.activeTool] &&\r\n (this.isDrawing || this.props.activeTool === \"gridannotationtool\")\r\n ) {\r\n this.toolMouseForward(event);\r\n this.updateFrameArray();\r\n }\r\n\r\n // stop dragging the canvas\r\n if (this.state.dragStart) {\r\n this.setMountedState({ dragStart: null });\r\n this.canvas.style.cursor = \"default\";\r\n }\r\n\r\n // stop resizing a roi\r\n if (this.resizeROI) {\r\n this.resizeROI.handleMouseUp();\r\n this.resizeROI = null;\r\n }\r\n\r\n // stop dragging a roi\r\n if (this.dragROI) {\r\n this.dragROI.handleMouseUp();\r\n this.dragROI = null;\r\n }\r\n\r\n this.isDrawing = false;\r\n\r\n if (this.tempChainToggle) {\r\n this.tempChainToggle = false;\r\n if (this.props.showFullscreen) {\r\n this.props.fsChain();\r\n } else {\r\n this.props.onChangeChain(\r\n true,\r\n this.props.splitscreenIdx,\r\n this.props.fileId\r\n );\r\n }\r\n }\r\n\r\n if (this.state.showResultTable) {\r\n window.updateResultTable();\r\n }\r\n\r\n // update view\r\n this.forceUpdate();\r\n };\r\n\r\n onScaleOnly = (event) => {\r\n let delta = 0;\r\n\r\n if (event.wheelDelta) {\r\n /* IE/Opera. */\r\n delta = -(event.wheelDelta / 120);\r\n } else if (event.detail) {\r\n /* Mozilla */\r\n delta = event.detail / 3;\r\n }\r\n\r\n if (delta) {\r\n // zoom in (1) or out (-1)\r\n this.zoomDirection = delta < 0 ? 1 : -1;\r\n\r\n // set destination scale value\r\n let newZoom = this.getScale() * Math.pow(2, this.zoomDirection);\r\n\r\n // max zoom out value\r\n this.zoomValueOut = (0.75 * this.canvas.height) / this.vh;\r\n\r\n if ((0.75 * this.canvas.width) / this.vw < this.zoomValueOut) {\r\n this.zoomValueOut = (0.75 * this.canvas.width) / this.vw;\r\n }\r\n\r\n if (this.props.isActive === false && this.props.isChained) {\r\n this.zoomValueOut = this.props.showFullscreen\r\n ? this.props.rendererDict[\"Full\" + this.props.activeFileId]\r\n .zoomValueOut\r\n : this.props.rendererDict[this.props.activeFileId].zoomValueOut;\r\n }\r\n\r\n if (newZoom < this.zoomValueOut) {\r\n newZoom = this.zoomValueOut;\r\n }\r\n\r\n // Limit maximum zoom in value\r\n const maxZoomIn = 32;\r\n newZoom = newZoom > maxZoomIn ? maxZoomIn : newZoom;\r\n\r\n this.zoomTo = newZoom;\r\n // redraw ui\r\n this.forceUpdate();\r\n }\r\n\r\n // prevent other scroll actions\r\n if (event.preventDefault) {\r\n event.preventDefault();\r\n }\r\n event.returnValue = false;\r\n };\r\n\r\n mousewheel = (event) => {\r\n // save zoom destination point\r\n this.props.tiles.chainLeaderId = this.props.canvasId;\r\n if (\r\n this.state.initialized &&\r\n !event.ctrlKey &&\r\n !this.props.resultTab.getZoomLevelFixed()\r\n ) {\r\n this.zoomPoint = {\r\n x: this.lastX,\r\n y: this.lastY, // - this.canvas.getBoundingClientRect().top,\r\n };\r\n this.onScaleOnly(event);\r\n }\r\n\r\n if (this.props.isChained) {\r\n if (this.props.showFullscreen) {\r\n for (const value of Object.values(this.props.splitscreenFileIds)) {\r\n this.props.rendererDict[\"Full\" + value].chainMousewheel(\r\n event,\r\n this.zoomPoint\r\n );\r\n }\r\n } else {\r\n for (const value of Object.values(this.props.chainListFileIds)) {\r\n this.props.rendererDict[value].chainMousewheel(event, this.zoomPoint);\r\n }\r\n }\r\n }\r\n event.preventDefault();\r\n };\r\n\r\n chainMousewheel = (event, leaderZoomPoint) => {\r\n // save zoom destination point\r\n if (this.props.tiles.chainLeaderId !== this.props.canvasId) {\r\n if (this.props.isChained) {\r\n if (\r\n this.state.initialized &&\r\n !event.ctrlKey &&\r\n !event.shiftKey &&\r\n !this.props.resultTab.getZoomLevelFixed()\r\n ) {\r\n this.zoomPoint = leaderZoomPoint;\r\n this.onScaleOnly(event);\r\n }\r\n }\r\n event.preventDefault();\r\n } else return;\r\n };\r\n\r\n miniMapZoom = (event, x, y) => {\r\n this.props.tiles.chainLeaderId = this.props.canvasId;\r\n if (\r\n this.state.initialized &&\r\n !event.ctrlKey &&\r\n !this.props.resultTab.getZoomLevelFixed()\r\n ) {\r\n let ctx = this.miniMapRef.getCtx();\r\n let tpt = ctx.transformedPoint(x, y);\r\n let pt = {\r\n x: tpt.x * this.ctx.getTransform().a + this.ctx.getTransform().e,\r\n y: tpt.y * this.ctx.getTransform().d + this.ctx.getTransform().f,\r\n };\r\n pt.x = Math.round(pt.x);\r\n pt.y = Math.round(pt.y);\r\n if (\r\n pt.x < this.canvas.width &&\r\n pt.x > 0 &&\r\n pt.y < this.canvas.height &&\r\n pt.y > 0\r\n ) {\r\n this.zoomPoint = pt;\r\n } else {\r\n return;\r\n }\r\n this.onScaleOnly(event);\r\n }\r\n if (this.props.isChained) {\r\n let l = this.props.showFullscreen\r\n ? this.props.splitscreenFileIds\r\n : this.props.chainListFileIds;\r\n for (const value of Object.values(l)) {\r\n if (value !== this.props.fileId) {\r\n let r = this.props.showFullscreen\r\n ? this.props.rendererDict[\"Full\" + value]\r\n : this.props.rendererDict[value];\r\n let c = r.miniMapRef.getCtx();\r\n let p = c.transformedPoint(x, y);\r\n let pt = {\r\n x: p.x * r.ctx.getTransform().a + r.ctx.getTransform().e,\r\n y: p.y * r.ctx.getTransform().d + r.ctx.getTransform().f,\r\n };\r\n pt.x = Math.round(pt.x);\r\n pt.y = Math.round(pt.y);\r\n if (\r\n pt.x < r.canvas.width &&\r\n pt.x > 0 &&\r\n pt.y < r.canvas.height &&\r\n pt.y > 0\r\n ) {\r\n r.zoomPoint = pt;\r\n } else {\r\n return;\r\n }\r\n r.chainMousewheel(event, pt);\r\n }\r\n }\r\n }\r\n event.preventDefault();\r\n };\r\n\r\n // returns the current zoom scale\r\n getScale = () => {\r\n return this.ctx ? this.ctx.getTransform().a : 1;\r\n };\r\n\r\n // returns position of our image\r\n getPosition = () => {\r\n return {\r\n x: -this.ctx.getTransform().e,\r\n y: -this.ctx.getTransform().f,\r\n };\r\n };\r\n\r\n // zoom out to show the whole image\r\n zoomOut = () => {\r\n // center image first\r\n let pt = this.getPointInCanvas({\r\n x: (this.canvas.width - this.vw) / 2,\r\n y: (this.canvas.height - this.vh) / 2,\r\n });\r\n this.ctx.translate(pt.x, pt.y);\r\n // calc our transformation offset\r\n pt = this.getPointInCanvas({\r\n x: this.canvas.width / 2,\r\n y: this.canvas.height / 2,\r\n });\r\n // move to origin\r\n this.ctx.translate(pt.x, pt.y);\r\n // calc scale factor so we can fit the whole image on our screen\r\n let factor = Math.min(\r\n this.canvas.height / this.vh,\r\n this.canvas.width / this.vw\r\n );\r\n // perform scaling\r\n this.ctx.scale(factor, factor);\r\n // restore our offset\r\n this.ctx.translate(-pt.x, -pt.y);\r\n // save initial scale into our state\r\n this.setMountedState({\r\n initialized: true,\r\n initialScale: factor,\r\n });\r\n this.props.resultTab.setRendererInitialized(true);\r\n };\r\n\r\n moveTo = (e) => {\r\n // get curent position (center of screen) and transform into world coordinates\r\n let pt = this.getPointInCanvas({\r\n x: this.canvas.width / 2,\r\n y: this.canvas.height / 2,\r\n });\r\n // translate by the offset to the destination point\r\n this.ctx.translate(-(e.x - pt.x), -(e.y - pt.y));\r\n // redraw screen\r\n this.forceUpdate();\r\n this.zoomMoveAction();\r\n };\r\n\r\n chainMoveTo = (x, y) => {\r\n // get curent position (center of screen) and transform into world coordinates\r\n let pt = this.getPointInCanvas({\r\n x: this.canvas.width / 2,\r\n y: this.canvas.height / 2,\r\n });\r\n // translate by the offset to the destination point\r\n this.ctx.translate(-(x - pt.x), -(y - pt.y));\r\n // redraw screen\r\n this.forceUpdate();\r\n this.zoomMoveAction();\r\n };\r\n\r\n chainMouseMove = (x, y, e) => {\r\n if (this.props.isChained) {\r\n if (this.props.showFullscreen) {\r\n for (const value of Object.values(this.props.splitscreenFileIds)) {\r\n if (value !== this.props.fileId) {\r\n let ctx =\r\n this.props.rendererDict[\"Full\" + value].miniMapRef.getCtx();\r\n let pt = ctx.transformedPoint(x, y);\r\n this.props.rendererDict[\"Full\" + value].chainMoveTo(pt.x, pt.y, e);\r\n }\r\n }\r\n } else {\r\n for (const value of Object.values(this.props.chainListFileIds)) {\r\n if (value !== this.props.fileId) {\r\n let ctx = this.props.rendererDict[value].miniMapRef.getCtx();\r\n let pt = ctx.transformedPoint(x, y);\r\n this.props.rendererDict[value].chainMoveTo(pt.x, pt.y, e);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n hoverROI = (roi, hovered) => {\r\n // update hovered parameter of roi\r\n roi.hovered = hovered;\r\n // redraw screen\r\n this.forceUpdate();\r\n };\r\n\r\n centerROI = (roi) => {\r\n // center roi\r\n this.moveTo({ x: roi.x - roi.w / 2, y: roi.y - roi.h / 2 });\r\n };\r\n\r\n transformPoint = (x, y, m, tfact) => {\r\n m[2] *= tfact;\r\n m[5] *= tfact;\r\n let a = m[0] * x + m[1] * y + m[2];\r\n let b = m[3] * x + m[4] * y + m[5];\r\n return [a, b];\r\n };\r\n\r\n transformLandmark = (h, tfact) => {\r\n for (let roi of this.props.landmarkLayer.landmarkRois) {\r\n let p = roi.regions;\r\n roi.regions = this.transformPoint(p[0], p[1], h, tfact);\r\n }\r\n };\r\n\r\n transformLandmarkNoOffset = (h, tfact) => {\r\n let m = [];\r\n for (let roi of this.props.landmarkLayer.landmarkRois) {\r\n let p = roi.regions;\r\n m.push(this.transformPoint(p[0], p[1], h, tfact));\r\n }\r\n return m;\r\n };\r\n\r\n transformAnnotation = (h, tfact) => {\r\n for (let struct of this.props.roiLayers) {\r\n let newRegionList = [];\r\n if (struct.layer.regionRois.length > 0) {\r\n for (let roi of struct.layer.regionRois) {\r\n let newRegion = [];\r\n for (let region of roi.regions[0]) {\r\n let point = this.transformPoint(region[0], region[1], h, tfact);\r\n newRegion.push(point);\r\n }\r\n let temp = roi;\r\n temp.regions = newRegion;\r\n let newRoi = new RegionROI(temp);\r\n newRegionList.push(newRoi);\r\n }\r\n struct.tree.clear();\r\n struct.layer.regionRois = newRegionList;\r\n struct.tree.load(newRegionList.map((item) => item.treeItem));\r\n }\r\n }\r\n };\r\n\r\n generateTransformationOffset = (marks) => {\r\n let origCenter = { x: this.vw / 2, y: this.vh / 2 };\r\n\r\n let xValues = [];\r\n let yValues = [];\r\n for (let i = 0; i < marks.length; i++) {\r\n xValues.push(marks[i][0]);\r\n yValues.push(marks[i][1]);\r\n }\r\n let xMin = Math.min(...xValues);\r\n let xMax = Math.max(...xValues);\r\n let yMin = Math.min(...yValues);\r\n let yMax = Math.max(...yValues);\r\n\r\n let bbCenter = { x: xMin + (xMax - xMin) / 2, y: yMin + (yMax - yMin) / 2 };\r\n let offset = { x: origCenter.x - bbCenter.x, y: origCenter.y - bbCenter.y };\r\n return offset;\r\n // return { x: 0, y: 0 };\r\n };\r\n\r\n generateLandmarkTransformation = (\r\n pointBase,\r\n pointShift,\r\n baseId,\r\n targetId,\r\n baseOme\r\n ) => {\r\n calculateTransformationMatrix(\r\n pointBase,\r\n pointShift,\r\n this.props.ome,\r\n baseId,\r\n targetId,\r\n baseOme,\r\n (h, tfact) => {\r\n let marks = this.transformLandmarkNoOffset(h, 1);\r\n let tOffset = this.generateTransformationOffset(marks);\r\n h[2] += tOffset.x;\r\n h[5] += tOffset.y;\r\n let offset = [];\r\n offset.push(tOffset.x);\r\n offset.push(tOffset.y);\r\n this.transformLandmark(h, 1);\r\n this.transformAnnotation(h, 1);\r\n this.props.tiles.setTransformationMatnFactnOff(\r\n h,\r\n this.props.fileId,\r\n tfact,\r\n offset\r\n );\r\n this.reset();\r\n }\r\n );\r\n };\r\n\r\n pushRegTile = (tileId, colImg, channel) => {\r\n let mat = this.props.tiles.getTransformationMatrix(this.props.fileId);\r\n let fact = this.props.tiles.getTransformationFactor(this.props.fileId);\r\n if (Array.isArray(mat)) {\r\n if (mat.length > 0) {\r\n this.imgRegistered = false;\r\n this.callbackCounter += 1;\r\n if (this.state.isLoadingTiles === false) {\r\n this.setMountedState({ isLoadingTiles: true });\r\n }\r\n var t0 = performance.now();\r\n tileRegistration(colImg, tileId, mat, fact, channel, (Img) => {\r\n this.props.tiles.pushColoredImages(Img, tileId);\r\n var t1 = performance.now();\r\n console.log(\"Tile registration took \", t1 - t0, \" ms.\");\r\n if (mat.length === 0) {\r\n console.log(\"empty mat\");\r\n }\r\n this.callbackCounter -= 1;\r\n if (this.callbackCounter === 0) {\r\n this.imgRegistered = true;\r\n this.setMountedState({ isLoadingTiles: false });\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n pushColoredImage = (c, tileId, visImg) => {\r\n let channel = this.props.histogramConfig.channels[c];\r\n if (\r\n (this.props.histogramConfig.channels.length < 2 &&\r\n channel.color === \"#ffffff\") ||\r\n channel.color === -1\r\n ) {\r\n // rgb channel\r\n if (!this.props.tiles.getColoredImage(tileId)) {\r\n let colImg = configureImage(visImg, channel);\r\n this.props.tiles.pushColoredImages(colImg, tileId);\r\n this.pushRegTile(tileId, visImg, channel);\r\n }\r\n } else {\r\n // colored images cache\r\n if (!this.props.tiles.getColoredImage(tileId) && visImg.width > 0) {\r\n let colImg = colorInImage(visImg, channel);\r\n this.props.tiles.pushColoredImages(colImg, tileId);\r\n this.pushRegTile(tileId, visImg, channel);\r\n }\r\n }\r\n };\r\n\r\n loadAllTiles = () => {\r\n for (let lv = 0; lv < Math.min(2, this.props.ome.maxLevel + 1); lv++) {\r\n // calculate the number of grid columns for this level\r\n let cols = Math.pow(2, lv);\r\n for (let x = 0; x < cols; x++) {\r\n for (let y = 0; y < cols; y++) {\r\n for (let c = 0; c < this.props.ome.channels.length; c++) {\r\n let page = this.getPageForChannel(c);\r\n // load image first if missing\r\n let tileId =\r\n page + \",\" + lv + \",\" + x + \",\" + y + \",\" + this.props.fileId;\r\n if (!this.props.tiles.getVisibleImage(tileId)) {\r\n let visImg = new Image();\r\n visImg.src = Backend.renderRegion({\r\n id: this.props.fileId,\r\n page: page,\r\n lv: lv,\r\n x: x,\r\n y: y,\r\n });\r\n visImg.onload = () => {\r\n this.pushColoredImage(c, tileId, visImg);\r\n this.props.tiles.pushVisibleImage(visImg, tileId);\r\n // set context width and height\r\n this.props.tiles.setImgWidth(visImg.width);\r\n this.props.tiles.setImgHeight(visImg.height);\r\n };\r\n } else if (this.props.tiles.getVisibleImage(tileId).complete) {\r\n // set context width and height\r\n let img = this.props.tiles.getVisibleImage(tileId);\r\n this.props.tiles.setImgWidth(img.width);\r\n this.props.tiles.setImgHeight(img.height);\r\n this.pushColoredImage(\r\n c,\r\n tileId,\r\n this.props.tiles.getVisibleImage(tileId)\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.preloadNextFrames();\r\n\r\n this.props.changeHiConfig(true);\r\n this.props.tiles.setHistogramConfig(this.props.histogramConfig);\r\n };\r\n\r\n preloadNextFrames = () => {\r\n if (this.state.playDirection > 0) {\r\n for (\r\n let t = this.state.t;\r\n t <\r\n Math.min(\r\n this.props.ome.sizeT - 1,\r\n this.state.t + this.state.bufferSize\r\n );\r\n t++\r\n ) {\r\n this.preloadFrame(this.state.z, t);\r\n }\r\n } else {\r\n for (\r\n let t = this.state.t;\r\n t >= Math.max(0, this.state.t - this.state.bufferSize);\r\n t--\r\n ) {\r\n this.preloadFrame(this.state.z, t);\r\n }\r\n }\r\n };\r\n\r\n preloadNextZFrames = () => {\r\n if (this.state.playDirectionZ > 0) {\r\n for (\r\n let z = this.state.z;\r\n z <\r\n Math.min(\r\n this.props.ome.sizeZ - 1,\r\n this.state.z + this.state.bufferSize\r\n );\r\n z++\r\n ) {\r\n this.preloadFrame(z, this.state.t);\r\n }\r\n } else {\r\n for (\r\n let z = this.state.z;\r\n z >= Math.max(0, this.state.z - this.state.bufferSize);\r\n z--\r\n ) {\r\n this.preloadFrame(z, this.state.t);\r\n }\r\n }\r\n };\r\n\r\n preloadFrame = (z, t) => {\r\n for (let lv = 0; lv < 1; lv++) {\r\n // calculate the number of grid columns for this level\r\n let cols = Math.pow(2, lv);\r\n for (let x = 0; x < cols; x++) {\r\n for (let y = 0; y < cols; y++) {\r\n for (let c = 0; c < this.props.ome.channels.length; c++) {\r\n let page = this.getPage(c, z, t);\r\n // load image first if missing\r\n let tileId =\r\n page + \",\" + lv + \",\" + x + \",\" + y + \",\" + this.props.fileId;\r\n if (!this.props.tiles.getVisibleImage(tileId)) {\r\n let visImg = new Image();\r\n visImg.src = Backend.renderRegion({\r\n id: this.props.fileId,\r\n page: page,\r\n lv: lv,\r\n x: x,\r\n y: y,\r\n });\r\n visImg.onload = () => {\r\n this.pushColoredImage(c, tileId, visImg);\r\n };\r\n } else if (this.props.tiles.getVisibleImage(tileId).complete) {\r\n this.pushColoredImage(\r\n c,\r\n tileId,\r\n this.props.tiles.getVisibleImage(tileId)\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n zoomToFactor = (factor) => {\r\n let scaleTarget = this.state.initialScale * factor;\r\n this.zoomTo = scaleTarget;\r\n this.zoomPoint = { x: this.canvas.width / 2, y: this.canvas.height / 2 };\r\n this.zoomDirection =\r\n this.getScale() < scaleTarget ? scaleTarget : -scaleTarget;\r\n\r\n setTimeout(() => this.forceUpdate(), 10);\r\n };\r\n\r\n zoomOriginal = () => {\r\n // no zooming enabled\r\n if (\r\n this.props.resultTab.getZoomLevelFixed() &&\r\n this.props.resultTabActive()\r\n ) {\r\n return;\r\n }\r\n\r\n this.zoomOneToN(1);\r\n };\r\n\r\n zoomOneToN = (x) => {\r\n // no zooming enabled\r\n if (\r\n this.props.resultTab.getZoomLevelFixed() &&\r\n this.props.resultTabActive()\r\n ) {\r\n return;\r\n }\r\n\r\n this.zoomTo = x;\r\n this.zoomPoint = { x: this.canvas.width / 2, y: this.canvas.height / 2 };\r\n this.zoomDirection = this.getScale() < x ? 1 : -1;\r\n\r\n setTimeout(() => this.forceUpdate(), 10);\r\n };\r\n\r\n zoomDelta = (delta) => {\r\n // no zooming enabled\r\n if (\r\n this.props.resultTab.getZoomLevelFixed() &&\r\n this.props.resultTabActive()\r\n ) {\r\n return;\r\n }\r\n\r\n // zoom middle\r\n this.zoomPoint = { x: this.canvas.width / 2, y: this.canvas.height / 2 };\r\n // zoom in (1) or out (-1)\r\n this.zoomDirection = delta < 0 ? 1 : -1;\r\n\r\n // set destination scale value\r\n let newZoom = this.getScale() * Math.pow(1.2, this.zoomDirection);\r\n\r\n // max zoom out value\r\n if (newZoom < (0.75 * this.canvas.height) / this.vh) {\r\n newZoom = (0.75 * this.canvas.height) / this.vh;\r\n }\r\n\r\n // max zoom in value\r\n if (newZoom > (2 * this.vh) / this.canvas.height) {\r\n newZoom = (2 * this.vh) / this.canvas.height;\r\n }\r\n\r\n this.zoomTo = newZoom;\r\n\r\n // redraw ui\r\n this.forceUpdate();\r\n };\r\n\r\n zoomFit = () => {\r\n // no zooming enabled\r\n if (\r\n this.props.resultTab.getZoomLevelFixed() &&\r\n this.props.resultTabActive()\r\n ) {\r\n return;\r\n }\r\n\r\n this.canvasTranform(1, 0, 0, 1, 0, 0);\r\n this.zoomOut();\r\n this.zoomMoveActionDebounced(); //to save zoomObject\r\n };\r\n\r\n /**\r\n * Performs a context.setTransform, whilst ensuring that the pixel\r\n * representation is according to zoomlevel\r\n * @param {*} a Horizontal scaling. A value of 1 results in no scaling.\r\n * @param {*} b Vertical skewing.\r\n * @param {*} c Horizontal skewing.\r\n * @param {*} d Vertical scaling. A value of 1 results in no scaling.\r\n * @param {*} e Horizontal translation (moving).\r\n * @param {*} f Vertical translation (moving).\r\n */\r\n canvasTranform = (a, b, c, d, e, f) => {\r\n // disable smoothing to see pixels of image\r\n if (this.getScale() > 5) {\r\n this.ctx.imageSmoothingEnabled = false;\r\n } else {\r\n this.ctx.imageSmoothingEnabled = true;\r\n }\r\n // console.debug(this.getScale());\r\n // Actual transformation\r\n this.ctx.setTransform(a, b, c, d, e, f);\r\n };\r\n\r\n centerRoi = (rect) => {\r\n const { roiLayers, selectedLayer, project } = this.props;\r\n // make roi/rect in center of screen\r\n if (this.state.initialized) {\r\n // if change file in histo classification or point counting module\r\n if (!rect) {\r\n let selRoi = this.props.resultTab.getSelectedRoi();\r\n rect = roiLayers[selectedLayer].layer.regionRois[selRoi].bounds;\r\n let toolName = \"none\";\r\n if (project.type.includes(\"HistoClassification\")) {\r\n toolName = \"selectiontile\";\r\n } else if (project.type.includes(\"HistoPointCounting\")) {\r\n toolName = \"pointcountingtile\";\r\n }\r\n this.props.onChangeTool(toolName);\r\n\r\n let roiItem = {\r\n maxX: roiLayers[selectedLayer].layer.regionRois[selRoi].bounds.left,\r\n maxY: roiLayers[selectedLayer].layer.regionRois[selRoi].bounds.top,\r\n minX: roiLayers[selectedLayer].layer.regionRois[selRoi].bounds.right,\r\n minY: roiLayers[selectedLayer].layer.regionRois[selRoi].bounds.bottom,\r\n roi: roiLayers[selectedLayer].layer.regionRois[selRoi],\r\n };\r\n\r\n this.props.tools[toolName].setNextTile(roiItem);\r\n\r\n // zoom to corresponding zoom level\r\n if (\r\n project.type.includes(\"HistoClassification\") ||\r\n project.type.includes(\"HistoPointCounting\")\r\n ) {\r\n let gridSize = Math.sqrt(\r\n roiLayers[selectedLayer].layer.regionRois.length\r\n );\r\n this.setZoomLevelForGridSize(gridSize);\r\n }\r\n }\r\n\r\n let xKoord = (rect.left + rect.right) / 2; // x- and y-coordinate for zoomPoint\r\n let yKoord = (rect.top + rect.bottom) / 2;\r\n let pt1 = { x: xKoord, y: yKoord };\r\n\r\n // make roi in center of screen:\r\n let pt2 = pt1;\r\n this.ctx.translate(\r\n this.getPositionInImage(2).x - pt2.x,\r\n this.getPositionInImage(2).y - pt2.y\r\n );\r\n } else {\r\n setTimeout(() => this.centerRoi(rect), 400);\r\n }\r\n this.zoomMoveActionDebounced();\r\n };\r\n\r\n zoomInRoi = () => {\r\n // make roi in center of screen\r\n if (this.props.zoomROI && this.state.initialized) {\r\n let xKoord = (this.props.zoomLeft + this.props.zoomRight) / 2; // x- and y-coordinate for zoomPoint\r\n let yKoord = (this.props.zoomTop + this.props.zoomBottom) / 2;\r\n let pt1 = {\r\n x: xKoord,\r\n y: yKoord,\r\n };\r\n\r\n // make roi in center of screen:\r\n let pt2 = pt1;\r\n this.ctx.translate(\r\n this.getPositionInImage(2).x - pt2.x,\r\n this.getPositionInImage(2).y - pt2.y\r\n );\r\n\r\n // zoom to roi:\r\n while (\r\n this.getPositionInImage(0).x < this.props.zoomLeft &&\r\n this.getPositionInImage(1).x > this.props.zoomRight &&\r\n this.getPositionInImage(0).y < this.props.zoomTop &&\r\n this.getPositionInImage(1).y > this.props.zoomBottom\r\n ) {\r\n // as long as roi is completely inside\r\n this.ctx.translate(pt1.x, pt1.y);\r\n let factor = Math.pow(20, 40 / 1000);\r\n this.ctx.scale(factor, factor);\r\n this.ctx.translate(-pt1.x, -pt1.y);\r\n }\r\n\r\n //this.props.zoomROI1(1);\r\n this.props.tzoomROI1(this.props.fileId);\r\n this.zoomMoveActionDebounced();\r\n }\r\n };\r\n\r\n //set structureIds if not set in first roi of\r\n setStructureIds = () => {\r\n for (let i = 1; i < this.props.roiLayers.length; i++) {\r\n let regionRois = this.props.roiLayers[i].layer.regionRois;\r\n let structure = this.props.structures[i];\r\n if (regionRois.length > 0 && regionRois[0].structureId === 0) {\r\n this.props.roiLayers[i].layer.regionRois = regionRois.map((roi) => {\r\n roi.structureId = structure.id;\r\n return roi;\r\n });\r\n }\r\n }\r\n };\r\n\r\n setSubtypeRois = () => {\r\n // check if rois are in subtype roilayer (e.g. opening project or run iam) --> put in parent roilayer\r\n // get all childstructures\r\n let childStructures = [];\r\n for (let i = 0; i < this.props.structures.length; i++) {\r\n if (\r\n this.props.structures[i].isSubtype &&\r\n this.props.structures[i].classificationSubtype\r\n ) {\r\n childStructures.push(i);\r\n }\r\n }\r\n\r\n // make childrois in parentlayer\r\n for (let i = 0; i < this.props.structures.length; i++) {\r\n if (\r\n this.props.roiLayers &&\r\n this.findRoiLayer(this.props.roiLayers, this.props.structures[i]).layer\r\n .regionRois.length !== 0 &&\r\n childStructures.includes(i)\r\n ) {\r\n let layer = [];\r\n let strs = this.props.structures;\r\n\r\n // get parentlayer rois\r\n let parentIndex = getParentIndexLayer(\r\n this.props.structures[i],\r\n this.props.structures\r\n );\r\n let parentLayerRois =\r\n this.props.roiLayers[parentIndex].layer.regionRois;\r\n\r\n this.props.roiLayers[i].layer.regionRois.forEach(function (element) {\r\n // check if object exists in parent layer\r\n let doubleObject = false;\r\n let doubleObjectIndex = 0;\r\n parentLayerRois.forEach(function (parentRoi, idx) {\r\n if (\r\n parentRoi.bounds.left === element.bounds.left &&\r\n parentRoi.bounds.top === element.bounds.top &&\r\n parentRoi.bounds.right === element.bounds.right &&\r\n parentRoi.bounds.bottom === element.bounds.bottom\r\n ) {\r\n doubleObject = true;\r\n doubleObjectIndex = idx;\r\n }\r\n });\r\n\r\n // set element properties\r\n element.subtypeName = strs[i].label;\r\n element.color = strs[i].color;\r\n element.structureId = strs[i].id;\r\n element.isSubtype = true;\r\n\r\n if (!doubleObject) {\r\n // add to new layer that gets appended at end of parent\r\n layer.push(element);\r\n } else {\r\n // replace element in parent layer with this element\r\n parentLayerRois.splice(doubleObjectIndex, 1, element);\r\n }\r\n });\r\n\r\n // make childlayer empty and put child rois in parentlayer\r\n let arrayA = parentLayerRois;\r\n let newArray = arrayA.concat(layer);\r\n this.props.roiLayers[parentIndex].layer.regionRois = newArray;\r\n this.props.roiLayers[i].layer.regionRois = [];\r\n // build tree for parent\r\n this.props.roiLayers[parentIndex].tree = new RBush();\r\n for (let regionRoi of newArray) {\r\n this.props.roiLayers[parentIndex].tree.insert(regionRoi.treeItem);\r\n }\r\n this.props.roiLayers[i].tree = new RBush();\r\n }\r\n }\r\n };\r\n\r\n // triggered by moving or zooming\r\n zoomMoveAction = () => {\r\n const p1 = this.getPointInCanvas({ x: 0, y: 0 });\r\n const p2 = this.getPointInCanvas({\r\n x: this.canvas.width,\r\n y: this.canvas.height,\r\n });\r\n // save current zoom and position for reload\r\n const zoomObject = {\r\n zoomRoi: true,\r\n zoomLeft: p1.x,\r\n zoomRight: p1.x + p2.x - p1.x,\r\n zoomTop: p1.y,\r\n zoomBottom: p1.y + p2.y - p1.y,\r\n };\r\n if (!this.props.showFullscreen) {\r\n this.props.persistentStorage.save(\r\n \"zoomObject\" + this.props.fileId,\r\n zoomObject\r\n );\r\n }\r\n this.props.updateVisibleROIDebounced(p1, p2);\r\n };\r\n\r\n zoomMoveActionDebounced = debounce(this.zoomMoveAction, 100);\r\n\r\n moveAnnotations = () => {\r\n for (let struct of this.props.roiLayers) {\r\n let newRegionList = [];\r\n if (struct.layer.regionRois.length > 0) {\r\n for (let roi of struct.layer.regionRois) {\r\n let newRegion = [];\r\n for (let region of roi.regions[0]) {\r\n let point = [region[0] + 1, region[1] - 0.5];\r\n newRegion.push(point);\r\n }\r\n let newRoi = new RegionROI(newRegion);\r\n newRegionList.push(newRoi);\r\n }\r\n struct.tree.clear();\r\n struct.layer.regionRois = newRegionList;\r\n struct.tree.load(newRegionList.map((item) => item.treeItem));\r\n }\r\n }\r\n };\r\n\r\n updateZ = (z, minZ = this.state.minZ, maxZ = this.state.maxZ) => {\r\n this.setMountedState({ z: z, minZ: minZ, maxZ: maxZ });\r\n this.props.updateGlobalZ(z, minZ, maxZ);\r\n };\r\n\r\n updateT = (t) => {\r\n this.setMountedState({ t: t });\r\n this.props.updateGlobalT(t);\r\n };\r\n\r\n drawVisibleImage = () => {\r\n this.zoomInRoi(); // zoom to roi if middle mouse button clicked on gallery image\r\n this.setStructureIds(); //set structureIds if first one is 0 and not base roi\r\n this.setSubtypeRois(); // set subtypes if iam is finished\r\n\r\n // calc deltatime for animations and fps\r\n let t1 = performance.now();\r\n let dt = t1 - this.t0;\r\n this.t0 = t1;\r\n\r\n // calc smoothed fps\r\n this.lastFps.pop();\r\n this.lastFps = [1000 / dt, ...this.lastFps];\r\n this.fps = Math.round(\r\n this.lastFps.reduce((acc, val) => (acc += val)) / this.lastFps.length\r\n );\r\n if (FPS) {\r\n this.setMountedState({\r\n fps: this.fps,\r\n });\r\n }\r\n\r\n // time playback\r\n if (this.state.playing) {\r\n let newT =\r\n this.state.t + (dt / 60000) * this.state.sr * this.state.playDirection;\r\n if (newT >= this.props.ome.sizeT) {\r\n newT = 0;\r\n } else if (newT < 0) {\r\n newT = this.props.ome.sizeT - 0.001;\r\n }\r\n this.updateT(newT);\r\n this.preloadNextFrames();\r\n }\r\n\r\n // time playback\r\n if (this.state.playingZ) {\r\n let newZ =\r\n this.state.z +\r\n (dt / 60000) * this.state.zsr * this.state.playDirectionZ;\r\n if (newZ > this.props.ome.sizeZ - 1) {\r\n newZ = 0;\r\n } else if (newZ < 0) {\r\n newZ = this.props.ome.sizeZ - 1;\r\n } else {\r\n newZ = newZ < 0 ? this.props.ome.sizeZ - 1 : newZ;\r\n }\r\n this.updateZ(newZ);\r\n this.preloadNextZFrames();\r\n }\r\n\r\n // nothing to draw if we haven't loaded our meta data yet\r\n if ((!this.props.ome || !this.canvas) && this.keepRendering) {\r\n // request next animation frame\r\n requestAnimationFrame(() => this.draw());\r\n return;\r\n }\r\n\r\n // call the initialization if the viewer is not initalized yet\r\n if (!this.state.initialized) {\r\n // do we have our top region already loaded? (then -> this.vw is greater 0)\r\n if (this.imgLoaded && this.imgRegistered) {\r\n // do initial placement\r\n this.zoomOut();\r\n } else {\r\n this.loadAllTiles();\r\n }\r\n }\r\n\r\n // only set z once\r\n if (!this.state.initializedZ) {\r\n let z = this.props.persistentStorage.load(\"z\");\r\n if (typeof z === \"undefined\") {\r\n z = Math.floor(this.props.ome.sizeZ / 2);\r\n }\r\n let minZ = this.props.persistentStorage.load(\"minZ\");\r\n if (typeof minZ === \"undefined\") {\r\n minZ = 0;\r\n }\r\n let maxZ = this.props.persistentStorage.load(\"maxZ\");\r\n if (typeof maxZ === \"undefined\") {\r\n maxZ = this.props.ome.sizeZ - 1;\r\n }\r\n this.updateZ(z, minZ, maxZ);\r\n this.props.tiles.setZLevel(Math.floor(this.props.ome.sizeZ / 2));\r\n this.setMountedState({\r\n minZ,\r\n maxZ,\r\n initializedZ: true,\r\n });\r\n }\r\n\r\n if (this.zoomTo) {\r\n if (typeof this.zoomPoint === \"undefined\") {\r\n this.zoomPoint = { x: this.lastX, y: this.lastY };\r\n }\r\n if (this.zoomDirection > 0 && this.getScale() < this.zoomTo) {\r\n // zoom in\r\n // calc our transformation offset\r\n let pt = this.getPointInCanvas({\r\n x: this.zoomPoint.x,\r\n y: this.zoomPoint.y,\r\n });\r\n\r\n this.ctx.translate(pt.x, pt.y);\r\n // calc scale factor (zoom per second)\r\n let factor = Math.pow(20, 40 / 1000);\r\n // perform scaling\r\n this.ctx.scale(factor, factor);\r\n if (this.getScale() > this.zoomTo) {\r\n this.canvasTranform(\r\n this.zoomTo,\r\n this.ctx.getTransform().b,\r\n this.ctx.getTransform().c,\r\n this.zoomTo,\r\n this.ctx.getTransform().e,\r\n this.ctx.getTransform().f\r\n );\r\n }\r\n // restore our offset\r\n this.ctx.translate(-pt.x, -pt.y);\r\n // update screen, update scalebar etc\r\n this.updatePreviewRect(this.props.activeTool);\r\n this.zoomMoveActionDebounced();\r\n } else if (this.zoomDirection < 0 && this.getScale() > this.zoomTo) {\r\n // zoom out\r\n // calc our transformation offset\r\n let pt = this.getPointInCanvas({\r\n x: this.zoomPoint.x,\r\n y: this.zoomPoint.y,\r\n });\r\n this.ctx.translate(pt.x, pt.y);\r\n // calc scale factor (zoom per second)\r\n let factor = Math.pow(20, -40 / 1000);\r\n // perform scaling\r\n this.ctx.scale(factor, factor);\r\n\r\n if (this.getScale() < this.zoomTo) {\r\n this.canvasTranform(\r\n this.zoomTo,\r\n this.ctx.getTransform().b,\r\n this.ctx.getTransform().c,\r\n this.zoomTo,\r\n this.ctx.getTransform().e,\r\n this.ctx.getTransform().f\r\n );\r\n }\r\n // restore our offset\r\n this.ctx.translate(-pt.x, -pt.y);\r\n // update screen, update scalebar etc\r\n\r\n this.updatePreviewRect(this.props.activeTool);\r\n this.zoomMoveActionDebounced();\r\n } else {\r\n // we reached the destination zoom level\r\n this.zoomTo = null;\r\n }\r\n }\r\n\r\n // get world size from ome metadata\r\n this.vw = this.props.ome.sizeX;\r\n this.vh = this.props.ome.sizeY;\r\n\r\n // Clear the entire canvas\r\n let p1 = this.getPointInCanvas({ x: 0, y: 0 });\r\n let p2 = this.getPointInCanvas({\r\n x: this.canvas.width,\r\n y: this.canvas.height,\r\n });\r\n this.ctx.clearRect(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y);\r\n this.ctx.save();\r\n this.canvasTranform(1, 0, 0, 1, 0, 0);\r\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n this.ctx.restore();\r\n\r\n this.ctx.fillStyle = \"#000\";\r\n this.ctx.fillRect(0, 0, this.vw, this.vh);\r\n\r\n // get pyramid level based on scaling\r\n this.level = getBaseLog(2, (this.getScale() / this.state.initialScale) * 2);\r\n // clip our level at lower bound\r\n if (this.level < 0 || this.level === Infinity) {\r\n this.level = 0;\r\n }\r\n // clip our level at upper bound\r\n if (this.level > this.props.ome.maxLevel) {\r\n this.level = this.props.ome.maxLevel;\r\n }\r\n\r\n let lv = Math.floor(this.level);\r\n\r\n // calculate the number of grid columns for this level\r\n let cols = Math.pow(2, lv);\r\n\r\n // get visbile column indices\r\n let visX = [];\r\n for (let i = 0; i < cols; i++) {\r\n if (\r\n this.getPosition().x / this.getScale() < this.vw * ((i + 1) / cols) &&\r\n (this.getPosition().x + this.canvas.width) / this.getScale() >\r\n this.vw * (i / cols)\r\n ) {\r\n visX.push(i);\r\n }\r\n }\r\n // out of bounds, add first region\r\n if (visX.length === 0) visX.push(0);\r\n\r\n // get visbile row indices\r\n let visY = [];\r\n for (let i = 0; i < cols; i++) {\r\n if (\r\n this.getPosition().y / this.getScale() < this.vh * ((i + 1) / cols) &&\r\n (this.getPosition().y + this.canvas.height) / this.getScale() >\r\n this.vh * (i / cols)\r\n ) {\r\n visY.push(i);\r\n }\r\n }\r\n // out of bounds, add first region\r\n if (visY.length === 0) visY.push(0);\r\n\r\n for (let x of visX) {\r\n for (let y of visY) {\r\n //let page = this.getPage();\r\n //for(let page = 0; page < this.props.histogramConfig.channels.length; page++) {\r\n for (let c = 0; c < this.props.histogramConfig.channels.length; c++) {\r\n let page = this.getPageForChannel(c);\r\n let channel = this.props.histogramConfig.channels[c];\r\n\r\n // skip disabled channels\r\n if (!channel.enabled) continue;\r\n // file +tile id im string\r\n // load image first if missing\r\n let tileId =\r\n page + \",\" + lv + \",\" + x + \",\" + y + \",\" + this.props.fileId;\r\n if (\r\n this.zoomTo == null &&\r\n !this.props.tiles.getVisibleImage(tileId) &&\r\n !this.state.isLoadingTiles &&\r\n !this.props.changingFile\r\n /// TODO: Commented out to fix splitscreen, why has it been added originally?\r\n //&& this.props.tiles.getFileId() === this.props.fileId\r\n ) {\r\n let visImg = new Image();\r\n visImg.src = Backend.renderRegion({\r\n id: this.props.fileId,\r\n page: page,\r\n lv: lv,\r\n x: x,\r\n y: y,\r\n });\r\n this.props.tiles.pushVisibleImage(visImg, tileId);\r\n }\r\n\r\n let img = this.props.tiles.getVisibleImage(tileId);\r\n this.imgLoaded = img && img.complete;\r\n // see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\r\n const compositionModeFluor = \"screen\";\r\n const compositionModeBrightfield = \"lighter\";\r\n if (this.imgLoaded && this.imgRegistered) {\r\n // image is loaded -> draw it\r\n this.pushColoredImage(c, tileId, img);\r\n\r\n if (\r\n tileId.includes(this.props.activeFileId) &&\r\n (this.props.tiles.getImgWidth() !== img.width ||\r\n this.props.tiles.getImgHeight() !== img.height)\r\n ) {\r\n // set context width and height (for splitscreen and gallery)\r\n this.props.tiles.setImgWidth(img.width);\r\n this.props.tiles.setImgHeight(img.height);\r\n }\r\n\r\n // composition should be screen for fluorescence\r\n if (this.props.ome.channels[c].type === \"fluorescence\") {\r\n this.ctx.globalCompositeOperation = compositionModeFluor;\r\n } else {\r\n this.ctx.globalCompositeOperation = compositionModeBrightfield;\r\n }\r\n if (\r\n Object.prototype.toString.call(\r\n this.props.tiles.getColoredImage(tileId)\r\n ) === \"[object HTMLCanvasElement]\" &&\r\n this.props.tiles.getColoredImage(tileId)\r\n ) {\r\n // draw colored image layer\r\n this.ctx.drawImage(\r\n this.props.tiles.getColoredImage(tileId),\r\n (x * this.vw) / cols,\r\n (y * this.vh) / cols,\r\n this.vw / cols,\r\n this.vh / cols\r\n );\r\n }\r\n } else {\r\n // draw image of previus pyramid level instead\r\n let factor = 1;\r\n let parentlv = lv;\r\n while (parentlv > 0) {\r\n parentlv--;\r\n factor *= 2;\r\n // get id of that image\r\n tileId =\r\n page +\r\n \",\" +\r\n parentlv +\r\n \",\" +\r\n Math.floor(x / factor) +\r\n \",\" +\r\n Math.floor(y / factor) +\r\n \",\" +\r\n this.props.fileId;\r\n\r\n // image is loaded -> draw it\r\n let imgOld = this.props.tiles.getVisibleImage(tileId);\r\n\r\n if (imgOld && imgOld.complete) {\r\n this.pushColoredImage(c, tileId, imgOld);\r\n\r\n // composition should be screen for fluorescence\r\n // see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\r\n this.ctx.globalCompositeOperation = compositionModeFluor;\r\n // draw colored image layer\r\n if (this.props.tiles.getColoredImage(tileId)) {\r\n this.ctx.drawImage(\r\n this.props.tiles.getColoredImage(tileId),\r\n ((x % factor) * imgOld.width) / factor,\r\n ((y % factor) * imgOld.height) / factor,\r\n imgOld.width / factor,\r\n imgOld.height / factor,\r\n (x * this.vw) / cols,\r\n (y * this.vh) / cols,\r\n this.vw / cols,\r\n this.vh / cols\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // back to default overlay composition operation\r\n // see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\r\n this.ctx.globalCompositeOperation = \"source-over\";\r\n };\r\n\r\n draw = () => {\r\n if (this.objectMode && this.props.activeTool !== \"rectangle\") {\r\n //deactivate if tool not active anymore\r\n this.objectMode = false;\r\n }\r\n const opacity = this.props.opacity;\r\n if (this.state.previewRectChanged) {\r\n this.updatePreviewRect(this.props.activeTool);\r\n }\r\n\r\n this.drawVisibleImage();\r\n\r\n let p1 = this.getPointInCanvas({ x: 0, y: 0 });\r\n let p2 = this.getPointInCanvas({\r\n x: this.canvas.width,\r\n y: this.canvas.height,\r\n });\r\n\r\n if (this.getScale() > 5) {\r\n this.ctx.imageSmoothingEnabled = false;\r\n } else {\r\n this.ctx.imageSmoothingEnabled = true;\r\n }\r\n\r\n // draw pixel annotation layer\r\n this.ctx.globalAlpha = 0.5;\r\n this.ctx.lineWidth = 1 / this.ctx.getTransform().a;\r\n const scaleFactor = 1 / this.ctx.getTransform().a;\r\n let drawLayer = this.props.drawLayer;\r\n let commentLayer = this.props.commentLayer;\r\n let landmarkLayer = this.props.landmarkLayer;\r\n const maxGeometries = 15000;\r\n if (!this.state.limitVisibleRegions) {\r\n const roiCount = this.props.roiLayers.reduce(\r\n (a, b) => a + b.layer.regionRois.length,\r\n 0\r\n );\r\n if (roiCount > maxGeometries) {\r\n this.setMountedState({ limitVisibleRegions: true });\r\n }\r\n }\r\n\r\n for (let l = 0; l < this.props.structures.length; l++) {\r\n let structure = this.props.structures[l];\r\n const roiLayer = this.props.roiLayers.find((c) => c.id === structure.id);\r\n if (typeof roiLayer === \"undefined\") {\r\n console.log(\"undefined layer found for roiLayer id\", structure.id);\r\n continue;\r\n }\r\n\r\n let parentIndex = getParentIndexLayer(structure, this.props.structures);\r\n\r\n let rr = roiLayer.layer;\r\n let rRoi = {\r\n regionRois: [],\r\n inverted: false,\r\n };\r\n\r\n let centerX = p1.x + (p2.x - p1.x) / 2;\r\n let centerY = p1.y + (p2.y - p1.y) / 2;\r\n\r\n let visibleRegions = [];\r\n if (this.state.limitVisibleRegions) {\r\n if (this.updateCounter > 5) {\r\n if (this.fps < 10) {\r\n this.visibleRegionsRadius = this.visibleRegionsRadius * 0.98;\r\n } else if (this.fps > 20) {\r\n this.visibleRegionsRadius += 10;\r\n }\r\n this.updateCounter = 0;\r\n }\r\n this.updateCounter += 1;\r\n let serachParams = {\r\n minX: centerX - this.visibleRegionsRadius,\r\n minY: centerY - this.visibleRegionsRadius,\r\n maxX: centerX + this.visibleRegionsRadius,\r\n maxY: centerY + this.visibleRegionsRadius,\r\n };\r\n let sarchLayer = structure.isSubtype\r\n ? this.props.roiLayers[parentIndex]\r\n : roiLayer;\r\n visibleRegions = sarchLayer.tree\r\n .search(serachParams)\r\n .map((treeItem) => treeItem.roi);\r\n } else {\r\n visibleRegions = structure.isSubtype\r\n ? this.props.roiLayers[parentIndex].layer.regionRois\r\n : roiLayer.layer.regionRois;\r\n }\r\n\r\n let structureHasRois = false;\r\n if (!structure.isSubtype || !structure.classificationSubtype) {\r\n structureHasRois = visibleRegions.length > 0 ? true : structureHasRois;\r\n if (structureHasRois) {\r\n // get rois for parent or substructure\r\n rr = visibleRegions.filter(\r\n (element) => !element.isSubtype && !element.aiAnnotated\r\n );\r\n rRoi.regionRois = rr;\r\n }\r\n } else if (structure.isSubtype) {\r\n // get subtype rois from parent layer\r\n structureHasRois = visibleRegions.length > 0 ? true : structureHasRois;\r\n\r\n if (structureHasRois) {\r\n //console.log(\"color1: \" + structure.color);\r\n rr = visibleRegions.filter(\r\n (element) => element.structureId === structure.id\r\n );\r\n rRoi.regionRois = rr;\r\n }\r\n }\r\n\r\n // check if parent of substructure shows subtype\r\n let showSubstructure = true;\r\n if (structure.isSubtype && !structure.classificationSubtype) {\r\n parentIndex = getParentIndex(structure, this.props.structures);\r\n if (parentIndex >= 0) {\r\n showSubstructure = this.props.structures[parentIndex].showSubtypes;\r\n }\r\n }\r\n\r\n // check if parent of subtype is substructure and not unfolded\r\n if (structure.isSubtype && structure.classificationSubtype) {\r\n let obj = this.subtypeHasSubstructureParent(structure);\r\n if (obj.hasStrParent) {\r\n // if parent is substructure --> check if it is visible\r\n let parentIdx = getParentIndex(\r\n this.props.structures[obj.index],\r\n this.props.structures\r\n );\r\n if (parentIdx >= 0) {\r\n showSubstructure = this.props.structures[parentIdx].showSubtypes;\r\n }\r\n }\r\n }\r\n if (structure.visible && showSubstructure && structureHasRois) {\r\n let fillstyle = \"\";\r\n // This color is the one of the filled shape\r\n if (!structure.classificationSubtype) {\r\n // draw parent always in parent color\r\n if (\r\n this.props.structures.length > 3 &&\r\n this.props.structures[3] === structure\r\n ) {\r\n //console.log(\"color2: \" + structure.color);\r\n }\r\n this.ctx.fillStyle = structure.color;\r\n fillstyle = structure.color;\r\n } else {\r\n // find color for subtypeStructure\r\n //console.log(\"color3: \" + this.findColor(structure));\r\n fillstyle = this.findColor(structure);\r\n this.ctx.fillStyle = fillstyle;\r\n }\r\n\r\n if (l === 0) {\r\n let ptrn = this.ctx.createPattern(this.backgroundPattern, \"repeat\");\r\n let patternScale = 1 / this.getScale();\r\n ptrn.setTransform({\r\n a: patternScale,\r\n b: 0,\r\n c: 0,\r\n d: patternScale,\r\n e: 0,\r\n f: 0,\r\n });\r\n this.ctx.fillStyle = ptrn;\r\n }\r\n\r\n // draw base roi\r\n this.ctx.strokeStyle = this.state.isBrightfield ? \"black\" : \"white\";\r\n if (structure.inversed && rRoi.regionRois.length > 0) {\r\n this.ctx.lineWidth = 2 / this.ctx.getTransform().a;\r\n this.ctx.globalAlpha = 1.0;\r\n this.ctx.strokeStyle = this.state.isBrightfield ? \"black\" : \"white\";\r\n // Draw the shape you want to take out\r\n this.ctx.beginPath();\r\n this.ctx.moveTo(0, 0);\r\n this.ctx.lineTo(this.vw, 0);\r\n this.ctx.lineTo(this.vw, this.vh);\r\n this.ctx.lineTo(0, this.vh);\r\n this.ctx.lineTo(0, 0);\r\n\r\n for (let roi of rRoi.regionRois) {\r\n for (let region of roi.regions) {\r\n if (region[region.length - 1]) {\r\n this.ctx.moveTo(\r\n region[region.length - 1][0],\r\n region[region.length - 1][1]\r\n );\r\n for (let i = 0; i < region.length; i++) {\r\n this.ctx.lineTo(region[i][0], region[i][1]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.ctx.closePath();\r\n this.ctx.fill(\"evenodd\");\r\n this.ctx.stroke();\r\n } else {\r\n this.ctx.lineWidth = 1 / this.ctx.getTransform().a;\r\n this.ctx.globalAlpha = opacity / 2;\r\n this.ctx.beginPath();\r\n\r\n visibleRegions = rRoi.regionRois.filter((roi) => {\r\n return roi.intersects(p1, p2);\r\n });\r\n\r\n // Draw visible, non-object regions\r\n for (const roi of visibleRegions.filter((roi) => !roi.isObject)) {\r\n let comp = roi.boundsAreaCompare(p1, p2);\r\n let regions = [];\r\n regions = roi.getDynamicRegions(comp, visibleRegions.length);\r\n\r\n for (let points of regions) {\r\n // //roi.regions,) {\r\n let region = {\r\n points: points,\r\n bounds: roi.bounds,\r\n };\r\n\r\n this.ctx.moveTo(points.x, points.y);\r\n if (points[points.length - 2]) {\r\n this.ctx.moveTo(\r\n points[points.length - 2][0],\r\n points[points.length - 2][1]\r\n );\r\n for (let i = 0; i < points.length; i++) {\r\n this.ctx.lineTo(points[i][0], points[i][1]);\r\n }\r\n }\r\n\r\n if (region[0]) {\r\n this.ctx.moveTo(\r\n region[region.length - 1][0],\r\n region[region.length - 1][1]\r\n );\r\n for (let i = 0; i < region.length; i++) {\r\n this.ctx.lineTo(region[i][0], region[i][1]);\r\n }\r\n }\r\n // show grid labels and tile names\r\n if (this.props.showGridLabels) {\r\n // draw tile name of roi / tile in upper right corner\r\n this.ctx.fillStyle = \"#ff0000\";\r\n this.ctx.font = \"90px Arial\";\r\n this.ctx.globalAlpha = 0.8;\r\n this.ctx.textAlign = \"right\";\r\n if (roi.bounds.right === this.props.ome.sizeX) {\r\n this.ctx.textAlign = \"center\";\r\n }\r\n this.ctx.textBaseline = \"top\";\r\n this.ctx.fillText(\r\n roi.tileName,\r\n points[points.length - 2][0] +\r\n (roi.bounds.right - roi.bounds.left),\r\n points[points.length - 2][1] -\r\n (roi.bounds.bottom - roi.bounds.top)\r\n );\r\n\r\n // if roi / tile is on edge draw col / row name\r\n this.ctx.fillStyle = \"#ff0000\";\r\n this.ctx.font = \"300px Arial\";\r\n this.ctx.globalAlpha = 1;\r\n // left edge\r\n if (roi.bounds.left === 0) {\r\n let txt = roi.tileName.replace(/[^0-9]/g, \"\");\r\n this.ctx.textAlign = \"end\";\r\n this.ctx.textBaseline = \"middle\";\r\n this.ctx.fillText(\r\n txt,\r\n points[points.length - 2][0] - 30,\r\n points[points.length - 2][1] -\r\n (roi.bounds.bottom - roi.bounds.top) / 2\r\n );\r\n }\r\n // top edge\r\n if (roi.bounds.top === 0) {\r\n let txt = roi.tileName.replace(/[^A-Z]/g, \"\");\r\n this.ctx.textAlign = \"center\";\r\n if (roi.bounds.right === this.props.ome.sizeX) {\r\n this.ctx.textAlign = \"left\";\r\n }\r\n this.ctx.textBaseline = \"bottom\";\r\n this.ctx.fillText(\r\n txt,\r\n points[points.length - 2][0] +\r\n (roi.bounds.right - roi.bounds.left) / 2,\r\n points[points.length - 2][1] -\r\n (roi.bounds.bottom - roi.bounds.top)\r\n );\r\n }\r\n }\r\n this.ctx.globalAlpha = opacity / 2;\r\n this.ctx.fillStyle = fillstyle;\r\n }\r\n }\r\n this.ctx.closePath();\r\n this.ctx.fill(\"evenodd\");\r\n this.ctx.strokeStyle = structure.color;\r\n this.ctx.lineWidth = 1 / this.ctx.getTransform().a;\r\n this.ctx.globalAlpha = 1.0;\r\n this.ctx.stroke();\r\n\r\n let tempStrokeStyle = this.ctx.strokeStyle;\r\n let tempLineWidth = this.ctx.lineWidth;\r\n this.ctx.lineWidth = 2 / this.ctx.getTransform().a;\r\n this.ctx.strokeStyle = structure.color;\r\n\r\n this.ctx.beginPath();\r\n\r\n // Draw non-area objects\r\n for (const roi of visibleRegions.filter((roi) => roi.isObject)) {\r\n let regions = roi.getRectRegions();\r\n\r\n for (let points of regions) {\r\n if (points[points.length - 2]) {\r\n this.ctx.moveTo(\r\n points[points.length - 2][0],\r\n points[points.length - 2][1]\r\n );\r\n for (let i = 0; i < points.length; i++) {\r\n this.ctx.lineTo(points[i][0], points[i][1]);\r\n }\r\n }\r\n }\r\n }\r\n this.ctx.stroke();\r\n\r\n if (opacity !== 0) {\r\n this.ctx.strokeStyle = tempStrokeStyle;\r\n this.ctx.lineWidth = tempLineWidth;\r\n }\r\n\r\n if (this.state.showObjectIdx) {\r\n let layerRois = structure.isSubtype\r\n ? this.props.roiLayers[parentIndex].layer.regionRois\r\n : roiLayer.layer.regionRois;\r\n this.ctx.beginPath();\r\n // show number for big annotations\r\n for (const roi of visibleRegions) {\r\n let comp = roi.boundsAreaCompare(p1, p2);\r\n // uncomment for showing text in middle of visibly big polys\r\n if (comp > 0.001) {\r\n //console.log(\"big poly:\", comp);\r\n const fontSize = 24 * scaleFactor;\r\n //const fontMargin = 6 * scaleFactor;\r\n this.ctx.fillStyle = this.state.isBrightfield\r\n ? \"black\"\r\n : \"white\";\r\n this.ctx.font = \"bold \" + fontSize + \"px Arial\";\r\n this.ctx.globalAlpha = 1.0;\r\n this.ctx.textAlign = \"center\";\r\n this.ctx.textBaseline = \"bottom\";\r\n let center = roi.getPointOnPoly();\r\n center.y += fontSize / 2;\r\n let textToShow = layerRois.findIndex(\r\n (regionRoi) => regionRoi.uuid === roi.uuid\r\n );\r\n textToShow = textToShow + 1;\r\n\r\n this.ctx.fillText(textToShow.toBase(62), center.x, center.y);\r\n }\r\n }\r\n this.ctx.closePath();\r\n this.ctx.stroke();\r\n }\r\n }\r\n }\r\n }\r\n // if deleting with right click, draw drawing inversed\r\n if (drawLayer.clear) {\r\n this.ctx.fillStyle = this.props.structures[this.props.selectedLayer]\r\n .inversed\r\n ? this.props.structures[this.props.selectedLayer].color\r\n : \"black\";\r\n } else {\r\n if (this.props.structures[this.props.selectedLayer].isSubtype) {\r\n this.ctx.fillStyle = this.props.structures[this.props.selectedLayer]\r\n .inversed\r\n ? \"black\"\r\n : this.props.structures[this.props.selectedLayer].color;\r\n } else {\r\n this.ctx.fillStyle = this.props.structures[this.props.selectedLayer]\r\n .inversed\r\n ? \"black\"\r\n : this.props.structures[this.props.selectedLayer].color;\r\n }\r\n }\r\n\r\n //draw only colored outline, if drawing objects\r\n if (this.objectMode) {\r\n this.ctx.globalAlpha = 1;\r\n this.ctx.fillStyle = \"transparent\";\r\n this.ctx.strokeStyle =\r\n this.props.structures[this.props.selectedLayer].color;\r\n this.ctx.lineWidth = 2 / this.ctx.getTransform().a;\r\n } else {\r\n //draw black outline with filled outline\r\n this.ctx.globalAlpha = opacity / 2;\r\n this.ctx.strokeStyle = this.state.isBrightfield ? \"black\" : \"white\";\r\n }\r\n\r\n this.ctx.beginPath();\r\n for (let roi of drawLayer.regionRois) {\r\n for (let points of roi.regions) {\r\n if (points.length > 0) {\r\n this.ctx.moveTo(\r\n points[points.length - 1][0],\r\n points[points.length - 1][1]\r\n );\r\n for (let i = 0; i < points.length; i++) {\r\n this.ctx.lineTo(points[i][0], points[i][1]);\r\n }\r\n }\r\n }\r\n }\r\n this.ctx.closePath();\r\n this.ctx.fill(\"evenodd\");\r\n\r\n this.ctx.globalAlpha = 1;\r\n if (opacity === 0) {\r\n this.ctx.strokeStyle =\r\n this.props.structures[this.props.selectedLayer].color;\r\n this.ctx.lineWidth = 2 / this.ctx.getTransform().a;\r\n }\r\n this.ctx.stroke();\r\n\r\n this.ctx.strokeStyle = this.state.isBrightfield ? \"black\" : \"white\";\r\n this.ctx.globalAlpha = opacity / 2;\r\n this.ctx.lineWidth = 1 / this.ctx.getTransform().a;\r\n if (\r\n commentLayer &&\r\n commentLayer.commentRois &&\r\n this.props.activeTool === \"comment\"\r\n ) {\r\n this.ctx.globalAlpha = 1;\r\n this.ctx.fillStyle = \"transparent\";\r\n this.ctx.lineWidth = 4 / this.ctx.getTransform().a;\r\n\r\n for (let roi of commentLayer.commentRois) {\r\n this.ctx.beginPath();\r\n this.ctx.strokeStyle = roi.type === \"commentBox\" ? \"black\" : roi.color;\r\n let points = roi.regions;\r\n if (points && points.length > 1) {\r\n for (let i = 0; i < points.length; i++) {\r\n this.ctx.lineTo(points[i][0], points[i][1]);\r\n }\r\n }\r\n if (\r\n roi.type === \"rectangle\" ||\r\n roi.type === \"region\" ||\r\n roi.type === \"commentBox\"\r\n ) {\r\n this.ctx.closePath();\r\n }\r\n this.ctx.stroke();\r\n\r\n this.ctx.globalAlpha = 0.85;\r\n this.ctx.fillStyle =\r\n roi.type === \"commentBox\" ? \"white\" : \"transparent\";\r\n this.ctx.fill();\r\n this.ctx.globalAlpha = 1;\r\n\r\n if (roi.commentValue !== \"\" && roi.regions.length > 1) {\r\n let angle = 0;\r\n this.ctx.save();\r\n\r\n // Translate Text Positions\r\n if (roi.type === \"rectangle\" || roi.type === \"region\") {\r\n this.ctx.translate(roi.bounds.right, roi.bounds.bottom + 20);\r\n } else if (roi.type === \"commentBox\") {\r\n this.ctx.translate(\r\n roi.bounds.left + Math.round(5 * scaleFactor),\r\n roi.bounds.top + Math.round(5 * scaleFactor)\r\n );\r\n } else if (roi.type === \"arrow\" || roi.type === \"distance\") {\r\n let p1 = { x: roi.regions[0][0], y: roi.regions[0][1] };\r\n let p2 = { x: roi.regions[1][0], y: roi.regions[1][1] };\r\n let vector = {\r\n x: p2.x - p1.x,\r\n y: p2.y - p1.y,\r\n };\r\n if (roi.type === \"distance\") {\r\n this.ctx.translate(\r\n (roi.bounds.left + roi.bounds.right) / 2,\r\n (roi.bounds.top + roi.bounds.bottom) / 2\r\n );\r\n vector.x /= 20;\r\n vector.y /= 20;\r\n if (vector.x < 0) {\r\n this.ctx.translate(-vector.y, vector.x);\r\n } else {\r\n this.ctx.translate(vector.y, -vector.x);\r\n }\r\n angle = Math.atan2(p2.y - p1.y, p2.x - p1.x);\r\n if (angle > Math.PI / 2 || angle < -Math.PI / 2) angle -= Math.PI;\r\n } else {\r\n this.ctx.translate(roi.bounds.left, roi.bounds.top);\r\n if (p1.x > p2.x) {\r\n this.ctx.translate(-vector.x, 0);\r\n }\r\n if (p1.y > p2.y) {\r\n this.ctx.translate(0, -vector.y);\r\n }\r\n }\r\n }\r\n\r\n // Do Text Formating\r\n this.ctx.rotate(angle);\r\n this.ctx.fillStyle = roi.type === \"commentBox\" ? \"black\" : roi.color;\r\n let fontSize = Math.round(\r\n 20 * roi.fontScaleFactor * Math.min(scaleFactor, 14)\r\n );\r\n // comment back in if old behaviour is wanted -> Font-Size depends on Boxlength and not the scaleFactor in the Scene\r\n // roi.type === \"commentBox\"\r\n // ? Math.round(20 * roi.fontScaleFactor * Math.min(scaleFactor, 14))\r\n // : Math.round(length / 10 * roi.fontScaleFactor);\r\n this.ctx.font = fontSize + \"px Arial\";\r\n\r\n if (roi.type === \"arrow\") {\r\n let p1 = { x: roi.regions[0][0], y: roi.regions[0][1] };\r\n let p2 = { x: roi.regions[1][0], y: roi.regions[1][1] };\r\n\r\n this.ctx.textAlign = \"right\";\r\n this.ctx.textBaseline = \"bottom\";\r\n if (p1.x > p2.x) {\r\n this.ctx.textAlign = \"left\";\r\n }\r\n if (p1.y > p2.y) {\r\n this.ctx.textBaseline = \"top\";\r\n }\r\n } else {\r\n this.ctx.textAlign = \"center\";\r\n this.ctx.textAlign =\r\n roi.type === \"rectangle\" || roi.type === \"region\"\r\n ? \"right\"\r\n : \"center\";\r\n this.ctx.textAlign = roi.type === \"commentBox\" ? \"left\" : \"center\";\r\n this.ctx.textBaseline =\r\n roi.type === \"rectangle\" ||\r\n roi.type === \"region\" ||\r\n roi.type === \"commentBox\"\r\n ? \"top\"\r\n : \"middle\";\r\n }\r\n this.wrapText(\r\n this.ctx,\r\n roi.commentValue,\r\n 0,\r\n 0,\r\n roi.width,\r\n fontSize + 5\r\n );\r\n this.ctx.restore();\r\n }\r\n }\r\n }\r\n if (landmarkLayer && landmarkLayer.landmarkRois && this.props.showMarks) {\r\n this.ctx.globalAlpha = 1;\r\n this.ctx.lineWidth = 2 / this.ctx.getTransform().a;\r\n let linelength = 15 / this.getScale();\r\n for (let roi of landmarkLayer.landmarkRois) {\r\n if (typeof roi.regions !== \"undefined\") {\r\n this.ctx.beginPath();\r\n this.ctx.strokeStyle = roi.color;\r\n let points = roi.regions;\r\n\r\n let x = points[0];\r\n let y = points[1];\r\n this.ctx.lineTo(x, y);\r\n this.ctx.lineTo(x, y - linelength);\r\n this.ctx.lineTo(x, y + linelength);\r\n this.ctx.lineTo(x, y);\r\n this.ctx.lineTo(x - linelength, y);\r\n this.ctx.lineTo(x + linelength, y);\r\n this.ctx.lineTo(x, y);\r\n\r\n this.ctx.closePath();\r\n this.ctx.stroke();\r\n\r\n this.ctx.save();\r\n this.ctx.translate(x + linelength, y - linelength);\r\n\r\n const scaleFactor = 1 / this.ctx.getTransform().a;\r\n let fontSize = Math.round(20 * roi.fontScaleFactor * scaleFactor);\r\n //* Math.min(scaleFactor, 14)\r\n this.ctx.globalAlpha = 1;\r\n this.ctx.font = fontSize + \"px Arial\";\r\n this.ctx.textAlign = \"center\";\r\n this.ctx.textBaseline = \"middle\";\r\n this.ctx.fillStyle = roi.color;\r\n let val = roi.commentValue;\r\n this.wrapText(this.ctx, String(val), 0, 0, linelength, linelength);\r\n this.ctx.restore();\r\n }\r\n }\r\n }\r\n\r\n //show heatmap while tool is active\r\n if (this.props.activeTool !== \"heatmap\" && this.showHeatmap) {\r\n this.showHeatmap = false;\r\n this.heatmap.setData({ max: 100, data: [] });\r\n }\r\n\r\n this.drawUsers();\r\n\r\n\r\n this.ctx.globalAlpha = 1.0;\r\n // draw scale bar\r\n // console.log(\"scalebar\", this.state.showScaleBar, this.state.scaleBarData);\r\n if (this.state.showScaleBar && this.state.scaleBarData) {\r\n this.ctx.beginPath();\r\n this.ctx.strokeStyle = this.state.isBrightfield ? \"black\" : \"white\";\r\n const scaleFactor = 1 / this.ctx.getTransform().a;\r\n this.ctx.lineWidth = 3 * scaleFactor;\r\n const marginRight = 5 * scaleFactor;\r\n const marginBottom = 14 * scaleFactor;\r\n const scaleWidth = (this.state.scaleBarData.width - 2) * scaleFactor;\r\n const stopLineHeight = 16 * scaleFactor;\r\n const maxScaleWidth = this.state.scaleBarData.maxScaleWidth * scaleFactor;\r\n const delta = {\r\n x: this.state.scaleBarData.x * scaleFactor,\r\n y: this.state.scaleBarData.y * scaleFactor,\r\n };\r\n const center = {\r\n x: p2.x - marginRight - maxScaleWidth / 2 + delta.x,\r\n y: p2.y - marginBottom + delta.y,\r\n };\r\n this.ctx.moveTo(center.x - scaleWidth / 2, center.y);\r\n this.ctx.lineTo(center.x - scaleWidth / 2, center.y - stopLineHeight / 2);\r\n this.ctx.lineTo(center.x - scaleWidth / 2, center.y + stopLineHeight / 2);\r\n this.ctx.lineTo(center.x - scaleWidth / 2, center.y);\r\n this.ctx.lineTo(center.x + scaleWidth / 2, center.y);\r\n this.ctx.lineTo(center.x + scaleWidth / 2, center.y - stopLineHeight / 2);\r\n this.ctx.lineTo(center.x + scaleWidth / 2, center.y + stopLineHeight / 2);\r\n this.ctx.stroke();\r\n\r\n const fontSize = 14 * scaleFactor;\r\n const fontMargin = 6 * scaleFactor;\r\n this.ctx.fillStyle = this.state.isBrightfield ? \"black\" : \"white\";\r\n this.ctx.font = \"bold \" + fontSize + \"px Arial\";\r\n this.ctx.globalAlpha = 1.0;\r\n this.ctx.textAlign = \"center\";\r\n this.ctx.textBaseline = \"bottom\";\r\n this.ctx.fillText(\r\n this.state.scaleBarData.label,\r\n center.x,\r\n center.y - fontMargin\r\n );\r\n }\r\n\r\n // uncomment to debug pixal annotaion regions\r\n /*let rects = calcBoundingBoxes(this.layer);\r\n for(let rect of rects) {\r\n this.ctx.strokeStyle = \"black\"; \r\n this.ctx.beginPath();\r\n this.ctx.rect(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top)\r\n this.ctx.closePath();\r\n this.ctx.stroke();\r\n }*/\r\n\r\n // draw rois\r\n for (let roi of this.props.rois.filter((c) => !c.hovered)) {\r\n roi.draw({\r\n selected: roi === this.props.selectedROI,\r\n });\r\n }\r\n for (let roi of this.props.rois.filter((c) => c.hovered)) {\r\n roi.draw({\r\n selected: roi === this.props.selectedROI,\r\n });\r\n }\r\n\r\n // draw custom mouse cursor for pen tool\r\n if (this.props.tools[this.props.activeTool]) {\r\n this.ctx.lineWidth = 1 / this.ctx.getTransform().a;\r\n let centerX = p1.x + (p2.x - p1.x) / 2;\r\n let centerY = p1.y + (p2.y - p1.y) / 2;\r\n this.props.tools[this.props.activeTool].drawCustomCursor(\r\n this.ctx,\r\n this.mousePos,\r\n this.getScale(),\r\n this.canvas,\r\n { x: centerX, y: centerY },\r\n this.state.mouseOnCanvas\r\n );\r\n }\r\n\r\n // check if tiles are still loading from server\r\n let isLoadingTiles = false;\r\n for (let tileId in this.props.tiles.getVisibleImages()) {\r\n if (this.props.tiles.getVisibleImage(tileId).complete === false) {\r\n isLoadingTiles = true;\r\n break;\r\n }\r\n }\r\n if (isLoadingTiles !== this.state.isLoadingTiles) {\r\n let nowTime = performance.now();\r\n this.setMountedState(\r\n {\r\n isLoadingTiles: isLoadingTiles,\r\n nowTime: nowTime,\r\n },\r\n () => {\r\n if (!isLoadingTiles) {\r\n // console.log(\r\n // \"loading tiles took \",\r\n // performance.now() - this.state.nowTime,\r\n // \"ms,\"\r\n // );\r\n }\r\n }\r\n );\r\n }\r\n if (this.props.showWindowTool && this.props.isActive) {\r\n if (this.props.windowToolRef) {\r\n this.props.windowToolRef.updateCanvas();\r\n }\r\n }\r\n\r\n // request next animation frame\r\n if (this.keepRendering) {\r\n requestAnimationFrame(() => this.draw());\r\n }\r\n };\r\n\r\n // draw user name with small arrow, where mouse of use is currently\r\n drawUsers = () => {\r\n const scaleFactor = 1 / this.ctx.getTransform().a;\r\n const usersData = this.props.projectContext.getUsersData();\r\n\r\n if (usersData !== null) {\r\n let idx = 0;\r\n for (const userData of Object.values(usersData)) {\r\n const x = userData.x;\r\n const y = userData.y;\r\n\r\n const userName = userData.user;\r\n const textWidth = userName.length * 9;\r\n const arrowCoords = [\r\n { x: x + 15 * scaleFactor, y: y + 5 * scaleFactor },\r\n { x: x + (16 + textWidth) * scaleFactor, y: y + 5 * scaleFactor },\r\n { x: x + (16 + textWidth) * scaleFactor, y: y + 35 * scaleFactor },\r\n { x: x + 5 * scaleFactor, y: y + 35 * scaleFactor },\r\n { x: x + 5 * scaleFactor, y: y + 15 * scaleFactor },\r\n { x: x, y: y },\r\n ];\r\n\r\n this.ctx.globalAlpha = 1.0;\r\n this.ctx.strokeStyle = colors[idx];\r\n this.ctx.fillStyle = \"white\";\r\n this.ctx.beginPath();\r\n\r\n this.ctx.moveTo(x, y);\r\n for (let p of arrowCoords) {\r\n this.ctx.lineTo(p.x, p.y);\r\n }\r\n this.ctx.closePath();\r\n this.ctx.fill();\r\n this.ctx.stroke();\r\n\r\n let fontSize = Math.round(20 * scaleFactor);\r\n this.ctx.globalAlpha = 1;\r\n this.ctx.font = fontSize + \"px Arial\";\r\n this.ctx.textAlign = \"left\";\r\n this.ctx.textBaseline = \"top\";\r\n this.ctx.fillStyle = colors[idx];\r\n this.ctx.fillText(userName, x + 10 * scaleFactor, y + 10 * scaleFactor);\r\n idx++;\r\n }\r\n }\r\n };\r\n\r\n wrapText = (context, text, x, y, maxWidth, lineHeight, maxHeight) => {\r\n if (text.split(\"\\n\").length > 1) {\r\n for (let line of text.split(\"\\n\")) {\r\n this.wrapText(\r\n context,\r\n line,\r\n x,\r\n y + this.lineIdx * lineHeight,\r\n maxWidth,\r\n lineHeight,\r\n maxHeight\r\n );\r\n this.lineIdx += 1;\r\n }\r\n this.lineIdx = 0;\r\n } else {\r\n let words = text.split(\" \");\r\n let line = \"\";\r\n\r\n for (let n = 0; n < words.length; n++) {\r\n let testLine = line + words[n] + \" \";\r\n let metrics = context.measureText(testLine);\r\n let testWidth = metrics.width;\r\n if (testWidth > maxWidth && n > 0) {\r\n context.fillText(line, x, y);\r\n line = words[n] + \" \";\r\n y += lineHeight;\r\n this.lineIdx += 1;\r\n } else {\r\n line = testLine;\r\n }\r\n }\r\n context.fillText(line, x, y);\r\n }\r\n };\r\n\r\n subtypeHasSubstructureParent = (structure) => {\r\n // check if subtype has substructure as parent\r\n let obj = {\r\n hasStrParent: false,\r\n index: -1,\r\n };\r\n\r\n let index = this.props.structures.findIndex(\r\n (element) => element === structure\r\n );\r\n while (\r\n this.props.structures[index].subtypeLevel !== 0 &&\r\n !obj.hasStrParent\r\n ) {\r\n index = getParentIndex(\r\n this.props.structures[index],\r\n this.props.structures\r\n );\r\n obj.index = index;\r\n // if not classification subtype --> substructure\r\n if (\r\n !this.props.structures[index].classificationSubtype &&\r\n this.props.structures[index].isSubtype\r\n ) {\r\n obj.hasStrParent = true;\r\n }\r\n }\r\n return obj;\r\n };\r\n\r\n findColor = (structure) => {\r\n // get color for subtype depending on if structure is unfolded (if not unfolded color of parent)\r\n let parentIndex = this.props.structures.findIndex(\r\n (element) => element === structure\r\n );\r\n while (!this.props.structures[parentIndex].isUnfolded) {\r\n parentIndex = getParentIndex(\r\n this.props.structures[parentIndex],\r\n this.props.structures\r\n );\r\n }\r\n return this.props.structures[parentIndex].color;\r\n };\r\n\r\n getChildsofStructure = (parentStructure) => {\r\n // return direct classification subtypes\r\n return this.props.structures.filter(\r\n (element) =>\r\n element.parentId === parentStructure.id && element.classificationSubtype\r\n );\r\n };\r\n\r\n setNewSelRoi = (roi) => {\r\n this.selROI = roi;\r\n };\r\n\r\n setZoomLevelForGridSize = (gridSize) => {\r\n // make initial zoomlevel\r\n this.zoomFit();\r\n // zoom in that tile is size of viewer\r\n this.ctx.scale(gridSize, gridSize);\r\n };\r\n\r\n classifySelectedRoi = (classId, withMouse) => {\r\n const { selectedLayer, roiLayers, structures } = this.props;\r\n // classify selected roi with key shortcut\r\n\r\n // change getChildsofStructure for multiple subtypelvels\r\n let childs = this.getChildsofStructure(structures[selectedLayer]);\r\n\r\n // get parent layer\r\n let parentIndexLayer = getParentIndexLayer(\r\n structures[selectedLayer],\r\n structures\r\n );\r\n\r\n let idxRoi = roiLayers[parentIndexLayer].layer.regionRois.findIndex(\r\n (element) =>\r\n element.bounds.left === this.selROI.r.bounds.left &&\r\n element.bounds.top === this.selROI.r.bounds.top &&\r\n element.bounds.bottom === this.selROI.r.bounds.bottom &&\r\n element.bounds.right === this.selROI.r.bounds.right\r\n );\r\n\r\n let idxStr = structures.findIndex(\r\n (element) =>\r\n element.color === this.selROI.colors &&\r\n element.parentId === structures[selectedLayer].id\r\n );\r\n\r\n let parentStructure = false;\r\n let strToUse = null;\r\n if (withMouse) {\r\n // with mouse\r\n // parent structure\r\n if (idxStr === -1) {\r\n parentStructure = true;\r\n idxStr = selectedLayer;\r\n }\r\n strToUse = structures[idxStr];\r\n } else {\r\n // with keys\r\n strToUse = childs[classId - 1];\r\n }\r\n\r\n let selectedRoi = roiLayers[parentIndexLayer].layer.regionRois[idxRoi];\r\n let historyItem = [];\r\n let histId = structures[parentIndexLayer].id;\r\n if (\r\n !parentStructure &&\r\n idxRoi !== -1 &&\r\n (childs[classId - 1] || strToUse) &&\r\n selectedRoi\r\n ) {\r\n historyItem.push({ add: false, id: histId, roi: selectedRoi.copy() });\r\n // set properties of roi for classification\r\n selectedRoi.color = strToUse.color;\r\n selectedRoi.isSubtype = true;\r\n selectedRoi.isAnnotated = true;\r\n selectedRoi.subtypeName = strToUse.label;\r\n selectedRoi.structureId = strToUse.id;\r\n selectedRoi.isLabeled = true;\r\n selectedRoi.isSelObj = false;\r\n selectedRoi.aiAnnotated = false;\r\n historyItem.push({ add: true, id: histId, roi: selectedRoi.copy() });\r\n window.projectHistory.add(historyItem);\r\n }\r\n\r\n if ((classId === 0 || parentStructure) && selectedRoi) {\r\n historyItem.push({ add: false, id: histId, roi: selectedRoi.copy() });\r\n selectedRoi.color = structures[selectedLayer].color;\r\n selectedRoi.isSubtype = false;\r\n selectedRoi.isAnnotated = false;\r\n selectedRoi.subtypeName = structures[selectedLayer].label;\r\n selectedRoi.structureId = structures[selectedLayer].id;\r\n selectedRoi.isLabeled = false;\r\n selectedRoi.isSelObj = false;\r\n selectedRoi.aiAnnotated = false;\r\n historyItem.push({ add: true, id: histId, roi: selectedRoi.copy() });\r\n window.projectHistory.add(historyItem);\r\n }\r\n\r\n // if changeFile is true --> change file after classification\r\n setTimeout(() => {\r\n let nextFileId = this.getNextFileId();\r\n if (\r\n this.selROI.changeFile === true &&\r\n this.selROI.automaticFileChange === true &&\r\n nextFileId\r\n ) {\r\n this.props.onSelectFile(nextFileId);\r\n }\r\n }, 1000);\r\n };\r\n\r\n getNextFileId = () => {\r\n const { project, fileId } = this.props;\r\n let inxCurrentFile = project.files.findIndex(\r\n (element) => element.id === fileId\r\n );\r\n\r\n if (project.files[inxCurrentFile + 1]) {\r\n return project.files[inxCurrentFile + 1].id;\r\n } else {\r\n if (\r\n this.props.project.type.includes(\"HistoClassification\") ||\r\n this.props.project.type.includes(\"HistoPointCounting\")\r\n ) {\r\n // if last file\r\n window.showWarningSnackbar(\"Last file.\");\r\n }\r\n return null;\r\n }\r\n };\r\n\r\n checkToolInConfig = (toolName) => {\r\n if (this.props.viewerConfig) {\r\n if (this.props.viewerConfig.project.toolsInProject[toolName]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n };\r\n\r\n keyDown = (event) => {\r\n if (\r\n this.props.tools[this.props.activeTool] &&\r\n this.props.tools[this.props.activeTool].rendererKeyDown\r\n ) {\r\n this.props.tools[this.props.activeTool].rendererKeyDown(event);\r\n }\r\n };\r\n\r\n keyDownSelection = (event) => {\r\n // change selected roi with arrow keys\r\n let selection = this.props.tools[this.props.activeTool].onKeyDown(\r\n event,\r\n true,\r\n this.isTilesToolUsed()\r\n );\r\n\r\n if (selection) {\r\n this.selROI = selection;\r\n this.props.setSelectedRoi(selection);\r\n }\r\n };\r\n\r\n isTilesToolUsed = () => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n // check if tiles tool was used to create rois\r\n let hasLayerTileNames = false;\r\n if (roiLayers[selectedLayer].layer.regionRois[0]) {\r\n hasLayerTileNames =\r\n roiLayers[selectedLayer].layer.regionRois[0].tileName !== \"\";\r\n }\r\n\r\n if (this.checkToolInConfig(\"TilesTool\") && hasLayerTileNames) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n updateFLChannels = (e) => {\r\n this.props.tiles.setHistogramConfig(e);\r\n\r\n this.setMountedState({ histogramConfig: e });\r\n\r\n // invalidate all cached coloring images\r\n //this.coloredImages = [];\r\n this.props.tiles.setColoredImages([]);\r\n for (let i = 0; i < this.props.structures.length; i++) {\r\n if (this.props.roiLayers.length > 1) {\r\n this.props.roiLayers[1].layer.regionRois.forEach(function (point) {\r\n point.firstTimeGallery = true;\r\n });\r\n }\r\n }\r\n //this.props.tiles.setColoredImages([]);\r\n\r\n this.loadAllTiles();\r\n };\r\n\r\n onPlayPause = (e, dir) => {\r\n this.setMountedState({ playing: e, playingZ: false, playDirection: dir });\r\n };\r\n\r\n onPlayPauseZ = (e, dir) => {\r\n this.setMountedState({ playingZ: e, playing: false, playDirectionZ: dir });\r\n };\r\n\r\n onSeek = (e, v) => {\r\n this.updateT(v);\r\n };\r\n\r\n onChangeT = (e) => {\r\n this.updateT(e);\r\n };\r\n\r\n onChangeZValue = (z, minZ = this.state.minZ, maxZ = this.state.maxZ) => {\r\n this.updateZ(z, minZ, maxZ);\r\n this.props.tiles.setZLevel(z);\r\n this.props.persistentStorage.save(\"z\", z); //remember for use after project reload or reopen\r\n this.props.persistentStorage.save(\"minZ\", minZ); //remember for use after project reload or reopen\r\n this.props.persistentStorage.save(\"maxZ\", maxZ); //remember for use after project reload or reopen\r\n };\r\n\r\n onChangeZ = (e, v) => {\r\n let minZ = v[0];\r\n let z = v[1];\r\n let maxZ = v[2];\r\n this.onChangeZValue(z, minZ, maxZ);\r\n };\r\n\r\n onChangeSr = (e) => {\r\n this.setMountedState({ sr: e });\r\n };\r\n\r\n onChangeZSr = (e) => {\r\n this.setMountedState({ zsr: e });\r\n };\r\n\r\n onStep = (e) => {\r\n this.updateT(\r\n Math.min(this.props.ome.sizeT - 1, Math.max(0, this.state.t + e))\r\n );\r\n };\r\n\r\n onStepZ = (e) => {\r\n let zLevel = Math.min(\r\n this.props.ome.sizeZ - 1,\r\n Math.max(0, this.state.z + e)\r\n );\r\n this.onChangeZValue(zLevel);\r\n };\r\n\r\n updatePreviewRectSize = (size) => {\r\n let scaledWidth = size.width * this.getScale();\r\n let scaledHeight = size.height * this.getScale();\r\n\r\n if (\r\n this.state.previewWidth !== scaledWidth ||\r\n this.state.previewHeight !== scaledHeight\r\n ) {\r\n this.setMountedState({\r\n previewWidth: scaledWidth,\r\n previewHeight: scaledHeight,\r\n previewRectChanged: false,\r\n });\r\n }\r\n };\r\n\r\n onResize = (event, { size }) => {\r\n size.width = size.width / this.getScale();\r\n size.height = size.height / this.getScale();\r\n\r\n let minSize = 500;\r\n let maxSize = 2000;\r\n //let maxSize = 14000;\r\n size.width = size.width < minSize ? minSize : size.width;\r\n size.width = size.width > maxSize ? maxSize : size.width;\r\n size.height = size.height < minSize ? minSize : size.height;\r\n size.height = size.height > maxSize ? maxSize : size.height;\r\n\r\n this.props.tools[this.props.activeTool].setPreviewSize(\r\n size.width,\r\n size.height\r\n );\r\n let newSize = {\r\n width: this.props.tools[this.props.activeTool].state.prevW,\r\n height: this.props.tools[this.props.activeTool].state.prevH,\r\n };\r\n this.updatePreviewRectSize(newSize);\r\n };\r\n\r\n onToggle = (key) => {\r\n let keyExtender = key.startsWith(\"show\") ? \"\" : this.props.fileId;\r\n //e.g. \"showMiniMap\", true\r\n if (this.props.showFullscreen) {\r\n this.props.persistentStorage.save(\r\n key + \"Full\" + keyExtender,\r\n !this.state[key]\r\n );\r\n } else {\r\n this.props.persistentStorage.save(key + keyExtender, !this.state[key]);\r\n }\r\n\r\n this.setMountedState({ [key]: !this.state[key] });\r\n };\r\n\r\n getLayoutElement = (key) => {\r\n //used to get e.g. \"showMiniMap\" via rendererRef\r\n return this.state[key];\r\n };\r\n\r\n checkMiniMapVisivility = () => {\r\n const { hideMiniMap, showMiniMap } = this.state;\r\n const hideMiniMapThresholdWidth = 600;\r\n const hideMiniMapThresholdHeight = 400;\r\n const hideRestrictions =\r\n this.canvas.width < hideMiniMapThresholdWidth ||\r\n this.canvas.height < hideMiniMapThresholdHeight;\r\n let saveString = \"hideMiniMap\" + this.props.fileId;\r\n if (this.props.showFullscreen) {\r\n saveString = \"hideMiniMapFull\" + this.props.fileId;\r\n }\r\n if (hideRestrictions && !hideMiniMap && showMiniMap) {\r\n this.props.persistentStorage.save(saveString, true);\r\n this.onToggle(\"showMiniMap\");\r\n this.setMountedState({ hideMiniMap: true });\r\n } else if (!hideRestrictions && hideMiniMap && !showMiniMap) {\r\n this.props.persistentStorage.save(saveString, false);\r\n this.onToggle(\"showMiniMap\");\r\n this.setMountedState({ hideMiniMap: false });\r\n } else if (!hideRestrictions && hideMiniMap && showMiniMap) {\r\n this.props.persistentStorage.save(saveString, false);\r\n this.setMountedState({ hideMiniMap: false });\r\n }\r\n };\r\n\r\n render = () => {\r\n const { classes, fileId, project, ome, showTimeBar } = this.props;\r\n\r\n const {\r\n miniMapKey,\r\n scaleBarData,\r\n open,\r\n anchorEl,\r\n displayTimeBar,\r\n displayZStackBar,\r\n showMiniMap,\r\n showScaleBar,\r\n showZStackBar,\r\n showImageInfo,\r\n showZoomBar,\r\n showResultTable,\r\n showFileNavButtons,\r\n } = this.state;\r\n\r\n return (\r\n
    (this.container = el)}>\r\n \r\n {({ TransitionProps }) => (\r\n \r\n \r\n \r\n {ome && typeof ome.physicalSizeX !== \"undefined\" && (\r\n \r\n )}\r\n {displayTimeBar && (\r\n \r\n )}\r\n {displayZStackBar && (\r\n \r\n )}\r\n \r\n {!(\r\n this.props.project.type.includes(\"HistoClassification\") ||\r\n this.props.project.type.includes(\"HistoPointCounting\")\r\n ) && (\r\n \r\n )}\r\n \r\n \r\n \r\n )}\r\n \r\n\r\n {this.props.splitscreenCount !== 1 && !this.props.showFullscreen && (\r\n \r\n \r\n this.setMountedState({\r\n open: !this.state.open,\r\n anchorEl: e.target,\r\n })\r\n }\r\n >\r\n \r\n \r\n \r\n )}\r\n
    \r\n event.preventDefault()}\r\n onMouseDown={this.mousedown}\r\n onMouseMove={this.onCanvasMouseMove}\r\n onMouseLeave={this.onCanvasMouseLeave}\r\n />\r\n {(this.state.isLoadingTiles ||\r\n this.props.projectContext.isLoadingAnnotations) && (\r\n \r\n )}\r\n {FPS && (\r\n

    \r\n {this.state.fps + \" FPS\"}\r\n

    \r\n )}\r\n {!this.state.initialized && (\r\n \r\n )}\r\n {this.props.tools[this.props.activeTool] &&\r\n this.props.tools[this.props.activeTool].previewRect &&\r\n this.props.tools[this.props.activeTool].state.preview && (\r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n )}\r\n {this.state.initialized &&\r\n showMiniMap &&\r\n !this.props.resultTab.getZoomLevelFixed() && (\r\n (this.miniMapRef = c)}\r\n fileId={fileId}\r\n key={miniMapKey}\r\n pointerEvents={\r\n !(\r\n this.canvas.style.cursor !== \"default\" ||\r\n this.props.drawLayer.regionRois.length > 0\r\n )\r\n }\r\n ome={this.props.ome}\r\n histogramConfig={this.props.histogramConfig}\r\n visibleImage={this.props.tiles.getVisibleImages()}\r\n coloredImages={this.props.tiles.getColoredImages()}\r\n position={this.getPosition()}\r\n zoom={this.getScale()}\r\n canvas={this.canvas}\r\n canvasId={this.props.canvasId}\r\n onMoveTo={this.moveTo}\r\n onScaleOnly={this.onScaleOnly}\r\n getPageForChannel={this.getPageForChannel}\r\n chainMouseMove={this.chainMouseMove}\r\n zoomMouseWheel={this.miniMapZoom}\r\n />\r\n )}\r\n\r\n {this.state.initialized && showZoomBar && (\r\n this.zoomToFactor(v)}\r\n clickable={\r\n !(\r\n project.type.includes(\"HistoClassification\") ||\r\n project.type.includes(\"HistoPointCounting\")\r\n )\r\n }\r\n />\r\n )}\r\n {this.state.initialized && showScaleBar && (\r\n 0\r\n )\r\n }\r\n zoom={this.getScale()}\r\n ome={this.props.ome}\r\n setScaleBarData={(data) => {\r\n if (\r\n scaleBarData === null ||\r\n scaleBarData.width !== data.width ||\r\n scaleBarData.label !== data.label ||\r\n scaleBarData.x !== data.x ||\r\n scaleBarData.y !== data.y\r\n ) {\r\n if (data) {\r\n this.setMountedState({ scaleBarData: data });\r\n }\r\n }\r\n }}\r\n />\r\n )}\r\n \r\n {this.state.initialized && showTimeBar && (\r\n \r\n )}\r\n {this.state.initialized &&\r\n showZStackBar &&\r\n this.props.ome.sizeZ > 1 && (\r\n 0\r\n )\r\n }\r\n z={this.state.z}\r\n minZ={this.state.minZ}\r\n maxZ={this.state.maxZ}\r\n playing={this.state.playingZ}\r\n onPlayPause={this.onPlayPauseZ}\r\n zsr={this.state.zsr}\r\n onChangeZ={this.onChangeZ}\r\n onChangeZValue={this.onChangeZValue}\r\n onChangeZSr={this.onChangeZSr}\r\n playDirection={this.state.playDirectionZ}\r\n ome={this.props.ome}\r\n onStep={this.onStepZ}\r\n />\r\n )}\r\n {this.state.initialized && showImageInfo && (\r\n \r\n )}\r\n {this.state.initialized && showResultTable && (\r\n \r\n )}\r\n\r\n {showFileNavButtons && (\r\n \r\n
    \r\n \r\n \r\n {\r\n this.props.openPrevFile();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n
    \r\n\r\n
    \r\n ]\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n )}\r\n \r\n );\r\n };\r\n}\r\n\r\n// define the component's interface\r\nRenderer.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n projectContext: PropTypes.object,\r\n project: PropTypes.object,\r\n tools: PropTypes.array,\r\n allRoiLayers: PropTypes.object,\r\n viewerConfig: PropTypes.object,\r\n structures: PropTypes.array,\r\n rightSpace: PropTypes.number,\r\n updateProject: PropTypes.func,\r\n setSelectedRoi: PropTypes.func,\r\n fsChain: PropTypes.func,\r\n onChangeChain: PropTypes.func,\r\n onSelectFile: PropTypes.func,\r\n // to access the componenents ref through withStyles\r\n componentRef: PropTypes.func,\r\n // meta data stuff\r\n id: PropTypes.string,\r\n ome: PropTypes.object,\r\n histogramConfig: PropTypes.object,\r\n // roi draing\r\n rois: PropTypes.array,\r\n onChangeROIs: PropTypes.func,\r\n // tool stuff\r\n activeTool: PropTypes.string,\r\n // view layout stuff\r\n showGallery: PropTypes.bool,\r\n showZStackBar: PropTypes.bool,\r\n showTimeBar: PropTypes.bool,\r\n resultTabActive: PropTypes.func,\r\n // roiLayers\r\n roiLayers: PropTypes.array,\r\n drawLayer: PropTypes.object,\r\n commentLayer: PropTypes.object,\r\n landmarkLayers: PropTypes.object,\r\n landmarkLayer: PropTypes.object,\r\n selectedLayer: PropTypes.number,\r\n opacity: PropTypes.number,\r\n // from withTiles\r\n tiles: PropTypes.object,\r\n dimensionsUpdated: PropTypes.bool,\r\n updateGlobalZ: PropTypes.func,\r\n updateGlobalT: PropTypes.func,\r\n //splitscreen stuff\r\n splitscreenCount: PropTypes.number,\r\n splitscreenFileIds: PropTypes.array,\r\n isChained: PropTypes.bool,\r\n chainListFileIds: PropTypes.object,\r\n isActive: PropTypes.bool,\r\n canvasId: PropTypes.string,\r\n rendererDict: PropTypes.object,\r\n fileId: PropTypes.string,\r\n projectId: PropTypes.string,\r\n activeFileId: PropTypes.string,\r\n displayTimeBar: PropTypes.bool,\r\n displayZStackBar: PropTypes.bool,\r\n loadedAnnotationsCounter: PropTypes.number,\r\n frameArrayDict: PropTypes.object,\r\n resultTab: PropTypes.object,\r\n persistentStorage: PropTypes.object,\r\n showFullscreen: PropTypes.bool,\r\n setChangingFile: PropTypes.func,\r\n //not ordered\r\n splitscreenIdx: PropTypes.number,\r\n changeHiConfig: PropTypes.func,\r\n onChangeTool: PropTypes.func,\r\n zoomROI: PropTypes.bool,\r\n zoomLeft: PropTypes.number,\r\n zoomRight: PropTypes.number,\r\n zoomTop: PropTypes.number,\r\n zoomBottom: PropTypes.number,\r\n tzoomROI1: PropTypes.func,\r\n changingFile: PropTypes.bool,\r\n showGridLabels: PropTypes.bool,\r\n showMarks: PropTypes.bool,\r\n selectedROI: PropTypes.object,\r\n showWindowTool: PropTypes.bool,\r\n windowToolRef: PropTypes.object,\r\n timeLineHeight: PropTypes.number,\r\n resizeTimeLine: PropTypes.func,\r\n spinloader: PropTypes.object,\r\n openNextFile: PropTypes.func,\r\n openPrevFile: PropTypes.func,\r\n updateVisibleROIDebounced: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default withPersistentStorage(\r\n withTiles(withResultTab(withSpinloader(withStyles(styles)(Renderer))))\r\n);\r\n","// Copyright HS Analysis GmbH, 2021\r\n// Author: Viktor Eberhardt, Timo Koch\r\n\r\n// Framework imports\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// Material UI imports\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\r\nimport MuiAccordion from \"@mui/material/Accordion\";\r\nimport MuiAccordionDetails from \"@mui/material/AccordionDetails\";\r\nimport MuiAccordionSummary from \"@mui/material/AccordionSummary\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport Backend from \"../../../common/utils/Backend\";\r\n// import CircularProgress from \"@mui/material/CircularProgress\";\r\n\r\n// HSA imports\r\nimport { withAllViewerContexts } from \"../../contexts/AllViewerContexts\";\r\nimport { withPersistentStorage } from \"../../contexts/PersistentStorageContext\";\r\n\r\nconst Accordion = withStyles({\r\n root: {\r\n border: \"1px solid rgba(0, 0, 0, .125)\",\r\n boxShadow: \"none\",\r\n \"&:not(:last-child)\": {\r\n borderBottom: 0,\r\n },\r\n \"&:before\": {\r\n display: \"none\",\r\n },\r\n \"&$expanded\": {\r\n margin: \"auto\",\r\n },\r\n },\r\n expanded: {},\r\n})(MuiAccordion);\r\n\r\nconst AccordionSummary = withStyles({\r\n root: {\r\n backgroundColor: \"rgba(0, 0, 0, .03)\",\r\n borderBottom: \"1px solid rgba(0, 0, 0, .125)\",\r\n marginBottom: -1,\r\n minHeight: 56,\r\n \"&$expanded\": {\r\n minHeight: 56,\r\n },\r\n },\r\n content: {\r\n \"&$expanded\": {\r\n margin: \"12px 0\",\r\n },\r\n },\r\n expanded: {},\r\n})(MuiAccordionSummary);\r\n\r\nconst AccordionDetails = withStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(2),\r\n },\r\n}))(MuiAccordionDetails);\r\n\r\nconst styles = {\r\n root: {\r\n width: \"100%\",\r\n },\r\n};\r\nlet usableModels = {};\r\n\r\nclass SideBarTabAISelectByModel extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.selectedModels = [];\r\n this.aiCockpitLoaded = false;\r\n this.state = {\r\n expandedIdx: -1, //nothing expanded on mount\r\n export: false,\r\n delete: false,\r\n init: false,\r\n };\r\n }\r\n\r\n componentDidUpdate = () => {\r\n if (this.props.formDataAICockpit && !this.aiCockpitLoaded) {\r\n this.aiCockpitLoaded = true;\r\n this.init();\r\n }\r\n\r\n this.updateModelCheckboxes();\r\n };\r\n\r\n modelIsSelected = (modelName) => {\r\n return this.selectedModels.indexOf(modelName) > -1;\r\n };\r\n\r\n /**\r\n * Evaluate all AI model checkboxes, if they should be checked or not.\r\n * Models for a structure with an appointed model should be deactivated.\r\n * Needed values are stored in props.\r\n */\r\n updateModelCheckboxes = () => {\r\n const { formDataAICockpit } = this.props;\r\n let checkboxesChanged = false;\r\n if (formDataAICockpit) {\r\n // Iterate over all present models\r\n for (const [key, model] of Object.entries(usableModels)) {\r\n let modelIsDisabled = false;\r\n let modelIsChecked = false;\r\n\r\n // Iterate over all possible structures of each model\r\n for (let usableStructure of model.usableStructures) {\r\n // Get current state of currently viewed possible structure of current model\r\n let selectedModel =\r\n formDataAICockpit[usableStructure.id].selectedModel;\r\n let structureIsChecked = usableStructure.isChecked;\r\n let structureIsDisabled = usableStructure.isDisabled;\r\n\r\n // A model has already been assigned to the current structure\r\n if (selectedModel !== null) {\r\n structureIsChecked = true;\r\n\r\n // It is the same as the current model\r\n if (key === selectedModel) {\r\n modelIsChecked = true;\r\n structureIsDisabled = false;\r\n }\r\n // It is a different model\r\n else {\r\n structureIsDisabled = true;\r\n modelIsDisabled = true;\r\n }\r\n }\r\n // No model selected for this structure\r\n else {\r\n structureIsChecked = false;\r\n structureIsDisabled = false;\r\n }\r\n\r\n // Update usable structure attibutes\r\n if (\r\n structureIsChecked !== usableStructure.isChecked ||\r\n structureIsDisabled !== usableStructure.isDisabled\r\n ) {\r\n usableStructure.isDisabled = structureIsDisabled;\r\n usableStructure.isChecked = structureIsChecked;\r\n checkboxesChanged = true;\r\n }\r\n }\r\n\r\n // Update model attributes\r\n if (\r\n modelIsDisabled !== model.isDisabled ||\r\n modelIsChecked !== model.isChecked\r\n ) {\r\n model.isDisabled = modelIsDisabled;\r\n model.isChecked = modelIsChecked;\r\n checkboxesChanged = true;\r\n }\r\n }\r\n if (checkboxesChanged) {\r\n this.updateSelectedTool();\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Runs all checks when component initializes or updates.\r\n */\r\n init = () => {\r\n const { structures, formDataAICockpit, availableModels } = this.props;\r\n usableModels = {};\r\n\r\n for (let row of Object.values(formDataAICockpit)) {\r\n // Filter models per structure\r\n let availableModelsForStructure =\r\n this.props.getAvailableModelsForStructure(\r\n availableModels,\r\n row.fullStructure\r\n );\r\n\r\n // Extract necessary information from structure\r\n let usableStructure = {\r\n id: row.fullStructure.id,\r\n structurePath: row.fullStructure.label,\r\n name: row.fullStructure.label,\r\n isChecked: false,\r\n isDisabled: false,\r\n };\r\n\r\n // Find the topmost parent and build the structure path name as follows:\r\n // Top - Intermediate - Intermediate - Target Structure\r\n let parentId = row.fullStructure.parentId;\r\n let findParentId = (structure) => structure.id === parentId;\r\n while (parentId > 0) {\r\n let parentStructure = structures.find(findParentId);\r\n if (parentStructure) {\r\n usableStructure.structurePath =\r\n parentStructure.label + \" - \" + usableStructure.structurePath;\r\n\r\n parentId = parentStructure.parentId;\r\n } else {\r\n parentId = -1;\r\n }\r\n }\r\n\r\n if (availableModelsForStructure) {\r\n // Ensure structures are assigned to models\r\n for (let model of availableModelsForStructure) {\r\n // if (model.versions.length === 0) continue;\r\n let usableStructurClone = JSON.parse(JSON.stringify(usableStructure));\r\n\r\n // In case of missing model, insert model into usable models\r\n if (!(model.settings.meta_data.name in usableModels)) {\r\n // Create new usable model from model\r\n usableModels[model.settings.meta_data.name] = {\r\n label: model.settings.meta_data.name,\r\n name: model.settings.meta_data.name,\r\n versions: [model],\r\n usableStructures: [usableStructurClone],\r\n isChecked: false,\r\n isDisabled: false,\r\n };\r\n }\r\n\r\n // In case of normal model, simply add model\r\n else {\r\n usableModels[model.settings.meta_data.name].usableStructures.push(\r\n usableStructurClone\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.updateModelCheckboxes();\r\n this.setState({ init: true });\r\n };\r\n\r\n componentDidMount = () => {\r\n if (this.props.formDataAICockpit && !this.aiCockpitLoaded) {\r\n this.aiCockpitLoaded = true;\r\n this.init();\r\n }\r\n };\r\n\r\n updateSelectedTool = () => {\r\n this.updatePersistentDefaultModels(usableModels);\r\n // No model is selected -> exit\r\n if (!(this.state.expandedIdx >= 0)) {\r\n this.props.onChangeTool(\"none\");\r\n return;\r\n }\r\n\r\n // Only modify the currently selected model\r\n // Except models with \"Hyper\" and/or \"Efficiant\" in their name -> exit\r\n let selectedModel = Object.values(usableModels)[this.state.expandedIdx];\r\n if (\r\n !selectedModel.isChecked ||\r\n selectedModel.name.includes(\"Hyper\") ||\r\n selectedModel.name.includes(\"Efficient\")\r\n ) {\r\n if (selectedModel.versions.length === 0) {\r\n this.props.onChangeTool(\"none\");\r\n return;\r\n }\r\n }\r\n\r\n for (let structure of selectedModel.usableStructures) {\r\n // Ensure that each structure only has 1 model assigned.\r\n if (structure.isDisabled || !structure.isChecked) {\r\n continue;\r\n }\r\n\r\n // Assign checked model to its structure.\r\n this.props.setAiUsedStructures(\r\n {\r\n structureName: structure.name,\r\n selectedModel: selectedModel.name,\r\n selectedVersion: selectedModel.versions[0].label,\r\n id: structure.id,\r\n },\r\n \"add\"\r\n );\r\n // No break\r\n }\r\n\r\n for (let structure of selectedModel.usableStructures) {\r\n if (structure.isDisabled || !structure.isChecked) {\r\n continue;\r\n }\r\n\r\n // Find global index of current structure\r\n let selectedLayerIdx = this.props.structures.findIndex(\r\n (item) => item.id === structure.id\r\n );\r\n\r\n // Check if in viewerless \"FilesGallery\" mode and keep current layer\r\n const fileClassification =\r\n this.props.viewerConfig.project.projectStringProperties[\"ViewerType\"] ==\r\n \"Gallery\";\r\n if (fileClassification) {\r\n selectedLayerIdx = this.props.projectContext.selectedLayer; // do not change layer for classification models\r\n }\r\n\r\n // Update selected structure and open the AI preview window for it\r\n if (selectedLayerIdx >= 0) {\r\n this.props.projectContext.setState(\r\n { selectedLayer: selectedLayerIdx },\r\n () => {\r\n this.props.onChangeTool(\"iam_ai_inference\", {\r\n selectedModel: selectedModel.name,\r\n selectedVersion: selectedModel.versions[0].label,\r\n });\r\n }\r\n );\r\n return;\r\n }\r\n break;\r\n }\r\n\r\n this.props.onChangeTool(\"none\");\r\n };\r\n\r\n updatePersistentDefaultModels = (usableModels) => {\r\n let currentDefaultModels = [];\r\n for (let model of Object.values(usableModels)) {\r\n if (model.isChecked) {\r\n currentDefaultModels.push(model.name);\r\n }\r\n }\r\n this.props.persistentStorage.saveProjectTypeValue(\r\n this.props.projectContext.project.type,\r\n \"defaultModels\",\r\n currentDefaultModels\r\n );\r\n };\r\n\r\n handleExpandingChange = (idx) => {\r\n let expandedIdx = this.state.expandedIdx === idx ? -1 : idx;\r\n this.setState({ expandedIdx }, () => this.updateSelectedTool());\r\n };\r\n\r\n onExportClick = (modelName, version) => {\r\n this.setState({ export: true });\r\n var aiModel = {\r\n Name: modelName,\r\n WeightsName: version,\r\n };\r\n Backend.exportAIModel(JSON.stringify(aiModel), (result) => {\r\n console.log(\"Success\", result);\r\n this.setState({ export: false });\r\n });\r\n };\r\n\r\n onDeleteClick = (modelName, version) => {\r\n window.openResponseDialog(\"Delete model forever?\", (response) => {\r\n if (response) {\r\n this.setState({ delete: true });\r\n var aiModel = {\r\n Name: modelName,\r\n WeightsName: version,\r\n };\r\n Backend.deleteAIModel(JSON.stringify(aiModel), (result) => {\r\n this.props.initAIFormData(false);\r\n this.setState({ delete: false });\r\n if (result.successful) {\r\n window.showSuccessSnackbar(result.information);\r\n } else {\r\n window.showErrorSnackbar(result.information);\r\n }\r\n });\r\n }\r\n });\r\n };\r\n\r\n // toggle model and uncheck all structures or check best fit structures\r\n toggleModel = (model) => {\r\n const usableStructures = usableModels[model.name].usableStructures;\r\n if (model.isChecked) {\r\n this.props.setAiUsedStructures(null, \"remove_all\");\r\n usableStructures.forEach((usableStructure) => {\r\n if (usableStructure.isChecked && !usableStructure.isDisabled) {\r\n this.props.handleChangeModel(null, usableStructure.id);\r\n }\r\n });\r\n } else {\r\n if (model.structure_indices) {\r\n const structures = this.props.structures;\r\n usableStructures.forEach((usableStructure) => {\r\n for (let idx of model.structure_indices) {\r\n if (\r\n idx < structures.length &&\r\n structures[idx].label === usableStructure.name\r\n ) {\r\n this.props.handleChangeModel(model.name, usableStructure.id);\r\n break;\r\n }\r\n }\r\n });\r\n } else if (model.structure) {\r\n let structureNameArray = model.structure.split(\",\");\r\n for (let structureName of structureNameArray) {\r\n for (let usableStructure of usableStructures) {\r\n if (!usableStructure.isChecked) {\r\n if (usableStructure.name === structureName) {\r\n this.props.handleChangeModel(model.name, usableStructure.id);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n this.props.handleChangeModel(model.name, usableStructures[0].id);\r\n }\r\n }\r\n };\r\n\r\n handleModelChange = (model, usableStructure) => {\r\n this.props.handleChangeModel(\r\n usableStructure.isChecked ? null : model.name,\r\n usableStructure.id\r\n );\r\n };\r\n\r\n render() {\r\n const { expandedIdx } = this.state;\r\n // const { classes, formDataAICockpit } = this.props;\r\n const { classes } = this.props;\r\n // const { groupPermissions, userPermissions } = this.props.projectContext;\r\n const { groupPermissions } = this.props.projectContext;\r\n\r\n return (\r\n <>\r\n
    \r\n {Object.values(usableModels).map((model, idx) => {\r\n return (\r\n this.handleExpandingChange(idx)}\r\n >\r\n }\r\n aria-label=\"Expand\"\r\n >\r\n event.stopPropagation()}\r\n onFocus={(event) => event.stopPropagation()}\r\n control={\r\n \r\n \r\n {\r\n this.toggleModel(model);\r\n this.updateModelCheckboxes();\r\n }}\r\n />\r\n \r\n \r\n }\r\n label={model.label}\r\n />\r\n \r\n \r\n {model.versions.length > 0 && expandedIdx === idx && (\r\n
    \r\n \r\n \r\n \r\n Name:\r\n {model.label}\r\n \r\n \r\n Structures:\r\n \r\n {model.usableStructures.map(\r\n (usableStructure, structureIdx) => (\r\n
    \r\n {\r\n if (\r\n model.structure_indices &&\r\n model.structure_indices.length ==\r\n model.usableStructures.length\r\n ) {\r\n for (let struct of model.usableStructures) {\r\n this.handleModelChange(\r\n model,\r\n struct\r\n );\r\n }\r\n } else {\r\n this.handleModelChange(\r\n model,\r\n usableStructure\r\n );\r\n }\r\n\r\n this.updateModelCheckboxes();\r\n }}\r\n />\r\n }\r\n label={usableStructure.structurePath}\r\n />\r\n
    \r\n )\r\n )}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n )}\r\n
    \r\n \r\n );\r\n })}\r\n
    \r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nSideBarTabAISelectByModel.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n availableModels: PropTypes.array,\r\n formDataAICockpit: PropTypes.object,\r\n structures: PropTypes.array,\r\n getAvailableModelsForStructure: PropTypes.func,\r\n handleChangeModel: PropTypes.func,\r\n handleChangeVersion: PropTypes.func,\r\n onChangeTool: PropTypes.func,\r\n projectContext: PropTypes.object,\r\n initAIFormData: PropTypes.func,\r\n setAiUsedStructures: PropTypes.func,\r\n viewerConfig: PropTypes.object,\r\n persistentStorage: PropTypes.object,\r\n};\r\n\r\nexport default withAllViewerContexts(\r\n withPersistentStorage(withStyles(styles)(SideBarTabAISelectByModel))\r\n);\r\n","// Copyright HS Analysis GmbH, 2019\r\n// Author: Viktor Eberhardt, Timo Koch\r\n\r\n// Framework imports\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// Material UI imports\r\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\r\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\r\nimport CircularProgress from \"@mui/material/CircularProgress\";\r\nimport CloudDownload from \"@mui/icons-material/CloudDownload\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport MuiAccordion from \"@mui/material/Accordion\";\r\nimport MuiAccordionDetails from \"@mui/material/AccordionDetails\";\r\nimport MuiAccordionSummary from \"@mui/material/AccordionSummary\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport PlayArrow from \"@mui/icons-material/PlayArrow\";\r\nimport PublishIcon from \"@mui/icons-material/Publish\";\r\nimport Refresh from \"@mui/icons-material/Refresh\";\r\nimport Remove from \"@mui/icons-material/Remove\";\r\nimport Select from \"@mui/material/Select\";\r\nimport Tab from \"@mui/material/Tab\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport Tabs from \"@mui/material/Tabs\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\n// HSA imports\r\nimport { withAllViewerContexts } from \"../../../viewer/contexts/AllViewerContexts\";\r\nimport Backend from \"../../../common/utils/Backend\";\r\nimport SideBarTabAISelectByModel from \"./SideBarTabAISelectByModel\";\r\nimport AiTrainingTab from \"../../../audioViewer/sidebar/AiTrainingTab\";\r\nimport Structure from \"../../../common/components/Structure\";\r\n\r\nconst Accordion = withStyles({\r\n root: {\r\n border: \"1px solid rgba(0, 0, 0, .125)\",\r\n boxShadow: \"none\",\r\n \"&:not(:last-child)\": {\r\n borderBottom: 0,\r\n },\r\n \"&:before\": {\r\n display: \"none\",\r\n },\r\n \"&$expanded\": {\r\n margin: \"auto\",\r\n },\r\n },\r\n expanded: {},\r\n})(MuiAccordion);\r\n\r\nconst AccordionSummary = withStyles({\r\n root: {\r\n backgroundColor: \"rgba(0, 0, 0, .03)\",\r\n borderBottom: \"1px solid rgba(0, 0, 0, .125)\",\r\n marginBottom: -1,\r\n minHeight: 56,\r\n \"&$expanded\": {\r\n minHeight: 56,\r\n },\r\n },\r\n content: {\r\n \"&$expanded\": {\r\n margin: \"12px 0\",\r\n },\r\n },\r\n expanded: {},\r\n})(MuiAccordionSummary);\r\n\r\nconst AccordionDetails = withStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(2),\r\n },\r\n}))(MuiAccordionDetails);\r\n\r\nconst styles = {\r\n root: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"auto 1fr\",\r\n overflow: \"hidden\",\r\n },\r\n tableContainer: {\r\n width: \"100%\",\r\n boxShadow: \"none\",\r\n },\r\n table: {\r\n width: \"100%\",\r\n },\r\n flexRowRemainingHeight: {\r\n flex: \"1 1 auto\",\r\n overflowY: \"auto\",\r\n },\r\n spinnerContainer: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n padding: \"20px\",\r\n textAlign: \"center\",\r\n },\r\n tab: {\r\n minWidth: \"100px\",\r\n minHeight: \"25px\",\r\n fontWeight: \"bold\",\r\n },\r\n tabContainer: {\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"auto 1fr\",\r\n },\r\n modelSelectionContainer: {\r\n position: \"relative\",\r\n },\r\n getOnlineModelsContainer: {\r\n textAlign: \"right\",\r\n },\r\n accordionContainer: {\r\n height: \"100%\",\r\n overflow: \"auto\",\r\n },\r\n};\r\n\r\nclass SideBarTabAI extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n activeTab: 0,\r\n online: true,\r\n isImporting: false,\r\n };\r\n try {\r\n this.state.online = props.viewerConfig.project.projectProperties.Online;\r\n } catch {\r\n console.log(\r\n \"Error: 'online' could not be read in Project Module config!\"\r\n );\r\n }\r\n this.initModelCounter = -1;\r\n this.convertedStructures = this.convertStructures(this.props.structures);\r\n }\r\n\r\n componentDidMount() {\r\n this.props.initAIFormData(false);\r\n }\r\n\r\n convertStructures = (structures) => {\r\n let convertedStructures = [];\r\n structures.forEach((structure) => {\r\n convertedStructures.push(\r\n new Structure(\r\n structure.id,\r\n structure.label,\r\n !structure.classificationSubtype,\r\n structure.color,\r\n structure.dynamic,\r\n structure.parentId > 0 ? structure.parentId : null,\r\n 0, // TODO: sameLevelRank?\r\n structure.isUnfolded,\r\n structure.visible,\r\n structure.hasChild,\r\n structure.subtypeLevel,\r\n 1, // TODO: get number of annotations from roilayers\r\n true,\r\n false,\r\n null,\r\n null\r\n )\r\n );\r\n });\r\n\r\n return convertedStructures;\r\n };\r\n\r\n setFormDataAICockpit = (formDataAICockpit) => {\r\n this.props.setAIFormData(formDataAICockpit);\r\n };\r\n\r\n checkForAvailableIAMSubtype = (structure) => {\r\n let childs = this.findChilds(structure);\r\n for (let i = 1; i < childs.length; i++) {\r\n if (childs[i].tools.length > 0) return true;\r\n }\r\n return false;\r\n };\r\n\r\n findChilds = (subType) => {\r\n const { structures } = this.props;\r\n\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id\r\n );\r\n };\r\n\r\n findClassificationSubtypes = (subType) => {\r\n const { structures } = this.props;\r\n\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n getParentIndex = (structure) => {\r\n let parentIndex = this.props.structures.findIndex(\r\n (element) => element.id === structure.parentId\r\n );\r\n return parentIndex;\r\n };\r\n\r\n findAllSubtypes = (str) => {\r\n let childs = this.findChilds(str);\r\n let allChilds = [];\r\n\r\n while (childs.length !== 0) {\r\n childs = childs.concat(this.findChilds(childs[0]));\r\n if (!allChilds.includes(childs[0])) {\r\n allChilds.push(childs[0]);\r\n }\r\n childs.shift();\r\n }\r\n\r\n return allChilds;\r\n };\r\n\r\n hideSubtypes = (subType, lv) => {\r\n if (subType.hasChild) {\r\n let childs = this.findChilds(subType);\r\n for (let i = 0; i < childs.length; i++) {\r\n this.hideSubtypes(childs[i], lv);\r\n }\r\n }\r\n // make visibility like parent\r\n if (subType.classificationSubtype && subType.subtypeLevel > lv) {\r\n let idx = this.getParentIndex(subType);\r\n subType.visible = this.props.structures[idx].visible;\r\n }\r\n subType.showSubtypes = false;\r\n subType.isUnfolded = false;\r\n this.props.projectContext.forceUpdate();\r\n };\r\n\r\n showSubtypes = (subType) => {\r\n const { structures } = this.props;\r\n for (let structure of structures) {\r\n if (structure.parentId === subType.id) {\r\n structure.isUnfolded = true;\r\n }\r\n }\r\n this.props.projectContext.setState({ structures });\r\n };\r\n\r\n /**\r\n * Assigns a given model to a given structure.\r\n * @param {string} selModel Name of model\r\n * @param {int} structureId Structure id\r\n */\r\n handleChangeModel = (selModel, structureId) => {\r\n const formDataAICockpit = this.props.formDataAICockpit;\r\n\r\n if (selModel === \"null\") {\r\n selModel = null;\r\n }\r\n\r\n // Assign model to structure\r\n formDataAICockpit[structureId].selectedModel = selModel;\r\n\r\n // Save changes\r\n this.props.setAIFormData(formDataAICockpit);\r\n };\r\n\r\n handleChangeVersion = (event, structure, selectedModel) => {\r\n if (selectedModel) {\r\n const formDataAICockpit = this.props.formDataAICockpit;\r\n const modelName = formDataAICockpit[structure].selectedModel;\r\n const versionName = event.target.value;\r\n formDataAICockpit[structure].models[selectedModel].selectedVersion =\r\n versionName;\r\n\r\n if (modelName !== null) {\r\n for (const key of Object.keys(formDataAICockpit)) {\r\n if (formDataAICockpit[key].selectedModel === modelName) {\r\n formDataAICockpit[key].selectedVersion = versionName;\r\n formDataAICockpit[key].models[selectedModel].selectedVersion =\r\n versionName;\r\n }\r\n }\r\n }\r\n const params = {\r\n selectedModel: selectedModel,\r\n selectedVersion: event.target.value,\r\n };\r\n this.props.onChangeTool(\"iam_ai_inference\", params);\r\n this.props.setAIFormData(formDataAICockpit);\r\n }\r\n };\r\n\r\n handleImportModelSelection = (e) => {\r\n let files = e.target.files;\r\n this.setState({\r\n isImporting: true,\r\n });\r\n Backend.importAIModels(files[0], (result) => {\r\n if (!result.success) {\r\n window.showErrorSnackbar(\"Import failed\");\r\n } else if (result.fileIsNew) {\r\n this.props.initAIFormData(false);\r\n window.showSuccessSnackbar(\"Successfully imported model\");\r\n } else {\r\n window.showWarningSnackbar(\"Model already exists\");\r\n }\r\n this.setState({\r\n isImporting: false,\r\n });\r\n });\r\n };\r\n\r\n handleChangeActiveTab = (event, value) => {\r\n this.setState({ activeTab: value });\r\n };\r\n\r\n getAvailableModelsForStructure = (availableModels, fullStructure) => {\r\n if (!availableModels) return null;\r\n // get models that can be used with given structure\r\n return availableModels.filter((model) => {\r\n return model.settings.structures.some((modelStructure) => {\r\n return modelStructure.label === fullStructure.label;\r\n });\r\n });\r\n };\r\n\r\n modelIncludesSubtypes = () => {\r\n // TODO: depending on naming of classification models, check if model has correct subtypes\r\n // let childs = this.findClassificationSubtypes(parentStructure);\r\n return true;\r\n };\r\n\r\n renderRow = (structure) => {\r\n const formDataAICockpit = this.props.formDataAICockpit;\r\n let selectedModel = formDataAICockpit[structure].selectedModel;\r\n const fullStructure = formDataAICockpit[structure].fullStructure;\r\n const { structures, availableModels } = this.props;\r\n\r\n // get available models for structure\r\n const availableModelsForStructure = this.getAvailableModelsForStructure(\r\n availableModels,\r\n fullStructure\r\n );\r\n const visibleVersions =\r\n selectedModel &&\r\n availableModelsForStructure &&\r\n availableModelsForStructure.length > 0 &&\r\n availableModelsForStructure.find(\r\n (c) => c.settings.meta_data.name === selectedModel\r\n );\r\n\r\n let selectedDropDownVersion =\r\n (selectedModel &&\r\n formDataAICockpit[structure].models[selectedModel] &&\r\n formDataAICockpit[structure].models[selectedModel].selectedVersion) ||\r\n \"\";\r\n\r\n if (availableModelsForStructure) {\r\n let modelIndex = availableModelsForStructure.findIndex(\r\n (item) => item.settings.meta_data.name === selectedModel\r\n );\r\n if (modelIndex < 0) {\r\n selectedModel = \"\";\r\n }\r\n }\r\n\r\n if (visibleVersions) {\r\n let versionIndex = visibleVersions.versions.findIndex(\r\n (item) => item.label === selectedDropDownVersion\r\n );\r\n if (versionIndex < 0) {\r\n selectedDropDownVersion = \"\";\r\n }\r\n } else {\r\n selectedDropDownVersion = \"\";\r\n }\r\n\r\n // make line below last classification subtype to seperate classification subtypes from substructures\r\n let lastSubtype = false;\r\n if (fullStructure.classificationSubtype) {\r\n let parentStructure = structures.filter(\r\n (element) => element.id === fullStructure.parentId\r\n );\r\n let childs = null;\r\n if (parentStructure[0]) {\r\n childs = this.findClassificationSubtypes(parentStructure[0]);\r\n }\r\n // if fullStructure is last classification subtype --> draw divider\r\n if (\r\n childs[childs.length - 1] &&\r\n fullStructure.id === childs[childs.length - 1].id\r\n ) {\r\n lastSubtype = true;\r\n }\r\n }\r\n\r\n let id = structures.findIndex((element) => element.id === +structure);\r\n\r\n if (typeof structures[id] !== \"undefined\" && structures[id].isUnfolded) {\r\n return (\r\n \r\n \r\n {fullStructure.isSubtype && fullStructure.classificationSubtype && (\r\n \r\n \r\n \r\n )}\r\n {fullStructure.isSubtype && !fullStructure.classificationSubtype && (\r\n \r\n \r\n \r\n )}\r\n\r\n {fullStructure.label}\r\n \r\n {fullStructure.hasChild && (\r\n \r\n {\r\n if (fullStructure.showSubtypes === false) {\r\n this.showSubtypes(fullStructure);\r\n fullStructure.showSubtypes = true;\r\n } else {\r\n this.hideSubtypes(\r\n fullStructure,\r\n fullStructure.subtypeLevel\r\n );\r\n fullStructure.isUnfolded = true;\r\n }\r\n }}\r\n size=\"large\"\r\n >\r\n {fullStructure.showSubtypes ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )}\r\n {!fullStructure.hasChild && }\r\n \r\n \r\n this.handleChangeModel(event.target.value, structure)\r\n }\r\n disabled={\r\n !(\r\n availableModelsForStructure &&\r\n availableModelsForStructure.length > 0\r\n )\r\n }\r\n >\r\n \r\n Select Model ...\r\n \r\n {availableModelsForStructure &&\r\n availableModelsForStructure.map((model, idx) => {\r\n if (typeof structure !== \"undefined\" || structure != null) {\r\n return (\r\n \r\n {model.settings.meta_data.name}\r\n \r\n );\r\n }\r\n return null;\r\n })}\r\n \r\n \r\n \r\n \r\n this.handleChangeVersion(event, structure, selectedModel)\r\n }\r\n disabled={!selectedModel}\r\n >\r\n {visibleVersions &&\r\n visibleVersions.versions.map((version, idx) => (\r\n \r\n {version.label}\r\n \r\n ))}\r\n \r\n \r\n \r\n );\r\n }\r\n };\r\n\r\n render() {\r\n const { classes, visible, formDataAICockpit } = this.props;\r\n const { groupPermissions, userPermissions } = this.props.projectContext;\r\n\r\n if (!visible) return null;\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n {this.state.activeTab === 0 && (\r\n \r\n
    \r\n {this.state.online && (\r\n \r\n this.props.initAIFormData(true)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n \r\n this.props.initAIFormData(false)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n\r\n {this.state.isImporting ? (\r\n \r\n ) : (\r\n \r\n \r\n \r\n document.getElementById(\"importAIModel\").click()\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n
    \r\n {this.props.modelsInitialized ? (\r\n
    \r\n
    \r\n this.props.toggleShowFirstAccordion()}\r\n >\r\n }\r\n aria-controls=\"panel1d-content\"\r\n id=\"panel1d-header\"\r\n >\r\n Select by Model\r\n \r\n \r\n {this.props.showFirstAccordion && (\r\n \r\n )}\r\n \r\n \r\n this.props.toggleShowFirstAccordion()}\r\n >\r\n }\r\n aria-controls=\"panel2d-content\"\r\n id=\"panel2d-header\"\r\n >\r\n Select by Structure \r\n \r\n \r\n \r\n {!this.props.showFirstAccordion && (\r\n \r\n \r\n \r\n Structure\r\n \r\n Model\r\n Version\r\n \r\n \r\n \r\n {formDataAICockpit &&\r\n Object.values(formDataAICockpit)\r\n .sort((a, b) =>\r\n a.structureIndex > b.structureIndex ? 1 : -1\r\n ) // sort because dictionary is sorted by structure index value\r\n .filter((item) => item !== \"null\")\r\n .map((element) =>\r\n this.renderRow(element.fullStructure.id)\r\n )}\r\n \r\n
    \r\n )}\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n ) : (\r\n
    \r\n \r\n
    \r\n )}\r\n
    \r\n )}\r\n {this.state.activeTab === 1 && (\r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nSideBarTabAI.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n viewerConfig: PropTypes.object,\r\n structures: PropTypes.array,\r\n visible: PropTypes.bool,\r\n setAIFormData: PropTypes.func,\r\n formDataAICockpit: PropTypes.object,\r\n onChangeTool: PropTypes.func,\r\n projectContext: PropTypes.object,\r\n setAvailableModels: PropTypes.func,\r\n setModelsInitialized: PropTypes.func,\r\n modelsInitialized: PropTypes.bool,\r\n availableModels: PropTypes.array,\r\n initAIFormData: PropTypes.func,\r\n showFirstAccordion: PropTypes.bool,\r\n toggleShowFirstAccordion: PropTypes.func,\r\n setAiUsedStructures: PropTypes.func,\r\n roiLayers: PropTypes.array,\r\n projectId: PropTypes.string,\r\n onSave: PropTypes.func,\r\n ome: PropTypes.object,\r\n histogramConfig: PropTypes.object,\r\n fileId: PropTypes.string,\r\n project: PropTypes.object,\r\n};\r\n\r\nexport default withAllViewerContexts(withStyles(styles)(SideBarTabAI));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport MoreVertIcon from \"@mui/icons-material/MoreVert\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport PlaylistAddIcon from \"@mui/icons-material/PlaylistAdd\";\r\nimport ArrowUpwardIcon from \"@mui/icons-material/ArrowUpward\";\r\nimport ArrowDownwardIcon from \"@mui/icons-material/ArrowDownward\";\r\nimport FileCopyIcon from \"@mui/icons-material/FileCopy\";\r\n\r\nimport {\r\n Tooltip,\r\n IconButton,\r\n Menu,\r\n MenuItem,\r\n ListItemIcon,\r\n Divider,\r\n} from \"@mui/material\";\r\nimport { GetApp, Publish } from \"@mui/icons-material\";\r\n\r\nimport { intersects } from \"../utils/PolygonUtil\";\r\nimport { withSpinloader } from \"../../common/components/Spinloader\";\r\nimport { RegionROI } from \"../utils/ROI\";\r\nimport { getContainedRegionRois } from \"../utils/StructuresUtils\";\r\nimport { downloadArrayAsFile } from \"../../common/utils/Utils\";\r\n\r\nclass ListItemOptionsMenu extends Component {\r\n state = {\r\n optionsAnchorEl: null,\r\n };\r\n\r\n handleOptionsOpen = (e) => {\r\n this.setState({ optionsAnchorEl: e.target });\r\n };\r\n\r\n handleOptionsClose = (e) => {\r\n this.setState({ optionsAnchorEl: null });\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return false;\r\n };\r\n\r\n addSubType = (e) => {\r\n const { structure, projectContext } = this.props;\r\n\r\n if (structure.subtypeLevel < 9) {\r\n projectContext.addSubType(structure);\r\n structure.showSubtypes = true;\r\n structure.hasChild = true;\r\n this.handleOptionsClose(e);\r\n }\r\n };\r\n\r\n addSubStructure = (e) => {\r\n const { structure, projectContext } = this.props;\r\n\r\n if (structure.subtypeLevel < 9) {\r\n projectContext.addSubStructure(structure);\r\n structure.showSubtypes = true;\r\n structure.hasChild = true;\r\n this.handleOptionsClose(e);\r\n }\r\n };\r\n\r\n // start export of annotations of selected structure\r\n exportAnnotations = (e) => {\r\n const { projectContext } = this.props;\r\n const { selectedLayer, structures } = projectContext;\r\n const strData = projectContext.getProjectStringInfos();\r\n const roiLayers = projectContext.roiLayers[projectContext.fileId];\r\n let rois = getContainedRegionRois(\r\n structures[selectedLayer],\r\n structures,\r\n roiLayers\r\n );\r\n let roiRegions = rois.map((regionRoi) => {\r\n return {\r\n regions: regionRoi.regions,\r\n isObject: regionRoi.isObject,\r\n };\r\n });\r\n\r\n console.log(\"roiRegions:\", roiRegions);\r\n\r\n downloadArrayAsFile(\r\n roiRegions,\r\n strData.name +\r\n \"_\" +\r\n this.props.structure.label +\r\n \"_\" +\r\n strData.date +\r\n \"_\" +\r\n roiRegions.length +\r\n \"_\" +\r\n projectContext.user +\r\n \".annhsa\"\r\n );\r\n this.handleOptionsClose(e);\r\n };\r\n\r\n // open file dialog and import structures from selcted file\r\n importAnnotations = (e) => {\r\n const { projectContext } = this.props;\r\n const { structures, selectedLayer } = projectContext;\r\n const roiLayers = projectContext.roiLayers[projectContext.fileId];\r\n let inputElem = document.createElement(\"INPUT\");\r\n inputElem.setAttribute(\"type\", \"file\");\r\n inputElem.setAttribute(\"onChange\", \"file\");\r\n inputElem.setAttribute(\"accept\", \".annhsa\");\r\n inputElem.onchange = (e) => {\r\n let files = e.target.files;\r\n if (files.length <= 0) return false;\r\n\r\n let fr = new FileReader();\r\n fr.onload = (e) => {\r\n this.props.spinloader.show();\r\n //timeout, so spinloader can start\r\n setTimeout(() => {\r\n try {\r\n let historyItem = [];\r\n const histId = structures[selectedLayer].id;\r\n let drawRegions = JSON.parse(e.target.result);\r\n let nonOverlapping = [];\r\n const tree = roiLayers[selectedLayer].tree;\r\n for (let i = 0; i < drawRegions.length; i++) {\r\n let drawRegion = drawRegions[i];\r\n const roi = new RegionROI({\r\n regions: drawRegion.regions,\r\n isObject: drawRegion.isObject,\r\n structureId: histId,\r\n });\r\n const overlappingRois = tree.search(roi.treeItem);\r\n let intersecting = false;\r\n for (let r of overlappingRois) {\r\n try {\r\n if (intersects(roi, r.roi)) {\r\n intersecting = true;\r\n break;\r\n }\r\n } catch (e) {\r\n intersecting = true;\r\n break;\r\n }\r\n }\r\n if (!intersecting) {\r\n nonOverlapping.push(roi);\r\n }\r\n }\r\n nonOverlapping.forEach((r) => {\r\n historyItem.push({ add: true, id: histId, roi: r });\r\n roiLayers[selectedLayer].layer.regionRois.push(r);\r\n tree.insert(r.treeItem);\r\n });\r\n roiLayers[selectedLayer].layer.regionRois = tree\r\n .all()\r\n .map((treeItem) => treeItem.roi);\r\n window.projectHistory.add(historyItem);\r\n } catch (e) {\r\n console.log(\"not supported error:\", e);\r\n window.showErrorSnackbar(\"File not supported!\");\r\n }\r\n this.props.spinloader.hide();\r\n });\r\n };\r\n fr.readAsText(files.item(0));\r\n };\r\n inputElem.click();\r\n inputElem.remove();\r\n this.handleOptionsClose(e);\r\n };\r\n\r\n /**\r\n * Checks if a structure can be moved in a direction.\r\n *\r\n * @param {int} direction - 1 is up -1 is down\r\n * @returns {bool} Move in this direction possible\r\n */\r\n canMoveStructure = (direction) => {\r\n const { structure, projectContext } = this.props;\r\n return projectContext.canMoveStructure(structure, direction);\r\n };\r\n\r\n /**\r\n * Moves a structure up or down in structure list\r\n *\r\n * @param {event} e\r\n * @param {int} direction - 1 is up -1 is down\r\n */\r\n moveStructure = (e, direction) => {\r\n const { structure, projectContext } = this.props;\r\n const newSelectedLayer = projectContext.moveStructure(structure, direction);\r\n if (newSelectedLayer) this.props.onSelectLayer(newSelectedLayer);\r\n this.handleOptionsClose(e);\r\n };\r\n\r\n deleteStructure = (e) => {\r\n const { structure, projectContext } = this.props;\r\n let parentId = structure.parentId;\r\n const newSelectedLayer = projectContext.deleteStructure(structure);\r\n if (newSelectedLayer) this.props.onSelectLayer(newSelectedLayer);\r\n this.handleOptionsClose(e);\r\n\r\n // check if parent still has childs\r\n let numberChilds = projectContext.structures.filter(\r\n (element) => element.parentId === parentId\r\n ).length;\r\n\r\n if (numberChilds === 0 && parentId !== 0) {\r\n let parentIdx = projectContext.structures.findIndex(\r\n (element) => element.id === parentId\r\n );\r\n projectContext.structures[parentIdx].hasChild = false;\r\n }\r\n };\r\n\r\n duplicateStructure = (e) => {\r\n const { structure, projectContext } = this.props;\r\n const newSelectedLayer = projectContext.duplicateStructure(structure);\r\n if (newSelectedLayer) this.props.onSelectLayer(newSelectedLayer);\r\n this.handleOptionsClose(e);\r\n };\r\n\r\n render() {\r\n const { structure } = this.props;\r\n\r\n const { optionsAnchorEl } = this.state;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {optionsAnchorEl && (\r\n \r\n {structure.id !== 1 && [\r\n \r\n \r\n \r\n \r\n Add subtype\r\n ,\r\n \r\n \r\n \r\n \r\n Add substructure\r\n ,\r\n \r\n \r\n \r\n \r\n Duplicate structure\r\n ,\r\n ]}\r\n\r\n \r\n \r\n \r\n \r\n Export annotations\r\n \r\n \r\n \r\n \r\n \r\n Import annotations\r\n \r\n {structure.id !== 1 && [\r\n ,\r\n this.moveStructure(e, 1)}\r\n disabled={!this.canMoveStructure(1)}\r\n >\r\n \r\n \r\n \r\n Move structure up\r\n ,\r\n this.moveStructure(e, -1)}\r\n disabled={!this.canMoveStructure(-1)}\r\n >\r\n \r\n \r\n \r\n Move structure down\r\n ,\r\n ,\r\n \r\n \r\n \r\n \r\n Delete structure\r\n ,\r\n ]}\r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nListItemOptionsMenu.propTypes = {\r\n projectContext: PropTypes.object,\r\n structure: PropTypes.object,\r\n onSelectLayer: PropTypes.func,\r\n spinloader: PropTypes.object,\r\n};\r\n\r\nexport default withSpinloader(ListItemOptionsMenu);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport SketchColorPicker from \"../../common/components/SketchColorPicker\";\r\nimport {\r\n getParentIndexLayer,\r\n getParentIndex,\r\n getContainedRegionRois,\r\n} from \"../utils/StructuresUtils\";\r\n\r\nimport {\r\n Divider,\r\n TextField,\r\n ListItemButton,\r\n ListItemText,\r\n Tooltip,\r\n IconButton,\r\n Checkbox,\r\n} from \"@mui/material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport ListItemOptionsMenu from \"./ListItemOptionsMenu\";\r\n\r\n// Icons\r\nimport VisibilityOffIcon from \"@mui/icons-material/VisibilityOff\";\r\nimport VisibilityIcon from \"@mui/icons-material/Visibility\";\r\nimport ArrowDropUpIcon from \"@mui/icons-material/ArrowDropUp\";\r\nimport ArrowDropDownIcon from \"@mui/icons-material/ArrowDropDown\";\r\nimport AccountTreeIcon from \"@mui/icons-material/AccountTree\";\r\nimport StopIcon from \"@mui/icons-material/Stop\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n listItem: {\r\n \"&.Mui-selected\": {\r\n background: \"rgba(0, 0, 0, 0.2) !important\",\r\n },\r\n },\r\n});\r\n\r\nclass ListItemSubType extends Component {\r\n textFieldRef = React.createRef();\r\n findChilds = (subType) => {\r\n const { structures } = this.props;\r\n // return all direct childs\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id\r\n );\r\n };\r\n\r\n findAllSubtypes = (str) => {\r\n // find all childs of structure (not only direct childs)\r\n let childs = this.findChilds(str);\r\n let allChilds = [];\r\n while (childs.length !== 0) {\r\n childs = childs.concat(this.findChilds(childs[0]));\r\n if (!allChilds.includes(childs[0])) {\r\n allChilds.push(childs[0]);\r\n }\r\n childs.shift();\r\n }\r\n return allChilds;\r\n };\r\n\r\n hideSubtypes = (subType, lv) => {\r\n const { structures } = this.props;\r\n // hide subtypes if not unfolded anymore in sidebar\r\n if (subType.hasChild) {\r\n let childs = this.findChilds(subType);\r\n for (let i = 0; i < childs.length; i++) {\r\n this.hideSubtypes(childs[i], lv);\r\n }\r\n }\r\n // make visibility like parent\r\n if (subType.classificationSubtype && subType.subtypeLevel > lv) {\r\n let idx = getParentIndex(subType, structures);\r\n subType.visible = structures[idx].visible;\r\n }\r\n subType.showSubtypes = false;\r\n subType.isUnfolded = false;\r\n };\r\n\r\n showSubtypes = (subType) => {\r\n const { structures } = this.props;\r\n // unfold direct subtypes of structure\r\n structures.forEach(function (element) {\r\n if (element.parentId === subType.id) {\r\n element.isUnfolded = true;\r\n }\r\n });\r\n };\r\n\r\n visibilitySubtypesOff = (subType) => {\r\n // set visibility of rois in viewer of subtypes to invisible\r\n if (subType.hasChild) {\r\n let childs = this.findChilds(subType);\r\n for (let i = 0; i < childs.length; i++) {\r\n this.visibilitySubtypesOff(childs[i]);\r\n }\r\n }\r\n subType.visible = false;\r\n };\r\n\r\n visibilitySubtypesOn = (subType) => {\r\n // set visibility of rois in viewer of subtypes to visible\r\n if (subType.hasChild) {\r\n let childs = this.findChilds(subType);\r\n for (let i = 0; i < childs.length; i++) {\r\n this.visibilitySubtypesOn(childs[i]);\r\n }\r\n }\r\n subType.visible = true;\r\n };\r\n\r\n itemClicked = () => {\r\n const {\r\n structures,\r\n onChangeTool,\r\n activeTool,\r\n showGallery,\r\n updateStructureChange,\r\n onSelectLayer,\r\n subType,\r\n } = this.props;\r\n if (activeTool && activeTool.startsWith(\"iam_\")) {\r\n onChangeTool(\"none\");\r\n }\r\n if (showGallery) {\r\n updateStructureChange();\r\n }\r\n\r\n onSelectLayer(structures.findIndex((element) => element.id === subType.id));\r\n this.props.tiles.setStructure(subType);\r\n this.forceUpdate();\r\n };\r\n\r\n adaptRois = (str, newName) => {\r\n const { roiLayers, structures } = this.props;\r\n // change subtypename of rois\r\n let parentIdxLayer = getParentIndexLayer(str, structures);\r\n roiLayers[parentIdxLayer].layer.regionRois.forEach((element) => {\r\n if (element.structureId === str.id) {\r\n element.subtypeName = newName;\r\n }\r\n });\r\n };\r\n\r\n render() {\r\n const {\r\n roiLayers,\r\n selectedLayer,\r\n structures,\r\n projectContext,\r\n onChangeLayers,\r\n updateViewer,\r\n // item specific\r\n subType,\r\n parent,\r\n i,\r\n onSelectLayer,\r\n classes,\r\n renderLocation,\r\n formData,\r\n allStructuresEnabled,\r\n } = this.props;\r\n\r\n // only draw if it is in subtypes of parent\r\n if (\r\n renderLocation == \"SideBarTabRois\" &&\r\n !this.findAllSubtypes(parent).includes(subType)\r\n ) {\r\n return
    ;\r\n }\r\n\r\n // calculate if draw divider to seperate substructures from classification subtypes\r\n let drawDivider = false;\r\n let parentIndex = structures.findIndex(\r\n (element) => element.id === subType.parentId\r\n );\r\n let childs = this.findChilds(structures[parentIndex]);\r\n let subStructures = childs.filter(\r\n (element) => !element.classificationSubtype\r\n );\r\n if (subStructures.length !== 0) {\r\n // parent has substructures\r\n let classificationChilds = childs.filter(\r\n (element) => element.classificationSubtype\r\n );\r\n // if subType is first classification subtype --> draw divider\r\n if (\r\n classificationChilds[classificationChilds.length - 1] &&\r\n subType.label ===\r\n classificationChilds[classificationChilds.length - 1].label\r\n ) {\r\n drawDivider = true;\r\n }\r\n }\r\n\r\n const index = structures.findIndex((element) => element.id === subType.id);\r\n\r\n let numberOfObjects = getContainedRegionRois(\r\n subType,\r\n structures,\r\n roiLayers\r\n ).length;\r\n\r\n // check if structure is unfolded/visible in sidebar\r\n if (!subType.isUnfolded && renderLocation == \"SideBarTabRois\") {\r\n return null;\r\n }\r\n\r\n return (\r\n {\r\n this.listItemRef = el;\r\n }}\r\n style={{\r\n height: 48,\r\n width: \"100%\",\r\n }}\r\n >\r\n {(renderLocation == \"AI-Cockpit\" ||\r\n this.props.isInView(this.listItemRef) > 0) && (\r\n
    \r\n element.id === subType.id\r\n ) && renderLocation == \"SideBarTabRois\"\r\n }\r\n className={classes.listItem}\r\n style={{\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n }}\r\n onClick={() => {\r\n if (renderLocation == \"SideBarTabRois\") {\r\n this.itemClicked();\r\n }\r\n }}\r\n >\r\n {renderLocation == \"AI-Cockpit\" && (\r\n {\r\n this.props.updateFormDataStructures(\r\n structures[subType.index],\r\n e.currentTarget.checked\r\n );\r\n }}\r\n checked={\r\n formData.selStructures.findIndex(\r\n (item) => item.id === structures[subType.index].id\r\n ) > -1\r\n }\r\n />\r\n )}\r\n\r\n \r\n {subType.classificationSubtype ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n {selectedLayer === index ? (\r\n \r\n \r\n {\r\n if (\r\n e.target.value.includes(\"_\") ||\r\n e.target.value.includes(\"/\")\r\n ) {\r\n window.showWarningSnackbar(\r\n \"Do no use / and _ inside structure names.\"\r\n );\r\n return; // do not allow these signs in structure label\r\n }\r\n // update rois and structure\r\n this.adaptRois(subType, e.target.value);\r\n subType.label = e.target.value;\r\n projectContext.forceUpdate();\r\n }}\r\n onBlur={() => {\r\n projectContext.sendStructures(\r\n projectContext.structures\r\n );\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n this.textFieldRef.current.blur();\r\n }\r\n }}\r\n InputProps={{\r\n disableUnderline: true,\r\n }}\r\n />\r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n {subType.label}\r\n
    \r\n }\r\n />\r\n \r\n \r\n )}\r\n {subType.hasChild && renderLocation == \"SideBarTabRois\" && (\r\n {\r\n if (subType.showSubtypes === false) {\r\n this.showSubtypes(subType);\r\n subType.showSubtypes = true;\r\n } else {\r\n this.hideSubtypes(subType, subType.subtypeLevel);\r\n subType.isUnfolded = true;\r\n }\r\n setTimeout(() => {\r\n this.props.forceSidebarUpdate();\r\n }, 10);\r\n }}\r\n size=\"large\"\r\n >\r\n {subType.showSubtypes ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n )}\r\n {renderLocation == \"SideBarTabRois\" && (\r\n \r\n {\r\n subType.visible = !subType.visible;\r\n if (!subType.visible) {\r\n this.visibilitySubtypesOff(subType);\r\n } else {\r\n this.visibilitySubtypesOn(subType);\r\n }\r\n this.forceUpdate();\r\n onChangeLayers(roiLayers);\r\n }}\r\n size=\"large\"\r\n >\r\n {subType.visible ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )}\r\n\r\n {\r\n subType.color = color;\r\n // adjust roi color\r\n let parLayer = getParentIndexLayer(subType, structures);\r\n roiLayers[parLayer].layer.regionRois.forEach(function (\r\n element\r\n ) {\r\n if (\r\n subType.classificationSubtype &&\r\n element.subtypeName === subType.label\r\n ) {\r\n element.color = color;\r\n }\r\n if (\r\n !subType.classificationSubtype &&\r\n element.subtypeName === \"\"\r\n ) {\r\n element.color = color;\r\n }\r\n });\r\n updateViewer();\r\n projectContext.sendStructures(structures);\r\n }}\r\n />\r\n {!this.props.viewerConfig.project.projectProperties[\r\n \"HideSubMenus\"\r\n ] &&\r\n renderLocation == \"SideBarTabRois\" && (\r\n \r\n )}\r\n \r\n {drawDivider && }\r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nListItemSubType.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n structures: PropTypes.array,\r\n roiLayers: PropTypes.array,\r\n onChangeTool: PropTypes.func,\r\n activeTool: PropTypes.string,\r\n showGallery: PropTypes.bool,\r\n updateStructureChange: PropTypes.func,\r\n projectContext: PropTypes.object,\r\n viewerConfig: PropTypes.object,\r\n tiles: PropTypes.object,\r\n onChangeLayers: PropTypes.func,\r\n updateViewer: PropTypes.func,\r\n onSelectLayer: PropTypes.func,\r\n isAdmin: PropTypes.bool,\r\n // item specific\r\n subType: PropTypes.object,\r\n parent: PropTypes.object,\r\n i: PropTypes.number,\r\n selectedLayer: PropTypes.number,\r\n isInView: PropTypes.func,\r\n forceSidebarUpdate: PropTypes.func,\r\n renderLocation: PropTypes.string,\r\n updateFormDataStructures: PropTypes.func,\r\n formData: PropTypes.object,\r\n allStructuresEnabled: PropTypes.bool,\r\n};\r\n\r\nexport default withStyles(styles)(ListItemSubType);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport SketchColorPicker from \"../../common/components/SketchColorPicker\";\r\n\r\nimport ListItemOptionsMenu from \"./ListItemOptionsMenu\";\r\n\r\nimport {\r\n TextField,\r\n ListItemText,\r\n Tooltip,\r\n IconButton,\r\n Checkbox,\r\n ListItemButton,\r\n} from \"@mui/material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\n// Icons\r\nimport VisibilityOffIcon from \"@mui/icons-material/VisibilityOff\";\r\nimport VisibilityIcon from \"@mui/icons-material/Visibility\";\r\nimport ArrowDropUpIcon from \"@mui/icons-material/ArrowDropUp\";\r\nimport ArrowDropDownIcon from \"@mui/icons-material/ArrowDropDown\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n listItem: {\r\n \"&.Mui-selected\": {\r\n background: \"rgba(0, 0, 0, 0.2) !important\",\r\n },\r\n },\r\n structureInput: {\r\n \"& >div\": {\r\n width: \"100%\",\r\n },\r\n \"& input\": {\r\n textOverflow: \"ellipsis\",\r\n overflow: \"hidden\",\r\n whiteSpace: \"nowrap\",\r\n },\r\n },\r\n});\r\n\r\nclass ListItemStructure extends Component {\r\n state = {\r\n optionsAnchorEl: null,\r\n };\r\n\r\n findChilds = (subType) => {\r\n const { structures } = this.props;\r\n // return all direct childs\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id\r\n );\r\n };\r\n\r\n getParentIndex = (structure) => {\r\n // return index of parent structure\r\n let parentIndex = this.props.structures.findIndex(\r\n (element) => element.id === structure.parentId\r\n );\r\n return parentIndex;\r\n };\r\n\r\n hideSubtypes = (subType, lv) => {\r\n const { structures } = this.props;\r\n // hide subtypes if not unfolded anymore in sidebar\r\n if (subType.hasChild) {\r\n let childs = this.findChilds(subType);\r\n for (let i = 0; i < childs.length; i++) {\r\n this.hideSubtypes(childs[i], lv);\r\n }\r\n }\r\n // make visibility like parent\r\n if (subType.classificationSubtype && subType.subtypeLevel > lv) {\r\n let idx = this.getParentIndex(subType);\r\n subType.visible = structures[idx].visible;\r\n }\r\n subType.showSubtypes = false;\r\n subType.isUnfolded = false;\r\n this.props.projectContext.forceUpdate();\r\n };\r\n\r\n showSubtypes = (subType) => {\r\n const { structures } = this.props;\r\n // unfold direct subtypes of structure\r\n for (let structure of structures) {\r\n if (structure.parentId === subType.id) {\r\n structure.isUnfolded = true;\r\n }\r\n }\r\n this.props.projectContext.setState({ structures });\r\n };\r\n\r\n visibilitySubtypesOff = (subType) => {\r\n // set visibility of rois in viewer of subtypes to invisible\r\n if (subType.hasChild) {\r\n let childs = this.findChilds(subType);\r\n for (let i = 0; i < childs.length; i++) {\r\n this.visibilitySubtypesOff(childs[i]);\r\n }\r\n }\r\n subType.visible = false;\r\n this.props.projectContext.forceUpdate();\r\n };\r\n\r\n visibilitySubtypesOn = (subType) => {\r\n // set visibility of rois in viewer of subtypes to visible\r\n if (subType.hasChild) {\r\n let childs = this.findChilds(subType);\r\n for (let i = 0; i < childs.length; i++) {\r\n this.visibilitySubtypesOn(childs[i]);\r\n }\r\n }\r\n subType.visible = true;\r\n this.props.projectContext.forceUpdate();\r\n };\r\n\r\n selectStructure = (structure, index) => {\r\n this.props.onSelectLayer(index, () => {\r\n this.props.tiles.setStructure(structure);\r\n });\r\n };\r\n\r\n adaptRois = (str, newName) => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n // change subtypename of rois\r\n roiLayers[selectedLayer].layer.regionRois.forEach((element) => {\r\n if (element.structureId === str.id) {\r\n element.subtypeName = newName;\r\n }\r\n });\r\n };\r\n\r\n render() {\r\n const {\r\n selectedLayer,\r\n roiLayers,\r\n classes,\r\n projectContext,\r\n onChangeLayers,\r\n updateViewer,\r\n onSelectLayer,\r\n // item props\r\n structure,\r\n index,\r\n textInputRef,\r\n setTextInputRef,\r\n renderLocation,\r\n structures,\r\n formData,\r\n allStructuresEnabled,\r\n } = this.props;\r\n\r\n return (\r\n {\r\n if (renderLocation == \"SideBarTabRois\") {\r\n this.selectStructure(structure, index);\r\n }\r\n }}\r\n >\r\n {renderLocation == \"AI-Cockpit\" && (\r\n {\r\n this.props.updateFormDataStructures(\r\n structures[structure.index],\r\n e.currentTarget.checked\r\n );\r\n }}\r\n checked={\r\n formData.selStructures.findIndex(\r\n (item) => item.id === structures[structure.index].id\r\n ) > -1\r\n }\r\n />\r\n )}\r\n\r\n {selectedLayer === index ? (\r\n \r\n \r\n {\r\n if (\r\n e.target.value.includes(\"_\") ||\r\n e.target.value.includes(\"/\")\r\n ) {\r\n window.showWarningSnackbar(\r\n \"Do no use / and _ inside structure names.\"\r\n );\r\n return; // do not allow these signs in structure label\r\n }\r\n // update rois and structure\r\n this.adaptRois(structure, e.target.value);\r\n structure.label = e.target.value;\r\n projectContext.forceUpdate();\r\n }}\r\n onBlur={() => {\r\n projectContext.sendStructures(projectContext.structures);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n textInputRef.blur();\r\n }\r\n }}\r\n inputRef={setTextInputRef}\r\n InputProps={{\r\n disableUnderline: true,\r\n }}\r\n />\r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n {structure.label || \"Brightfield\"}\r\n \r\n }\r\n />\r\n \r\n \r\n )}\r\n\r\n {structure.hasChild && renderLocation == \"SideBarTabRois\" && (\r\n {\r\n if (structure.showSubtypes === false) {\r\n this.showSubtypes(structure);\r\n structure.showSubtypes = true;\r\n } else {\r\n this.hideSubtypes(structure, structure.subtypeLevel);\r\n structure.isUnfolded = true;\r\n }\r\n setTimeout(() => {\r\n this.props.forceSidebarUpdate();\r\n }, 10);\r\n }}\r\n size=\"large\"\r\n >\r\n {structure.showSubtypes ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n )}\r\n {renderLocation == \"SideBarTabRois\" && (\r\n \r\n {\r\n structure.visible = !structure.visible;\r\n if (!structure.visible) {\r\n this.visibilitySubtypesOff(structure);\r\n } else {\r\n this.visibilitySubtypesOn(structure);\r\n }\r\n this.forceUpdate();\r\n onChangeLayers(roiLayers);\r\n e.stopPropagation();\r\n }}\r\n size=\"large\"\r\n >\r\n {structure.visible ? : }\r\n \r\n \r\n )}\r\n\r\n {structure.color !== -1 && (\r\n {\r\n structure.color = color;\r\n // adjust roi color\r\n roiLayers[selectedLayer].layer.regionRois.forEach(function (\r\n element\r\n ) {\r\n if (element.subtypeName === \"\") {\r\n element.color = color;\r\n }\r\n });\r\n updateViewer();\r\n projectContext.sendStructures(structures);\r\n }}\r\n />\r\n )}\r\n {!this.props.viewerConfig.project.projectProperties[\"HideSubMenus\"] &&\r\n renderLocation == \"SideBarTabRois\" && (\r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nListItemStructure.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n roiLayers: PropTypes.array,\r\n structures: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n projectContext: PropTypes.object,\r\n viewerConfig: PropTypes.object,\r\n onChangeLayers: PropTypes.func,\r\n updateViewer: PropTypes.func,\r\n isAdmin: PropTypes.bool,\r\n // item specific\r\n structure: PropTypes.object,\r\n tiles: PropTypes.object,\r\n index: PropTypes.number,\r\n activeTool: PropTypes.string,\r\n textInputRef: PropTypes.object,\r\n setTextInputRef: PropTypes.func,\r\n onChangeTool: PropTypes.func,\r\n showGallery: PropTypes.bool,\r\n updateStructureChange: PropTypes.func,\r\n onSelectLayer: PropTypes.func,\r\n forceSidebarUpdate: PropTypes.func,\r\n renderLocation: PropTypes.string,\r\n updateFormDataStructures: PropTypes.func,\r\n formData: PropTypes.object,\r\n allStructuresEnabled: PropTypes.bool,\r\n};\r\n\r\nexport default withStyles(styles)(ListItemStructure);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport {\r\n getParentIndexLayer,\r\n getContainedRegionRois,\r\n} from \"../../../viewer/utils/StructuresUtils\";\r\n\r\nimport {\r\n TextField,\r\n Grid,\r\n List,\r\n ListItem,\r\n ListItemButton,\r\n ListItemText,\r\n Typography,\r\n Tooltip,\r\n FormHelperText,\r\n Slider,\r\n IconButton,\r\n FormControl,\r\n Select,\r\n MenuItem,\r\n} from \"@mui/material\";\r\n\r\nimport {\r\n Delete,\r\n VisibilityOff,\r\n GetApp,\r\n Publish,\r\n Visibility,\r\n Add,\r\n} from \"@mui/icons-material\";\r\nimport { withAllViewerContexts } from \"../../contexts/AllViewerContexts\";\r\nimport { withTiles } from \"../../contexts/TilesContext\";\r\nimport ListItemSubType from \"../ListItemSubType\";\r\nimport ListItemStructure from \"../ListItemStructure\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n roiContainer: {\r\n padding: 20,\r\n overflowY: \"auto\",\r\n width: 355,\r\n },\r\n flexVerticalContainer: {\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"1fr auto\",\r\n },\r\n flexRowContentHeight: {\r\n padding: 10,\r\n },\r\n flexRowRemainingHeight: {\r\n overflowY: \"auto\",\r\n overflowX: \"hidden\",\r\n },\r\n spacing: {\r\n padding: 10,\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n },\r\n});\r\n\r\nclass SideBarTabRois extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n dynamicStructureText: \"\",\r\n structuresListHeight: 300,\r\n selectedStructureView: \"all\",\r\n };\r\n this.textInputRef = React.createRef();\r\n this.focusTextInput = this.focusTextInput.bind(this);\r\n this.structureRefs = [];\r\n }\r\n\r\n componentWillUnmount = () => {\r\n if (this.structureScrollList) {\r\n this.structureScrollList.removeEventListener(\r\n \"scroll\",\r\n this.handlestructureListScroll\r\n );\r\n }\r\n };\r\n\r\n handlestructureListScroll = () => {\r\n this.forceUpdate();\r\n };\r\n\r\n focusTextInput() {\r\n setTimeout(() => {\r\n if (this.textInputRef) {\r\n this.textInputRef.select();\r\n }\r\n }, 100);\r\n }\r\n\r\n countVisibleStructures = () => {\r\n return this.props.structures.reduce(\r\n (acc, cur) => acc + (cur.visible ? 1 : 0),\r\n 0\r\n );\r\n };\r\n\r\n checkToolInConfig(toolName) {\r\n if (this.props.viewerConfig) {\r\n if (this.props.viewerConfig.project.toolsInProject[toolName]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n addStructure = () => {\r\n const { roiLayers, projectContext } = this.props;\r\n const { dynamicStructureText } = this.state;\r\n // add dynamic structure\r\n if (dynamicStructureText !== \"\") {\r\n projectContext.addStructure(dynamicStructureText);\r\n this.props.onSelectLayer(roiLayers.length - 1);\r\n this.focusTextInput();\r\n this.setState({ dynamicStructureText: \"\" });\r\n }\r\n };\r\n\r\n isInView = (el) => {\r\n if (\r\n !this.structureScrollList ||\r\n this.structureScrollList.getBoundingClientRect().height === 0\r\n ) {\r\n this.structureScrollList = document.getElementById(\r\n \"StructuresListContainer\"\r\n );\r\n if (\r\n this.structureScrollList &&\r\n this.structureScrollList.getAttribute(\"listener\") !== \"true\"\r\n ) {\r\n this.structureScrollList.addEventListener(\r\n \"scroll\",\r\n this.handlestructureListScroll\r\n );\r\n }\r\n }\r\n let result = true;\r\n if (this.structureScrollList && el) {\r\n let parentTop = this.structureScrollList.getBoundingClientRect().top;\r\n let parentHeight =\r\n this.structureScrollList.getBoundingClientRect().height;\r\n let elTop = el.getBoundingClientRect().top;\r\n let elHeight = el.getBoundingClientRect().height;\r\n\r\n result = elTop + elHeight > parentTop && elTop < parentTop + parentHeight;\r\n }\r\n return result;\r\n };\r\n\r\n isStructureAndShown = (structure) => {\r\n const { roiLayers, structures } = this.props;\r\n let isVisible = !structure.isSubtype;\r\n if (this.state.selectedStructureView === \"all\") {\r\n return isVisible;\r\n }\r\n return (\r\n isVisible &&\r\n getContainedRegionRois(structure, structures, roiLayers).length > 0\r\n );\r\n };\r\n\r\n isSubtypeAndShown = (structure) => {\r\n const { roiLayers, structures } = this.props;\r\n let isVisible = structure.isSubtype && structure.subtypeLevel > 0;\r\n if (this.state.selectedStructureView === \"all\") {\r\n return isVisible;\r\n }\r\n return (\r\n isVisible &&\r\n getContainedRegionRois(structure, structures, roiLayers).length > 0\r\n );\r\n };\r\n\r\n onChangeStructureView = (e) => {\r\n const { structures } = this.props;\r\n const value = e.target.value;\r\n if (value === \"annotated\") {\r\n structures.forEach(function (element) {\r\n if (element.isSubtype) {\r\n element.isUnfolded = true;\r\n }\r\n if (element.hasChild) {\r\n element.showSubtypes = true;\r\n }\r\n });\r\n } else {\r\n structures.forEach(function (element) {\r\n if (element.isSubtype) {\r\n element.isUnfolded = false;\r\n }\r\n if (element.hasChild) {\r\n element.showSubtypes = false;\r\n }\r\n });\r\n }\r\n this.setState({ selectedStructureView: e.target.value });\r\n };\r\n\r\n render() {\r\n const {\r\n ome,\r\n rois,\r\n activeTool,\r\n roiLayers,\r\n selectedLayer,\r\n structures,\r\n visible,\r\n isAdmin,\r\n } = this.props;\r\n const { classes, ...propsWithoutClasses } = this.props;\r\n const { groupPermissions } = this.props.projectContext;\r\n\r\n const { dynamicStructureText } = this.state;\r\n\r\n if (!visible) return null;\r\n const annotatedStructureCount = roiLayers.reduce((acc, structureLayer) => {\r\n if (structureLayer.layer.regionRois.length > 0) {\r\n return acc + 1;\r\n }\r\n return acc;\r\n }, 0);\r\n\r\n return (\r\n \r\n {activeTool !== \"comment\" && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {ome\r\n ? \"All Structures (\" + roiLayers.length + \"):\"\r\n : \"Channels:\"}\r\n \r\n \r\n {ome\r\n ? \"Annotated Structures (\" +\r\n annotatedStructureCount +\r\n \"):\"\r\n : \"Channels:\"}\r\n \r\n \r\n \r\n\r\n \r\n \r\n {\r\n let selectedStructure = structures[selectedLayer];\r\n let historyItem = roiLayers[\r\n selectedLayer\r\n ].layer.regionRois.map((roi) => {\r\n return {\r\n add: false,\r\n id: structures[selectedLayer].id,\r\n roi: roi,\r\n };\r\n });\r\n window.projectHistory.add(historyItem);\r\n roiLayers[selectedLayer].layer.regionRois = [];\r\n roiLayers[selectedLayer].tree.clear();\r\n if (selectedStructure.isSubtype) {\r\n let parentIdx = getParentIndexLayer(\r\n selectedStructure,\r\n structures\r\n );\r\n roiLayers[parentIdx].layer.regionRois = roiLayers[\r\n parentIdx\r\n ].layer.regionRois.filter((regionRoi) => {\r\n if (\r\n regionRoi.subtypeName === selectedStructure.label\r\n ) {\r\n roiLayers[parentIdx].tree.remove(\r\n regionRoi.treeItem\r\n );\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n });\r\n }\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n\r\n 0\r\n ? \"Hide all structures [Shift] + [R]\"\r\n : \"Show all structures [Shift] + [R]\"\r\n }\r\n >\r\n \r\n {\r\n if (this.countVisibleStructures() > 0) {\r\n for (let roiLayer of structures) {\r\n roiLayer.visible = false;\r\n }\r\n } else {\r\n for (let roiLayer of structures) {\r\n roiLayer.visible = true;\r\n }\r\n }\r\n this.forceUpdate();\r\n }}\r\n size=\"large\"\r\n >\r\n {this.countVisibleStructures() === 0 ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n document.getElementById(\"selectFiles\").click()\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {structures.map((structure, index) => (\r\n
    \r\n {this.isStructureAndShown(structure) && (\r\n {\r\n this.structureRefs[index] = el;\r\n }}\r\n style={{\r\n height: 48,\r\n width: \"100%\",\r\n }}\r\n >\r\n {this.isInView(this.structureRefs[index]) && (\r\n (this.textInputRef = el)}\r\n isAdmin={isAdmin}\r\n renderLocation={\"SideBarTabRois\"}\r\n />\r\n )}\r\n
    \r\n )}\r\n\r\n {structure.showSubtypes &&\r\n !structure.isSubtype &&\r\n structures\r\n .filter((element) => this.isSubtypeAndShown(element))\r\n .map((subType, i) => (\r\n \r\n ))}\r\n \r\n ))}\r\n\r\n {this.props.viewerConfig.project.dynamicStructure &&\r\n groupPermissions.canEditStructures && (\r\n \r\n \r\n this.setState({\r\n dynamicStructureText: e.target.value,\r\n })\r\n }\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n this.addStructure();\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n\r\n \r\n {rois.map((roi, index) => (\r\n this.props.onCenterROI(roi)}\r\n onMouseEnter={() => this.props.onHoverROI(roi, true)}\r\n onMouseLeave={() => this.props.onHoverROI(roi, false)}\r\n >\r\n \r\n \r\n ))}\r\n \r\n
    \r\n\r\n \r\n Opacity:\r\n \r\n this.props.onChangeOpacity(newValue / 100)\r\n }\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nSideBarTabRois.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n // sidebar tab properties\r\n visible: PropTypes.bool,\r\n isAdmin: PropTypes.bool,\r\n // general properties\r\n viewerConfig: PropTypes.object,\r\n id: PropTypes.string.isRequired,\r\n ome: PropTypes.object,\r\n // roiLayers\r\n roiLayers: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n onSelectLayer: PropTypes.func,\r\n deleteforAllScenes: PropTypes.func,\r\n onCenterROI: PropTypes.func,\r\n onHoverROI: PropTypes.func,\r\n // tools\r\n activeTool: PropTypes.string,\r\n // opacity slider\r\n opacity: PropTypes.number,\r\n onChangeOpacity: PropTypes.func,\r\n // Parameterset Export Import\r\n onExportParameters: PropTypes.func,\r\n onImportParameters: PropTypes.func,\r\n // not ordered\r\n structures: PropTypes.array,\r\n projectContext: PropTypes.object,\r\n rois: PropTypes.array,\r\n};\r\n\r\nexport default withTiles(\r\n withAllViewerContexts(withStyles(styles)(SideBarTabRois))\r\n);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport classNames from \"classnames\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { withAllViewerContexts } from \"../contexts/AllViewerContexts\";\r\nimport {\r\n Grid,\r\n Typography,\r\n Tooltip,\r\n Divider,\r\n List,\r\n IconButton,\r\n} from \"@mui/material\";\r\nimport RemoveCircleIcon from \"@mui/icons-material/RemoveCircle\";\r\nimport AddCircleIcon from \"@mui/icons-material/AddCircle\";\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n fileTreeView: {\r\n width: \"100%\",\r\n margin: 0,\r\n background: \"#fff\",\r\n position: \"relative\",\r\n },\r\n sidebarHandle: {\r\n position: \"absolute\",\r\n right: 0,\r\n top: 0,\r\n bottom: 0,\r\n width: 5,\r\n background: \"#EBEBEB\",\r\n cursor: \"pointer\",\r\n \"&:hover\": {\r\n background: \"#0673C1\",\r\n },\r\n },\r\n closeButton: {\r\n position: \"absolute\",\r\n right: 5,\r\n top: 5,\r\n },\r\n expensionSummary: {\r\n marginTop: 0,\r\n marginBottom: 0,\r\n background: \"#ff0000\",\r\n },\r\n labelWrap: {\r\n paddingRight: 15,\r\n width: \"100%\",\r\n textOverflow: \"ellipsis\",\r\n overflow: \"hidden\",\r\n display: \"inline-block\",\r\n },\r\n previewImageContainer: {\r\n position: \"relative\",\r\n },\r\n importText: {\r\n padding: 5,\r\n fontWeight: \"bold\",\r\n lineHeight: \"45px\",\r\n display: \"inline-block\",\r\n },\r\n lineThrough1: {\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n pointerEvents: \"none\",\r\n background:\r\n \"linear-gradient(to bottom right, transparent calc(50% - 1px), red, transparent calc(50% + 1px) )\",\r\n },\r\n lineThrough2: {\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n pointerEvents: \"none\",\r\n background:\r\n \"linear-gradient(to top right, transparent calc(50% - 1px), red, transparent calc(50% + 1px) )\",\r\n },\r\n previewImageNotSelected: {\r\n border: \"1px solid #ccc\",\r\n },\r\n previewImageSelected: {\r\n border: \"3px solid #0673C1!important\",\r\n },\r\n previewImageInSplitscreen: {\r\n border: \"3px dashed #0673C1!important\",\r\n },\r\n fileItem: {\r\n paddingTop: 10,\r\n paddingBottom: 10,\r\n },\r\n sceneItem: {\r\n position: \"relative\",\r\n display: \"inline-block\",\r\n width: \"fit-content\",\r\n paddingLeft: \"5px\",\r\n objectFit: \"contain\",\r\n // border: \"1px solid #ccc!important\",\r\n cursor: \"pointer\",\r\n \"& button\": {\r\n padding: 0,\r\n visibility: \"hidden\",\r\n zIndex: 999999,\r\n width: 0,\r\n height: 0,\r\n },\r\n \"&:hover\": {\r\n boxShadow: \"1px 1px 2px #333\",\r\n \"& button\": {\r\n visibility: \"visible\",\r\n zIndex: 999999999999,\r\n },\r\n },\r\n },\r\n divider: {\r\n paddingLeft: 5,\r\n paddingRight: 15,\r\n },\r\n filesList: {\r\n height: \"calc(100vh - 480px)\",\r\n overflowY: \"auto\",\r\n overflowX: \"hidden\",\r\n },\r\n excludeAllContainer: {\r\n position: \"absolute\",\r\n top: 0,\r\n right: 0,\r\n },\r\n excludeButton: {\r\n position: \"absolute\",\r\n top: 0,\r\n right: 0,\r\n },\r\n});\r\n\r\nclass FileTreeView extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.overflowListRef = React.createRef(); // Create a ref object\r\n this.state = {\r\n missingThumbnails: {},\r\n currentSceneFilterIdx: 0,\r\n };\r\n this.imageListItemRefs = [];\r\n }\r\n\r\n handleScroll = (e) => {\r\n this.props.persistentStorage.save(\"files_scroll\", e.target.scrollTop);\r\n };\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n this.overflowListRef.current.addEventListener(\"scroll\", this.handleScroll);\r\n\r\n let scrollPosition = this.props.persistentStorage.load(\"files_scroll\"); //localStorage.getItem(scrollKey);\r\n this.overflowListRef.current.scrollTo(0, scrollPosition);\r\n }\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n this.overflowListRef.current.removeEventListener(\r\n \"scroll\",\r\n this.handleScroll\r\n );\r\n }\r\n\r\n hasNotExcludedScenes = (files) => {\r\n const result = files.some((file) => !file.excludeScene);\r\n return result;\r\n };\r\n\r\n isInView = (el) => {\r\n if (\r\n !this.imageList ||\r\n this.imageList.getBoundingClientRect().height === 0\r\n ) {\r\n this.imageList = document.getElementById(\"SceneImageList\");\r\n if (\r\n this.imageList &&\r\n this.imageList.getAttribute(\"listener\") !== \"true\"\r\n ) {\r\n this.imageList.addEventListener(\"scroll\", this.handleImageListScroll);\r\n }\r\n }\r\n let result = false;\r\n if (this.imageList && el) {\r\n let parentTop = this.imageList.getBoundingClientRect().top;\r\n let parentHeight = this.imageList.getBoundingClientRect().height;\r\n let elTop = el.getBoundingClientRect().top;\r\n let elHeight = el.getBoundingClientRect().height;\r\n\r\n result = elTop + elHeight > parentTop && elTop < parentTop + parentHeight;\r\n }\r\n return result;\r\n };\r\n\r\n handleImageListScroll = () => {\r\n this.forceUpdate();\r\n };\r\n\r\n render() {\r\n const { currentSceneFilterIdx } = this.state;\r\n const {\r\n classes,\r\n project,\r\n onSelectFile,\r\n fileId,\r\n onExcludeFilesToggle,\r\n splitscreenFileIds,\r\n projectContext,\r\n } = this.props;\r\n const { fileGroups } = projectContext;\r\n\r\n const fileNames = Object.keys(fileGroups).sort();\r\n let selectedPath = \"\";\r\n for (let scenes of Object.values(fileGroups)) {\r\n for (let file of scenes) {\r\n if (fileId === file.id) {\r\n selectedPath = file.sourcePath;\r\n }\r\n }\r\n }\r\n\r\n let maxSceneIdx = 0;\r\n for (let file of project.files) {\r\n if (file.scene > maxSceneIdx) {\r\n maxSceneIdx = file.scene;\r\n }\r\n }\r\n\r\n return (\r\n \r\n {project && (\r\n \r\n \r\n {\"Files (\" + fileNames.length + \"):\"}\r\n \r\n
    \r\n {maxSceneIdx > 0 && (\r\n \r\n {\r\n const projectsToExclude = project.files.filter((file) => {\r\n return (\r\n file.scene === currentSceneFilterIdx &&\r\n file.excludeScene !== true\r\n );\r\n });\r\n const projectsToInclude = project.files.filter((file) => {\r\n return (\r\n file.scene !== currentSceneFilterIdx &&\r\n file.excludeScene === true\r\n );\r\n });\r\n onExcludeFilesToggle(projectsToExclude, true);\r\n onExcludeFilesToggle(projectsToInclude, false);\r\n if (maxSceneIdx > currentSceneFilterIdx) {\r\n this.setState({\r\n currentSceneFilterIdx: currentSceneFilterIdx + 1,\r\n });\r\n } else {\r\n this.setState({ currentSceneFilterIdx: 0 });\r\n }\r\n }}\r\n >\r\n \r\n {currentSceneFilterIdx + 1}\r\n
    \r\n \r\n \r\n )}\r\n\r\n \r\n {\r\n const toExclude = this.hasNotExcludedScenes(project.files);\r\n console.log(\"project.files:\", project.files);\r\n onExcludeFilesToggle(\r\n project.files.filter(\r\n (file) => file.excludeScene !== toExclude\r\n ),\r\n toExclude\r\n );\r\n }}\r\n >\r\n {this.hasNotExcludedScenes(project.files) ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n\r\n \r\n {fileNames.map((fn, fn_index) => (\r\n \r\n {\r\n if (!this.imageListItemRefs[fn_index]) {\r\n this.imageListItemRefs[fn_index] = el;\r\n this.forceUpdate();\r\n }\r\n }}\r\n className={classes.fileItem}\r\n style={{\r\n marginTop: fn_index === 0 && 0,\r\n background:\r\n fn === selectedPath ? \"rgba(0, 0, 0, 0.08)\" : \"none\",\r\n }}\r\n >\r\n {this.isInView(this.imageListItemRefs[fn_index]) ? (\r\n \r\n \r\n {fileGroups[fn][0].fileName}\r\n \r\n
    \r\n {fileGroups[fn]\r\n .sort((a, b) => a.scene - b.scene)\r\n .map((sceneFile, f_id) => (\r\n \r\n \r\n \r\n onExcludeFilesToggle(\r\n [sceneFile],\r\n !sceneFile.excludeScene\r\n )\r\n }\r\n >\r\n {!sceneFile.excludeScene ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n onSelectFile(sceneFile.id)}\r\n >\r\n \r\n {this.state.missingThumbnails[\r\n sceneFile.id\r\n ] && (\r\n
    \r\n import\r\n
    \r\n )}\r\n {sceneFile.sceneName ? (\r\n {sceneFile.sceneName}\r\n ) : (\r\n {\r\n e.dataTransfer.setData(\r\n \"text/plain\",\r\n sceneFile.id\r\n );\r\n }}\r\n className={classes.previewImage}\r\n height=\"45\"\r\n src={Backend.renderThumbnail(\r\n sceneFile.id\r\n )}\r\n onError={() => {\r\n let missingThumbnails =\r\n this.state.missingThumbnails;\r\n missingThumbnails[\r\n sceneFile.id\r\n ] = true;\r\n this.setMountedState({\r\n missingThumbnails:\r\n missingThumbnails,\r\n });\r\n }}\r\n alt=\"\"\r\n />\r\n )}\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
    \r\n ) : (\r\n
    \r\n )}\r\n \r\n {fn_index < fileNames.length - 1 && (\r\n \r\n )}\r\n
    \r\n ))}\r\n \r\n
    \r\n )}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nFileTreeView.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n onSelectFile: PropTypes.func,\r\n onExcludeFilesToggle: PropTypes.func,\r\n fileId: PropTypes.string,\r\n splitscreenFileIds: PropTypes.array,\r\n persistentStorage: PropTypes.object,\r\n projectContext: PropTypes.object,\r\n};\r\n\r\nexport default withAllViewerContexts(withStyles(styles)(FileTreeView));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport Histogram from \"../Histogram\";\r\nimport FileTreeView from \"../FileTreeView\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport { Grid, Typography } from \"@mui/material\";\r\n\r\nimport { withAllViewerContexts } from \"../../contexts/AllViewerContexts\";\r\nimport { withTiles } from \"../../contexts/TilesContext\";\r\nimport { withResultTab } from \"../../contexts/ResultTabContext\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n flexRowRemainingHeight: {\r\n flex: \"1 1 auto\",\r\n overflowY: \"auto\",\r\n },\r\n spacing: {\r\n padding: 10,\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n },\r\n histogramContainer: {\r\n minHeight: 280,\r\n },\r\n});\r\n\r\nclass SideBarTabView extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n activeTab: 0,\r\n channelSelectMode: \"all\",\r\n availableModels: [],\r\n isMounted: false,\r\n };\r\n }\r\n\r\n componentDidMount = () => {\r\n this.setState({ isMounted: true });\r\n };\r\n\r\n changeChannelSelectMode = (mode) => {\r\n this.setState({\r\n channelSelectMode: mode,\r\n });\r\n };\r\n\r\n checkToolInConfig(toolName) {\r\n if (this.props.viewerConfig) {\r\n if (this.props.viewerConfig.project.toolsInProject[toolName]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n const {\r\n classes,\r\n fileId,\r\n histogramConfig,\r\n ome,\r\n onChangeChannels,\r\n onSelectFile,\r\n onExcludeFilesToggle,\r\n project,\r\n projectContext,\r\n sideBarWidth,\r\n splitscreenFileIds,\r\n tiles,\r\n visible,\r\n } = this.props;\r\n\r\n if (!visible) return null;\r\n\r\n return (\r\n \r\n {histogramConfig[fileId] && (\r\n \r\n \r\n Histogram:\r\n \r\n
    \r\n {this.props.ome && this.state.isMounted && (\r\n \r\n )}\r\n
    \r\n\r\n {!tiles.getHistoClassificationStarted() && (\r\n \r\n )}\r\n
    \r\n )}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nSideBarTabView.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n // sidebar tab properties\r\n sideBarWidth: PropTypes.number,\r\n visible: PropTypes.bool,\r\n // general properties\r\n id: PropTypes.string.isRequired,\r\n viewerConfig: PropTypes.object,\r\n // historgram\r\n ome: PropTypes.object,\r\n histogramConfig: PropTypes.object,\r\n onChangeChannels: PropTypes.func,\r\n // file management\r\n onSelectFile: PropTypes.func,\r\n onExcludeFilesToggle: PropTypes.func,\r\n splitscreenFileIds: PropTypes.array,\r\n // not ordered\r\n fileId: PropTypes.string,\r\n project: PropTypes.object,\r\n projectContext: PropTypes.object,\r\n tiles: PropTypes.object,\r\n resultTab: PropTypes.object,\r\n};\r\n\r\nexport default withAllViewerContexts(\r\n withTiles(withResultTab(withStyles(styles)(SideBarTabView)))\r\n);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { withAllViewerContexts } from \"../contexts/AllViewerContexts\";\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\nimport { withResultTab } from \"../contexts/ResultTabContext\";\r\n\r\nimport {\r\n Grid,\r\n Typography,\r\n Button,\r\n Tooltip,\r\n FormControl,\r\n InputLabel,\r\n Select,\r\n MenuItem,\r\n} from \"@mui/material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = {};\r\n\r\nclass ScoringMatrixHistoClassification extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n window.addFrequencyClass = this.addFrequencyClass;\r\n\r\n this.store = this.props.persistentStorage;\r\n }\r\n\r\n componentDidMount = () => {};\r\n\r\n componentDidUpdate() {}\r\n\r\n UNSAFE_componentWillMount = () => {\r\n // get all parent structures\r\n const selSample = this.store.load(\"selLayerSample\");\r\n if (selSample) {\r\n this.props.onSelectLayer(selSample);\r\n let selId = this.props.structures[selSample].id;\r\n\r\n // get all parent structures\r\n let parentStructures = this.props.structures.filter(\r\n (element) => element.subtypeLevel === 0\r\n );\r\n\r\n // get Index of sample in parent structures\r\n let parentIdxSelStructure = parentStructures.findIndex(\r\n (element) => element.id === selId\r\n );\r\n this.props.resultTab.setSelectedStructure(parentIdxSelStructure);\r\n }\r\n };\r\n\r\n findChilds = (subType) => {\r\n const { structures } = this.props;\r\n // return direct childs of structure\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id\r\n );\r\n };\r\n\r\n getAbbreviationOfStructure = (structure) => {\r\n // get abbreviation of structure --> label [abbreviation]\r\n let strWithBracket = structure.label.split(\"[\")[1];\r\n if (!strWithBracket) {\r\n strWithBracket = structure.label;\r\n }\r\n let abbreviation = strWithBracket.substring(0, strWithBracket.length - 1);\r\n return abbreviation;\r\n };\r\n\r\n isCriticalOrSelected = (structure) => {\r\n const { structures, selectedLayer } = this.props;\r\n // check if structure is selected (color dark grey) or critical (color red)\r\n let selectedChildIndex = this.props.resultTab.getSelectedChildIndex();\r\n if (this.isStructureCritical(structure)) {\r\n // if structure has critical value\r\n return \"#ff0000\";\r\n } else if (\r\n structure.id === structures[selectedLayer + selectedChildIndex].id\r\n ) {\r\n // if structure is selected\r\n return \"#d8d8d8\";\r\n } else {\r\n return \"#ffffff\";\r\n }\r\n };\r\n\r\n isStructureCritical = (structure) => {\r\n const { selectedLayer, roiLayers, project } = this.props;\r\n // calculate arithmetic mean (look at specifications)\r\n let numberTiles =\r\n project.files.length * roiLayers[selectedLayer].layer.regionRois.length;\r\n\r\n let totalClassFrequencies = 0;\r\n let idx = 0;\r\n for (const [key, value] of Object.entries(structure.classFrequencies)) {\r\n if (key !== \"class_0\") {\r\n totalClassFrequencies = totalClassFrequencies + value * idx;\r\n }\r\n idx = idx + 1;\r\n }\r\n\r\n let mean = Math.round(totalClassFrequencies / numberTiles);\r\n this.setAvgClassFrequ(structure, mean);\r\n\r\n // if mean is greater or equal than critical class of structure return true\r\n if (mean >= structure.criticalClass && structure.criticalClass !== 0) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n setAvgClassFrequ = (structure, mean) => {\r\n // set average frequency class\r\n if (!Number.isNaN(mean) && mean !== null) {\r\n structure.avgClassFrequency = mean;\r\n }\r\n };\r\n\r\n subtractFrequencyClass = (x) => {\r\n const { structures, selectedLayer } = this.props;\r\n // subtract frequency class (is structure gert reclassified)\r\n\r\n let selectedChildIndex = this.props.resultTab.getSelectedChildIndex();\r\n let selectedStructure = selectedLayer + selectedChildIndex;\r\n\r\n switch (x) {\r\n case 0:\r\n structures[selectedStructure].classFrequencies.class_0 =\r\n structures[selectedStructure].classFrequencies.class_0 - 1;\r\n break;\r\n case 1:\r\n structures[selectedStructure].classFrequencies.class_1 =\r\n structures[selectedStructure].classFrequencies.class_1 - 1;\r\n break;\r\n case 2:\r\n structures[selectedStructure].classFrequencies.class_2 =\r\n structures[selectedStructure].classFrequencies.class_2 - 1;\r\n break;\r\n case 3:\r\n structures[selectedStructure].classFrequencies.class_3 =\r\n structures[selectedStructure].classFrequencies.class_3 - 1;\r\n break;\r\n case 4:\r\n structures[selectedStructure].classFrequencies.class_4 =\r\n structures[selectedStructure].classFrequencies.class_4 - 1;\r\n break;\r\n case 5:\r\n structures[selectedStructure].classFrequencies.class_5 =\r\n structures[selectedStructure].classFrequencies.class_5 - 1;\r\n break;\r\n case 6:\r\n structures[selectedStructure].classFrequencies.class_6 =\r\n structures[selectedStructure].classFrequencies.class_6 - 1;\r\n break;\r\n default:\r\n }\r\n };\r\n\r\n addFrequencyClass = (x) => {\r\n const { structures, selectedLayer, roiLayers, selectedRoi } = this.props;\r\n // add frequency class when classifying tile\r\n\r\n let selectedChildIndex = this.props.resultTab.getSelectedChildIndex();\r\n\r\n // if not started no classification possible\r\n if (!this.props.tiles.getHistoClassificationStarted()) {\r\n window.showWarningSnackbar(\"Please click 'RUN' to classify.\");\r\n return;\r\n }\r\n\r\n // if no grid\r\n if (roiLayers[selectedLayer].layer.regionRois.length === 0) {\r\n window.showWarningSnackbar(\"Please create a grid before annotating\");\r\n this.props.onChangeTool(\"gridtool\");\r\n return;\r\n }\r\n\r\n /*// zoomLevel is not fixed yet\r\n if (!this.props.zoomLevelFixed) {\r\n window.showWarningSnackbar(\"Plese fix zoom level before annotating\");\r\n return;\r\n }*/\r\n\r\n let selectedStructure = selectedLayer + selectedChildIndex;\r\n\r\n // check if tile was classified before\r\n let fClass =\r\n roiLayers[selectedStructure].layer.regionRois[selectedRoi].frequencyClass;\r\n if (fClass !== -1) {\r\n // if tile was classified before undo previous classification\r\n this.subtractFrequencyClass(fClass);\r\n }\r\n\r\n switch (x) {\r\n case 0:\r\n structures[selectedStructure].classFrequencies.class_0 =\r\n structures[selectedStructure].classFrequencies.class_0 + 1;\r\n break;\r\n case 1:\r\n structures[selectedStructure].classFrequencies.class_1 =\r\n structures[selectedStructure].classFrequencies.class_1 + 1;\r\n break;\r\n case 2:\r\n structures[selectedStructure].classFrequencies.class_2 =\r\n structures[selectedStructure].classFrequencies.class_2 + 1;\r\n break;\r\n case 3:\r\n structures[selectedStructure].classFrequencies.class_3 =\r\n structures[selectedStructure].classFrequencies.class_3 + 1;\r\n break;\r\n case 4:\r\n structures[selectedStructure].classFrequencies.class_4 =\r\n structures[selectedStructure].classFrequencies.class_4 + 1;\r\n break;\r\n case 5:\r\n structures[selectedStructure].classFrequencies.class_5 =\r\n structures[selectedStructure].classFrequencies.class_5 + 1;\r\n break;\r\n case 6:\r\n structures[selectedStructure].classFrequencies.class_6 =\r\n structures[selectedStructure].classFrequencies.class_6 + 1;\r\n break;\r\n default:\r\n }\r\n\r\n // assign frequencyClass to tile\r\n roiLayers[selectedStructure].layer.regionRois[\r\n this.props.selectedRoi\r\n ].frequencyClass = x;\r\n\r\n if (\r\n selectedChildIndex < this.findChilds(structures[selectedLayer]).length\r\n ) {\r\n // not last substructure of tile\r\n let newSelChildIdx = selectedChildIndex + 1;\r\n this.props.resultTab.setSelectedChildIndex(newSelChildIdx);\r\n } else {\r\n // last substructure of tile\r\n this.props.resultTab.setSelectedChildIndex(1);\r\n }\r\n\r\n if (\r\n structures[selectedStructure] &&\r\n this.isStructureCritical(structures[selectedStructure]) &&\r\n !structures[selectedStructure].warningWasShown\r\n ) {\r\n // show warning that sample is critical\r\n let warningStr =\r\n \"Histologische Beurteilung auffällig (\" +\r\n structures[selectedStructure].label +\r\n \" reached average class \" +\r\n structures[selectedStructure].criticalClass +\r\n \").\";\r\n\r\n window.showErrorSnackbar(warningStr);\r\n structures[selectedStructure].warningWasShown = true;\r\n }\r\n\r\n this.forceUpdate();\r\n };\r\n\r\n handleChangeSelectedStructure = (e) => {\r\n // get all parent structures\r\n let parentStructures = this.props.structures.filter(\r\n (element) => element.subtypeLevel === 0\r\n );\r\n\r\n const idxNewSelectedStructure = this.props.structures.findIndex(\r\n (element) => element.id === parentStructures[e.target.value].id\r\n );\r\n\r\n if (idxNewSelectedStructure >= 0) {\r\n this.props.onSelectLayer(idxNewSelectedStructure);\r\n }\r\n\r\n this.props.resultTab.setSelectedChildIndex(1);\r\n this.props.resultTab.setSelectedStructure(e.target.value);\r\n\r\n // reset structures\r\n this.props.resetStructures(true);\r\n\r\n // save selectedLayer in local storage\r\n this.store.save(\"selLayerSample\", idxNewSelectedStructure);\r\n };\r\n\r\n selectRow = (structure) => {\r\n const { structures, selectedLayer } = this.props;\r\n // select row which was clicked\r\n // get childindex of selected structure\r\n let childIdx = this.findChilds(structures[selectedLayer]).findIndex(\r\n (element) => element.id === structure.id\r\n );\r\n this.props.resultTab.setSelectedChildIndex(childIdx + 1);\r\n this.forceUpdate();\r\n };\r\n\r\n renderSubtypeRow = (structure, idx) => {\r\n const { structures, roiLayers } = this.props;\r\n\r\n // if it is critical make row red\r\n let backgroundColor = this.isCriticalOrSelected(structure);\r\n\r\n // get frequencyClass of selected Tile for row\r\n let structureIndex = structures.findIndex(\r\n (element) => element.id === structure.id\r\n );\r\n let rowFrequencyClass = 0;\r\n if (\r\n structureIndex > -1 &&\r\n roiLayers[structureIndex].layer.regionRois.length > 0 &&\r\n roiLayers[structureIndex].layer.regionRois[this.props.selectedRoi]\r\n ) {\r\n rowFrequencyClass =\r\n roiLayers[structureIndex].layer.regionRois[this.props.selectedRoi]\r\n .frequencyClass;\r\n }\r\n\r\n if (!structure.avgClassFrequency) {\r\n structure.avgClassFrequency = 0;\r\n }\r\n\r\n return (\r\n this.selectRow(structure)}\r\n >\r\n \r\n \r\n \r\n {this.getAbbreviationOfStructure(structure)}\r\n \r\n \r\n \r\n \r\n \r\n {structure.classFrequencies.class_0}\r\n \r\n \r\n \r\n \r\n {structure.classFrequencies.class_1}\r\n \r\n \r\n \r\n \r\n {structure.classFrequencies.class_2}\r\n \r\n \r\n \r\n \r\n {structure.classFrequencies.class_3}\r\n \r\n \r\n \r\n \r\n {structure.classFrequencies.class_4}\r\n \r\n \r\n \r\n \r\n {structure.classFrequencies.class_5}\r\n \r\n \r\n \r\n \r\n {structure.classFrequencies.class_6}\r\n \r\n \r\n \r\n \r\n {structure.avgClassFrequency}\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n renderFrequencyClasses = () => {\r\n return (\r\n \r\n \r\n \r\n 0\r\n \r\n \r\n 0\r\n \r\n \r\n \r\n \r\n 0\r\n \r\n \r\n this.addFrequencyClass(0)}\r\n >\r\n 0\r\n \r\n \r\n \r\n \r\n \r\n 1x\r\n \r\n \r\n this.addFrequencyClass(1)}\r\n >\r\n 1\r\n \r\n \r\n \r\n \r\n \r\n {\"<5%\"}\r\n \r\n \r\n this.addFrequencyClass(2)}\r\n >\r\n 2\r\n \r\n \r\n \r\n \r\n \r\n 5-20%\r\n \r\n \r\n this.addFrequencyClass(3)}\r\n >\r\n 3\r\n \r\n \r\n \r\n \r\n \r\n 20-35%\r\n \r\n \r\n this.addFrequencyClass(4)}\r\n >\r\n 4\r\n \r\n \r\n \r\n \r\n \r\n 35-50%\r\n \r\n \r\n this.addFrequencyClass(5)}\r\n >\r\n 5\r\n \r\n \r\n \r\n \r\n \r\n {\">50%\"}\r\n \r\n \r\n this.addFrequencyClass(6)}\r\n >\r\n 6\r\n \r\n \r\n \r\n \r\n \r\n Ø\r\n \r\n \r\n \r\n Ø\r\n \r\n \r\n \r\n \r\n );\r\n };\r\n\r\n isSelSampleSet = () => {\r\n // disable dropdown if sample is set and classification started\r\n const dropdownDisabled = this.props.tiles.getHistoClassificationStarted();\r\n return dropdownDisabled;\r\n };\r\n\r\n render() {\r\n const { structures, selectedLayer } = this.props;\r\n return (\r\n
    \r\n \r\n Sample\r\n \r\n {this.props.structures\r\n .filter((element) => element.subtypeLevel === 0)\r\n .map((structure, idx) => (\r\n \r\n {structure.label}\r\n \r\n ))}\r\n \r\n \r\n
    \r\n
    \r\n {this.renderFrequencyClasses()}\r\n {this.findChilds(structures[selectedLayer]).map((structure, idx) =>\r\n this.renderSubtypeRow(structure, idx)\r\n )}\r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nScoringMatrixHistoClassification.propTypes = {\r\n persistentStorage: PropTypes.object,\r\n structures: PropTypes.array,\r\n roiLayers: PropTypes.array,\r\n resultTab: PropTypes.object,\r\n onSelectLayer: PropTypes.func,\r\n selectedLayer: PropTypes.number,\r\n project: PropTypes.object,\r\n selectedRoi: PropTypes.number,\r\n tiles: PropTypes.object,\r\n onChangeTool: PropTypes.func,\r\n resetStructures: PropTypes.func,\r\n};\r\n\r\nexport default withAllViewerContexts(\r\n withTiles(withResultTab(withStyles(styles)(ScoringMatrixHistoClassification)))\r\n);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { withAllViewerContexts } from \"../contexts/AllViewerContexts\";\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\nimport { withResultTab } from \"../contexts/ResultTabContext\";\r\n\r\nimport {\r\n Grid,\r\n Typography,\r\n Tooltip,\r\n FormControl,\r\n InputLabel,\r\n Select,\r\n MenuItem,\r\n IconButton,\r\n} from \"@mui/material\";\r\n\r\nimport { Add } from \"@mui/icons-material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = {};\r\n\r\nclass ScoringMatrixHistoPointCounting extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n window.addFrequencyClass = this.addFrequencyClass;\r\n window.classifyTileWithkey = this.classifyTileWithkey;\r\n\r\n this.store = this.props.persistentStorage;\r\n this.canCallClassifyTileWithKey = true;\r\n }\r\n\r\n componentDidMount = () => {};\r\n\r\n componentDidUpdate() {}\r\n\r\n UNSAFE_componentWillMount = () => {\r\n // get all parent structures\r\n let selSample = this.store.load(\"selLayerSample\");\r\n if (selSample) {\r\n this.props.onSelectLayer(selSample);\r\n let selId = this.props.structures[selSample].id;\r\n\r\n // get all parent structures\r\n let parentStructures = this.props.structures.filter(\r\n (element) => element.subtypeLevel === 0\r\n );\r\n\r\n // get Index of sample in parent structures\r\n let parentIdxSelStructure = parentStructures.findIndex(\r\n (element) => element.id === selId\r\n );\r\n this.props.resultTab.setSelectedStructure(parentIdxSelStructure);\r\n }\r\n };\r\n\r\n findChilds = (subType) => {\r\n const { structures } = this.props;\r\n // return direct childs of structure\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id\r\n );\r\n };\r\n\r\n getAbbreviationOfStructure = (structure) => {\r\n // get abbreviation of structure --> label [abbreviation]\r\n let strWithBracket = structure.label.split(\"[\")[1];\r\n if (!strWithBracket) {\r\n strWithBracket = structure.label;\r\n }\r\n let abbreviation = strWithBracket.substring(0, strWithBracket.length - 1);\r\n return abbreviation;\r\n };\r\n\r\n handleChangeSelectedStructure = (e) => {\r\n const { resultTab } = this.props;\r\n // get all parent structures\r\n const parentStructures = this.props.structures.filter(\r\n (element) => element.subtypeLevel === 0\r\n );\r\n\r\n const idxNewSelectedStructure = this.props.structures.findIndex(\r\n (element) => element.id === parentStructures[e.target.value].id\r\n );\r\n\r\n if (idxNewSelectedStructure >= 0) {\r\n this.props.onSelectLayer(idxNewSelectedStructure);\r\n }\r\n\r\n resultTab.setSelectedChildIndex(1);\r\n resultTab.setSelectedStructure(e.target.value);\r\n\r\n // reset structures\r\n this.props.resetStructures(true);\r\n\r\n // save selectedLayer in local storage\r\n this.store.save(\"selLayerSample\", idxNewSelectedStructure);\r\n };\r\n\r\n getCount = (structure) => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n // calculate number of rois in parent layer\r\n const numberRois = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (roi) => roi.structureId === structure.id\r\n ).length;\r\n\r\n return numberRois;\r\n };\r\n\r\n blockClassifyTile = (structure) => {\r\n const { roiLayers, selectedLayer, resultTab, tiles, onChangeTool } =\r\n this.props;\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n\r\n // if file is changing no classification is possible for a few seconds\r\n if (resultTab.getFileChange()) return true;\r\n\r\n // if not started no classification is possible\r\n if (!tiles.getHistoClassificationStarted()) {\r\n window.showWarningSnackbar(\"Please click 'RUN' to classify.\");\r\n return true;\r\n }\r\n\r\n // if no grid no classification is possible\r\n if (roiLayers[selectedLayer].layer.regionRois.length === 0) {\r\n window.showWarningSnackbar(\"Please create a grid before annotating\");\r\n onChangeTool(\"gridtool\");\r\n return true;\r\n }\r\n\r\n // do not classify empty structure if 100 already reached\r\n if (\r\n resultTab.getHundredTiles() &&\r\n structure.label !== \"leer [leer]\" &&\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].subtypeName ===\r\n \"leer [leer]\"\r\n ) {\r\n window.showWarningSnackbar(\"Finished!\");\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n classifyTile = (structure) => {\r\n if (this.blockClassifyTile(structure)) return;\r\n\r\n const { roiLayers, selectedLayer, resultTab } = this.props;\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n\r\n // classify tile --> set roi properties\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].structureId =\r\n structure.id;\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].subtypeName =\r\n structure.label;\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].color =\r\n structure.color;\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].isSubtype = true;\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].isAnnotated = true;\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].isLabeled = true;\r\n\r\n //this.criticalValueReached();\r\n // set hundret tiles to true only if from classification button\r\n this.getTotalCount();\r\n this.props.onNext();\r\n this.forceUpdate();\r\n };\r\n\r\n classifyTileWithkey = (keyNumber) => {\r\n if (keyNumber > 0 && this.canCallClassifyTileWithKey) {\r\n const { structures, selectedLayer } = this.props;\r\n // classification with key shortcut\r\n let childs = this.findChilds(structures[selectedLayer]);\r\n\r\n if (childs[keyNumber - 1]) {\r\n let structureForClassification = childs[keyNumber - 1];\r\n this.classifyTile(structureForClassification);\r\n this.canCallClassifyTileWithKey = false;\r\n setTimeout(() => {\r\n this.canCallClassifyTileWithKey = true;\r\n }, 100); // re-enable the call after 0.1 seconds\r\n }\r\n }\r\n };\r\n\r\n isTileClassified = (structure) => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n // color structure in dark grey if selected tile was classified with structure\r\n\r\n // if no grid return\r\n if (roiLayers[selectedLayer].layer.regionRois.length === 0) {\r\n return;\r\n }\r\n\r\n // check if selected tile has class of structure\r\n let selectedRoi = this.props.resultTab.getSelectedRoi();\r\n let tileHasStructureClass =\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].structureId ===\r\n structure.id;\r\n\r\n // if tile has no classification yet\r\n if (structure.label === \"leer [leer]\" && !tileHasStructureClass) {\r\n tileHasStructureClass =\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].structureId ===\r\n 0;\r\n }\r\n\r\n if (tileHasStructureClass && !this.props.showGallery) {\r\n return \"#d8d8d8\";\r\n } else {\r\n return \"#FFFFFF\";\r\n }\r\n };\r\n\r\n renderSubtypeRow = (structure, indexSubtype) => {\r\n // check if selected tile is classified with this structure\r\n let backgroundColor = this.isTileClassified(structure);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {this.getAbbreviationOfStructure(structure)}\r\n \r\n \r\n \r\n \r\n \r\n {this.getCount(structure)}\r\n \r\n \r\n \r\n \r\n this.classifyTile(structure)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n );\r\n };\r\n\r\n getTotalCount = (fromRendering) => {\r\n const { structures, roiLayers, selectedLayer, resultTab } = this.props;\r\n\r\n // get id of \"leer\" child\r\n let emptyId = 0;\r\n this.findChilds(structures[selectedLayer]).forEach((child) => {\r\n if (child.label === \"leer [leer]\") {\r\n emptyId = child.id;\r\n }\r\n });\r\n\r\n // get number of rois that are not of class \"leer\"\r\n const numberRois = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (roi) => roi.isAnnotated && roi.structureId !== emptyId\r\n ).length;\r\n\r\n if (numberRois >= 100 && !fromRendering) {\r\n resultTab.setHundredTiles(true);\r\n }\r\n\r\n return numberRois;\r\n };\r\n\r\n renderMatrixBottom = () => {\r\n return (\r\n \r\n \r\n Total\r\n \r\n \r\n {this.getTotalCount(true)} / 100\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n renderMatrixHeader = () => {\r\n return (\r\n \r\n \r\n \r\n Gewebeart\r\n \r\n \r\n \r\n \r\n Count\r\n \r\n \r\n \r\n \r\n Increase Count\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n isSelSampleSet = () => {\r\n // disable dropdown if sample is set and classification started\r\n const dropdownDisabled = this.props.tiles.getHistoClassificationStarted();\r\n return dropdownDisabled;\r\n };\r\n\r\n render() {\r\n const { structures, selectedLayer } = this.props;\r\n return (\r\n
    \r\n \r\n Sample\r\n \r\n {this.props.structures\r\n .filter((element) => element.subtypeLevel === 0)\r\n .map((structure, idx) => (\r\n \r\n {structure.label}\r\n \r\n ))}\r\n \r\n \r\n {this.renderMatrixHeader()}\r\n {this.findChilds(structures[selectedLayer]).map((structure, idx) =>\r\n this.renderSubtypeRow(structure, idx)\r\n )}\r\n {this.renderMatrixBottom()}\r\n
    \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nScoringMatrixHistoPointCounting.propTypes = {\r\n persistentStorage: PropTypes.object,\r\n resultTab: PropTypes.object,\r\n tiles: PropTypes.object,\r\n selectedLayer: PropTypes.number,\r\n showGallery: PropTypes.bool,\r\n structures: PropTypes.array,\r\n roiLayers: PropTypes.array,\r\n onSelectLayer: PropTypes.func,\r\n resetStructures: PropTypes.func,\r\n onChangeTool: PropTypes.func,\r\n onNext: PropTypes.func,\r\n project: PropTypes.object,\r\n};\r\n\r\nexport default withAllViewerContexts(\r\n withTiles(withResultTab(withStyles(styles)(ScoringMatrixHistoPointCounting)))\r\n);\r\n","import React, { Component } from \"react\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport ScoringMatrixHistoClassification from \"../ScoringMatrixHistoClassification\";\r\nimport ScoringMatrixHistoPointCounting from \"../ScoringMatrixHistoPointCounting\";\r\nimport MiniMap from \"../MiniMap\";\r\n\r\nimport { Add, ArrowDropDown, ArrowDropUp } from \"@mui/icons-material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport {\r\n Grid,\r\n Typography,\r\n Button,\r\n Tooltip,\r\n IconButton,\r\n ListItem,\r\n TextField,\r\n FormControlLabel,\r\n Checkbox,\r\n} from \"@mui/material\";\r\n\r\nimport { withAllViewerContexts } from \"../../contexts/AllViewerContexts\";\r\nimport { withTiles } from \"../../contexts/TilesContext\";\r\nimport { withResultTab } from \"../../contexts/ResultTabContext\";\r\n\r\nimport Backend from \"../../../common/utils/Backend\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n flexRowRemainingHeight: {\r\n flex: \"1 1 auto\",\r\n overflowY: \"auto\",\r\n },\r\n spacing: {\r\n padding: 10,\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n },\r\n});\r\n\r\n// all possible substructures for module \"Histo-Klassifikation\"\r\nconst HistoClassififcationLabels = [\r\n \"Skelettmuskulatur [Skm]\",\r\n \"Brätstrukturen [Brät]\",\r\n \"Bindegewebe kollagenes [kBdg]\",\r\n \"Bindegewebe elastisches [eBdg]\",\r\n \"Fettgewebe [Fett]\",\r\n \"Pflanzliches Fett [pFett]\",\r\n \"Gewürze [Gewü]\",\r\n \"Gefäße [Gefä]\",\r\n \"Drüsengewebe [Drüs]\",\r\n \"Haut äußere Schwarten [Schwa]\",\r\n \"Lebergewebe [Leber]\",\r\n \"Lymphatisches Gewebe [Lymph]\",\r\n \"Muskeleiweiß strukturlos (teils granuliert) [Mus]\",\r\n \"Brät mit Hülle wiederverarbeitetes [ReMit]\",\r\n \"Brät ohne Hülle wiederverarbeitetes [ReOhne]\",\r\n \"Gelatineartige fremde Eiweißstrukturen [Gelat]\",\r\n \"Stärkepartikel [Stärke]\",\r\n \"Haut Geflügel [GHaut]\",\r\n \"Speicheldrüse [Speidrü]\",\r\n \"Knorpelpartikel [Knorpel]\",\r\n \"Knochenpartikel [Knochen]\",\r\n \"Pflanzliches Protein [pProt]\",\r\n \"Pflanzliche Partikel [pPart]\",\r\n \"Muskelabrieb, strukturlose Masse (teils granuliert, auch Vakuolen) [Mgranu]\",\r\n \"Muskelabrieb, feinbrätartig (>drei Vakuolen auf einer Stelle) [Mbrät]\",\r\n \"Muskelabrieb in Form amorpher Proteinstrukturen [Mamorph]\",\r\n \"Deutlich von umgebender Muskulatur abgegrenzte straßenartige Bahnen aus Muskeleiweiß wabig-schaumig vernetzt großporig [MeatIn1]\",\r\n \"Deutlich von umgebender Muskulatur abgegrenzte straßenartige Bahnen aus Muskeleiweiß wabig-schaumig vernetzt kleinporig [MeatIn2]\",\r\n \"Deutlich von umgebender Muskulatur abgegrenzte straßenartige Bahnen aus Muskeleiweiß in Form von Detritus [MeatIn3]\",\r\n \"Strukturen wie durch Transglutaminase entstanden inter-/intramuskulär [Transgl]\",\r\n \"Tierisches Fremdprotein Plasmaeiweiß [tProt]\",\r\n \"Schilddrüse [SchiDrü]\",\r\n \"Skelettmuskulatur, zusammengefügt [SkmZus]\",\r\n \"unbekannte Strukturen [US]\",\r\n];\r\n\r\nclass SideBarTabResults extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n isMounted: false,\r\n dynamicStructureText: \"\",\r\n dynamicStructureAbbrText: \"\",\r\n // shows if grid from last use uf project exists\r\n gridExists: this.getGridExists(),\r\n structuresToAdd: [],\r\n showLabelsToAdd: false,\r\n };\r\n\r\n const { project } = this.props;\r\n\r\n this.store = this.props.persistentStorage;\r\n this.gridtool = \"gridtool\";\r\n this.selectiontile = \"selectiontile\";\r\n this.pointcountingtile = \"pointcountingtile\";\r\n this.isHistoClass = project.type.includes(\"HistoClassification\");\r\n this.isHistoPntC = project.type.includes(\"HistoPointCounting\");\r\n this.tile = this.isHistoClass ? this.selectiontile : this.pointcountingtile;\r\n\r\n this.sortSlides();\r\n }\r\n\r\n componentDidMount = () => {\r\n this.setState({ isMounted: true });\r\n this.props.resultTab.setZoomLevelFixed(false); // Re-enable zoom on customer request\r\n if (!this.props.tiles.getHistoClassificationStarted()) {\r\n this.props.onChangeTool(this.gridtool);\r\n }\r\n };\r\n\r\n UNSAFE_componentWillMount = () => {\r\n this.setSelectedSampleFromFilename();\r\n };\r\n\r\n componentWillUnmount = () => {\r\n this.props.onChangeTool(\"none\");\r\n };\r\n\r\n setSelectedSampleFromFilename = () => {\r\n const { project, resultTab, structures } = this.props;\r\n // set selected sample according to file name (hint in filename about sample)\r\n if (project && project.name && !resultTab.getSelSampleSet()) {\r\n const res = project.name.split(\"-\");\r\n const sampleAbbr = res[res.length - 2];\r\n let sampleLabel = \"\";\r\n switch (sampleAbbr) {\r\n case \"KP\": // Kochpökelware\r\n sampleLabel = \"Kochpökelware\";\r\n break;\r\n case \"BR\": // Brühwurst\r\n sampleLabel = \"Brühwurst\";\r\n break;\r\n case \"HA\": // Hackfleisch\r\n sampleLabel = \"Hackfleisch\";\r\n break;\r\n case \"KO\": // Kochwurst\r\n sampleLabel = \"Kochwurst\";\r\n break;\r\n case \"RO\": // Rohwurst\r\n sampleLabel = \"Rohwurst\";\r\n break;\r\n case \"VP\": // VegFleischersatz\r\n sampleLabel = \"VegFleischersatz\";\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n // get index of sample to select\r\n const idxNewSelectedStructure = structures.findIndex(\r\n (element) => element.label === sampleLabel\r\n );\r\n\r\n if (idxNewSelectedStructure >= 0) {\r\n this.props.onSelectLayer(idxNewSelectedStructure);\r\n const selId = structures[idxNewSelectedStructure].id;\r\n\r\n // get all parent structures\r\n const parentStructures = structures.filter(\r\n (element) => element.subtypeLevel === 0\r\n );\r\n\r\n // get Index of sample in parent structures\r\n const parentIdxSelStructure = parentStructures.findIndex(\r\n (element) => element.id === selId\r\n );\r\n resultTab.setSelectedStructure(parentIdxSelStructure);\r\n this.store.save(\"selLayerSample\", idxNewSelectedStructure);\r\n }\r\n resultTab.setSelSampleSet(true);\r\n }\r\n };\r\n\r\n getGridExists = () => {\r\n const { roiLayers, resultTab } = this.props;\r\n // check if grid was created in one roilayer\r\n let exists = false;\r\n roiLayers.forEach((l) => {\r\n if (l.layer.regionRois.length > 0) {\r\n exists = true;\r\n }\r\n });\r\n resultTab.setGridExists(exists);\r\n return exists;\r\n };\r\n\r\n findChilds = (subType) => {\r\n const { structures } = this.props;\r\n // return direct classification subtypes\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n resetStructures = (changeSample) => {\r\n const {\r\n structures,\r\n roiLayers,\r\n selectedLayer,\r\n tools,\r\n onChangeTool,\r\n resultTab,\r\n } = this.props;\r\n const numberTiles = roiLayers[selectedLayer].layer.regionRois.length;\r\n const gridSize = Math.sqrt(numberTiles);\r\n\r\n // reset properties for each structure\r\n structures.forEach((structure) => {\r\n structure.avgClassFrequency = 0;\r\n for (const key of Object.keys(structure.classFrequencies)) {\r\n structure.classFrequencies[key] = 0;\r\n }\r\n });\r\n resultTab.setSelectedRoi(0);\r\n resultTab.setSelectedChildIndex(1);\r\n resultTab.setResetPressed(true);\r\n resultTab.setHundredTiles(false);\r\n\r\n if (this.isHistoClass) {\r\n // set started to false\r\n this.props.tiles.setHistoClassificationStarted(false);\r\n }\r\n\r\n // save selectedRoi in local storage\r\n this.store.save(\"selectedRoi\", resultTab.getSelectedRoi());\r\n\r\n if (changeSample) {\r\n // delete roiLayers\r\n roiLayers.forEach((roiLayer) => {\r\n roiLayer.layer.regionRois = [];\r\n });\r\n //if condistion so that onChangeTool(\"none\") doesnt affect Histo Modules, but otherwise no new bugs occur\r\n if (!(this.isHistoClass || this.isHistoPntC)) {\r\n onChangeTool(\"none\");\r\n }\r\n } else {\r\n // make new grid\r\n // if no grid finish here\r\n if (numberTiles === 0) {\r\n return;\r\n }\r\n\r\n const roiItem = this.setRoiItem(roiLayers, selectedLayer, 0);\r\n\r\n // make new grid\r\n if (this.isHistoClass) {\r\n tools[this.gridtool].createGrid(gridSize);\r\n } else if (this.isHistoPntC) {\r\n tools[this.gridtool].createGrid(gridSize, true);\r\n }\r\n onChangeTool(this.tile);\r\n tools[this.tile].setNextTile(roiItem);\r\n }\r\n };\r\n\r\n resetRoiLayers = () => {\r\n const { allRoiLayers } = this.props;\r\n // make all roiLayers in all files empty\r\n for (const value of Object.entries(allRoiLayers)) {\r\n value[1].forEach((element) => {\r\n element.layer.regionRois = [];\r\n });\r\n }\r\n };\r\n\r\n sortSlides = () => {\r\n this.props.project.files.sort((a, b) => {\r\n if (a.fileName < b.fileName) return -1;\r\n if (a.fileName > b.fileName) return 1;\r\n return 0;\r\n });\r\n };\r\n\r\n onStart = () => {\r\n const {\r\n tools,\r\n onChangeTool,\r\n roiLayers,\r\n selectedLayer,\r\n project,\r\n fileId,\r\n onSelectFile,\r\n resultTab,\r\n tiles,\r\n } = this.props;\r\n const savedRoi = this.store.load(\"selectedRoi\");\r\n const numberRegionRois = roiLayers[selectedLayer].layer.regionRois.length;\r\n const gridSize = Math.sqrt(numberRegionRois);\r\n\r\n // if no grid\r\n if (numberRegionRois === 0 && this.isHistoClass) {\r\n window.showWarningSnackbar(\"Please create a grid before annotating\");\r\n this.props.onChangeTool(this.gridtool);\r\n return;\r\n }\r\n\r\n // reset\r\n if (tiles.getHistoClassificationStarted()) {\r\n // initialize gridtool if not initialized yet\r\n onChangeTool(this.gridtool);\r\n setTimeout(() => this.resetStructures(), 100);\r\n // set started to false\r\n tiles.setHistoClassificationStarted(false);\r\n\r\n if (fileId !== project.files[0].id && this.isHistoClass) {\r\n this.resetRoiLayers();\r\n window.showWarningSnackbar(\"Changing to file 1 ...\");\r\n onSelectFile(project.files[0].id);\r\n }\r\n return;\r\n }\r\n\r\n // set corresponding zoom level for grid size\r\n if (this.isHistoClass) {\r\n window.setZoomLevelForGridSize(gridSize);\r\n\r\n // get selectedRoi from previous use\r\n if (savedRoi !== undefined) {\r\n resultTab.setSelectedRoi(savedRoi);\r\n } else {\r\n resultTab.setSelectedRoi(0);\r\n }\r\n\r\n // make tilesClassificationTool active\r\n const roiItem = this.setRoiItem(roiLayers, selectedLayer, 0);\r\n tools[this.selectiontile].setNextTile(roiItem);\r\n onChangeTool(this.selectiontile);\r\n // On Start set Labels to 0\r\n this.checkIfSkipped();\r\n this.setClassToZero();\r\n } else if (this.isHistoPntC) {\r\n onChangeTool(this.gridtool);\r\n // make small delay to initialize grid tool\r\n setTimeout(() => this.startHistoPointCounting(), 100);\r\n }\r\n\r\n tiles.setHistoClassificationStarted(true);\r\n resultTab.setResetPressed(false);\r\n window.setGridSize(gridSize);\r\n };\r\n\r\n startHistoPointCounting = () => {\r\n const { tools, onChangeTool, roiLayers, selectedLayer, resultTab } =\r\n this.props;\r\n const numberRegionRois = roiLayers[selectedLayer].layer.regionRois.length;\r\n const savedRoi = this.store.load(\"selectedRoi\");\r\n\r\n // only create grid if not exists\r\n if (numberRegionRois === 0) {\r\n tools[this.gridtool].createGrid(20, true);\r\n }\r\n\r\n window.setZoomLevelForGridSize(20);\r\n\r\n // get selectedRoi from previous use\r\n if (savedRoi !== undefined) {\r\n resultTab.setSelectedRoi(savedRoi);\r\n } else {\r\n resultTab.setSelectedRoi(0);\r\n }\r\n\r\n // make tilesClassificationTool active\r\n onChangeTool(this.pointcountingtile);\r\n const roiItem = this.setRoiItem(roiLayers, selectedLayer, 0);\r\n tools[this.pointcountingtile].setNextTile(roiItem);\r\n\r\n // check if 100 tiles already classified\r\n const totalCount = this.getTotalCount();\r\n resultTab.setHundredTiles(totalCount >= 100);\r\n };\r\n\r\n onPause = () => {\r\n const belongsToFinishedTab = this.store.load(\"belongsToFinishedTab\");\r\n\r\n if (belongsToFinishedTab === undefined) {\r\n this.props.onSave();\r\n } else {\r\n this.saveToJSON();\r\n }\r\n };\r\n\r\n setRoiItem = (roiLayers, selectedLayer, selectedRoi) => {\r\n return {\r\n maxX: roiLayers[selectedLayer].layer.regionRois[selectedRoi].bounds.left,\r\n maxY: roiLayers[selectedLayer].layer.regionRois[selectedRoi].bounds.top,\r\n minX: roiLayers[selectedLayer].layer.regionRois[selectedRoi].bounds.right,\r\n minY: roiLayers[selectedLayer].layer.regionRois[selectedRoi].bounds\r\n .bottom,\r\n roi: roiLayers[selectedLayer].layer.regionRois[selectedRoi],\r\n };\r\n };\r\n\r\n blockPrevious = () => {\r\n const { roiLayers, selectedLayer, onChangeTool } = this.props;\r\n const numberRegionRois = roiLayers[selectedLayer].layer.regionRois.length;\r\n\r\n // if no grid\r\n if (numberRegionRois === 0) {\r\n window.showWarningSnackbar(\"Please create a grid before annotating\");\r\n onChangeTool(this.gridtool);\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n onPrevious = () => {\r\n if (this.blockPrevious()) return;\r\n\r\n const { tools, roiLayers, selectedLayer, onChangeTool, resultTab } =\r\n this.props;\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n const roiItem = this.setRoiItem(roiLayers, selectedLayer, selectedRoi);\r\n\r\n if (this.isHistoClass) {\r\n this.previousHistoClassification();\r\n } else if (this.isHistoPntC) {\r\n this.previousHistoPointCounting();\r\n }\r\n tools[this.tile].setNextTile(roiItem);\r\n onChangeTool(this.tile);\r\n\r\n this.store.save(\"selectedRoi\", resultTab.getSelectedRoi());\r\n };\r\n\r\n previousHistoClassification = () => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n\r\n this.checkIfSkipped();\r\n // if first tile of scene go to previous file last tile\r\n if (this.props.resultTab.getSelectedRoi() === 0) {\r\n // change file\r\n let prevFileId = this.getPrevFileId();\r\n if (prevFileId) {\r\n let numberTiles = roiLayers[selectedLayer].layer.regionRois.length;\r\n this.props.resultTab.setSelectedRoi(numberTiles - 1);\r\n this.props.resultTab.setSelectedChildIndex(1);\r\n window.showWarningSnackbar(\"Please wait, loading previous file ...\");\r\n this.props.onSelectFile(prevFileId);\r\n this.props.resultTab.setZoomLevelFixed(false);\r\n this.setClassToZero();\r\n } else {\r\n return;\r\n }\r\n } else {\r\n let nextRoi = this.props.resultTab.getSelectedRoi() - 1;\r\n this.props.resultTab.setSelectedRoi(nextRoi);\r\n this.props.resultTab.setSelectedChildIndex(1);\r\n this.setClassToZero();\r\n }\r\n };\r\n\r\n previousHistoPointCounting = () => {\r\n const { resultTab, onSelectFile } = this.props;\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n const lastTileIndices = this.store.load(\"tileIndices\");\r\n let nextRoi;\r\n\r\n // if first tile of scene do nothing\r\n if (selectedRoi === 0) {\r\n const prevFileId = this.getPrevFileId();\r\n if (prevFileId) {\r\n const roiFile = lastTileIndices ? lastTileIndices[prevFileId] : 0;\r\n // get tile index from previous file\r\n resultTab.setSelectedRoi(roiFile);\r\n resultTab.setSelectedChildIndex(1);\r\n resultTab.setZoomLevelFixed(false);\r\n resultTab.setHundredTiles(false);\r\n window.showWarningSnackbar(\"Please wait, loading previous file ...\");\r\n onSelectFile(prevFileId);\r\n } else {\r\n return;\r\n }\r\n } else {\r\n // if first tile of blue tiles from specification\r\n if (resultTab.getSelectedRoi() === 21) {\r\n // set last red tile from specification\r\n resultTab.setSelectedRoi(378);\r\n return;\r\n }\r\n\r\n // check if last tile in row --> then skip next row\r\n if (selectedRoi % 20 === 0 || selectedRoi % 20 === 1) {\r\n nextRoi = selectedRoi - 22;\r\n } else {\r\n nextRoi = selectedRoi - 2;\r\n }\r\n\r\n resultTab.setSelectedRoi(nextRoi);\r\n }\r\n };\r\n\r\n blockNext = () => {\r\n const { roiLayers, selectedLayer, onChangeTool, resultTab } = this.props;\r\n const numberTiles = roiLayers[selectedLayer].layer.regionRois.length;\r\n\r\n // if file is changing no classification is possible for a few seconds\r\n if (resultTab.getFileChange()) return true;\r\n\r\n // if no grid is initialized yet no classification is possible\r\n if (numberTiles === 0) {\r\n window.showWarningSnackbar(\"Please create a grid before annotating\");\r\n onChangeTool(this.gridtool);\r\n return true;\r\n }\r\n\r\n // if last tile in last file stop\r\n if (this.nextButtonDisabled() && !resultTab.getFileChange()) {\r\n window.showWarningSnackbar(\"Finished!\");\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n onNext = () => {\r\n if (this.blockNext()) return;\r\n\r\n const { tools, roiLayers, selectedLayer, onChangeTool, resultTab } =\r\n this.props;\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n const roiItem = this.setRoiItem(roiLayers, selectedLayer, selectedRoi);\r\n\r\n // set new selectedRoi\r\n if (this.isHistoClass) {\r\n this.nextHistoClassification();\r\n } else if (this.isHistoPntC) {\r\n this.nextHistoPointCounting();\r\n }\r\n tools[this.tile].setNextTile(roiItem);\r\n onChangeTool(this.tile);\r\n\r\n this.store.save(\"selectedRoi\", resultTab.getSelectedRoi());\r\n };\r\n\r\n nextHistoClassification = () => {\r\n const { roiLayers, selectedLayer, onSelectFile } = this.props;\r\n let selectedRoi = this.props.resultTab.getSelectedRoi();\r\n\r\n this.checkIfSkipped();\r\n\r\n let numberTiles = roiLayers[selectedLayer].layer.regionRois.length;\r\n if (selectedRoi === numberTiles - 1) {\r\n // change file\r\n let nextFileId = this.getNextFileId();\r\n if (nextFileId) {\r\n window.showWarningSnackbar(\"Please wait, loading next file ...\");\r\n onSelectFile(nextFileId);\r\n this.props.resultTab.setZoomLevelFixed(false);\r\n this.props.resultTab.setSelectedRoi(0);\r\n } else {\r\n return;\r\n }\r\n } else {\r\n let nextRoi = this.props.resultTab.getSelectedRoi() + 1;\r\n this.props.resultTab.setSelectedRoi(nextRoi);\r\n }\r\n\r\n this.setClassToZero();\r\n this.props.resultTab.setSelectedChildIndex(1);\r\n };\r\n\r\n checkIfSkipped = () => {\r\n const { structures, roiLayers, resultTab } = this.props;\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n const id_range = this.getRoiLayersIdRange();\r\n\r\n // check if some layer was classified, if so return\r\n for (let id in id_range) {\r\n if (\r\n roiLayers[id_range[id]].layer.regionRois[selectedRoi].frequencyClass !==\r\n 0\r\n ) {\r\n return;\r\n }\r\n }\r\n\r\n // set Class to -1 and reduce counter by one for all Rois\r\n for (let id in id_range) {\r\n roiLayers[id_range[id]].layer.regionRois[selectedRoi].frequencyClass = -1;\r\n for (let e in structures) {\r\n if (structures[e].id === roiLayers[id_range[id]].id) {\r\n structures[e].classFrequencies.class_0 -= 1;\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n\r\n setClassToZero = () => {\r\n const { structures, roiLayers, resultTab } = this.props;\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n const id_range = this.getRoiLayersIdRange();\r\n\r\n // set Class to 0 and increase the according counter\r\n for (let id in id_range) {\r\n if (\r\n roiLayers[id_range[id]].layer.regionRois[selectedRoi].frequencyClass ===\r\n -1\r\n ) {\r\n roiLayers[id_range[id]].layer.regionRois[\r\n selectedRoi\r\n ].frequencyClass = 0;\r\n for (let e in structures) {\r\n if (structures[e].id === roiLayers[id_range[id]].id) {\r\n structures[e].classFrequencies.class_0 += 1;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n getRoiLayersIdRange = () => {\r\n const { structures, roiLayers, selectedLayer } = this.props;\r\n // get ids of RoiLayers that should be set to zero\r\n const tmp = structures.filter(\r\n (element) =>\r\n element.subtypeLevel === structures[selectedLayer].subtypeLevel + 1 &&\r\n element.parentId === structures[selectedLayer].id\r\n );\r\n let roi_min = 99999;\r\n let roi_max = -1;\r\n\r\n roiLayers.filter((element, idx) => {\r\n for (let e in tmp) {\r\n if (tmp[e].id === element.id) {\r\n if (roi_min > idx) {\r\n roi_min = idx;\r\n }\r\n if (roi_max < idx) {\r\n roi_max = idx;\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n\r\n // create a range of ids\r\n let id_range = [...Array(roi_max - roi_min + 1).keys()]; //+roi_min\r\n for (let e in id_range) {\r\n id_range[e] += roi_min;\r\n }\r\n\r\n return id_range;\r\n };\r\n\r\n nextHistoPointCounting = () => {\r\n const { roiLayers, selectedLayer, onSelectFile, fileId, resultTab } =\r\n this.props;\r\n const numberTiles = roiLayers[selectedLayer].layer.regionRois.length;\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n const totalCount = this.getTotalCount();\r\n let lastTileIndices = this.store.load(\"tileIndices\");\r\n let indicesObject = {};\r\n resultTab.setHundredTiles(totalCount >= 100);\r\n\r\n if (\r\n (resultTab.getHundredTiles() && this.isLastClassifiedTile()) ||\r\n selectedRoi === numberTiles - 1\r\n ) {\r\n const nextFileId = this.getNextFileId();\r\n if (nextFileId) {\r\n if (lastTileIndices === undefined) {\r\n indicesObject[fileId] = selectedRoi;\r\n this.store.save(\"tileIndices\", indicesObject);\r\n } else {\r\n lastTileIndices[fileId] = selectedRoi;\r\n this.store.save(\"tileIndices\", lastTileIndices);\r\n }\r\n\r\n window.showWarningSnackbar(\"Please wait, loading next file ...\");\r\n onSelectFile(nextFileId);\r\n resultTab.setFileChange(true);\r\n resultTab.setZoomLevelFixed(false);\r\n resultTab.setSelectedRoi(0);\r\n resultTab.setHundredTiles(false);\r\n return;\r\n }\r\n }\r\n\r\n // check if last tile in row --> then skip next row\r\n let nextRoi;\r\n if (selectedRoi % 20 === 18 || selectedRoi % 20 === 19) {\r\n nextRoi = selectedRoi + 22;\r\n } else {\r\n nextRoi = selectedRoi + 2;\r\n }\r\n\r\n // check if nextRoi exists\r\n if (nextRoi >= numberTiles) {\r\n // roi does not exist --> start with \"blue\" tiles from specifications\r\n nextRoi = 21;\r\n }\r\n\r\n resultTab.setSelectedRoi(nextRoi);\r\n };\r\n\r\n isLastClassifiedTile = () => {\r\n const { structures, roiLayers, selectedLayer, resultTab } = this.props;\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n\r\n // get id of \"leer\" child\r\n let emptyId = 0;\r\n this.findChilds(structures[selectedLayer]).forEach((child) => {\r\n if (child.label === \"leer [leer]\") {\r\n emptyId = child.id;\r\n }\r\n });\r\n\r\n // get all classified tiles\r\n // if selectedRoi is even --> red tile (see specifications)\r\n let classifiedTiles;\r\n if (selectedRoi % 2 === 0) {\r\n classifiedTiles = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (roi, idx) =>\r\n roi.isAnnotated && roi.structureId !== emptyId && idx % 2 === 0\r\n );\r\n } else {\r\n // if selectedRoi is uneven --> blue tile (see specifications)\r\n classifiedTiles = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (roi, idx) =>\r\n roi.isAnnotated && roi.structureId !== emptyId && idx % 2 === 1\r\n );\r\n }\r\n\r\n // get index of last classified tile\r\n const idxLastTile = roiLayers[selectedLayer].layer.regionRois.findIndex(\r\n (element) => element === classifiedTiles[classifiedTiles.length - 1]\r\n );\r\n\r\n // check if blue tiles classified\r\n const blueTiles = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (roi, idx) =>\r\n roi.isAnnotated && roi.structureId !== emptyId && idx % 2 === 1\r\n );\r\n\r\n const blueTilesClassified = blueTiles.length > 0 ? true : false;\r\n\r\n // if selectedRoi has same Index as last classified tile return true\r\n if (idxLastTile === selectedRoi) {\r\n if (selectedRoi === 378 && blueTilesClassified) {\r\n // if last red tile but blue tiles are already classified\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n getNextFileId = () => {\r\n const { project, fileId } = this.props;\r\n const inxCurrentFile = project.files.findIndex(\r\n (element) => element.id === fileId\r\n );\r\n\r\n if (project.files[inxCurrentFile + 1]) {\r\n return project.files[inxCurrentFile + 1].id;\r\n } else {\r\n window.showWarningSnackbar(\"Last file.\");\r\n return null;\r\n }\r\n };\r\n\r\n getPrevFileId = () => {\r\n const { project, fileId } = this.props;\r\n const inxCurrentFile = project.files.findIndex(\r\n (element) => element.id === fileId\r\n );\r\n\r\n if (project.files[inxCurrentFile - 1]) {\r\n return project.files[inxCurrentFile - 1].id;\r\n } else {\r\n window.showWarningSnackbar(\"First file.\");\r\n return null;\r\n }\r\n };\r\n\r\n saveToJSON = () => {\r\n if (this.isHistoClass) {\r\n this.checkIfSkipped();\r\n }\r\n\r\n this.props.onSave();\r\n\r\n if (this.getTotalCount() < 100 && this.isHistoPntC) {\r\n window.showWarningSnackbar(\"Not 100 classified tiles in each file\");\r\n }\r\n\r\n // make excel table with results\r\n Backend.setProjectsPending([this.props.project.id], () => {\r\n console.log(\"project state changed to pending:\", this.props.project.id);\r\n });\r\n };\r\n\r\n onEnd = () => {\r\n this.store.save(\"belongsToFinishedTab\", true);\r\n this.saveToJSON();\r\n\r\n const { history } = this.props;\r\n\r\n setTimeout(\r\n function () {\r\n history.push(\"/\");\r\n },\r\n 3000,\r\n history\r\n );\r\n };\r\n\r\n getTotalCount = () => {\r\n const { structures, roiLayers, selectedLayer } = this.props;\r\n\r\n let emptyId = 0;\r\n this.findChilds(structures[selectedLayer]).forEach((child) => {\r\n if (child.label === \"leer [leer]\") {\r\n emptyId = child.id;\r\n }\r\n });\r\n\r\n // get number of rois that are not of class \"leer\"\r\n let numberRois = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (roi) => roi.isAnnotated && roi.structureId !== emptyId\r\n ).length;\r\n\r\n return numberRois;\r\n };\r\n\r\n renderGridTool = () => {\r\n const { tool } = this.props;\r\n return (\r\n
    \r\n {tool && !tool.noConfig && {tool.renderConfiguration()}}\r\n
    \r\n );\r\n };\r\n\r\n addStructure = () => {\r\n const { projectContext, structures, selectedLayer } = this.props;\r\n const { dynamicStructureText, dynamicStructureAbbrText } = this.state;\r\n\r\n if (dynamicStructureText === \"\") {\r\n window.showWarningSnackbar(\"Please add label of new structure.\");\r\n return;\r\n } else if (dynamicStructureAbbrText === \"\") {\r\n window.showWarningSnackbar(\"Please add abbreviation for new structure.\");\r\n return;\r\n }\r\n\r\n // put label and abbreviation together for label of new structure\r\n const newSubstructureLabel =\r\n dynamicStructureText + \" [\" + dynamicStructureAbbrText + \"]\";\r\n\r\n if (this.isHistoPntC) {\r\n // add new subtype\r\n projectContext.addSubType(\r\n structures[selectedLayer],\r\n newSubstructureLabel,\r\n true\r\n );\r\n }\r\n\r\n this.setState({ dynamicStructureText: \"\", dynamicStructureAbbrText: \"\" });\r\n };\r\n\r\n addSelectedStructures = () => {\r\n const { projectContext, structures, selectedLayer } = this.props;\r\n const { structuresToAdd } = this.state;\r\n\r\n if (this.isHistoClass) {\r\n // add new substructures\r\n structuresToAdd.forEach((newSubstructureLabel) => {\r\n projectContext.addSubStructure(\r\n structures[selectedLayer],\r\n newSubstructureLabel,\r\n true\r\n );\r\n });\r\n }\r\n\r\n this.setState({ structuresToAdd: [], showLabelsToAdd: false });\r\n };\r\n\r\n getCurrentFileInx = () => {\r\n const { project, fileId } = this.props;\r\n return project.files.findIndex((element) => element.id === fileId) + 1;\r\n };\r\n\r\n startOrContinueText = () => {\r\n if (!this.props.tiles.getHistoClassificationStarted()) {\r\n return \"RUN\";\r\n } else {\r\n if (this.isHistoClass) {\r\n return \"RESET ALL FILES\";\r\n } else if (this.isHistoPntC) {\r\n return \"RESET CURRENT FILE\";\r\n } else {\r\n return \"RESET\";\r\n }\r\n }\r\n };\r\n\r\n nextOrSkipText = () => {\r\n if (this.isHistoClass) {\r\n return \"NEXT\";\r\n }\r\n\r\n if (!this.getGridExists()) {\r\n return \"NEXT\";\r\n }\r\n const { roiLayers, resultTab } = this.props;\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n\r\n const id_range = this.getRoiLayersIdRange();\r\n\r\n // set label to \"NEXT\" if Roi has classifications\r\n for (let id in id_range) {\r\n if (roiLayers[id_range[id]].layer.regionRois[selectedRoi] === undefined) {\r\n return \"NEXT\";\r\n }\r\n if (\r\n roiLayers[id_range[id]].layer.regionRois[selectedRoi].frequencyClass !==\r\n 0\r\n ) {\r\n return \"NEXT\";\r\n }\r\n }\r\n return \"SKIP TILE\";\r\n };\r\n\r\n isLastFile = () => {\r\n const { project, fileId } = this.props;\r\n const inxCurrentFile = project.files.findIndex(\r\n (element) => element.id === fileId\r\n );\r\n\r\n if (inxCurrentFile === project.files.length - 1) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n nextButtonDisabled = () => {\r\n const { roiLayers, selectedLayer, resultTab, tiles } = this.props;\r\n\r\n if (resultTab.getFileChange()) return true;\r\n\r\n let disabled;\r\n if (tiles.getHistoClassificationStarted()) {\r\n disabled = false;\r\n } else {\r\n disabled = true;\r\n }\r\n\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n const numberTiles = roiLayers[selectedLayer].layer.regionRois.length;\r\n if (!disabled && this.isHistoClass) {\r\n // if last file and last tile\r\n const lastTileClassification =\r\n selectedRoi === numberTiles - 1 ? true : false;\r\n if (this.isLastFile() && lastTileClassification) {\r\n return true;\r\n }\r\n } else if (!disabled && this.isHistoPntC) {\r\n // last file and last tile or last file and 100 annotated\r\n const lastTileCounting = selectedRoi === numberTiles - 1 ? true : false;\r\n if (\r\n (this.isLastFile() && lastTileCounting) ||\r\n (this.isLastFile() &&\r\n resultTab.getHundredTiles() &&\r\n this.isLastClassifiedTile())\r\n ) {\r\n return true;\r\n }\r\n }\r\n\r\n return disabled;\r\n };\r\n\r\n getAbbreviationOfStructure = (label) => {\r\n let labelWithBracket = label.split(\"[\")[1];\r\n if (!labelWithBracket) {\r\n labelWithBracket = label;\r\n }\r\n const abbreviation = labelWithBracket.substring(\r\n 0,\r\n labelWithBracket.length - 1\r\n );\r\n return abbreviation;\r\n };\r\n\r\n getOtherLabels = () => {\r\n const { structures, selectedLayer } = this.props;\r\n\r\n // get all childs of selected sample\r\n const sampleChilds = structures.filter(\r\n (structure) => structure.parentId === structures[selectedLayer].id\r\n );\r\n\r\n // get all labels sampleChilds\r\n let sampleChildsLabels = [];\r\n sampleChilds.forEach((child) => {\r\n sampleChildsLabels.push(child.label);\r\n });\r\n\r\n // get all labels of histoclassificationlabels that are not in samplechilds\r\n let newLabels = [];\r\n HistoClassififcationLabels.forEach((histoLabel) => {\r\n if (!sampleChildsLabels.includes(histoLabel)) {\r\n newLabels.push(histoLabel);\r\n }\r\n });\r\n\r\n return newLabels;\r\n };\r\n\r\n handleChangeNewStructures = (e, label) => {\r\n // check if add ort remove structure\r\n let updatedStructures = this.state.structuresToAdd;\r\n if (e.target.checked) {\r\n // add structure\r\n updatedStructures.push(label);\r\n } else {\r\n // remove structure\r\n // find index of label and remove it\r\n const idx = updatedStructures.findIndex((labelStr) => labelStr === label);\r\n updatedStructures.splice(idx, 1);\r\n }\r\n\r\n this.setState({ structuresToAdd: updatedStructures });\r\n };\r\n\r\n render() {\r\n const { classes, visible, ...propsWithoutClasses } = this.props;\r\n\r\n if (!visible) return null;\r\n\r\n let numberTilesFile =\r\n this.props.roiLayers[this.props.selectedLayer].layer.regionRois.length;\r\n\r\n let showAddSubstructure = !this.props.tiles.getHistoClassificationStarted();\r\n return (\r\n \r\n \r\n \r\n File {this.getCurrentFileInx()} / {this.props.project.files.length}\r\n \r\n {this.isHistoClass && (\r\n \r\n )}\r\n {this.isHistoPntC && (\r\n \r\n )}\r\n {this.isHistoPntC && showAddSubstructure && (\r\n \r\n \r\n this.setState({\r\n dynamicStructureText: e.target.value,\r\n })\r\n }\r\n />\r\n \r\n this.setState({\r\n dynamicStructureAbbrText: e.target.value,\r\n })\r\n }\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.isHistoClass && showAddSubstructure && (\r\n
    \r\n Add structures:\r\n \r\n {\r\n this.setState({\r\n showLabelsToAdd: !this.state.showLabelsToAdd,\r\n });\r\n }}\r\n size=\"large\"\r\n >\r\n {this.state.showLabelsToAdd ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n
    \r\n )}\r\n\r\n {this.isHistoClass &&\r\n showAddSubstructure &&\r\n this.state.showLabelsToAdd && (\r\n
    \r\n {this.getOtherLabels().map((histoLabel, idx) => {\r\n return (\r\n \r\n {\r\n this.handleChangeNewStructures(e, histoLabel);\r\n }}\r\n />\r\n }\r\n label={this.getAbbreviationOfStructure(histoLabel)}\r\n />\r\n \r\n );\r\n })}\r\n
    \r\n )}\r\n\r\n {this.isHistoClass &&\r\n showAddSubstructure &&\r\n this.state.showLabelsToAdd && (\r\n \r\n this.addSelectedStructures()}\r\n >\r\n Add selected structures\r\n \r\n \r\n )}\r\n\r\n \r\n \r\n {this.props.resultTab.getRendererInitialized() &&\r\n this.props.histogramConfig && (\r\n c}\r\n fileId={this.props.fileId}\r\n />\r\n )}\r\n \r\n \r\n
    \r\n \r\n \r\n this.onNext()}\r\n >\r\n {this.nextOrSkipText()}\r\n \r\n \r\n \r\n this.onPrevious()}\r\n >\r\n Previous\r\n \r\n \r\n \r\n \r\n Tile {this.props.resultTab.getSelectedRoi() + 1} /{\" \"}\r\n {numberTilesFile}\r\n \r\n \r\n \r\n \r\n \r\n this.onStart()}\r\n >\r\n {this.startOrContinueText()}\r\n \r\n \r\n \r\n this.onPause()}\r\n >\r\n Pause\r\n \r\n \r\n \r\n this.onEnd()}\r\n >\r\n End\r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nSideBarTabResults.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n // sidebar tab properties\r\n sideBarWidth: PropTypes.number,\r\n visible: PropTypes.bool,\r\n // general properties\r\n id: PropTypes.string.isRequired,\r\n viewerConfig: PropTypes.object,\r\n // historgram\r\n ome: PropTypes.object,\r\n histogramConfig: PropTypes.object,\r\n onChangeChannels: PropTypes.func,\r\n // file management\r\n onSelectFile: PropTypes.func,\r\n onExcludeFilesToggle: PropTypes.func,\r\n //not ordered\r\n project: PropTypes.object,\r\n resultTab: PropTypes.object,\r\n structures: PropTypes.array,\r\n roiLayers: PropTypes.array,\r\n onSelectLayer: PropTypes.func,\r\n persistentStorage: PropTypes.object,\r\n selectedLayer: PropTypes.number,\r\n tools: PropTypes.array,\r\n onChangeTool: PropTypes.func,\r\n tiles: PropTypes.object,\r\n allRoiLayers: PropTypes.object,\r\n fileId: PropTypes.string,\r\n onSave: PropTypes.func,\r\n history: PropTypes.object,\r\n tool: PropTypes.object,\r\n projectContext: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(\r\n withAllViewerContexts(\r\n withTiles(withResultTab(withStyles(styles)(SideBarTabResults)))\r\n )\r\n);\r\n","// Copyright: HS Analysis GmbH, 2019\r\n// Author: Viktor Eberhardt\r\n\r\n// Framework imports\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// External packages\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport Grid from \"@mui/material/Grid\";\r\nimport Tabs from \"@mui/material/Tabs\";\r\nimport Tab from \"@mui/material/Tab\";\r\n\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport {\r\n faPencilRuler,\r\n faCog,\r\n faBrain,\r\n faChartBar,\r\n} from \"@fortawesome/free-solid-svg-icons\";\r\n\r\n// HSA imports\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { Role } from \"../../common/utils\";\r\nimport { authenticationService } from \"../../common/services\";\r\n\r\nimport { Tools } from \"./VerticalToolBar\";\r\nimport { withAllViewerContexts } from \"../contexts/AllViewerContexts\";\r\n\r\nimport SideBarTabAI from \"./sidebar/SideBarTabAI\";\r\nimport SideBarTabRois from \"./sidebar/SideBarTabRois\";\r\nimport SideBarTabView from \"./sidebar/SideBarTabView\";\r\nimport SideBarTabResults from \"./sidebar/SideBarTabResults\";\r\n\r\nimport {\r\n DatasetType,\r\n DatasetTypeNames,\r\n DatasetApproach,\r\n} from \"../../common/components/AITrainingSettings\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n sidebar: {\r\n margin: 0,\r\n background: \"#fff\",\r\n },\r\n tabsContainer: {\r\n width: \"100%\",\r\n \"& .MuiTabs-fixed\": {\r\n minHeight: 44,\r\n height: 44,\r\n },\r\n },\r\n tab: {\r\n minWidth: 395 / 3,\r\n minHeight: 44,\r\n height: 44,\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n \"& *\": {\r\n display: \"inline-block\",\r\n fontSize: \"16px\",\r\n lineHeight: \"16px\",\r\n },\r\n \"& svg\": {\r\n marginRight: \"5px\",\r\n position: \"relative\",\r\n top: \"4px\",\r\n },\r\n },\r\n flexVerticalContainer: {\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"60px 1fr\",\r\n },\r\n flexRowContentHeight: {\r\n //flex: \"0 1 auto\",\r\n padding: 10,\r\n },\r\n tabContentContainer: {\r\n display: \"grid\",\r\n gridTemplateRows: \"1fr auto\",\r\n height: \"100%\",\r\n overflow: \"hidden\",\r\n },\r\n});\r\n\r\nclass SideBar extends Component {\r\n _isMounted = false;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n activeTab: 0,\r\n channelSelectMode: \"all\",\r\n availableModels: [],\r\n currentUser: null,\r\n isAdmin: false,\r\n modelsInitialized: false,\r\n };\r\n\r\n window.forceSidebarUpdate = this.forceSidebarUpdate;\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n forceSidebarUpdate = () => {\r\n this.forceUpdate();\r\n };\r\n\r\n componentDidMount = () => {\r\n this._isMounted = true;\r\n // set active tab from local storage\r\n let activeTab = this.props.persistentStorage.load(\"activeTab\");\r\n if (activeTab) {\r\n if (activeTab !== this.state.activeTab) {\r\n this.setMountedState({ activeTab: activeTab });\r\n }\r\n this.props.projectContext.setActiveTab(activeTab);\r\n }\r\n authenticationService.currentUser.subscribe((x) => {\r\n this.setMountedState({\r\n currentUser: x,\r\n isAdmin: x && x.role === Role.Admin,\r\n });\r\n });\r\n\r\n // only load ai data if ai tab is present\r\n if (this.props.viewerConfig.project.toolsInProject[\"AICockpit\"]) {\r\n this.initAIFormData(false);\r\n this.initAICockpitData();\r\n }\r\n };\r\n\r\n initAICockpitData = () => {\r\n let aiStateObject = {\r\n open: false,\r\n activeStep: 0,\r\n maxEpochs: 0,\r\n stepsProgress: \"-\",\r\n epochsProgress: \"-\",\r\n showTrainingButton: true,\r\n buildingModel: false,\r\n showTrainingProgress: false,\r\n trainingFinished: false,\r\n newModelName: \"\",\r\n overallProgress: 0.0,\r\n trainingSuccessful: true,\r\n startTrainingTime: null,\r\n errorLabel: \"Failed\",\r\n metricsDict: {},\r\n formData: {\r\n modelType: DatasetType.ImageSegmentation,\r\n datasetOnly: false,\r\n fullScene:\r\n this.props.viewerConfig.project.projectStringProperties[\r\n \"ViewerType\"\r\n ] == \"Gallery\",\r\n selStructures: [],\r\n structureIndices: [],\r\n augmentations: [\"h_flip\", \"v_flip\"],\r\n metaData: {\r\n modelName: \"\",\r\n versionName: \"001\",\r\n newModel: true,\r\n uniqueName: false,\r\n validChar: false,\r\n },\r\n advancedSettings: {\r\n backbones: {\r\n unet: [],\r\n unet_pp: [],\r\n deepLabV3_p: [],\r\n classification_models: [],\r\n },\r\n lossFunction: \"Cross Entropy\",\r\n comDLArchitecture: null,\r\n level: this.props.ome.maxLevel,\r\n physicalSize: this.props.ome.physicalSizeX\r\n ? this.props.ome.physicalSizeX\r\n : 1,\r\n physicalSizeUnit: this.props.ome.physicalSizeXUnit\r\n ? this.props.ome.physicalSizeXUnit\r\n : \"px\",\r\n in_channels: this.setInputChannels(),\r\n flChannels: this.setFlChannels(),\r\n modelsize: \"m\",\r\n epochs: 100,\r\n optimizer: \"Adam\",\r\n lr: 0.0001,\r\n batch_size: 2,\r\n datasetApproach: DatasetApproach.ImageSlidingWindow,\r\n includeBackgroundTiles: false,\r\n tileSize: 512,\r\n overlap: 64,\r\n objectBasedBaseStructure: null,\r\n calculateWeightMap: false,\r\n useExistingDataset: false,\r\n useClassWeights: false,\r\n },\r\n },\r\n };\r\n\r\n this.props.projectContext.setState({\r\n aiStateObject: aiStateObject,\r\n });\r\n };\r\n\r\n setInputChannels = () => {\r\n const { ome } = this.props;\r\n let isBrightfield =\r\n ome &&\r\n ome.channels.length === 1 &&\r\n ome.channels[0].type === \"brightfield\";\r\n\r\n return isBrightfield ? 3 : ome.channels.length;\r\n };\r\n\r\n setFlChannels = () => {\r\n const { ome, histogramConfig, fileId } = this.props;\r\n let isBrightfield =\r\n ome &&\r\n ome.channels.length === 1 &&\r\n ome.channels[0].type === \"brightfield\";\r\n\r\n if (histogramConfig[fileId] && !isBrightfield) {\r\n return histogramConfig[fileId].channels.map((c) => c.name);\r\n } else {\r\n return [];\r\n }\r\n };\r\n\r\n componentWillUnmount = () => {\r\n this._isMounted = false;\r\n };\r\n\r\n setAvailableModels = (availableModels) => {\r\n this.setMountedState({ availableModels: availableModels });\r\n };\r\n\r\n setModelsInitialized = (initialized) => {\r\n this.setMountedState({ modelsInitialized: initialized });\r\n };\r\n\r\n loadPersistentDefaultModels = () => {\r\n let defaultModels = this.props.persistentStorage.loadProjectTypeValue(\r\n this.props.project.type,\r\n \"defaultModels\"\r\n );\r\n return Array.isArray(defaultModels) ? defaultModels : [];\r\n };\r\n\r\n /**\r\n * Request all model data from disk and optionally from online sources.\r\n * @param {bool} connectOnline Should models be donwloaded from the HSA online server. Defaults to false.\r\n */\r\n initAIFormData = (connectOnline = false) => {\r\n this.setMountedState({ modelsInitialized: false });\r\n Backend.initPythonModules();\r\n\r\n Backend.getModelMetadata(\"hsa_models\", connectOnline, (aiModels) => {\r\n // TODO Viktor: please check online mode\r\n\r\n const formDataAICockpit = {};\r\n\r\n // Set selected models for each structure\r\n // start with index 1 -> skip Base ROI\r\n for (let i = 1; i < this.props.structures.length; i++) {\r\n let s = this.props.structures[i];\r\n let selected_model = null;\r\n let selected_version = null;\r\n if (this.props.formDataAICockpit != null) {\r\n if (typeof this.props.formDataAICockpit[s.id] !== \"undefined\") {\r\n selected_model = this.props.formDataAICockpit[s.id].selectedModel;\r\n\r\n if (\r\n selected_model !== null &&\r\n this.props.formDataAICockpit[s.id].models[selected_model]\r\n ) {\r\n selected_version =\r\n this.props.formDataAICockpit[s.id].models[selected_model]\r\n .selectedVersion;\r\n }\r\n }\r\n }\r\n\r\n formDataAICockpit[s.id] = {\r\n structureIndex: i,\r\n selectedModel: selected_model,\r\n selectedVersion: selected_version,\r\n modelType: null,\r\n fullStructure: s,\r\n models: {},\r\n };\r\n\r\n for (let model of aiModels.newModels) {\r\n formDataAICockpit[s.id].models[model.settings.meta_data.name] = {\r\n selectedVersion: \"001\",\r\n modelType:\r\n DatasetTypeNames[model.settings.dataset_parameters.dataset_type],\r\n };\r\n }\r\n }\r\n\r\n this.setMountedState({\r\n availableModels: aiModels.newModels,\r\n modelsInitialized: true,\r\n });\r\n\r\n this.props.projectContext.setState({\r\n aiModelRepository: aiModels.newModels,\r\n });\r\n\r\n // when project not saved yet\r\n // try to apply models in project config\r\n Backend.loadProject({ id: this.props.project.id }, (project) => {\r\n if (project.projectData === null) {\r\n const stringProperties =\r\n this.props.viewerConfig.project.projectStringProperties;\r\n\r\n let defaultModels = this.loadPersistentDefaultModels();\r\n if (defaultModels.length === 0 && stringProperties.DefaultModels) {\r\n defaultModels = stringProperties.DefaultModels.split(\",\");\r\n }\r\n }\r\n\r\n // check if selected models still exist, otherwise, deselect it!\r\n for (const structure of Object.values(formDataAICockpit)) {\r\n if (structure.selectedModel !== null) {\r\n const modelInRepo = aiModels.newModels.find(\r\n (item) => item.settings.meta_data.name === structure.selectedModel\r\n );\r\n if (typeof modelInRepo === \"undefined\") {\r\n structure.selectedModel = null;\r\n structure.selectedVersion = null;\r\n }\r\n }\r\n }\r\n\r\n this.props.setAIFormData(formDataAICockpit);\r\n });\r\n });\r\n };\r\n\r\n componentDidUpdate() {\r\n const { activeTool } = this.props;\r\n if (\r\n activeTool === \"none\" ||\r\n typeof activeTool === \"undefined\" ||\r\n activeTool === Tools.NONE ||\r\n activeTool === \"iam_ai_inference\" ||\r\n (activeTool === \"gridtool\" &&\r\n !(\r\n this.props.project.type.includes(\"HistoPointCounting\") ||\r\n this.props.project.type.includes(\"HistoClassification\")\r\n ))\r\n )\r\n return;\r\n }\r\n\r\n handleTabChange = (event, value) => {\r\n const { project } = this.props;\r\n\r\n if (value === this.state.activeTab) return;\r\n // select tool coresponding to roilayer roi tab\r\n if (value === 1 && this.props.activeTool === \"none\") {\r\n if (this.props.structures[this.props.selectedLayer].tools[0]) {\r\n let toolName =\r\n this.props.structures[this.props.selectedLayer].tools[0].name;\r\n if (\r\n (toolName =\r\n \"iam_ai_inference\" &&\r\n !this.props.aiUsedStructures.filter(\r\n (e) => e.id === this.props.structures[this.props.selectedLayer].id\r\n ).length > 0)\r\n ) {\r\n toolName = \"none\";\r\n }\r\n\r\n this.props.onChangeTool(toolName);\r\n }\r\n }\r\n\r\n // make tools to none if view tab is selected for some cases\r\n if (value === 0) {\r\n if (\r\n project.type.includes(\"HistoPointCounting\") ||\r\n project.type.includes(\"HistoClassification\") ||\r\n (this.props.activeTool && this.props.activeTool.includes(\"iam_\"))\r\n ) {\r\n this.props.onChangeTool(\"none\");\r\n }\r\n }\r\n\r\n // if resultTab select coresponding tools\r\n if (this.isResultTab(value)) {\r\n if (project.type.includes(\"HistoPointCounting\")) {\r\n this.props.onChangeTool(\"pointcountingtile\");\r\n } else if (project.type.includes(\"HistoClassification\")) {\r\n this.props.onChangeTool(\"selectiontile\");\r\n }\r\n }\r\n\r\n // save active tab to local storage\r\n if (this.state.activeTab !== value) {\r\n this.props.persistentStorage.save(\"activeTab\", value);\r\n this.setMountedState({ activeTab: value });\r\n }\r\n this.props.projectContext.setActiveTab(value);\r\n\r\n // only update if sidebar width changed\r\n if (\r\n project.type.includes(\"HistoPointCounting\") ||\r\n project.type.includes(\"HistoClassification\")\r\n ) {\r\n setTimeout(() => this.props.setSideBarWidth(), 50);\r\n }\r\n };\r\n\r\n isResultTab = (tab) => {\r\n // check if active tab is result tab\r\n if (!this.checkToolInConfig(\"ResultTab\")) {\r\n return false;\r\n }\r\n\r\n // check which tabs exist in module --> then decide which index result tab has\r\n let nextTab = tab;\r\n if (\r\n this.checkToolInConfig(\"AICockpit\") &&\r\n this.checkToolInConfig(\"RoiTab\")\r\n ) {\r\n // resultTab = 3\r\n return nextTab === 3;\r\n } else if (\r\n this.checkToolInConfig(\"AICockpit\") ||\r\n this.checkToolInConfig(\"RoiTab\")\r\n ) {\r\n // resultTab = 2\r\n return nextTab === 2;\r\n } else {\r\n // resultTab = 1\r\n return nextTab === 1;\r\n }\r\n };\r\n\r\n changeChannelSelectMode = (mode) => {\r\n this.setMountedState({\r\n channelSelectMode: mode,\r\n });\r\n };\r\n\r\n checkToolInConfig(toolName) {\r\n if (this.props.viewerConfig) {\r\n if (this.props.viewerConfig.project.toolsInProject[toolName]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n getActiveTabResults = () => {\r\n // get tab number/index for reslults tab\r\n // if AICockpit in project module results tab is number 3\r\n if (\r\n this.checkToolInConfig(\"AICockpit\") &&\r\n this.checkToolInConfig(\"RoiTab\")\r\n ) {\r\n return 3;\r\n } else if (\r\n this.checkToolInConfig(\"AICockpit\") ||\r\n this.checkToolInConfig(\"RoiTab\")\r\n ) {\r\n return 2;\r\n } else {\r\n return 1;\r\n }\r\n };\r\n\r\n renderCommentTool = () => {\r\n const { tool } = this.props;\r\n return (\r\n
    \r\n {tool && !tool.noConfig && {tool.renderConfiguration()}}\r\n
    \r\n );\r\n };\r\n\r\n render() {\r\n const { classes, ...propsWithoutClasses } = this.props;\r\n const { rois, roiLayers, activeTool, showGallery, rendererRef, tool } =\r\n this.props;\r\n const { activeTab, isAdmin } = this.state;\r\n const { annotationsReduced, totalRoiCount } = this.props.projectContext;\r\n\r\n if (!roiLayers) return null;\r\n\r\n let roiCount = 0;\r\n const gridTileCount =\r\n rendererRef && rendererRef.gridTileCount ? rendererRef.gridTileCount : 0;\r\n if (annotationsReduced) {\r\n roiCount = totalRoiCount;\r\n } else if (rendererRef) {\r\n roiCount =\r\n rois.length -\r\n gridTileCount +\r\n roiLayers.reduce((acc, cur) => acc + cur.layer.regionRois.length, 0);\r\n }\r\n\r\n return (\r\n \r\n \r\n }\r\n label=\"View\"\r\n >\r\n {this.checkToolInConfig(\"RoiTab\") && rendererRef && (\r\n }\r\n label={\"ROIS (\" + roiCount + \")\"}\r\n />\r\n )}\r\n {this.checkToolInConfig(\"AICockpit\") && (\r\n }\r\n label=\"AI\"\r\n >\r\n )}\r\n {this.checkToolInConfig(\"ResultTab\") && (\r\n }\r\n label=\"scoring\"\r\n >\r\n )}\r\n \r\n {activeTool !== \"comment\" || activeTool !== \"landmark\" ? (\r\n
    \r\n \r\n {this.checkToolInConfig(\"RoiTab\") && (\r\n \r\n )}\r\n {this.checkToolInConfig(\"AICockpit\") && (\r\n \r\n )}\r\n {this.checkToolInConfig(\"ResultTab\") && (\r\n (this.sideBarTabResults = c)}\r\n visible={\r\n activeTab === this.getActiveTabResults() && !showGallery\r\n }\r\n {...propsWithoutClasses}\r\n />\r\n )}\r\n {tool && !tool.noConfig && (\r\n \r\n {tool.renderConfiguration()}\r\n \r\n )}\r\n
    \r\n ) : (\r\n
    {this.renderCommentTool()}
    \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nSideBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n sideBarWidth: PropTypes.number,\r\n viewerConfig: PropTypes.object,\r\n alterStructure: PropTypes.func,\r\n histogramConfig: PropTypes.object,\r\n onChangeChannels: PropTypes.func,\r\n id: PropTypes.string.isRequired,\r\n ome: PropTypes.object,\r\n rois: PropTypes.array,\r\n onCenterROI: PropTypes.func,\r\n onHoverROI: PropTypes.func,\r\n onSelectFile: PropTypes.func,\r\n onExcludeFileToggle: PropTypes.func,\r\n // roiLayers\r\n roiLayers: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n onChangeLayers: PropTypes.func,\r\n onChangeTool: PropTypes.func,\r\n deleteforAllScenes: PropTypes.func,\r\n // tools\r\n activeTool: PropTypes.string,\r\n tool: PropTypes.object,\r\n // opacity slider\r\n opacity: PropTypes.number,\r\n onChangeOpacity: PropTypes.func,\r\n // Parameterset Export Import\r\n onExportParameters: PropTypes.func,\r\n onImportParameters: PropTypes.func,\r\n formDataAICockpit: PropTypes.object,\r\n onUpdateDimensions: PropTypes.func,\r\n onSave: PropTypes.func,\r\n //not ordered\r\n persistentStorage: PropTypes.object,\r\n projectContext: PropTypes.object,\r\n project: PropTypes.object,\r\n rendererRef: PropTypes.object,\r\n setSideBarWidth: PropTypes.func,\r\n showGallery: PropTypes.bool,\r\n structures: PropTypes.array,\r\n setAIFormData: PropTypes.func,\r\n setAiUsedStructures: PropTypes.func,\r\n aiUsedStructures: PropTypes.array,\r\n fileId: PropTypes.string,\r\n};\r\n\r\nexport default withAllViewerContexts(withStyles(styles)(SideBar));\r\n","import React, { Component } from \"react\";\r\n\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport * as THREE from \"three\";\r\n\r\nclass ViewHelper extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n scene: new THREE.Scene(),\r\n renderer: new THREE.WebGLRenderer({ antialias: true, alpha: true }),\r\n camera: new THREE.PerspectiveCamera(75, 800 / 800, 0.1, 1000),\r\n propsCam: this.props.camera,\r\n cameraPosition: new THREE.Vector3(0, 0, 1),\r\n focusPoint: new THREE.Vector3(0, 0, 0),\r\n };\r\n }\r\n\r\n componentDidMount = () => {\r\n let width = this.props.viewHelperSize;\r\n let height = this.props.viewHelperSize;\r\n //Config Renderer\r\n this.state.renderer.setClearColor(0x000000, 0);\r\n this.state.renderer.setSize(width, height);\r\n this.mount.appendChild(this.state.renderer.domElement);\r\n //Config Camera\r\n let cameraPosition = new THREE.Vector3(0, 0, 1);\r\n let focusPoint = new THREE.Vector3(0, 0, 0);\r\n this.setState({\r\n cameraPosition,\r\n focusPoint,\r\n });\r\n this.state.camera.position.set(\r\n cameraPosition.x,\r\n cameraPosition.y,\r\n cameraPosition.z\r\n );\r\n this.state.camera.lookAt(focusPoint);\r\n // Custom Axes\r\n let color1 = new THREE.Color(\"#ff3653\");\r\n let color2 = new THREE.Color(\"#8adb00\");\r\n let color3 = new THREE.Color(\"#2c8fff\");\r\n let geometry = new THREE.BoxGeometry(0.4, 0.01, 0.01).translate(0.2, 0, 0);\r\n let xAxis = new THREE.Mesh(geometry, this.getAxisMaterial(color1));\r\n let yAxis = new THREE.Mesh(geometry, this.getAxisMaterial(color2));\r\n let zAxis = new THREE.Mesh(geometry, this.getAxisMaterial(color3));\r\n yAxis.rotation.z = Math.PI / 2;\r\n zAxis.rotation.y = -Math.PI / 2;\r\n this.state.scene.add(xAxis);\r\n this.state.scene.add(zAxis);\r\n this.state.scene.add(yAxis);\r\n let posXAxisHelper = new THREE.Sprite(this.getSpriteMaterial(color1, \"X\"));\r\n posXAxisHelper.userData.type = \"posX\";\r\n let posYAxisHelper = new THREE.Sprite(this.getSpriteMaterial(color2, \"Z\"));\r\n posYAxisHelper.userData.type = \"posY\";\r\n let posZAxisHelper = new THREE.Sprite(this.getSpriteMaterial(color3, \"Y\"));\r\n posZAxisHelper.userData.type = \"posZ\";\r\n let negXAxisHelper = new THREE.Sprite(this.getSpriteMaterial(color1));\r\n negXAxisHelper.userData.type = \"negX\";\r\n let negYAxisHelper = new THREE.Sprite(this.getSpriteMaterial(color2));\r\n negYAxisHelper.userData.type = \"negY\";\r\n let negZAxisHelper = new THREE.Sprite(this.getSpriteMaterial(color3));\r\n negZAxisHelper.userData.type = \"negZ\";\r\n posXAxisHelper.position.x = 0.4;\r\n posYAxisHelper.position.y = 0.4;\r\n posZAxisHelper.position.z = 0.4;\r\n negXAxisHelper.position.x = -0.4;\r\n negYAxisHelper.position.y = -0.4;\r\n negZAxisHelper.position.z = -0.4;\r\n posXAxisHelper.scale.setScalar(0.3);\r\n negXAxisHelper.scale.setScalar(0.2);\r\n posYAxisHelper.scale.setScalar(0.3);\r\n negYAxisHelper.scale.setScalar(0.2);\r\n posZAxisHelper.scale.setScalar(0.3);\r\n negZAxisHelper.scale.setScalar(0.2);\r\n this.state.scene.add(posXAxisHelper);\r\n this.state.scene.add(posYAxisHelper);\r\n this.state.scene.add(posZAxisHelper);\r\n this.state.scene.add(negXAxisHelper);\r\n this.state.scene.add(negYAxisHelper);\r\n this.state.scene.add(negZAxisHelper);\r\n this.renderScene();\r\n //start animation\r\n this.start();\r\n };\r\n\r\n getAxisMaterial = (color) => {\r\n return new THREE.MeshBasicMaterial({ color: color, toneMapped: false });\r\n };\r\n\r\n getSpriteMaterial = (color, text = null) => {\r\n let canvas = document.createElement(\"canvas\");\r\n canvas.width = 64;\r\n canvas.height = 64;\r\n\r\n let context = canvas.getContext(\"2d\");\r\n context.beginPath();\r\n context.arc(32, 32, 16, 0, 2 * Math.PI);\r\n context.closePath();\r\n context.fillStyle = color.getStyle();\r\n context.fill();\r\n\r\n if (text !== null) {\r\n context.font = \"24px Arial\";\r\n context.textAlign = \"center\";\r\n context.fillStyle = \"#000000\";\r\n context.fillText(text, 32, 41);\r\n }\r\n let texture = new THREE.CanvasTexture(canvas);\r\n\r\n return new THREE.SpriteMaterial({ map: texture, toneMapped: false });\r\n };\r\n\r\n renderScene = () => {\r\n if (this.state.renderer) {\r\n let cameraPosition = new THREE.Vector3(0, 0, 1).applyQuaternion(\r\n this.props.camera.quaternion\r\n );\r\n // let cube = this.state.scene.children[2];\r\n let posXAxisHelper = this.state.scene.children[3];\r\n let posYAxisHelper = this.state.scene.children[4];\r\n let posZAxisHelper = this.state.scene.children[5];\r\n let negXAxisHelper = this.state.scene.children[6];\r\n let negYAxisHelper = this.state.scene.children[7];\r\n let negZAxisHelper = this.state.scene.children[8];\r\n\r\n if (cameraPosition.x >= 0) {\r\n posXAxisHelper.material.opacity = 1;\r\n negXAxisHelper.material.opacity = 0.5;\r\n } else {\r\n posXAxisHelper.material.opacity = 0.5;\r\n negXAxisHelper.material.opacity = 1;\r\n }\r\n if (cameraPosition.y >= 0) {\r\n posYAxisHelper.material.opacity = 1;\r\n negYAxisHelper.material.opacity = 0.5;\r\n } else {\r\n posYAxisHelper.material.opacity = 0.5;\r\n negYAxisHelper.material.opacity = 1;\r\n }\r\n if (cameraPosition.z >= 0) {\r\n posZAxisHelper.material.opacity = 1;\r\n negZAxisHelper.material.opacity = 0.5;\r\n } else {\r\n posZAxisHelper.material.opacity = 0.5;\r\n negZAxisHelper.material.opacity = 1;\r\n }\r\n\r\n this.state.camera.position.set(\r\n cameraPosition.x,\r\n cameraPosition.y,\r\n cameraPosition.z\r\n );\r\n this.state.camera.position.set(\r\n cameraPosition.x,\r\n cameraPosition.y,\r\n cameraPosition.z\r\n );\r\n this.state.camera.lookAt(this.state.focusPoint);\r\n this.state.renderer.render(this.state.scene, this.state.camera);\r\n }\r\n };\r\n\r\n start = () => {\r\n if (!this.frameId) {\r\n this.frameId = requestAnimationFrame(this.animate);\r\n }\r\n };\r\n\r\n stop = () => {\r\n cancelAnimationFrame(this.frameId);\r\n };\r\n\r\n animate = () => {\r\n //Animate Models Here\r\n //ReDraw Scene with Camera and Scene Object\r\n this.renderScene();\r\n this.frameId = window.requestAnimationFrame(this.animate);\r\n };\r\n\r\n render() {\r\n return (\r\n (this.mount = ref)}\r\n style={{ position: \"absolute\", right: 0, bottom: 0 }}\r\n />\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nViewHelper.propTypes = {\r\n viewHelperSize: PropTypes.number,\r\n camera: PropTypes.object,\r\n};\r\n\r\nexport default ViewHelper;\r\n","// ... App.js\r\n\r\nimport React, { Component } from \"react\";\r\n\r\nimport PropTypes from \"prop-types\";\r\nimport { withSpinloader } from \"../../common/components/Spinloader\";\r\n\r\n// 3D-Viewer Libraries\r\nimport * as THREE from \"three\";\r\nimport { GLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader\";\r\nimport { OrbitControls } from \"three/examples/jsm/controls/OrbitControls\";\r\nimport ViewHelper from \"./3DViewHelper\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faInfo } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { Typography } from \"@mui/material\";\r\n\r\n// Custom Components\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nconst styles = {\r\n root: {\r\n pointerEvents: \"none\",\r\n width: \"auto\",\r\n maxWidth: \"600px\",\r\n height: 46,\r\n\r\n position: \"absolute\",\r\n top: 10,\r\n left: 5,\r\n color: \"#ffffff\",\r\n\r\n padding: 0,\r\n \"& :active\": {\r\n outline: \"\",\r\n },\r\n background: \"#000000AA\",\r\n border: \"2px solid rgb(85, 85, 85)\",\r\n borderRadius: 10,\r\n },\r\n barIcon: {\r\n position: \"absolute\",\r\n top: 2,\r\n left: 0,\r\n height: 36,\r\n width: \"36px!important\",\r\n padding: 8,\r\n color: \"#ffffff\",\r\n },\r\n infoArea: {\r\n paddingLeft: \"40px\",\r\n paddingRight: \"10px\",\r\n right: 0,\r\n top: 0,\r\n bottom: 0,\r\n color: \"#fff\",\r\n },\r\n};\r\n\r\nclass Viewer3D extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n if (props.componentRef) props.componentRef(this);\r\n this.state = {\r\n width: 800,\r\n height: 800,\r\n viewHelperSize: 128,\r\n mode: \"Loading\",\r\n status: \"Loading\",\r\n };\r\n this.scene = new THREE.Scene();\r\n this.renderer3D = new THREE.WebGLRenderer({ antialias: true });\r\n this.camera = new THREE.PerspectiveCamera(75, 800 / 800, 0.1, 1000);\r\n }\r\n\r\n componentDidMount = () => {\r\n const container = document.getElementById(\"3dViewerContainer\");\r\n let width = container.offsetWidth;\r\n let height = container.offsetHeight;\r\n this.setState({ width });\r\n this.setState({ height });\r\n\r\n this.props.spinloader.show(20);\r\n\r\n //Config Renderer\r\n this.renderer3D.setClearColor(\"#263238\");\r\n this.renderer3D.setSize(width, height);\r\n this.renderer3D.outputEncoding = THREE.sRGBEncoding;\r\n this.renderer3D.toneMappingExposure = 1.0;\r\n this.mount.appendChild(this.renderer3D.domElement);\r\n //Config Camera\r\n this.camera.position.set(0, 0, 500);\r\n this.camera.lookAt(0, 0, 0);\r\n this.camera.aspect = width / height;\r\n this.camera.updateProjectionMatrix();\r\n // add Light to camera and scene\r\n let color = 0xffffff;\r\n let intensity = 1;\r\n let light = new THREE.DirectionalLight(color, intensity);\r\n light.position.set(0.5, 0, 0.866);\r\n this.camera.add(light);\r\n this.scene.add(this.camera);\r\n\r\n color = 0x222222;\r\n light = new THREE.AmbientLight(color, intensity);\r\n this.scene.add(light);\r\n\r\n //Camera Controls\r\n this.controls = new OrbitControls(this.camera, this.renderer3D.domElement);\r\n //LIGHTS\r\n\r\n // add GridHelper\r\n // const size = 100;\r\n // const divisions = 20;\r\n // const gridHelper = new THREE.GridHelper(size, divisions);\r\n // this.scene.add(gridHelper);\r\n\r\n // Get variables for analysis\r\n const fileId = this.props.fileId;\r\n const projectId = this.props.projectId;\r\n const minZ = this.props.minZ;\r\n const maxZ = this.props.maxZ;\r\n const zRange = minZ + \",\" + maxZ;\r\n const showPointCloud = this.props.showPointCloud;\r\n\r\n const data = {\r\n fileId,\r\n projectId,\r\n zRange,\r\n showPointCloud,\r\n };\r\n\r\n // Render Scene\r\n this.renderScene();\r\n //start animation\r\n this.start();\r\n\r\n // Adding 3D-Models\r\n let res = Backend.get3dObjects(data);\r\n const gltfLoader = new GLTFLoader();\r\n\r\n gltfLoader.load(\r\n // \"./assets3d/Horse.glb\",\r\n res,\r\n (gltf) => {\r\n const box = new THREE.Box3().setFromObject(gltf.scene);\r\n const center = box.getCenter(new THREE.Vector3());\r\n\r\n gltf.scene.position.x += gltf.scene.position.x - center.x;\r\n gltf.scene.position.y += gltf.scene.position.y - center.y;\r\n gltf.scene.position.z += gltf.scene.position.z - center.z;\r\n\r\n gltf.scene.name = \"object_scene\";\r\n\r\n this.scene.add(gltf.scene);\r\n this.renderScene();\r\n this.setState({ status: \"\" });\r\n this.props.spinloader.hide();\r\n },\r\n // called while loading is progressing\r\n () => {},\r\n // called when loading has errors\r\n (error) => {\r\n console.log(\"An error happened\");\r\n console.log(error);\r\n this.setState({ status: \"ERROR\", mode: \"ERROR\" });\r\n this.props.spinloader.hide();\r\n }\r\n );\r\n\r\n Backend.get3DAllObjectsExists(data, (res) => {\r\n if (res === \"True\") {\r\n this.setState({ mode: \"Job results\" });\r\n } else {\r\n this.setState({ mode: \"Histogram Preview\" });\r\n }\r\n });\r\n };\r\n\r\n componentDidUpdate(prevProps) {\r\n if (prevProps.showPointCloud !== this.props.showPointCloud) {\r\n this.load3DObject(this.props.showPointCloud);\r\n }\r\n }\r\n\r\n load3DObject = (showPointCloud) => {\r\n this.props.spinloader.show(20);\r\n\r\n let selectedObject = this.scene.getObjectByName(\"object_scene\");\r\n this.scene.remove(selectedObject);\r\n console.log(\"showProintCloud\", showPointCloud);\r\n\r\n // Get variables for analysis\r\n const fileId = this.props.fileId;\r\n const projectId = this.props.projectId;\r\n const minZ = this.props.minZ;\r\n const maxZ = this.props.maxZ;\r\n const zRange = minZ + \",\" + maxZ;\r\n\r\n const data = {\r\n fileId,\r\n projectId,\r\n zRange,\r\n showPointCloud,\r\n };\r\n\r\n // Adding 3D-Models\r\n let res = Backend.get3dObjects(data);\r\n const gltfLoader = new GLTFLoader();\r\n\r\n gltfLoader.load(\r\n // \"./assets3d/Horse.glb\",\r\n res,\r\n (gltf) => {\r\n const box = new THREE.Box3().setFromObject(gltf.scene);\r\n const center = box.getCenter(new THREE.Vector3());\r\n\r\n gltf.scene.position.x += gltf.scene.position.x - center.x;\r\n gltf.scene.position.y += gltf.scene.position.y - center.y;\r\n gltf.scene.position.z += gltf.scene.position.z - center.z;\r\n\r\n gltf.scene.name = \"object_scene\";\r\n\r\n this.scene.add(gltf.scene);\r\n this.renderScene();\r\n this.setState({ status: \"\" });\r\n this.props.spinloader.hide();\r\n },\r\n // called while loading is progressing\r\n () => {},\r\n // called when loading has errors\r\n (error) => {\r\n console.log(\"An error happened\");\r\n console.log(error);\r\n this.setState({ status: \"ERROR\", mode: \"ERROR\" });\r\n this.props.spinloader.hide();\r\n }\r\n );\r\n };\r\n\r\n start = () => {\r\n if (!this.frameId) {\r\n this.frameId = requestAnimationFrame(this.animate);\r\n }\r\n };\r\n\r\n stop = () => {\r\n cancelAnimationFrame(this.frameId);\r\n };\r\n\r\n animate = () => {\r\n //Animate Models Here\r\n //ReDraw Scene with Camera and Scene Object\r\n this.renderScene();\r\n this.frameId = window.requestAnimationFrame(this.animate);\r\n };\r\n\r\n renderScene = () => {\r\n if (this.renderer3D) {\r\n this.renderer3D.render(this.scene, this.camera);\r\n }\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n return (\r\n
    \r\n \r\n\r\n
    \r\n \r\n
    \r\n \r\n {this.state.mode}\r\n \r\n \r\n {this.state.status}\r\n \r\n
    \r\n
    \r\n\r\n
    (this.mount = ref)} />\r\n
    \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nViewer3D.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n fileId: PropTypes.string,\r\n ome: PropTypes.object,\r\n projectId: PropTypes.string,\r\n minZ: PropTypes.number,\r\n maxZ: PropTypes.number,\r\n showPointCloud: PropTypes.bool,\r\n componentRef: PropTypes.object,\r\n spinloader: PropTypes.object,\r\n};\r\n\r\n// const rootElement = document.getElementById(\"root\")\r\n// ReactDOM.render(, rootElement);\r\nexport default withSpinloader(withStyles(styles)(Viewer3D));\r\n","class Tool {\r\n name = \"Tool Display Name\";\r\n flag = false;\r\n prevX = 0;\r\n currX = 0;\r\n prevY = 0;\r\n currY = 0;\r\n downScale = 2;\r\n\r\n setLayer() {}\r\n\r\n setPreviewRect() {}\r\n\r\n initDrawing() {}\r\n\r\n updateDrawing() {}\r\n\r\n mouse() {}\r\n\r\n drawCustomCursor() {}\r\n\r\n renderConfiguration() {}\r\n\r\n exit() {}\r\n}\r\n\r\nexport default Tool;\r\n","import React, { Component } from \"react\";\r\n\r\nimport { FormLabel, FormControl, Button, Typography } from \"@mui/material\";\r\nimport Tool from \"./Tool\";\r\n\r\nclass ActiveLearningTool extends Tool {\r\n name = \"Active Learning\";\r\n\r\n setLayer(obj) {\r\n this.id = obj.fileId;\r\n this.layer = obj.layer;\r\n this.ome = obj.ome;\r\n this.projectId = obj.projectId;\r\n this.roiLayers = obj.roiLayers;\r\n this.structures = obj.structures;\r\n this.selectedLayer = obj.selectedLayer;\r\n\r\n if (obj.structures[obj.selectedLayer]) {\r\n this.toolLayerConfig = obj.structures[obj.selectedLayer].tools.find(\r\n (c) => c.name === this.toolConfig.name\r\n );\r\n }\r\n\r\n if (typeof this.toolLayerConfig !== \"undefined\")\r\n Object.assign(this.state, this.toolLayerConfig.parameters);\r\n }\r\n setPreviewRect() {}\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
    \r\n {this.name}:\r\n {\r\n return this.state.preview\r\n ? this.calcPreview(component)\r\n : this.calcFull(component);\r\n }}\r\n />\r\n
    \r\n );\r\n }\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n render() {\r\n return (\r\n
    \r\n \r\n \r\n onApply(this)}*/\r\n >\r\n Start\r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default ActiveLearningTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport MUIDataTable from \"mui-datatables\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n dataTable: {\r\n boxShadow: \"none !important\",\r\n \"& .MuiTableSortLabel-active\": {\r\n height: \"auto !important\",\r\n },\r\n },\r\n});\r\n\r\nconst handleRowClick = () => {\r\n // console.log(rowData, rowMeta);\r\n};\r\n\r\nconst columns = [\r\n {\r\n name: \"name\",\r\n label: \"Name\",\r\n options: {\r\n filter: true,\r\n sort: false,\r\n },\r\n },\r\n {\r\n name: \"structure\",\r\n label: \"Structure\",\r\n options: {\r\n filter: true,\r\n sort: false,\r\n },\r\n },\r\n {\r\n name: \"datetime\",\r\n label: \"Date created\",\r\n options: {\r\n filter: true,\r\n sort: true,\r\n },\r\n },\r\n {\r\n name: \"validationloss\",\r\n label: \"Validation Loss\",\r\n options: {\r\n filter: false,\r\n sort: true,\r\n },\r\n },\r\n {\r\n name: \"validationmiou\",\r\n label: \"Validation Mean IoU\",\r\n options: {\r\n filter: false,\r\n sort: true,\r\n },\r\n },\r\n {\r\n name: \"epochs\",\r\n label: \"Epochs\",\r\n options: {\r\n filter: false,\r\n sort: true,\r\n },\r\n },\r\n {\r\n name: \"trainingObjectsCount\",\r\n label: \"Object Count\",\r\n options: {\r\n filter: false,\r\n sort: true,\r\n },\r\n },\r\n {\r\n name: \"modelType\",\r\n label: \"Model Type\",\r\n options: {\r\n filter: false,\r\n sort: true,\r\n },\r\n },\r\n];\r\n\r\nclass AIModelDialogTable extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n selected: [],\r\n };\r\n }\r\n\r\n render() {\r\n const { data, classes } = this.props;\r\n\r\n const options = {\r\n sortOrder: {\r\n name: \"datetime\",\r\n direction: \"desc\",\r\n },\r\n filter: true,\r\n filterType: \"dropdown\",\r\n print: false,\r\n download: false,\r\n responsive: \"standard\",\r\n rowsSelected: this.props.rowsSelected,\r\n selectToolbarPlacement: \"none\",\r\n draggableColumns: {\r\n enabled: true,\r\n },\r\n tableBodyMaxHeight: \"auto\",\r\n onRowSelectionChange: (currentRowsSelected) => {\r\n let selectedObject = this.props.rowsSelected;\r\n if (currentRowsSelected[0] != null && currentRowsSelected.length < 2) {\r\n if (!selectedObject.includes(currentRowsSelected[0].dataIndex)) {\r\n selectedObject.push(currentRowsSelected[0].dataIndex);\r\n } else {\r\n var index = selectedObject.indexOf(\r\n currentRowsSelected[0].dataIndex\r\n );\r\n if (index > -1) {\r\n selectedObject.splice(index, 1);\r\n }\r\n }\r\n } else selectedObject = [];\r\n this.props.handleSelectedAIModels(selectedObject);\r\n if (selectedObject.length > 0) {\r\n this.props.handleAddButton(false);\r\n } else this.props.handleAddButton(true);\r\n },\r\n onRowClick: handleRowClick,\r\n textLabels: {\r\n body: {\r\n noMatch: \"Sorry, no matching AIModels found\",\r\n toolTip: \"Sort\",\r\n columnHeaderTooltip: (column) => `Sort for ${column.label}`,\r\n },\r\n pagination: {\r\n next: \"Next Page\",\r\n previous: \"Previous Page\",\r\n rowsPerPage: \"Rows per page:\",\r\n displayRows: \"of\",\r\n },\r\n toolbar: {\r\n search: \"Search\",\r\n downloadCsv: \"Download CSV\",\r\n print: \"Print\",\r\n viewColumns: \"View Columns\",\r\n filterTable: \"Filter Table\",\r\n },\r\n filter: {\r\n all: \"All\",\r\n title: \"Filters\",\r\n reset: \"Reset\",\r\n },\r\n viewColumns: {\r\n title: \"Show Columns\",\r\n titleAria: \"Show/Hide Table Columns\",\r\n },\r\n selectedRows: {\r\n text: \"row(s) selected\",\r\n delete: \"Delete\",\r\n deleteAria: \"Delete Selected Rows\",\r\n },\r\n },\r\n };\r\n\r\n return (\r\n x.verified != true)\r\n .map((row) => {\r\n return {\r\n name: row.name,\r\n structure: row.versions[0] ? row.versions[0].structure : \"-\",\r\n validationloss:\r\n row.versions[0] && row.versions[0].validationloss !== 1\r\n ? row.versions[0].validationloss\r\n : \"-\",\r\n validationmiou:\r\n row.versions[0] && row.versions[0].validationmeaniou !== 1\r\n ? row.versions[0].validationmeaniou\r\n : \"-\",\r\n trainingObjectsCount: row.versions[0]\r\n ? row.versions[0].trainingobjectscount\r\n : \"-\",\r\n epochs:\r\n row.versions[0] && row.versions[0].epochs !== 0\r\n ? row.versions[0].epochs\r\n : \"-\",\r\n datetime: row.versions[0] ? row.versions[0].datetime : \"-\",\r\n modelType: row.versions[0] ? row.versions[0].modeltype : \"-\",\r\n };\r\n })}\r\n columns={columns}\r\n options={options}\r\n />\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nAIModelDialogTable.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n data: PropTypes.array,\r\n rowsSelected: PropTypes.array,\r\n handleSelectedAIModels: PropTypes.func,\r\n handleAddButton: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(AIModelDialogTable);\r\n","import React, { Component } from \"react\";\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogContentText from \"@mui/material/DialogContentText\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport Slide from \"@mui/material/Slide\";\r\nimport {\r\n MenuItem,\r\n Select,\r\n InputLabel,\r\n Grid,\r\n FormControlLabel,\r\n Checkbox,\r\n Tooltip,\r\n FormControl,\r\n} from \"@mui/material\";\r\nimport AddCircleOutlineIcon from \"@mui/icons-material/AddCircleOutline\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport Draggable from \"react-draggable\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport AIModelDialogTable from \"../components/AIModelDialogTable\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport PropTypes from \"prop-types\";\r\nimport CircularProgress from \"@mui/material/CircularProgress\";\r\n\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n selectContent: {\r\n \"& .MuiSelect-root\": {\r\n minWidth: \"200px\",\r\n width: \"auto\",\r\n },\r\n },\r\n dialogContent: {\r\n overflowY: \"hidden\",\r\n minHeight: \"100%\",\r\n },\r\n gridContent: {\r\n padding: \"30px\",\r\n },\r\n tableDialog: {\r\n \"& .MuiPaper-root\": {\r\n maxWidth: \"none\",\r\n },\r\n },\r\n modelSelectionContainer: {},\r\n addCustomAIModelButton: {\r\n textAlign: \"left\",\r\n cursor: \"pointer\",\r\n margin: 15,\r\n },\r\n addCustomAIModelText: {\r\n fontWeight: \"bold\",\r\n position: \"relative\",\r\n marginLeft: 10,\r\n top: 2,\r\n },\r\n modelInformationContainer: {\r\n height: \"100%\",\r\n },\r\n});\r\n\r\nfunction PaperComponent(props) {\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst Transition = React.forwardRef(function Transition(props, ref) {\r\n return ;\r\n});\r\n\r\nclass AIModelDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n open: false,\r\n selectedAIModels: [],\r\n addButtonDisabled: true,\r\n existingAIModels: [],\r\n selectedModel: null,\r\n selectedModelIdx: null,\r\n selectedModelSourcepath: undefined,\r\n selectedVersion: null,\r\n trainExistingModel: false,\r\n modelsInitialized: false,\r\n };\r\n this.data = [];\r\n }\r\n\r\n handleSelectedAIModels = (value) => {\r\n this.setState({ selectedAIModels: value });\r\n };\r\n\r\n handleAddButton = (value) => {\r\n this.setState({ addButtonDisabled: value });\r\n };\r\n\r\n render() {\r\n const { classes, dialog, history } = this.props;\r\n const existingAIModels = this.state.existingAIModels;\r\n\r\n //TODO remove this with properly with all references, since AICockpit is not used anymore\r\n const handleClickOpen = () => {\r\n if (window) {\r\n history.push(\"/ai_view\");\r\n return;\r\n }\r\n this.setState({ open: true });\r\n Backend.getModelMetadata(\"unverified_models\", false, (result) => {\r\n this.data = result;\r\n this.setState({\r\n modelsInitialized: true,\r\n });\r\n this.forceUpdate();\r\n });\r\n };\r\n\r\n const handleClickOpenExistingModels = () => {\r\n if (!this.state.trainExistingModel) {\r\n this.setState({\r\n open: true,\r\n trainExistingModel: !this.state.trainExistingModel,\r\n });\r\n this.setState({ existingAIModels: this.props.existingAIModels });\r\n } else\r\n this.setState({ trainExistingModel: !this.state.trainExistingModel });\r\n };\r\n\r\n const handleSelectModel = (event) => {\r\n let selectedVersion = null;\r\n if (existingAIModels.aiModels[event.target.value - 1].versions)\r\n selectedVersion =\r\n existingAIModels.aiModels[event.target.value - 1].versions.slice(\r\n -1\r\n )[0].label;\r\n this.setState({\r\n selectedModel: event.target.value,\r\n selectedVersion: selectedVersion,\r\n });\r\n };\r\n\r\n const handleSelectVersion = (event) => {\r\n this.setState({ selectedVersion: event.target.value });\r\n };\r\n\r\n const handleClose = (e) => {\r\n if (this.state.selectedModel == null) {\r\n this.setState({ trainExistingModel: false });\r\n }\r\n this.setState({ open: false });\r\n e.preventDefault();\r\n this.setState({ selectedAIModels: [], addButtonDisabled: true });\r\n };\r\n\r\n const finishAddCustomAIModels = (result) => {\r\n console.log(\"finishAddCustomAIModels()\", result);\r\n this.setState({ selectedAIModels: [], addButtonDisabled: true });\r\n if (result.successful) {\r\n window.showSuccessSnackbar(result.information);\r\n this.props.initAIFormData(false);\r\n } else window.showErrorSnackbar(result.information);\r\n };\r\n\r\n const handleAdd = (e) => {\r\n this.setState({ open: false });\r\n e.preventDefault();\r\n this.customAIModelsAdded = 0;\r\n for (let i = 0; i < this.state.selectedAIModels.length; i++) {\r\n var selectedAiModel = this.data.filter((x) => x.verified != true)[\r\n this.state.selectedAIModels[i]\r\n ];\r\n var aiModel = {\r\n sourcepath: selectedAiModel.versions[0]\r\n ? selectedAiModel.versions[0].sourcepath\r\n : \"-\",\r\n name: selectedAiModel.name,\r\n };\r\n Backend.addCustomAIModels(\r\n JSON.stringify(aiModel),\r\n finishAddCustomAIModels\r\n );\r\n }\r\n };\r\n\r\n const handleRemove = (e) => {\r\n e.preventDefault();\r\n window.openResponseDialog(\r\n \"Delete the models permanently?\",\r\n (response) => {\r\n if (response) {\r\n for (let i = 0; i < this.state.selectedAIModels.length; i++) {\r\n Backend.deleteCustomAIModels(\r\n this.data[this.state.selectedAIModels[i]].name,\r\n () => {\r\n this.setState({\r\n selectedAIModels: [],\r\n addButtonDisabled: true,\r\n });\r\n this.forceUpdate();\r\n }\r\n );\r\n Backend.getModelMetadata(\"unverified_models\", false, (result) => {\r\n this.data = result.filter((x) => x.verified != true);\r\n this.setState({\r\n modelsInitialized: true,\r\n });\r\n this.forceUpdate();\r\n });\r\n }\r\n }\r\n }\r\n );\r\n };\r\n\r\n // send selected exisiting model to AITrainingTool.jsx (parent)\r\n const handleAddExistingModel = (e) => {\r\n let selectedModelInformation = [\r\n this.state.existingAIModels.aiModels[this.state.selectedModel - 1]\r\n .label,\r\n this.state.selectedVersion,\r\n ];\r\n\r\n Backend.getSelectedModelSourcepath(selectedModelInformation, (value) => {\r\n this.props.setSelectedExistingModel(value);\r\n });\r\n handleClose(e);\r\n };\r\n\r\n return (\r\n
    \r\n {dialog === \"AIDataTable\" && (\r\n
    \r\n \r\n \r\n \r\n Add Custom AI Model\r\n \r\n
    \r\n \r\n \r\n Custom Trained AI Models\r\n \r\n \r\n \r\n Select the previously trained AI Model\r\n \r\n \r\n {this.state.modelsInitialized ? (\r\n \r\n ) : (\r\n \r\n \r\n
    \r\n )}\r\n \r\n \r\n \r\n Remove\r\n \r\n \r\n Add\r\n \r\n \r\n \r\n
    \r\n )}\r\n {dialog === \"AISelectExistingModel\" && (\r\n
    \r\n \r\n \r\n
    \r\n \r\n }\r\n label=\"Train existing model\"\r\n />\r\n
    \r\n \r\n
    \r\n \r\n \r\n AI Models\r\n \r\n \r\n \r\n Select an existing model and version to initialize them for\r\n further training.\r\n \r\n \r\n\r\n \r\n \r\n Select Model\r\n \r\n \r\n Select Model ...\r\n \r\n {existingAIModels.aiModels &&\r\n existingAIModels.aiModels.map((model, idx) => {\r\n return (\r\n \r\n {model.label}\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n Select Version\r\n \r\n \r\n Select Version ...\r\n \r\n {this.state.selectedModel &&\r\n existingAIModels.aiModels &&\r\n existingAIModels.aiModels.length > 0 &&\r\n existingAIModels.aiModels[\r\n this.state.selectedModel - 1\r\n ].versions.map((version, idx) => (\r\n \r\n {version.label}\r\n \r\n ))}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n Okay\r\n \r\n \r\n \r\n
    \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nAIModelDialog.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n dialog: PropTypes.string,\r\n handleOptionsClose: PropTypes.func,\r\n structures: PropTypes.array,\r\n formDataAICockpit: PropTypes.object,\r\n setAvailableModels: PropTypes.func,\r\n setFormDataAICockpit: PropTypes.func,\r\n initAIFormData: PropTypes.func,\r\n existingAIModels: PropTypes.array,\r\n setSelectedExistingModel: PropTypes.func,\r\n history: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(withStyles(styles)(AIModelDialog));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport {\r\n Button,\r\n FormControl,\r\n TextField,\r\n LinearProgress,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport Backend from \"../../../common/utils/Backend\";\r\nimport { withSpinloader } from \"../../../common/components/Spinloader\";\r\nimport Tool from \"./Tool\";\r\nimport PlayArrowRoundedIcon from \"@mui/icons-material/PlayArrowRounded\";\r\nimport ReplayRoundedIcon from \"@mui/icons-material/ReplayRounded\";\r\nimport AIModelDialog from \"../../../home/dialogs/AIModelDialog\";\r\n\r\nclass AITrainingTool extends Tool {\r\n constructor(viewer) {\r\n super();\r\n this.name = \"AI Training\";\r\n this.state = {\r\n preview: false,\r\n hideStartTraining: false,\r\n errorEpochs: false,\r\n errorAIName: false,\r\n epochs: \"\",\r\n openTrainExistingDialog: false,\r\n selectedExistingModel: \"\",\r\n selectedExistingModelSourcepath: \"\",\r\n existingAIModels: [],\r\n stepsProgress: \"-\",\r\n epochsProgress: \"-\",\r\n lossProgress: \"-\",\r\n meanIoUProgress: \"-\",\r\n vallossProgress: \"-\",\r\n valmeanIoUProgress: \"-\",\r\n buildingModelText: \"-\",\r\n showTrainingProgress: false,\r\n showOptimizationProgress: false,\r\n };\r\n this.viewer = viewer;\r\n // Backend.getAIModelRepository(false, (existingAIModels) => {\r\n // this.state.existingAIModels = existingAIModels;\r\n // });\r\n }\r\n\r\n updateTrainingProgress = (line) => {\r\n if (line.includes(\"Epoch\")) {\r\n this.state.buildingModel = false;\r\n this.state.showDownloadProgress = false;\r\n this.state.showTrainingProgress = true;\r\n this.state.epochsProgress = line.split(\"Epoch\")[1];\r\n } else if (line.includes(\"creating dataset...\")) {\r\n this.state.showDownloadProgress = false;\r\n this.state.hideStartTraining = true;\r\n this.state.buildingModelText = \"Creating dataset...\";\r\n this.state.buildingModel = true;\r\n } else if (line.includes(\"loading dataset\")) {\r\n this.state.hideStartTraining = true;\r\n this.state.buildingModelText = \"Creating dataset...\";\r\n this.state.buildingModel = true;\r\n } else if (line.includes(\"start training\")) {\r\n this.state.hideStartTraining = true;\r\n this.state.buildingModel = false;\r\n this.state.showDownloadProgress = false;\r\n this.state.showTrainingProgress = true;\r\n } else if (line.includes(\"loss:\")) {\r\n this.state.buildingModel = false;\r\n this.state.stepsProgress = line.split(\"[\")[0];\r\n this.state.lossProgress = parseFloat(\r\n line.split(\"loss:\")[1].split(\" \")[1],\r\n 10\r\n ).toString();\r\n this.state.meanIoUProgress = line.split(\"loss:\")[1].split(\" \")[4];\r\n } else if (line.includes(\"training done!!!\")) {\r\n this.state.trainingFinished = true;\r\n this.state.showOptimizationProgress = false;\r\n } else if (line.includes(\"training failed!!!\"))\r\n this.state.trainingFailed = true;\r\n else if (line.includes(\"time elapsed:\"))\r\n this.state.elapsedTime = line.substring(0, line.indexOf(\".\")) + \"s\";\r\n else if (line.includes(\"optimization progress:\")) {\r\n this.state.modelOptimizeProgress = line\r\n .split(\"optimization progress:\")[1]\r\n .split(\"%\")[0];\r\n this.state.showOptimizationProgress = true;\r\n } else if (line.includes(\"Downloading model from:\")) {\r\n this.state.hideStartTraining = true;\r\n this.state.modelDownloadProgress = 0;\r\n this.state.buildingModel = false;\r\n this.state.showDownloadProgress = true;\r\n } else if (line.includes(\"[DownloadProgress]\")) {\r\n this.state.modelDownloadProgress = line\r\n .split(\"[DownloadProgress]\")[1]\r\n .split(\"%\")[0];\r\n } else if (line.includes(\"building model ...\")) {\r\n this.state.buildingModelText = \"Building model...\";\r\n } else if (\r\n line.includes(\"No trainingdata, please annotate at least 15+ objects\")\r\n ) {\r\n this.state.buildingModel = false;\r\n this.state.showTrainingProgress = false;\r\n this.state.hideStartTraining = false;\r\n this.state.trainingFinished = false;\r\n this.state.trainingFailed = false;\r\n this.state.epochsProgress = \"\";\r\n this.state.stepsProgress = \"\";\r\n this.state.meanIoUProgress = \"\";\r\n this.state.lossProgress = \"\";\r\n this.state.valmeanIoUProgress = \"\";\r\n this.state.vallossProgress = \"\";\r\n }\r\n if (line.includes(\"val_loss:\")) {\r\n this.state.vallossProgress = parseFloat(\r\n line.split(\"val_loss:\")[1].split(\" \")[1],\r\n 10\r\n ).toString();\r\n this.state.valmeanIoUProgress = line.split(\"val_loss:\")[1].split(\" \")[4];\r\n }\r\n this.configForm.setState(this.state);\r\n };\r\n\r\n /**\r\n * Update File Specific information\r\n * @param {Object} layer\r\n * @param {Object} ome\r\n * @param {String} fileId\r\n * @param {String} projectId\r\n * @param {Object[]} roiLayers\r\n */\r\n setLayer(obj) {\r\n this.id = obj.fileId;\r\n this.layer = obj.layer;\r\n this.ome = obj.ome;\r\n this.projectId = obj.projectId;\r\n this.roiLayers = obj.roiLayers;\r\n this.structures = obj.structures;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.updateProject = obj.updateProject;\r\n\r\n if (obj.structures[obj.selectedLayer]) {\r\n this.toolLayerConfig = obj.structures[obj.selectedLayer].tools.find(\r\n (c) => c.name === \"ai_Training\"\r\n );\r\n }\r\n\r\n if (typeof this.toolLayerConfig !== \"undefined\") {\r\n Object.assign(this.state, this.toolLayerConfig.parameters);\r\n }\r\n }\r\n\r\n mouse() {}\r\n\r\n /**\r\n * AITraining for the entire project\r\n * @param {Component} component\r\n */\r\n calcFull(component) {\r\n // reset previous training stats\r\n this.state.trainingFinished = false;\r\n this.state.trainingFailed = false;\r\n this.state.showTrainingProgress = false;\r\n\r\n this.state.stepsProgress = \"-\";\r\n this.state.epochsProgress = \"-\";\r\n this.state.lossProgress = \"-\";\r\n this.state.meanIoUProgress = \"-\";\r\n this.state.vallossProgress = \"-\";\r\n this.state.valmeanIoUProgress = \"-\";\r\n\r\n if (this.state.epochs === \"\" || this.state.epochs.length < 1) {\r\n this.state.errorEpochs = true;\r\n } else if (this.state.errorEpochs !== \"undefined\")\r\n this.state.errorEpochs = false;\r\n this.configForm.setState(this.state);\r\n if (this.state.errorEpochs || this.state.errorAIName) return;\r\n component.props.spinloader.show();\r\n const project = this.viewer.createProjectModel(\"none\");\r\n\r\n let data = {\r\n parameters: this.state,\r\n project: project,\r\n };\r\n const projectModel = this.viewer.createProjectModel(\"all\");\r\n Backend.saveProject(projectModel, () => {});\r\n\r\n setTimeout(() => {\r\n Backend.aiTrainingSignalR(\r\n data,\r\n (progress) => {\r\n console.log(progress);\r\n },\r\n () => {\r\n console.log(\"finished!\");\r\n component.props.spinloader.hide();\r\n },\r\n (error) => {\r\n component.props.spinloader.hide();\r\n window.openErrorDialog(error);\r\n }\r\n );\r\n }, 1000);\r\n }\r\n\r\n /**\r\n * Draw a custom cursor\r\n */\r\n drawCustomCursor() {}\r\n\r\n onParameterChange = (e) => {\r\n Object.assign(this.state, e);\r\n };\r\n\r\n setSelectedExistingModel = (value) => {\r\n this.state.selectedExistingModel = value;\r\n };\r\n\r\n exit() {}\r\n\r\n /**\r\n * Renders the Tool Configuration Inputs\r\n */\r\n renderConfiguration() {\r\n return (\r\n
    \r\n {this.name}:\r\n {\r\n return this.state.preview\r\n ? this.calcPreview(component)\r\n : this.calcFull(component);\r\n }}\r\n onApplyAll={(component) => {\r\n return this.calcFull(component, true);\r\n }}\r\n componentRef={(c) => (this.configForm = c)}\r\n />\r\n
    \r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Configuration Component to render the parameter inputs dynamically\r\n */\r\nclass ConfigFormRaw extends Component {\r\n constructor(props) {\r\n super(props);\r\n if (props.componentRef) props.componentRef(this);\r\n this.state = props.state;\r\n }\r\n\r\n /**\r\n * Update tool state\r\n */\r\n onParameterChange(key, value, e) {\r\n let stateObject = {};\r\n stateObject[key] = value;\r\n setTimeout(() => this.props.onParameterChange(stateObject), 10);\r\n if (value !== \"\" && e.target.name === \"epochs\") {\r\n stateObject[\"errorEpochs\"] = false;\r\n }\r\n this.setState(stateObject);\r\n this.forceUpdate();\r\n }\r\n\r\n handleClickOpen = () => {\r\n this.setState({ openTrainExistingDialog: true });\r\n };\r\n\r\n render() {\r\n let { onApply, selectedLayer } = this.props;\r\n return (\r\n
    \r\n {this.props.structures[selectedLayer].label}\r\n {!this.state.hideStartTraining && (\r\n
    \r\n \r\n \r\n this.onParameterChange(\"epochs\", e.target.value, e)\r\n }\r\n variant=\"outlined\"\r\n helperText={\r\n this.state.errorEpochs ? \"Enter number of epochs.\" : \" \"\r\n }\r\n InputProps={{ inputProps: { min: 2, max: 10000 } }}\r\n />\r\n \r\n {\r\n this.props.setSelectedExistingModel(value);\r\n }}\r\n existingAIModels={this.state.existingAIModels}\r\n />\r\n onApply(this)}\r\n startIcon={}\r\n >\r\n Start Training\r\n \r\n
    \r\n )}\r\n\r\n {this.state.showDownloadProgress && (\r\n
    \r\n \r\n \r\n
    \r\n )}\r\n\r\n {this.state.buildingModel && (\r\n
    \r\n \r\n \r\n
    \r\n )}\r\n\r\n {this.state.showTrainingProgress && (\r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n\r\n {this.state.showOptimizationProgress && (\r\n
    \r\n \r\n \r\n
    \r\n )}\r\n\r\n {this.state.trainingFinished && (\r\n
    \r\n \r\n Successful\r\n \r\n }\r\n onClick={() => {\r\n this.setState({\r\n buildingModel: false,\r\n showTrainingProgress: false,\r\n hideStartTraining: false,\r\n trainingFinished: false,\r\n epochsProgress: \"\",\r\n stepsProgress: \"\",\r\n meanIoUProgress: \"\",\r\n lossProgress: \"\",\r\n valmeanIoUProgress: \"\",\r\n vallossProgress: \"\",\r\n });\r\n }}\r\n >\r\n Restart Training\r\n \r\n
    \r\n )}\r\n {this.state.trainingFailed && (\r\n
    \r\n \r\n Failed\r\n \r\n }\r\n onClick={() => {\r\n this.setState({\r\n buildingModel: false,\r\n showTrainingProgress: false,\r\n hideStartTraining: false,\r\n trainingFinished: false,\r\n epochsProgress: \"\",\r\n stepsProgress: \"\",\r\n meanIoUProgress: \"\",\r\n lossProgress: \"\",\r\n valmeanIoUProgress: \"\",\r\n vallossProgress: \"\",\r\n });\r\n }}\r\n >\r\n Restart Training\r\n \r\n
    \r\n )}\r\n
    \r\n )}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nConfigFormRaw.propTypes = {\r\n componentRef: PropTypes.object,\r\n state: PropTypes.object,\r\n onParameterChange: PropTypes.func,\r\n onApply: PropTypes.func,\r\n selectedLayer: PropTypes.number,\r\n structures: PropTypes.array,\r\n setSelectedExistingModel: PropTypes.func,\r\n};\r\n\r\nconst ConfigForm = withSpinloader(ConfigFormRaw);\r\n\r\nexport default AITrainingTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport {\r\n TextField,\r\n Button,\r\n List,\r\n ListItem,\r\n ListItemAvatar,\r\n Avatar,\r\n ListItemSecondaryAction,\r\n IconButton,\r\n Typography,\r\n} from \"@mui/material\";\r\n\r\nimport { distance } from \"../../utils/PolygonUtil\";\r\n\r\nimport Crop169Icon from \"@mui/icons-material/Crop169\";\r\nimport CommentIcon from \"@mui/icons-material/Comment\";\r\nimport ArrowForwardOutlinedIcon from \"@mui/icons-material/ArrowForwardOutlined\";\r\nimport FormatSizeIcon from \"@mui/icons-material/FormatSize\";\r\n\r\nimport { faDrawPolygon, faRuler } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\n\r\nimport { CommentROI } from \"../../utils/ROI\";\r\nimport SketchColorPicker from \"../../../common/components/SketchColorPicker\";\r\n\r\nimport Tool from \"./Tool\";\r\n\r\nconst scaleUnitLabels = [\"km\", \"m\", \"mm\", \"µm\", \"nm\", \"pm\", \"fm\", \"am\", \"zm\"];\r\nconst scaleUnits = [3, 1, -3, -6, -9, -12, -15, -18, -21];\r\n\r\nconst styles = {\r\n buttonStyle: { marginRight: 10, marginBottom: 10, minWidth: 195 },\r\n listButtonStyle: { marginRight: 5, marginBottom: 5 },\r\n};\r\n\r\nclass CommentTool extends Tool {\r\n name = \"Comment\";\r\n noConfig = false;\r\n mouseActionState = \"free\";\r\n downScale = 2;\r\n points = [];\r\n commentState = {\r\n commentValue: \"\",\r\n color: \"#D0021B\",\r\n selectedTool: \"rectangle\",\r\n };\r\n selectedCommentIdx = 0;\r\n lastP = null;\r\n gripData = null;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.isBrightfield = obj.ome.channels[0].type === \"brightfield\";\r\n this.lineColor = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n this.selectionColor = this.lineColor;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n this.commentLayer = obj.commentLayer\r\n ? obj.commentLayer\r\n : { commentRois: [] };\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n distance(p1, p2) {\r\n let deltaX = p1.x - p2.x;\r\n let deltaY = p1.y - p2.y;\r\n return Math.sqrt(deltaX * deltaX + deltaY * deltaY);\r\n }\r\n\r\n generateDistancePoints = (p1, p2) => {\r\n let vector = {\r\n x: p1.x - p2.x,\r\n y: p1.y - p2.y,\r\n };\r\n let length = Math.sqrt(vector.x * vector.x + vector.y * vector.y);\r\n let dl = length / 20;\r\n vector.x /= length;\r\n vector.y /= length;\r\n return [\r\n [p1.x, p1.y],\r\n [p2.x, p2.y],\r\n [p2.x - (dl * vector.y) / 2, p2.y + (dl * vector.x) / 2],\r\n [p2.x + (dl * vector.y) / 2, p2.y - (dl * vector.x) / 2],\r\n [p2.x, p2.y],\r\n [p1.x, p1.y],\r\n [p1.x - (dl * vector.y) / 2, p1.y + (dl * vector.x) / 2],\r\n [p1.x + (dl * vector.y) / 2, p1.y - (dl * vector.x) / 2],\r\n ];\r\n };\r\n\r\n generateArrowPoints = (p1, p2) => {\r\n let vector = {\r\n x: p1.x - p2.x,\r\n y: p1.y - p2.y,\r\n };\r\n let length = Math.sqrt(vector.x * vector.x + vector.y * vector.y);\r\n let dl = length / 20;\r\n vector.x /= length;\r\n vector.y /= length;\r\n return [\r\n [p1.x, p1.y],\r\n [p2.x + vector.x * dl, p2.y + vector.y * dl],\r\n [\r\n p2.x + vector.x * dl - (dl * vector.y) / 2,\r\n p2.y + vector.y * dl + (dl * vector.x) / 2,\r\n ],\r\n [p2.x, p2.y],\r\n [\r\n p2.x + vector.x * dl + (dl * vector.y) / 2,\r\n p2.y + vector.y * dl - (dl * vector.x) / 2,\r\n ],\r\n [p2.x + vector.x * dl, p2.y + vector.y * dl],\r\n ];\r\n };\r\n\r\n deleteCommentRoi(idx) {\r\n this.commentLayer.commentRois.splice(idx, 1);\r\n window.forceSidebarUpdate();\r\n }\r\n\r\n changeRoiFontSize(idx) {\r\n if (this.commentLayer.commentRois[idx].fontScaleFactor === 2 / 3) {\r\n this.commentLayer.commentRois[idx].fontScaleFactor = 1;\r\n } else if (this.commentLayer.commentRois[idx].fontScaleFactor === 1) {\r\n this.commentLayer.commentRois[idx].fontScaleFactor = 4 / 3;\r\n } else {\r\n this.commentLayer.commentRois[idx].fontScaleFactor = 2 / 3;\r\n }\r\n }\r\n\r\n changeSelectedColor(idx, color) {\r\n this.commentLayer.commentRois[idx].color = color;\r\n window.forceSidebarUpdate();\r\n }\r\n\r\n changeSelectedCommentValue(idx, commentValue) {\r\n this.commentLayer.commentRois[idx].commentValue = commentValue;\r\n window.forceSidebarUpdate();\r\n }\r\n\r\n changeSelectedCommentIdx(idx) {\r\n // provides bad user-experience when using for documentation purposes\r\n // window.zoomToRect(this.commentLayer.commentRois[idx].bounds);\r\n this.selectedCommentIdx = idx;\r\n window.forceSidebarUpdate();\r\n }\r\n\r\n computePolygonArea(points) {\r\n let X = [];\r\n let Y = [];\r\n let numPoints = points.length;\r\n for (let p of points) {\r\n X.push(p[0]);\r\n Y.push(p[1]);\r\n }\r\n let area = 0; // Accumulates area\r\n let j = numPoints - 1;\r\n\r\n for (let i = 0; i < numPoints; i++) {\r\n area += (X[j] + X[i]) * (Y[j] - Y[i]);\r\n j = i; //j is previous vertex to i\r\n }\r\n return area / 2;\r\n }\r\n\r\n computLengthValue(physicalLength, area) {\r\n physicalLength = Math.abs(physicalLength);\r\n let computedValue = 0;\r\n // display pixel if no unit is set\r\n if (!this.ome.physicalSizeX) {\r\n return Math.round(physicalLength) + \" px\";\r\n }\r\n let unitLength = physicalLength;\r\n\r\n // find best fitting exponennt\r\n let unitExponent = 1;\r\n let unitExponentIndex = 1;\r\n for (\r\n unitExponentIndex = 0;\r\n unitExponentIndex < scaleUnits.length;\r\n unitExponentIndex++\r\n ) {\r\n unitExponent = area\r\n ? scaleUnits[unitExponentIndex] * 2\r\n : scaleUnits[unitExponentIndex];\r\n unitLength = physicalLength / Math.pow(10, unitExponent);\r\n if (unitLength > 1) {\r\n break;\r\n }\r\n }\r\n if (area) {\r\n computedValue =\r\n Math.round(unitLength * 100) / 100 +\r\n \" \" +\r\n scaleUnitLabels[unitExponentIndex] +\r\n \"²\";\r\n } else {\r\n computedValue =\r\n Math.round(unitLength * 100) / 100 +\r\n \" \" +\r\n scaleUnitLabels[unitExponentIndex];\r\n }\r\n return computedValue;\r\n }\r\n\r\n pointInsideBounds(p, bounds) {\r\n return !(\r\n p.x < bounds.left ||\r\n p.x > bounds.right ||\r\n p.y < bounds.top ||\r\n p.y > bounds.bottom\r\n );\r\n }\r\n\r\n addPoint = (event, p) => {\r\n let eventPoint = { x: event.clientX, y: event.clientY };\r\n if (this.points.length < 3) {\r\n this.points.push([p.x, p.y]);\r\n this.lastEventPoint = eventPoint;\r\n } else {\r\n const dist = distance(this.lastEventPoint, eventPoint);\r\n if (dist < 10) {\r\n this.points[this.points.length - 1] = [p.x, p.y];\r\n } else {\r\n this.points.push([p.x, p.y]);\r\n this.lastEventPoint = eventPoint;\r\n }\r\n }\r\n };\r\n\r\n mouse(params) {\r\n let { event, p } = params;\r\n let mouseP = p;\r\n if (\r\n this.mouseActionState !== \"draw\" &&\r\n this.commentLayer[\"commentRois\"].length > 0 &&\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx]\r\n ) {\r\n let selectedCommentRoi =\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx];\r\n if (this.mouseActionState === \"free\") {\r\n let minArea = Number.MAX_SAFE_INTEGER;\r\n for (let i = 0; i < this.commentLayer.commentRois.length; i++) {\r\n if (this.commentLayer.commentRois[i].containsPoint(mouseP)) {\r\n let commentRoiArea =\r\n this.commentLayer.commentRois[i].width *\r\n this.commentLayer.commentRois[i].height;\r\n if (commentRoiArea < minArea) {\r\n this.selectedCommentIdx = i;\r\n minArea = commentRoiArea;\r\n }\r\n }\r\n }\r\n } else {\r\n if (event.type === \"mouseup\" || event.type === \"mouseleave\") {\r\n this.mouseActionState = \"free\";\r\n } else if (event.type === \"mousemove\") {\r\n if (this.mouseActionState === \"move\") {\r\n let deltaX = mouseP.x - this.lastP.x;\r\n let deltaY = mouseP.y - this.lastP.y;\r\n let selectedCommentRoi =\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx];\r\n let regions = [];\r\n for (let region of selectedCommentRoi.regions) {\r\n regions.push([region[0] + deltaX, region[1] + deltaY]);\r\n }\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx].regions =\r\n regions;\r\n this.commentLayer[\"commentRois\"][\r\n this.selectedCommentIdx\r\n ].updateBounds();\r\n this.lastP = mouseP;\r\n } else if (this.mouseActionState === \"resize\") {\r\n let deltaX = mouseP.x - this.lastP.x;\r\n let deltaY = mouseP.y - this.lastP.y;\r\n if (\r\n selectedCommentRoi.type === \"rectangle\" ||\r\n selectedCommentRoi.type === \"region\" ||\r\n selectedCommentRoi.type === \"commentBox\"\r\n ) {\r\n let deltaXProc =\r\n (selectedCommentRoi.width + deltaX) / selectedCommentRoi.width;\r\n let deltaYProc =\r\n (selectedCommentRoi.height + deltaY) /\r\n selectedCommentRoi.height;\r\n let regions = [];\r\n for (let region of selectedCommentRoi.regions) {\r\n let x = selectedCommentRoi.bounds.left;\r\n let y = selectedCommentRoi.bounds.top;\r\n let w = region[0] - x;\r\n let h = region[1] - y;\r\n regions.push([x + w * deltaXProc, y + h * deltaYProc]);\r\n }\r\n this.commentLayer[\"commentRois\"][\r\n this.selectedCommentIdx\r\n ].regions = regions;\r\n this.commentLayer[\"commentRois\"][\r\n this.selectedCommentIdx\r\n ].updateBounds();\r\n let length = this.computePolygonArea(selectedCommentRoi.regions);\r\n let unitLength =\r\n length * this.ome.physicalSizeX * this.ome.physicalSizeY;\r\n if (!this.ome.physicalSizeX) {\r\n unitLength = length;\r\n }\r\n let computedValue = this.computLengthValue(unitLength, true);\r\n this.commentLayer[\"commentRois\"][\r\n this.selectedCommentIdx\r\n ].computedValue = computedValue;\r\n if (\r\n this.commentLayer[\"commentRois\"][\r\n this.selectedCommentIdx\r\n ].commentValue.endsWith(\"m²\")\r\n ) {\r\n this.commentLayer[\"commentRois\"][\r\n this.selectedCommentIdx\r\n ].commentValue = computedValue;\r\n }\r\n } else if (\r\n selectedCommentRoi.type === \"distance\" ||\r\n selectedCommentRoi.type === \"arrow\"\r\n ) {\r\n let regions = selectedCommentRoi.regions;\r\n let p1 = {\r\n x: regions[0][0],\r\n y: regions[0][1],\r\n };\r\n let p2 = {\r\n x: regions[1][0],\r\n y: regions[1][1],\r\n };\r\n\r\n if (selectedCommentRoi.type === \"arrow\") {\r\n p2.x = regions[3][0];\r\n p2.y = regions[3][1];\r\n }\r\n\r\n //to do: smaller distance p1, p1 to mouseP, then new distance roi\r\n if (this.distance(mouseP, p1) < this.distance(mouseP, p2)) {\r\n p1.x += deltaX;\r\n p1.y += deltaY;\r\n } else {\r\n p2.x += deltaX;\r\n p2.y += deltaY;\r\n }\r\n if (selectedCommentRoi.type === \"arrow\") {\r\n regions = this.generateArrowPoints(p1, p2);\r\n } else {\r\n regions = this.generateDistancePoints(p1, p2);\r\n }\r\n\r\n let length = this.distance(p1, p2);\r\n let computedValue = this.computLengthValue(\r\n this.ome.physicalSizeX * length,\r\n false\r\n );\r\n if (!this.ome.physicalSizeX) {\r\n computedValue = this.computLengthValue(length, false);\r\n }\r\n let commentValue = selectedCommentRoi.commentValue;\r\n if (commentValue.endsWith(\"m\")) {\r\n commentValue = computedValue;\r\n }\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx] =\r\n new CommentROI(\r\n regions,\r\n selectedCommentRoi.color,\r\n selectedCommentRoi.type,\r\n commentValue,\r\n computedValue\r\n );\r\n }\r\n\r\n this.lastP = mouseP;\r\n }\r\n }\r\n }\r\n if (event.type === \"mousedown\" && event.button === 0) {\r\n if (\r\n this.gripData !== null &&\r\n this.pointInsideBounds(mouseP, this.gripData.b)\r\n ) {\r\n this.mouseActionState = \"resize\";\r\n } else if (selectedCommentRoi.containsPoint(mouseP)) {\r\n this.mouseActionState = \"move\";\r\n } else {\r\n this.mouseActionState = \"draw\";\r\n }\r\n this.lastP = mouseP;\r\n }\r\n }\r\n let computedValue = \"\";\r\n let commentValue = this.commentState.commentValue;\r\n if (event.button !== 0) return;\r\n if (event.type === \"mousedown\") {\r\n if (\r\n this.commentLayer[\"commentRois\"].length > 0 &&\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx]\r\n ) {\r\n let selectedCommentRoi =\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx];\r\n if (\r\n this.gripData !== null &&\r\n this.pointInsideBounds(mouseP, this.gripData.b)\r\n ) {\r\n this.mouseActionState = \"resize\";\r\n this.lastP = mouseP;\r\n return;\r\n } else if (selectedCommentRoi.containsPoint(mouseP)) {\r\n this.mouseActionState = \"move\";\r\n this.lastP = mouseP;\r\n return;\r\n }\r\n } else {\r\n this.mouseActionState = \"draw\";\r\n }\r\n // update position history\r\n this.startPoint = mouseP;\r\n this.points = [];\r\n this.addPoint(event, mouseP);\r\n if (this.commentLayer.commentRois) {\r\n this.commentLayer.commentRois.push(\r\n new CommentROI(\r\n this.points,\r\n this.commentState.color,\r\n this.commentState.selectedTool,\r\n this.commentState.commentValue,\r\n computedValue\r\n )\r\n );\r\n this.selectedCommentIdx = this.commentLayer[\"commentRois\"].length - 1;\r\n window.forceSidebarUpdate();\r\n } else {\r\n this.commentLayer[\"commentRois\"] = [\r\n new CommentROI(\r\n this.points,\r\n this.commentState.color,\r\n this.commentState.selectedTool,\r\n this.commentState.commentValue,\r\n computedValue\r\n ),\r\n ];\r\n }\r\n\r\n // set drawing flag\r\n this.mouseActionState = \"draw\";\r\n } else if (event.type === \"mouseup\") {\r\n let lastRoi =\r\n this.commentLayer.commentRois[this.commentLayer.commentRois.length - 1];\r\n if (!lastRoi) {\r\n console.log(\"LAST ROI WAS EMPTY\");\r\n } else if (\r\n lastRoi.regions.length < 4 ||\r\n lastRoi.width === 0 ||\r\n lastRoi.height === 0\r\n ) {\r\n console.log(\"last roi :\", lastRoi);\r\n window.showWarningSnackbar(\"Comment could not be created!\");\r\n this.commentLayer.commentRois.pop();\r\n window.forceSidebarUpdate();\r\n }\r\n // release drawing flag\r\n this.mouseActionState = \"free\";\r\n } else if (event.type === \"mousemove\") {\r\n if (this.mouseActionState === \"draw\") {\r\n if (\r\n this.commentState.selectedTool === \"rectangle\" ||\r\n this.commentState.selectedTool === \"commentBox\"\r\n ) {\r\n this.points = [\r\n [this.startPoint.x, this.startPoint.y],\r\n [mouseP.x, this.startPoint.y],\r\n [mouseP.x, mouseP.y],\r\n [this.startPoint.x, mouseP.y],\r\n ];\r\n let width =\r\n Math.abs(this.startPoint.x - mouseP.x) * this.ome.physicalSizeX;\r\n let height =\r\n Math.abs(this.startPoint.y - mouseP.y) * this.ome.physicalSizeY;\r\n if (!this.ome.physicalSizeX) {\r\n width = Math.abs(this.startPoint.x - mouseP.x);\r\n height = Math.abs(this.startPoint.y - mouseP.y);\r\n }\r\n let unitLength = width * height;\r\n computedValue = this.computLengthValue(unitLength, true);\r\n if (\r\n this.commentState.commentValue === \"\" &&\r\n this.commentState.selectedTool !== \"commentBox\"\r\n )\r\n commentValue = computedValue;\r\n } else if (this.commentState.selectedTool === \"region\") {\r\n this.addPoint(event, mouseP);\r\n let length = this.computePolygonArea(this.points);\r\n let unitLength =\r\n length * this.ome.physicalSizeX * this.ome.physicalSizeY;\r\n if (!this.ome.physicalSizeX) {\r\n unitLength = length;\r\n }\r\n computedValue = this.computLengthValue(unitLength, true);\r\n if (\r\n this.commentState.commentValue === \"\" &&\r\n this.commentState.selectedTool !== \"commentBox\"\r\n )\r\n commentValue = computedValue;\r\n } else if (this.commentState.selectedTool === \"arrow\") {\r\n let vector = {\r\n x: this.startPoint.x - mouseP.x,\r\n y: this.startPoint.y - mouseP.y,\r\n };\r\n let length = Math.sqrt(vector.x * vector.x + vector.y * vector.y);\r\n this.points = this.generateArrowPoints(this.startPoint, mouseP);\r\n\r\n if (!this.ome.physicalSizeX) {\r\n computedValue = this.computLengthValue(length, false);\r\n } else {\r\n computedValue = this.computLengthValue(\r\n this.ome.physicalSizeX * length,\r\n false\r\n );\r\n }\r\n } else if (this.commentState.selectedTool === \"distance\") {\r\n let vector = {\r\n x: this.startPoint.x - mouseP.x,\r\n y: this.startPoint.y - mouseP.y,\r\n };\r\n let length = Math.sqrt(vector.x * vector.x + vector.y * vector.y);\r\n this.points = this.generateDistancePoints(this.startPoint, mouseP);\r\n\r\n if (!this.ome.physicalSizeX) {\r\n computedValue = this.computLengthValue(length, false);\r\n } else {\r\n computedValue = this.computLengthValue(\r\n this.ome.physicalSizeX * length,\r\n false\r\n );\r\n }\r\n if (\r\n this.commentState.commentValue === \"\" &&\r\n this.commentState.selectedTool !== \"commentBox\"\r\n )\r\n commentValue = computedValue;\r\n } else {\r\n return;\r\n }\r\n\r\n this.commentLayer[\"commentRois\"][\r\n this.commentLayer[\"commentRois\"].length - 1\r\n ] = new CommentROI(\r\n this.points,\r\n this.commentState.color,\r\n this.commentState.selectedTool,\r\n commentValue,\r\n computedValue\r\n );\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n }\r\n\r\n drawCustomCursor(ctx, mousePosition, fct, canvas) {\r\n if (\r\n this.mouseActionState === \"free\" &&\r\n this.commentLayer[\"commentRois\"].length > 0 &&\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx]\r\n ) {\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n let selectedCommentRoi =\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx];\r\n\r\n let pointInsideSelection =\r\n selectedCommentRoi.containsPoint(mousePosition);\r\n\r\n ctx.strokeStyle = pointInsideSelection ? \"red\" : this.selectionColor;\r\n let b = selectedCommentRoi.bounds;\r\n // no custom cursor\r\n ctx.rect(b.left, b.top, b.right - b.left, b.bottom - b.top);\r\n ctx.stroke();\r\n ctx.closePath();\r\n\r\n let cursor = pointInsideSelection ? \"move\" : \"default\";\r\n let gripPoints = [];\r\n if (\r\n selectedCommentRoi.type === \"rectangle\" ||\r\n selectedCommentRoi.type === \"region\" ||\r\n selectedCommentRoi.type === \"commentBox\"\r\n ) {\r\n gripPoints = [\r\n {\r\n x: b.right,\r\n y: b.bottom,\r\n },\r\n ];\r\n } else if (selectedCommentRoi.type === \"distance\") {\r\n gripPoints = [\r\n {\r\n x: selectedCommentRoi.regions[0][0],\r\n y: selectedCommentRoi.regions[0][1],\r\n },\r\n {\r\n x: selectedCommentRoi.regions[1][0],\r\n y: selectedCommentRoi.regions[1][1],\r\n },\r\n ];\r\n } else if (selectedCommentRoi.type === \"arrow\") {\r\n gripPoints = [\r\n {\r\n x: selectedCommentRoi.regions[0][0],\r\n y: selectedCommentRoi.regions[0][1],\r\n },\r\n {\r\n x: selectedCommentRoi.regions[3][0],\r\n y: selectedCommentRoi.regions[3][1],\r\n },\r\n ];\r\n }\r\n for (let gripPoint of gripPoints) {\r\n let gripSize = 14 / fct;\r\n let gripSizeInner = 10 / fct;\r\n this.gripData = {\r\n p: {\r\n x: gripPoint.x,\r\n y: gripPoint.y,\r\n },\r\n b: {\r\n left: gripPoint.x - gripSize / 2,\r\n right: gripPoint.x + gripSize / 2,\r\n top: gripPoint.y - gripSize / 2,\r\n bottom: gripPoint.y + gripSize / 2,\r\n },\r\n bInner: {\r\n left: gripPoint.x - gripSizeInner / 2,\r\n right: gripPoint.x + gripSizeInner / 2,\r\n top: gripPoint.y - gripSizeInner / 2,\r\n bottom: gripPoint.y + gripSizeInner / 2,\r\n },\r\n };\r\n\r\n ctx.fillStyle = \"black\";\r\n ctx.fillRect(\r\n this.gripData.b.left,\r\n this.gripData.b.top,\r\n gripSize,\r\n gripSize\r\n );\r\n ctx.fillStyle = \"white\";\r\n ctx.fillRect(\r\n this.gripData.bInner.left,\r\n this.gripData.bInner.top,\r\n gripSizeInner,\r\n gripSizeInner\r\n );\r\n\r\n if (this.pointInsideBounds(mousePosition, this.gripData.b)) {\r\n if (\r\n selectedCommentRoi.type === \"arrow\" ||\r\n selectedCommentRoi.type === \"distance\"\r\n ) {\r\n cursor = \"pointer\";\r\n } else {\r\n cursor = \"nw-resize\";\r\n }\r\n break;\r\n }\r\n }\r\n\r\n canvas.style.cursor = cursor;\r\n }\r\n }\r\n\r\n updateCommentRoi = () => {\r\n let computedValue = 0;\r\n if (this.commentLayer[\"commentRois\"].length > 0) {\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx] =\r\n new CommentROI(\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx].regions,\r\n this.commentState.color,\r\n this.commentState.selectedTool,\r\n this.commentState.commentValue,\r\n computedValue\r\n );\r\n }\r\n };\r\n\r\n exit() {}\r\n\r\n renderConfiguration = () => {\r\n return (\r\n
    \r\n {this.name}:\r\n {\r\n this.changeSelectedCommentIdx(idx);\r\n }}\r\n commentRois={this.commentLayer[\"commentRois\"]}\r\n commentState={this.commentState}\r\n changeCommentState={(commentState) => {\r\n this.commentState = commentState;\r\n window.forceSidebarUpdate();\r\n }}\r\n updateCommentRoi={() => {\r\n this.updateCommentRoi(this.commentState);\r\n }}\r\n deleteCommentRoi={(idx) => {\r\n this.deleteCommentRoi(idx);\r\n }}\r\n changeSelectedColor={(idx, color) => {\r\n this.changeSelectedColor(idx, color);\r\n }}\r\n changeSelectedCommentValue={(idx, commentValue) => {\r\n this.changeSelectedCommentValue(idx, commentValue);\r\n }}\r\n changeRoiFontSize={(idx) => {\r\n this.changeRoiFontSize(idx);\r\n }}\r\n />\r\n
    \r\n );\r\n };\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n changeCommentType = (type) => {\r\n let commentState = this.props.commentState;\r\n commentState[\"selectedTool\"] = type;\r\n commentState[\"commentValue\"] = \"\";\r\n this.props.changeCommentState(commentState);\r\n };\r\n render() {\r\n const { commentValue, color, selectedTool } = this.props.commentState;\r\n return (\r\n
    \r\n
    \r\n
    \r\n {\r\n let commentState = this.props.commentState;\r\n commentState[\"commentValue\"] = e.target.value;\r\n this.props.changeCommentState(commentState);\r\n }}\r\n />\r\n {\r\n let commentState = this.props.commentState;\r\n commentState[\"color\"] = color;\r\n this.props.changeCommentState(commentState);\r\n }}\r\n />\r\n
    \r\n
    \r\n
    \r\n {\r\n this.changeCommentType(\"rectangle\");\r\n }}\r\n color={selectedTool === \"rectangle\" ? \"primary\" : \"default\"}\r\n startIcon={}\r\n >\r\n Rectangle\r\n \r\n {\r\n this.changeCommentType(\"arrow\");\r\n }}\r\n color={selectedTool === \"arrow\" ? \"primary\" : \"default\"}\r\n startIcon={}\r\n >\r\n Arrow\r\n \r\n
    \r\n
    \r\n {\r\n this.changeCommentType(\"region\");\r\n }}\r\n color={selectedTool === \"region\" ? \"primary\" : \"default\"}\r\n startIcon={}\r\n >\r\n Region\r\n \r\n {\r\n this.changeCommentType(\"distance\");\r\n }}\r\n color={selectedTool === \"distance\" ? \"primary\" : \"default\"}\r\n startIcon={}\r\n >\r\n Distance\r\n \r\n
    \r\n
    \r\n {\r\n this.changeCommentType(\"commentBox\");\r\n }}\r\n color={selectedTool === \"commentBox\" ? \"primary\" : \"default\"}\r\n startIcon={}\r\n >\r\n COMMENT\r\n \r\n
    \r\n
    \r\n \r\n \r\n {this.props.commentRois\r\n .map((commentRoi, i) => {\r\n return (\r\n this.props.changeSelectedCommentIdx(i)}\r\n >\r\n \r\n \r\n {commentRoi.type === \"rectangle\" && }\r\n {commentRoi.type === \"arrow\" && (\r\n \r\n )}\r\n {commentRoi.type === \"region\" && (\r\n \r\n )}\r\n {commentRoi.type === \"distance\" && (\r\n \r\n )}\r\n {commentRoi.type === \"commentBox\" && }\r\n \r\n \r\n 0 &&\r\n commentRoi.type !== \"commentBox\"\r\n ? \"Comment, Size: \" + commentRoi.computedValue\r\n : \"Comment\"\r\n : \"Comment\"\r\n }\r\n name=\"Textfield\"\r\n style={{ marginRight: \"36px\" }}\r\n fullWidth\r\n multiline\r\n margin=\"normal\"\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n value={commentRoi.commentValue}\r\n onChange={(e) => {\r\n this.props.changeSelectedCommentValue(\r\n i,\r\n e.target.value\r\n );\r\n }}\r\n />\r\n
    \r\n {commentRoi.type !== \"commentBox\" && (\r\n {\r\n this.props.changeSelectedColor(i, color);\r\n }}\r\n />\r\n )}\r\n
    \r\n \r\n \r\n {\r\n this.props.changeRoiFontSize(i);\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n this.props.deleteCommentRoi(i)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n );\r\n })\r\n .reverse()}\r\n
    \r\n
    \r\n \r\n );\r\n }\r\n}\r\n\r\nConfigForm.propTypes = {\r\n commentState: PropTypes.object,\r\n changeCommentState: PropTypes.func,\r\n commentRois: PropTypes.array,\r\n selectedCommentIdx: PropTypes.number,\r\n changeSelectedCommentIdx: PropTypes.func,\r\n changeSelectedCommentValue: PropTypes.func,\r\n changeSelectedColor: PropTypes.func,\r\n changeRoiFontSize: PropTypes.func,\r\n deleteCommentRoi: PropTypes.func,\r\n};\r\n\r\nexport default CommentTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport {\r\n FormGroup,\r\n FormControl,\r\n FormControlLabel,\r\n Checkbox,\r\n Radio,\r\n RadioGroup,\r\n Typography,\r\n} from \"@mui/material\";\r\n\r\nimport {\r\n updateLayer,\r\n findSameLayer,\r\n getIntersections,\r\n findRoi,\r\n createRegionRoi,\r\n} from \"../../utils/PolygonUtil\";\r\nimport Tool from \"./Tool\";\r\n\r\nclass CopyTool extends Tool {\r\n name = \"Copy\";\r\n includeBaseROI = false;\r\n mode = \"copy\";\r\n\r\n setLayer(obj) {\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedSameLayer = layerResults[0];\r\n this.structures = obj.structures;\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n /** Handeling of mouse events.\r\n *\r\n * @param {MouseEvent} event\r\n * @param {Object} p x and y of cursor {x:, y: }\r\n * @param {String} color Color of the currently selected structure (#012DEF)\r\n * @param {Bool} subtype Is the mouse over a subtype or not?\r\n * @param {String} name Name of the structure the cursor is above.\r\n * @param {Bool} positionInRoiLayer (Not used) Is the cursor currently in a ROI Layer?\r\n * @param {Bool} fullyLoaded (Not used)\r\n * @param {Int} parentLayer (Not used) The id of the parentlayer of the structure the curson is above.\r\n */\r\n mouse(params) {\r\n let { event, p, color, subtype, name } = params;\r\n // mouse middle button\r\n if (event.button === 1) {\r\n return;\r\n }\r\n // right mouse button -> clear\r\n this.clear = event.button === 2;\r\n\r\n // Click on something\r\n if (event.type === \"mouseup\") {\r\n const historyLength = window.projectHistory.getHistoryLength();\r\n let historyItem = [];\r\n let histId = this.structures[this.selectedLayer].id;\r\n\r\n let drawRegions = []; // Coordinates of the new structures\r\n let foundRoiResults = findRoi(\r\n p,\r\n this.roiLayers,\r\n this.structures,\r\n this.includeBaseROI\r\n );\r\n let foundRegionIndex = foundRoiResults[0];\r\n let foundRoi = foundRoiResults[1];\r\n\r\n // No Results: do nothing.\r\n if (foundRegionIndex < 0) return;\r\n\r\n // Same (parent) layer: do nothing.\r\n if (\r\n foundRegionIndex === this.selectedLayer &&\r\n !this.clear &&\r\n !foundRoi.isSubtype\r\n ) {\r\n return;\r\n }\r\n\r\n // Singular operations:\r\n if (\r\n this.mode === \"copy\" ||\r\n this.mode === \"convert\" ||\r\n this.mode === \"overlap\"\r\n ) {\r\n // Add found ROI to the new ROIs\r\n if (foundRoi !== null) drawRegions.push(foundRoi);\r\n }\r\n\r\n // Full-layer operations:\r\n else if (\r\n this.mode === \"copyAll\" ||\r\n this.mode === \"convertAll\" ||\r\n this.mode === \"overlapAll\"\r\n ) {\r\n let allRegions = this.roiLayers[\r\n foundRegionIndex\r\n ].layer.regionRois.filter(\r\n (regionroi) => regionroi.subtypeName === foundRoi.subtypeName // Only look at the same subtype\r\n );\r\n // Overlap all:\r\n if (this.mode === \"overlapAll\") {\r\n let intersection = getIntersections(\r\n this.layer.regionRois.filter((roi) => !roi.isObject), // Overlapping items cannot be objects\r\n allRegions\r\n );\r\n if (\r\n intersection !== null &&\r\n intersection.geometry.coordinates.length > 0\r\n ) {\r\n drawRegions = intersection.geometry.coordinates.map((roi_region) =>\r\n createRegionRoi(\r\n roi_region,\r\n this.structures[this.selectedLayer].color,\r\n this.structures[this.selectedLayer].isSubtype,\r\n false, // Not fully loaded\r\n this.structures[this.selectedLayer].id,\r\n false // Overlapping items cannot be objects\r\n )\r\n );\r\n }\r\n if (!this.clear) {\r\n for (let roi of this.layer.regionRois) {\r\n historyItem.push({ add: false, id: histId, roi: roi });\r\n }\r\n this.layer.regionRois = [];\r\n this.roiLayers[this.selectedLayer].tree.clear();\r\n }\r\n }\r\n // Convert or copy all: add all found ROIs to the new ROIs\r\n else {\r\n drawRegions = allRegions;\r\n }\r\n }\r\n\r\n //For convert, delete the ROIs from structure A before writing them to B\r\n if (\r\n !this.clear &&\r\n (this.mode === \"convert\" || this.mode === \"convertAll\")\r\n ) {\r\n if (typeof drawRegions !== \"undefined\") {\r\n updateLayer(\r\n this.roiLayers[foundRegionIndex].layer,\r\n { regions: drawRegions, inverted: false },\r\n true, // delete old poly\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[foundRegionIndex].tree,\r\n null,\r\n null,\r\n false,\r\n null,\r\n this.structures[foundRegionIndex].id,\r\n null,\r\n null,\r\n foundRoi.isObject\r\n );\r\n }\r\n }\r\n\r\n // Write the new regions to the selected layer\r\n if (typeof drawRegions !== \"undefined\") {\r\n updateLayer(\r\n this.layer,\r\n { regions: drawRegions, inverted: false },\r\n this.clear,\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[this.selectedSameLayer].tree,\r\n -1,\r\n false,\r\n this.mode === \"overlap\",\r\n null,\r\n this.structures[this.selectedLayer].id,\r\n null,\r\n null,\r\n foundRoi.isObject\r\n );\r\n }\r\n\r\n window.projectHistory.add(historyItem);\r\n\r\n const historyLength2 = window.projectHistory.getHistoryLength();\r\n window.projectHistory.mergePastItems(historyLength2 - historyLength);\r\n }\r\n }\r\n\r\n drawCustomCursor() {}\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
    \r\n {this.name}:\r\n {\r\n this.includeBaseROI = e;\r\n }}\r\n onChangeMode={(e) => {\r\n this.mode = e;\r\n }}\r\n />\r\n
    \r\n );\r\n }\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n state = { mode: \"copy\" };\r\n render() {\r\n let { onChange, onChangeMode } = this.props;\r\n let { mode, includeBaseROI } = this.state;\r\n return (\r\n
    \r\n \r\n {\r\n onChangeMode(e.target.value);\r\n this.setState({ mode: e.target.value });\r\n }}\r\n >\r\n \r\n }\r\n label=\"Copy\"\r\n style={{ width: \"150px\" }}\r\n />\r\n }\r\n label=\"Copy all\"\r\n />\r\n \r\n\r\n \r\n }\r\n label=\"Convert\"\r\n style={{ width: \"150px\" }}\r\n />\r\n }\r\n label=\"Convert all\"\r\n />\r\n \r\n \r\n }\r\n label=\"Overlap\"\r\n style={{ width: \"150px\" }}\r\n />\r\n }\r\n label=\"Overlap all\"\r\n />\r\n \r\n \r\n \r\n \r\n {\r\n {\r\n onChange(e.target.checked);\r\n this.setState({ includeBaseROI: e.target.checked });\r\n }}\r\n />\r\n }\r\n label=\"Include Base ROI\"\r\n />\r\n }\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nConfigForm.propTypes = {\r\n onChange: PropTypes.func,\r\n onChangeMode: PropTypes.func,\r\n};\r\n\r\nexport default CopyTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { FormControl, FormControlLabel, Checkbox } from \"@mui/material\";\r\n\r\nclass OverlapConfigForm extends Component {\r\n state = {\r\n removeOverlap: this.props.removeOverlap ? true : false,\r\n removeOverlapSame: this.props.removeOverlapSame ? true : false,\r\n useNodeDrawingMode: this.props.useNodeDrawingMode ? true : false,\r\n };\r\n\r\n render() {\r\n const {\r\n onChangeRemoveOverlap,\r\n onChangeRemoveOverlapSame,\r\n onChangeUseNodeDrawingMode,\r\n } = this.props;\r\n const { removeOverlap, removeOverlapSame, useNodeDrawingMode } = this.state;\r\n return (\r\n
    \r\n \r\n
    \r\n {\r\n onChangeRemoveOverlapSame(e.target.checked);\r\n this.setState({ removeOverlapSame: e.target.checked });\r\n }}\r\n value=\"remove overlaps of same structure\"\r\n />\r\n }\r\n label=\"remove overlaps of same structure\"\r\n />\r\n
    \r\n
    \r\n {\r\n onChangeRemoveOverlap(e.target.checked);\r\n this.setState({ removeOverlap: e.target.checked });\r\n }}\r\n value=\"remove overlaps of same level\"\r\n />\r\n }\r\n label=\"remove overlaps of same visible level\"\r\n />\r\n
    \r\n {typeof this.props.useNodeDrawingMode !== \"undefined\" && (\r\n
    \r\n {\r\n onChangeUseNodeDrawingMode(e.target.checked);\r\n this.setState({ useNodeDrawingMode: e.target.checked });\r\n }}\r\n value=\"Use Node drawing mode!\"\r\n />\r\n }\r\n label=\"Use Node drawing mode (apply with other mouse button)!\"\r\n />\r\n
    \r\n )}\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nOverlapConfigForm.propTypes = {\r\n removeOverlap: PropTypes.bool,\r\n removeOverlapSame: PropTypes.bool,\r\n useNodeDrawingMode: PropTypes.bool,\r\n onChangeUseNodeDrawingMode: PropTypes.func,\r\n onChangeRemoveOverlap: PropTypes.func,\r\n onChangeRemoveOverlapSame: PropTypes.func,\r\n};\r\n\r\nexport default OverlapConfigForm;\r\n","import {\r\n updateDrawLayer,\r\n updateLayer,\r\n findSiblingRoiLayers,\r\n findSameLayer,\r\n findClickedRoi,\r\n checkIfStructureHidden,\r\n} from \"../../utils/PolygonUtil\";\r\n\r\nimport { Typography } from \"@mui/material\";\r\nimport { pointsToCirclePolygon } from \"../../utils/PolygonUtil\";\r\nimport Tool from \"./Tool\";\r\nimport React from \"react\";\r\nimport OverlapConfigForm from \"./ConfigForms/OverlapConfigForm\";\r\n\r\nclass EllipseTool extends Tool {\r\n name = \"Ellipse\";\r\n noConfig = false;\r\n flag = false;\r\n downScale = 2;\r\n points = [];\r\n removeOverlap = null;\r\n removeOverlapSame = null;\r\n tempRemoveOverlap = null;\r\n tempRemoveOverlapSame = null;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedLayer = layerResults[0];\r\n this.parentLayer = layerResults[1];\r\n this.originalSelectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n\r\n const project = obj.viewerConfig_project;\r\n if (this.removeOverlap === null) {\r\n this.removeOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.tempRemoveOverlap === null) {\r\n this.tempRemoveOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.removeOverlapSame === null) {\r\n this.removeOverlapSame = project.projectProperties[\"PreventOverlapSame\"];\r\n }\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.tempRemoveOverlapSame = this.removeOverlapSame;\r\n this.removeOverlap = false;\r\n this.removeOverlapSame = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n this.removeOverlapSame = this.tempRemoveOverlapSame;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n mouse(params) {\r\n let { event, p, color, subtype, name, positionInRoiLayer, fullyLoaded } =\r\n params;\r\n if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n checkIfStructureHidden(\r\n this.structures,\r\n this.selectedLayer,\r\n subtype,\r\n name,\r\n color\r\n );\r\n this.drawLayer.regionRois = [];\r\n this.drawLayer.inverted = false;\r\n // right mouse button -> clear\r\n this.clear = event.button === 2;\r\n this.drawLayer.clear = this.clear;\r\n\r\n // update position history\r\n this.startPoint = p;\r\n\r\n // set drawing flag\r\n this.flag = true;\r\n\r\n // check if mouse down is inside region? => exapand region\r\n if (this.removeOverlapSame) {\r\n this.clickedOnRoi = findClickedRoi(\r\n p,\r\n this.selectedLayer,\r\n this.structures,\r\n this.roiLayers,\r\n this.includeBaseROI\r\n );\r\n }\r\n } else if (\r\n event.type === \"mouseup\" ||\r\n (this.flag && event.type === \"mouseleave\")\r\n ) {\r\n // release drawing flag\r\n this.flag = false;\r\n let drawRegion = {\r\n regions: [],\r\n inverted: false,\r\n };\r\n if (this.drawLayer.regionRois.length > 0) {\r\n drawRegion.regions = [this.drawLayer.regionRois[0]];\r\n\r\n // soll der selected layer sein\r\n let overlapRoiLayers = [];\r\n if (this.removeOverlapSame) {\r\n overlapRoiLayers.push(this.roiLayers[this.selectedLayer]);\r\n }\r\n if (this.removeOverlap) {\r\n let siblingRoiLayers = findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n );\r\n siblingRoiLayers.map((layer) => overlapRoiLayers.push(layer));\r\n }\r\n\r\n updateLayer(\r\n this.layer,\r\n drawRegion,\r\n this.clear,\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n false,\r\n this.roiLayers[this.parentLayer],\r\n this.structures[this.originalSelectedLayer].id,\r\n overlapRoiLayers,\r\n this.clickedOnRoi\r\n );\r\n this.drawLayer.regionRois = [];\r\n }\r\n } else if (event.type === \"mousemove\") {\r\n if (this.flag) {\r\n //draw Circle\r\n let drawRegion = pointsToCirclePolygon(\r\n this.startPoint,\r\n p,\r\n 32,\r\n this.ome.sizeX,\r\n this.ome.sizeY\r\n );\r\n\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n updateDrawLayer(\r\n this.drawLayer,\r\n drawRegion,\r\n false,\r\n color,\r\n subtype,\r\n name\r\n );\r\n }\r\n }\r\n }\r\n\r\n drawCustomCursor() {\r\n // no custom cursor\r\n }\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
    \r\n {this.name}:\r\n (this.removeOverlap = e)}\r\n onChangeRemoveOverlapSame={(e) => (this.removeOverlapSame = e)}\r\n />\r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default EllipseTool;\r\n","import { findClickedRoi, pointInsideRegion } from \"../../utils/PolygonUtil\";\r\nimport { RegionROI } from \"../../utils/ROI\";\r\nimport Tool from \"./Tool\";\r\n\r\nclass FillTool extends Tool {\r\n name = \"Fill\";\r\n noConfig = true;\r\n includeBaseROI = false;\r\n\r\n setLayer(obj) {\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n getParentIndex = (parentId) => {\r\n let structures = this.structures;\r\n if (structures.length < 1) {\r\n structures = this.state.project.viewerConfig.project.structures;\r\n }\r\n // return index of parent structures in all structures\r\n const parentIndex = structures.findIndex(\r\n (element) => element.id === parentId\r\n );\r\n return parentIndex;\r\n };\r\n\r\n getParentIndexLayer = () => {\r\n const structures = this.structures;\r\n const structure = this.structures[this.selectedLayer];\r\n // get index of parent roilayer\r\n let index = structures.findIndex((element) => element.id === structure.id);\r\n while (\r\n structures[index].subtypeLevel !== 0 &&\r\n structures[index].classificationSubtype\r\n ) {\r\n let pIndex = this.getParentIndex(structures[index].parentId);\r\n if (pIndex >= 0) index = pIndex;\r\n else break;\r\n }\r\n return structures.findIndex((element) => element === structures[index]);\r\n };\r\n\r\n determineCorrectLayer = (parentLayer) => {\r\n let correctLayer;\r\n if (parentLayer !== this.structures[this.selectedLayer]) {\r\n correctLayer = parentLayer;\r\n } else {\r\n correctLayer = this.selectedLayer;\r\n }\r\n return correctLayer;\r\n };\r\n\r\n fillHole(p) {\r\n const parentLayer = this.getParentIndexLayer();\r\n const correctLayer = this.determineCorrectLayer(parentLayer);\r\n const histId = this.structures[correctLayer].id;\r\n const tree = this.roiLayers[correctLayer].tree;\r\n const layer = this.roiLayers[correctLayer].layer;\r\n const regionRois = tree\r\n .search({\r\n minX: p.x,\r\n minY: p.y,\r\n maxX: p.x,\r\n maxY: p.y,\r\n })\r\n .sort((a, b) => a.roi.area - b.roi.area); //sorted rois, that are intersecting with clicked point\r\n let historyItem = [];\r\n\r\n for (let idx = 0; idx < regionRois.length; idx++) {\r\n let mainRoi = regionRois[idx].roi;\r\n if (mainRoi.regions.length > 1) {\r\n let mainRoiCopy = new RegionROI(mainRoi);\r\n mainRoiCopy.regions = [...mainRoi.regions];\r\n historyItem.push({ add: false, id: histId, roi: mainRoi.copy() });\r\n\r\n // if has holes\r\n for (let i = 1; i < mainRoi.regions.length; i++) {\r\n const hole = mainRoi.regions[i];\r\n const tempHoleRoi = new RegionROI({ regions: [hole] });\r\n if (pointInsideRegion(p, hole)) {\r\n //roi has clicked hole\r\n mainRoi.regions.splice(i, 1); //delete hole of affected polygon\r\n mainRoi.intRegions = undefined;\r\n const overlappingRegionRoiTreeItems = tree\r\n .search(tempHoleRoi.treeItem)\r\n .filter((treeItem) => {\r\n const p = {\r\n x: treeItem.roi.regions[0][0][0],\r\n y: treeItem.roi.regions[0][0][1],\r\n };\r\n return pointInsideRegion(p, hole);\r\n });\r\n let possibleRoiCandidates = [];\r\n if (overlappingRegionRoiTreeItems.length > 0) {\r\n for (let overlapTreeItem of overlappingRegionRoiTreeItems) {\r\n const oRoi = overlapTreeItem.roi;\r\n if (oRoi.uuid === mainRoi.uuid || oRoi.area > tempHoleRoi.area)\r\n continue;\r\n\r\n possibleRoiCandidates.push(oRoi);\r\n }\r\n }\r\n\r\n let finalPossibleRoiCandidates = [...possibleRoiCandidates];\r\n\r\n let roisToExclude = [];\r\n\r\n //todo: handle holes\r\n for (let possibleOverlapRoi of possibleRoiCandidates) {\r\n let excludedOverlapRoi = null;\r\n const p = {\r\n x: possibleOverlapRoi.regions[0][0][0],\r\n y: possibleOverlapRoi.regions[0][0][1],\r\n };\r\n for (let fRoi of finalPossibleRoiCandidates) {\r\n if (\r\n fRoi.regions.length > 1 &&\r\n possibleOverlapRoi.area < fRoi.area &&\r\n pointInsideRegion(p, fRoi.regions[0])\r\n ) {\r\n excludedOverlapRoi = possibleOverlapRoi;\r\n break;\r\n }\r\n }\r\n if (excludedOverlapRoi !== null) {\r\n roisToExclude.push(excludedOverlapRoi);\r\n finalPossibleRoiCandidates.filter(\r\n (item) => item.uuid !== excludedOverlapRoi.uuid\r\n );\r\n }\r\n }\r\n finalPossibleRoiCandidates = finalPossibleRoiCandidates.filter(\r\n (item) => {\r\n const index = roisToExclude.findIndex(\r\n (r) => r.uuid === item.uuid\r\n );\r\n return index < 0;\r\n }\r\n );\r\n\r\n for (let fRoi of finalPossibleRoiCandidates) {\r\n if (fRoi.regions.length > 1) {\r\n for (let h = 1; h < fRoi.regions.length; h++) {\r\n mainRoi.regions.push(fRoi.regions[h]);\r\n }\r\n mainRoi.intRegions = undefined;\r\n }\r\n tree.remove(fRoi.treeItem);\r\n historyItem.push({ add: false, id: histId, roi: fRoi.copy() });\r\n }\r\n break;\r\n }\r\n }\r\n historyItem.push({ add: true, id: histId, roi: mainRoi });\r\n if (layer.regionRois.length !== tree.all().length) {\r\n layer.regionRois = tree.all().map((treeItem) => treeItem.roi);\r\n }\r\n window.projectHistory.add(historyItem);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n mouse(params) {\r\n const { event, p } = params;\r\n // mouse middle button\r\n if (event.button === 1) {\r\n return;\r\n }\r\n\r\n if (event.type === \"mousedown\" && event.button === 0) {\r\n const clickedOnRoi = findClickedRoi(\r\n p,\r\n this.selectedLayer,\r\n this.structures,\r\n this.roiLayers,\r\n this.includeBaseROI\r\n );\r\n if (!clickedOnRoi) {\r\n //only try finding hole, if not clicked on roi\r\n this.fillHole(p);\r\n }\r\n }\r\n }\r\n\r\n drawCustomCursor() {}\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return null;\r\n }\r\n}\r\n\r\nexport default FillTool;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport {\r\n Grid,\r\n FormControl,\r\n TextField,\r\n FormHelperText,\r\n Slider,\r\n} from \"@mui/material\";\r\n\r\nconst styles = {\r\n sliderContainer: {\r\n margin: 0,\r\n width: \"100%\",\r\n },\r\n input: {\r\n width: 55,\r\n },\r\n};\r\n\r\nclass CustomRangeSlider extends React.Component {\r\n transformExponential(v, exponent) {\r\n let result = v ** (1 / exponent);\r\n return result;\r\n }\r\n render() {\r\n const { params, classes } = this.props;\r\n return (\r\n \r\n {params.label}\r\n \r\n \r\n {\r\n const value = parseInt(e.target.value, 10);\r\n params.onSliderChange([value, params.valueMax]);\r\n if (params.onChangeMin) params.onChangeMin(value);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.code === \"Enter\" && params.onKeyEnter) {\r\n params.onKeyEnter();\r\n }\r\n }}\r\n inputProps={{\r\n step: params.step,\r\n min: params.min,\r\n max: params.max,\r\n type: \"number\",\r\n \"aria-labelledby\": \"input-slider\",\r\n role: \"numberInput1\",\r\n }}\r\n />\r\n \r\n \r\n {\r\n const v = e.target.value;\r\n let value = [parseInt(v[0] ** 2, 10), parseInt(v[1] ** 2, 10)];\r\n params.onSliderChange(value);\r\n }}\r\n onChangeCommitted={params.onSliderchangeComitted}\r\n />\r\n \r\n \r\n {\r\n const value = parseInt(e.target.value, 10);\r\n params.onSliderChange([params.valueMin, value]);\r\n if (params.onChangeMax) params.onChangeMax(value);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.code === \"Enter\" && params.onKeyEnter) {\r\n params.onKeyEnter();\r\n }\r\n }}\r\n inputProps={{\r\n step: params.step,\r\n min: params.min,\r\n max: params.max,\r\n type: \"number\",\r\n \"aria-labelledby\": \"input-slider\",\r\n role: \"numberInput2\",\r\n }}\r\n />\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nCustomRangeSlider.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n params: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(CustomRangeSlider);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport Pagination from \"@mui/material/Pagination\";\r\n\r\nimport {\r\n getContainedRegionRois,\r\n getParentIndexLayer,\r\n} from \"../../utils/StructuresUtils\";\r\nimport { pointInside } from \"../../utils/PolygonUtil\";\r\n\r\nimport {\r\n Tooltip,\r\n IconButton,\r\n TextField,\r\n FormControlLabel,\r\n Checkbox,\r\n Typography,\r\n Button,\r\n} from \"@mui/material\";\r\n\r\nimport { Delete } from \"@mui/icons-material\";\r\nimport Tool from \"./Tool\";\r\nimport RBush from \"rbush\";\r\nimport CustomRangeSlider from \"../../../globalComponents/CustomRangeSlider\";\r\n\r\nclass FilterAnnotationsTool extends Tool {\r\n name = \"Filter Annotations\";\r\n selection = null;\r\n selectionIdx = 0;\r\n smallerIdx = -2;\r\n biggerIdx = -2;\r\n sortedTreeItems = [];\r\n checkJumps = true;\r\n regionRois = [];\r\n tree = new RBush();\r\n structure = null;\r\n parentIndex = 0;\r\n randSliderKey = 0;\r\n rangeSliderParams = {\r\n key: \"0\",\r\n label: \"\",\r\n min: 0,\r\n max: 10000,\r\n valueMin: 0,\r\n valueMax: 10000,\r\n step: 1,\r\n onKeyEnter: () => this.updateRangeMode(),\r\n onSliderChange: (value) => {\r\n this.rangeSliderParams.valueMin = value[0];\r\n this.rangeSliderParams.valueMax = value[1];\r\n window.forceSidebarUpdate();\r\n },\r\n onSliderchangeComitted: () => this.updateRangeMode(),\r\n };\r\n\r\n updateRangeMode = () => {\r\n if (this.sortedTreeItems && this.sortedTreeItems.length > 0) {\r\n let smallerIdx = -2;\r\n let biggerIdx = -2;\r\n for (let i = 0; i < this.sortedTreeItems.length; i++) {\r\n const treeItem = this.sortedTreeItems[i];\r\n if (\r\n treeItem.roi.area > this.rangeSliderParams.valueMin &&\r\n smallerIdx === -2\r\n ) {\r\n smallerIdx = i - 1;\r\n }\r\n if (\r\n treeItem.roi.area > this.rangeSliderParams.valueMax &&\r\n biggerIdx === -2\r\n ) {\r\n biggerIdx = i;\r\n break;\r\n }\r\n }\r\n if (smallerIdx !== this.smallerIdx && smallerIdx >= 0) {\r\n this.smallerIdx = smallerIdx;\r\n this.selectionIdx = this.smallerIdx;\r\n this.selection = this.sortedTreeItems[this.selectionIdx];\r\n if (this.checkJumps) window.zoomToRect(this.selection.roi.bounds);\r\n window.forceSidebarUpdate();\r\n } else if (biggerIdx !== this.biggerIdx && biggerIdx >= 0) {\r\n this.biggerIdx = biggerIdx;\r\n this.selectionIdx = this.biggerIdx;\r\n this.selection = this.sortedTreeItems[this.selectionIdx];\r\n if (this.checkJumps) window.zoomToRect(this.selection.roi.bounds);\r\n window.forceSidebarUpdate();\r\n } else if (smallerIdx < 0 || biggerIdx < 0) {\r\n if (smallerIdx > 0) {\r\n this.selection = this.sortedTreeItems[smallerIdx];\r\n } else if (biggerIdx > 0) {\r\n this.selection = this.sortedTreeItems[biggerIdx];\r\n }\r\n this.smallerIdx = smallerIdx;\r\n this.biggerIdx = biggerIdx;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n };\r\n\r\n setLayer(obj) {\r\n this.structures = obj.structures;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.structure = obj.structures[obj.selectedLayer];\r\n this.regionRois = getContainedRegionRois(\r\n this.structure,\r\n this.structures,\r\n this.roiLayers\r\n );\r\n this.parentIndex = getParentIndexLayer(this.structure, this.structures);\r\n this.tree.clear();\r\n this.tree.load(this.regionRois.map((item) => item.treeItem));\r\n this.updateSortedTreeItems();\r\n this.groupPermissions = obj.groupPermissions;\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n findSmallestTreeItem(p) {\r\n let minArea = Number.MAX_SAFE_INTEGER;\r\n let resultItem;\r\n if (this.structures[this.selectedLayer].visible) {\r\n let treeItems = this.tree.search({\r\n minX: p.x,\r\n minY: p.y,\r\n maxX: p.x,\r\n maxY: p.y,\r\n });\r\n for (let treeItem of treeItems) {\r\n let b = treeItem.roi.bounds;\r\n\r\n if (pointInside(p, treeItem.roi)) {\r\n let bArea = (b.right - b.left) * (b.bottom - b.top);\r\n if (bArea < minArea) {\r\n minArea = bArea;\r\n resultItem = treeItem;\r\n }\r\n }\r\n }\r\n }\r\n return resultItem;\r\n }\r\n\r\n deleteSmaller = (idx) => {\r\n let historyItem = [];\r\n let histId = this.structures[this.parentIndex].id;\r\n this.biggerIdx -= idx + 1;\r\n let idxToDelete = idx;\r\n const roiLayer = this.roiLayers[this.parentIndex];\r\n while (idxToDelete >= 0) {\r\n const treeItemToDelete = this.sortedTreeItems[idxToDelete];\r\n roiLayer.tree.remove(treeItemToDelete);\r\n this.tree.remove(treeItemToDelete);\r\n historyItem.push({ add: false, id: histId, roi: treeItemToDelete.roi });\r\n idxToDelete--;\r\n }\r\n this.regionRois = this.tree.all().map((treeItem) => treeItem.roi);\r\n this.roiLayers[this.parentIndex].layer.regionRois = this.roiLayers[\r\n this.parentIndex\r\n ].tree\r\n .all()\r\n .map((treeItem) => treeItem.roi);\r\n\r\n this.updateSortedTreeItems();\r\n this.selection = null;\r\n this.smallerIdx = -2;\r\n window.forceSidebarUpdate();\r\n window.projectHistory.add(historyItem);\r\n };\r\n\r\n deleteBigger = (idx) => {\r\n let historyItem = [];\r\n let histId = this.structures[this.parentIndex].id;\r\n let idxToDelete = idx;\r\n const roiLayer = this.roiLayers[this.parentIndex];\r\n while (idxToDelete < this.sortedTreeItems.length) {\r\n const treeItemToDelete = this.sortedTreeItems[idxToDelete];\r\n roiLayer.tree.remove(treeItemToDelete);\r\n this.tree.remove(treeItemToDelete);\r\n historyItem.push({ add: false, id: histId, roi: treeItemToDelete.roi });\r\n idxToDelete++;\r\n }\r\n this.regionRois = this.tree.all().map((treeItem) => treeItem.roi);\r\n this.roiLayers[this.parentIndex].layer.regionRois = this.roiLayers[\r\n this.parentIndex\r\n ].tree\r\n .all()\r\n .map((treeItem) => treeItem.roi);\r\n\r\n this.updateSortedTreeItems();\r\n this.selection = null;\r\n this.biggerIdx = -2;\r\n window.forceSidebarUpdate();\r\n window.projectHistory.add(historyItem);\r\n };\r\n\r\n deleteSelection() {\r\n let historyItem = [];\r\n let histId = this.structures[this.parentIndex].id;\r\n this.roiLayers[this.parentIndex].tree.remove(this.selection);\r\n this.tree.remove(this.selection);\r\n historyItem.push({ add: false, id: histId, roi: this.selection.roi });\r\n this.regionRois = this.tree.all().map((treeItem) => treeItem.roi);\r\n this.roiLayers[this.parentIndex].layer.regionRois = this.roiLayers[\r\n this.parentIndex\r\n ].tree\r\n .all()\r\n .map((treeItem) => treeItem.roi);\r\n\r\n this.updateSortedTreeItems();\r\n\r\n if (this.selectionIdx < this.sortedTreeItems.length) {\r\n this.selection = this.sortedTreeItems[this.selectionIdx];\r\n if (this.checkJumps) window.zoomToRect(this.selection.roi.bounds);\r\n } else if (this.sortedTreeItems.length > 0) {\r\n this.selectionIdx = this.sortedTreeItems.length - 1;\r\n this.selection = this.sortedTreeItems[this.selectionIdx];\r\n if (this.checkJumps) window.zoomToRect(this.selection.roi.bounds);\r\n } else {\r\n this.selection = null;\r\n }\r\n window.forceSidebarUpdate();\r\n window.projectHistory.add(historyItem);\r\n }\r\n /**\r\n * handle shortcuts\r\n * @param {ActionEvent} event Event when keyboard button is pressed\r\n */\r\n onKeyDown(event) {\r\n if (\r\n event.key === \"Delete\" &&\r\n this.selection &&\r\n this.groupPermissions.canAnnotate\r\n ) {\r\n this.deleteSelection();\r\n }\r\n }\r\n\r\n mouse(params) {\r\n let { event, p } = params;\r\n this.curX = p.x;\r\n this.curY = p.y;\r\n\r\n // mouse middle button\r\n if (event.button === 1) {\r\n return;\r\n }\r\n\r\n if (event.type === \"mousedown\") {\r\n let treeItem = this.findSmallestTreeItem(p);\r\n this.selection = treeItem;\r\n this.updateSortedTreeItems();\r\n if (this.selection) {\r\n this.selectionIdx = this.selection.sortIdx;\r\n this.smallerIdx = -2;\r\n this.biggerIdx = -2;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Draw a custom cursor\r\n */\r\n drawCustomCursor(ctx) {\r\n if (this.selection) {\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = \"#ffffff\";\r\n let b = this.selection.roi.bounds;\r\n // no custom cursor\r\n ctx.rect(b.left, b.top, b.right - b.left, b.bottom - b.top);\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n /**\r\n * Sorts all rois of the selected structure by area, should they not already be sorted.\r\n */\r\n updateSortedTreeItems = () => {\r\n if (this.sortedTreeItems !== this.regionRois) {\r\n this.sortedTreeItems = this.tree.all().sort((treeItem1, treeItem2) => {\r\n return treeItem1.roi.area - treeItem2.roi.area;\r\n });\r\n for (let i = 0; i < this.sortedTreeItems.length; i++) {\r\n this.sortedTreeItems[i][\"sortIdx\"] = i;\r\n }\r\n if (this.sortedTreeItems.length > 0) {\r\n const valueIsMin =\r\n this.rangeSliderParams.min === this.rangeSliderParams.valueMin;\r\n const valueIsMax =\r\n this.rangeSliderParams.max === this.rangeSliderParams.valueMax;\r\n this.rangeSliderParams.min = parseInt(\r\n this.sortedTreeItems[0].roi.area,\r\n 10\r\n );\r\n if (\r\n this.rangeSliderParams.valueMin < this.rangeSliderParams.min ||\r\n valueIsMin\r\n ) {\r\n this.rangeSliderParams.valueMin = this.rangeSliderParams.min;\r\n }\r\n this.rangeSliderParams.max =\r\n parseInt(\r\n this.sortedTreeItems[this.sortedTreeItems.length - 1].roi.area,\r\n 10\r\n ) + 1;\r\n if (\r\n this.rangeSliderParams.valueMax > this.rangeSliderParams.max ||\r\n valueIsMax\r\n ) {\r\n this.rangeSliderParams.valueMax = this.rangeSliderParams.max;\r\n }\r\n }\r\n window.forceSidebarUpdate();\r\n }\r\n };\r\n\r\n selectRegion = (v) => {\r\n this.updateSortedTreeItems();\r\n this.selectionIdx = v - 1;\r\n this.selection = this.sortedTreeItems[this.selectionIdx];\r\n if (this.selection && this.selection.roi) {\r\n if (this.checkJumps) window.zoomToRect(this.selection.roi.bounds);\r\n window.forceSidebarUpdate();\r\n }\r\n };\r\n\r\n toggleJumps = () => {\r\n this.checkJumps = !this.checkJumps;\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n exit() {}\r\n\r\n renderConfiguration = () => {\r\n return (\r\n
    \r\n {this.name}:\r\n this.selectRegion(v)}\r\n delete={() => this.deleteSelection()}\r\n regionRois={this.regionRois}\r\n selection={this.selection}\r\n checkJumps={this.checkJumps}\r\n toggleJumps={() => this.toggleJumps()}\r\n groupPermissions={this.groupPermissions}\r\n rangeSliderParams={this.rangeSliderParams}\r\n deleteSmaller={this.deleteSmaller}\r\n deleteBigger={this.deleteBigger}\r\n />\r\n
    \r\n );\r\n };\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n render() {\r\n const smallerSelectionCount =\r\n this.props.selectionIdx < 0 ? 0 : this.props.selectionIdx + 1;\r\n const biggerSelectionCount =\r\n this.props.selectionIdx < 0\r\n ? 0\r\n : this.props.regionRois.length - this.props.selectionIdx;\r\n const smallerMinSliderCount =\r\n this.props.smallerIdx < 0 ? 0 : this.props.smallerIdx;\r\n const biggerMaxSliderCount =\r\n this.props.biggerIdx < 0\r\n ? 0\r\n : this.props.regionRois.length - this.props.biggerIdx - 1;\r\n return (\r\n
    \r\n {\r\n this.props.toggleJumps();\r\n }}\r\n value={this.props.checkJumps}\r\n />\r\n }\r\n label=\"Jump to selection\"\r\n />\r\n {this.props.selection &&\r\n this.props.smallerIdx < 0 &&\r\n this.props.biggerIdx < 0 ? (\r\n
    \r\n
    Selection:
    \r\n
      \r\n
    • Area: {this.props.selection.roi.area.toFixed(2)} px
    • \r\n
    \r\n \r\n \r\n this.props.deleteSmaller(this.props.selectionIdx)\r\n }\r\n >\r\n Delete {smallerSelectionCount}
    \r\n smaller Rois\r\n \r\n this.props.deleteBigger(this.props.selectionIdx)}\r\n >\r\n {\" \"}\r\n Delete {biggerSelectionCount}
    \r\n bigger Rois\r\n \r\n
    \r\n
    \r\n ) : (\r\n
    \r\n
    Range:
    \r\n
      \r\n {this.props.sortedTreeItems[this.props.smallerIdx] ? (\r\n
    • \r\n First ROI smaller than minimum value:\r\n
        \r\n
      • \r\n Area:{\" \"}\r\n {this.props.sortedTreeItems[\r\n this.props.smallerIdx\r\n ].roi.area.toFixed(2)}{\" \"}\r\n px\r\n
      • \r\n
      \r\n
    • \r\n ) : (\r\n
    • No ROI is smaller than minimum value!
    • \r\n )}\r\n {this.props.sortedTreeItems[this.props.biggerIdx] ? (\r\n
    • \r\n First ROI bigger than maximum value:\r\n
        \r\n
      • \r\n Area:{\" \"}\r\n {this.props.sortedTreeItems[\r\n this.props.biggerIdx\r\n ].roi.area.toFixed(2)}{\" \"}\r\n px\r\n
      • \r\n
      \r\n
    • \r\n ) : (\r\n
    • No ROI is bigger than minimum value!
    • \r\n )}\r\n
    \r\n \r\n this.props.deleteSmaller(this.props.smallerIdx)}\r\n >\r\n Delete {smallerMinSliderCount}
    \r\n smaller Rois\r\n \r\n this.props.deleteBigger(this.props.biggerIdx)}\r\n >\r\n {\" \"}\r\n Delete {biggerMaxSliderCount}
    \r\n bigger Rois\r\n \r\n
    \r\n \r\n )}\r\n\r\n \r\n {\r\n this.props.selectRegion(e.target.value);\r\n }}\r\n variant=\"outlined\"\r\n InputProps={{\r\n inputProps: { min: 1, max: this.props.regionRois.length },\r\n }}\r\n />\r\n
    \r\n
    \r\n
    \r\n {\" \"}\r\n {\r\n this.props.selectRegion(v);\r\n }}\r\n count={this.props.regionRois.length}\r\n />\r\n
    \r\n\r\n \r\n \r\n {\r\n this.props.delete();\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n
    \r\n \r\n );\r\n }\r\n}\r\n\r\nConfigForm.propTypes = {\r\n randSliderKey: PropTypes.number,\r\n checkJumps: PropTypes.bool,\r\n toggleJumps: PropTypes.func,\r\n selectionIdx: PropTypes.number,\r\n smallerIdx: PropTypes.number,\r\n biggerIdx: PropTypes.number,\r\n sortedTreeItems: PropTypes.array,\r\n selection: PropTypes.object,\r\n selectRegion: PropTypes.func,\r\n regionRois: PropTypes.array,\r\n delete: PropTypes.func,\r\n groupPermissions: PropTypes.object,\r\n rangeSliderParams: PropTypes.object,\r\n deleteSmaller: PropTypes.func,\r\n deleteBigger: PropTypes.func,\r\n};\r\n\r\nexport default FilterAnnotationsTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { RegionROI } from \"../../utils/ROI\";\r\nimport RBush from \"rbush\";\r\nimport { updateDrawLayer } from \"../../utils/PolygonUtil\";\r\nimport Backend from \"../../../common/utils/Backend\";\r\n\r\nimport {\r\n TextField,\r\n Button,\r\n Checkbox,\r\n FormControlLabel,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport { hasIntersection } from \"../../utils/PolygonUtil\";\r\n\r\nimport Tool from \"./Tool\";\r\nimport Grid from \"@mui/material/Grid\";\r\n\r\nclass GridAnnotationTool extends Tool {\r\n name = \"GridAnnotationTool\";\r\n gridSize = 512;\r\n overlap = 0;\r\n startPoint = null;\r\n endPoint = null;\r\n pointTL = { x: 0, y: 0 };\r\n pointBR = { x: 0, y: 0 };\r\n tiles = [];\r\n rightClick = false;\r\n n = 9;\r\n gridOffsetX = 0;\r\n gridOffsetY = 0;\r\n progressText = \"make a selection\";\r\n exportClasses = true;\r\n baseROIOnly = true;\r\n currentFileId = null;\r\n init = false;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.fileId = obj.fileId;\r\n this.structures = obj.structures;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.allRoiLayers = obj.allRoiLayers;\r\n this.project = obj.viewerConfig_project;\r\n this.projectNoViewConfig = obj.project;\r\n this.drawLayer = obj.drawLayer;\r\n this.rendererDict = obj.rendererDict;\r\n this.gridLayer = this.structures.findIndex((s) => s.label === \"Grid\");\r\n this.gridLayer = this.gridLayer > 0 ? this.gridLayer : 0;\r\n window.tileExportProgress = this.printFunction;\r\n this.disableExport =\r\n this.structures.findIndex((s) => s.label === \"Grid\") > -1 ? false : true;\r\n if (this.currentFileId !== this.fileId) {\r\n this.tiles = [];\r\n this.currentFileId = this.fileId;\r\n }\r\n if (!this.init) {\r\n let rendererObj = this.rendererDict[\r\n this.fileId\r\n ].props.persistentStorage.load(\"gridConfig\" + this.fileId);\r\n if (rendererObj) {\r\n this.gridSize = rendererObj.gridSize;\r\n this.overlap = rendererObj.overlap;\r\n this.gridOffsetX = rendererObj.gridOffsetX;\r\n this.gridOffsetY = rendererObj.gridOffsetY;\r\n this.rendererDict[this.fileId].gridTileCount = rendererObj.tileCount;\r\n }\r\n this.init = true;\r\n }\r\n if (\r\n this.rendererDict[this.fileId].gridTileCount !==\r\n this.roiLayers[this.gridLayer].layer.regionRois.length\r\n ) {\r\n this.tiles = [];\r\n }\r\n }\r\n\r\n mouse(params) {\r\n let { event, p } = params;\r\n if (event.type === \"mousedown\") {\r\n if (this.startPoint === null && event.button !== 1) {\r\n this.startPoint = p;\r\n }\r\n if (event.button === 2) {\r\n this.rightClick = true;\r\n }\r\n } else if (event.type === \"mouseup\") {\r\n if (this.startPoint !== null) {\r\n this.endPoint = p;\r\n this.createSelectionArea(this.startPoint, this.endPoint);\r\n if (this.structures[this.gridLayer].label === \"Grid\") {\r\n this.treeSelection();\r\n }\r\n\r\n this.startPoint = null;\r\n this.drawLayer.regionRois = [];\r\n this.rightClick = false;\r\n }\r\n } else if (event.type === \"mousemove\" && this.startPoint) {\r\n this.endPoint = p;\r\n this.createSelectionArea(this.startPoint, this.endPoint);\r\n if (this.structures[this.gridLayer].label === \"Grid\") {\r\n this.treeSelection();\r\n }\r\n }\r\n }\r\n\r\n //mark tiles\r\n drawCustomCursor(ctx, mp, f) {\r\n if (this.tiles.length > 0 && this.gridLayer !== 0) {\r\n for (let tile of this.tiles) {\r\n if (tile.roi.comment !== \"export flagged\") {\r\n let idx = this.tiles.indexOf(tile);\r\n if (idx >= 0) {\r\n this.tiles.splice(idx, 1);\r\n }\r\n }\r\n }\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = \"#03FF00\";\r\n ctx.lineWidth = 3 / f;\r\n this.tiles.forEach((e) => {\r\n ctx.rect(e.minX, e.minY, e.maxX - e.minX, e.maxY - e.minY);\r\n });\r\n\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n createSelectionArea = (sP, eP) => {\r\n if (sP.x <= eP.x) {\r\n this.pointTL.x = sP.x;\r\n this.pointBR.x = eP.x;\r\n } else if (sP.x > eP.x) {\r\n this.pointTL.x = eP.x;\r\n this.pointBR.x = sP.x;\r\n }\r\n\r\n if (sP.y <= eP.y) {\r\n this.pointTL.y = sP.y;\r\n this.pointBR.y = eP.y;\r\n } else if (sP.y > eP.y) {\r\n this.pointTL.y = eP.y;\r\n this.pointBR.y = sP.y;\r\n }\r\n\r\n let points = [];\r\n points.push([this.pointTL.x, this.pointTL.y]);\r\n points.push([this.pointBR.x, this.pointTL.y]);\r\n points.push([this.pointBR.x, this.pointBR.y]);\r\n points.push([this.pointTL.x, this.pointBR.y]);\r\n\r\n let drawRegion = {\r\n regions: [points],\r\n inverted: false,\r\n };\r\n\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n updateDrawLayer(this.drawLayer, drawRegion, false, \"#FF0000\", 0, \"zero\");\r\n };\r\n\r\n treeSelection = () => {\r\n let treeItems = this.roiLayers[this.gridLayer].tree.search({\r\n minX: this.pointTL.x,\r\n minY: this.pointTL.y,\r\n maxX: this.pointBR.x,\r\n maxY: this.pointBR.y,\r\n });\r\n for (let treeItem of treeItems) {\r\n if (treeItem.roi.comment === \"\" && !this.rightClick) {\r\n treeItem.roi.comment = \"export flagged\";\r\n this.tiles.push(treeItem);\r\n } else if (treeItem.roi.comment === \"export flagged\" && this.rightClick) {\r\n if (this.tiles.includes(treeItem)) {\r\n treeItem.roi.comment = \"\";\r\n let idx = this.tiles.indexOf(treeItem);\r\n if (idx >= 0) {\r\n this.tiles.splice(idx, 1);\r\n }\r\n }\r\n } else if (\r\n treeItem.roi.comment === \"export flagged\" &&\r\n !this.rightClick\r\n ) {\r\n if (!this.tiles.includes(treeItem)) {\r\n this.tiles.push(treeItem);\r\n }\r\n }\r\n }\r\n };\r\n\r\n createGrid = () => {\r\n let baseRois = [];\r\n if (this.baseROIOnly) {\r\n baseRois = this.roiLayers[0].layer.regionRois;\r\n if (baseRois.length === 0) {\r\n window.showWarningSnackbar(\"No Base ROI set!\");\r\n return;\r\n }\r\n } else {\r\n let maxX = this.ome.sizeX;\r\n let maxY = this.ome.sizeY;\r\n let wholeSceneRoi = new RegionROI({\r\n regions: [\r\n [\r\n [0, 0],\r\n [maxX, 0],\r\n [maxX, maxY],\r\n [0, maxY],\r\n [0, 0],\r\n ],\r\n ],\r\n });\r\n baseRois = [wholeSceneRoi];\r\n }\r\n this.tiles = [];\r\n let idx = this.structures.findIndex((s) => s.label === \"Grid\");\r\n let r = this.rendererDict[this.fileId];\r\n if (idx === -1) {\r\n r.props.projectContext.addStructure(\"Grid\", true);\r\n idx = this.structures.findIndex((s) => s.label === \"Grid\");\r\n }\r\n if (idx === -1) {\r\n this.printFunction(\"TE;Can't create grid\");\r\n window.showErrorSnackbar(\"Can't create grid\");\r\n return;\r\n }\r\n r.props.setSelectedLayer(idx);\r\n\r\n // remove for loop if it is sure that we only need one color\r\n let str = idx;\r\n // delete all rois\r\n this.roiLayers[str].layer.regionRois = [];\r\n this.roiLayers[str].tree = new RBush();\r\n\r\n for (let baseRoi of baseRois) {\r\n // make all tiles\r\n let regions = [];\r\n\r\n // make x*y tiles\r\n for (\r\n let x = baseRoi.bounds.left + this.gridOffsetX;\r\n x < baseRoi.bounds.right;\r\n x += this.gridSize - this.overlap\r\n ) {\r\n for (\r\n let y = baseRoi.bounds.top + this.gridOffsetY;\r\n y < baseRoi.bounds.bottom;\r\n y += this.gridSize - this.overlap\r\n ) {\r\n regions = [];\r\n // make four corners of tile\r\n let c_1 = [x, y];\r\n regions.push(c_1);\r\n let c_2 = [x + this.gridSize, y];\r\n regions.push(c_2);\r\n let c_3 = [x + this.gridSize, y + this.gridSize];\r\n regions.push(c_3);\r\n let c_4 = [x, y + this.gridSize];\r\n regions.push(c_4);\r\n regions.push(c_1);\r\n\r\n let roi = new RegionROI({ regions: [regions] });\r\n if (hasIntersection(roi, baseRoi)) {\r\n this.roiLayers[str].layer.regionRois.push(roi);\r\n this.roiLayers[str].tree.insert(roi.treeItem);\r\n }\r\n }\r\n }\r\n }\r\n\r\n r.gridTileCount = this.roiLayers[str].layer.regionRois.length;\r\n\r\n this.saveGridConfig(r.gridTileCount);\r\n };\r\n\r\n onClickExport = () => {\r\n let tiles = [];\r\n for (let tile in this.tiles) {\r\n tiles.push({ x: this.tiles[tile].minX, y: this.tiles[tile].minY });\r\n }\r\n if (tiles.length < 1) {\r\n this.printFunction(\"TE;No tiles selected\");\r\n window.showWarningSnackbar(\"No tiles selected\");\r\n return;\r\n }\r\n if (\r\n this.structures[this.selectedLayer].label === \"Grid\" ||\r\n this.structures[this.selectedLayer].label === \"Base ROI\"\r\n ) {\r\n this.printFunction(\"TE;Select a structure\");\r\n window.showWarningSnackbar(\"Select a structure\");\r\n return;\r\n }\r\n this.printFunction(\"TE;Creating Dataset...\");\r\n let pconfig = this.projectNoViewConfig.files;\r\n let fileIndex = pconfig.findIndex((s) => s.id === this.fileId);\r\n\r\n window.showSuccessSnackbar(\r\n \"Selected structure: \" + this.structures[this.selectedLayer].label\r\n );\r\n\r\n let exportObject = {\r\n size: this.gridSize,\r\n overlap: this.overlap,\r\n classes: this.exportClasses,\r\n baseROIOnly: this.baseROIOnly,\r\n tiles: tiles,\r\n selectedStructure: this.structures[this.selectedLayer].label,\r\n selectedStructureId: this.structures[this.selectedLayer].id,\r\n fileConfig: pconfig[fileIndex],\r\n projectId: this.projectNoViewConfig.id,\r\n };\r\n Backend.tileExport(exportObject);\r\n };\r\n\r\n printFunction = (line) => {\r\n console.debug(line);\r\n if (line.includes(\"TE;\")) {\r\n let newLine = line.split(\";\");\r\n newLine = newLine[1];\r\n if (!newLine.includes(\"ERROR\")) {\r\n this.progressText = newLine;\r\n if (newLine.includes(\"Dataset created\")) {\r\n window.showSuccessSnackbar(newLine);\r\n }\r\n } else {\r\n this.progressText = \"Dataset could not be created\";\r\n }\r\n\r\n window.forceSidebarUpdate();\r\n }\r\n };\r\n\r\n saveGridConfig = (tileCount) => {\r\n let saveObject = {\r\n gridSize: this.gridSize,\r\n overlap: this.overlap,\r\n gridOffsetX: this.gridOffsetX,\r\n gridOffsetY: this.gridOffsetY,\r\n tileCount: tileCount,\r\n };\r\n this.rendererDict[this.fileId].props.persistentStorage.save(\r\n \"gridConfig\" + this.fileId,\r\n saveObject\r\n );\r\n };\r\n\r\n moveAnnotations = () => {\r\n this.rendererDict[this.fileId].moveAnnotations();\r\n };\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
    \r\n {this.name}:\r\n {\r\n this.n =\r\n parseInt(e.target.value) > this.gridSize\r\n ? this.n + 1\r\n : this.n - 1;\r\n this.n = this.n > 6 ? this.n : 6;\r\n this.gridSize = Math.pow(2, this.n);\r\n this.gridOffsetX = 0;\r\n this.gridOffsetY = 0;\r\n\r\n if (this.overlap * 2 > this.gridSize) {\r\n this.overlap = parseInt(this.gridSize / 2, 10);\r\n }\r\n\r\n window.forceSidebarUpdate();\r\n }}\r\n overlap={this.overlap}\r\n onChangeOverlap={(e) => {\r\n let value =\r\n parseInt(e.target.value) < 0 ? 0 : parseInt(e.target.value);\r\n this.overlap = value > this.gridSize ? this.overlap : value;\r\n window.forceSidebarUpdate();\r\n }}\r\n createGrid={this.createGrid}\r\n onClickExport={this.onClickExport}\r\n gridOffsetX={this.gridOffsetX}\r\n gridOffsetY={this.gridOffsetY}\r\n onChangeGridOffsetX={(e) => {\r\n let v =\r\n parseInt(e.target.value) > -this.gridSize &&\r\n parseInt(e.target.value) < this.gridSize\r\n ? parseInt(e.target.value)\r\n : this.gridOffsetX;\r\n this.gridOffsetX = v;\r\n window.forceSidebarUpdate();\r\n }}\r\n onChangeGridOffsetY={(e) => {\r\n let v =\r\n parseInt(e.target.value) > -this.gridSize &&\r\n parseInt(e.target.value) < this.gridSize\r\n ? parseInt(e.target.value)\r\n : this.gridOffsetY;\r\n this.gridOffsetY = v;\r\n window.forceSidebarUpdate();\r\n }}\r\n onChangeExportClasses={(e) => {\r\n this.exportClasses = !e;\r\n window.forceSidebarUpdate();\r\n }}\r\n onChangeBaseROIOnly={(e) => {\r\n this.baseROIOnly = !e;\r\n window.forceSidebarUpdate();\r\n }}\r\n disableExport={this.disableExport}\r\n />\r\n
    \r\n );\r\n }\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n state = { mode: \"copy\" };\r\n render() {\r\n let {\r\n gridSize,\r\n overlap,\r\n createGrid,\r\n onClickExport,\r\n gridOffsetX,\r\n gridOffsetY,\r\n progressText,\r\n exportClasses,\r\n baseROIOnly,\r\n disableExport,\r\n } = this.props;\r\n return (\r\n
    \r\n
    {progressText}
    \r\n
    \r\n {\r\n this.props.onChangeExportClasses(exportClasses);\r\n }}\r\n />\r\n }\r\n label=\"Export with Subtypes\"\r\n />\r\n {\r\n this.props.onChangeBaseROIOnly(baseROIOnly);\r\n }}\r\n />\r\n }\r\n label=\"Consider Base ROI\"\r\n />\r\n
    \r\n \r\n \r\n this.props.onChangeGridOffsetX(e)}\r\n variant=\"outlined\"\r\n />\r\n \r\n \r\n this.props.onChangeGridOffsetY(e)}\r\n variant=\"outlined\"\r\n />\r\n \r\n \r\n this.props.onChangeGridSize(e)}\r\n variant=\"outlined\"\r\n />\r\n \r\n \r\n this.props.onChangeOverlap(e)}\r\n variant=\"outlined\"\r\n />\r\n \r\n \r\n createGrid()}\r\n >\r\n Create Grid\r\n \r\n onClickExport()}\r\n disabled={disableExport}\r\n >\r\n Export Selection\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nConfigForm.propTypes = {\r\n gridSize: PropTypes.number,\r\n overlap: PropTypes.number,\r\n createGrid: PropTypes.func,\r\n onClickExport: PropTypes.func,\r\n gridOffsetX: PropTypes.number,\r\n gridOffsetY: PropTypes.number,\r\n progressText: PropTypes.string,\r\n exportClasses: PropTypes.bool,\r\n baseROIOnly: PropTypes.bool,\r\n disableExport: PropTypes.bool,\r\n onChangeExportClasses: PropTypes.func,\r\n onChangeBaseROIOnly: PropTypes.func,\r\n onChangeGridOffsetX: PropTypes.func,\r\n onChangeGridOffsetY: PropTypes.func,\r\n onChangeGridSize: PropTypes.func,\r\n onChangeOverlap: PropTypes.func,\r\n};\r\n\r\nexport default GridAnnotationTool;\r\n","import React from \"react\";\r\n\r\nimport { RegionROI } from \"../../utils/ROI\";\r\nimport { isInside } from \"../../utils/PolygonUtil\";\r\nimport RBush from \"rbush\";\r\n\r\nimport {\r\n Tooltip,\r\n IconButton,\r\n Typography,\r\n TextField,\r\n Button,\r\n FormControlLabel,\r\n Checkbox,\r\n} from \"@mui/material\";\r\n\r\nimport Tool from \"./Tool\";\r\n\r\nconst styles = {\r\n inputElement: {\r\n marginBottom: 8,\r\n },\r\n h6_small: {\r\n fontSize: \"18px\",\r\n marginTop: \"8px\",\r\n },\r\n gridButton: {\r\n marginBottom: \"20px\",\r\n },\r\n girdIconText: { fontSize: 18, fontWeight: \"bold\" },\r\n};\r\n\r\nclass GridTool extends Tool {\r\n name = \"GridTool\";\r\n tileWidth = 0;\r\n tileHeight = 0;\r\n tilesToGenerate = 10;\r\n showGridPreview = true;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n if (\r\n this.ome.physicalSizeX &&\r\n this.ome.physicalSizeX !== 0 &&\r\n this.ome.physicalSizeX !== 1\r\n ) {\r\n this.sizeUnit = obj.ome.physicalSizeXUnit;\r\n this.pixelSize = obj.ome.physicalSizeX * 1000000;\r\n } else {\r\n this.sizeUnit = \"px\";\r\n this.pixelSize = 1;\r\n }\r\n\r\n if (this.tileWidth === 0 || this.tileHeight === 0) {\r\n this.tileWidth = parseInt(this.ome.sizeX / 20, 10);\r\n this.tileHeight = parseInt(this.ome.sizeY / 20, 10);\r\n }\r\n\r\n this.structures = obj.structures;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.allRoiLayers = obj.allRoiLayers;\r\n this.project = obj.viewerConfig_project;\r\n this.projectNoViewConfig = obj.project;\r\n this.isHistoClassification = this.projectNoViewConfig.type.includes(\r\n \"HistoClassification\"\r\n );\r\n this.isHistoPointCounting =\r\n this.projectNoViewConfig.type.includes(\"HistoPointCounting\");\r\n }\r\n\r\n findChilds = (subType) => {\r\n return this.structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id\r\n );\r\n };\r\n\r\n // draw preview grid\r\n drawCustomCursor(ctx) {\r\n if (!this.showGridPreview) return;\r\n const pixelWidth = 1 / ctx.getTransform().a;\r\n const tileWidth = this.tileWidth;\r\n const tileHeight = this.tileHeight;\r\n\r\n if (tileWidth < pixelWidth * 3 || tileHeight < pixelWidth * 3) return;\r\n ctx.beginPath();\r\n ctx.strokeStyle = \"rgba(0,0,0,0.5)\";\r\n ctx.lineWidth = pixelWidth;\r\n for (let x = 0; x < this.ome.sizeX; x += tileWidth) {\r\n ctx.moveTo(x, 0);\r\n ctx.lineTo(x, this.ome.sizeY);\r\n }\r\n for (let y = 0; y < this.ome.sizeY; y += tileHeight) {\r\n ctx.moveTo(0, y);\r\n ctx.lineTo(this.ome.sizeX, y);\r\n }\r\n ctx.stroke();\r\n }\r\n\r\n isInsideBaseROI = (regionRoi) => {\r\n let baseRois = this.roiLayers[0].tree\r\n .search(regionRoi.treeItem)\r\n .map((item) => item.roi);\r\n if (baseRois.length === 0) return false;\r\n for (const baseRoi of baseRois) {\r\n if (isInside(regionRoi, baseRoi)) return true;\r\n }\r\n return false;\r\n };\r\n\r\n // create this.tilesToGenerate random tiles on the grid with the size of this.tileWidth and this.tileHeight\r\n createRandomTiles = () => {\r\n const historyItem = [];\r\n const histId = this.structures[this.selectedLayer].id;\r\n\r\n const isSubtype =\r\n this.structures[this.selectedLayer].isSubtype &&\r\n this.structures[this.selectedLayer].classificationSubtype;\r\n const structureName = isSubtype\r\n ? this.structures[this.selectedLayer].label\r\n : \"\";\r\n const color = this.structures[this.selectedLayer].color;\r\n\r\n // Create a list of all possible tile positions\r\n let positions = [];\r\n for (let x = 0; x < this.ome.sizeX - this.tileWidth; x += this.tileWidth) {\r\n for (\r\n let y = 0;\r\n y < this.ome.sizeY - this.tileHeight;\r\n y += this.tileHeight\r\n ) {\r\n positions.push([x, y]);\r\n }\r\n }\r\n\r\n // Shuffle the positions array\r\n for (let i = positions.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [positions[i], positions[j]] = [positions[j], positions[i]];\r\n }\r\n\r\n // Clear old tiles\r\n for (let roi of this.layer.regionRois) {\r\n historyItem.push({ add: false, id: histId, roi: roi });\r\n }\r\n this.roiLayers[this.selectedLayer].layer.regionRois = [];\r\n this.roiLayers[this.selectedLayer].tree = new RBush();\r\n\r\n let foundTiles = 0;\r\n // Create new tiles\r\n for (\r\n let i = 0;\r\n foundTiles < this.tilesToGenerate && i < positions.length;\r\n i++\r\n ) {\r\n let regions = [];\r\n let c_1 = positions[i];\r\n regions.push(c_1);\r\n let c_2 = [c_1[0] + this.tileWidth, c_1[1]];\r\n regions.push(c_2);\r\n let c_3 = [c_1[0] + this.tileWidth, c_1[1] + this.tileHeight];\r\n regions.push(c_3);\r\n let c_4 = [c_1[0], c_1[1] + this.tileHeight];\r\n regions.push(c_4);\r\n let roi = new RegionROI({\r\n regions: regions,\r\n color1: color,\r\n subtype: isSubtype,\r\n name: structureName,\r\n structureId: this.structures[this.selectedLayer].id,\r\n });\r\n let isValidTile = true;\r\n if (this.selectedLayer > 0) {\r\n isValidTile = this.isInsideBaseROI(roi);\r\n }\r\n if (isValidTile) {\r\n foundTiles++;\r\n this.roiLayers[this.selectedLayer].layer.regionRois.push(roi);\r\n this.roiLayers[this.selectedLayer].tree.insert(roi.treeItem);\r\n historyItem.push({ add: true, id: histId, roi: roi });\r\n }\r\n\r\n if (i === positions.length - 1) {\r\n window.showWarningSnackbar(\r\n \"All possible \" + foundTiles + \" tiles set!\"\r\n );\r\n }\r\n }\r\n window.projectHistory.add(historyItem);\r\n };\r\n\r\n createGrid = (x, noGridForChilds, fromFileChange) => {\r\n const historyItem = [];\r\n const histId = this.structures[this.selectedLayer].id;\r\n if (typeof this.projectNoViewConfig === \"undefined\") return;\r\n // if Tobacco Analysis set BaseRoi over hole scene if not set yet\r\n if (\r\n this.projectNoViewConfig.type.includes(\"TobaccoAnalysis\") ||\r\n this.projectNoViewConfig.type.includes(\"BrainIpsc\")\r\n ) {\r\n this.selectedLayer = 0;\r\n if (this.roiLayers[this.selectedLayer].layer.regionRois.length !== 0) {\r\n return;\r\n }\r\n }\r\n // if fileChange and grid already exists in this file do not draw new grid\r\n if (\r\n fromFileChange &&\r\n this.roiLayers[this.selectedLayer].layer.regionRois.length !== 0\r\n ) {\r\n return;\r\n }\r\n // make all tiles\r\n let regions = [];\r\n let tileWidth = this.ome.sizeX / x;\r\n let tileHeight = this.ome.sizeY / x;\r\n\r\n // make tiles for each structure\r\n let lenChilds = this.findChilds(this.structures[this.selectedLayer]).length;\r\n if (noGridForChilds) {\r\n lenChilds = 0;\r\n }\r\n\r\n // check if new gridSize\r\n let tiles = this.roiLayers[this.selectedLayer].layer.regionRois.length;\r\n let numberTilesNewGrid = x * x;\r\n let newGridSize = tiles !== numberTilesNewGrid && tiles !== 0;\r\n\r\n for (\r\n let str = this.selectedLayer;\r\n str <= this.selectedLayer + lenChilds;\r\n str++\r\n ) {\r\n // reset structure if new grid with different grid size\r\n if (newGridSize) {\r\n this.resetStructure(str);\r\n }\r\n\r\n // delete all rois\r\n for (let roi of this.roiLayers[str].layer.regionRois) {\r\n historyItem.push({ add: false, id: histId, roi: roi });\r\n }\r\n this.roiLayers[str].layer.regionRois = [];\r\n this.roiLayers[str].tree = new RBush();\r\n\r\n // make x*x tiles\r\n for (let i = 0; i < x * x; i++) {\r\n regions = [];\r\n // make four corners of tile\r\n let c_1 = [(i % x) * tileWidth, Math.floor(i / x) * tileHeight];\r\n regions.push(c_1);\r\n let c_2 = [((i % x) + 1) * tileWidth, Math.floor(i / x) * tileHeight];\r\n regions.push(c_2);\r\n let c_3 = [\r\n ((i % x) + 1) * tileWidth,\r\n (Math.floor(i / x) + 1) * tileHeight,\r\n ];\r\n regions.push(c_3);\r\n let c_4 = [(i % x) * tileWidth, (Math.floor(i / x) + 1) * tileHeight];\r\n regions.push(c_4);\r\n let roi = new RegionROI({ regions: [regions] });\r\n historyItem.push({ add: true, id: histId, roi: roi });\r\n this.roiLayers[str].layer.regionRois.push(roi);\r\n this.roiLayers[str].tree.insert(roi.treeItem);\r\n }\r\n }\r\n window.setGridSize(x);\r\n window.projectHistory.add(historyItem);\r\n if (this.showGridPreview) {\r\n this.showGridPreview = false;\r\n window.forceSidebarUpdate();\r\n }\r\n };\r\n\r\n resetStructure = (str) => {\r\n // reset properties of structure\r\n this.structures[str].avgClassFrequency = 0;\r\n for (const key of Object.keys(this.structures[str].classFrequencies)) {\r\n this.structures[str].classFrequencies[key] = 0;\r\n }\r\n };\r\n\r\n create1mmGrid = () => {};\r\n\r\n exit() {}\r\n\r\n renderConfiguration = () => {\r\n return (\r\n
    \r\n {this.name}:\r\n {!this.isHistoClassification && !this.isHistoPointCounting &&(\r\n <>\r\n \r\n Add random grid tiles:\r\n \r\n {\r\n this.showGridPreview = e.currentTarget.checked;\r\n window.forceSidebarUpdate();\r\n }}\r\n />\r\n }\r\n label=\"Show grid preview\"\r\n />\r\n {\r\n this.tileWidth = Math.round(\r\n parseFloat(e.target.value, 10) / this.pixelSize\r\n );\r\n window.forceSidebarUpdate();\r\n }}\r\n inputProps={{\r\n step: this.pixelSize,\r\n }}\r\n fullWidth\r\n style={styles.inputElement}\r\n />\r\n {\r\n this.tileHeight = Math.round(\r\n parseFloat(e.target.value, 10) / this.pixelSize\r\n );\r\n window.forceSidebarUpdate();\r\n }}\r\n inputProps={{\r\n step: this.pixelSize,\r\n }}\r\n fullWidth\r\n style={styles.inputElement}\r\n />\r\n {\r\n this.tilesToGenerate = parseInt(e.target.value, 10);\r\n window.forceSidebarUpdate();\r\n }}\r\n style={styles.inputElement}\r\n />\r\n this.createRandomTiles()}\r\n >\r\n Set {this.tilesToGenerate} random tiles\r\n \r\n \r\n )}\r\n \r\n Create grid:\r\n \r\n\r\n {!this.isHistoClassification && !this.isHistoPointCounting && (\r\n
    \r\n \r\n this.createGrid(2, true)}\r\n size=\"large\"\r\n >\r\n
    2x2
    \r\n \r\n
    \r\n\r\n \r\n this.createGrid(5, true)}\r\n size=\"large\"\r\n >\r\n
    5x5
    \r\n \r\n
    \r\n\r\n \r\n this.createGrid(20, true)}\r\n size=\"large\"\r\n >\r\n
    20x20
    \r\n \r\n
    \r\n
    \r\n )}\r\n\r\n {this.isHistoClassification && (\r\n \r\n this.createGrid(1)} size=\"large\">\r\n
    (1x1)
    \r\n
    \r\n
    \r\n )}\r\n\r\n {this.isHistoClassification && (\r\n \r\n this.createGrid(2)} size=\"large\">\r\n
    1:10 (2x2)
    \r\n
    \r\n
    \r\n )}\r\n\r\n {this.isHistoClassification && (\r\n \r\n this.createGrid(5)} size=\"large\">\r\n
    1:4 (5x5)
    \r\n
    \r\n
    \r\n )}\r\n\r\n {this.isHistoPointCounting && (\r\n \r\n this.createGrid(20, true)}\r\n size=\"large\"\r\n >\r\n
    20 x 20
    \r\n \r\n
    \r\n )}\r\n
    \r\n );\r\n };\r\n}\r\n\r\nexport default GridTool;\r\n","import { findSameLayer } from \"../../utils/PolygonUtil\";\r\nimport { Typography, FormControl, FormLabel, Slider } from \"@mui/material\";\r\nimport Tool from \"./Tool\";\r\nimport React from \"react\";\r\nimport KDBush from \"kdbush\";\r\n\r\nclass HeatmapTool extends Tool {\r\n toolName = \"Heatmap Tool\";\r\n noConfig = false;\r\n removeOverlap = null;\r\n removeOverlapSame = null;\r\n tempRemoveOverlap = null;\r\n tempRemoveOverlapSame = null;\r\n threshold = 30;\r\n init = false;\r\n maxValue = 1;\r\n searchRadius = 20;\r\n labels = [];\r\n prevSelectedLayer = 0;\r\n rois = [];\r\n activeGrid = 0;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.isBrightfield = obj.ome.channels[0].type === \"brightfield\";\r\n this.ctx = obj.ctx; //context\r\n this.canvas = obj.ctx.canvas; //canvas\r\n this.canvasWidth = this.canvas.width;\r\n this.canvasHeight = this.canvas.height;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedLayer = layerResults[0];\r\n this.parentLayer = layerResults[1];\r\n this.originalSelectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n\r\n this.fileId = obj.fileId;\r\n this.rendererDict = obj.rendererDict;\r\n this.rendererRef = this.rendererDict[this.fileId];\r\n\r\n const project = obj.viewerConfig_project;\r\n if (this.removeOverlap === null) {\r\n this.removeOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.tempRemoveOverlap === null) {\r\n this.tempRemoveOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.removeOverlapSame === null) {\r\n this.removeOverlapSame = project.projectProperties[\"PreventOverlapSame\"];\r\n }\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.tempRemoveOverlapSame = this.removeOverlapSame;\r\n this.removeOverlap = false;\r\n this.removeOverlapSame = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n this.removeOverlapSame = this.tempRemoveOverlapSame;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n\r\n this.initTool();\r\n }\r\n\r\n initTool = () => {\r\n if (!this.init) {\r\n this.visibilityState = [];\r\n for (let s of this.structures) {\r\n this.visibilityState.push({\r\n id: s.id,\r\n visible: s.visible,\r\n });\r\n s.visible = false;\r\n }\r\n this.init = true;\r\n }\r\n };\r\n\r\n getPointInCanvas = (point) => {\r\n let pt = {\r\n x: Math.round(\r\n point.center.x * this.ctx.getTransform().a + this.ctx.getTransform().e\r\n ),\r\n y: Math.round(\r\n point.center.y * this.ctx.getTransform().d + this.ctx.getTransform().f\r\n ),\r\n };\r\n return pt;\r\n };\r\n\r\n getSubtypeLabels = (idx) => {\r\n if (!this.labels.includes(this.structures[idx].label)) {\r\n if (\r\n this.structures[idx].parentId === 0 ||\r\n !this.structures[idx].classificationSubtype\r\n ) {\r\n this.labels.push(\"\");\r\n } else {\r\n this.labels.push(this.structures[idx].label);\r\n }\r\n }\r\n if (this.structures[idx].hasChild) {\r\n let structs = this.structures.filter(\r\n (s) => this.structures[idx].id === s.parentId\r\n );\r\n for (let s of structs) {\r\n let index = this.structures.indexOf(s);\r\n if (index > -1) this.getSubtypeLabels(index);\r\n }\r\n }\r\n };\r\n\r\n getRois = () => {\r\n if (this.originalSelectedLayer !== 0) {\r\n if (this.prevSelectedLayer !== this.originalSelectedLayer) {\r\n this.rois = [];\r\n this.prevSelectedLayer = this.originalSelectedLayer;\r\n this.labels = [];\r\n let id = this.roiLayers[this.originalSelectedLayer].id;\r\n let idx = this.structures.findIndex((s) => s.id === id);\r\n this.getSubtypeLabels(idx);\r\n let rois = this.roiLayers[this.selectedLayer].layer.regionRois;\r\n if (rois.length > 0) {\r\n this.rois = rois.filter((roi) =>\r\n this.labels.includes(roi.subtypeName)\r\n );\r\n }\r\n }\r\n }\r\n };\r\n\r\n checkRTree = () => {\r\n this.getRois();\r\n if (!this.rtree) {\r\n this.rtree = new KDBush([]);\r\n }\r\n if (this.rtree && this.rtree.points.length !== this.rois.length) {\r\n this.treePoints = [];\r\n for (let point of this.rois) {\r\n this.treePoints.push([point.center.x, point.center.y]);\r\n }\r\n this.rtree = new KDBush(this.treePoints);\r\n }\r\n };\r\n\r\n worldToCanvas = (x, y) => {\r\n let pt = {\r\n x: Math.round(x * this.ctx.getTransform().a + this.ctx.getTransform().e),\r\n y: Math.round(y * this.ctx.getTransform().d + this.ctx.getTransform().f),\r\n };\r\n return pt;\r\n };\r\n\r\n yToWorld = (y) => {\r\n let p1 = this.rendererRef.getPointInCanvas({\r\n x: 0,\r\n y: y,\r\n });\r\n let p2 = this.rendererRef.getPointInCanvas({ x: 0, y: 0 });\r\n let p3 = this.rendererRef.getPosition();\r\n p1.y += p2.y - p3.y / this.rendererRef.getScale();\r\n return p1.y;\r\n };\r\n\r\n xToWorld = (x) => {\r\n let p1 = this.rendererRef.getPointInCanvas({\r\n x: x,\r\n y: 0,\r\n });\r\n let p2 = this.rendererRef.getPointInCanvas({ x: 0, y: 0 });\r\n let p3 = this.rendererRef.getPosition();\r\n p1.x += p2.x - p3.x / this.rendererRef.getScale();\r\n return p1.x;\r\n };\r\n\r\n worldDistance = (d) => {\r\n let dStart = 0;\r\n let dEnd = Math.abs(d);\r\n dStart = this.xToWorld(dStart);\r\n dEnd = this.xToWorld(dEnd);\r\n return parseInt(Math.abs(dEnd - dStart));\r\n };\r\n\r\n makeTiles = () => {\r\n let tileSizeX = 20;\r\n let tileSizeY = 20;\r\n let tiles = [];\r\n\r\n for (let x = 0; x < this.canvasWidth; x = x + tileSizeX) {\r\n for (let y = 0; y < this.canvasHeight; y = y + tileSizeY) {\r\n if (\r\n y > this.canvasHeight - tileSizeY &&\r\n x > this.canvasWidth - tileSizeX\r\n ) {\r\n tiles.push({\r\n TLx: this.xToWorld(x),\r\n TLy: this.yToWorld(y),\r\n BRx: this.xToWorld(this.canvasWidth),\r\n BRy: this.yToWorld(this.canvasHeight),\r\n });\r\n } else if (\r\n y > this.canvasHeight - tileSizeY &&\r\n x < this.canvasWidth - tileSizeX\r\n ) {\r\n tiles.push({\r\n TLx: this.xToWorld(x),\r\n TLy: this.yToWorld(y),\r\n BRx: this.xToWorld(x + tileSizeX),\r\n BRy: this.yToWorld(this.canvasHeight),\r\n });\r\n } else if (\r\n y < this.canvasHeight - tileSizeY &&\r\n x > this.canvasWidth - tileSizeX\r\n ) {\r\n tiles.push({\r\n TLx: this.xToWorld(x),\r\n TLy: this.yToWorld(y),\r\n BRx: this.xToWorld(this.canvasWidth),\r\n BRy: this.yToWorld(y + tileSizeY),\r\n });\r\n } else {\r\n tiles.push({\r\n TLx: this.xToWorld(x),\r\n TLy: this.yToWorld(y),\r\n BRx: this.xToWorld(x + tileSizeX),\r\n BRy: this.yToWorld(y + tileSizeY),\r\n });\r\n }\r\n }\r\n }\r\n this.searchRadius = tileSizeX;\r\n return tiles;\r\n };\r\n\r\n setHeatmapWithGrid = () => {\r\n let tiles = this.makeTiles();\r\n let results = [];\r\n let gridMaxValue = 0;\r\n\r\n for (let tile of tiles) {\r\n let result = this.rtree\r\n .range(tile.TLx, tile.TLy, tile.BRx, tile.BRy)\r\n .map((id) => this.treePoints[id]);\r\n if (result.length > gridMaxValue) gridMaxValue = result.length;\r\n if (result.length > 0) {\r\n let avgX = 0;\r\n let avgY = 0;\r\n for (let point of result) {\r\n avgX += point[0];\r\n avgY += point[1];\r\n }\r\n avgX = parseInt(avgX / result.length);\r\n avgY = parseInt(avgY / result.length);\r\n let center = this.worldToCanvas(avgX, avgY);\r\n results.push({\r\n x: center.x,\r\n y: center.y,\r\n value: result.length,\r\n radius: this.threshold, // this.rendererRef.getScale();,\r\n });\r\n }\r\n }\r\n this.maxValue = gridMaxValue * parseInt(this.threshold / 12);\r\n this.rendererRef.setHeatmapData(results, gridMaxValue);\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n setHeatmapWithoutGrid = (res) => {\r\n let data = res;\r\n let noGridMaxValue = 0;\r\n let searchRadius = this.threshold; /// this.rendererRef.getScale();\r\n this.searchRadius = parseInt(searchRadius);\r\n let results = [];\r\n for (let i = 0; i < data.length; i++) {\r\n const result = this.rtree\r\n .within(data[i][0], data[i][1], searchRadius)\r\n .map((id) => this.treePoints[id]);\r\n let center = this.worldToCanvas(data[i][0], data[i][1]);\r\n\r\n results.push({\r\n x: center.x,\r\n y: center.y,\r\n value: result.length,\r\n radius: this.threshold * this.rendererRef.getScale(),\r\n });\r\n if (result.length > noGridMaxValue) noGridMaxValue = result.length;\r\n }\r\n this.maxValue = noGridMaxValue;\r\n this.rendererRef.setHeatmapData(results, noGridMaxValue);\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n checkVisibleObjects = () => {\r\n this.checkRTree();\r\n let TLx = this.xToWorld(0);\r\n let TLy = this.yToWorld(0);\r\n let BRx = this.xToWorld(this.canvasWidth);\r\n let BRy = this.yToWorld(this.canvasHeight);\r\n let result = this.rtree\r\n .range(TLx, TLy, BRx, BRy)\r\n .map((id) => this.treePoints[id]);\r\n return result;\r\n };\r\n\r\n drawCustomCursor(ctx, mousePosition) {\r\n this.mousePosition = mousePosition;\r\n if (ctx) {\r\n let result = this.checkVisibleObjects();\r\n let visiblePoints = 2500;\r\n if (result.length > 0 && result.length < visiblePoints) {\r\n this.activeGrid = 0;\r\n this.setHeatmapWithoutGrid(result);\r\n } else if (result.length > 0 && result.length > visiblePoints) {\r\n this.activeGrid = 1;\r\n this.setHeatmapWithGrid();\r\n } else if (result.length === 0) {\r\n this.rendererRef.setHeatmapData([], 100);\r\n }\r\n }\r\n }\r\n\r\n exit() {\r\n for (let s of this.visibilityState) {\r\n let i = this.structures.findIndex((item) => item.id === s.id);\r\n this.structures[i].visible = s.visible;\r\n }\r\n this.init = false;\r\n this.rois = [];\r\n this.prevSelectedLayer = 0;\r\n }\r\n\r\n renderConfiguration() {\r\n const pxlValue =\r\n this.activeGrid === 0\r\n ? this.searchRadius\r\n : this.worldDistance(this.threshold);\r\n return (\r\n
    \r\n {/* canvas for debugging */}\r\n {/* */}\r\n {this.toolName}:\r\n \r\n {this.maxValue}\r\n
    \r\n \r\n 1\r\n \r\n \r\n
    \r\n Objects within {pxlValue}px\r\n
    \r\n \r\n \r\n {\"Color Distribution Radius: \" + pxlValue + \"px\"}\r\n \r\n {\r\n this.threshold = v;\r\n window.forceSidebarUpdate();\r\n }}\r\n onChangeCommitted={() => {\r\n this.updateDrawing();\r\n }}\r\n />\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default HeatmapTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport {\r\n Grid,\r\n Button,\r\n FormControl,\r\n TextField,\r\n FormHelperText,\r\n Select,\r\n InputLabel,\r\n MenuItem,\r\n Checkbox,\r\n FormControlLabel,\r\n Slider,\r\n Tooltip,\r\n LinearProgress,\r\n Typography,\r\n IconButton,\r\n} from \"@mui/material\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport Backend from \"../../../common/utils/Backend\";\r\nimport { withSpinloader } from \"../../../common/components/Spinloader\";\r\nimport { RegionROI, createRoisFromAnno } from \"../../utils/ROI\";\r\nimport MuiAccordion from \"@mui/material/Accordion\";\r\nimport MuiAccordionSummary from \"@mui/material/AccordionSummary\";\r\nimport MuiAccordionDetails from \"@mui/material/AccordionDetails\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\nimport {\r\n generateParentList,\r\n getParentIndexLayer,\r\n} from \"../../utils/StructuresUtils\";\r\nimport SettingsBackupRestoreIcon from \"@mui/icons-material/SettingsBackupRestore\";\r\n\r\nimport Tool from \"./Tool\";\r\n\r\nconst Accordion = withStyles({\r\n root: {\r\n border: \"1px solid rgba(0, 0, 0, .125)\",\r\n boxShadow: \"none\",\r\n \"&:not(:last-child)\": {\r\n borderBottom: 0,\r\n },\r\n \"&:before\": {\r\n display: \"none\",\r\n },\r\n \"&$expanded\": {\r\n margin: \"auto\",\r\n },\r\n },\r\n expanded: {},\r\n})(MuiAccordion);\r\n\r\nconst AccordionSummary = withStyles({\r\n root: {\r\n overflow: \"hidden\",\r\n backgroundColor: \"rgba(0, 0, 0, .03)\",\r\n borderBottom: \"1px solid rgba(0, 0, 0, .125)\",\r\n minHeight: 56,\r\n \"&$expanded\": {\r\n minHeight: 56,\r\n },\r\n },\r\n content: {\r\n \"&$expanded\": {\r\n margin: \"12px 0\",\r\n },\r\n },\r\n expanded: {},\r\n})(MuiAccordionSummary);\r\n\r\nconst AccordionDetails = withStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(2),\r\n },\r\n}))(MuiAccordionDetails);\r\n\r\n/**\r\n * Counts number of decimals of a number\r\n * @param {Number} x\r\n */\r\nfunction countDecimals(x) {\r\n if (Math.floor(x.valueOf()) === x.valueOf()) return 0;\r\n return x.toString().split(\".\")[1].length || 0;\r\n}\r\n\r\nconst styles = {\r\n input: {\r\n width: 55,\r\n },\r\n};\r\n\r\nclass InstantAnalysisTool extends Tool {\r\n constructor(toolConfig, viewer) {\r\n super();\r\n this.toolConfig = toolConfig;\r\n this.name = toolConfig.tooltip;\r\n this.state = {\r\n preview: toolConfig.preview,\r\n prevW: 512,\r\n prevH: 512,\r\n showDownloadProgress: false,\r\n modelDownloadProgress: false,\r\n };\r\n this.viewer = viewer;\r\n }\r\n\r\n /**\r\n * Update File Specific information\r\n * @param {Object} layer\r\n * @param {Object} ome\r\n * @param {String} fileId\r\n * @param {String} projectId\r\n * @param {Object[]} roiLayers\r\n */\r\n setLayer(obj) {\r\n this.id = obj.fileId;\r\n this.layer = obj.layer;\r\n this.ome = obj.ome;\r\n this.pixelLengthX = obj.ome.physicalSizeX * Math.pow(10, 6); //pixel x length in µm\r\n this.pixelLengthY = obj.ome.physicalSizeY * Math.pow(10, 6);\r\n this.pixelArea = this.pixelLengthX * this.pixelLengthY; //pixel area in µm\r\n this.isBrightfield = obj.ome.channels[0].type === \"brightfield\";\r\n this.projectId = obj.projectId;\r\n this.roiLayers = obj.roiLayers;\r\n this.structures = obj.structures;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.updateProject = obj.updateProject;\r\n this.updateFileClasses = obj.updateFileClasses;\r\n this.ctx = obj.ctx;\r\n this.histogramConfig = obj.histogramConfig;\r\n\r\n if (obj.structures[obj.selectedLayer]) {\r\n this.toolLayerConfig = obj.structures[obj.selectedLayer].tools.find(\r\n (c) => c.name === this.toolConfig.name\r\n );\r\n }\r\n\r\n if (typeof this.toolLayerConfig !== \"undefined\") {\r\n Object.assign(this.state, this.toolLayerConfig.parameters);\r\n }\r\n }\r\n\r\n /**\r\n * Update Preview Area (e.g. on move)\r\n * @param {Number} x\r\n * @param {Number} y\r\n * @param {Number} w\r\n * @param {Number} h\r\n */\r\n setPreviewRect(x, y) {\r\n this.previewRect = {\r\n x: x - this.state.prevW / 2,\r\n y: y - this.state.prevH / 2,\r\n w: this.state.prevW,\r\n h: this.state.prevH,\r\n };\r\n }\r\n\r\n setPreviewSize(w, h) {\r\n let newState = {\r\n prevW: w,\r\n prevH: h,\r\n };\r\n Object.assign(this.state, newState);\r\n }\r\n\r\n updateTrainingProgress = (line) => {\r\n if (line.includes(\"Downloading model from:\")) {\r\n this.state.modelDownloadProgress = 0;\r\n this.state.showDownloadProgress = true;\r\n } else if (line.includes(\"[DownloadProgress]\")) {\r\n // Extract progress number\r\n this.state.modelDownloadProgress = line\r\n .split(\"[DownloadProgress]\")[1]\r\n .split(\"%\")[0];\r\n } else if (line.includes(\"Download complete\")) {\r\n this.state.showDownloadProgress = false;\r\n }\r\n };\r\n\r\n mouse() {}\r\n\r\n /**\r\n * Calculates the parent structure, grandparent if selection is subtype\r\n * @param {number} selectedLayer\r\n * @param {object} structures\r\n */\r\n findOuterParentIdx(selectedLayer, structures) {\r\n let selectedStructure = structures[selectedLayer];\r\n while (\r\n selectedStructure.classificationSubtype &&\r\n selectedStructure.parentId !== 0\r\n ) {\r\n selectedStructure = this.findParentStructure(\r\n structures,\r\n selectedStructure\r\n );\r\n }\r\n return structures.findIndex((s) => s.id === selectedStructure.parentId);\r\n }\r\n\r\n findParentStructure(structures, selectedStructure) {\r\n return structures.find((s) => s.id === selectedStructure.parentId);\r\n }\r\n\r\n /**\r\n * Calculates Instant analysis on a smaller preview area\r\n * @param {Component} component\r\n */\r\n calcPreview(component) {\r\n // add viewer values to parameter to use in tool iams\r\n component.props.state.z = this.viewer.state.z; //self.config.Parameters[\"z\"]\r\n component.props.state.t = this.viewer.state.t; //self.config.Parameters[\"t\"]\r\n component.props.state.selectedLayer = component.props.selectedLayer; //self.config.Parameters[\"selectedLayer\"]\r\n\r\n let fileClassification =\r\n this.viewer.state.viewerConfig.project.projectStringProperties[\r\n \"ViewerType\"\r\n ] == \"Gallery\";\r\n\r\n // Check for presence of BaseROI\r\n if (\r\n component.props.selectedLayer > 0 &&\r\n this.roiLayers[0].layer.regionRois.length === 0 &&\r\n !fileClassification\r\n ) {\r\n window.showWarningSnackbar(\"No Base ROI set!\");\r\n return;\r\n }\r\n\r\n // warning if channel is not selected and also aborting analysis\r\n if (\r\n component.props.state.toolParams &&\r\n component.props.state.channel &&\r\n component.props.state.channel < 0\r\n ) {\r\n window.showWarningSnackbar(\"No channel selected!\");\r\n return;\r\n }\r\n\r\n // Check for missing preview rectangle\r\n if (typeof this.previewRect === \"undefined\" && !fileClassification) return;\r\n\r\n // get outerParentIndex (for classification models use other function)\r\n let formDataAICockpit = this.viewer.state.formDataAICockpit;\r\n let selLayerStructureId =\r\n component.props.structures[component.props.selectedLayer].id;\r\n\r\n let modelName = null;\r\n let modelType = null;\r\n if (formDataAICockpit !== null) {\r\n modelName = formDataAICockpit[selLayerStructureId]\r\n ? formDataAICockpit[selLayerStructureId].selectedModel\r\n : null;\r\n\r\n modelType =\r\n modelName && formDataAICockpit[selLayerStructureId].models[modelName]\r\n ? formDataAICockpit[selLayerStructureId].models[modelName].modelType\r\n : null;\r\n }\r\n\r\n const outerParentidx =\r\n modelType === \"classification\"\r\n ? getParentIndexLayer(\r\n component.props.structures[component.props.selectedLayer],\r\n component.props.structures\r\n )\r\n : this.findOuterParentIdx(\r\n component.props.selectedLayer,\r\n component.props.structures\r\n );\r\n\r\n let stateObject = this.state;\r\n stateObject[\"parentIdx\"] = outerParentidx;\r\n\r\n let start = new Date().getTime();\r\n\r\n component.props.spinloader.showWithTimeout(1, 10);\r\n\r\n let layersToSave = [0];\r\n if (outerParentidx > 0) {\r\n layersToSave.push(outerParentidx);\r\n }\r\n\r\n if (this.state.depending_structure) {\r\n if (!layersToSave.includes(this.state.depending_structure))\r\n layersToSave.push(this.state.depending_structure);\r\n }\r\n if (this.state.depending_channel) {\r\n layersToSave.push(this.state.depending_channel);\r\n } else {\r\n for (let parameter of this.toolConfig.parameters) {\r\n if (parameter.name === \"required_structures\") {\r\n let required_structures = parameter.ui.default;\r\n if (Array.isArray(required_structures)) {\r\n for (let required_struture of required_structures) {\r\n if (!layersToSave.includes(required_struture)) {\r\n layersToSave.push(required_struture);\r\n }\r\n }\r\n } else {\r\n layersToSave.push(parameter.ui.default);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n if (this.state.depending_structure === -1) {\r\n layersToSave = \"all\";\r\n }\r\n\r\n let previewRect = {};\r\n if (!fileClassification) {\r\n previewRect = {\r\n x: Math.floor(this.previewRect.x),\r\n y: Math.floor(this.previewRect.y),\r\n w: Math.floor(this.previewRect.w),\r\n h: Math.floor(this.previewRect.h),\r\n };\r\n }\r\n\r\n // Check if the preview rectangle is inside a valid parent region.\r\n if (outerParentidx > 0 && !fileClassification) {\r\n let treeItems = this.roiLayers[outerParentidx].tree.search({\r\n minX: previewRect.x,\r\n minY: previewRect.y,\r\n maxX: previewRect.x + previewRect.w,\r\n maxY: previewRect.y + previewRect.h,\r\n });\r\n if (treeItems.length === 0) {\r\n window.showWarningSnackbar(\r\n \"No parent structures overlapping preview rectangle!\"\r\n );\r\n component.props.spinloader.hide();\r\n return;\r\n }\r\n }\r\n\r\n // In case of multilayered image, set z-Layer\r\n if (!fileClassification && this.viewer.rendererdict[this.id].state.z) {\r\n stateObject.z = this.viewer.rendererdict[this.id].state.z;\r\n }\r\n\r\n // In case of video, set time\r\n if (!fileClassification && this.viewer.rendererdict[this.id].state.t) {\r\n stateObject.t = this.viewer.rendererdict[this.id].state.t;\r\n }\r\n\r\n // Data sent to Backend request\r\n const data = {\r\n name: this.toolConfig.name,\r\n projectId: this.projectId,\r\n fileIds: [this.id],\r\n parameters: stateObject,\r\n preview: true,\r\n rect: previewRect,\r\n project: this.viewer.createProjectModel(layersToSave, previewRect),\r\n };\r\n\r\n // ALMs\r\n if (this.toolConfig.name.includes(\"alm_\")) {\r\n Backend.activeLearningSignalR(\r\n data,\r\n () => {\r\n component.props.spinloader.hide();\r\n },\r\n (error) => {\r\n component.props.spinloader.hide();\r\n window.openErrorDialog(error);\r\n }\r\n );\r\n }\r\n\r\n // IAMS\r\n else {\r\n const selectedLayer = this.selectedLayer;\r\n\r\n // Get the layer where the annotations are saved\r\n const parentlist = generateParentList(this.structures);\r\n\r\n // Send Backend request\r\n Backend.instantAnalysisSignalR(\r\n data,\r\n component.props.spinloader,\r\n (project) => {\r\n // this.updateProject(project);\r\n // update last used tool for the structure\r\n this.structures[this.selectedLayer].selectedToolName =\r\n this.toolConfig.name;\r\n\r\n // Iterate through all annotations of the currently open file/scene\r\n for (let anno of project.files.find((c) => c.id === this.id)\r\n .annotations) {\r\n // Get index of currently selected structure/subtype\r\n // NOTE: .id in annotations is named wrong. It's supposed to be names .index >:(\r\n const layerIndex = anno.id === -1 ? selectedLayer : anno.id;\r\n\r\n // Skip Base ROI\r\n if (layerIndex === 0) {\r\n continue;\r\n }\r\n\r\n // Get id of structure, where the current annotations are saved\r\n const annotationSaveStructureId =\r\n parentlist[layerIndex][parentlist[layerIndex].length - 1].id;\r\n\r\n // Get index of said structure in all structures\r\n const annotationSaveStructureIndex = this.roiLayers.findIndex(\r\n (roiLayer) => roiLayer.id === annotationSaveStructureId\r\n );\r\n\r\n if (anno.geoJSON === null) anno.geoJSON = { coordinates: [] };\r\n let newRois = createRoisFromAnno(anno);\r\n\r\n // Find and remove all items currently present inside the preview area.\r\n if (\r\n \"x\" in previewRect &&\r\n // Check if there are any old annotations present.\r\n this.roiLayers[annotationSaveStructureIndex].tree.collides({\r\n minX: previewRect.x,\r\n minY: previewRect.y,\r\n maxX: previewRect.x + previewRect.w,\r\n maxY: previewRect.y + previewRect.h,\r\n })\r\n ) {\r\n // Then find all items in the area.\r\n let itemsToRemove = this.roiLayers[\r\n annotationSaveStructureIndex\r\n ].tree.search({\r\n minX: previewRect.x,\r\n minY: previewRect.y,\r\n maxX: previewRect.x + previewRect.w,\r\n maxY: previewRect.y + previewRect.h,\r\n });\r\n // Then remove them.\r\n for (let itemToRemove of itemsToRemove) {\r\n this.roiLayers[annotationSaveStructureIndex].tree.remove(\r\n itemToRemove\r\n );\r\n }\r\n }\r\n\r\n // Add new ROIs to selected structure\r\n for (let roi of newRois) {\r\n this.roiLayers[layerIndex].tree.insert(roi.treeItem);\r\n }\r\n\r\n // Diplay the newly generated ROIs in the layers\r\n this.roiLayers[layerIndex].layer.regionRois = this.roiLayers[\r\n layerIndex\r\n ].tree\r\n .all()\r\n .map((item) => item.roi);\r\n\r\n // Update the saved layer\r\n this.roiLayers[annotationSaveStructureIndex].layer.regionRois =\r\n this.roiLayers[annotationSaveStructureIndex].tree\r\n .all()\r\n .map((item) => item.roi);\r\n }\r\n\r\n // if classification model to classify full files --> assign classIds\r\n if (fileClassification) {\r\n this.updateFileClasses(project);\r\n }\r\n\r\n console.debug(\r\n `IAM Frontend Execution time calcPreview: ${\r\n new Date().getTime() - start\r\n } ms`\r\n );\r\n component.props.spinloader.hide();\r\n },\r\n (error) => {\r\n component.props.spinloader.hide();\r\n window.openErrorDialog(error);\r\n }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Calculates Instant analysis on the full image\r\n * @param {Component} component\r\n * @param {Boolean} applyToAll apply on all images of project?\r\n */\r\n calcFull(component, applyToAll = false) {\r\n component.props.state.z = this.viewer.state.z; //self.config.Parameters[\"z\"]\r\n component.props.state.t = this.viewer.state.t; //self.config.Parameters[\"t\"]\r\n const outerParentidx = this.findOuterParentIdx(\r\n component.props.selectedLayer,\r\n component.props.structures\r\n );\r\n let stateObject = this.state;\r\n stateObject[\"parentIdx\"] = outerParentidx;\r\n let layersToSave = [0, outerParentidx];\r\n if (this.state.depending_channel) {\r\n layersToSave.push(this.state.depending_channel);\r\n }\r\n if (this.state.depending_structure) {\r\n layersToSave.push(this.state.depending_structure);\r\n }\r\n if (this.state.depending_structure === -1) {\r\n layersToSave = \"all\";\r\n }\r\n var start = new Date().getTime();\r\n component.props.spinloader.show();\r\n const project = this.viewer.createProjectModel(layersToSave);\r\n let fileIds = applyToAll\r\n ? project.files\r\n .filter((file) => !file.excludeScene)\r\n .map((file) => file.id)\r\n : [this.id];\r\n\r\n let scenesLeft = fileIds.length;\r\n component.props.spinloader.showWithTimeout(scenesLeft);\r\n\r\n let data = {\r\n name: this.toolConfig.name,\r\n projectId: this.projectId,\r\n fileIds: fileIds,\r\n parameters: this.state,\r\n preview: false,\r\n rect: null,\r\n project: project,\r\n };\r\n\r\n if (this.toolConfig.name.includes(\"alm_\")) {\r\n // save project before classify images\r\n const projectModel = this.viewer.createProjectModel(\"all\");\r\n Backend.saveProject(projectModel, () => {});\r\n Backend.activeLearningSignalR(\r\n data,\r\n (alModel) => {\r\n component.props.spinloader.hide();\r\n this.viewer.getSelectedObjects(alModel);\r\n },\r\n (error) => {\r\n component.props.spinloader.hide();\r\n window.openErrorDialog(error);\r\n }\r\n );\r\n } else {\r\n let selectedLayer = this.selectedLayer;\r\n let resultProject = null;\r\n let callbackFunction = (project, fileId) => {\r\n scenesLeft -= 1;\r\n if (resultProject === null) {\r\n resultProject = project;\r\n } else {\r\n resultProject.files = resultProject.files.map((file) => {\r\n if (file.id === fileId) {\r\n return project.files.find((pFile) => pFile.id === fileId);\r\n } else return file;\r\n });\r\n }\r\n this.updateProject(project, fileId);\r\n\r\n if (fileId === this.id) {\r\n // load annotation layers\r\n for (let anno of project.files.find((c) => c.id === this.id)\r\n .annotations) {\r\n let layerIndex = anno.id === -1 ? selectedLayer : anno.id;\r\n if (anno.geoJSON === null) continue;\r\n anno.geoJSON.coordinates = anno.geoJSON.coordinates.filter(\r\n (coord) => coord.length > 0\r\n );\r\n if (anno.geoJSON.coordinates.length > 0) {\r\n if (\r\n anno.geoJSON.structureId &&\r\n anno.geoJSON.structureId.length > 0\r\n ) {\r\n this.roiLayers[layerIndex].layer.regionRois =\r\n anno.geoJSON.coordinates.map((c, idx) => {\r\n return new RegionROI({\r\n regions: typeof c[0][0][0] === \"number\" ? c : c[0],\r\n tileName:\r\n component.props.toolConfig.name === \"iam_tiler\"\r\n ? this.calcTileName(component, idx)\r\n : null,\r\n structureId: anno.geoJSON.structureId[idx][0],\r\n color1: anno.geoJSON.color1[idx][0],\r\n name: anno.geoJSON.name[idx][0],\r\n subtype: anno.geoJSON.subtype[idx][0],\r\n });\r\n });\r\n } else {\r\n this.roiLayers[layerIndex].layer.regionRois =\r\n anno.geoJSON.coordinates.map((c, idx) => {\r\n return new RegionROI({\r\n regions: typeof c[0][0][0] === \"number\" ? c : c[0],\r\n tileName:\r\n component.props.toolConfig.name === \"iam_tiler\"\r\n ? this.calcTileName(component, idx)\r\n : null,\r\n structureId: this.structures[selectedLayer].id,\r\n });\r\n });\r\n }\r\n\r\n this.roiLayers[layerIndex].tree.clear();\r\n for (let roi of this.roiLayers[layerIndex].layer.regionRois) {\r\n this.roiLayers[layerIndex].tree.insert(roi.treeItem);\r\n }\r\n // }\r\n }\r\n }\r\n }\r\n\r\n console.debug(\r\n `IAM Frontend Execution time calcFull: ${\r\n new Date().getTime() - start\r\n } ms`\r\n );\r\n component.props.spinloader.resetTimer(scenesLeft, 5);\r\n if (scenesLeft > 0) {\r\n this.runAnalysis(\r\n data,\r\n callbackFunction,\r\n fileIds,\r\n fileIds.length - scenesLeft,\r\n component\r\n );\r\n } else {\r\n component.props.spinloader.hide();\r\n }\r\n };\r\n this.runAnalysis(data, callbackFunction, fileIds, 0, component);\r\n }\r\n }\r\n\r\n runAnalysis = (data, callbackFunction, fileIds, idx, component) => {\r\n if (fileIds.length > 1) {\r\n component.props.spinloader.showWithProgress({\r\n message: `Running Analysis ${idx + 1} of ${fileIds.length}`,\r\n progress: (((idx + 1) / fileIds.length) * 100).toFixed(0),\r\n });\r\n } else {\r\n component.props.spinloader.show();\r\n }\r\n const fileId = fileIds[idx];\r\n data.fileIds = [fileId];\r\n Backend.instantAnalysisSignalR(\r\n data,\r\n component.props.spinloader,\r\n (project) => callbackFunction(project, fileId),\r\n (error) => {\r\n if (fileId === this.id) {\r\n component.props.spinloader.hide();\r\n window.openErrorDialog(error);\r\n } else {\r\n window.showWarningSnackbar(\r\n \"Apply Process failed for file: \" +\r\n data.project.files.find((file) => file.id === fileId).fileName\r\n );\r\n }\r\n }\r\n );\r\n };\r\n\r\n calcTileName = (component, idx) => {\r\n let letters = [\r\n \"A\",\r\n \"B\",\r\n \"C\",\r\n \"D\",\r\n \"E\",\r\n \"F\",\r\n \"G\",\r\n \"H\",\r\n \"I\",\r\n \"J\",\r\n \"K\",\r\n \"L\",\r\n \"M\",\r\n \"N\",\r\n \"O\",\r\n \"P\",\r\n \"Q\",\r\n \"R\",\r\n \"S\",\r\n \"T\",\r\n \"U\",\r\n \"V\",\r\n \"W\",\r\n \"X\",\r\n \"Y\",\r\n \"Z\",\r\n ];\r\n\r\n let numberRows = Math.ceil(\r\n component.props.ome.sizeY / component.props.state.size\r\n );\r\n let numberCellsAlphabet = 26 * numberRows;\r\n\r\n let firstLetter = \"\";\r\n if (Math.floor(idx / numberCellsAlphabet) > 0) {\r\n firstLetter = letters[Math.floor(idx / numberCellsAlphabet) - 1];\r\n }\r\n\r\n let secondLetter = \"\";\r\n idx = idx - Math.floor(idx / numberCellsAlphabet) * numberCellsAlphabet;\r\n let lettersIdx = Math.floor(idx / numberRows);\r\n secondLetter = letters[lettersIdx];\r\n let numberTile = idx - lettersIdx * numberRows;\r\n\r\n return firstLetter + secondLetter + String(numberTile + 1);\r\n };\r\n\r\n /**\r\n * Draw a custom cursor\r\n * ctx: canvas context, e.g. circle, rectangle, ...\r\n */\r\n drawCustomCursor(ctx, mousePosition, scale, canvas, center) {\r\n const sizeSliderParams = [\r\n \"area_min\",\r\n \"min_area\",\r\n \"area_max\",\r\n \"max_area\",\r\n \"cell_radius\",\r\n \"min_area_cells\",\r\n \"nuclei_cell_radius_cell_488\",\r\n \"min_area_647\",\r\n \"area_range_555\",\r\n \"lumen_size\",\r\n ];\r\n if (this.state.formControlInUse) {\r\n if (\r\n sizeSliderParams.includes(this.state.formControlInUse) ||\r\n this.state.formControlInUse.includes(\"area_min\")\r\n ) {\r\n let area = this.state[this.state.formControlInUse] / this.pixelArea;\r\n let radius = Math.abs(Math.sqrt(area / Math.PI));\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n ctx.arc(center.x, center.y, radius, 0, 2 * Math.PI);\r\n ctx.stroke();\r\n ctx.closePath();\r\n } else if (this.state.formControlInUse.includes(\"area_range\")) {\r\n for (let range_value of this.state[this.state.formControlInUse]) {\r\n let area = range_value / this.pixelArea;\r\n let radius = Math.abs(Math.sqrt(area / Math.PI));\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n ctx.arc(center.x, center.y, radius, 0, 2 * Math.PI);\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n }\r\n }\r\n }\r\n\r\n onParameterChange = (e) => {\r\n if (typeof e === \"undefined\") return;\r\n Object.assign(this.state, e);\r\n if (this.toolLayerConfig) {\r\n this.toolLayerConfig.parameters = Object.assign(\r\n this.toolLayerConfig.parameters,\r\n e\r\n );\r\n }\r\n };\r\n\r\n resetParameters = () => {\r\n let stateObject = this.configFormRef.state;\r\n for (let parameter of this.configFormRef.props.toolConfig.parameters) {\r\n stateObject[parameter.name] = parameter.ui.default;\r\n }\r\n this.configFormRef.setState(stateObject);\r\n setTimeout(() => {\r\n this.configFormRef.props.onParameterChange(stateObject);\r\n this.configFormRef.props.onApply(this.configFormRef);\r\n }, 10);\r\n };\r\n\r\n exit() {}\r\n\r\n /**\r\n * Renders the Tool Configuration Inputs\r\n */\r\n renderConfiguration() {\r\n return (\r\n
    \r\n
    \r\n \r\n {this.name}\r\n \r\n this.resetParameters()}\r\n >\r\n \r\n \r\n \r\n \r\n
    \r\n\r\n {\r\n return this.state.preview\r\n ? this.calcPreview(component)\r\n : this.calcFull(component);\r\n }}\r\n onApplyAll={(component) => {\r\n return this.calcFull(component, true);\r\n }}\r\n componentRef={(c) => {\r\n this.configFormRef = c;\r\n }}\r\n />\r\n
    \r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Configuration Component to render the parameter inputs dynamically\r\n */\r\nclass ConfigFormRaw extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = props.state;\r\n this.accordionExpanded = false;\r\n if (props.componentRef) props.componentRef(this);\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps) {\r\n this.setState(nextProps.state);\r\n }\r\n\r\n validateParameters = () => {\r\n for (let parameter of this.props.toolConfig.parameters) {\r\n if (parameter.ui.component === \"flselect\") {\r\n let nChannels = this.props.ome.channels.length;\r\n let cIndex = this.state[parameter.name];\r\n if (cIndex >= nChannels) {\r\n this.onParameterChange(\r\n parameter.name,\r\n this.props.ome.channels.length - 1\r\n );\r\n } else if (cIndex < 0) {\r\n if (this.props.structures[this.props.selectedLayer].toolParams) {\r\n for (let toolParam of this.props.structures[\r\n this.props.selectedLayer\r\n ].toolParams) {\r\n let tempCIndex = this.props.ome.channels.findIndex(\r\n (c) => c.name === toolParam\r\n );\r\n if (tempCIndex >= 0) {\r\n cIndex = tempCIndex;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n this.onParameterChange(parameter.name, cIndex);\r\n }\r\n }\r\n };\r\n\r\n componentDidMount = () => {\r\n this.validateParameters();\r\n };\r\n\r\n componentDidUpdate = (prevProps) => {\r\n if (prevProps.selectedLayer !== this.props.selectedLayer) {\r\n this.validateParameters();\r\n }\r\n };\r\n\r\n /**\r\n * Update tool state\r\n */\r\n onParameterChange(key, value) {\r\n let stateObject = { formControlInUse: key };\r\n stateObject[key] = value;\r\n if (this.state[key] !== value) {\r\n this.setState(stateObject);\r\n setTimeout(() => this.props.onParameterChange(stateObject), 10);\r\n }\r\n }\r\n\r\n transformExponential(v, exponent) {\r\n let result = v ** (1 / exponent);\r\n return result;\r\n }\r\n\r\n render() {\r\n let { onApply, onApplyAll, toolConfig, selectedLayer } = this.props;\r\n let formControls = [];\r\n let optionalFormControls = [];\r\n\r\n for (let parameter of toolConfig.parameters) {\r\n const digits = parameter.ui.step ? countDecimals(parameter.ui.step) : 0;\r\n let formControl = null;\r\n // hide parameter on unwanted structures\r\n if (\r\n parameter.ui.hiddenStructures &&\r\n parameter.ui.hiddenStructures.length > 0\r\n ) {\r\n if (\r\n parameter.ui.hiddenStructures.includes(-1) || // -1 means to hide this parameter on all structures\r\n parameter.ui.hiddenStructures.includes(selectedLayer) || // hide for structure in config\r\n !(parameter.name in this.state)\r\n ) {\r\n continue;\r\n }\r\n }\r\n const component_type = parameter.ui.component;\r\n\r\n switch (component_type) {\r\n case \"required_structures\":\r\n break;\r\n /* Range Slider */\r\n case \"range\":\r\n case \"exp_range\":\r\n formControl = (\r\n \r\n \r\n {parameter.ui.label +\r\n \" = \" +\r\n this.state[parameter.name][0].toFixed(digits) +\r\n \" ... \" +\r\n this.state[parameter.name][1].toFixed(digits)}\r\n \r\n \r\n \r\n \r\n this.onParameterChange(parameter.name, [\r\n e.target.value === \"\" ? 0 : Number(e.target.value),\r\n this.state[parameter.name][1],\r\n ])\r\n }\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n this.onParameterChange(\"formControlInUse\", false);\r\n onApply(this);\r\n }\r\n }}\r\n inputProps={{\r\n step: parameter.ui.step,\r\n min: parameter.ui.min,\r\n max: parameter.ui.max,\r\n type: \"number\",\r\n \"aria-labelledby\": \"input-slider\",\r\n }}\r\n />\r\n \r\n \r\n {\r\n if (component_type === \"exp_range\") {\r\n v = [v[0] ** 2, v[1] ** 2];\r\n } else {\r\n v = [\r\n v[0] * (parameter.ui.step ? parameter.ui.step : 1),\r\n v[1] * (parameter.ui.step ? parameter.ui.step : 1),\r\n ];\r\n }\r\n this.onParameterChange(parameter.name, v);\r\n }}\r\n onChangeCommitted={() => {\r\n this.onParameterChange(\"formControlInUse\", false);\r\n onApply(this);\r\n }}\r\n />\r\n \r\n \r\n \r\n this.onParameterChange(parameter.name, [\r\n this.state[parameter.name][0],\r\n e.target.value === \"\" ? 0 : Number(e.target.value),\r\n ])\r\n }\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n onApply(this);\r\n }\r\n }}\r\n inputProps={{\r\n step: parameter.ui.step,\r\n min: parameter.ui.min,\r\n max: parameter.ui.max,\r\n type: \"number\",\r\n \"aria-labelledby\": \"input-slider\",\r\n }}\r\n />\r\n \r\n \r\n \r\n );\r\n break;\r\n /* Normal Slider */\r\n case \"slider\":\r\n case \"exp_slider\":\r\n formControl = (\r\n \r\n \r\n {parameter.ui.label +\r\n \" = \" +\r\n (typeof this.state[parameter.name] !== \"undefined\"\r\n ? this.state[parameter.name].toFixed(digits)\r\n : \"\")}\r\n \r\n \r\n \r\n {\r\n if (e.type === \"mouseup\") {\r\n this.onParameterChange(\"formControlInUse\", false);\r\n onApply(this);\r\n }\r\n }}\r\n onChange={(e, v) => {\r\n if (component_type === \"exp_slider\") v = v ** 2;\r\n this.onParameterChange(\r\n parameter.name,\r\n v * (parameter.ui.step ? parameter.ui.step : 1)\r\n );\r\n }}\r\n />\r\n \r\n \r\n {\r\n this.onParameterChange(\r\n parameter.name,\r\n e.target.value === \"\" ? 0 : Number(e.target.value)\r\n );\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n this.onParameterChange(\"formControlInUse\", false);\r\n onApply(this);\r\n }\r\n }}\r\n //onBlur={handleBlur}\r\n inputProps={{\r\n step: parameter.ui.step,\r\n min: parameter.ui.min,\r\n max: parameter.ui.max,\r\n type: \"number\",\r\n \"aria-labelledby\": \"input-slider\",\r\n }}\r\n />\r\n \r\n \r\n \r\n );\r\n break;\r\n /* Slider without update when release slider */\r\n case \"staticSlider\":\r\n formControl = (\r\n \r\n \r\n {parameter.ui.label +\r\n \" = \" +\r\n (typeof this.state[parameter.name] !== \"undefined\"\r\n ? this.state[parameter.name].toFixed(digits)\r\n : \"\")}\r\n \r\n \r\n \r\n {\r\n this.onParameterChange(\"formControlInUse\", false);\r\n }}\r\n onChange={(e, v) => {\r\n this.onParameterChange(\r\n parameter.name,\r\n v * (parameter.ui.step ? parameter.ui.step : 1)\r\n );\r\n }}\r\n />\r\n \r\n \r\n {\r\n this.onParameterChange(\r\n parameter.name,\r\n e.target.value === \"\" ? 0 : Number(e.target.value)\r\n );\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n onApply(this);\r\n }\r\n }}\r\n //onBlur={handleBlur}\r\n inputProps={{\r\n step: parameter.ui.step,\r\n min: parameter.ui.min,\r\n max: parameter.ui.max,\r\n type: \"number\",\r\n \"aria-labelledby\": \"input-slider\",\r\n }}\r\n />\r\n \r\n \r\n \r\n );\r\n break;\r\n /* Selector */\r\n case \"select\":\r\n formControl = (\r\n \r\n \r\n {parameter.ui.label}\r\n \r\n \r\n this.onParameterChange(parameter.name, e.target.value)\r\n }\r\n inputProps={{\r\n name: parameter.name,\r\n id: parameter.name,\r\n }}\r\n >\r\n {parameter.ui.options.map((c) => (\r\n \r\n {c.label}\r\n \r\n ))}\r\n \r\n \r\n );\r\n break;\r\n /* Fluorescence Channel Selector */\r\n case \"flselect\":\r\n formControl = (\r\n \r\n \r\n {parameter.ui.label}\r\n \r\n {\r\n this.onParameterChange(parameter.name, e.target.value);\r\n }}\r\n inputProps={{\r\n name: parameter.name,\r\n id: parameter.name,\r\n }}\r\n >\r\n \r\n Select a Channel to use\r\n \r\n {this.props.ome.channels.map((c, index) => (\r\n \r\n \r\n {c.name}\r\n \r\n ))}\r\n {this.props.structures[this.props.selectedLayer].toolParams &&\r\n this.props.structures[this.props.selectedLayer].toolParams\r\n .length === 1 &&\r\n this.props.ome.channels.length < 4 &&\r\n this.state[parameter.name] > 2 && (\r\n \r\n {\r\n this.props.structures[this.props.selectedLayer]\r\n .toolParams[0]\r\n }\r\n \r\n )}\r\n \r\n \r\n );\r\n break;\r\n /* Layer Dependency Selector */\r\n case \"structureselect\":\r\n // validation\r\n if (this.state[parameter.name] >= this.props.structures.length) {\r\n this.onParameterChange(\r\n parameter.name,\r\n this.props.structures.length - 1\r\n );\r\n }\r\n formControl = (\r\n \r\n \r\n {parameter.ui.label}\r\n \r\n \r\n this.onParameterChange(parameter.name, e.target.value)\r\n }\r\n inputProps={{\r\n name: parameter.name,\r\n id: parameter.name,\r\n }}\r\n >\r\n {this.props.structures &&\r\n this.props.structures.map((c, index) => (\r\n \r\n {c.label}\r\n \r\n ))}\r\n \r\n \r\n );\r\n break;\r\n /* Numeric Input */\r\n case \"number\":\r\n formControl = (\r\n \r\n \r\n this.onParameterChange(parameter.name, e.target.value)\r\n }\r\n type=\"number\"\r\n margin=\"normal\"\r\n inputProps={{\r\n min: parameter.ui.min,\r\n max: parameter.ui.max,\r\n step: \"1\",\r\n }}\r\n />\r\n \r\n );\r\n break;\r\n /* Checkbox, Boolean Input */\r\n case \"checkbox\":\r\n formControl = (\r\n \r\n \r\n
    \r\n {\r\n this.onParameterChange(\r\n parameter.name,\r\n e.target.checked\r\n );\r\n //setTimeout(() => onApply(this), 10);\r\n }}\r\n value={parameter.ui.label}\r\n />\r\n }\r\n label={parameter.ui.label}\r\n />\r\n
    \r\n \r\n \r\n );\r\n break;\r\n /* Text Input */\r\n default:\r\n formControl = (\r\n \r\n \r\n this.onParameterChange(parameter.name, e.target.value)\r\n }\r\n margin=\"normal\"\r\n />\r\n \r\n );\r\n }\r\n if (parameter.ui.optional) {\r\n optionalFormControls.push(formControl);\r\n } else {\r\n formControls.push(formControl);\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n {formControls}\r\n {optionalFormControls.length > 0 && (\r\n {\r\n this.accordionExpanded = !this.accordionExpanded;\r\n this.forceUpdate();\r\n }}\r\n >\r\n }>\r\n \r\n Optional parameters: {this.state.selectedModel}\r\n \r\n \r\n {optionalFormControls}\r\n \r\n )}\r\n {!this.state.preview && this.props.selectedLayer === 0 && (\r\n // Detect Base ROI for all files\r\n onApplyAll(this)}\r\n >\r\n Apply to all files\r\n \r\n )}\r\n onApply(this)}\r\n >\r\n Apply\r\n \r\n {this.state.showDownloadProgress && (\r\n
    \r\n \r\n \r\n
    \r\n )}\r\n
    \r\n );\r\n }\r\n}\r\n\r\nConfigFormRaw.propTypes = {\r\n state: PropTypes.object,\r\n toolConfig: PropTypes.object,\r\n ome: PropTypes.object,\r\n structures: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n onParameterChange: PropTypes.func,\r\n onApply: PropTypes.func,\r\n onApplyAll: PropTypes.func,\r\n histogramConfig: PropTypes.object,\r\n componentRef: PropTypes.func,\r\n};\r\n\r\nconst ConfigForm = withSpinloader(ConfigFormRaw);\r\n\r\nexport default InstantAnalysisTool;\r\n","import React from \"react\";\r\n\r\nimport {\r\n Button,\r\n FormControl,\r\n RadioGroup,\r\n FormControlLabel,\r\n Radio,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport { inv } from \"mathjs\";\r\nimport { CommentROI } from \"../../utils/ROI\";\r\nimport Tool from \"./Tool\";\r\n\r\nclass LandmarkTool extends Tool {\r\n name = \"Landmark registration\";\r\n noConfig = false;\r\n mouseActionState = \"free\";\r\n commentState = {\r\n commentValue: \"\",\r\n color: \"#D0021B\",\r\n selectedTool: \"rectangle\",\r\n };\r\n selectedLandmarkIdx = 0;\r\n gripIdx = null;\r\n radioValue = \"#00FF00\";\r\n deletedNumberQ = {};\r\n baseId = null;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.isBrightfield = obj.ome.channels[0].type === \"brightfield\";\r\n this.lineColor = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n this.selectionColor = this.lineColor;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n this.commentLayer = obj.commentLayer\r\n ? obj.commentLayer\r\n : { commentRois: [] };\r\n this.landmarkLayer = obj.landmarkLayer\r\n ? obj.landmarkLayer\r\n : { landmarkRois: [] };\r\n this.fileId = obj.fileId;\r\n this.landmarkLayers = obj.landmarkLayers;\r\n this.rendererDict = obj.rendererDict;\r\n this.splitscreenFileIds = obj.splitscreenFileIds;\r\n }\r\n\r\n //return index if mousepoint is inside a mark\r\n checkBoundingBox(layer, scale, mousePoint) {\r\n let linelength = 15 / scale;\r\n let p = mousePoint;\r\n for (let i = 0; i < layer.length; i++) {\r\n let point = layer[i].regions;\r\n let topLeft = [point[0] - linelength, point[1] - linelength];\r\n let bottomRight = [point[0] + linelength, point[1] + linelength];\r\n if (\r\n p.x > topLeft[0] &&\r\n p.x < bottomRight[0] &&\r\n p.y > topLeft[1] &&\r\n p.y < bottomRight[1]\r\n ) {\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n mouse(params) {\r\n let { event, p, scale } = params;\r\n let mouseP = p;\r\n let roiColor = this.radioValue === \"#00FF00\" ? \"#00FF00\" : \"#FF0000\";\r\n let selectedLandmarkIdx = this.landmarkLayer[\"landmarkRois\"].length;\r\n let markNumber = selectedLandmarkIdx;\r\n\r\n if (typeof this.deletedNumberQ[this.fileId] === \"undefined\") {\r\n this.deletedNumberQ[this.fileId] = [];\r\n }\r\n\r\n if (event.type === \"mousedown\") {\r\n this.mouseActionState = \"down\";\r\n if (selectedLandmarkIdx > 0 && event.button === 0) {\r\n let tag = this.landmarkLayer[\"landmarkRois\"][0].color;\r\n if (tag === \"#00FF00\") {\r\n this.baseId = this.fileId;\r\n console.log(\"tagged as base\");\r\n }\r\n if (tag !== this.radioValue) {\r\n this.radioValue = tag;\r\n return;\r\n }\r\n roiColor = tag;\r\n } else if (selectedLandmarkIdx === 0 && event.button === 0) {\r\n for (const value of Object.values(this.splitscreenFileIds)) {\r\n if (this.landmarkLayers[value][\"landmarkRois\"].length > 0) {\r\n if (\r\n this.landmarkLayers[value][\"landmarkRois\"][0].color === \"#00FF00\"\r\n ) {\r\n this.radioValue = \"#FF0000\";\r\n roiColor = \"#FF0000\";\r\n this.baseId = value;\r\n }\r\n }\r\n }\r\n if (this.radioValue === \"#00FF00\") {\r\n this.baseId = this.fileId;\r\n roiColor = \"#00FF00\";\r\n }\r\n }\r\n } else if (event.type === \"mousemove\" && this.mouseActionState === \"down\") {\r\n this.mouseActionState = \"drag\";\r\n } else if (event.type === \"mouseup\") {\r\n this.mouseActionState = \"free\";\r\n }\r\n\r\n if (this.mouseActionState === \"down\" && event.button === 0) {\r\n if (\r\n this.radioValue === \"#00FF00\" &&\r\n this.splitscreenFileIds.includes(this.baseId) &&\r\n this.fileId !== this.baseId\r\n ) {\r\n console.log(\"this file is not tagged as base\");\r\n this.radioValue = \"#FF0000\";\r\n return;\r\n }\r\n if (selectedLandmarkIdx > 0) {\r\n let idx = this.checkBoundingBox(\r\n this.landmarkLayer[\"landmarkRois\"],\r\n scale,\r\n mouseP\r\n );\r\n if (!idx && idx !== 0) {\r\n if (this.deletedNumberQ[this.fileId].length !== 0) {\r\n markNumber = this.deletedNumberQ[this.fileId].pop() - 1;\r\n }\r\n this.landmarkLayer[\"landmarkRois\"][selectedLandmarkIdx] =\r\n new CommentROI(\r\n [mouseP.x, mouseP.y],\r\n roiColor,\r\n \"landmark\",\r\n markNumber + 1,\r\n 0\r\n );\r\n } else if (typeof idx === \"number\") {\r\n this.gripIdx = idx;\r\n }\r\n } else if (selectedLandmarkIdx === 0) {\r\n this.landmarkLayer[\"landmarkRois\"][selectedLandmarkIdx] =\r\n new CommentROI(\r\n [mouseP.x, mouseP.y],\r\n roiColor,\r\n \"landmark\",\r\n markNumber + 1,\r\n 0\r\n );\r\n }\r\n } else if (this.mouseActionState === \"free\" && event.type === \"mouseup\") {\r\n //set new location of landmark after dragging it\r\n if (typeof this.gripIdx === \"number\") {\r\n this.landmarkLayer[\"landmarkRois\"][this.gripIdx].regions = [\r\n mouseP.x,\r\n mouseP.y,\r\n ];\r\n this.gripIdx = null;\r\n }\r\n }\r\n\r\n // delete specific mark\r\n if (this.mouseActionState === \"down\" && event.button === 2) {\r\n let idx = this.checkBoundingBox(\r\n this.landmarkLayer[\"landmarkRois\"],\r\n scale,\r\n mouseP\r\n );\r\n if (!idx && idx !== 0) {\r\n return;\r\n } else if (typeof idx === \"number\") {\r\n let number = this.landmarkLayer[\"landmarkRois\"][idx].commentValue;\r\n this.landmarkLayer.landmarkRois.splice(idx, 1);\r\n this.deletedNumberQ[this.fileId].push(number);\r\n if (this.landmarkLayer.landmarkRois.length === 0) {\r\n this.deletedNumberQ[this.fileId] = [];\r\n this.baseId = null;\r\n }\r\n }\r\n }\r\n\r\n //disable custom mouse cursor when dragging with middle mouse button\r\n if (event.button === 1) {\r\n this.mouseActionState = \"dragImage\";\r\n } else if (event.button === 0 && this.mouseActionState === \"dragImage\") {\r\n this.mouseActionState = \"free\";\r\n }\r\n }\r\n\r\n drawCustomCursor() {}\r\n\r\n onClickRemoveTransformation = () => {\r\n let r = this.rendererDict[this.fileId];\r\n let a = r.props.tiles.getTransformationMatrix(this.fileId);\r\n if (Array.isArray(a)) {\r\n let m = [\r\n [a[0], a[1], a[2]],\r\n [a[3], a[4], a[5]],\r\n [a[6], a[7], a[8]],\r\n ];\r\n let h = inv(m);\r\n let matrix = [\r\n h[0][0],\r\n h[0][1],\r\n h[0][2],\r\n h[1][0],\r\n h[1][1],\r\n h[1][2],\r\n h[2][0],\r\n h[2][1],\r\n h[2][2],\r\n ];\r\n r.transformLandmark(matrix, 1);\r\n r.transformAnnotation(matrix, 1);\r\n r.props.tiles.removeTransformationMatrix(this.fileId);\r\n r.reset();\r\n this.rendererDict[this.fileId].props.onChangeChain(\r\n false,\r\n this.rendererDict[this.fileId].props.splitscreenIdx,\r\n this.fileId\r\n );\r\n window.showWarningSnackbar(\"Alignment removed\");\r\n }\r\n };\r\n\r\n reallocateLandmarkNumbers = (bMarks) => {\r\n for (let [id, layer] of Object.entries(this.landmarkLayers)) {\r\n let l = layer.landmarkRois;\r\n if (bMarks.length === l.length) {\r\n for (let i = 0; i < l.length; i++) {\r\n if (i + 1 !== l[i].commentValue) {\r\n if (l.length > 0) {\r\n l.sort((a, b) => (a.commentValue > b.commentValue ? 1 : -1));\r\n for (let i = 0; i < l.length; i++) {\r\n l[i].commentValue = i + 1;\r\n }\r\n this.deletedNumberQ[id] = [];\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n onClickApplyTransformation = () => {\r\n if (this.splitscreenFileIds.length < 2) {\r\n window.showWarningSnackbar(\"No base is present\");\r\n return;\r\n }\r\n let baseMarks = [];\r\n let targetMarks = {};\r\n this.baseId = null;\r\n for (let [id, layer] of Object.entries(this.landmarkLayers)) {\r\n if (layer.landmarkRois.length > 0) {\r\n let l = layer.landmarkRois;\r\n if (l[0].color === \"#00FF00\") {\r\n //sort computed value\r\n if (\r\n this.rendererDict[this.fileId].props.splitscreenFileIds.includes(id)\r\n ) {\r\n if (this.baseId !== null) {\r\n window.showWarningSnackbar(\"More than one base is present\");\r\n return;\r\n }\r\n this.baseId = id;\r\n let j = 1;\r\n while (baseMarks.length < l.length) {\r\n for (let i = 0; i < l.length; i++) {\r\n if (Number(l[i].commentValue) === j) {\r\n baseMarks.push(l[i].regions);\r\n }\r\n }\r\n j++;\r\n }\r\n }\r\n } else if (l[0].color === \"#FF0000\") {\r\n if (\r\n this.rendererDict[this.fileId].props.splitscreenFileIds.includes(id)\r\n ) {\r\n //sort computed Value\r\n targetMarks[id] = [];\r\n let j = 1;\r\n while (targetMarks[id].length < l.length) {\r\n for (let i = 0; i < l.length; i++) {\r\n if (Number(l[i].commentValue) === j) {\r\n targetMarks[id].push(l[i].regions);\r\n }\r\n }\r\n j++;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this.reallocateLandmarkNumbers(baseMarks);\r\n this.rendererDict[this.baseId].props.onChangeChain(\r\n true,\r\n this.rendererDict[this.baseId].props.splitscreenIdx,\r\n this.baseId\r\n );\r\n for (let [id, points] of Object.entries(targetMarks)) {\r\n let a = this.rendererDict[id].props.tiles.getTransformationMatrix(\r\n this.fileId\r\n );\r\n if (baseMarks.length !== points.length && baseMarks.length < 4) {\r\n window.showWarningSnackbar(\"Unequal amount of base and target marks\");\r\n window.showWarningSnackbar(\"Please set at least 4 base marks\");\r\n break;\r\n } else if (baseMarks.length < 4) {\r\n window.showWarningSnackbar(\"Please set at least 4 base marks\");\r\n break;\r\n } else if (baseMarks.length !== points.length) {\r\n window.showWarningSnackbar(\"Unequal amount of base and target marks\");\r\n break;\r\n } else if (Array.isArray(a)) {\r\n window.showWarningSnackbar(\r\n \"Target already aligned. Remove alignment first\"\r\n );\r\n break;\r\n } else {\r\n this.rendererDict[id].props.onChangeChain(\r\n true,\r\n this.rendererDict[id].props.splitscreenIdx,\r\n id\r\n );\r\n this.rendererDict[id].generateLandmarkTransformation(\r\n baseMarks,\r\n targetMarks[id],\r\n this.baseId,\r\n id,\r\n this.rendererDict[this.baseId].props.ome\r\n );\r\n }\r\n }\r\n };\r\n\r\n handleRadioChange = (event) => {\r\n this.radioValue = event.target.value;\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n onClickRemoveAllMarks = () => {\r\n this.landmarkLayer.landmarkRois = [];\r\n this.deletedNumberQ[this.fileId] = [];\r\n if (this.fileId === this.baseId) {\r\n this.baseId = null;\r\n }\r\n };\r\n\r\n exit() {}\r\n\r\n renderConfiguration = () => {\r\n return (\r\n
    \r\n {this.name}:\r\n \r\n \r\n }\r\n label=\"Set landmarks on base\"\r\n />\r\n }\r\n label=\"Set landmarks on target\"\r\n />\r\n \r\n \r\n {\r\n this.onClickApplyTransformation();\r\n }}\r\n >\r\n Align Image\r\n \r\n\r\n {\r\n this.onClickRemoveTransformation();\r\n }}\r\n >\r\n Remove Alignment\r\n \r\n {\r\n this.onClickRemoveAllMarks();\r\n }}\r\n >\r\n Remove landmarks\r\n \r\n
    \r\n );\r\n };\r\n}\r\n\r\nexport default LandmarkTool;\r\n","import { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { FormLabel, FormControl, Slider, Typography } from \"@mui/material\";\r\nimport {\r\n updateLayer,\r\n findSiblingRoiLayers,\r\n createRegionRoi,\r\n} from \"../../utils/PolygonUtil\";\r\nimport Tool from \"./Tool\";\r\nimport React from \"react\";\r\nimport MagicWandToolLib from \"magic-wand-tool\";\r\n\r\nlet hatchOffset = 0;\r\n\r\nclass MagicWandTool extends Tool {\r\n name = \"MagicWand\";\r\n noConfig = false;\r\n flag = false;\r\n downScale = 2;\r\n removeOverlap = null;\r\n tempRemoveOverlap = null;\r\n threshold = 15; //default threshold value with best result\r\n shiftflag = false;\r\n points = [];\r\n drawRegion = {\r\n regions: [],\r\n inverted: false,\r\n };\r\n lastp = null;\r\n\r\n setLayer(obj) {\r\n this.ctx = obj.ctx; //context\r\n this.canvas = obj.ctx.canvas; //canvas\r\n this.layer = obj.layer; //layer\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.originalSelectedLayer = obj.selectedLayer;\r\n this.drawLayer = obj.drawLayer;\r\n\r\n const project = obj.viewerConfig_project;\r\n if (this.removeOverlap === null) {\r\n this.removeOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.tempRemoveOverlap === null) {\r\n this.tempRemoveOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.removeOverlap = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n getScale = () => {\r\n return this.ctx ? this.ctx.getTransform().a : 1;\r\n };\r\n\r\n getPosition = () => {\r\n return {\r\n x: -this.ctx.getTransform().e,\r\n y: -this.ctx.getTransform().f,\r\n };\r\n };\r\n\r\n useMagicWand(p, color, subtype, name, positionInRoiLayer, fullyLoaded) {\r\n this.lastp = p;\r\n let position = {\r\n x: parseInt(p.x * this.getScale() - this.getPosition().x, 10),\r\n y: parseInt(p.y * this.getScale() - this.getPosition().y, 10),\r\n };\r\n\r\n let ctx = this.canvas.getContext(\"2d\");\r\n //let points = [];\r\n //this.startPoint = position;\r\n let imageData = ctx.getImageData(\r\n 0,\r\n 0,\r\n this.canvas.width,\r\n this.canvas.height\r\n );\r\n\r\n // let len = imageData.data.length;\r\n // for (j = 0; j < len; j++){\r\n // imageData.data[j] = 255 - imageData.data[j];\r\n // }\r\n\r\n let image = {\r\n data: imageData.data,\r\n width: this.canvas.width,\r\n height: this.canvas.height,\r\n bytes: 4,\r\n };\r\n\r\n let wandMask = MagicWandToolLib.floodFill(\r\n image,\r\n position.x,\r\n position.y,\r\n this.threshold,\r\n null,\r\n true\r\n );\r\n\r\n let len = wandMask.data.length;\r\n for (let j = 0; j < len; j++) {\r\n if (wandMask.data[j] === 1) {\r\n wandMask.data[j] = 0;\r\n } else {\r\n wandMask.data[j] = 1;\r\n }\r\n }\r\n\r\n if (wandMask) {\r\n wandMask = MagicWandToolLib.gaussBlurOnlyBorder(wandMask, 2, null);\r\n }\r\n\r\n //let nonzeromask = wandMask.data.filter(number=>number>0);\r\n //console.log(\"nonzeromask:\",nonzeromask.length);\r\n //console.log(this.wandMask.data);\r\n\r\n //wandMask = MagicWandToolLib.gaussBlurOnlyBorder(wandMask, 5, null);\r\n let cacheInd = MagicWandToolLib.getBorderIndices(wandMask);\r\n //console.log(cacheInd.length);\r\n //this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n\r\n let w = this.canvas.width;\r\n let h = this.canvas.height;\r\n let x,\r\n j,\r\n i = null;\r\n let y = null;\r\n let hatchLength = 4;\r\n hatchOffset = (hatchOffset + 1) % (hatchLength * 2);\r\n\r\n ctx.clearRect(0, 0, w, h);\r\n\r\n len = cacheInd.length;\r\n for (j = 0; j < len; j++) {\r\n i = cacheInd[j];\r\n x = i % w; // calc x by index\r\n y = (i - x) / w; // calc y by index\r\n //let k = (y * w + x) * 4;\r\n if ((x + y + hatchOffset) % (hatchLength * 2) < hatchLength) {\r\n // detect hatch color\r\n this.points.push([\r\n (x + this.getPosition().x) / this.getScale(),\r\n (y + this.getPosition().y) / this.getScale(),\r\n ]);\r\n } else {\r\n this.points.push([\r\n (x + this.getPosition().x) / this.getScale(),\r\n (y + this.getPosition().y) / this.getScale(),\r\n ]);\r\n }\r\n }\r\n\r\n this.points = this.trace(wandMask);\r\n if (this.points.length > 2) {\r\n let drawRegion = {\r\n regions: [\r\n createRegionRoi([this.points], 0, null, null, null, 0, false),\r\n ],\r\n inverted: false,\r\n };\r\n updateLayer(\r\n this.layer,\r\n drawRegion,\r\n this.clear,\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n false,\r\n this.roiLayers[this.parentLayer],\r\n this.structures[this.originalSelectedLayer].id,\r\n false,\r\n this.clickedOnRoi,\r\n this.activeTab === 1 // defines if it should be treated as an object\r\n );\r\n }\r\n }\r\n\r\n trace(wandMask) {\r\n let simplifyTolerant = 0;\r\n let simplifyCount = 50;\r\n let cs = MagicWandToolLib.traceContours(wandMask);\r\n cs = MagicWandToolLib.simplifyContours(cs, simplifyTolerant, simplifyCount);\r\n\r\n wandMask = null;\r\n\r\n //draw contours\r\n this.points = [];\r\n for (var i = 0; i < cs.length; i++) {\r\n if (!cs[i].inner) continue;\r\n var ps = cs[i].points;\r\n this.points.push([\r\n (ps[0].x + this.getPosition().x) / this.getScale(),\r\n (ps[0].y + this.getPosition().y) / this.getScale(),\r\n ]);\r\n for (var j = 1; j < ps.length; j++) {\r\n this.points.push([\r\n (ps[j].x + this.getPosition().x) / this.getScale(),\r\n (ps[j].y + this.getPosition().y) / this.getScale(),\r\n ]);\r\n }\r\n }\r\n return this.points;\r\n }\r\n\r\n mouseWheelEvent = (e) => {\r\n if (e.shiftKey) {\r\n if (e.deltaY > 0 && this.threshold > 0) {\r\n this.threshold--;\r\n updateLayer(this.layer, this.drawRegion, true, 0);\r\n this.useMagicWand(this.lastp);\r\n window.forceSidebarUpdate();\r\n } else if (e.deltaY < 0 && this.threshold < 250) {\r\n this.threshold++;\r\n updateLayer(this.layer, this.drawRegion, true, 0);\r\n this.useMagicWand(this.lastp);\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n };\r\n\r\n mouse(params) {\r\n let {\r\n event,\r\n p,\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n parentIdx,\r\n } = params;\r\n let parentLayer = parentIdx;\r\n if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n this.drawLayer.regionRois = [];\r\n this.drawLayer.inverted = false;\r\n // right mouse button -> clear\r\n this.clear = event.button === 2;\r\n this.drawLayer.clear = this.clear;\r\n\r\n // update position history\r\n this.startPoint = p;\r\n this.points = [];\r\n this.points.push([p.x, p.y]);\r\n\r\n // set drawing flag\r\n this.flag = true;\r\n } else if (\r\n event.type === \"mouseup\" ||\r\n (this.flag && event.type === \"mouseleave\")\r\n ) {\r\n this.useMagicWand(\r\n p,\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded\r\n ); //func goes here\r\n\r\n // release drawing flag\r\n this.flag = false;\r\n\r\n if (this.drawLayer.regionRois.length > 0) {\r\n //if not empty update drawing\r\n this.drawRegion.regions = [this.drawLayer.regionRois[0]];\r\n //updateLayer(this.layer, drawRegion, this.clear);\r\n let overlapRoiLayers = this.removeOverlap\r\n ? findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n )\r\n : [];\r\n\r\n updateLayer(\r\n this.layer,\r\n this.drawRegion,\r\n this.clear,\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n false,\r\n this.roiLayers[parentLayer],\r\n this.structures[this.selectedLayer].id,\r\n overlapRoiLayers\r\n );\r\n this.drawLayer.regionRois = [];\r\n }\r\n } else if (event.type === \"mousemove\") {\r\n // if (this.flag) {\r\n // let points = [];\r\n // points.push([this.startPoint.x, this.startPoint.y]);\r\n // points.push([p.x, this.startPoint.y]);\r\n // points.push([p.x, p.y]);\r\n // points.push([this.startPoint.x, p.y]);\r\n // console.log(typeof layer)\r\n // let drawRegion = {\r\n // regions: [createRegionRoi([points], 0, null, null, null, 0, false)],\r\n // inverted: false,\r\n // };\r\n // this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n // updateLayer(this.drawLayer, drawRegion, false, color, subtype, name);\r\n // }\r\n //do nothing\r\n }\r\n }\r\n\r\n drawCustomCursor() {\r\n // no custom cursor\r\n if (this.ctx) {\r\n //this.ctx.fillStyle = \"red\";\r\n //this.ctx.fillRect(10, 10, 50, 50);\r\n //let imgData = this.ctx.getImageData(10, 10, 50, 50);\r\n //this.ctx.putImageData(imgData, 10, 70,0,0,5000,5000);\r\n //this.useMagicWand(ctx, mousePosition);\r\n //this.ctx.clearRect(5000, 5000, this.canvas.width, this.canvas.height);\r\n }\r\n }\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
    \r\n {this.name}:\r\n {\r\n this.threshold = e;\r\n window.forceSidebarUpdate();\r\n }}\r\n />\r\n
    \r\n );\r\n }\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n render() {\r\n let { onChangeThreshold, threshold } = this.props;\r\n return (\r\n
    \r\n \r\n {\"Threshold = \" + threshold}\r\n {\r\n onChangeThreshold(v);\r\n }}\r\n />\r\n \r\n {\"use shift + mouse wheel for region growth and decrease\"}\r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nConfigForm.propTypes = {\r\n onChangeThreshold: PropTypes.func,\r\n threshold: PropTypes.number,\r\n};\r\n\r\nexport default MagicWandTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport Tool from \"./Tool\";\r\n\r\nimport {\r\n lineArrayBuffer,\r\n updateDrawLayer,\r\n updateLayer,\r\n findSiblingRoiLayers,\r\n findSameLayer,\r\n checkIfStructureHidden,\r\n findClickedRoi,\r\n createRegionRoi,\r\n distance,\r\n} from \"../../utils/PolygonUtil\";\r\nimport OverlapConfigForm from \"./ConfigForms/OverlapConfigForm\";\r\nimport { FormLabel, FormControl, Slider, Typography } from \"@mui/material\";\r\n\r\nclass PenTool extends Tool {\r\n name = \"Pen\";\r\n flag = false;\r\n downScale = 2;\r\n penRadius = 10;\r\n minPenRadius = 1;\r\n maxPenRadius = 200;\r\n removeOverlap = null;\r\n removeOverlapSame = null;\r\n lastP = null;\r\n tempRemoveOverlap = null;\r\n tempRemoveOverlapSame = null;\r\n useNodeDrawingMode = null;\r\n tempUseNodeDrawingMode = null;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.isBrightfield = obj.ome.channels[0].type === \"brightfield\";\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedLayer = layerResults[0];\r\n this.parentLayer = layerResults[1];\r\n this.originalSelectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n\r\n const project = obj.viewerConfig_project;\r\n if (this.removeOverlap === null) {\r\n this.removeOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.tempRemoveOverlap === null) {\r\n this.tempRemoveOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.removeOverlapSame === null) {\r\n this.removeOverlapSame = project.projectProperties[\"PreventOverlapSame\"];\r\n }\r\n if (this.useNodeDrawingMode === null) {\r\n this.useNodeDrawingMode = project.projectProperties[\"NodeDrawingMode\"]\r\n ? true\r\n : false;\r\n }\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.tempRemoveOverlapSame = this.removeOverlapSame;\r\n this.removeOverlap = false;\r\n this.removeOverlapSame = false;\r\n this.tempUseNodeDrawingMode = this.useNodeDrawingMode;\r\n this.useNodeDrawingMode = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n this.removeOverlapSame = this.tempRemoveOverlapSame;\r\n this.useNodeDrawingMode = this.tempUseNodeDrawingMode;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n }\r\n\r\n onKeyDown(e) {\r\n let delta = Math.max(1, parseInt(this.penRadius * 0.05, 10));\r\n if (e.code === \"KeyS\") {\r\n this.penRadius -= delta;\r\n } else if (e.code === \"KeyW\") {\r\n this.penRadius += delta;\r\n }\r\n if (this.penRadius < this.minPenRadius) {\r\n this.penRadius = this.minPenRadius;\r\n }\r\n if (this.penRadius > this.maxPenRadius) {\r\n this.penRadius = this.maxPenRadius;\r\n }\r\n window.forceSidebarUpdate();\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n addPoint = (event, p) => {\r\n let eventPoint = { x: event.clientX, y: event.clientY };\r\n if (this.line.length < 3 || this.useNodeDrawingMode) {\r\n this.line.push([p.x, p.y]);\r\n this.lastEventPoint = eventPoint;\r\n } else {\r\n const dist = distance(this.lastEventPoint, eventPoint);\r\n if (dist < 10) {\r\n this.line[this.line.length - 1] = [p.x, p.y];\r\n } else {\r\n this.line.push([p.x, p.y]);\r\n this.lastEventPoint = eventPoint;\r\n }\r\n }\r\n };\r\n\r\n mouse(params) {\r\n let { event, p, color, subtype, name, positionInRoiLayer, fullyLoaded } =\r\n params;\r\n if (typeof p === \"undefined\") {\r\n this.line = [];\r\n return;\r\n }\r\n // mouse middle button\r\n if (event.button === 1) {\r\n return;\r\n }\r\n if (this.useNodeDrawingMode) {\r\n if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n if (this.flag) {\r\n if (\r\n (this.clear && event.button === 2) ||\r\n (!this.clear && event.button === 0)\r\n ) {\r\n this.addPointToDrawLayer(event, p, color, subtype);\r\n } else {\r\n this.applyDrawLayer(\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n event,\r\n p\r\n );\r\n }\r\n } else {\r\n this.initDrawing(subtype, name, color, event, p);\r\n }\r\n }\r\n return;\r\n }\r\n if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n this.initDrawing(subtype, name, color, event, p);\r\n } else if (event.type === \"mouseup\") {\r\n this.applyDrawLayer(\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded\r\n );\r\n this.drawLayer.regionRois = [];\r\n } else if (event.type === \"mousemove\") {\r\n if (this.flag) {\r\n this.addPointToDrawLayer(event, p, color, subtype);\r\n }\r\n }\r\n this.lastP = p;\r\n }\r\n\r\n initDrawing = (subtype, name, color, event, p) => {\r\n checkIfStructureHidden(\r\n this.structures,\r\n this.selectedLayer,\r\n subtype,\r\n name,\r\n color\r\n );\r\n this.clear = event.button === 2;\r\n this.drawLayer.clear = this.clear;\r\n this.line = [[p.x, p.y]];\r\n this.flag = true;\r\n if (this.removeOverlapSame) {\r\n this.clickedOnRoi = findClickedRoi(\r\n p,\r\n this.selectedLayer,\r\n this.structures,\r\n this.roiLayers,\r\n this.includeBaseROI\r\n );\r\n }\r\n };\r\n\r\n replaceLastPointInDrawLayer = (event, p, color, subtype) => {\r\n if (this.line.length === 1) {\r\n this.addPointToDrawLayer(event, p, color, subtype);\r\n return;\r\n }\r\n if (this.line.length > 1) {\r\n this.line.pop();\r\n this.addPointToDrawLayer(event, p, color, subtype);\r\n }\r\n };\r\n\r\n applyDrawLayer = (color, subtype, name, positionInRoiLayer, fullyLoaded) => {\r\n let linePoly = lineArrayBuffer(\r\n this.line,\r\n this.penRadius,\r\n this.ome.sizeX,\r\n this.ome.sizeY\r\n );\r\n if (linePoly === undefined) return;\r\n this.flag = false;\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n let lineRegions = {\r\n regions:\r\n linePoly !== null\r\n ? [\r\n createRegionRoi(\r\n [linePoly.geometry.coordinates],\r\n color,\r\n subtype,\r\n name,\r\n fullyLoaded,\r\n this.structures[this.originalSelectedLayer].id,\r\n false\r\n ),\r\n ]\r\n : [],\r\n inverted: false,\r\n };\r\n let overlapRoiLayers = [];\r\n if (this.removeOverlapSame) {\r\n overlapRoiLayers.push(this.roiLayers[this.selectedLayer]);\r\n }\r\n if (this.removeOverlap) {\r\n let siblingRoiLayers = findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n );\r\n siblingRoiLayers.map((layer) => overlapRoiLayers.push(layer));\r\n }\r\n updateLayer(\r\n this.layer,\r\n lineRegions,\r\n this.clear,\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n false,\r\n this.roiLayers[this.parentLayer],\r\n this.structures[this.originalSelectedLayer].id,\r\n overlapRoiLayers,\r\n this.clickedOnRoi\r\n );\r\n this.drawLayer.regionRois = [];\r\n this.line = [];\r\n };\r\n\r\n addPointToDrawLayer = (event, p, color, subtype) => {\r\n // update position history\r\n this.addPoint(event, p);\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n let linePoly = lineArrayBuffer(\r\n this.line,\r\n this.penRadius,\r\n this.ome.sizeX,\r\n this.ome.sizeY\r\n );\r\n\r\n let lineRegions = {\r\n regions: linePoly !== null ? [linePoly.geometry.coordinates] : [],\r\n inverted: false,\r\n };\r\n updateDrawLayer(this.drawLayer, lineRegions, false, color, subtype, name);\r\n };\r\n\r\n drawCustomCursor(ctx, mousePosition, fkt, fromGallery) {\r\n let p = mousePosition;\r\n fromGallery = fromGallery && fromGallery === true ? true : false;\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n if (this.useNodeDrawingMode && this.line?.length > 0) {\r\n const lineEnd = this.line[this.line.length - 1];\r\n let previewLine = [lineEnd, [p.x, p.y]];\r\n let linePoly = lineArrayBuffer(\r\n previewLine,\r\n this.penRadius,\r\n this.ome.sizeX,\r\n this.ome.sizeY\r\n );\r\n let points = linePoly.geometry.coordinates[0];\r\n ctx.lineWidth = 2 / fkt;\r\n ctx.strokeStyle = \"#000000\";\r\n ctx.moveTo(points[0][0], points[0][1]);\r\n for (let p of points) {\r\n ctx.lineTo(p[0], p[1]);\r\n }\r\n } else {\r\n let penRad =\r\n fkt && fromGallery && fromGallery === true\r\n ? this.penRadius * fkt\r\n : this.penRadius;\r\n ctx.arc(p.x, p.y, penRad, 0, 2 * Math.PI);\r\n }\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
    \r\n {this.name}:\r\n {\r\n this.penRadius = e;\r\n window.forceSidebarUpdate();\r\n }}\r\n onChangeRemoveOverlap={(e) => (this.removeOverlap = e)}\r\n />\r\n (this.useNodeDrawingMode = e)}\r\n onChangeRemoveOverlap={(e) => (this.removeOverlap = e)}\r\n onChangeRemoveOverlapSame={(e) => (this.removeOverlapSame = e)}\r\n />\r\n
    \r\n );\r\n }\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n state = {\r\n removeOverlap: this.props.removeOverlap,\r\n };\r\n\r\n render() {\r\n let { onChangePenRadius, penRadius, minPenRadius, maxPenRadius } =\r\n this.props;\r\n\r\n return (\r\n
    \r\n \r\n \r\n {\"Line thickness = \" + penRadius + \" (smaller: S, wider: W)\"}\r\n \r\n {\r\n onChangePenRadius(v);\r\n this.setState({ penRadius: v });\r\n }}\r\n />\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nConfigForm.propTypes = {\r\n removeOverlap: PropTypes.bool,\r\n onChangePenRadius: PropTypes.func,\r\n penRadius: PropTypes.number,\r\n minPenRadius: PropTypes.number,\r\n maxPenRadius: PropTypes.number,\r\n};\r\n\r\nexport default PenTool;\r\n","export class TinyQueue {\r\n constructor(data = [], compare = defaultCompare) {\r\n this.data = data;\r\n this.length = this.data.length;\r\n this.compare = compare;\r\n\r\n if (this.length > 0) {\r\n for (let i = (this.length >> 1) - 1; i >= 0; i--) this._down(i);\r\n }\r\n }\r\n\r\n push(item) {\r\n this.data.push(item);\r\n this.length++;\r\n this._up(this.length - 1);\r\n }\r\n\r\n pop() {\r\n if (this.length === 0) return undefined;\r\n\r\n const top = this.data[0];\r\n const bottom = this.data.pop();\r\n this.length--;\r\n\r\n if (this.length > 0) {\r\n this.data[0] = bottom;\r\n this._down(0);\r\n }\r\n\r\n return top;\r\n }\r\n\r\n peek() {\r\n return this.data[0];\r\n }\r\n\r\n _up(pos) {\r\n const { data, compare } = this;\r\n const item = data[pos];\r\n\r\n while (pos > 0) {\r\n const parent = (pos - 1) >> 1;\r\n const current = data[parent];\r\n if (compare(item, current) >= 0) break;\r\n data[pos] = current;\r\n pos = parent;\r\n }\r\n\r\n data[pos] = item;\r\n }\r\n\r\n _down(pos) {\r\n const { data, compare } = this;\r\n const halfLength = this.length >> 1;\r\n const item = data[pos];\r\n\r\n while (pos < halfLength) {\r\n let left = (pos << 1) + 1;\r\n let best = data[left];\r\n const right = left + 1;\r\n\r\n if (right < this.length && compare(data[right], best) < 0) {\r\n left = right;\r\n best = data[right];\r\n }\r\n if (compare(best, item) >= 0) break;\r\n\r\n data[pos] = best;\r\n pos = left;\r\n }\r\n\r\n data[pos] = item;\r\n }\r\n}\r\n\r\nfunction defaultCompare(a, b) {\r\n return a < b ? -1 : a > b ? 1 : 0;\r\n}\r\n","import { TinyQueue } from \"./TinyQueue\";\r\n\r\nexport function knn(tree, x, y, n, predicate, maxDistance) {\r\n var node = tree.data,\r\n result = [],\r\n toBBox = tree.toBBox,\r\n i,\r\n child,\r\n dist,\r\n candidate;\r\n\r\n var queue = new TinyQueue(undefined, compareDist);\r\n\r\n while (node) {\r\n for (i = 0; i < node.children.length; i++) {\r\n child = node.children[i];\r\n dist = boxDist(x, y, node.leaf ? toBBox(child) : child);\r\n if (!maxDistance || dist <= maxDistance * maxDistance) {\r\n queue.push({\r\n node: child,\r\n isItem: node.leaf,\r\n dist: dist,\r\n });\r\n }\r\n }\r\n\r\n while (queue.length && queue.peek().isItem) {\r\n candidate = queue.pop().node;\r\n if (!predicate || predicate(candidate)) result.push(candidate);\r\n if (n && result.length === n) return result;\r\n }\r\n\r\n node = queue.pop();\r\n if (node) node = node.node;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction compareDist(a, b) {\r\n return a.dist - b.dist;\r\n}\r\n\r\nfunction boxDist(x, y, box) {\r\n var dx = axisDist(x, box.minX, box.maxX),\r\n dy = axisDist(y, box.minY, box.maxY);\r\n return dx * dx + dy * dy;\r\n}\r\n\r\nfunction axisDist(k, min, max) {\r\n return k < min ? min - k : k <= max ? 0 : k - max;\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport RBush from \"rbush\";\r\nimport { knn } from \"../../utils/rbush-knn\";\r\nimport Tool from \"./Tool\";\r\n\r\nimport {\r\n FormControl,\r\n MenuItem,\r\n Table,\r\n TableRow,\r\n TableCell,\r\n TableBody,\r\n TextField,\r\n IconButton,\r\n Tooltip,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport { VisibilityOff, Visibility } from \"@mui/icons-material\";\r\nimport SketchColorPicker from \"../../../common/components/SketchColorPicker\";\r\n\r\nclass PlotNearestRoiTool extends Tool {\r\n name = \"Plot nearest objects\";\r\n nearestLayer = null;\r\n colors = {\r\n main: \"red\",\r\n nearest: \"green\",\r\n connection: \"blue\",\r\n maxDistance: \"red\",\r\n };\r\n config = {\r\n mainRadius: 80,\r\n nearestRadius: 50,\r\n connectionLineWidth: 1,\r\n maxDistance: 1000,\r\n mainVisibility: true,\r\n nearestVisibility: true,\r\n connectionVisibility: true,\r\n maxDistanceVisibility: true,\r\n nearestLayerId: null,\r\n };\r\n\r\n setLayer(obj) {\r\n this.structures = obj.structures;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n mouse(params) {\r\n let { event, p } = params;\r\n this.curX = p.x;\r\n this.curY = p.y;\r\n\r\n // mouse middle button\r\n if (event.button === 1) {\r\n return;\r\n }\r\n }\r\n\r\n drawDistanceCircles(ctx, regionRois, color, radius) {\r\n for (let regionRoi of regionRois) {\r\n let center = regionRoi.center;\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = color;\r\n ctx.arc(center.x, center.y, radius, 0, 2 * Math.PI);\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n drawLayerCircles(ctx, fkt, regionRois, color, radius) {\r\n for (let regionRoi of regionRois) {\r\n let center = regionRoi.center;\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.fillStyle = color;\r\n ctx.arc(center.x, center.y, radius, 0, 2 * Math.PI);\r\n ctx.fill();\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n drawNearestConnections(ctx, regionRois, tree, color) {\r\n for (let regionRoi of regionRois) {\r\n let center = regionRoi.center;\r\n let nearestCenters = knn(\r\n tree,\r\n center.x,\r\n center.y,\r\n 1,\r\n null,\r\n this.config.maxDistance\r\n ).map((item) => item.center);\r\n if (nearestCenters.length > 0) {\r\n let center2 = nearestCenters[0];\r\n ctx.beginPath();\r\n ctx.strokeStyle = color;\r\n ctx.moveTo(center.x, center.y);\r\n ctx.lineTo(center2.x, center2.y);\r\n ctx.stroke();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Draw a custom cursor\r\n */\r\n drawCustomCursor(ctx, mousePosition, fkt) {\r\n if (this.config.maxDistanceVisibility) {\r\n this.drawDistanceCircles(\r\n ctx,\r\n this.roiLayers[this.selectedLayer].layer.regionRois,\r\n this.colors.maxDistance,\r\n this.config.maxDistance\r\n );\r\n }\r\n\r\n ctx.lineWidth = this.config.connectionLineWidth / fkt;\r\n if (\r\n this.roiLayers[this.nearestLayer] &&\r\n this.selectedLayer !== this.nearestLayer\r\n ) {\r\n if (this.config.connectionVisibility) {\r\n let selectedTree = new RBush();\r\n for (let regionRoi of this.roiLayers[this.selectedLayer].layer\r\n .regionRois) {\r\n selectedTree.insert(regionRoi.treeItem);\r\n }\r\n this.drawNearestConnections(\r\n ctx,\r\n this.roiLayers[this.nearestLayer].layer.regionRois,\r\n selectedTree,\r\n this.colors.connection,\r\n 1\r\n );\r\n }\r\n\r\n if (this.config.nearestVisibility) {\r\n this.drawLayerCircles(\r\n ctx,\r\n fkt,\r\n this.roiLayers[this.nearestLayer].layer.regionRois,\r\n this.colors.nearest,\r\n this.config.nearestRadius\r\n );\r\n }\r\n }\r\n\r\n if (this.config.mainVisibility) {\r\n this.drawLayerCircles(\r\n ctx,\r\n fkt,\r\n this.roiLayers[this.selectedLayer].layer.regionRois,\r\n this.colors.main,\r\n this.config.mainRadius\r\n );\r\n }\r\n }\r\n\r\n setSelectedRoiLayer = (id) => {\r\n for (let i = 0; i < this.structures.length; i++) {\r\n if (this.structures[i].id === id) {\r\n this.nearestLayer = i;\r\n }\r\n }\r\n };\r\n\r\n onChangeColors = (colors) => {\r\n this.colors = colors;\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n onChangeConfig = (config) => {\r\n this.config = config;\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n exit() {}\r\n\r\n renderConfiguration = () => {\r\n return (\r\n
    \r\n {this.name}:\r\n this.onChangeColors(colors)}\r\n onChangeConfig={(config) => this.onChangeConfig(config)}\r\n roiLayers={this.roiLayers}\r\n selectedLayer={this.selectedLayer}\r\n structures={this.structures}\r\n onChangeSelection={(id) => {\r\n this.setSelectedRoiLayer(id);\r\n }}\r\n />\r\n
    \r\n );\r\n };\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n onChangeColor = (color, type) => {\r\n let colorObject = this.props.colors;\r\n colorObject[type] = color;\r\n this.props.onChangeColors(colorObject);\r\n };\r\n onChangeConfig = (value, type) => {\r\n let configObject = this.props.config;\r\n configObject[type] = value;\r\n this.props.onChangeConfig(configObject);\r\n };\r\n render() {\r\n const { structures, roiLayers, selectedLayer, config, colors } = this.props;\r\n const styles = {\r\n numberInput: {\r\n width: 60,\r\n },\r\n };\r\n\r\n const filteredStructures = structures.filter(\r\n (val, i) =>\r\n i !== selectedLayer && roiLayers[i].layer.regionRois.length > 0\r\n );\r\n if (config.nearestLayerId === null && filteredStructures.length > 0) {\r\n this.props.onChangeSelection(filteredStructures[0].id);\r\n this.onChangeConfig(filteredStructures[0].id, \"nearestLayerId\");\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Main\r\n \r\n \r\n {\r\n let value = Math.max(1, e.target.value);\r\n this.onChangeConfig(value, \"mainRadius\");\r\n }}\r\n />\r\n \r\n \r\n \r\n {\r\n this.onChangeConfig(\r\n !config.mainVisibility,\r\n \"mainVisibility\"\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n {config.mainVisibility ? : }\r\n \r\n \r\n \r\n \r\n {\r\n this.onChangeColor(color, \"main\");\r\n this.onChangeColor(color, \"maxDistance\");\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n {\r\n this.props.onChangeSelection(e.target.value);\r\n this.onChangeConfig(e.target.value, \"nearestLayerId\");\r\n }}\r\n >\r\n {filteredStructures.map((structure, idx) => {\r\n return (\r\n \r\n {structure.label} {idx}\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n {\r\n let value = Math.max(1, e.target.value);\r\n this.onChangeConfig(value, \"nearestRadius\");\r\n }}\r\n />\r\n \r\n \r\n \r\n {\r\n this.onChangeConfig(\r\n !config.nearestVisibility,\r\n \"nearestVisibility\"\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n {config.nearestVisibility ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n this.onChangeColor(color, \"nearest\")}\r\n />\r\n \r\n \r\n \r\n \r\n Connection\r\n \r\n \r\n {\r\n let value = Math.max(1, e.target.value);\r\n this.onChangeConfig(value, \"connectionLineWidth\");\r\n }}\r\n />\r\n \r\n \r\n \r\n {\r\n this.onChangeConfig(\r\n !config.connectionVisibility,\r\n \"connectionVisibility\"\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n {config.connectionVisibility ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n this.onChangeColor(color, \"connection\")\r\n }\r\n />\r\n \r\n \r\n\r\n \r\n \r\n Maximum Distance\r\n \r\n \r\n {\r\n let value = Math.max(1, e.target.value);\r\n this.onChangeConfig(value, \"maxDistance\");\r\n }}\r\n />\r\n \r\n \r\n \r\n {\r\n this.onChangeConfig(\r\n !config.maxDistanceVisibility,\r\n \"maxDistanceVisibility\"\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n {config.maxDistanceVisibility ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n this.onChangeColor(color, \"maxDistance\")\r\n }\r\n />\r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nConfigForm.propTypes = {\r\n colors: PropTypes.object,\r\n onChangeColors: PropTypes.func,\r\n config: PropTypes.object,\r\n onChangeConfig: PropTypes.func,\r\n structures: PropTypes.array,\r\n roiLayers: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n onChangeSelection: PropTypes.func,\r\n};\r\n\r\nexport default PlotNearestRoiTool;\r\n","import {\r\n updateLayer,\r\n updateDrawLayer,\r\n findSiblingRoiLayers,\r\n findSameLayer,\r\n findClickedRoi,\r\n checkIfStructureHidden,\r\n createRegionRoi,\r\n findRoi,\r\n} from \"../../utils/PolygonUtil\";\r\nimport Tool from \"./Tool\";\r\nimport React from \"react\";\r\nimport OverlapConfigForm from \"./ConfigForms/OverlapConfigForm\";\r\nimport {\r\n Tabs,\r\n Tab,\r\n FormControl,\r\n FormControlLabel,\r\n RadioGroup,\r\n Radio,\r\n Typography,\r\n} from \"@mui/material\";\r\n\r\nclass RectangleTool extends Tool {\r\n name = \"Rectangle\";\r\n noConfig = false;\r\n includeBaseROI = false;\r\n flag = false;\r\n downScale = 2;\r\n points = [];\r\n removeOverlap = null;\r\n removeOverlapSame = null;\r\n tempRemoveOverlap = null;\r\n tempRemoveOverlapSame = null;\r\n activeTab = 0;\r\n drawMode = \"draw\";\r\n selectedRoi = null;\r\n selectedIndex = null;\r\n resizeMode = \"\";\r\n resizingStarted = \"\";\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.updateObjectMode = obj.updateObjectMode;\r\n this.isBrightfield = obj.ome.channels[0].type === \"brightfield\";\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedLayer = layerResults[0];\r\n this.parentLayer = layerResults[1];\r\n this.originalSelectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n\r\n const project = obj.viewerConfig_project;\r\n if (this.removeOverlap === null) {\r\n this.removeOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.tempRemoveOverlap === null) {\r\n this.tempRemoveOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.removeOverlapSame === null) {\r\n this.removeOverlapSame = project.projectProperties[\"PreventOverlapSame\"];\r\n }\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n this.activeTab = 0;\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.tempRemoveOverlapSame = this.removeOverlapSame;\r\n this.removeOverlap = false;\r\n this.removeOverlapSame = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n this.removeOverlapSame = this.tempRemoveOverlapSame;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n if (this.activeTab === 1) {\r\n if (typeof this.updateObjectMode === \"function\") {\r\n this.updateObjectMode(true);\r\n }\r\n }\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n getValidatedRegions(regions) {\r\n let validatedRegions = regions.map((p) => {\r\n return [\r\n Math.max(0, Math.min(this.ome.sizeX, p[0])),\r\n Math.max(0, Math.min(this.ome.sizeY, p[1])),\r\n ];\r\n });\r\n return validatedRegions;\r\n }\r\n\r\n /** Edits the position and size of a ROI using its new coordinates.\r\n *\r\n * @param {Array} regions Array of coordninate arrays: [[x,y], ..., [x,y]]\r\n */\r\n editRoi(regions) {\r\n if (this.selectedRoi === null) return;\r\n let newRoi = null;\r\n\r\n let historyItem = [];\r\n let histId = this.structures[this.selectedIndex].id;\r\n if (regions !== null) {\r\n regions = regions.map((p) => {\r\n return [\r\n Math.max(0, Math.min(this.ome.sizeX, p[0])),\r\n Math.max(0, Math.min(this.ome.sizeY, p[1])),\r\n ];\r\n });\r\n\r\n newRoi = createRegionRoi(\r\n this.getValidatedRegions(regions),\r\n this.selectedRoi.color,\r\n this.selectedRoi.isSubtype,\r\n this.selectedRoi.subtypeName,\r\n this.selectedRoi.fullyLoaded,\r\n this.structures[this.selectedIndex].id,\r\n true // isObject = true\r\n );\r\n }\r\n if (newRoi !== null) {\r\n this.lastRoi = newRoi;\r\n this.roiLayers[this.selectedIndex].tree.insert(newRoi.treeItem);\r\n historyItem.push({ add: true, id: histId, roi: newRoi });\r\n }\r\n if (typeof this.roiLayers[this.selectedIndex] === \"undefined\") return;\r\n\r\n let layerIndex = this.roiLayers[\r\n this.selectedIndex\r\n ].layer.regionRois.findIndex((roi) => roi.uuid === this.selectedRoi.uuid);\r\n this.roiLayers[this.selectedIndex].tree.remove(this.selectedRoi.treeItem);\r\n historyItem.push({ add: false, id: histId, roi: this.selectedRoi });\r\n\r\n if (layerIndex >= 0) {\r\n if (newRoi === null) {\r\n this.roiLayers[this.selectedIndex].layer.regionRois.splice(\r\n layerIndex,\r\n 1\r\n );\r\n } else {\r\n this.roiLayers[this.selectedIndex].layer.regionRois[layerIndex] =\r\n newRoi;\r\n }\r\n }\r\n\r\n this.lastRoi = newRoi;\r\n this.selectedRoi = newRoi;\r\n this.hoveredRoi = newRoi;\r\n\r\n if (newRoi === null) {\r\n this.selectedIndex = null;\r\n }\r\n window.projectHistory.add(historyItem);\r\n }\r\n\r\n selectNexRoi = () => {\r\n const regionRois = this.roiLayers[this.selectedIndex].layer.regionRois;\r\n let roiIdx = regionRois.findIndex(\r\n (roi) => roi.uuid === this.selectedRoi.uuid\r\n );\r\n roiIdx = roiIdx + 1 >= regionRois.length ? 0 : roiIdx + 1;\r\n this.selectedRoi = regionRois[roiIdx];\r\n window.zoomToRect(this.selectedRoi.bounds);\r\n };\r\n\r\n rendererKeyDown(e) {\r\n if (this.drawMode === \"edit\" && this.selectedRoi) {\r\n let bounds = Object.assign({}, this.selectedRoi.bounds);\r\n let editRoi = false;\r\n let deleteRoi = false;\r\n switch (e.key) {\r\n case \"Tab\":\r\n this.selectNexRoi();\r\n e.preventDefault();\r\n break;\r\n case \"ArrowRight\":\r\n if (!e.shiftKey) bounds.left++;\r\n bounds.right++;\r\n editRoi = true;\r\n break;\r\n case \"ArrowLeft\":\r\n if (!e.shiftKey) bounds.left--;\r\n bounds.right--;\r\n editRoi = true;\r\n break;\r\n case \"ArrowUp\":\r\n if (!e.shiftKey) bounds.top--;\r\n bounds.bottom--;\r\n editRoi = true;\r\n break;\r\n case \"ArrowDown\":\r\n if (!e.shiftKey) bounds.top++;\r\n bounds.bottom++;\r\n editRoi = true;\r\n break;\r\n case \"Delete\":\r\n editRoi = true;\r\n deleteRoi = true;\r\n break;\r\n default:\r\n break;\r\n }\r\n if (editRoi) {\r\n let regions = null;\r\n if (\r\n bounds.left > 0 &&\r\n bounds.top > 0 &&\r\n bounds.right < this.ome.sizeX &&\r\n bounds.bottom < this.ome.sizeY\r\n ) {\r\n if (!deleteRoi) {\r\n regions = [\r\n [bounds.left, bounds.top],\r\n [bounds.right, bounds.top],\r\n [bounds.right, bounds.bottom],\r\n [bounds.left, bounds.bottom],\r\n [bounds.left, bounds.top],\r\n ];\r\n }\r\n\r\n this.editRoi(regions);\r\n }\r\n }\r\n }\r\n }\r\n\r\n setClickedRoiSelected(p, event) {\r\n let foundRoiResults = findRoi(\r\n p,\r\n this.roiLayers,\r\n this.structures,\r\n this.includeBaseROI\r\n );\r\n this.selectedIndex = foundRoiResults[0];\r\n let roi = foundRoiResults[1];\r\n if (roi && !roi.isObject) {\r\n window.showWarningSnackbar(\"Can not be edited! (no object annotation)\");\r\n this.selectedRoi = null;\r\n } else {\r\n this.selectedRoi = roi;\r\n this.lastRoi = roi;\r\n if (event.button === 2) {\r\n this.editRoi(null); //delete roi\r\n } else {\r\n this.mouseDownPosition = p;\r\n if (roi) {\r\n if (this.resizeMode !== \"\") {\r\n this.resizingStarted = this.resizeMode;\r\n }\r\n this.mouseDownRoi = roi;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Checks whether the cursor is hovering over an object.\r\n *\r\n * @param {Object} p x and y of cursor {x:, y: }\r\n */\r\n setHoveredRoi(p) {\r\n let foundRoiResults = findRoi(\r\n p,\r\n this.roiLayers,\r\n this.structures,\r\n this.includeBaseROI\r\n );\r\n this.hoveredIndex = foundRoiResults[0];\r\n let roi = foundRoiResults[1];\r\n this.hoveredRoi = roi;\r\n }\r\n\r\n /** Handeling of mouse events.\r\n *\r\n * @param {MouseEvent} event\r\n * @param {Object} p x and y of cursor {x:, y: }\r\n * @param {String} color #012DEF\r\n * @param {Bool} subtype Is the mouse over a subtype or not?\r\n * @param {String} name Name of the structure the cursor is above.\r\n * @param {Bool} positionInRoiLayer Is the cursor currently in a ROI Layer?\r\n * @param {Bool} fullyLoaded\r\n * @param {Int} parentLayer The id of the parentlayer of the structure the curson is above.\r\n */\r\n mouse(params) {\r\n let { event, p, color, subtype, name, positionInRoiLayer, fullyLoaded } =\r\n params;\r\n // Rectangle tool in object mode, selected option duplicate.\r\n if (this.activeTab === 1 && this.drawMode === \"duplicate\") {\r\n if (event.type === \"mousedown\" && event.button === 0 && this.lastRoi) {\r\n let rw = (this.lastRoi.bounds.right - this.lastRoi.bounds.left) / 2;\r\n let rh = (this.lastRoi.bounds.bottom - this.lastRoi.bounds.top) / 2;\r\n let regions = [\r\n [p.x - rw, p.y - rh],\r\n [p.x + rw, p.y - rh],\r\n [p.x + rw, p.y + rh],\r\n [p.x + rw, p.y + rh],\r\n [p.x - rw, p.y - rh],\r\n ];\r\n\r\n let drawRegion = {\r\n regions: [\r\n createRegionRoi(\r\n regions,\r\n color,\r\n subtype,\r\n name,\r\n fullyLoaded,\r\n this.structures[this.originalSelectedLayer].id,\r\n true\r\n ),\r\n ],\r\n inverted: false,\r\n };\r\n\r\n let overlapRoiLayers = [];\r\n if (this.removeOverlapSame) {\r\n overlapRoiLayers.push(this.roiLayers[this.selectedLayer]);\r\n }\r\n if (this.removeOverlap) {\r\n let siblingRoiLayers = findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n );\r\n siblingRoiLayers.map((layer) => overlapRoiLayers.push(layer));\r\n }\r\n updateLayer(\r\n this.layer,\r\n drawRegion,\r\n this.clear,\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n false,\r\n this.roiLayers[this.parentLayer],\r\n this.structures[this.originalSelectedLayer].id,\r\n overlapRoiLayers,\r\n this.clickedOnRoi,\r\n true\r\n );\r\n }\r\n }\r\n // Rectangle tool in object mode, selected option edit or draw-while-hovering-over-an-object.\r\n else if (\r\n this.activeTab === 1 &&\r\n (this.drawMode === \"edit\" ||\r\n (this.drawMode === \"draw\" &&\r\n this.hoveredRoi !== null &&\r\n this.hoveredRoi.structureId ===\r\n this.structures[this.selectedLayer].id))\r\n ) {\r\n // Click on hovered-over object\r\n if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n this.setClickedRoiSelected(p, event);\r\n }\r\n // Move hovered-over object\r\n else if (event.type === \"mousemove\") {\r\n this.setHoveredRoi(p);\r\n\r\n // move roi\r\n if (\r\n this.mouseDownPosition &&\r\n this.mouseDownRoi &&\r\n (this.mouseDownRoi.structureId ==\r\n this.structures[this.selectedLayer].id ||\r\n this.drawMode === \"edit\")\r\n ) {\r\n let deltaP = {\r\n x: this.mouseDownPosition.x - p.x,\r\n y: this.mouseDownPosition.y - p.y,\r\n };\r\n let regions = [];\r\n // Resize Object\r\n if (this.resizingStarted !== \"\") {\r\n let bounds = {\r\n left: this.resizingStarted.includes(\"left\")\r\n ? this.mouseDownRoi.bounds.left - deltaP.x\r\n : this.mouseDownRoi.bounds.left,\r\n top: this.resizingStarted.includes(\"top\")\r\n ? this.mouseDownRoi.bounds.top - deltaP.y\r\n : this.mouseDownRoi.bounds.top,\r\n right: this.resizingStarted.includes(\"right\")\r\n ? this.mouseDownRoi.bounds.right - deltaP.x\r\n : this.mouseDownRoi.bounds.right,\r\n bottom: this.resizingStarted.includes(\"bottom\")\r\n ? this.mouseDownRoi.bounds.bottom - deltaP.y\r\n : this.mouseDownRoi.bounds.bottom,\r\n };\r\n bounds.left = Math.max(0, bounds.left);\r\n bounds.top = Math.max(0, bounds.top);\r\n bounds.right = Math.min(this.ome.sizeX, bounds.right);\r\n bounds.bottom = Math.min(this.ome.sizeY, bounds.bottom);\r\n regions = [\r\n [bounds.left, bounds.top],\r\n [bounds.right, bounds.top],\r\n [bounds.right, bounds.bottom],\r\n [bounds.left, bounds.bottom],\r\n [bounds.left, bounds.top],\r\n ];\r\n }\r\n // Move object\r\n else {\r\n regions = this.mouseDownRoi.regions[0].map((point) => {\r\n return [point[0] - deltaP.x, point[1] - deltaP.y];\r\n });\r\n }\r\n // Save changes to object\r\n this.editRoi(regions);\r\n }\r\n }\r\n // Release hovered-over object\r\n if (event.type === \"mouseup\") {\r\n this.mouseDownPosition = null;\r\n this.resizingStarted = \"\";\r\n }\r\n }\r\n // Rectangle tool in area or object mode, set starting point.\r\n else if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n checkIfStructureHidden(\r\n this.structures,\r\n this.selectedLayer,\r\n subtype,\r\n name,\r\n color\r\n );\r\n this.drawLayer.regionRois = [];\r\n this.drawLayer.inverted = false;\r\n // right mouse button -> clear\r\n this.clear = event.button === 2;\r\n this.drawLayer.clear = this.clear;\r\n\r\n // update position history\r\n this.startPoint = p;\r\n this.points = [];\r\n this.points.push([p.x, p.y]);\r\n\r\n // set drawing flag\r\n this.flag = true;\r\n\r\n // check if mouse down is inside region? => exapand region\r\n if (this.removeOverlapSame) {\r\n this.clickedOnRoi = findClickedRoi(\r\n p,\r\n this.selectedLayer,\r\n this.structures,\r\n this.roiLayers,\r\n this.includeBaseROI\r\n );\r\n }\r\n }\r\n // Rectangle tool in area or object mode, set end point.\r\n else if (\r\n event.type === \"mouseup\" ||\r\n (this.flag && event.type === \"mouseleave\")\r\n ) {\r\n // release drawing flag\r\n this.flag = false;\r\n let drawRegion = {\r\n regions: [],\r\n inverted: false,\r\n };\r\n if (this.drawLayer.regionRois.length > 0) {\r\n drawRegion.regions = [this.drawLayer.regionRois[0]];\r\n\r\n let overlapRoiLayers = [];\r\n if (this.removeOverlapSame) {\r\n overlapRoiLayers.push(this.roiLayers[this.selectedLayer]);\r\n }\r\n if (this.removeOverlap) {\r\n let siblingRoiLayers = findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n );\r\n siblingRoiLayers.map((layer) => overlapRoiLayers.push(layer));\r\n }\r\n\r\n // Save last ROI for duplication\r\n if (this.activeTab === 1) {\r\n this.lastRoi =\r\n this.drawLayer.regionRois[this.drawLayer.regionRois.length - 1];\r\n }\r\n updateLayer(\r\n this.layer,\r\n drawRegion,\r\n this.clear,\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n false,\r\n this.roiLayers[this.parentLayer],\r\n this.structures[this.originalSelectedLayer].id,\r\n overlapRoiLayers,\r\n this.clickedOnRoi,\r\n this.activeTab === 1 // defines if it should be treated as an object\r\n );\r\n\r\n this.drawLayer.regionRois = [];\r\n }\r\n }\r\n // Rectangle tool in area or object mode, create rectangle by dragging.\r\n else if (event.type === \"mousemove\") {\r\n if (this.flag) {\r\n let points = [];\r\n points.push([this.startPoint.x, this.startPoint.y]);\r\n points.push([p.x, this.startPoint.y]);\r\n points.push([p.x, p.y]);\r\n points.push([this.startPoint.x, p.y]);\r\n points.push([this.startPoint.x, this.startPoint.y]);\r\n\r\n let drawRegion = {\r\n regions: [points],\r\n inverted: false,\r\n };\r\n\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n updateDrawLayer(\r\n this.drawLayer,\r\n drawRegion,\r\n false,\r\n color,\r\n subtype,\r\n name\r\n );\r\n }\r\n // Check if currently hovering over an object.\r\n else {\r\n this.setHoveredRoi(p);\r\n }\r\n }\r\n }\r\n\r\n highlightRoi(ctx, roi) {\r\n // do not highlight if not in selected structure in draw mode\r\n // do not highlight if not object annotation\r\n // highlight all object annotations if in edit mode\r\n if (\r\n roi &&\r\n roi.isObject &&\r\n (this.drawMode === \"edit\" ||\r\n roi.structureId == this.structures[this.selectedLayer].id)\r\n ) {\r\n ctx.globalAlpha = 0.2;\r\n ctx.fillStyle = roi.isObject ? \"#000000\" : \"#ff0000\";\r\n ctx.beginPath();\r\n for (let points of roi.getRectRegions()) {\r\n if (points[points.length - 2]) {\r\n ctx.moveTo(\r\n points[points.length - 2][0],\r\n points[points.length - 2][1]\r\n );\r\n for (let i = 0; i < points.length; i++) {\r\n ctx.lineTo(points[i][0], points[i][1]);\r\n }\r\n }\r\n }\r\n ctx.closePath();\r\n ctx.fill();\r\n ctx.globalAlpha = 1.0;\r\n }\r\n }\r\n\r\n highlightResizeCorner(ctx, roi, p) {\r\n // do not highlight resize corner if not in selected structure in draw mode\r\n // do not highlight resize corner if not object annotation\r\n // highlight resize corner for all object annotations if in edit mode\r\n if (\r\n roi &&\r\n roi.isObject &&\r\n (this.drawMode === \"edit\" ||\r\n roi.structureId == this.structures[this.selectedLayer].id)\r\n ) {\r\n ctx.globalAlpha = 1.0;\r\n ctx.fillStyle = \"#0000ff\";\r\n let rb = roi.bounds;\r\n let scaleFactor = 1 / ctx.getTransform().a;\r\n let cornerSize = 20 * scaleFactor;\r\n let roiWidth = roi.bounds.right - roi.bounds.left;\r\n let roiHeight = roi.bounds.bottom - roi.bounds.top;\r\n let x = roi.bounds.left;\r\n let y = roi.bounds.top;\r\n\r\n //no resizing if corners would hinder translation\r\n if (cornerSize * 2.5 > roiWidth || cornerSize * 2.5 > roiHeight) {\r\n this.resizeMode = \"\";\r\n return;\r\n }\r\n\r\n //if mouse in bottom right corner\r\n if (\r\n !(\r\n p.x < rb.left ||\r\n p.x > rb.left + cornerSize ||\r\n p.y < rb.top ||\r\n p.y > rb.top + cornerSize\r\n )\r\n ) {\r\n this.resizeMode = \"top_left\";\r\n } else if (\r\n !(\r\n p.x < rb.right - cornerSize ||\r\n p.x > rb.right ||\r\n p.y < rb.top ||\r\n p.y > rb.top + cornerSize\r\n )\r\n ) {\r\n this.resizeMode = \"top_right\";\r\n x = rb.right - cornerSize;\r\n } else if (\r\n !(\r\n p.x < rb.right - cornerSize ||\r\n p.x > rb.right ||\r\n p.y < rb.bottom - cornerSize ||\r\n p.y > rb.bottom\r\n )\r\n ) {\r\n this.resizeMode = \"bottom_right\";\r\n x = rb.right - cornerSize;\r\n y = rb.bottom - cornerSize;\r\n } else if (\r\n !(\r\n p.x < rb.left ||\r\n p.x > rb.left + cornerSize ||\r\n p.y < rb.bottom - cornerSize ||\r\n p.y > rb.bottom\r\n )\r\n ) {\r\n this.resizeMode = \"bottom_left\";\r\n y = rb.bottom - cornerSize;\r\n } else {\r\n //mouse in right bottom corner\r\n this.resizeMode = \"\";\r\n return;\r\n }\r\n let points = [\r\n [x, y],\r\n [x + cornerSize, y],\r\n [x + cornerSize, y + cornerSize],\r\n [x, y + cornerSize],\r\n [x, y],\r\n ];\r\n ctx.beginPath();\r\n ctx.moveTo(points[0], points[1]);\r\n for (let i = 0; i < points.length; i++) {\r\n ctx.lineTo(points[i][0], points[i][1]);\r\n }\r\n ctx.closePath();\r\n ctx.fill();\r\n ctx.globalAlpha = 1.0;\r\n }\r\n }\r\n\r\n drawCustomCursor(ctx, mousePosition) {\r\n if (\r\n (this.drawMode === \"draw\" && this.hoveredRoi === null) ||\r\n (this.drawMode === \"draw\" &&\r\n this.hoveredRoi &&\r\n this.hoveredRoi.structureId !==\r\n this.structures[this.selectedLayer].id) ||\r\n this.activeTab === 0\r\n ) {\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n ctx.beginPath();\r\n ctx.moveTo(mousePosition.x, 0);\r\n ctx.lineTo(mousePosition.x, 1000000);\r\n ctx.moveTo(0, mousePosition.y);\r\n ctx.lineTo(1000000, mousePosition.y);\r\n ctx.stroke();\r\n ctx.closePath();\r\n } else if (this.lastRoi && this.drawMode === \"duplicate\") {\r\n let p = mousePosition;\r\n let rw = (this.lastRoi.bounds.right - this.lastRoi.bounds.left) / 2;\r\n let rh = (this.lastRoi.bounds.bottom - this.lastRoi.bounds.top) / 2;\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n ctx.moveTo(\r\n Math.max(0, Math.min(this.ome.sizeX, p.x - rw)),\r\n Math.max(0, Math.min(this.ome.sizeY, p.y - rh))\r\n );\r\n ctx.lineTo(\r\n Math.max(0, Math.min(this.ome.sizeX, p.x + rw)),\r\n Math.max(0, Math.min(this.ome.sizeY, p.y - rh))\r\n );\r\n ctx.lineTo(\r\n Math.max(0, Math.min(this.ome.sizeX, p.x + rw)),\r\n Math.max(0, Math.min(this.ome.sizeY, p.y + rh))\r\n );\r\n ctx.lineTo(\r\n Math.max(0, Math.min(this.ome.sizeX, p.x - rw)),\r\n Math.max(0, Math.min(this.ome.sizeY, p.y + rh))\r\n );\r\n //ctx.lineTo(p.x + rw, p.y - rh);\r\n ctx.closePath();\r\n ctx.stroke();\r\n }\r\n\r\n if (this.activeTab === 1) {\r\n this.highlightRoi(ctx, this.selectedRoi);\r\n this.highlightRoi(ctx, this.hoveredRoi);\r\n this.highlightResizeCorner(ctx, this.hoveredRoi, mousePosition);\r\n }\r\n }\r\n\r\n handleChange = () => {\r\n this.activeTab = this.activeTab === 0 ? 1 : 0;\r\n if (typeof this.updateObjectMode === \"function\") {\r\n this.updateObjectMode(this.activeTab === 1);\r\n }\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
    \r\n {this.name}:\r\n \r\n \r\n \r\n \r\n \r\n {this.activeTab === 0 && (\r\n (this.removeOverlap = e)}\r\n onChangeRemoveOverlapSame={(e) => (this.removeOverlapSame = e)}\r\n />\r\n )}\r\n {this.activeTab === 1 && (\r\n \r\n \r\n {\r\n this.drawMode = e.target.value;\r\n window.forceSidebarUpdate();\r\n }}\r\n >\r\n }\r\n label=\"Draw Object\"\r\n />\r\n }\r\n label=\"Edit Object (arrows, arrows+Shift, Tab)\"\r\n />\r\n }\r\n label=\"Duplicate last object size\"\r\n disabled={typeof this.lastRoi === \"undefined\"}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default RectangleTool;\r\n","import {\r\n updateDrawLayer,\r\n updateLayer,\r\n findSiblingRoiLayers,\r\n findSameLayer,\r\n findClickedRoi,\r\n lineArrayBuffer,\r\n distance,\r\n} from \"../../utils/PolygonUtil\";\r\nimport { Button } from \"@mui/material\";\r\nimport { Typography, FormControl, FormLabel, Slider } from \"@mui/material\";\r\nimport Tool from \"./Tool\";\r\nimport React from \"react\";\r\nimport OverlapConfigForm from \"./ConfigForms/OverlapConfigForm\";\r\n\r\nclass RegionGrabCutTool extends Tool {\r\n toolName = \"Region Grab Cut\";\r\n noConfig = false;\r\n flag = false;\r\n removeOverlap = null;\r\n removeOverlapSame = null;\r\n tempRemoveOverlap = null;\r\n tempRemoveOverlapSame = null;\r\n threshold = 30;\r\n penRadius = 5;\r\n penOpacity = 1;\r\n minPenRadius = 1;\r\n maxPenRadius = 50;\r\n line = [];\r\n lines = [];\r\n linePoly = {};\r\n matline = [];\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.isBrightfield = obj.ome.channels[0].type === \"brightfield\";\r\n this.ctx = obj.ctx; //context\r\n this.canvas = obj.ctx.canvas; //canvas\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedLayer = layerResults[0];\r\n this.parentLayer = layerResults[1];\r\n this.originalSelectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n\r\n const project = obj.viewerConfig_project;\r\n if (this.removeOverlap === null) {\r\n this.removeOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.tempRemoveOverlap === null) {\r\n this.tempRemoveOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.removeOverlapSame === null) {\r\n this.removeOverlapSame = project.projectProperties[\"PreventOverlapSame\"];\r\n }\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.tempRemoveOverlapSame = this.removeOverlapSame;\r\n this.removeOverlap = false;\r\n this.removeOverlapSame = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n this.removeOverlapSame = this.tempRemoveOverlapSame;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n getPosition = () => {\r\n return {\r\n x: -this.ctx.getTransform().e,\r\n y: -this.ctx.getTransform().f,\r\n };\r\n };\r\n\r\n fitPointToImage = (p) => {\r\n if (this.ctx) {\r\n this.scale = this.ctx.getTransform().a;\r\n }\r\n return {\r\n x: parseInt(p.x * this.scale - this.getPosition().x, 10),\r\n y: parseInt(p.y * this.scale - this.getPosition().y, 10),\r\n };\r\n };\r\n\r\n getPolygonsWithOpenCV = () => {\r\n let p1 = this.fitPointToImage(this.startPoint);\r\n let p2 = this.fitPointToImage(this.endPoint);\r\n let tlp = { x: Math.min(p1.x, p2.x), y: Math.min(p1.y, p2.y) };\r\n\r\n let w = Math.abs(p1.x - p2.x);\r\n let h = Math.abs(p1.y - p2.y);\r\n\r\n const cv = window.cv;\r\n let ctx = this.canvas.getContext(\"2d\");\r\n let imageData = ctx.getImageData(\r\n 0,\r\n 0,\r\n this.canvas.width,\r\n this.canvas.height\r\n );\r\n\r\n let resultImageData = imageData;\r\n let src = cv.matFromImageData(resultImageData);\r\n let rect1 = new cv.Rect(tlp.x, tlp.y, w, h);\r\n src = src.roi(rect1);\r\n let resizeMultiplier = 200 / w;\r\n if (resizeMultiplier > 1) {\r\n resizeMultiplier = 1;\r\n }\r\n let originalSize = new cv.Size(w, h);\r\n w = parseInt(w * resizeMultiplier, 10);\r\n h = parseInt(h * resizeMultiplier, 10);\r\n let workingSize = new cv.Size(w, h);\r\n cv.resize(src, src, workingSize, 0, 0, cv.INTER_AREA);\r\n\r\n let rect = new cv.Rect(2, 2, w - 4, h - 4);\r\n let point1 = new cv.Point(rect.x, rect.y);\r\n let point2 = new cv.Point(rect.x + rect.width, rect.y + rect.height);\r\n\r\n cv.cvtColor(src, src, cv.COLOR_RGBA2RGB, 0);\r\n let mask = cv.Mat.zeros(h, w, cv.CV_8U);\r\n let obvFgColor = new cv.Scalar(cv.GC_FGD);\r\n let obvBgColor = new cv.Scalar(cv.GC_BGD);\r\n let posFgColor = new cv.Scalar(cv.GC_PR_FGD);\r\n let fgP1 = new cv.Point(parseInt(w / 2, 10) - 10, parseInt(h / 2, 10) - 10);\r\n let fgP2 = new cv.Point(parseInt(w / 2, 10) + 10, parseInt(h / 2, 10) + 10);\r\n //todo: another rect with obv bg - spectated rect\r\n cv.rectangle(mask, point1, point2, posFgColor, -1); // whole image (todo: drawn rect)\r\n cv.rectangle(mask, fgP1, fgP2, obvFgColor, -1); //small rectangle in the middle\r\n //todo draw obv bg / draw obv fg\r\n\r\n let wDrawn = Math.abs(this.startPoint.x - this.endPoint.x);\r\n let scale = wDrawn / w;\r\n\r\n for (let p of this.matline) {\r\n let point = this.fitPointToImage({ x: p.x, y: p.y });\r\n let center = new cv.Point(\r\n (point.x - tlp.x) * resizeMultiplier,\r\n (point.y - tlp.y) * resizeMultiplier\r\n );\r\n let color = p.color == \"#ff0000\" ? obvBgColor : obvFgColor;\r\n cv.circle(mask, center, parseInt(this.penRadius / scale, 10), color, -1);\r\n }\r\n\r\n let bgdModel = new cv.Mat();\r\n let fgdModel = new cv.Mat();\r\n cv.grabCut(src, mask, rect, bgdModel, fgdModel, 1, cv.GC_INIT_WITH_MASK);\r\n // // draw foreground\r\n for (let i = 0; i < src.rows; i++) {\r\n for (let j = 0; j < src.cols; j++) {\r\n if (mask.ucharPtr(i, j)[0] == 0 || mask.ucharPtr(i, j)[0] == 2) {\r\n src.ucharPtr(i, j)[0] = 0;\r\n src.ucharPtr(i, j)[1] = 0;\r\n src.ucharPtr(i, j)[2] = 0;\r\n } else {\r\n src.ucharPtr(i, j)[0] = 255;\r\n src.ucharPtr(i, j)[1] = 255;\r\n src.ucharPtr(i, j)[2] = 255;\r\n }\r\n }\r\n }\r\n\r\n // // show mask for debuggins\r\n // cv.imshow(\"outputCanvas\", testmask);\r\n\r\n cv.resize(src, src, originalSize, 0, 0, cv.INTER_AREA);\r\n cv.cvtColor(src, src, cv.COLOR_RGBA2GRAY, 0);\r\n\r\n cv.threshold(src, src, 0, 200, cv.THRESH_BINARY);\r\n let contours = new cv.MatVector();\r\n let hierarchy = new cv.Mat();\r\n\r\n cv.findContours(\r\n src,\r\n contours,\r\n hierarchy,\r\n cv.RETR_CCOMP,\r\n cv.CHAIN_APPROX_SIMPLE\r\n );\r\n\r\n let polygons = [];\r\n if (this.ctx) {\r\n this.scale = this.ctx.getTransform().a;\r\n }\r\n for (let i = 0; i < contours.size(); ++i) {\r\n let cnt = contours.get(i);\r\n if (cv.contourArea(cnt) < 100) continue;\r\n let polygon = [];\r\n // console.log(cnt);\r\n // let counter = 0;\r\n for (let i = 0; i < cnt.rows; i++) {\r\n let point = new cv.Point(cnt.data32S[i * 2], cnt.data32S[i * 2 + 1]);\r\n polygon.push([\r\n (tlp.x + point.x + this.getPosition().x) / this.scale,\r\n (tlp.y + point.y + this.getPosition().y) / this.scale,\r\n ]);\r\n }\r\n polygons.push(polygon);\r\n }\r\n\r\n // cleanup\r\n mask.delete();\r\n bgdModel.delete();\r\n fgdModel.delete();\r\n src.delete();\r\n\r\n return polygons;\r\n // return [];\r\n };\r\n\r\n removeCenteredObject = () => {\r\n if (this.startPoint === null || this.endPoint === null) return;\r\n let centerPoint = {\r\n x: parseInt((this.startPoint.x + this.endPoint.x) / 2),\r\n y: parseInt((this.startPoint.y + this.endPoint.y) / 2),\r\n };\r\n let centeredRoi = findClickedRoi(\r\n centerPoint,\r\n this.selectedLayer,\r\n this.structures,\r\n this.roiLayers,\r\n this.includeBaseROI\r\n );\r\n let roiIdx = this.roiLayers[this.selectedLayer].layer.regionRois.findIndex(\r\n (roi) => roi.uuid === centeredRoi.uuid\r\n );\r\n if (roiIdx >= 0) {\r\n this.roiLayers[this.selectedLayer].layer.regionRois.splice(roiIdx, 1);\r\n this.roiLayers[this.selectedLayer].tree.clear();\r\n this.roiLayers[this.selectedLayer].tree.load(\r\n this.roiLayers[this.selectedLayer].layer.regionRois.map(\r\n (item) => item.treeItem\r\n )\r\n );\r\n }\r\n };\r\n\r\n addPoint = (event, p) => {\r\n let eventPoint = { x: event.clientX, y: event.clientY };\r\n if (this.line.length < 3) {\r\n this.line.push([p.x, p.y]);\r\n this.lastEventPoint = eventPoint;\r\n } else {\r\n const dist = distance(this.lastEventPoint, eventPoint);\r\n if (dist < 10) {\r\n this.line[this.line.length - 1] = [p.x, p.y];\r\n } else {\r\n this.line.push([p.x, p.y]);\r\n this.lastEventPoint = eventPoint;\r\n }\r\n }\r\n };\r\n\r\n updateDrawing = () => {\r\n this.renderer.drawVisibleImage();\r\n\r\n this.polygons = this.getPolygonsWithOpenCV();\r\n\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n this.drawRegion = {\r\n regions: this.polygons.map((polygon) => {\r\n return polygon;\r\n }),\r\n inverted: false,\r\n };\r\n this.drawLayer.clear = this.clear;\r\n updateDrawLayer(\r\n this.drawLayer,\r\n this.drawRegion,\r\n false,\r\n this.color,\r\n this.subtype,\r\n this.name\r\n );\r\n };\r\n\r\n getTopLeftPoint = () => {\r\n return {\r\n x: Math.min(this.startPoint.x, this.endPoint.x),\r\n y: Math.min(this.startPoint.y, this.endPoint.y),\r\n };\r\n };\r\n\r\n getBottomRightPoint = () => {\r\n return {\r\n x: Math.max(this.startPoint.x, this.endPoint.x),\r\n y: Math.max(this.startPoint.y, this.endPoint.y),\r\n };\r\n };\r\n\r\n mouse(params) {\r\n try {\r\n let {\r\n event,\r\n p,\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n renderer,\r\n } = params;\r\n this.color = color;\r\n this.subtype = subtype;\r\n this.name = name;\r\n this.positionInRoiLayer = positionInRoiLayer;\r\n this.fullyLoaded = fullyLoaded;\r\n this.renderer = renderer;\r\n if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n if (this.isPointOutsideRect(p)) {\r\n this.flag = true;\r\n this.startPoint = p;\r\n this.endPoint = p;\r\n this.lines = [];\r\n } else if (!this.flag) {\r\n this.lineFlag = true;\r\n this.obvColor = event.button === 0 ? \"#00ff00\" : \"#ff0000\";\r\n this.line = [[p.x, p.y]];\r\n }\r\n } else if (event.type === \"mousemove\" && (this.flag || this.lineFlag)) {\r\n if (this.isDrawingpointInsideRect(p) && this.lineFlag) {\r\n this.matline.push({\r\n x: p.x,\r\n y: p.y,\r\n color: this.obvColor,\r\n rad: this.penRadius,\r\n });\r\n this.addPoint(event, p);\r\n this.linePoly = {\r\n l: lineArrayBuffer(\r\n this.line,\r\n this.penRadius,\r\n this.ome.sizeX,\r\n this.ome.sizeY\r\n ),\r\n color: this.obvColor,\r\n };\r\n } else if (!this.lineFlag) {\r\n this.endPoint = p;\r\n }\r\n } else if (\r\n event.type === \"mouseup\" ||\r\n ((this.flag || this.lineFlag) && event.type === \"mouseleave\")\r\n ) {\r\n if (this.isPointOutsideRect(p) && this.lineFlag) {\r\n this.lineFlag = false;\r\n this.linePoly = {};\r\n } else if (this.isDrawingpointInsideRect(p)) {\r\n this.lineFlag = false;\r\n this.addPoint(event, p);\r\n this.linePoly = {\r\n l: lineArrayBuffer(\r\n this.line,\r\n this.penRadius,\r\n this.ome.sizeX,\r\n this.ome.sizeY\r\n ),\r\n color: this.obvColor,\r\n };\r\n this.lines.push(this.linePoly);\r\n this.linePoly = {};\r\n this.line = [];\r\n try {\r\n this.updateDrawing();\r\n } catch (e) {\r\n console.log(\"error:\", e);\r\n window.showWarningSnackbar(\r\n \"Error, To Close! Rectangle Not Visible\"\r\n );\r\n let tlp = this.getTopLeftPoint();\r\n let w = Math.abs(this.startPoint.x - this.endPoint.x);\r\n let h = Math.abs(this.startPoint.y - this.endPoint.y);\r\n let rect = {\r\n left: tlp.x + w * 0.25,\r\n top: tlp.y + h * 0.25,\r\n right: tlp.x + w - w * 0.25,\r\n bottom: tlp.y + h - h * 0.25,\r\n };\r\n window.zoomToRect(rect);\r\n window.forceSidebarUpdate();\r\n }\r\n } else if (this.flag) {\r\n this.clear = event.button === 2;\r\n this.endPoint = p;\r\n this.flag = false;\r\n try {\r\n this.updateDrawing();\r\n } catch (e) {\r\n console.log(\"error:\", e);\r\n window.showWarningSnackbar(\"Error, Rectangle too small\");\r\n this.drawLayer.regionRois = [];\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n console.log(\"error:\", e);\r\n window.showWarningSnackbar(\"Error, try again!\");\r\n }\r\n }\r\n\r\n isPointOutsideRect = (p) => {\r\n let isOutside = true;\r\n if (this.startPoint && this.endPoint) {\r\n let tlp = this.getTopLeftPoint();\r\n let brp = this.getBottomRightPoint();\r\n isOutside = p.x < tlp.x || p.x > brp.x || p.y < tlp.y || p.y > brp.y;\r\n }\r\n return isOutside;\r\n };\r\n\r\n isDrawingpointInsideRect = (p) => {\r\n let isInside = false;\r\n if (this.startPoint && this.endPoint) {\r\n let tlp = this.getTopLeftPoint();\r\n let brp = this.getBottomRightPoint();\r\n isInside =\r\n p.x - this.penRadius > tlp.x &&\r\n p.x + this.penRadius < brp.x &&\r\n p.y - this.penRadius > tlp.y &&\r\n p.y + this.penRadius < brp.y;\r\n }\r\n return isInside;\r\n };\r\n\r\n drawCustomCursor(ctx, mousePosition) {\r\n if (this.startPoint && this.endPoint) {\r\n const ctx = this.ctx;\r\n let topLeftPoint = this.getTopLeftPoint();\r\n let w = Math.abs(this.startPoint.x - this.endPoint.x);\r\n let h = Math.abs(this.startPoint.y - this.endPoint.y);\r\n if (ctx) {\r\n let scale = ctx.getTransform().a;\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = \"#0673C1\";\r\n ctx.lineWidth = 4 / scale;\r\n ctx.rect(topLeftPoint.x, topLeftPoint.y, w, h);\r\n ctx.stroke();\r\n ctx.strokeStyle = \"#ffffff\";\r\n ctx.lineWidth = 2 / scale;\r\n ctx.rect(topLeftPoint.x, topLeftPoint.y, w, h);\r\n ctx.stroke();\r\n ctx.closePath();\r\n\r\n ctx.beginPath();\r\n if (Object.keys(this.linePoly).length > 0) {\r\n for (let points of this.linePoly.l.geometry.coordinates) {\r\n ctx.fillStyle = this.linePoly.color;\r\n ctx.globalAlpha = 1.0;\r\n if (points[points.length - 1]) {\r\n ctx.moveTo(\r\n points[points.length - 1][0],\r\n points[points.length - 1][1]\r\n );\r\n for (let i = 0; i < points.length; i++) {\r\n ctx.lineTo(points[i][0], points[i][1]);\r\n }\r\n }\r\n }\r\n }\r\n ctx.fill();\r\n ctx.closePath();\r\n\r\n if (this.lines.length > 0) {\r\n for (let line of this.lines) {\r\n ctx.beginPath();\r\n for (let points of line.l.geometry.coordinates) {\r\n ctx.fillStyle = line.color;\r\n ctx.globalAlpha = this.penOpacity;\r\n if (points[points.length - 1]) {\r\n ctx.moveTo(\r\n points[points.length - 1][0],\r\n points[points.length - 1][1]\r\n );\r\n for (let i = 0; i < points.length; i++) {\r\n ctx.lineTo(points[i][0], points[i][1]);\r\n }\r\n }\r\n }\r\n ctx.fill(\"evenodd\");\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n ctx.globalAlpha = 1.0;\r\n }\r\n }\r\n\r\n if (this.isPointOutsideRect(mousePosition)) {\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n ctx.beginPath();\r\n ctx.moveTo(mousePosition.x, 0);\r\n ctx.lineTo(mousePosition.x, 1000000);\r\n ctx.moveTo(0, mousePosition.y);\r\n ctx.lineTo(1000000, mousePosition.y);\r\n ctx.stroke();\r\n ctx.closePath();\r\n } else if (this.isDrawingpointInsideRect(mousePosition)) {\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n ctx.beginPath();\r\n ctx.arc(mousePosition.x, mousePosition.y, this.penRadius, 0, 2 * Math.PI);\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n onKeyDown(e) {\r\n // enter key\r\n if (e.code === \"Enter\") {\r\n this.onApply();\r\n }\r\n let delta = Math.max(1, parseInt(this.penRadius * 0.05, 10));\r\n if (e.code === \"KeyS\") {\r\n this.penRadius -= delta;\r\n } else if (e.code === \"KeyW\") {\r\n this.penRadius += delta;\r\n }\r\n if (this.penRadius < this.minPenRadius) {\r\n this.penRadius = this.minPenRadius;\r\n }\r\n if (this.penRadius > this.maxPenRadius) {\r\n this.penRadius = this.maxPenRadius;\r\n }\r\n window.forceSidebarUpdate();\r\n }\r\n\r\n onApply = () => {\r\n if (!this.clear) {\r\n this.removeCenteredObject();\r\n }\r\n\r\n this.drawRegion.regions = [];\r\n if (this.drawLayer.regionRois.length > 0) {\r\n this.drawRegion.regions = this.drawLayer.regionRois;\r\n\r\n // soll der selected layer sein\r\n let overlapRoiLayers = [];\r\n if (this.removeOverlapSame) {\r\n overlapRoiLayers.push(this.roiLayers[this.selectedLayer]);\r\n }\r\n if (this.removeOverlap) {\r\n let siblingRoiLayers = findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n );\r\n siblingRoiLayers.map((layer) => overlapRoiLayers.push(layer));\r\n }\r\n\r\n updateLayer(\r\n this.layer,\r\n this.drawRegion,\r\n this.clear,\r\n this.color,\r\n this.subtype,\r\n this.name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n this.positionInRoiLayer,\r\n this.fullyLoaded,\r\n false,\r\n this.roiLayers[this.parentLayer],\r\n this.structures[this.originalSelectedLayer].id,\r\n overlapRoiLayers,\r\n this.clickedOnRoi\r\n );\r\n this.drawLayer.regionRois = [];\r\n }\r\n this.resetViuals();\r\n };\r\n\r\n resetViuals = () => {\r\n this.lines = [];\r\n this.linePoly = {};\r\n this.matline = [];\r\n this.startPoint = null;\r\n this.endPoint = null;\r\n };\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
    \r\n {/* canvas for debugging */}\r\n {/* */}\r\n {this.toolName}:\r\n \r\n \r\n {\"Threshold: \" + this.threshold}\r\n \r\n {\r\n this.threshold = v;\r\n window.forceSidebarUpdate();\r\n }}\r\n onChangeCommitted={() => {\r\n this.updateDrawing();\r\n }}\r\n />\r\n \r\n \r\n \r\n {\"Line thickness = \" + this.penRadius + \" (smaller: S, wider: W)\"}\r\n \r\n {\r\n this.penRadius = v;\r\n window.forceSidebarUpdate();\r\n }}\r\n />\r\n \r\n \r\n \r\n {\"Line opacity = \" + this.penOpacity}\r\n \r\n {\r\n this.penOpacity = v / 10;\r\n window.forceSidebarUpdate();\r\n }}\r\n />\r\n \r\n (this.removeOverlap = e)}\r\n onChangeRemoveOverlapSame={(e) => (this.removeOverlapSame = e)}\r\n />\r\n \r\n Apply [Enter]\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default RegionGrabCutTool;\r\n","import {\r\n updateDrawLayer,\r\n updateLayer,\r\n findSiblingRoiLayers,\r\n findSameLayer,\r\n} from \"../../utils/PolygonUtil\";\r\nimport OverlapConfigForm from \"./ConfigForms/OverlapConfigForm\";\r\n\r\nimport {\r\n Typography,\r\n FormControl,\r\n FormLabel,\r\n Slider,\r\n Button,\r\n} from \"@mui/material\";\r\nimport Tool from \"./Tool\";\r\nimport React from \"react\";\r\n\r\nclass RegionGrowingTool extends Tool {\r\n toolName = \"Region Growing\";\r\n noConfig = false;\r\n flag = false;\r\n threshold = 30;\r\n buffer = 0;\r\n removeOverlap = null;\r\n removeOverlapSame = null;\r\n tempRemoveOverlap = null;\r\n tempRemoveOverlapSame = null;\r\n\r\n setLayer(obj) {\r\n this.ctx = obj.ctx; //context\r\n this.canvas = obj.ctx.canvas; //canvas\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedLayer = layerResults[0];\r\n this.parentLayer = layerResults[1];\r\n this.originalSelectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n this.scale = this.ctx ? this.ctx.getTransform().a : 1;\r\n\r\n const project = obj.viewerConfig_project;\r\n if (this.removeOverlap === null) {\r\n this.removeOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.tempRemoveOverlap === null) {\r\n this.tempRemoveOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.removeOverlapSame === null) {\r\n this.removeOverlapSame = project.projectProperties[\"PreventOverlapSame\"];\r\n }\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.removeOverlap = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n next4Edges(edge) {\r\n const x = edge[0];\r\n const y = edge[1];\r\n return [\r\n [x + 1, y],\r\n [x - 1, y],\r\n [x, y + 1],\r\n [x, y - 1],\r\n ];\r\n }\r\n\r\n growRegion = (image, x, y) => {\r\n let seed = [parseInt(x, 10), parseInt(y, 10)];\r\n // seed = [10, 10];\r\n const delta = parseInt(this.threshold); //delta = threshold slider\r\n const width = image.width;\r\n const height = image.height;\r\n const inputData = image.data;\r\n const outputData = new Uint8ClampedArray(new ImageData(width, height).data);\r\n const seedIdx = (seed[1] * width + seed[0]) * 4;\r\n const seedR = inputData[seedIdx];\r\n const seedG = inputData[seedIdx + 1];\r\n const seedB = inputData[seedIdx + 2];\r\n let edge = [seed];\r\n while (edge.length) {\r\n const newedge = [];\r\n for (let i = 0, ii = edge.length; i < ii; i++) {\r\n // As noted in the Raster source constructor, this function is provided\r\n // using the `lib` option. Other functions will NOT be visible unless\r\n // provided using the `lib` option.\r\n const next = this.next4Edges(edge[i]);\r\n for (let j = 0, jj = next.length; j < jj; j++) {\r\n const s = next[j][0];\r\n const t = next[j][1];\r\n if (s >= 0 && s < width && t >= 0 && t < height) {\r\n const ci = (t * width + s) * 4;\r\n const cr = inputData[ci];\r\n const cg = inputData[ci + 1];\r\n const cb = inputData[ci + 2];\r\n const ca = inputData[ci + 3];\r\n // if alpha is zero, carry on\r\n if (ca === 0) {\r\n continue;\r\n }\r\n if (\r\n Math.abs(seedR - cr) < delta &&\r\n Math.abs(seedG - cg) < delta &&\r\n Math.abs(seedB - cb) < delta\r\n ) {\r\n outputData[ci] = 255;\r\n outputData[ci + 1] = 0;\r\n outputData[ci + 2] = 0;\r\n outputData[ci + 3] = 255;\r\n newedge.push([s, t]);\r\n }\r\n // mark as visited\r\n inputData[ci + 3] = 0;\r\n }\r\n }\r\n }\r\n edge = newedge;\r\n }\r\n return { data: outputData, width: width, height: height };\r\n };\r\n\r\n getPosition = () => {\r\n return {\r\n x: -this.ctx.getTransform().e,\r\n y: -this.ctx.getTransform().f,\r\n };\r\n };\r\n\r\n getPolygonsWithOpenCV = (p) => {\r\n const cv = window.cv;\r\n let ctx = this.canvas.getContext(\"2d\");\r\n let imageData = ctx.getImageData(\r\n 0,\r\n 0,\r\n this.canvas.width,\r\n this.canvas.height\r\n );\r\n\r\n let growResult = this.growRegion(imageData, p.x, p.y);\r\n let resultImageData = new ImageData(\r\n growResult.data,\r\n this.canvas.width,\r\n this.canvas.height\r\n );\r\n let src = cv.matFromImageData(resultImageData);\r\n\r\n // let dst = new cv.Mat();\r\n let rgbaPlanes = new cv.MatVector();\r\n cv.split(src, rgbaPlanes);\r\n let R = rgbaPlanes.get(0);\r\n cv.threshold(R, R, 0, 200, cv.THRESH_BINARY);\r\n let contours = new cv.MatVector();\r\n let hierarchy = new cv.Mat();\r\n\r\n cv.findContours(\r\n R,\r\n contours,\r\n hierarchy,\r\n cv.RETR_CCOMP,\r\n cv.CHAIN_APPROX_SIMPLE\r\n );\r\n let polygons = [];\r\n for (let i = 0; i < contours.size(); ++i) {\r\n let cnt = contours.get(i);\r\n if (cv.contourArea(cnt) < 100) continue;\r\n let polygon = [];\r\n for (let i = 0; i < cnt.rows; i++) {\r\n let point = new cv.Point(cnt.data32S[i * 2], cnt.data32S[i * 2 + 1]);\r\n polygon.push([\r\n (point.x + this.getPosition().x) / this.scale,\r\n (point.y + this.getPosition().y) / this.scale,\r\n ]);\r\n }\r\n polygons.push(polygon);\r\n }\r\n\r\n // cleanup\r\n hierarchy.delete();\r\n src.delete();\r\n\r\n return polygons;\r\n };\r\n\r\n updateDrawing = (p) => {\r\n this.renderer.drawVisibleImage();\r\n const scale = this.scale;\r\n\r\n // map point to image fit corresponding pixel in visible image\r\n p = {\r\n x: parseInt(p.x * scale - this.getPosition().x, 10),\r\n y: parseInt(p.y * scale - this.getPosition().y, 10),\r\n };\r\n\r\n let polygons = this.getPolygonsWithOpenCV(p);\r\n\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n let drawRegion = {\r\n regions: polygons.map((polygon) => {\r\n return polygon;\r\n }),\r\n inverted: false,\r\n };\r\n this.drawLayer.clear = this.clear;\r\n updateDrawLayer(\r\n this.drawLayer,\r\n drawRegion,\r\n this.clear,\r\n this.color,\r\n this.subtype,\r\n this.name,\r\n this.buffer\r\n );\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n onApply = () => {\r\n // release drawing flag\r\n this.flag = false;\r\n let drawRegion = {\r\n regions: [],\r\n inverted: false,\r\n };\r\n if (this.drawLayer.regionRois.length > 0) {\r\n drawRegion.regions = this.drawLayer.regionRois;\r\n\r\n // soll der selected layer sein\r\n let overlapRoiLayers = [];\r\n if (this.removeOverlapSame) {\r\n overlapRoiLayers.push(this.roiLayers[this.selectedLayer]);\r\n }\r\n if (this.removeOverlap) {\r\n let siblingRoiLayers = findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n );\r\n siblingRoiLayers.map((layer) => overlapRoiLayers.push(layer));\r\n }\r\n\r\n updateLayer(\r\n this.layer,\r\n drawRegion,\r\n this.clear,\r\n this.color,\r\n this.subtype,\r\n this.name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n this.positionInRoiLayer,\r\n this.fullyLoaded,\r\n false,\r\n this.roiLayers[this.parentLayer],\r\n this.structures[this.originalSelectedLayer].id,\r\n overlapRoiLayers,\r\n this.clickedOnRoi\r\n );\r\n this.drawLayer.regionRois = [];\r\n window.forceSidebarUpdate();\r\n }\r\n };\r\n\r\n // triggered from Renderer, but usable from tool as well\r\n onKeyDown(event) {\r\n // enter key\r\n if (event.code === \"Enter\") {\r\n this.onApply();\r\n }\r\n }\r\n\r\n mouse(params) {\r\n try {\r\n let {\r\n event,\r\n p,\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n renderer,\r\n } = params;\r\n this.color = color;\r\n this.subtype = subtype;\r\n this.name = name;\r\n this.positionInRoiLayer = positionInRoiLayer;\r\n this.fullyLoaded = fullyLoaded;\r\n this.renderer = renderer;\r\n if (\r\n event.type === \"mouseup\" ||\r\n (this.flag && event.type === \"mouseleave\")\r\n ) {\r\n this.clear = event.button === 2;\r\n this.point = p;\r\n this.updateDrawing(p);\r\n }\r\n } catch (e) {\r\n console.log(\"error:\", e);\r\n window.showErrorSnackbar(\"Error, try again!\");\r\n }\r\n }\r\n\r\n drawCustomCursor() {\r\n const ctx = this.ctx;\r\n if (this.ctx && this.point) {\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n ctx.lineWidth = 2 / this.scale;\r\n ctx.arc(this.point.x, this.point.y, 5 / this.scale, 0, 2 * Math.PI);\r\n ctx.fillStyle = \"#0673C1\";\r\n ctx.stroke();\r\n ctx.fill();\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
    \r\n {/* canvas for debugging */}\r\n \r\n {this.toolName}:\r\n \r\n \r\n {\"Threshold: \" + this.threshold}\r\n \r\n {\r\n this.threshold = v;\r\n window.forceSidebarUpdate();\r\n }}\r\n onChangeCommitted={() => {\r\n this.updateDrawing(this.point);\r\n }}\r\n onKeyDown={(e) => this.onKeyDown(e)} //onKeyDown also triggered from Renderer\r\n />\r\n \r\n (this.removeOverlap = e)}\r\n onChangeRemoveOverlapSame={(e) => (this.removeOverlapSame = e)}\r\n />\r\n \r\n {\"Buffer: \" + this.buffer + \" px\"}\r\n \r\n {\r\n this.buffer = v;\r\n window.forceSidebarUpdate();\r\n }}\r\n onChangeCommitted={() => {\r\n this.updateDrawing(this.point);\r\n }}\r\n onKeyDown={(e) => this.onKeyDown(e)} //onKeyDown also triggered from Renderer\r\n />\r\n\r\n \r\n Apply [Enter]\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default RegionGrowingTool;\r\n","import {\r\n updateDrawLayer,\r\n updateLayer,\r\n findSiblingRoiLayers,\r\n findSameLayer,\r\n} from \"../../utils/PolygonUtil\";\r\nimport { Button } from \"@mui/material\";\r\nimport { Typography, FormControl, FormLabel, Slider } from \"@mui/material\";\r\nimport Tool from \"./Tool\";\r\nimport React from \"react\";\r\nimport OverlapConfigForm from \"./ConfigForms/OverlapConfigForm\";\r\nimport Backend from \"../../../common/utils/Backend\";\r\n\r\nconst toolStates = {\r\n idle: \"idle\",\r\n drawingRect: \"drawingRect\",\r\n analysing: \"analysing\",\r\n ready: \"ready\",\r\n};\r\n\r\nclass RegionSAMTool extends Tool {\r\n preventMiddleMousePos = true; //prevent middle mouse pos from being set, read in Renderer.jsx\r\n toolName = \"AI Segmentation Tool\";\r\n noConfig = false;\r\n removeOverlap = null;\r\n removeOverlapSame = null;\r\n tempRemoveOverlap = null;\r\n tempRemoveOverlapSame = null;\r\n penOpacity = 1;\r\n points = [];\r\n lastSamCall = null;\r\n startRectPoint = null;\r\n endRectPoint = null;\r\n toolState = toolStates.idle;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.isBrightfield = obj.ome.channels[0].type === \"brightfield\";\r\n this.ctx = obj.ctx; //context\r\n this.canvas = obj.ctx.canvas; //canvas\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedLayer = layerResults[0];\r\n this.parentLayer = layerResults[1];\r\n this.originalSelectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n this.spinloader = obj.spinloader;\r\n\r\n const project = obj.viewerConfig_project;\r\n if (this.fileId !== obj.fileId) {\r\n this.fileId = obj.fileId;\r\n this.points = [];\r\n this.resetVisuals();\r\n }\r\n this.fileId = obj.fileId;\r\n this.file = obj.project.files.find((f) => f.id === this.fileId);\r\n\r\n if (this.removeOverlap === null) {\r\n this.removeOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.tempRemoveOverlap === null) {\r\n this.tempRemoveOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.removeOverlapSame === null) {\r\n this.removeOverlapSame = project.projectProperties[\"PreventOverlapSame\"];\r\n }\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.tempRemoveOverlapSame = this.removeOverlapSame;\r\n this.removeOverlap = false;\r\n this.removeOverlapSame = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n this.removeOverlapSame = this.tempRemoveOverlapSame;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n window.forceSidebarUpdate();\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n getPosition = () => {\r\n return {\r\n x: -this.ctx.getTransform().e,\r\n y: -this.ctx.getTransform().f,\r\n };\r\n };\r\n\r\n updateToolState = (newState) => {\r\n this.toolState = newState;\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n setPolygonsWithSAM = (points = null) => {\r\n const isPreview = points !== null;\r\n if (!isPreview) {\r\n points = this.points;\r\n }\r\n this.lastSamCall = performance.now();\r\n const samData = {\r\n fileId: this.fileId,\r\n fileName: this.file?.sourcePath,\r\n scene: this.ome.scene,\r\n p1: this.startRectPoint,\r\n p2: this.endRectPoint,\r\n points: points,\r\n };\r\n\r\n this.updateToolState(toolStates.analysing);\r\n\r\n Backend.useSAM(samData).then((response) => {\r\n this.updateToolState(toolStates.ready);\r\n this.spinloader.hide();\r\n if (response.contours && response.contours.length > 0) {\r\n if (isPreview) {\r\n this.previewPolygons = response.contours;\r\n } else {\r\n this.polygons = response.contours;\r\n }\r\n this.updateDrawing();\r\n if (this.points.length === 1) {\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n });\r\n };\r\n\r\n updateDrawing = () => {\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer, also needed to reduce size\r\n if (typeof this.polygons === \"undefined\" || this.points.length === 0) {\r\n this.polygons = [];\r\n }\r\n\r\n this.drawRegion = {\r\n regions: this.polygons.map((polygon) => {\r\n return polygon;\r\n }),\r\n inverted: false,\r\n };\r\n this.drawLayer.clear = this.clear;\r\n updateDrawLayer(\r\n this.drawLayer,\r\n this.drawRegion,\r\n false,\r\n this.color,\r\n this.subtype,\r\n this.name\r\n );\r\n };\r\n\r\n getTopLeftPoint = () => {\r\n return {\r\n x: Math.min(this.startRectPoint.x, this.endRectPoint.x),\r\n y: Math.min(this.startRectPoint.y, this.endRectPoint.y),\r\n };\r\n };\r\n\r\n getBottomRightPoint = () => {\r\n return {\r\n x: Math.max(this.startRectPoint.x, this.endRectPoint.x),\r\n y: Math.max(this.startRectPoint.y, this.endRectPoint.y),\r\n };\r\n };\r\n\r\n mouse(params) {\r\n let {\r\n event,\r\n p,\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n renderer,\r\n } = params;\r\n this.color = color;\r\n this.subtype = subtype;\r\n this.name = name;\r\n this.positionInRoiLayer = positionInRoiLayer;\r\n this.fullyLoaded = fullyLoaded;\r\n this.renderer = renderer;\r\n if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n if (this.isPointOutsideRect(p)) {\r\n this.updateToolState(toolStates.drawingRect);\r\n this.startRectPoint = p;\r\n this.endRectPoint = p;\r\n this.points = [];\r\n this.previewPolygons = null;\r\n } else if (this.toolState !== toolStates.drawingRect) {\r\n this.lineFlag = true;\r\n const isForeground = event.button === 0;\r\n this.points.push({ x: p.x, y: p.y, isForeground });\r\n this.setPolygonsWithSAM();\r\n }\r\n } else if (event.type === \"mousemove\") {\r\n if (this.toolState === toolStates.drawingRect && !this.lineFlag) {\r\n this.endRectPoint = p;\r\n }\r\n if (\r\n this.lastSamCall &&\r\n performance.now() - this.lastSamCall > 300 &&\r\n this.toolState === toolStates.ready &&\r\n this.isDrawingpointInsideRect(p)\r\n ) {\r\n this.setPolygonsWithSAM([{ x: p.x, y: p.y, isForeground: true }]);\r\n }\r\n } else if (\r\n event.type === \"mouseup\" ||\r\n ((this.toolState === toolStates.drawingRect || this.lineFlag) &&\r\n event.type === \"mouseleave\")\r\n ) {\r\n if (this.isPointOutsideRect(p) && this.lineFlag) {\r\n this.lineFlag = false;\r\n } else if (this.isDrawingpointInsideRect(p)) {\r\n this.lineFlag = false;\r\n this.updateDrawing();\r\n } else if (this.toolState === toolStates.drawingRect) {\r\n this.clear = event.button === 2;\r\n\r\n this.endRectPoint = p;\r\n this.validateRect();\r\n }\r\n }\r\n }\r\n\r\n validateRect = () => {\r\n const minWidth = 100;\r\n const minHeight = 100;\r\n if (\r\n Math.abs(this.startRectPoint.x - this.endRectPoint.x) < minWidth ||\r\n Math.abs(this.startRectPoint.y - this.endRectPoint.y) < minHeight\r\n ) {\r\n this.startRectPoint = null;\r\n this.endRectPoint = null;\r\n this.updateToolState(toolStates.idle);\r\n this.resetVisuals();\r\n window.showWarningSnackbar(\"Please select a larger area\");\r\n return;\r\n }\r\n this.updateToolState(toolStates.ready);\r\n this.updateDrawing();\r\n this.spinloader.show();\r\n this.setPolygonsWithSAM([]); // init image\r\n };\r\n\r\n isPointOutsideRect = (p) => {\r\n let isOutside = true;\r\n if (this.startRectPoint && this.endRectPoint) {\r\n let tlp = this.getTopLeftPoint();\r\n let brp = this.getBottomRightPoint();\r\n isOutside = p.x < tlp.x || p.x > brp.x || p.y < tlp.y || p.y > brp.y;\r\n }\r\n return isOutside;\r\n };\r\n\r\n isDrawingpointInsideRect = (p) => {\r\n let isInside = false;\r\n if (this.startRectPoint && this.endRectPoint) {\r\n let tlp = this.getTopLeftPoint();\r\n let brp = this.getBottomRightPoint();\r\n isInside = p.x > tlp.x && p.x < brp.x && p.y > tlp.y && p.y < brp.y;\r\n }\r\n return isInside;\r\n };\r\n\r\n drawRectangle = (ctx, scale) => {\r\n if (this.startRectPoint && this.endRectPoint) {\r\n let topLeftPoint = this.getTopLeftPoint();\r\n let w = Math.abs(this.startRectPoint.x - this.endRectPoint.x);\r\n let h = Math.abs(this.startRectPoint.y - this.endRectPoint.y);\r\n if (ctx) {\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = \"#0673C1\";\r\n ctx.lineWidth = 4 / scale;\r\n ctx.rect(topLeftPoint.x, topLeftPoint.y, w, h);\r\n ctx.stroke();\r\n ctx.strokeStyle = \"#ffffff\";\r\n ctx.lineWidth = 2 / scale;\r\n ctx.rect(topLeftPoint.x, topLeftPoint.y, w, h);\r\n ctx.stroke();\r\n ctx.closePath();\r\n\r\n ctx.beginPath();\r\n ctx.fill();\r\n ctx.closePath();\r\n\r\n if (this.points.length > 0) {\r\n for (let point of this.points) {\r\n this.drawPlus(\r\n ctx,\r\n point,\r\n point.isForeground ? \"#00ff00\" : \"#ff0000\"\r\n );\r\n }\r\n }\r\n\r\n ctx.globalAlpha = 1.0;\r\n }\r\n }\r\n };\r\n\r\n drawRectangleCross = (ctx, mousePosition) => {\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n ctx.beginPath();\r\n ctx.moveTo(mousePosition.x, 0);\r\n ctx.lineTo(mousePosition.x, 1000000);\r\n ctx.moveTo(0, mousePosition.y);\r\n ctx.lineTo(1000000, mousePosition.y);\r\n ctx.stroke();\r\n ctx.closePath();\r\n };\r\n\r\n drawPlus = (ctx, p, color) => {\r\n const scale = 1 / ctx.getTransform().a;\r\n const radius = 10 * scale;\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = color;\r\n ctx.lineWidth = 2 * scale;\r\n ctx.moveTo(p.x - radius, p.y);\r\n ctx.lineTo(p.x + radius, p.y);\r\n ctx.moveTo(p.x, p.y - radius);\r\n ctx.lineTo(p.x, p.y + radius);\r\n ctx.stroke();\r\n ctx.closePath();\r\n };\r\n\r\n // previewPolygons: [[x1, y1], [x2, y2], ... [xn, yn ]]\r\n drawPreviewPolygon = (ctx) => {\r\n if (this.points.length === 0 && this.previewPolygons) {\r\n const poly = this.previewPolygons[0];\r\n\r\n ctx.beginPath();\r\n\r\n ctx.moveTo(poly[0][0], poly[0][1]);\r\n for (let i = 1; i < poly.length; i++) {\r\n const [x, y] = poly[i];\r\n ctx.lineTo(x, y);\r\n }\r\n\r\n // Close the path to form a closed polygon and fill it with a semi-transparent color\r\n ctx.fillStyle = \"rgba(0, 0, 0, 0.5)\";\r\n ctx.fill();\r\n ctx.closePath();\r\n }\r\n };\r\n\r\n drawPoligonOutline = (ctx) => {\r\n if (this.polygons?.length > 0) {\r\n const scale = ctx.getTransform().a;\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.lineWidth = 2 / scale;\r\n const poly = this.polygons[0];\r\n ctx.moveTo(poly[0][0], poly[0][1]);\r\n for (let i = 1; i < poly.length; i++) {\r\n const [x, y] = poly[i];\r\n ctx.lineTo(x, y);\r\n }\r\n\r\n // Draw the polygon with the desired color\r\n ctx.lineWidth = 2 / scale;\r\n ctx.strokeStyle = this.color;\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n };\r\n\r\n drawCustomCursor(ctx, mousePosition) {\r\n const scale = ctx.getTransform().a;\r\n this.drawRectangle(ctx, scale);\r\n\r\n if (this.isPointOutsideRect(mousePosition)) {\r\n this.drawRectangleCross(ctx, mousePosition);\r\n } else if (this.isDrawingpointInsideRect(mousePosition)) {\r\n this.drawPlus(\r\n ctx,\r\n mousePosition,\r\n this.isBrightfield ? \"#000000\" : \"#ffffff\"\r\n );\r\n }\r\n this.drawPreviewPolygon(ctx);\r\n this.drawPoligonOutline(ctx);\r\n }\r\n\r\n onKeyDown(e) {\r\n if (e.code === \"Enter\") {\r\n this.onApply();\r\n return;\r\n }\r\n if (e.code === \"Escape\") {\r\n this.onCancel();\r\n return;\r\n }\r\n window.forceSidebarUpdate();\r\n }\r\n\r\n onApply = () => {\r\n this.drawRegion.regions = [];\r\n if (this.drawLayer.regionRois.length > 0) {\r\n this.drawRegion.regions = this.drawLayer.regionRois;\r\n\r\n let overlapRoiLayers = [];\r\n if (this.removeOverlapSame) {\r\n overlapRoiLayers.push(this.roiLayers[this.selectedLayer]);\r\n }\r\n if (this.removeOverlap) {\r\n let siblingRoiLayers = findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n );\r\n siblingRoiLayers.map((layer) => overlapRoiLayers.push(layer));\r\n }\r\n\r\n updateLayer(\r\n this.layer,\r\n this.drawRegion,\r\n this.clear,\r\n this.color,\r\n this.subtype,\r\n this.name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n this.positionInRoiLayer,\r\n this.fullyLoaded,\r\n false,\r\n this.roiLayers[this.parentLayer],\r\n this.structures[this.originalSelectedLayer].id,\r\n overlapRoiLayers,\r\n this.clickedOnRoi\r\n );\r\n this.drawLayer.regionRois = [];\r\n }\r\n this.resetVisuals();\r\n };\r\n\r\n onCancel = () => {\r\n this.resetVisuals();\r\n };\r\n\r\n resetVisuals = () => {\r\n if (this.points.length === 0) {\r\n this.startRectPoint = null;\r\n this.endRectPoint = null;\r\n this.updateToolState(toolStates.idle);\r\n }\r\n this.points = [];\r\n this.polygons = [];\r\n this.drawLayer.regionRois = [];\r\n this.drawRegion = {\r\n regions: [],\r\n inverted: false,\r\n };\r\n this.previewPolygons = null;\r\n updateDrawLayer(\r\n this.drawLayer,\r\n this.drawRegion,\r\n false,\r\n this.color,\r\n this.subtype,\r\n this.name\r\n );\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n exit() {}\r\n\r\n setRectWholeScene = () => {\r\n this.startRectPoint = { x: 0, y: 0 };\r\n this.endRectPoint = { x: this.ome.sizeX, y: this.ome.sizeY };\r\n this.spinloader.show();\r\n this.setPolygonsWithSAM([]);\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n renderConfiguration() {\r\n return (\r\n
    \r\n {this.toolName}:\r\n \r\n \r\n {\"Line opacity = \" + this.penOpacity}\r\n \r\n {\r\n this.penOpacity = v / 10;\r\n window.forceSidebarUpdate();\r\n }}\r\n />\r\n \r\n (this.removeOverlap = e)}\r\n onChangeRemoveOverlapSame={(e) => (this.removeOverlapSame = e)}\r\n />\r\n \r\n Set Rectangle for whole Image\r\n \r\n \r\n \r\n Apply [Enter]\r\n \r\n \r\n Cancel [Esc]\r\n \r\n
    \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default RegionSAMTool;\r\n","import React from \"react\";\r\nimport {\r\n updateDrawLayer,\r\n updateLayer,\r\n findSiblingRoiLayers,\r\n findSameLayer,\r\n findClickedRoi,\r\n getExterior,\r\n checkIfStructureHidden,\r\n distance,\r\n} from \"../../utils/PolygonUtil\";\r\nimport { Typography } from \"@mui/material\";\r\nimport Tool from \"./Tool\";\r\nimport OverlapConfigForm from \"./ConfigForms/OverlapConfigForm\";\r\n\r\nclass RegionTool extends Tool {\r\n name = \"Region\";\r\n noConfig = false;\r\n flag = false;\r\n downScale = 2;\r\n points = [];\r\n removeOverlap = null;\r\n removeOverlapSame = null;\r\n tempRemoveOverlap = null;\r\n tempRemoveOverlapSame = null;\r\n useNodeDrawingMode = null;\r\n tempUseNodeDrawingMode = null;\r\n\r\n setLayer(obj) {\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedLayer = layerResults[0];\r\n this.parentLayer = layerResults[1];\r\n this.originalSelectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n\r\n const project = obj.viewerConfig_project;\r\n if (this.removeOverlap === null) {\r\n this.removeOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.tempRemoveOverlap === null) {\r\n this.tempRemoveOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.removeOverlapSame === null) {\r\n this.removeOverlapSame = project.projectProperties[\"PreventOverlapSame\"];\r\n }\r\n if (this.useNodeDrawingMode === null) {\r\n this.useNodeDrawingMode = project.projectProperties[\"NodeDrawingMode\"]\r\n ? true\r\n : false;\r\n }\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.tempRemoveOverlapSame = this.removeOverlapSame;\r\n this.removeOverlap = false;\r\n this.removeOverlapSame = false;\r\n this.tempUseNodeDrawingMode = this.useNodeDrawingMode;\r\n this.useNodeDrawingMode = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n this.removeOverlapSame = this.tempRemoveOverlapSame;\r\n this.useNodeDrawingMode = this.tempUseNodeDrawingMode;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n updateDrawing(color, subtype, name, positionInRoiLayer, fullyLoaded) {\r\n let drawRegion = {\r\n regions: [],\r\n inverted: false,\r\n };\r\n if (this.drawLayer.regionRois.length > 0) {\r\n drawRegion.regions = this.drawLayer.regionRois;\r\n\r\n // soll der selected layer sein\r\n let overlapRoiLayers = [];\r\n if (this.removeOverlapSame) {\r\n overlapRoiLayers.push(this.roiLayers[this.selectedLayer]);\r\n }\r\n if (this.removeOverlap) {\r\n let siblingRoiLayers = findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n );\r\n siblingRoiLayers.map((layer) => overlapRoiLayers.push(layer));\r\n }\r\n\r\n updateLayer(\r\n this.layer,\r\n drawRegion,\r\n this.clear,\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n false,\r\n this.roiLayers[this.parentLayer],\r\n this.structures[this.originalSelectedLayer].id,\r\n overlapRoiLayers,\r\n this.clickedOnRoi\r\n );\r\n this.drawLayer.regionRois = [];\r\n }\r\n }\r\n\r\n addPoint = (event, p) => {\r\n let eventPoint = { x: event.clientX, y: event.clientY };\r\n if (this.points.length < 3 || this.useNodeDrawingMode) {\r\n this.points.push([p.x, p.y]);\r\n this.lastEventPoint = eventPoint;\r\n } else {\r\n const dist = distance(this.lastEventPoint, eventPoint);\r\n if (dist < 10) {\r\n this.points[this.points.length - 1] = [p.x, p.y];\r\n } else {\r\n this.points.push([p.x, p.y]);\r\n this.lastEventPoint = eventPoint;\r\n }\r\n }\r\n };\r\n\r\n mouse(params) {\r\n let {\r\n event,\r\n p,\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n parentIdx,\r\n } = params;\r\n let parentLayer = parentIdx;\r\n if (this.useNodeDrawingMode) {\r\n if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n if (this.flag) {\r\n if (\r\n (this.clear && event.button === 2) ||\r\n (!this.clear && event.button === 0)\r\n ) {\r\n this.addPointToDrawLayer(event, p, color, subtype);\r\n } else {\r\n this.applyDrawLayer(\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n parentLayer\r\n );\r\n }\r\n } else {\r\n this.initDrawing(subtype, name, color, event, p);\r\n }\r\n }\r\n return;\r\n }\r\n if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n this.initDrawing(subtype, name, color, event, p);\r\n return;\r\n }\r\n\r\n if (event.type === \"mouseup\") {\r\n this.applyDrawLayer(\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n parentLayer\r\n );\r\n return;\r\n }\r\n if (this.flag && event.buttons !== 1 && event.buttons !== 2) {\r\n this.flag = false;\r\n this.drawLayer.regionRois = [];\r\n // this.drawLayer.coordinates = [];\r\n return;\r\n }\r\n if (event.type === \"mousemove\") {\r\n if (this.flag) {\r\n this.addPointToDrawLayer(event, p, color, subtype);\r\n }\r\n }\r\n }\r\n\r\n initDrawing = (subtype, name, color, event, p) => {\r\n checkIfStructureHidden(\r\n this.structures,\r\n this.selectedLayer,\r\n subtype,\r\n name,\r\n color\r\n );\r\n this.drawLayer.regionRois = [];\r\n this.drawLayer.inverted = false;\r\n // right mouse button -> clear\r\n this.clear = event.button === 2;\r\n this.drawLayer.clear = this.clear;\r\n\r\n // update position history\r\n this.points = [];\r\n this.points.push([p.x, p.y]);\r\n\r\n // set drawing flag\r\n this.flag = true;\r\n\r\n // check if mouse down is inside region? => exapand region\r\n if (this.removeOverlapSame) {\r\n this.clickedOnRoi = findClickedRoi(\r\n p,\r\n this.selectedLayer,\r\n this.structures,\r\n this.roiLayers,\r\n this.includeBaseROI\r\n );\r\n }\r\n };\r\n\r\n addPointToDrawLayer = (event, p, color, subtype) => {\r\n this.addPoint(event, p);\r\n\r\n let drawRegion = {\r\n regions: [this.points],\r\n inverted: false,\r\n };\r\n drawRegion = getExterior(drawRegion);\r\n\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n updateDrawLayer(this.drawLayer, drawRegion, false, color, subtype, name);\r\n };\r\n\r\n replaceLastPointInDrawLayer = (event, p, color, subtype) => {\r\n if (this.points.length === 1) {\r\n this.addPointToDrawLayer(event, p, color, subtype);\r\n return;\r\n }\r\n if (this.points.length > 1) {\r\n this.points.pop();\r\n this.addPointToDrawLayer(event, p, color, subtype);\r\n }\r\n };\r\n\r\n applyDrawLayer = (\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n parentLayer\r\n ) => {\r\n // release drawing flag\r\n this.flag = false;\r\n this.points = [];\r\n this.updateDrawing(\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n parentLayer\r\n );\r\n };\r\n\r\n drawCustomCursor(ctx, mousePosition, scale) {\r\n // no custom cursor\r\n if (ctx) {\r\n if (this.useNodeDrawingMode && this.points.length > 0) {\r\n const p1 = this.points[this.points.length - 1];\r\n const p2 = [mousePosition.x, mousePosition.y];\r\n const p3 = this.points[0];\r\n ctx.lineWidth = 2 / scale;\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = \"#000000\";\r\n ctx.moveTo(p1[0], p1[1]);\r\n ctx.lineTo(p2[0], p2[1]);\r\n ctx.lineTo(p3[0], p3[1]);\r\n if (this.points.length == 2) {\r\n ctx.lineTo(p1[0], p1[1]);\r\n }\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n }\r\n }\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
    \r\n {this.name}:\r\n (this.useNodeDrawingMode = e)}\r\n onChangeRemoveOverlap={(e) => (this.removeOverlap = e)}\r\n onChangeRemoveOverlapSame={(e) => (this.removeOverlapSame = e)}\r\n />\r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default RegionTool;\r\n","import {\r\n updateLayer,\r\n findSiblingRoiLayers,\r\n findSameLayer,\r\n createRegionRoi,\r\n pointInside,\r\n} from \"../../utils/PolygonUtil\";\r\n\r\nimport {\r\n Typography,\r\n FormControl,\r\n FormLabel,\r\n Slider,\r\n Button,\r\n} from \"@mui/material\";\r\nimport {\r\n getContainedRegionRois,\r\n getParentIndexLayer,\r\n} from \"../../utils/StructuresUtils\";\r\nimport Tool from \"./Tool\";\r\nimport React from \"react\";\r\nimport RBush from \"rbush\";\r\nimport * as turf from \"@turf/turf\";\r\nimport { buffer } from \"turf\";\r\nimport OverlapConfigForm from \"./ConfigForms/OverlapConfigForm\";\r\n\r\nclass RoiResizeTool extends Tool {\r\n toolName = \"ROI Resize Tool\";\r\n noConfig = false;\r\n removeOverlap = true;\r\n removeOverlapSame = true;\r\n tempRemoveOverlap = true;\r\n threshold = 1;\r\n tree = new RBush();\r\n\r\n setLayer(obj) {\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedLayer = layerResults[0];\r\n this.parentLayer = layerResults[1];\r\n this.structures = obj.structures;\r\n this.structure = obj.structures[obj.selectedLayer]; // currently selected structure\r\n this.regionRois = getContainedRegionRois(\r\n this.structure,\r\n this.structures,\r\n this.roiLayers\r\n );\r\n this.parentIndex = getParentIndexLayer(this.structure, this.structures);\r\n this.spinloader = obj.spinloader;\r\n this.tree.clear();\r\n this.tree.load(this.regionRois.map((item) => item.treeItem));\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.removeOverlap = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n }\r\n\r\n findSmallestTreeItem(p) {\r\n let minArea = Number.MAX_SAFE_INTEGER;\r\n let resultItem;\r\n if (this.structures[this.selectedLayer].visible) {\r\n let treeItems = this.tree.search({\r\n minX: p.x,\r\n minY: p.y,\r\n maxX: p.x,\r\n maxY: p.y,\r\n });\r\n for (let treeItem of treeItems) {\r\n let b = treeItem.roi.bounds;\r\n\r\n if (pointInside(p, treeItem.roi)) {\r\n let bArea = (b.right - b.left) * (b.bottom - b.top);\r\n if (bArea < minArea) {\r\n minArea = bArea;\r\n resultItem = treeItem;\r\n }\r\n }\r\n }\r\n }\r\n return resultItem;\r\n }\r\n\r\n deleteItem = (item, parentIdx) => {\r\n let historyItem = [];\r\n let histId = this.structures[this.selectedLayer].id;\r\n historyItem.push({ add: false, id: histId, roi: item.roi });\r\n this.roiLayers[parentIdx].tree.remove(item);\r\n this.roiLayers[parentIdx].layer.regionRois = this.roiLayers[parentIdx].tree\r\n .all()\r\n .map((treeItem) => treeItem.roi);\r\n window.projectHistory.add(historyItem);\r\n };\r\n\r\n pointsToUpdateLayer = (newPoints, treeItem, pIndex) => {\r\n let layerResults = findSameLayer(\r\n this.structures,\r\n this.roiLayers.findIndex(\r\n (element) => element.id === treeItem.roi.structureId\r\n )\r\n );\r\n this.selectedLayer = layerResults[0];\r\n this.parentLayer = layerResults[1];\r\n\r\n let item = treeItem.roi;\r\n let regionRoi = createRegionRoi(\r\n newPoints,\r\n item.color,\r\n item.isSubtype,\r\n item.subtypeName,\r\n item.fullyLoaded,\r\n item.structureId,\r\n false\r\n );\r\n\r\n let drawRegion = {\r\n regions: [],\r\n inverted: false,\r\n };\r\n\r\n drawRegion.regions.push(regionRoi);\r\n\r\n let overlapRoiLayers = [];\r\n if (this.removeOverlapSame) {\r\n overlapRoiLayers.push(this.roiLayers[this.selectedLayer]);\r\n }\r\n if (this.removeOverlap) {\r\n let siblingRoiLayers = findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n );\r\n siblingRoiLayers.map((layer) => overlapRoiLayers.push(layer));\r\n }\r\n\r\n this.deleteItem(treeItem, pIndex);\r\n\r\n updateLayer(\r\n this.roiLayers[this.selectedLayer].layer,\r\n drawRegion,\r\n false, //clear\r\n item.color,\r\n item.isSubtype,\r\n item.subtypeName,\r\n this.roiLayers[this.selectedLayer].tree,\r\n this.positionInRoiLayer,\r\n item.fullyLoaded,\r\n false, //overlap\r\n this.roiLayers[this.parentLayer],\r\n item.structureId,\r\n overlapRoiLayers,\r\n false //clicekd on roi\r\n );\r\n };\r\n\r\n getAllChildsOfStructure = (structure, structures) => {\r\n let affectedStructures = [];\r\n affectedStructures.push(structure);\r\n for (let affStruct of affectedStructures) {\r\n if (affStruct.hasChild) {\r\n let childs = structures.filter((struct) =>\r\n struct.parentId === affStruct.id ? struct : false\r\n );\r\n for (let child of childs) {\r\n if (!child.classificationSubtype) {\r\n affectedStructures.push(child);\r\n }\r\n }\r\n }\r\n }\r\n return affectedStructures;\r\n };\r\n\r\n growPoly = (treeItem, pIndex) => {\r\n let newPoints = [];\r\n let turfpoly = turf.polygon(treeItem.roi.regions);\r\n let bufferedTurfPoly = buffer(turfpoly, this.threshold * 160);\r\n if (bufferedTurfPoly.geometry.coordinates[0].length > 0) {\r\n bufferedTurfPoly = turf.simplify(bufferedTurfPoly, {\r\n tolerance: 0.05,\r\n highQuality: false,\r\n });\r\n }\r\n newPoints = bufferedTurfPoly.geometry.coordinates;\r\n if (newPoints[0].length < 5 && turf.area(bufferedTurfPoly) < 1) return;\r\n this.pointsToUpdateLayer(newPoints, treeItem, pIndex);\r\n };\r\n\r\n processStructures = (structures) => {\r\n this.spinloader.show();\r\n this.historyItem = [];\r\n this.histId = this.structures[this.selectedLayer].id;\r\n let roiCount = 0;\r\n let roisProcessed = 0;\r\n for (let structure of structures) {\r\n let regionRois = getContainedRegionRois(\r\n structure,\r\n this.structures,\r\n this.roiLayers\r\n );\r\n for (let regionRoi of regionRois) {\r\n this.historyItem.push({ add: false, id: this.histId, roi: regionRoi });\r\n }\r\n roiCount += regionRois.length;\r\n }\r\n for (let structure of structures) {\r\n let pIndex = getParentIndexLayer(structure, this.structures);\r\n let regionRois = getContainedRegionRois(\r\n structure,\r\n this.structures,\r\n this.roiLayers\r\n );\r\n for (let regionRoi of regionRois) {\r\n setTimeout(() => {\r\n this.growPoly(regionRoi.treeItem, pIndex);\r\n roisProcessed += 1;\r\n if (roisProcessed >= roiCount) {\r\n this.finishProcessStructures(structures);\r\n }\r\n }, 0);\r\n }\r\n }\r\n };\r\n\r\n finishProcessStructures = (structures) => {\r\n for (let structure of structures) {\r\n const regionRois = getContainedRegionRois(\r\n structure,\r\n this.structures,\r\n this.roiLayers\r\n );\r\n for (let regionRoi of regionRois) {\r\n this.historyItem.push({ add: true, id: this.histId, roi: regionRoi });\r\n }\r\n }\r\n window.projectHistory.collection = [];\r\n window.projectHistory.addCollection();\r\n window.projectHistory.add(this.historyItem);\r\n this.spinloader.hide();\r\n };\r\n\r\n growStructures = () => {\r\n window.projectHistory.startCollection();\r\n let structures = this.getAllChildsOfStructure(\r\n this.structure,\r\n this.structures\r\n );\r\n this.processStructures(structures);\r\n };\r\n\r\n onApply = () => {\r\n this.growStructures();\r\n };\r\n\r\n // triggered from Renderer, but usable from tool as well\r\n onKeyDown(event) {\r\n // enter key\r\n if (event.code === \"Enter\") {\r\n this.onApply();\r\n }\r\n }\r\n\r\n mouse(params) {\r\n let { color, subtype, name, positionInRoiLayer, fullyLoaded, p, event } =\r\n params;\r\n this.color = color;\r\n this.subtype = subtype;\r\n this.name = name;\r\n this.positionInRoiLayer = positionInRoiLayer;\r\n this.fullyLoaded = fullyLoaded;\r\n\r\n if (event.type === \"mousedown\" && event.button === 0) {\r\n let treeItem = this.findSmallestTreeItem(p);\r\n if (treeItem) {\r\n window.projectHistory.startCollection();\r\n this.growPoly(treeItem, this.parentIndex);\r\n window.projectHistory.addCollection();\r\n }\r\n }\r\n }\r\n\r\n renderConfiguration() {\r\n return (\r\n
    \r\n {/* canvas for debugging */}\r\n \r\n {this.toolName}:\r\n \r\n \r\n Grow or shrink an indiviual ROI or all belonging to a structure\r\n \r\n \r\n {\"Growth: \" + this.threshold + \" pixel\"}\r\n \r\n {\r\n this.threshold = v;\r\n window.forceSidebarUpdate();\r\n }}\r\n onKeyDown={(e) => this.onKeyDown(e)} //onKeyDown also triggered from Renderer\r\n />\r\n \r\n (this.removeOverlap = e)}\r\n onChangeRemoveOverlapSame={(e) => (this.removeOverlapSame = e)}\r\n />\r\n \r\n Apply [Enter]\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default RoiResizeTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport {\r\n FormControl,\r\n FormControlLabel,\r\n List,\r\n ListItem,\r\n ListItemText,\r\n Tooltip,\r\n Typography,\r\n Checkbox,\r\n IconButton,\r\n FormGroup,\r\n} from \"@mui/material\";\r\n\r\nimport {\r\n Keyboard,\r\n Mouse,\r\n NavigateBefore,\r\n NavigateNext,\r\n} from \"@mui/icons-material\";\r\n\r\nimport { pointInside } from \"../../utils/PolygonUtil\";\r\nimport Tool from \"./Tool\";\r\n\r\nimport {\r\n getContainedRegionRois,\r\n getParentIndexLayer,\r\n} from \"../../utils/StructuresUtils\";\r\n\r\nclass SelectionTool extends Tool {\r\n name = \"Selection\";\r\n selection = null;\r\n foundLayer = -1;\r\n classify = true;\r\n borderColor = [\"#FFFFFF\", \"\", \"\"];\r\n classificationId = [0, 0, 0];\r\n automaticFileChange = true;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.structures = obj.structures;\r\n this.structure = obj.structures[obj.selectedLayer];\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.classifyFullSceneImage =\r\n obj.viewerConfig_project.projectProperties.ClassifySceneAsOneImage;\r\n this.project = obj.project;\r\n this.fileId = obj.fileId;\r\n if (this.borderColor[1] === \"\") {\r\n this.setCol();\r\n }\r\n if (this.classificationId[1] === 0) {\r\n this.setIds();\r\n }\r\n this.regionRois = getContainedRegionRois(\r\n this.structure,\r\n this.structures,\r\n this.roiLayers\r\n );\r\n this.parentIndex = getParentIndexLayer(this.structure, this.structures);\r\n }\r\n\r\n setCol = () => {\r\n let childs = this.findChilds(this.structures[this.selectedLayer]);\r\n\r\n if (childs.length > 1) {\r\n if (this.borderColor[1] === \"\") {\r\n this.borderColor[1] = childs[0].color;\r\n }\r\n\r\n if (this.borderColor[2] === \"\") {\r\n this.borderColor[2] = childs[1].color;\r\n }\r\n }\r\n };\r\n\r\n setIds = () => {\r\n let childs = this.findChilds(this.structures[this.selectedLayer]);\r\n\r\n if (childs.length > 1) {\r\n if (this.classificationId[1] === 0) {\r\n this.classificationId[1] = childs[0].id;\r\n }\r\n\r\n if (this.classificationId[2] === 0) {\r\n this.classificationId[2] = childs[1].id;\r\n }\r\n }\r\n };\r\n\r\n findChilds = (subType) => {\r\n return this.structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n setBorderColor = (c) => {\r\n this.borderColor = c;\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n setClassificationId = (c) => {\r\n this.classificationId = c;\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n setClassification = (e) => {\r\n this.classify = e.target.checked ? true : false;\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n setAutomaticFileChange = (e) => {\r\n this.automaticFileChange = e.target.checked ? true : false;\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n setPreviewRect() {}\r\n\r\n findSmallestTreeItem(p) {\r\n let minArea = Number.MAX_SAFE_INTEGER;\r\n let resultItem;\r\n for (let i = 0; i < this.roiLayers.length; i++) {\r\n if (this.structures[i].visible) {\r\n let treeItems = this.roiLayers[i].tree.search({\r\n minX: p.x,\r\n minY: p.y,\r\n maxX: p.x,\r\n maxY: p.y,\r\n });\r\n for (let treeItem of treeItems) {\r\n let b = treeItem.roi.bounds;\r\n\r\n if (pointInside(p, treeItem.roi)) {\r\n let bArea = (b.right - b.left) * (b.bottom - b.top);\r\n if (bArea < minArea) {\r\n minArea = bArea;\r\n resultItem = treeItem;\r\n this.selectedLayer = i;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return resultItem;\r\n }\r\n\r\n changeItem = (e, fromButton, dir) => {\r\n if (this.selection) {\r\n let p = {\r\n x: 0,\r\n y: 0,\r\n };\r\n\r\n let direction = 0;\r\n if (fromButton) {\r\n if (dir === \"next\") {\r\n direction = 1;\r\n }\r\n if (dir === \"before\") {\r\n direction = 2;\r\n }\r\n } else {\r\n if (e.key === \"ArrowRight\") {\r\n direction = 1;\r\n }\r\n if (e.key === \"ArrowLeft\") {\r\n direction = 2;\r\n }\r\n }\r\n\r\n // if not classification structure\r\n if (!this.structures[this.selectedLayer].classificationSubtype) {\r\n let idx = this.roiLayers[this.selectedLayer].layer.regionRois.findIndex(\r\n (element) =>\r\n element.bounds.left === this.selection.roi.bounds.left &&\r\n element.bounds.top === this.selection.roi.bounds.top &&\r\n element.bounds.bottom === this.selection.roi.bounds.bottom &&\r\n element.bounds.right === this.selection.roi.bounds.right\r\n );\r\n\r\n if (\r\n typeof this.roiLayers[this.selectedLayer].layer.regionRois[idx] ===\r\n \"undefined\"\r\n )\r\n return;\r\n // get middlepoint of selected roi\r\n let boundsSelection =\r\n this.roiLayers[this.selectedLayer].layer.regionRois[idx].bounds;\r\n p = {\r\n x:\r\n boundsSelection.right -\r\n (boundsSelection.right - boundsSelection.left) * 0.5,\r\n y:\r\n boundsSelection.bottom -\r\n (boundsSelection.bottom - boundsSelection.top) * 0.5,\r\n };\r\n\r\n switch (direction) {\r\n case 1: //right\r\n if (this.roiLayers[this.selectedLayer].layer.regionRois[idx + 1]) {\r\n let bounds =\r\n this.roiLayers[this.selectedLayer].layer.regionRois[idx + 1]\r\n .bounds;\r\n p.x = bounds.right - (bounds.right - bounds.left) * 0.5;\r\n p.y = bounds.bottom - (bounds.bottom - bounds.top) * 0.5;\r\n }\r\n break;\r\n case 2: // left\r\n if (this.roiLayers[this.selectedLayer].layer.regionRois[idx - 1]) {\r\n let bounds =\r\n this.roiLayers[this.selectedLayer].layer.regionRois[idx - 1]\r\n .bounds;\r\n p.x = bounds.right - (bounds.right - bounds.left) * 0.5;\r\n p.y = bounds.bottom - (bounds.bottom - bounds.top) * 0.5;\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n this.selection = this.findSmallestTreeItem(p);\r\n\r\n if (this.selection !== null && this.selection) {\r\n window.moveToRect(this.selection.roi.bounds);\r\n let obj = {\r\n r: this.selection.roi,\r\n colors: \"\",\r\n classify: this.classify,\r\n };\r\n if (fromButton) {\r\n window.setNewSelRoi(obj);\r\n }\r\n\r\n return obj;\r\n }\r\n }\r\n };\r\n\r\n changeTile = (e) => {\r\n if (this.selection) {\r\n let p = {\r\n x:\r\n this.selection.roi.bounds.left +\r\n (this.selection.roi.bounds.right - this.selection.roi.bounds.left) /\r\n 2,\r\n y:\r\n this.selection.roi.bounds.top +\r\n (this.selection.roi.bounds.bottom - this.selection.roi.bounds.top) /\r\n 2,\r\n };\r\n\r\n // if no regions in this layer return\r\n if (this.roiLayers[this.selectedLayer].layer.regionRois.length === 0) {\r\n return;\r\n }\r\n\r\n // width ist width of roi in top left because top left is always a square\r\n let width =\r\n this.roiLayers[this.selectedLayer].layer.regionRois[0].bounds.right;\r\n\r\n switch (e.key) {\r\n case \"ArrowRight\":\r\n if (p.x + width <= this.ome.sizeX) {\r\n p.x = p.x + width;\r\n } else {\r\n p.x = this.ome.sizeX - 1;\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowLeft\":\r\n if (p.x - width >= 0) {\r\n p.x = p.x - width;\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowUp\":\r\n if (p.y - width >= 0) {\r\n p.y = p.y - width;\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowDown\":\r\n if (p.y + width <= this.ome.sizeY) {\r\n p.y = p.y + width;\r\n } else {\r\n p.y = this.ome.sizeY - 1;\r\n }\r\n e.preventDefault();\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n this.selection = this.findSmallestTreeItem(p);\r\n\r\n if (this.selection !== null && this.selection) {\r\n window.moveToRect(this.selection.roi.bounds);\r\n let obj = {\r\n r: this.selection.roi,\r\n colors: \"\",\r\n classify: this.classify,\r\n };\r\n return obj;\r\n }\r\n }\r\n };\r\n\r\n deleteSelectedRoi = () => {\r\n let historyItem = [];\r\n let histId = this.structures[this.parentIndex].id;\r\n\r\n historyItem.push({ add: false, id: histId, roi: this.selection });\r\n this.roiLayers[this.parentIndex].tree.remove(this.selection);\r\n this.roiLayers[this.parentIndex].layer.regionRois = this.roiLayers[\r\n this.parentIndex\r\n ].tree\r\n .all()\r\n .map((treeItem) => treeItem.roi);\r\n this.selection = null;\r\n window.projectHistory.add(historyItem);\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n onKeyDown(e, fromRenderer, tilesProject) {\r\n // delete item\r\n if (!tilesProject && e.key === \"Delete\") {\r\n this.deleteSelectedRoi();\r\n }\r\n\r\n if (!fromRenderer) {\r\n return;\r\n }\r\n if (!tilesProject) {\r\n return this.changeItem(e);\r\n } else {\r\n return this.changeTile(e);\r\n }\r\n }\r\n\r\n mouse(params) {\r\n let { event, p } = params;\r\n if (!p) {\r\n return;\r\n }\r\n\r\n this.curX = p.x;\r\n this.curY = p.y;\r\n\r\n let color = \"\";\r\n let id = 0;\r\n\r\n // mouse middle button\r\n if (event.button === 1) {\r\n return;\r\n }\r\n // left button\r\n if (event.button === 0) {\r\n color = this.borderColor[1];\r\n id = this.classificationId[1];\r\n }\r\n // right button\r\n if (event.button === 2) {\r\n color = this.borderColor[2];\r\n id = this.classificationId[2];\r\n }\r\n\r\n if (event.type === \"mousedown\") {\r\n this.selection = this.findSmallestTreeItem(p);\r\n }\r\n\r\n if (this.selection !== null && this.selection) {\r\n let obj = {\r\n r: this.selection.roi,\r\n colors: color,\r\n classify: this.classify,\r\n id: id,\r\n changeFile: this.classifyFullSceneImage,\r\n automaticFileChange: this.automaticFileChange,\r\n };\r\n return obj;\r\n }\r\n }\r\n\r\n /**\r\n * Draw a custom cursor\r\n */\r\n drawCustomCursor(ctx, mousePosition, fkt) {\r\n if (this.selection && !this.classifyFullSceneImage) {\r\n const dashLength = 15 / fkt;\r\n ctx.beginPath();\r\n ctx.setLineDash([dashLength, dashLength]);\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = \"#FF0000\";\r\n ctx.lineWidth = 2 / fkt;\r\n let b = this.selection.roi.bounds;\r\n // no custom cursor\r\n ctx.rect(b.left, b.top, b.right - b.left, b.bottom - b.top);\r\n ctx.stroke();\r\n ctx.closePath();\r\n ctx.setLineDash([]);\r\n }\r\n }\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
    \r\n {this.name}:\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n findChilds = (subType) => {\r\n return this.props.structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n handleChangeClassification = (e) => {\r\n this.props.setClassification(e);\r\n };\r\n\r\n handleAutomaticFileChange = (e) => {\r\n this.props.setAutomaticFileChange(e);\r\n };\r\n\r\n getNextFileId = () => {\r\n const { project, fileId } = this.props;\r\n let inxCurrentFile = project.files.findIndex(\r\n (element) => element.id === fileId\r\n );\r\n\r\n if (project.files[inxCurrentFile + 1]) {\r\n return project.files[inxCurrentFile + 1].id;\r\n } else {\r\n // if last file\r\n window.showWarningSnackbar(\"Last file.\");\r\n return null;\r\n }\r\n };\r\n\r\n getPrevFileId = () => {\r\n const { project, fileId } = this.props;\r\n let inxCurrentFile = project.files.findIndex(\r\n (element) => element.id === fileId\r\n );\r\n\r\n if (project.files[inxCurrentFile - 1]) {\r\n return project.files[inxCurrentFile - 1].id;\r\n } else {\r\n // if last file\r\n window.showWarningSnackbar(\"First file.\");\r\n return null;\r\n }\r\n };\r\n\r\n getCurrentFileInx = () => {\r\n const { project, fileId } = this.props;\r\n return project.files.findIndex((element) => element.id === fileId) + 1;\r\n };\r\n\r\n render() {\r\n let childs = this.findChilds(\r\n this.props.structures[this.props.selectedLayer]\r\n );\r\n childs.unshift(this.props.structures[this.props.selectedLayer]);\r\n\r\n return (\r\n
    \r\n \r\n \r\n }\r\n />\r\n \r\n {\r\n e.preventDefault();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {childs.map((child, index) => (\r\n {\r\n e.preventDefault();\r\n }}\r\n onMouseUp={(e) => {\r\n if (\r\n e.nativeEvent.which === 3 &&\r\n this.props.borderColor[1] !== child.color &&\r\n this.props.classificationId[1] !== child.id\r\n ) {\r\n // right click\r\n this.props.borderColor[2] = child.color;\r\n this.props.classificationId[2] = child.id;\r\n } else if (\r\n e.nativeEvent.which === 1 &&\r\n this.props.borderColor[2] !== child.color &&\r\n this.props.classificationId[2] !== child.id\r\n ) {\r\n // left click\r\n this.props.borderColor[1] = child.color;\r\n this.props.classificationId[1] = child.id;\r\n }\r\n this.props.setBorderColor(this.props.borderColor);\r\n this.props.setClassificationId(this.props.classificationId);\r\n e.preventDefault();\r\n this.forceUpdate();\r\n }}\r\n >\r\n \r\n {child.color === this.props.borderColor[1] &&\r\n child.id === this.props.classificationId[1] &&\r\n this.props.classify && (\r\n L\r\n )}\r\n {child.color === this.props.borderColor[2] &&\r\n child.id === this.props.classificationId[2] &&\r\n this.props.classify && (\r\n R\r\n )}\r\n \r\n {index}\r\n \r\n \r\n ))}\r\n \r\n
    \r\n \r\n {!this.props.classifyFullSceneImage && (\r\n
    \r\n \r\n Change selected item:\r\n \r\n \r\n \r\n {\r\n this.props.changeSelRoi(null, true, \"before\");\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n {\r\n this.props.changeSelRoi(null, true, \"next\");\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n
    \r\n )}\r\n {this.props.classifyFullSceneImage && (\r\n
    \r\n \r\n }\r\n />\r\n Change file:\r\n \r\n \r\n {\r\n let fileId = this.getPrevFileId();\r\n if (fileId !== null) {\r\n window.onSelectFile(fileId);\r\n }\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n {\r\n let fileId = this.getNextFileId();\r\n if (fileId !== null) {\r\n window.onSelectFile(fileId);\r\n }\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n File {this.getCurrentFileInx()} /{\" \"}\r\n {this.props.project.files.length}\r\n \r\n \r\n
    \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nConfigForm.propTypes = {\r\n structures: PropTypes.array,\r\n setClassification: PropTypes.func,\r\n setAutomaticFileChange: PropTypes.func,\r\n selectedLayer: PropTypes.number,\r\n classify: PropTypes.bool,\r\n automaticFileChange: PropTypes.bool,\r\n classifyFullSceneImage: PropTypes.bool,\r\n borderColor: PropTypes.array,\r\n classificationId: PropTypes.array,\r\n setBorderColor: PropTypes.func,\r\n setClassificationId: PropTypes.func,\r\n changeSelRoi: PropTypes.func,\r\n project: PropTypes.object,\r\n fileId: PropTypes.string,\r\n};\r\n\r\nexport default SelectionTool;\r\n","import Tool from \"./Tool\";\r\nimport React from \"react\";\r\nimport {\r\n Button,\r\n FormControl,\r\n InputLabel,\r\n OutlinedInput,\r\n InputAdornment,\r\n IconButton,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport PlayArrowIcon from \"@mui/icons-material/PlayArrow\";\r\nimport StopIcon from \"@mui/icons-material/Stop\";\r\nimport ContentCopyIcon from \"@mui/icons-material/ContentCopy\";\r\nimport Backend from \"../../../common/utils/Backend\";\r\n\r\nfunction dataURItoBlob(dataURI) {\r\n // convert base64/URLEncoded data component to raw binary data held in a string\r\n var byteString;\r\n if (dataURI.split(\",\")[0].indexOf(\"base64\") >= 0)\r\n byteString = atob(dataURI.split(\",\")[1]);\r\n else byteString = unescape(dataURI.split(\",\")[1]);\r\n\r\n // separate out the mime component\r\n var mimeString = dataURI.split(\",\")[0].split(\":\")[1].split(\";\")[0];\r\n\r\n // write the bytes of the string to a typed array\r\n var ia = new Uint8Array(byteString.length);\r\n for (var i = 0; i < byteString.length; i++) {\r\n ia[i] = byteString.charCodeAt(i);\r\n }\r\n\r\n return new Blob([ia], { type: mimeString });\r\n}\r\n\r\nclass StreamViewTool extends Tool {\r\n name = \"Stream\";\r\n includeBaseROI = true;\r\n activeTab = 0;\r\n isStreaming = false;\r\n streamUrl = \"\";\r\n\r\n setLayer(obj) {\r\n this.ctx = obj.ctx;\r\n this.project = obj.project;\r\n this.streamUrl =\r\n \"https://stream.hs-analysis.com?target=\" +\r\n this.project.id +\r\n \"&name=\" +\r\n this.project.name +\r\n \" (\" +\r\n this.project.viewerConfig.project.label +\r\n \")\";\r\n this.rendererDict = obj.rendererDict;\r\n this.fileId = obj.fileId;\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n handleChange = () => {};\r\n\r\n exit() {}\r\n\r\n uploadRendererContent = () => {\r\n let img = this.rendererDict[this.fileId].canvas;\r\n img = img.toDataURL(\"image/jpeg\", 0.9);\r\n Backend.streamRenderer(dataURItoBlob(img), this.project.id, () => {\r\n if (this.isStreaming) {\r\n setTimeout(this.uploadRendererContent, 10);\r\n }\r\n });\r\n };\r\n\r\n toggleStream = () => {\r\n if (this.isStreaming) {\r\n this.isStreaming = false;\r\n } else {\r\n this.isStreaming = true;\r\n this.uploadRendererContent();\r\n }\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n handleCopyLink = () => {\r\n navigator.clipboard.writeText(this.streamUrl);\r\n window.showSuccessSnackbar(\"Stream link copyied to clipboard!\");\r\n };\r\n\r\n renderConfiguration() {\r\n return (\r\n
    \r\n {this.name}:\r\n \r\n \r\n Stream link\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n label=\"Stream link\"\r\n />\r\n \r\n \r\n {this.isStreaming ? (\r\n \r\n Stop Stream\r\n \r\n ) : (\r\n \r\n Start Stream\r\n \r\n )}\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default StreamViewTool;\r\n","import { pointInside } from \"../../utils/PolygonUtil\";\r\nimport Tool from \"./Tool\";\r\n\r\nclass TilesClassificationTool extends Tool {\r\n name = \"TilesClassificationTool\";\r\n selection = null;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.structures = obj.structures;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n }\r\n\r\n setNextTile = (roiItem) => {\r\n if (roiItem) {\r\n this.selection = roiItem;\r\n window.moveToRect(this.selection.roi.bounds);\r\n }\r\n };\r\n\r\n findSmallestTreeItem(p) {\r\n let minArea = Number.MAX_SAFE_INTEGER;\r\n let resultItem;\r\n for (let i = 0; i < this.roiLayers.length; i++) {\r\n if (this.structures[i].visible) {\r\n let treeItems = this.roiLayers[i].tree.search({\r\n minX: p.x,\r\n minY: p.y,\r\n maxX: p.x,\r\n maxY: p.y,\r\n });\r\n for (let treeItem of treeItems) {\r\n let b = treeItem.roi.bounds;\r\n\r\n if (pointInside(p, treeItem.roi)) {\r\n let bArea = (b.right - b.left) * (b.bottom - b.top);\r\n if (bArea < minArea) {\r\n minArea = bArea;\r\n resultItem = treeItem;\r\n this.selectedLayer = i;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return resultItem;\r\n }\r\n\r\n changeItem = (e, fromButton, dir) => {\r\n if (this.selection) {\r\n let p = {\r\n x: 0,\r\n y: 0,\r\n };\r\n\r\n let direction = 0;\r\n if (fromButton) {\r\n if (dir === \"next\") {\r\n direction = 1;\r\n }\r\n if (dir === \"before\") {\r\n direction = 2;\r\n }\r\n } else {\r\n if (e.key === \"ArrowRight\") {\r\n //e.key not tested, because not in use\r\n direction = 1;\r\n }\r\n if (e.key === \"ArrowLeft\") {\r\n //e.key not tested, because not in use\r\n direction = 2;\r\n }\r\n }\r\n\r\n // if not classification structure\r\n if (!this.structures[this.selectedLayer].classificationSubtype) {\r\n let idx = this.roiLayers[this.selectedLayer].layer.regionRois.findIndex(\r\n (element) => element === this.selection.roi\r\n );\r\n\r\n // get middlepoint of selected roi\r\n let boundsSelection =\r\n this.roiLayers[this.selectedLayer].layer.regionRois[idx].bounds;\r\n p = {\r\n x:\r\n boundsSelection.right -\r\n (boundsSelection.right - boundsSelection.left) * 0.5,\r\n y:\r\n boundsSelection.bottom -\r\n (boundsSelection.bottom - boundsSelection.top) * 0.5,\r\n };\r\n\r\n switch (direction) {\r\n case 1: //right\r\n if (this.roiLayers[this.selectedLayer].layer.regionRois[idx + 1]) {\r\n let bounds =\r\n this.roiLayers[this.selectedLayer].layer.regionRois[idx + 1]\r\n .bounds;\r\n p.x = bounds.right - (bounds.right - bounds.left) * 0.5;\r\n p.y = bounds.bottom - (bounds.bottom - bounds.top) * 0.5;\r\n }\r\n break;\r\n case 2: // left\r\n if (this.roiLayers[this.selectedLayer].layer.regionRois[idx - 1]) {\r\n let bounds =\r\n this.roiLayers[this.selectedLayer].layer.regionRois[idx - 1]\r\n .bounds;\r\n p.x = bounds.right - (bounds.right - bounds.left) * 0.5;\r\n p.y = bounds.bottom - (bounds.bottom - bounds.top) * 0.5;\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n this.selection = this.findSmallestTreeItem(p);\r\n\r\n if (this.selection !== null && this.selection) {\r\n window.moveToRect(this.selection.roi.bounds);\r\n }\r\n }\r\n };\r\n\r\n changeTile = (e) => {\r\n if (this.selection) {\r\n let p = {\r\n x:\r\n this.selection.roi.bounds.left +\r\n (this.selection.roi.bounds.right - this.selection.roi.bounds.left) /\r\n 2,\r\n y:\r\n this.selection.roi.bounds.top +\r\n (this.selection.roi.bounds.bottom - this.selection.roi.bounds.top) /\r\n 2,\r\n };\r\n\r\n // if no regions in this layer return\r\n if (this.roiLayers[this.selectedLayer].layer.regionRois.length === 0) {\r\n return;\r\n }\r\n\r\n // width ist width of roi in top left because top left is always a square\r\n let width =\r\n this.roiLayers[this.selectedLayer].layer.regionRois[0].bounds.right;\r\n\r\n switch (e.key) {\r\n case \"ArrowRight\": //e.key not tested, because not in use\r\n if (p.x + width <= this.ome.sizeX) {\r\n p.x = p.x + width;\r\n } else {\r\n p.x = this.ome.sizeX - 1;\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowLeft\": //e.key not tested, because not in use\r\n if (p.x - width >= 0) {\r\n p.x = p.x - width;\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowUp\": //e.key not tested, because not in use\r\n if (p.y - width >= 0) {\r\n p.y = p.y - width;\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowDown\": //e.key not tested, because not in use\r\n if (p.y + width <= this.ome.sizeY) {\r\n p.y = p.y + width;\r\n } else {\r\n p.y = this.ome.sizeY - 1;\r\n }\r\n e.preventDefault();\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n this.selection = this.findSmallestTreeItem(p);\r\n\r\n if (this.selection !== null && this.selection) {\r\n window.moveToRect(this.selection.roi.bounds);\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Draw a custom cursor\r\n */\r\n drawCustomCursor(ctx, mousePosition, fkt) {\r\n if (this.selection) {\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = \"#FF0000\";\r\n ctx.lineWidth = 2 / fkt;\r\n let b = this.selection.roi.bounds;\r\n ctx.rect(b.left, b.top, b.right - b.left, b.bottom - b.top);\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return null;\r\n }\r\n}\r\n\r\nexport default TilesClassificationTool;\r\n","import React from \"react\";\r\n\r\nimport { pointInside } from \"../../utils/PolygonUtil\";\r\nimport Tool from \"./Tool\";\r\n\r\nimport { Typography, TextField, FormGroup } from \"@mui/material\";\r\n\r\nimport SketchColorPicker from \"../../../common/components/SketchColorPicker\";\r\n\r\nclass TilesHistoPointCountingTool extends Tool {\r\n name = \"TilesHistoPointCountingTool\";\r\n selection = null;\r\n crosshairColor = \"#000000\";\r\n crosshairLineWidth = 2;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.structures = obj.structures;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n }\r\n\r\n setNextTile = (roiItem) => {\r\n if (roiItem) {\r\n this.selection = roiItem;\r\n window.moveToRect(this.selection.roi.bounds);\r\n }\r\n };\r\n\r\n findSmallestTreeItem(p) {\r\n let minArea = Number.MAX_SAFE_INTEGER;\r\n let resultItem;\r\n for (let i = 0; i < this.roiLayers.length; i++) {\r\n if (this.structures[i].visible) {\r\n let treeItems = this.roiLayers[i].tree.search({\r\n minX: p.x,\r\n minY: p.y,\r\n maxX: p.x,\r\n maxY: p.y,\r\n });\r\n for (let treeItem of treeItems) {\r\n let b = treeItem.roi.bounds;\r\n\r\n if (pointInside(p, treeItem.roi)) {\r\n let bArea = (b.right - b.left) * (b.bottom - b.top);\r\n if (bArea < minArea) {\r\n minArea = bArea;\r\n resultItem = treeItem;\r\n this.selectedLayer = i;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return resultItem;\r\n }\r\n\r\n /**\r\n * Draw a custom cursor\r\n */\r\n drawCustomCursor(ctx, mousePosition, fkt) {\r\n if (this.selection) {\r\n // draw outer red rect that defines tile\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = \"#FF0000\";\r\n ctx.lineWidth = 2 / fkt;\r\n let b = this.selection.roi.bounds;\r\n ctx.rect(b.left, b.top, b.right - b.left, b.bottom - b.top);\r\n ctx.stroke();\r\n ctx.closePath();\r\n\r\n // draw crosshair\r\n ctx.lineWidth = this.crosshairLineWidth / fkt;\r\n let tileWidth = b.right - b.left;\r\n let tileHeight = b.bottom - b.top;\r\n let lineLengthWidth = (tileWidth / 2) * 0.9;\r\n let lineLengthHeight = (tileHeight / 2) * 0.9;\r\n\r\n // horizontal line left\r\n ctx.beginPath();\r\n ctx.strokeStyle = this.crosshairColor;\r\n ctx.moveTo(b.left, b.top + tileHeight / 2);\r\n ctx.lineTo(b.left + lineLengthWidth, b.top + tileHeight / 2);\r\n ctx.closePath();\r\n ctx.globalAlpha = this.crosshairOpacity;\r\n ctx.stroke();\r\n\r\n // horizontal line right\r\n ctx.beginPath();\r\n ctx.strokeStyle = this.crosshairColor;\r\n ctx.moveTo(b.right, b.top + tileHeight / 2);\r\n ctx.lineTo(b.right - lineLengthWidth, b.top + tileHeight / 2);\r\n ctx.closePath();\r\n ctx.globalAlpha = this.crosshairOpacity;\r\n ctx.stroke();\r\n\r\n // vertical line top\r\n ctx.beginPath();\r\n ctx.strokeStyle = this.crosshairColor;\r\n ctx.moveTo(b.left + tileWidth / 2, b.top);\r\n ctx.lineTo(b.left + tileWidth / 2, b.top + lineLengthHeight);\r\n ctx.closePath();\r\n ctx.globalAlpha = this.crosshairOpacity;\r\n ctx.stroke();\r\n\r\n // vertical line bottom\r\n ctx.beginPath();\r\n ctx.strokeStyle = this.crosshairColor;\r\n ctx.moveTo(b.left + tileWidth / 2, b.bottom);\r\n ctx.lineTo(b.left + tileWidth / 2, b.bottom - lineLengthHeight);\r\n ctx.closePath();\r\n ctx.globalAlpha = this.crosshairOpacity;\r\n ctx.stroke();\r\n }\r\n }\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
    \r\n {this.name}:\r\n \r\n \r\n Crosshair color:\r\n \r\n {\r\n this.crosshairColor = color;\r\n window.forceSidebarUpdate();\r\n }}\r\n />\r\n \r\n\r\n
    \r\n\r\n \r\n \r\n Crosshair linewidth:\r\n \r\n {\r\n this.crosshairLineWidth = Number(e.target.value);\r\n window.forceSidebarUpdate();\r\n }}\r\n inputProps={{\r\n step: 1,\r\n min: 1,\r\n max: 30,\r\n type: \"number\",\r\n }}\r\n />\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default TilesHistoPointCountingTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = {\r\n canvasComp: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n },\r\n CompContainer: {\r\n position: \"absolute\",\r\n zIndex: 100,\r\n display: \"inline-flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: \"200px\",\r\n height: \"200px\",\r\n // resize: \"both\", // TODO: Add listener to allow window resizing that executes handleSizeChanged()\r\n overflow: \"hidden\",\r\n background: \"#D3D3D3\",\r\n border: \"1px solid black\",\r\n },\r\n};\r\n\r\nclass WindowTool extends Component {\r\n constructor(props) {\r\n super(props);\r\n if (props.componentRef) props.componentRef(this);\r\n this.state = {\r\n pos: { x: 0, y: 0 },\r\n dragging: false,\r\n fileId: null,\r\n size: { height: 200, width: 200 },\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.canvas = document.getElementById(\"WindowToolCanvas\");\r\n this.ctx = this.canvas.getContext(\"2d\");\r\n this.ctx.canvas.width = this.state.size.width;\r\n this.ctx.canvas.height = this.state.size.height;\r\n let r = this.props.rendererDict[\"Full\" + this.props.activeFileId];\r\n let idx =\r\n this.props.fullscreenFileIds.indexOf(this.props.activeFileId) === 0\r\n ? 1\r\n : 0;\r\n this.setState({\r\n pos: {\r\n x: r.canvas.width / 2 - this.ctx.canvas.width / 2,\r\n y: r.canvas.height / 2 - this.ctx.canvas.height / 2,\r\n },\r\n fileId: this.props.fullscreenFileIds[idx],\r\n });\r\n this.ctx.canvas.style.cursor = \"pointer\";\r\n }\r\n\r\n componentWillUnmount() {\r\n document.removeEventListener(\"mousemove\", this.onMouseMove);\r\n document.removeEventListener(\"mouseup\", this.onMouseUp);\r\n }\r\n\r\n componentDidUpdate() {\r\n if (this.state.dragging) {\r\n document.addEventListener(\"mousemove\", this.onMouseMove);\r\n document.addEventListener(\"mouseup\", this.onMouseUp);\r\n } else if (!this.state.dragging) {\r\n document.removeEventListener(\"mousemove\", this.onMouseMove);\r\n document.removeEventListener(\"mouseup\", this.onMouseUp);\r\n }\r\n\r\n let idx =\r\n this.props.fullscreenFileIds.indexOf(this.props.activeFileId) === 0\r\n ? 1\r\n : 0;\r\n let id = this.props.fullscreenFileIds[idx];\r\n if (id !== this.state.fileId) {\r\n this.setState({\r\n fileId: id,\r\n });\r\n }\r\n }\r\n\r\n onMouseDown = (e) => {\r\n if (e.button !== 0) return;\r\n this.ctx.canvas.style.cursor = \"grab\";\r\n this.setState({\r\n dragging: true,\r\n });\r\n e.stopPropagation();\r\n e.preventDefault();\r\n };\r\n\r\n onMouseUp = (e) => {\r\n this.setState({ dragging: false });\r\n this.ctx.canvas.style.cursor = \"pointer\";\r\n e.stopPropagation();\r\n e.preventDefault();\r\n };\r\n\r\n onMouseMove = (e) => {\r\n if (!this.state.dragging) return;\r\n let x = e.pageX - this.canvas.offsetWidth / 2;\r\n let y = e.pageY - 64 - this.canvas.offsetHeight / 2;\r\n let r = this.props.rendererDict[\"Full\" + this.state.fileId];\r\n if (x > r.canvas.width - this.canvas.width)\r\n x = r.canvas.width - this.canvas.width;\r\n if (y > r.canvas.height - this.canvas.height)\r\n y = r.canvas.height - this.canvas.height;\r\n if (x < 0) x = 0;\r\n if (y < 0) y = 0;\r\n this.setState({\r\n pos: {\r\n x: x,\r\n y: y,\r\n },\r\n });\r\n e.stopPropagation();\r\n e.preventDefault();\r\n };\r\n\r\n updateCanvas = () => {\r\n this.ctx.canvas.width = this.state.size.width;\r\n this.ctx.canvas.height = this.state.size.height;\r\n let r = this.props.rendererDict[\"Full\" + this.state.fileId];\r\n if (r) {\r\n if (r.ctx) {\r\n this.ctx.putImageData(\r\n r.ctx.getImageData(\r\n this.state.pos.x,\r\n this.state.pos.y,\r\n this.state.size.width,\r\n this.state.size.height\r\n ),\r\n 0,\r\n 0\r\n );\r\n }\r\n }\r\n };\r\n\r\n handleSizeChanged = (size) => {\r\n this.setState({ size });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n return (\r\n \r\n event.preventDefault()}\r\n onMouseDown={this.onMouseDown}\r\n />\r\n \r\n );\r\n }\r\n}\r\n\r\nWindowTool.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n componentRef: PropTypes.func,\r\n rendererDict: PropTypes.object,\r\n activeFileId: PropTypes.string,\r\n fullscreenFileIds: PropTypes.array,\r\n};\r\n\r\nexport default withStyles(styles)(WindowTool);\r\n","// Copyright HS-Analysis GmbH, 2019\r\n\r\n// Framework imports\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\n// External imports\r\nimport RBush from \"rbush\";\r\n\r\n// Material UI imports\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport Grid from \"@mui/material/Grid\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport LinearProgress from \"@mui/material/LinearProgress\";\r\nimport LinkIcon from \"@mui/icons-material/Link\";\r\nimport LinkOffIcon from \"@mui/icons-material/LinkOff\";\r\nimport RemoveCircleIcon from \"@mui/icons-material/RemoveCircle\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\n// HSA imports\r\nimport { ChannelsConfig } from \"./components/Histogram\";\r\nimport { debounce } from \"../common/utils/Utils\";\r\nimport { RegionROI, CommentROI, createRoisFromAnno } from \"./utils/ROI\";\r\nimport {\r\n updateLayer,\r\n calcBoundingBox,\r\n createRegionRoi,\r\n} from \"./utils/PolygonUtil\";\r\nimport { withAllViewerContexts } from \"./contexts/AllViewerContexts\";\r\nimport { withResultTab } from \"./contexts/ResultTabContext\";\r\nimport { withTiles } from \"./contexts/TilesContext\";\r\nimport Backend from \"../common/utils/Backend\";\r\nimport ClassroomChat from \"./components/ClassroomChat\";\r\nimport FindFilesDialog, {\r\n ProjectActionMode,\r\n} from \"../home/dialogs/FindFilesDialog\";\r\nimport Gallery from \"./components/Gallery\";\r\nimport OverlaySlider from \"./components/OverlaySlider\";\r\nimport Renderer from \"./components/Renderer\";\r\nimport SideBar from \"./components/SideBar\";\r\nimport VerticalToolBar, { Tools } from \"./components/VerticalToolBar\";\r\nimport Viewer3D from \"./components/3D-Viewer\";\r\n\r\n// HSA Tools\r\nimport ActiveLearningTool from \"./components/tools/ActiveLearningTool\";\r\nimport AITrainingTool from \"./components/tools/AITrainingTool\";\r\nimport CommentTool from \"./components/tools/CommentTool\";\r\nimport CopyTool from \"./components/tools/CopyTool\";\r\nimport EllipseTool from \"./components/tools/EllipseTool\";\r\nimport FillTool from \"./components/tools/FillTool\";\r\nimport FilterAnnotationsTool from \"./components/tools/FilterAnnotationsTool\";\r\nimport GridAnnotationTool from \"./components/tools/GridAnnotationTool\";\r\nimport GridTool from \"./components/tools/GridTool\";\r\nimport HeatmapTool from \"./components/tools/HeatmapTool\";\r\nimport InstantAnalysisTool from \"./components/tools/InstantAnalysisTool\";\r\nimport LandmarkTool from \"./components/tools/LandmarkTool\";\r\nimport MagicWandTool from \"./components/tools/MagicWandTool\";\r\nimport PenTool from \"./components/tools/PenTool\";\r\nimport PlotNearestRoiTool from \"./components/tools/PlotNearestRoiTool\";\r\nimport RectangleTool from \"./components/tools/RectangleTool\";\r\nimport RegionGrabCutTool from \"./components/tools/RegionGrabCutTool\";\r\nimport RegionGrowingTool from \"./components/tools/RegionGrowingTool\";\r\nimport RegionSAMTool from \"./components/tools/RegionSAMTool\";\r\nimport RegionTool from \"./components/tools/RegionTool\";\r\nimport RoiResizeTool from \"./components/tools/RoiResizeTool\";\r\nimport SelectionTool from \"./components/tools/SelectionTool\";\r\nimport StreamViewTool from \"./components/tools/StreamViewTool\";\r\nimport TilesClassificationTool from \"./components/tools/TilesClassificationTool\";\r\nimport TilesHistoPointCountingTool from \"./components/tools/TilesHistoPointCountingTool\";\r\nimport WindowTool from \"./components/WindowTool\";\r\n\r\nconst styles = {\r\n root: {\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n background: \"#EBEBEB\",\r\n },\r\n mainContainer: {\r\n flexGrow: 0,\r\n margin: 0,\r\n },\r\n excludeButton: {\r\n position: \"absolute\",\r\n top: 5,\r\n right: 5,\r\n zIndex: 100,\r\n },\r\n attachButton: {\r\n position: \"absolute\",\r\n top: 5,\r\n right: 40,\r\n zIndex: 100,\r\n color: \"#666\",\r\n },\r\n dropfieldRoot: {\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n background: \"rgba(0, 0, 0, 0.514)\",\r\n color: \"rgb(255, 255, 255)\",\r\n zIndex: 100,\r\n pointerEvents: \"none\",\r\n border: \"dashed white 4px\",\r\n textAlign: \"center\",\r\n paddingTop: \"calc(50vh - 74px)\",\r\n fontSize: \"20px\",\r\n },\r\n activeIndicatorBorder: {\r\n position: \"absolute\",\r\n pointerEvents: \"none\",\r\n zIndex: 100,\r\n height: \"100%\",\r\n width: \"100%\",\r\n border: \"solid #0673C1 4px\",\r\n },\r\n};\r\n\r\nclass Viewer extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this._isMounted = false;\r\n let sideBarWidthObject = this.props.persistentStorage.load(\"sideBarWidth\");\r\n let timeLineHeightObject =\r\n this.props.persistentStorage.load(\"timeLineHeight\");\r\n\r\n this.state = {\r\n // Layout information\r\n minSideBarWidth: 455,\r\n minTimeLineHeight: 90,\r\n minRendererWidth: 600,\r\n minCanvasHeight: 100,\r\n sideBarWidth: sideBarWidthObject ? sideBarWidthObject : 455,\r\n timeLineHeight: timeLineHeightObject ? timeLineHeightObject : 170,\r\n classRoomChatWidth: 0,\r\n verticalToolBarWidth: 45,\r\n verticalToolBarIconsHeight: 0,\r\n\r\n // project-specific data\r\n user: null,\r\n project: null,\r\n //fileId: 0,\r\n viewerConfig: null,\r\n ome: null,\r\n omeDict: {},\r\n splitscreenFileIds: [],\r\n fullscreenFileIds: [],\r\n showSplitscreenDropzone: false,\r\n activeFileId: 0,\r\n importProgress: -1,\r\n //\r\n t: 0,\r\n c: 0,\r\n z: 0,\r\n minZ: 0,\r\n maxZ: 0,\r\n rois: [],\r\n selRoi: null,\r\n histogramConfig: {},\r\n activeTool: Tools.NONE,\r\n showGallery: false,\r\n galleryType: \"\",\r\n show3DViewer: false,\r\n showPointCloud: false,\r\n showTilesGallery: false,\r\n updateStructure: true,\r\n showTimeBar: false,\r\n displayTimeBar: false,\r\n showZStackBar: false,\r\n showFileTreeView: true,\r\n commentLayers: {},\r\n landmarkLayers: {},\r\n drawLayer: {\r\n regionRois: [],\r\n inverted: false,\r\n clear: false,\r\n },\r\n containerKey: 0,\r\n opacity: 1.2,\r\n hC: null,\r\n\r\n zoomRoi: false,\r\n zoomLeft: 0,\r\n zoomRight: 0,\r\n zoomTop: 0,\r\n zoomBottom: 0,\r\n scrollGallery: \"auto\",\r\n alruns: false,\r\n exportSubstructures: false,\r\n formDataAICockpit: null,\r\n dimensionsUpdated: false,\r\n gridSize: null,\r\n annotatedFileIds: [],\r\n showFullscreen: false,\r\n showOverlay: false,\r\n showWindowTool: false,\r\n firstFullscreenOpacity: 100,\r\n secFullscreenOpacity: 0,\r\n fullscreenChain: true,\r\n loadedAnnotationsCounter: 0,\r\n frameArrayDict: {},\r\n showFirstAccordion: true,\r\n aiUsedStructures: [],\r\n refreshState: false,\r\n preparingStartJob: false,\r\n annotationsAreReduced: false,\r\n };\r\n this.mousePosition = {\r\n mouseX: 0,\r\n mouseY: 0,\r\n };\r\n // frontend cached images\r\n this.visibleImage = [];\r\n // necessary splitscreen vars\r\n this.rendererdict = {};\r\n this.chainList = {};\r\n this.chainListFileIds = {};\r\n this.zoomObjectDict = {};\r\n this.zoomObject = {\r\n zoomRoi: false,\r\n zoomBottom: 0,\r\n zoomTop: 0,\r\n zoomRight: 0,\r\n zoomLeft: 0,\r\n };\r\n\r\n // apply model after training\r\n this.applyModelAfterTraining = false;\r\n\r\n // check if automatic training\r\n this.automaticTraining = false;\r\n\r\n // selected objects for active learning\r\n this.selObjects = {\r\n coordinates: [],\r\n };\r\n\r\n this.selObjs = false;\r\n this.updateCount = 0;\r\n this.graphData = 0;\r\n this.changingFile = false;\r\n\r\n // initialize tools\r\n this.tools = [];\r\n this.tools[Tools.PEN_ROI] = new PenTool();\r\n this.tools[Tools.MAGICWAND_ROI] = new MagicWandTool();\r\n this.tools[Tools.REGIONGROWING_ROI] = new RegionGrowingTool();\r\n this.tools[Tools.REGIONGRABCUT_ROI] = new RegionGrabCutTool();\r\n this.tools[Tools.REGIONSAM_ROI] = new RegionSAMTool();\r\n this.tools[Tools.REGION_ROI] = new RegionTool();\r\n this.tools[Tools.RECTANGLE_ROI] = new RectangleTool();\r\n this.tools[Tools.COMMENT_ROI] = new CommentTool();\r\n this.tools[Tools.ELLIPSE_ROI] = new EllipseTool();\r\n this.tools[Tools.FILL] = new FillTool();\r\n this.tools[Tools.COPY_ROI] = new CopyTool();\r\n this.tools[Tools.SELECTION_ROI] = new SelectionTool();\r\n this.tools[Tools.FILTERANNOTATIONS_ROI] = new FilterAnnotationsTool();\r\n this.tools[Tools.PLOTNEAREST_ROI] = new PlotNearestRoiTool();\r\n this.tools[Tools.AL] = new ActiveLearningTool();\r\n this.tools[Tools.AITRAINING] = new AITrainingTool(this);\r\n this.tools[Tools.GRIDTOOL] = new GridTool();\r\n this.tools[Tools.GRIDANNOTATIONTOOL] = new GridAnnotationTool();\r\n this.tools[Tools.SELECTION_Tile] = new TilesClassificationTool();\r\n this.tools[Tools.POINTCOUNTING_Tile] = new TilesHistoPointCountingTool();\r\n this.tools[Tools.LANDMARK] = new LandmarkTool();\r\n this.tools[Tools.STREAMVIEW] = new StreamViewTool(); //new StreamViewTool();\r\n this.tools[Tools.ROIRESIZE] = new RoiResizeTool();\r\n this.tools[Tools.HEATMAP] = new HeatmapTool();\r\n\r\n window.sharedToolParameters = {};\r\n\r\n //initialize roi specific tools\r\n this.structureTools = [];\r\n\r\n // new indices of Layers (for old projects)\r\n this.newLayerIndices = [];\r\n\r\n this.setHistogramConfig = this.setHistogramConfig.bind(this);\r\n this.createZoomObjectForRect = this.createZoomObjectForRect.bind(this);\r\n this.resetRoiZoom = this.resetRoiZoom.bind(this);\r\n\r\n this.saveChangesGallery = this.saveChangesGallery.bind(this);\r\n this.applyDL = this.applyDL.bind(this);\r\n this.setAlruns = this.setAlruns.bind(this);\r\n\r\n this.updateViewer = this.updateViewer.bind(this);\r\n\r\n this.galleryChangeTool = this.galleryChangeTool.bind(this);\r\n this.onGallerychangePage = this.onGallerychangePage.bind(this);\r\n\r\n this.resetRoiZoomInDict = this.resetRoiZoomInDict.bind(this);\r\n\r\n window.getMousePosition = this.getMousePosition;\r\n window.zoomToRect = this.zoomToRect;\r\n window.moveToRect = this.moveToRect;\r\n\r\n window.trainingProgress = this.trainingProgress;\r\n window.galleryTrainingProgress = this.galleryTrainingProgress;\r\n window.toggleClassRoomChat = this.toggleClassRoomChat;\r\n window.setGridSize = this.setGridSize;\r\n window.onSelectFile = this.onSelectFile;\r\n\r\n document.onmousedown = () => {\r\n if (this._isMounted) {\r\n this.forceUpdate();\r\n }\r\n };\r\n\r\n document.onmouseup = () => {\r\n if (this._isMounted) {\r\n this.forceUpdate();\r\n }\r\n };\r\n\r\n document.onmousemove = (e) => {\r\n this.mousePosition = {\r\n mouseX: e.pageX,\r\n mouseY: e.pageY,\r\n };\r\n };\r\n\r\n // document.onwheel = () => {\r\n // // TODO: [HWB-911] Find solution that only updates on first load of renderer\r\n // const { showGallery, show3DViewer, showTilesGallery } = this.state;\r\n // if (!showGallery && !show3DViewer && !showTilesGallery) {\r\n // this.forceUpdate();\r\n // }\r\n // };\r\n\r\n // initialize ProjectContext with Viewer Component Parameter\r\n this.props.projectContext.init(this);\r\n\r\n Backend.requestProject(\r\n this.props.id,\r\n (res) => {\r\n if (!res.newMappingsFound && res.allUniquelyMapped) {\r\n this.loadProject();\r\n } else {\r\n this.FindMissingFiles.show(res, () => {\r\n this.loadProject();\r\n });\r\n }\r\n },\r\n (error) => window.openErrorDialog(error)\r\n );\r\n }\r\n\r\n loadProject = () => {\r\n Backend.loadProject(\r\n {\r\n id: this.props.id,\r\n isOpenProject: true,\r\n },\r\n (project) => {\r\n if (project.projectData) {\r\n if (project.files.length > project.projectData.files.length) {\r\n project.projectData.files = project.files.map((file) => {\r\n file.annotations = [];\r\n return file;\r\n });\r\n }\r\n // Attempt to load project data from saved json.\r\n const idMapping = project.files.reduce((map, file) => {\r\n map[file.fileName + file.scene] = file.id;\r\n return map;\r\n }, {});\r\n\r\n project.projectData.files = project.projectData.files.map((file) => {\r\n const fileId = idMapping[file.fileName + file.scene];\r\n if (!fileId) {\r\n console.error(\r\n \"Error loading files: Id mapping failed, was the path to the slides changed?\"\r\n );\r\n }\r\n return { ...file, id: fileId };\r\n });\r\n\r\n project.projectData.files = project.projectData.files.map((file) => {\r\n const fileId = idMapping[file.fileName + file.scene];\r\n if (!fileId) {\r\n console.error(\r\n \"Error loading files: Id mapping failed, was the path to the slides changed?\"\r\n );\r\n }\r\n return { ...file, id: fileId };\r\n });\r\n\r\n this.setMountedState({\r\n formDataAICockpit: JSON.parse(\r\n project.projectData.formDataAICockpit\r\n ),\r\n });\r\n\r\n if (project.projectData.biggestAnnotationsFileSizeInMB > 200) {\r\n this.loadAnnotationsFromDB = true;\r\n }\r\n } else {\r\n // Load presets from general config.\r\n for (let structure of project.viewerConfig.project.structures) {\r\n if (structure.toolPresets) {\r\n for (const toolName of Object.keys(structure.toolPresets)) {\r\n const tool = structure.tools.find(\r\n (tool) => tool.name === toolName\r\n );\r\n if (tool) {\r\n for (const [paramName, value] of Object.entries(\r\n structure.toolPresets[toolName]\r\n )) {\r\n const parameter = tool.parameters.find(\r\n (parameter) => parameter.name === paramName\r\n );\r\n if (parameter) {\r\n parameter.ui.default = value.default;\r\n if (parameter.ui.default[0] === \"[\") {\r\n // if e.g. range slider\r\n parameter.ui.default = JSON.parse(parameter.ui.default);\r\n } else if (parameter.type === \"int\") {\r\n parameter.ui.default = parseInt(\r\n parameter.ui.default,\r\n 10\r\n );\r\n } else if (parameter.type === \"float\") {\r\n parameter.ui.default = parseFloat(parameter.ui.default);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // display project name in navigationBar\r\n window.setNavigationbarTitle(\r\n `${project.name} (${project.viewerConfig.project.label})`\r\n );\r\n let commentLayersObject = {};\r\n let landmarkLayersObject = {};\r\n let frameArrayDict = {};\r\n\r\n for (let file of project.files) {\r\n frameArrayDict[file.id] = {};\r\n commentLayersObject[file.id] = { commentRois: [] };\r\n landmarkLayersObject[file.id] = { landmarkRois: [] };\r\n\r\n if (!(file.id in this.rendererdict)) this.rendererdict[file.id] = {};\r\n if (project.projectData) {\r\n if (\"tMatrices\" in project.projectData) {\r\n if (project.projectData.tMatrices !== null) {\r\n if (file.id in project.projectData.tMatrices) {\r\n this.props.tiles.setTransformationMatnFactnOff(\r\n project.projectData.tMatrices[file.id],\r\n file.id,\r\n project.projectData.tFactors[file.id],\r\n project.projectData.tOffsets[file.id]\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (project.projectData) {\r\n let projectDataFiles = project.projectData.files;\r\n for (let j = 0; j < projectDataFiles.length; j++) {\r\n frameArrayDict[projectDataFiles[j].id] = {};\r\n // in case of old projects => create empty commentLayersObject\r\n if (!commentLayersObject[projectDataFiles[j].id]) {\r\n commentLayersObject[projectDataFiles[j].id] = { commentRois: [] };\r\n }\r\n\r\n if (!landmarkLayersObject[projectDataFiles[j].id]) {\r\n landmarkLayersObject[projectDataFiles[j].id] = {\r\n landmarkRois: [],\r\n };\r\n }\r\n\r\n if (projectDataFiles[j].commentRois) {\r\n commentLayersObject[projectDataFiles[j].id].commentRois =\r\n projectDataFiles[j].commentRois.map((e) => {\r\n return new CommentROI(\r\n e.regions,\r\n e.color,\r\n e.type,\r\n e.commentValue,\r\n e.computedValue\r\n );\r\n });\r\n }\r\n if (projectDataFiles[j].landmarkRois) {\r\n landmarkLayersObject[projectDataFiles[j].id].landmarkRois =\r\n projectDataFiles[j].landmarkRois.map((e) => {\r\n return new CommentROI(\r\n e.regions,\r\n e.color,\r\n e.type,\r\n e.commentValue,\r\n e.computedValue\r\n );\r\n });\r\n }\r\n const fileIdx = j;\r\n let dataFileIdx = projectDataFiles.findIndex((file) => {\r\n return file.id === project.files[fileIdx].id;\r\n });\r\n if (dataFileIdx === -1) {\r\n console.info(\r\n \"saved file and project file do not match, comparing by name and scene\"\r\n );\r\n dataFileIdx = projectDataFiles.findIndex((file) => {\r\n return (\r\n file.fileName === project.files[fileIdx].fileName &&\r\n file.scene === project.files[fileIdx].scene\r\n );\r\n });\r\n }\r\n if (dataFileIdx > -1) {\r\n const projectDataFile = projectDataFiles[dataFileIdx];\r\n const projectFile = project.files[fileIdx];\r\n projectFile.excludeScene = projectDataFile.excludeScene;\r\n projectFile.fullyAnnotated = projectDataFile.fullyAnnotated;\r\n projectFile.annotated = projectDataFile.annotated === true;\r\n projectFile.saved = projectDataFile.saved;\r\n projectFile.classId = projectDataFile.classId;\r\n } else {\r\n // this should not happen\r\n console.log(\r\n \"file data could not be matched with saved data for file:\",\r\n project.files[fileIdx].fileName,\r\n project.files[fileIdx].scene\r\n );\r\n }\r\n }\r\n }\r\n\r\n Backend.getCurrentUser((user) => {\r\n this.setMountedState({ user: user.fullName });\r\n let userPermissions = this.props.projectContext.userPermissions;\r\n userPermissions.canExportModels = user.group.canExportModels;\r\n userPermissions.canImportModels = user.group.canImportModels;\r\n this.props.projectContext.setState({\r\n user: user.fullName,\r\n userPermissions,\r\n });\r\n });\r\n\r\n this.migrateTools(project);\r\n\r\n this.setMountedState({\r\n project,\r\n frameArrayDict: frameArrayDict,\r\n commentLayers: commentLayersObject,\r\n landmarkLayers: landmarkLayersObject,\r\n });\r\n\r\n this.initLayersAndStructures();\r\n\r\n let openedFileId = this.props.persistentStorage.load(\"opened_file_id\");\r\n openedFileId = openedFileId ? openedFileId : project.files[0].id;\r\n //Set correct aFileID\r\n if (this.props.persistentStorage.load(\"ActiveFileId\")) {\r\n this.setMountedState({\r\n activeFileId: this.props.persistentStorage.load(\"ActiveFileId\"),\r\n });\r\n } else {\r\n this.setMountedState({ activeFileId: openedFileId });\r\n }\r\n //Set active FileID as first splitscreenFileID - needed if new project\r\n if (!this.props.persistentStorage.load(\"SplitscreenFileIds\")) {\r\n let sFileIds = this.state.splitscreenFileIds;\r\n sFileIds.push(this.state.activeFileId);\r\n this.setMountedState({\r\n splitscreenFileIds: sFileIds,\r\n });\r\n }\r\n\r\n let fsFileIds = this.state.fullscreenFileIds;\r\n fsFileIds.push(this.state.activeFileId);\r\n this.setMountedState({\r\n fullscreenFileIds: fsFileIds,\r\n });\r\n\r\n if (this.state.splitscreenFileIds) {\r\n if (\r\n !this.state.splitscreenFileIds.includes(this.state.activeFileId)\r\n ) {\r\n // make sure that activeFileId is in SplitscreenFileIds\r\n let sFileIds = this.state.splitscreenFileIds;\r\n sFileIds.push(this.state.activeFileId);\r\n this.setMountedState({\r\n splitscreenFileIds: sFileIds,\r\n });\r\n }\r\n let zoom = null;\r\n let newZoomObjectDict = null;\r\n for (const value of Object.values(this.state.splitscreenFileIds)) {\r\n //load file with needed information\r\n this.openFile(value, this.props.id, false);\r\n //load zoomstate\r\n zoom = this.props.persistentStorage.load(\"zoomObject\" + value);\r\n\r\n newZoomObjectDict = this.zoomObjectDict;\r\n if (zoom) {\r\n newZoomObjectDict[value] = JSON.parse(JSON.stringify(zoom));\r\n } else {\r\n newZoomObjectDict[value] = {\r\n zoomRoi: false,\r\n zoomLeft: 0,\r\n zoomRight: 0,\r\n zoomTop: 0,\r\n zoomBottom: 0,\r\n };\r\n }\r\n }\r\n this.zoomObjectDict = newZoomObjectDict;\r\n } else {\r\n //this.props.tiles.setFileId(openedFileId); //not needed anymore?\r\n this.openFile(openedFileId, this.props.id);\r\n }\r\n\r\n var groupBy = function (xs, key) {\r\n return xs.reduce(function (rv, x) {\r\n // Making sure not to bunch virtual slides into eachother.\r\n if (x[key].endsWith(\"empty_file.png\")) {\r\n (rv[x[\"fileName\"]] = rv[x[key]] || []).push(x);\r\n return rv;\r\n }\r\n // Normal sorting I don't understand, but it works.\r\n (rv[x[key]] = rv[x[key]] || []).push(x);\r\n return rv;\r\n }, {});\r\n };\r\n\r\n const fileGroups = groupBy(project.files, \"sourcePath\");\r\n const fileNames = Object.keys(fileGroups).sort();\r\n const sortedFiles = [];\r\n for (let fileName of fileNames) {\r\n sortedFiles.push(...fileGroups[fileName]);\r\n }\r\n project.files = sortedFiles;\r\n\r\n //this.props.tiles.setFileId(openedFileId); //not needed anymore?\r\n let viewerType =\r\n this.state.viewerConfig.project.projectStringProperties[\"ViewerType\"];\r\n this.setMountedState({\r\n showGallery: viewerType == \"Gallery\",\r\n galleryType:\r\n viewerType == \"Gallery\" ? \"FilesGallery\" : \"AnnotationGallery\",\r\n });\r\n this.setSideBarWidth();\r\n this.props.projectHistory.init(this);\r\n this.props.projectContext.initProject(project);\r\n\r\n let contextStateObject = { project };\r\n\r\n if (!project.isOwner) {\r\n contextStateObject.groupPermissions = {};\r\n for (const [key, value] of Object.entries(project.group)) {\r\n if (typeof value === \"boolean\") {\r\n contextStateObject.groupPermissions[key] = value;\r\n }\r\n }\r\n }\r\n contextStateObject.project = project;\r\n contextStateObject.fileGroups = fileGroups;\r\n this.props.projectContext.setState(contextStateObject);\r\n },\r\n (err) => {\r\n console.error(err);\r\n window.openErrorDialog(err.toString());\r\n }\r\n );\r\n };\r\n\r\n setSelLayerConfig = () => {\r\n // set selected layer defined in config\r\n let idx = this.props.projectContext.structures.findIndex(\r\n (element) => element.defaultSelected\r\n );\r\n if (idx !== -1) {\r\n this.setSelectedLayer(idx);\r\n }\r\n };\r\n\r\n //take tool structure from viewerconfig and set saved tool parameters if same type\r\n migrateTools = (project) => {\r\n if (project.projectData) {\r\n for (let [\r\n structureIndex,\r\n structure,\r\n ] of project.projectData.structures.entries()) {\r\n for (let [toolIndex, tool] of structure.tools.entries()) {\r\n let viewerConfigTool = project.viewerConfig.tools.find(\r\n (vTool) => vTool.name === tool.name\r\n );\r\n if (\r\n typeof viewerConfigTool === \"undefined\" &&\r\n project.viewerConfig.project.structures[structureIndex]\r\n ) {\r\n //if tool was changed in project config\r\n tool =\r\n project.viewerConfig.project.structures[structureIndex].tools[\r\n toolIndex\r\n ];\r\n if (tool) {\r\n viewerConfigTool = project.viewerConfig.tools.find(\r\n (vTool) => vTool.name === tool.name\r\n );\r\n }\r\n }\r\n if (viewerConfigTool) {\r\n let transformedVParameters = this.generateToolParameterDict(\r\n viewerConfigTool.parameters\r\n );\r\n for (const [key, value] of Object.entries(transformedVParameters)) {\r\n if (key in tool.parameters) {\r\n if (typeof tool.parameters[key] === typeof value) {\r\n transformedVParameters[key] = tool.parameters[key];\r\n }\r\n }\r\n }\r\n tool.parameters = transformedVParameters;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n makeProjectCompatible = (project) => {\r\n // does not work in all cases --> needs to get fixed\r\n window.showWarningSnackbar(\r\n \"Please wait. Project was created with old version. Adjusting project for new version ...\"\r\n );\r\n\r\n let sructuresWithNoId = [];\r\n if (project.projectData) {\r\n sructuresWithNoId = project.projectData.structures.filter(\r\n (element) => element.id !== 0\r\n );\r\n }\r\n\r\n if (sructuresWithNoId.length === 0 && project.projectData) {\r\n project.projectData.structures.forEach((projDataStr) => {\r\n let idx = project.viewerConfig.project.structures.findIndex(\r\n (viewerConfStr) => viewerConfStr.label === projDataStr.label\r\n );\r\n // get indices of old structures to adjust roiLayers (annotations)\r\n if (!this.newLayerIndices.includes(idx)) {\r\n this.newLayerIndices.push(idx);\r\n }\r\n });\r\n project.projectData.structures = project.viewerConfig.project.structures;\r\n }\r\n\r\n // load all files and change id of annotations to new position\r\n this.loadAllFiles();\r\n };\r\n\r\n loadAllFiles = () => {\r\n const { project } = this.state;\r\n\r\n let allRoiLayers = {};\r\n for (let file of this.state.project.files) {\r\n allRoiLayers[file.id] = [];\r\n if (project.viewerConfig.project.structures.length > 0) {\r\n allRoiLayers[file.id] = project.viewerConfig.project.structures.map(\r\n () => {\r\n return {\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n };\r\n }\r\n );\r\n }\r\n }\r\n\r\n let newProjectObject = project;\r\n let newRoiLayers = [];\r\n let files = project.files;\r\n let projId = project.id;\r\n if (newProjectObject.projectData !== null) {\r\n let i = 0;\r\n let fileAnnotationsLoaded = 0;\r\n let loadAnnotationsFunction = () => {\r\n newRoiLayers = allRoiLayers;\r\n // if all annotations of files loaded save annotations with adjusted id\r\n if (fileAnnotationsLoaded === newProjectObject.files.length - 1) {\r\n this.createAnnotationsProjectModel(newRoiLayers);\r\n }\r\n fileAnnotationsLoaded = fileAnnotationsLoaded + 1;\r\n };\r\n for (let file of newProjectObject.files) {\r\n this.loadAnnotations(\r\n file,\r\n files[i].id,\r\n projId,\r\n allRoiLayers,\r\n loadAnnotationsFunction\r\n );\r\n i = i + 1;\r\n }\r\n }\r\n };\r\n\r\n countVisibleStructures = () => {\r\n return this.state.project.viewerConfig.project.structures.reduce(\r\n (acc, cur) => acc + (cur.visible ? 1 : 0),\r\n 0\r\n );\r\n };\r\n\r\n createAnnotationsProjectModel = (newRoiLayers) => {\r\n const { project } = this.state;\r\n\r\n const projectModel = {\r\n id: project.id,\r\n files: project.files.map((e) => ({\r\n id: e.id,\r\n annotations: newRoiLayers[e.id].reduce((acc, e, i) => {\r\n if (e.layer.regionRois.length > 0) {\r\n acc.push({\r\n id: i,\r\n geoJSON: {\r\n type: \"MultiPolygon\",\r\n coordinates: e.layer.regionRois.map((c) => c.regions),\r\n withHoles: true,\r\n color1: e.layer.regionRois.map((c) => [c.color]),\r\n subtype: e.layer.regionRois.map((c) => [c.isSubtype]),\r\n name: e.layer.regionRois.map((c) => [c.subtypeName]),\r\n aiAnnotated: e.layer.regionRois.map((c) => [c.aiAnnotated]),\r\n isAnnotated: e.layer.regionRois.map((c) => [c.isAnnotated]),\r\n isLabeled: e.layer.regionRois.map((c) => [c.isLabeled]),\r\n isSelObj: e.layer.regionRois.map((c) => [c.isSelObj]),\r\n isSaved: e.layer.regionRois.map((c) => [c.isSaved]),\r\n z: e.layer.regionRois.map((c) => [c.z]),\r\n comment: e.layer.regionRois.map((c) => [c.comment]),\r\n tileName: e.layer.regionRois.map((c) => [c.tileName]),\r\n structureId: e.layer.regionRois.map((c) => [c.structureId]),\r\n isObject: e.layer.regionRois.map((c) => [c.isObject]),\r\n frequencyClass: e.layer.regionRois.map((c) => [\r\n c.frequencyClass,\r\n ]),\r\n },\r\n });\r\n }\r\n return acc;\r\n }, []),\r\n })),\r\n onlyAnnotations: true,\r\n };\r\n\r\n // save only annotations of project with adjusted id\r\n this.saveWithSpinloader(projectModel);\r\n };\r\n\r\n setAIFormData = (formDataAICockpit) => {\r\n const { project } = this.state;\r\n this.setMountedState({ formDataAICockpit: formDataAICockpit });\r\n // start job if defined in project config\r\n if (\r\n \"AutoSaveStartJob\" in project.viewerConfig.project.projectProperties &&\r\n project.viewerConfig.project.projectProperties[\"AutoSaveStartJob\"] &&\r\n !this.state.preparingStartJob &&\r\n this.state.project.state === \"ready\"\r\n ) {\r\n this.setState({ preparingStartJob: true });\r\n this.saveFunction();\r\n Backend.setProjectsPending([this.state.project.id], () => {\r\n console.log(\"project state changed to pending:\", this.state.project.id);\r\n });\r\n\r\n // return to Home Screen\r\n let { history } = this.props;\r\n setTimeout(\r\n function () {\r\n history.push(\"/\");\r\n },\r\n 3000,\r\n history\r\n );\r\n }\r\n };\r\n\r\n alterStructure = (c) => {\r\n let project = this.state.project;\r\n // load svg's text into blob so we can access it\r\n for (let tool of project.viewerConfig.tools) {\r\n if (!this.tools[tool.name]) {\r\n this.tools[tool.name] = new InstantAnalysisTool(tool, this);\r\n }\r\n }\r\n // load viewer configuration\r\n let allToolNames = Object.values(project.viewerConfig.tools).map(\r\n (v) => v.name\r\n );\r\n let toolParameters = [];\r\n for (let t of c.tools) {\r\n if (!window.sharedToolParameters[t.name]) {\r\n window.sharedToolParameters[t.name] = this.generateToolParameterDict(\r\n t.parameters\r\n );\r\n }\r\n if (!toolParameters[t.name]) {\r\n if (t.shared) {\r\n toolParameters[t.name] = window.sharedToolParameters[t.name];\r\n } else {\r\n toolParameters[t.name] = this.generateToolParameterDict(t.parameters);\r\n }\r\n }\r\n }\r\n\r\n return Object.assign(c, {\r\n isSubtype: c.parentId > 0 ? true : false,\r\n hasChild: this.structureHasChild(c.id),\r\n subtypeLevel: this.findStructureSubtypeLevel(c.parentId),\r\n tools: c.tools.map((t) => ({\r\n name: t.name,\r\n parameters: toolParameters[t.name],\r\n })),\r\n classFrequencies: {\r\n class_0: 0,\r\n class_1: 0,\r\n class_2: 0,\r\n class_3: 0,\r\n class_4: 0,\r\n class_5: 0,\r\n class_6: 0,\r\n },\r\n allToolNames: allToolNames,\r\n visible: true,\r\n isUnfolded: c.parentId > 0 ? false : true,\r\n showSubtypes: false,\r\n addSubtypeText: \"\",\r\n });\r\n };\r\n\r\n updateGlobalZ = (z, minZ, maxZ) => {\r\n this.setMountedState({ z, minZ, maxZ });\r\n };\r\n\r\n updateGlobalT = (t) => {\r\n this.setMountedState({ t: t });\r\n };\r\n\r\n structureHasChild = (id) => {\r\n // check if structure (id) has child --> check if other structure has parentId of structure\r\n let hasChild = false;\r\n this.state.project.viewerConfig.project.structures.forEach((element) => {\r\n if (element.parentId === id) {\r\n hasChild = true;\r\n }\r\n });\r\n return hasChild;\r\n };\r\n\r\n findStructureSubtypeLevel = (parentId, subtypeLevelCount = 0) => {\r\n // return subtype level of structure --> calculate number of parent structures recursively\r\n let parentIndex = this.getParentIndex(parentId);\r\n if (parentIndex !== -1) {\r\n return this.findStructureSubtypeLevel(\r\n this.state.project.viewerConfig.project.structures[parentIndex]\r\n .parentId,\r\n subtypeLevelCount + 1\r\n );\r\n } else {\r\n return subtypeLevelCount;\r\n }\r\n };\r\n\r\n getParentIndex = (parentId) => {\r\n let { structures } = this.props.projectContext;\r\n if (structures.length < 1) {\r\n structures = this.state.project.viewerConfig.project.structures;\r\n }\r\n // return index of parent structures in all structures\r\n let parentIndex = structures.findIndex(\r\n (element) => element.id === parentId\r\n );\r\n return parentIndex;\r\n };\r\n\r\n getParentIndexLayer = (structure) => {\r\n const { structures } = this.props.projectContext;\r\n // get index of parent roilayer\r\n let index = structures.findIndex((element) => element.id === structure.id);\r\n while (\r\n structures[index].subtypeLevel !== 0 &&\r\n structures[index].classificationSubtype\r\n ) {\r\n let pIndex = this.getParentIndex(structures[index].parentId);\r\n if (pIndex >= 0) index = pIndex;\r\n else break;\r\n }\r\n return structures.findIndex((element) => element === structures[index]);\r\n };\r\n\r\n clearOtherLayers = () => {\r\n const currentFileId = this.props.projectContext.fileId;\r\n let project = this.state.project;\r\n if (project.projectData) {\r\n let roiLayers = this.props.projectContext.roiLayers;\r\n for (let file of project.files) {\r\n if (file.id === currentFileId) {\r\n continue;\r\n }\r\n roiLayers[file.id] = [];\r\n roiLayers[file.id] = project.projectData.structures.map((c) => {\r\n return {\r\n id: c.id,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n };\r\n });\r\n }\r\n this.props.projectContext.setState({ roiLayers });\r\n }\r\n };\r\n\r\n updateStructuresWithPersistentStorage = (structures) => {\r\n // check structures\r\n const structuresStateList =\r\n this.props.persistentStorage.loadProjectTypeValue(\r\n this.state.project.type,\r\n \"structuresStateList\"\r\n );\r\n if (structuresStateList === null) return;\r\n if (structuresStateList.length === structures.length) {\r\n for (let i = 0; i < structures.length; i++) {\r\n structures[i].isUnfolded = structuresStateList[i].isUnfolded;\r\n structures[i].visible = structuresStateList[i].visible;\r\n structures[i].showSubtypes = structuresStateList[i].showSubtypes;\r\n }\r\n }\r\n };\r\n\r\n initLayersAndStructures = () => {\r\n let project = this.state.project;\r\n\r\n // load svg's text into blob so we can access it\r\n for (let tool of project.viewerConfig.tools) {\r\n this.tools[tool.name] = new InstantAnalysisTool(tool, this);\r\n }\r\n this.setMountedState({ viewerConfig: project.viewerConfig });\r\n let roiLayers = {};\r\n let commentLayers = {};\r\n let landmarkLayers = {};\r\n\r\n // Init layers and structures set by project config in .json\r\n let structures = project.viewerConfig.project.structures.map((c) => {\r\n return this.alterStructure(c);\r\n });\r\n\r\n // Init layers and structures that were previously manually added and saved to project.json.\r\n for (let file of project.files) {\r\n roiLayers[file.id] = [];\r\n commentLayers[file.id] = { commentRois: [] };\r\n landmarkLayers[file.id] = { landmarkRois: [] };\r\n if (project.viewerConfig.project.structures.length > 0) {\r\n if (\r\n project.projectData &&\r\n project.projectData.structures &&\r\n project.projectData.structures[0].id !== 0\r\n ) {\r\n roiLayers[file.id] = project.projectData.structures.map((c) => {\r\n return {\r\n id: c.id,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n };\r\n });\r\n } else {\r\n roiLayers[file.id] = project.viewerConfig.project.structures.map(\r\n (c) => {\r\n return {\r\n id: c.id,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n };\r\n }\r\n );\r\n }\r\n }\r\n }\r\n\r\n // load data from project.json\r\n if (project.projectData) {\r\n let histogramConfig = this.state.histogramConfig;\r\n for (let file of project.projectData.files) {\r\n histogramConfig[file.id] = file.histogram;\r\n for (let i = 0; i < project.projectData.structures.length; i++) {\r\n // if structure from config is not same as saved one --> add dynamic structure\r\n if (\r\n !structures[i] ||\r\n structures[i].id !== project.projectData.structures[i].id\r\n ) {\r\n // add additional dynamic structure at index\r\n structures.splice(\r\n i,\r\n 0,\r\n this.alterStructure({\r\n dynamic: true,\r\n visible: true,\r\n isUnfolded: true,\r\n classificationSubtype: false,\r\n parentId: 0,\r\n showSubtypes: false,\r\n subtypeLevel: 0,\r\n allToolNames: structures[0].allToolNames,\r\n tools: project.viewerConfig.project.dynamicStructure.tools,\r\n })\r\n );\r\n const structure = project.projectData.structures[i];\r\n // make correct value for unfolded\r\n if (structure.parentId) {\r\n structures[i].isUnfolded = false;\r\n }\r\n structures[i] = Object.assign(structures[i], structure);\r\n\r\n // merge stored parameters into the toolsconfig\r\n for (let t of structures[i].tools) {\r\n let storedParams = structure.tools.find((c) => c.name === t.name);\r\n if (storedParams) {\r\n Object.assign(t.parameters, storedParams.parameters);\r\n }\r\n }\r\n } else {\r\n const structure = project.projectData.structures[i];\r\n if (structure.id === 0) {\r\n // for old projects\r\n // do nothing\r\n } else {\r\n // merge stored parameters into the toolsconfig\r\n for (const toolIndex in structure.tools) {\r\n let t = structure.tools[toolIndex];\r\n let storedParams = structure.tools.find(\r\n (c) => c.name === t.name\r\n );\r\n if (storedParams) {\r\n Object.assign(t.parameters, storedParams.parameters);\r\n }\r\n if (\r\n project.viewerConfig.project.structures[i] &&\r\n !(t.name in this.tools)\r\n ) {\r\n //happens when tool changed in config\r\n t =\r\n project.viewerConfig.project.structures[i].tools[toolIndex];\r\n }\r\n if (t) {\r\n if (\r\n this.tools[t.name] &&\r\n this.tools[t.name].toolConfig.shared\r\n ) {\r\n Object.assign(\r\n window.sharedToolParameters[t.name],\r\n t.parameters\r\n );\r\n t.parameters = window.sharedToolParameters[t.name];\r\n }\r\n structure.tools[toolIndex] = t;\r\n }\r\n }\r\n\r\n structures[i] = Object.assign(structures[i], structure);\r\n\r\n if (this.checkIfErrorInProjectData(structures[i])) {\r\n structures[i].hasChild = this.structureHasChild(\r\n structures[i].id\r\n );\r\n structures[i].isSubtype =\r\n structures[i].parentId > 0 ? true : false;\r\n structures[i].subtypeLevel = this.findStructureSubtypeLevel(\r\n structures[i].parentId\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n // load annotation layers\r\n for (let anno of file.annotations) {\r\n let newRegionRois = createRoisFromAnno(anno);\r\n roiLayers[file.id][anno.id].layer.regionRois = newRegionRois;\r\n roiLayers[file.id][anno.id].tree.clear();\r\n roiLayers[file.id][anno.id].tree.load(\r\n newRegionRois.map((item) => item.treeItem)\r\n );\r\n }\r\n }\r\n\r\n this.selObjects.coordinates = project.projectData.selectedObjects;\r\n this.graphData = project.projectData.selectedObjects\r\n ? this.selObjects.coordinates.length\r\n : 0;\r\n this.setMountedState({ histogramConfig: histogramConfig });\r\n }\r\n\r\n if (this._isMounted) this.forceUpdate();\r\n\r\n this.updateStructuresWithPersistentStorage(structures);\r\n\r\n this.props.projectContext.setState({\r\n roiLayers,\r\n structures,\r\n viewerConfig: project.viewerConfig,\r\n });\r\n this.setMountedState({\r\n structures,\r\n });\r\n };\r\n\r\n checkIfErrorInProjectData = (str) => {\r\n if (!str.classificationSubtype && str.parentId === 0 && !str.hasChild) {\r\n // if parent\r\n return true;\r\n } else if (str.classificationSubtype && str.subtypeLevel === 0) {\r\n // if classification subtype error\r\n return true;\r\n } else if (\r\n !str.classificationSubtype &&\r\n str.parentId > 0 &&\r\n !str.isSubtype\r\n ) {\r\n // if substructure error\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n //zoomToRoi - creates zoom object with given coordinates and\r\n createZoomObjectForRect(gl, left, right, top, bottom) {\r\n // set state that viewer/rendererdict[this.state.activeFileId] zooms to roi thath was clicked in gallery with mouse wheel\r\n\r\n this.X1 = 0;\r\n this.Y1 = 0;\r\n\r\n let newZoomObjectDict = this.zoomObjectDict;\r\n newZoomObjectDict[this.state.activeFileId] = {\r\n zoomRoi: true,\r\n zoomLeft: left,\r\n zoomRight: right,\r\n zoomTop: top,\r\n zoomBottom: bottom,\r\n };\r\n this.setMountedState({\r\n showGallery: gl,\r\n showTilesGallery: gl,\r\n });\r\n this.zoomObjectDict = newZoomObjectDict;\r\n }\r\n\r\n setGalleryTool = () => {\r\n this.setMountedState({ activeTool: Tools.NONE });\r\n };\r\n\r\n changeToSelectedFile = () => {\r\n const { project } = this.state;\r\n\r\n let selectedFileId = null;\r\n // find id of file that is selected in gallery\r\n project.files.forEach((f) => {\r\n if (f.selectedInGallery === true) {\r\n selectedFileId = f.id;\r\n }\r\n });\r\n\r\n if (selectedFileId) {\r\n this.onSelectFile(selectedFileId);\r\n }\r\n };\r\n\r\n resetRoiZoom() {\r\n this.zoomObject.zoomRoi = false;\r\n }\r\n\r\n resetRoiZoomInDict(fileId) {\r\n let newZoomObjectDict = this.zoomObjectDict;\r\n if (newZoomObjectDict) {\r\n newZoomObjectDict[fileId].zoomRoi = false;\r\n this.zoomObjectDict = newZoomObjectDict;\r\n this.setMountedState({ refreshState: true });\r\n }\r\n }\r\n\r\n setHistogramConfig(hConfig) {\r\n this.setMountedState({ hC: hConfig });\r\n }\r\n\r\n generateToolParameterDict(parameters) {\r\n if (\"paramLabels\" in parameters) return parameters;\r\n //if (parameters.name) return parameters;\r\n let paramDict = {};\r\n let paramLabelDict = {};\r\n for (let parameter of parameters) {\r\n paramDict[parameter.name] = parameter.ui.default;\r\n paramLabelDict[parameter.name] = parameter.ui.label;\r\n }\r\n paramDict[\"paramLabels\"] = paramLabelDict;\r\n return paramDict;\r\n }\r\n\r\n processGeoJSONArray = (anno, frameArray) => {\r\n const { selectedLayer, structures } = this.props.projectContext;\r\n if (anno.geoJSONArray) {\r\n let layerID = anno.id === -1 ? selectedLayer : structures[anno.id].id;\r\n for (let item of anno.geoJSONArray) {\r\n const frame = item.i;\r\n if (item.geoJSON == null) continue;\r\n let newRegionRoisObject = item.geoJSON.coordinates.map(\r\n (c) => new RegionROI({ regions: c })\r\n );\r\n let layerObject = {\r\n id: layerID,\r\n isKeyFrame: true,\r\n layer: {\r\n regionRois: newRegionRoisObject,\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n };\r\n layerObject.tree.load(newRegionRoisObject.map((item) => item.treeItem));\r\n\r\n if (frame in frameArray) {\r\n const tIdx = frameArray[frame].findIndex(\r\n (item) => item && item.id === layerID\r\n );\r\n if (tIdx >= 0) {\r\n frameArray[frame][tIdx] = layerObject;\r\n } else {\r\n frameArray[frame].push(layerObject);\r\n }\r\n } else {\r\n frameArray[frame] = [layerObject];\r\n }\r\n if (frame === this.state.t || frame === this.state.z) {\r\n anno.geoJSON = item.geoJSON;\r\n }\r\n }\r\n }\r\n };\r\n\r\n updateProject = (project, fileId = this.props.projectContext.fileId) => {\r\n const { roiLayers, selectedLayer } = this.props.projectContext;\r\n let frameArray = this.state.frameArrayDict[this.state.activeFileId];\r\n\r\n // load annotation layers\r\n for (let anno of project.files.find((c) => c.id === fileId).annotations) {\r\n this.processGeoJSONArray(anno, frameArray);\r\n if (anno.geoJSON === null) continue;\r\n let newRegionRois = createRoisFromAnno(anno);\r\n let idx = 0;\r\n if (anno.id === -1) {\r\n idx = selectedLayer;\r\n }\r\n roiLayers[fileId][idx].layer.regionRois = newRegionRois;\r\n roiLayers[fileId][idx].tree.load(\r\n newRegionRois.map((item) => item.treeItem)\r\n );\r\n }\r\n this.props.projectContext.setState({ roiLayers: roiLayers });\r\n };\r\n\r\n updateFileClasses = (projectWithClasses) => {\r\n const { project } = this.props.projectContext;\r\n projectWithClasses.files.forEach((file, fileIndex) => {\r\n project.files[fileIndex].classId = file.classId;\r\n });\r\n };\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n window.addEventListener(\"resize\", () => this.updateDimensions());\r\n window.addEventListener(\"keydown\", this.keyDown);\r\n\r\n let ids = this.props.persistentStorage.load(\"SplitscreenFileIds\");\r\n if (ids) {\r\n this.setMountedState({ splitscreenFileIds: ids });\r\n }\r\n\r\n let activeId = this.props.persistentStorage.load(\"ActiveFileId\");\r\n if (activeId) {\r\n this.setMountedState({ activeFileId: activeId });\r\n }\r\n\r\n let chainList = this.props.persistentStorage.load(\"chainList\");\r\n if (chainList) this.chainList = chainList;\r\n let chainListFileIds =\r\n this.props.persistentStorage.load(\"chainListFileIds\");\r\n if (chainListFileIds) this.chainListFileIds = chainListFileIds;\r\n\r\n if (ids) {\r\n let newZoomObjectDict = this.zoomObjectDict;\r\n for (const fileId of Object.values(ids)) {\r\n newZoomObjectDict[fileId] = this.getLocalZoomObject(fileId);\r\n }\r\n this.zoomObjectDict = newZoomObjectDict;\r\n }\r\n\r\n this.props.spinloader.setRightWidth(\r\n this.state.sideBarWidth +\r\n this.state.verticalToolBarWidth +\r\n this.state.classRoomChatWidth\r\n );\r\n this.props.projectContext.setPersistentStorage(\r\n this.props.persistentStorage\r\n );\r\n }\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n window.removeEventListener(\"resize\", () => this.updateDimensions());\r\n window.removeEventListener(\"keydown\", this.keyDown);\r\n window.setNavigationbarTitle(undefined);\r\n this.props.spinloader.hide();\r\n Backend.closeProject(\r\n this.props.id,\r\n () => {},\r\n (err) =>\r\n console.warn(`Could not perform all closing actions: \\n\\n ${err}`)\r\n );\r\n }\r\n\r\n getLocalZoomObject = (fileId) => {\r\n const zoom = this.props.persistentStorage.load(\"zoomObject\" + fileId);\r\n let zoomObject = {};\r\n if (zoom) {\r\n zoom.zoomRoi = true;\r\n }\r\n if (zoom) {\r\n zoomObject = JSON.parse(JSON.stringify(zoom));\r\n } else {\r\n zoomObject = {\r\n zoomRoi: false,\r\n zoomLeft: 0,\r\n zoomRight: 0,\r\n zoomTop: 0,\r\n zoomBottom: 0,\r\n };\r\n }\r\n return zoomObject;\r\n };\r\n\r\n toggleRois = () => {\r\n const { structures } = this.state.project.viewerConfig.project;\r\n if (this.countVisibleStructures() > 0) {\r\n for (let roiLayer of structures) {\r\n roiLayer.visible = false;\r\n }\r\n } else {\r\n for (let roiLayer of structures) {\r\n roiLayer.visible = true;\r\n }\r\n }\r\n this.forceUpdate();\r\n };\r\n\r\n /**\r\n * handle shortcuts\r\n * @param {ActionEvent} e Event when keyboard button is pressed\r\n */\r\n keyDown = (e) => {\r\n let elem = null;\r\n if (\r\n this.rendererdict[this.state.activeFileId] &&\r\n this.rendererdict[this.state.activeFileId].keyDown\r\n )\r\n this.rendererdict[this.state.activeFileId].keyDown(e);\r\n if (\r\n document.activeElement.localName !== \"input\" &&\r\n document.activeElement.localName !== \"textarea\"\r\n ) {\r\n if (e.key === \"Insert\") {\r\n // [shift] + [Numpad 0]\r\n elem = document.getElementById(\"toolZoomFitBtn\");\r\n } else if (e.key === \"End\") {\r\n // [shift] + [Numpad 1]\r\n elem = document.getElementById(\"toolZoomOriginalBtn\");\r\n } else if (e.shiftKey) {\r\n switch (e.key) {\r\n case \"*\":\r\n case \"+\": // [shift] + [+]\r\n elem = document.getElementById(\"toolZoomInBtn\");\r\n break;\r\n case \"_\":\r\n case \"-\": // [shift] + [-]\r\n elem = document.getElementById(\"toolZoomOutBtn\");\r\n break;\r\n case \"=\": // [shift] + [0]\r\n elem = document.getElementById(\"toolZoomFitBtn\");\r\n break;\r\n case \"!\": // [shift] + [1]\r\n elem = document.getElementById(\"toolZoomOriginalBtn\");\r\n break;\r\n case \"R\": // [shift] + [r]\r\n this.toggleRois();\r\n break;\r\n default:\r\n break;\r\n }\r\n } else if (e.altKey) {\r\n for (let i = 1; i < 10; i++) {\r\n if (e.key === i.toString()) {\r\n elem = document.getElementById(\"channel_\" + (i - 1).toString());\r\n break;\r\n }\r\n }\r\n }\r\n if (e.ctrlKey) {\r\n switch (e.key) {\r\n case \"ArrowRight\":\r\n this.openNextFile();\r\n break;\r\n case \"ArrowLeft\":\r\n this.openPrevFile();\r\n break;\r\n case \"s\": // [ctrl] + [s]\r\n if (this.props.projectContext.groupPermissions.canAnnotate) {\r\n this.onSaveClick();\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"1\": // [ctrl] + [1]\r\n elem = document.getElementById(\"toolPenBtn\");\r\n break;\r\n case \"2\": // [ctrl] + [2]\r\n elem = document.getElementById(\"toolRegionBtn\");\r\n break;\r\n case \"3\": // [ctrl] + [3]\r\n elem = document.getElementById(\"toolSelectBtn\");\r\n break;\r\n case \"4\": // [ctrl] + [4]\r\n elem = document.getElementById(\"toolCopyBtn\");\r\n break;\r\n case \"g\": // [ctrl] + [g]\r\n this.setMountedState({\r\n showTilesGallery: this.state.showTilesGallery ? false : true,\r\n });\r\n this.toggleSideBar();\r\n this.setGalleryTool();\r\n this.gallery.setPageSelectedRoi(this.state.selRoi);\r\n e.preventDefault();\r\n break;\r\n case \"5\": // [ctrl] + [5]\r\n elem = document.getElementById(\"toolFillBtn\");\r\n break;\r\n case \"p\": //[ctrl] + [p]\r\n elem = document.getElementById(\"toolPrintBtn\");\r\n break;\r\n\r\n case \"z\": //[ctrl] + [z]\r\n if (!this.state.showGallery && !this.state.showTilesGallery) {\r\n this.props.projectHistory.undo();\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"y\": //[ctrl] + [y]\r\n if (!this.state.showGallery && !this.state.showTilesGallery) {\r\n this.props.projectHistory.redo();\r\n }\r\n e.preventDefault();\r\n break;\r\n default:\r\n break;\r\n }\r\n } else {\r\n switch (e.key) {\r\n case \" \": // space\r\n if (this.state.showTilesGallery) {\r\n this.gallery.handleChangeCrosshair(null, true);\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"Delete\":\r\n if (\r\n typeof this.state.showTilesGallery === \"undefined\" &&\r\n this.state.showGallery\r\n ) {\r\n this.gallery.deleteSelectedRoi();\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowUp\":\r\n if (this.state.showTilesGallery) {\r\n this.gallery.handleChangePage(null, \"up\");\r\n } else if (\r\n typeof this.state.showTilesGallery === \"undefined\" ||\r\n this.state.showTilesGallery === false\r\n ) {\r\n if (this.state.activeTool === \"selection\") {\r\n // select roi next to selected roi\r\n this.rendererdict[this.state.activeFileId].keyDownSelection(e);\r\n } else if (this.state.activeTool !== \"rectangle\") {\r\n // translate by the offset to the destination point if not in result tab\r\n if (!this.props.resultTab.getZoomLevelFixed()) {\r\n this.rendererdict[this.state.activeFileId].ctx.translate(\r\n 0,\r\n 50\r\n );\r\n }\r\n }\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowDown\":\r\n if (this.state.showTilesGallery) {\r\n this.gallery.handleChangePage(null, \"down\");\r\n } else if (\r\n typeof this.state.showTilesGallery === \"undefined\" ||\r\n this.state.showTilesGallery === false\r\n ) {\r\n if (this.state.activeTool === \"selection\") {\r\n // select roi next to selected roi\r\n this.rendererdict[this.state.activeFileId].keyDownSelection(e);\r\n } else if (this.state.activeTool !== \"rectangle\") {\r\n // translate by the offset to the destination point if not in result tab\r\n if (!this.props.resultTab.getZoomLevelFixed()) {\r\n this.rendererdict[this.state.activeFileId].ctx.translate(\r\n 0,\r\n -50\r\n );\r\n }\r\n }\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowLeft\":\r\n if (\r\n typeof this.state.showTilesGallery === \"undefined\" ||\r\n this.state.showTilesGallery === false\r\n ) {\r\n if (this.state.showGallery) {\r\n this.gallery.selectNewImage(\"left\");\r\n } else {\r\n if (this.state.activeTool === \"selection\") {\r\n // select roi next to selected roi\r\n this.rendererdict[this.state.activeFileId].keyDownSelection(\r\n e\r\n );\r\n } else if (this.state.activeTool !== \"rectangle\") {\r\n // translate by the offset to the destination point if not in result tab\r\n if (!this.props.resultTab.getZoomLevelFixed()) {\r\n this.rendererdict[this.state.activeFileId].ctx.translate(\r\n 50,\r\n 0\r\n );\r\n }\r\n }\r\n }\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowRight\":\r\n if (\r\n typeof this.state.showTilesGallery === \"undefined\" ||\r\n this.state.showTilesGallery === false\r\n ) {\r\n if (this.state.showGallery) {\r\n this.gallery.selectNewImage(\"right\");\r\n } else {\r\n if (this.state.activeTool === \"selection\") {\r\n // select roi next to selected roi\r\n this.rendererdict[this.state.activeFileId].keyDownSelection(\r\n e\r\n );\r\n } else if (this.state.activeTool !== \"rectangle\") {\r\n // translate by the offset to the destination point if not in result tab\r\n if (!this.props.resultTab.getZoomLevelFixed()) {\r\n this.rendererdict[this.state.activeFileId].ctx.translate(\r\n -50,\r\n 0\r\n );\r\n }\r\n }\r\n }\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"0\":\r\n case \"1\":\r\n case \"2\":\r\n case \"3\":\r\n case \"4\":\r\n case \"5\":\r\n case \"6\":\r\n case \"7\":\r\n case \"8\":\r\n case \"9\":\r\n {\r\n let pressedNumber = parseInt(e.key);\r\n if (this.state.showTilesGallery) {\r\n this.gallery.classifyTilesGalleryWithKey(pressedNumber);\r\n } else if (this.state.showGallery) {\r\n this.gallery.classifyImageWithKey(pressedNumber);\r\n } else {\r\n if (this.state.activeTool === \"selection\") {\r\n this.rendererdict[\r\n this.state.activeFileId\r\n ].classifySelectedRoi(pressedNumber);\r\n } else if (\r\n this.resultTabActive() &&\r\n this.state.project.type.includes(\"HistoClassification\")\r\n ) {\r\n window.addFrequencyClass(pressedNumber);\r\n } else if (\r\n this.resultTabActive() &&\r\n this.state.project.type.includes(\"HistoPointCounting\")\r\n ) {\r\n window.classifyTileWithkey(pressedNumber);\r\n }\r\n }\r\n e.preventDefault();\r\n }\r\n break;\r\n case \"+\":\r\n this.rendererdict[this.state.activeFileId].onScaleOnly({\r\n wheelDelta: 120,\r\n });\r\n e.preventDefault();\r\n break;\r\n case \"-\":\r\n this.rendererdict[this.state.activeFileId].onScaleOnly({\r\n wheelDelta: -120,\r\n });\r\n e.preventDefault();\r\n break;\r\n case \"r\":\r\n document.getElementById(\"roiTabBtn\").click();\r\n e.preventDefault();\r\n break;\r\n case \"v\":\r\n document.getElementById(\"viewTabBtn\").click();\r\n e.preventDefault();\r\n break;\r\n default:\r\n break;\r\n }\r\n if (\r\n typeof this.tools[this.state.activeTool] !== \"undefined\" &&\r\n this.tools[this.state.activeTool].onKeyDown\r\n )\r\n this.tools[this.state.activeTool].onKeyDown(\r\n e,\r\n false,\r\n this.checkToolInConfig(\"TilesTool\")\r\n );\r\n }\r\n }\r\n if (elem !== null) {\r\n elem.click();\r\n e.preventDefault();\r\n }\r\n if (\r\n this.rendererdict[this.state.activeFileId] &&\r\n this.rendererdict[this.state.activeFileId].showResultTable\r\n ) {\r\n window.updateResultTable();\r\n }\r\n };\r\n\r\n setSelectedRoi = (roi) => {\r\n this.setMountedState({ selRoi: roi.r });\r\n };\r\n\r\n updateDimensions() {\r\n let savedT = 0;\r\n if (\r\n this.rendererdict[this.state.activeFileId] &&\r\n this.rendererdict[this.state.activeFileId].state\r\n ) {\r\n savedT = this.rendererdict[this.state.activeFileId].state.t;\r\n }\r\n // reset all child components\r\n this.setMountedState({\r\n dimensionsUpdated: true,\r\n containerKey: new Date().getTime(),\r\n });\r\n if (this.rendererdict[this.state.activeFileId] && savedT > 0) {\r\n this.rendererdict[this.state.activeFileId].updateT(savedT);\r\n }\r\n let zoom;\r\n let newZoomObjectDict;\r\n for (const value of Object.values(this.state.splitscreenFileIds)) {\r\n zoom = this.props.persistentStorage.load(\"zoomObject\" + value);\r\n //if (zoom) zoom.zoomRoi = true;\r\n newZoomObjectDict = this.zoomObjectDict;\r\n if (zoom) {\r\n newZoomObjectDict[value] = JSON.parse(JSON.stringify(zoom));\r\n } else {\r\n newZoomObjectDict[value] = {\r\n zoomRoi: false,\r\n zoomLeft: 0,\r\n zoomRight: 0,\r\n zoomTop: 0,\r\n zoomBottom: 0,\r\n };\r\n }\r\n this.zoomObjectDict = newZoomObjectDict;\r\n }\r\n }\r\n\r\n getArrayDepth = (depthArray) => {\r\n let depth = 0;\r\n let child = depthArray[0];\r\n while (typeof child !== \"undefined\") {\r\n depth++;\r\n child = child[0];\r\n }\r\n return depth;\r\n };\r\n\r\n /**\r\n * Check if polygon corresponds to the given treeItem\r\n * @param {*} polygon Polygon that should be compared\r\n * @param {*} treeItem treeItem that should be compared\r\n * @returns True/False\r\n */\r\n isCorrespondingPolygon = (polygon, treeItem) => {\r\n for (let contour of polygon) {\r\n // check if contour has one common point with treeItem\r\n if (\r\n contour.find(\r\n (point) =>\r\n point[0] === treeItem.regions[0][0] &&\r\n point[1] === treeItem.regions[0][1]\r\n )\r\n ) {\r\n // check if contour has second common point with treeItem\r\n if (\r\n contour.find(\r\n (point) =>\r\n point[0] === treeItem.regions[1][0] &&\r\n point[1] === treeItem.regions[1][1]\r\n )\r\n ) {\r\n // assume to be same object and discard other polygons\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n createNewRois = (frameGeoJson) => {\r\n if (\r\n this.getArrayDepth(frameGeoJson.coordinates) === 5 &&\r\n frameGeoJson.coordinates.length === 1\r\n )\r\n frameGeoJson.coordinates = frameGeoJson.coordinates[0];\r\n\r\n //let newRois = [];\r\n let tree = new RBush();\r\n let newRois = createRoisFromAnno({ geoJSON: frameGeoJson });\r\n tree.load(newRois.map((item) => item.treeItem)); //load tree to new data\r\n return [newRois, tree];\r\n };\r\n\r\n loadAnnotations(file, id, projectId, newroiLayers, callback) {\r\n this.props.spinloader.show();\r\n const fileData = {\r\n id: projectId,\r\n fileId: file.id,\r\n };\r\n const queryOptions = {\r\n minX: -1,\r\n minY: -1,\r\n maxX: -1,\r\n maxY: -1,\r\n maxResults: 2000,\r\n };\r\n const zoomObject = this.getLocalZoomObject(file.id);\r\n if (zoomObject && zoomObject.zoomRoi) {\r\n queryOptions.minX = parseInt(zoomObject.zoomLeft, 10);\r\n queryOptions.minY = parseInt(zoomObject.zoomTop, 10);\r\n queryOptions.maxX = parseInt(zoomObject.zoomRight, 10);\r\n queryOptions.maxY = parseInt(zoomObject.zoomBottom, 10);\r\n }\r\n Backend.loadAnnotations(fileData, queryOptions)\r\n .then((jsonAnnotations) => {\r\n this.processLoadedAnnotations(\r\n jsonAnnotations,\r\n file,\r\n id,\r\n projectId,\r\n newroiLayers,\r\n callback\r\n );\r\n if (jsonAnnotations.is_reduced === true) {\r\n window.showWarningSnackbar(\r\n \"Too many annotations to render, only sample annotations from middle are loaded!\"\r\n );\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(err);\r\n window.openErrorDialog(\"Could not load annotations:\\n\" + err);\r\n this.props.spinloader.hide();\r\n });\r\n }\r\n\r\n updateVisibleROIDebounced = debounce(\r\n (...args) => this.updateVisibleROI(...args),\r\n 100\r\n );\r\n\r\n processLoadedAnnotations = (\r\n jsonAnnotations,\r\n file,\r\n id,\r\n projectId,\r\n newroiLayers,\r\n callback\r\n ) => {\r\n const { structures } = this.props.projectContext;\r\n if (jsonAnnotations.is_locked) {\r\n // call Backend.loadAnnotations(...) again after 5 seconds until jsonAnnotations.is_locked does not exist anymore\r\n setTimeout(() => {\r\n this.loadAnnotations(file, id, projectId, newroiLayers, callback);\r\n }, 5000);\r\n return;\r\n }\r\n this.props.projectContext.setState({\r\n annotationsReduced: jsonAnnotations.is_reduced,\r\n totalRoiCount: jsonAnnotations.total_roi_count,\r\n });\r\n let result = jsonAnnotations.data;\r\n this.setMountedState({\r\n annotationsAreReduced: jsonAnnotations.is_reduced,\r\n });\r\n\r\n if (!callback) {\r\n file.annotations = result;\r\n }\r\n\r\n // part of video annotation. Start\r\n\r\n let keys = [];\r\n let emptyIdxs = [0];\r\n for (let i = 1; i < result.length; i++) {\r\n let idframeArray =\r\n result[i].geoJSON.idframeArray || result[i].geoJSON.idTimeArray;\r\n if (\r\n typeof idframeArray === \"undefined\" ||\r\n Object.keys(idframeArray).length === 0\r\n ) {\r\n emptyIdxs.push(i);\r\n continue;\r\n }\r\n\r\n keys.push(\r\n ...Object.keys(\r\n result[i].geoJSON.idframeArray || result[i].geoJSON.idTimeArray\r\n )\r\n );\r\n }\r\n keys = [...new Set(keys)];\r\n function objectframeArray(keys) {\r\n return keys.reduce(function (result, key) {\r\n result[key] = [];\r\n return result;\r\n }, {});\r\n }\r\n let loadedframeArray = objectframeArray(keys, function (value) {\r\n return value;\r\n });\r\n Object.keys(loadedframeArray).forEach((key) => {\r\n for (let i = 1; i < result.length; i++) {\r\n let anno = result[i];\r\n let frameGeoJson =\r\n anno.geoJSON.idframeArray && anno.geoJSON.idframeArray[key]\r\n ? anno.geoJSON.idframeArray[key]\r\n : anno.geoJSON; //take default annotations, if no frame found\r\n\r\n if (!frameGeoJson) {\r\n continue;\r\n }\r\n const [newRois, tree] = this.createNewRois(frameGeoJson);\r\n let structROIs = {\r\n id: anno.geoJSON.structID ? anno.geoJSON.structID : structures[i].id,\r\n layer: {\r\n inverted: false,\r\n regionRois: newRois,\r\n },\r\n tree: tree,\r\n };\r\n if (frameGeoJson.isKeyFrame && frameGeoJson.isKeyFrame === true) {\r\n structROIs.isKeyFrame = true;\r\n }\r\n loadedframeArray[key].push(structROIs);\r\n }\r\n });\r\n\r\n // add annotations from job\r\n for (let i = 0; i < result.length; i++) {\r\n this.processGeoJSONArray(result[i], loadedframeArray);\r\n }\r\n\r\n let frameArrayDict = this.state.frameArrayDict;\r\n frameArrayDict[this.state.activeFileId] = loadedframeArray;\r\n\r\n this.setMountedState({\r\n frameArrayDict: frameArrayDict,\r\n loadedAnnotationsCounter: this.state.loadedAnnotationsCounter + 1,\r\n });\r\n\r\n // part of video annotation. End\r\n\r\n // part of frame annotation. Start\r\n // for (let i of emptyIdxs) {\r\n for (let i = 0; i < result.length; i++) {\r\n if (i >= result.length) break;\r\n let anno = result[i];\r\n // ensuring that old files also work\r\n const newRois = this.createNewRois(anno.geoJSON)[0];\r\n let idx = 0;\r\n if (this.newLayerIndices.length !== 0) {\r\n idx = this.newLayerIndices[i];\r\n } else {\r\n idx = anno.id;\r\n }\r\n\r\n if (newroiLayers[file.id][idx]) {\r\n // create an Id if not set\r\n if (!newroiLayers[file.id][idx].id)\r\n newroiLayers[file.id][idx].id = idx + 1;\r\n\r\n newroiLayers[file.id][idx].layer.regionRois = newRois;\r\n newroiLayers[file.id][idx].tree = new RBush();\r\n newroiLayers[file.id][idx].tree.load(\r\n newRois.map((item) => item.treeItem)\r\n ); //load tree to new data\r\n }\r\n }\r\n\r\n // part of frame annotation. End\r\n this.props.spinloader.hide();\r\n if (!this.state.annotatedFileIds.includes(file.id)) {\r\n this.setMountedState((prevState) => ({\r\n annotatedFileIds: [...prevState.annotatedFileIds, file.id],\r\n }));\r\n }\r\n if (typeof callback === \"function\") {\r\n callback();\r\n }\r\n };\r\n\r\n updateVisibleROI = (p1, p2) => {\r\n if (!this.state.annotationsAreReduced) return;\r\n const { roiLayers, fileId, structures } = this.props.projectContext;\r\n const structuresMap = {};\r\n for (let i = 0; i < structures.length; i++) {\r\n structuresMap[structures[i].id] = i;\r\n }\r\n structuresMap[1] = 0;\r\n let currentFile = this.props.projectContext.project.files.find(\r\n (file) => file.id === fileId\r\n );\r\n if (!this.props.projectContext.isLoadingAnnotations) {\r\n this.props.projectContext.setState({ isLoadingAnnotations: true });\r\n\r\n const fileData = {\r\n id: this.state.project.id,\r\n fileId: currentFile.id,\r\n };\r\n\r\n const queryOptions = {\r\n minX: parseInt(p1.x, 10),\r\n minY: parseInt(p1.y, 10),\r\n maxX: parseInt(p2.x, 10),\r\n maxY: parseInt(p2.y, 10),\r\n maxResults: 2000,\r\n };\r\n\r\n Backend.loadAnnotations(fileData, queryOptions)\r\n .then((jsonAnnotations) => {\r\n this.processLoadedAnnotations(\r\n jsonAnnotations,\r\n currentFile,\r\n fileId,\r\n this.state.project.id,\r\n roiLayers\r\n );\r\n this.props.spinloader.hide();\r\n this.props.projectContext.setState({ isLoadingAnnotations: false });\r\n const lp1 = this.lastViewRoiParams.p1;\r\n const lp2 = this.lastViewRoiParams.p2;\r\n if (p1.x !== lp1.x || p1.y !== lp1.y) {\r\n this.updateVisibleROIDebounced(lp1, lp2);\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(err);\r\n window.openErrorDialog(\r\n `Could not load annotations of file ${currentFile.label}:\\n${err}`\r\n );\r\n this.props.spinloader.hide();\r\n this.props.projectContext.setState({ isLoadingAnnotations: false });\r\n });\r\n }\r\n this.lastViewRoiParams = { p1, p2 };\r\n };\r\n\r\n devtoolsOpen() {\r\n const threshold = 160;\r\n const widthThreshold = window.outerWidth - window.innerWidth > threshold;\r\n const heightThreshold = window.outerHeight - window.innerHeight > threshold;\r\n //const orientation = widthThreshold ? \"vertical\" : \"horizontal\";\r\n\r\n if (\r\n !(heightThreshold && widthThreshold) &&\r\n ((window.Firebug &&\r\n window.Firebug.chrome &&\r\n window.Firebug.chrome.isInitialized) ||\r\n widthThreshold ||\r\n heightThreshold)\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n openNextFile = () => {\r\n const { fileId, project } = this.props.projectContext;\r\n const files = project.files;\r\n const fileIdx = files.findIndex((file) => file.id === fileId);\r\n if (fileIdx >= 0 && files.length > fileIdx + 1) {\r\n this.onSelectFile(files[fileIdx + 1].id);\r\n }\r\n };\r\n\r\n openPrevFile = () => {\r\n const { fileId, project } = this.props.projectContext;\r\n const files = project.files;\r\n const fileIdx = files.findIndex((file) => file.id === fileId);\r\n if (fileIdx > 0) {\r\n this.onSelectFile(files[fileIdx - 1].id);\r\n }\r\n };\r\n\r\n /**\r\n * Load the file with the given id, include its OME metadata, and set it as the active file.\r\n * @param {Uuid} id The id of the file to open.\r\n * @param {Uuid} projectId The id of the project the file belongs to.\r\n * @param {Boolean} fileChange ???\r\n * @returns\r\n */\r\n openFile(id, projectId, fileChange = false) {\r\n if (this.lastFileId === id) return; //prevent loading File twice\r\n this.lastFileId = id;\r\n const { roiLayers, structures } = this.props.projectContext;\r\n // create empty roilayers for dynamic structures\r\n if (roiLayers[id]) {\r\n for (let structure of structures) {\r\n const roiLayer = roiLayers[id].find((c) => c.id === structure.id);\r\n if (!roiLayer) {\r\n roiLayers[id].push({\r\n id: structure.id,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n });\r\n }\r\n }\r\n this.props.projectContext.setState({ roiLayers });\r\n }\r\n\r\n // load image meta data\r\n Backend.loadImage(\r\n {\r\n id: id,\r\n },\r\n (ome) => {\r\n if (ome.fileName) {\r\n let newOme = { ...this.state.omeDict };\r\n newOme[id] = ome;\r\n this.props.persistentStorage.save(\"opened_file_id\", id);\r\n let newStateObject = {\r\n omeDict: newOme,\r\n fileId: id,\r\n showTimeBar: ome.sizeT > 1,\r\n showZStackBar: ome.sizeZ > 1,\r\n displayTimeBar: ome.sizeT > 1,\r\n displayZStackBar: ome.sizeZ > 1,\r\n histogramConfig: this.state.histogramConfig,\r\n ome,\r\n importProgress: -1,\r\n };\r\n if (\r\n !fileChange &&\r\n !this.props.persistentStorage.load(\"SplitscreenFileIds\")\r\n ) {\r\n newStateObject.splitscreenFileIds = [id];\r\n }\r\n\r\n if (!fileChange) newStateObject.containerKey = new Date().getTime();\r\n\r\n if (!newStateObject.histogramConfig[id]) {\r\n // write loaded data in to component state\r\n newStateObject.histogramConfig[id] = new ChannelsConfig(\r\n ome.channels.map((c, i) => {\r\n //set general name, if none in metadata\r\n if (c.name === null) {\r\n c.name = \"Ch \" + i;\r\n }\r\n return c;\r\n })\r\n );\r\n }\r\n Object.assign(this.state, newStateObject);\r\n this.props.projectContext.setState(newStateObject, () => {\r\n let newProjectObject = this.state.project;\r\n if (newProjectObject.projectData !== null) {\r\n let currentFile = newProjectObject.files.find(\r\n (file) => file.id === id\r\n );\r\n if (currentFile) {\r\n this.loadAnnotations(\r\n currentFile,\r\n id,\r\n projectId,\r\n roiLayers,\r\n () => {\r\n this.setMountedState({ project: newProjectObject });\r\n this.props.projectContext.setState({\r\n project: newProjectObject,\r\n roiLayers,\r\n });\r\n this.props.projectHistory.init(this);\r\n }\r\n );\r\n }\r\n }\r\n });\r\n } else if (ome.importNeeded) {\r\n this.setMountedState({ importProgress: 0 });\r\n const socket = Backend.getSocket();\r\n socket.on(\"import_progress\", (progress) => {\r\n if (progress !== \"CLOSE\") {\r\n this.setMountedState({ importProgress: parseInt(progress, 10) });\r\n } else {\r\n this.setMountedState({ importProgress: -1 });\r\n socket.close(); // close socket\r\n // reload page\r\n window.location.reload();\r\n }\r\n // log when socket is closed\r\n socket.onclose = () => {\r\n console.log(\"Socket for import closed.\");\r\n };\r\n });\r\n } else {\r\n let failedFilePath = this.state.project.files.find(\r\n (file) => file.id === id\r\n ).sourcePath;\r\n window.openErrorDialog(\r\n \"Error: Most likely the original file could not be found:\\n\" +\r\n failedFilePath\r\n );\r\n }\r\n\r\n // if histo classification project draw grid for next file\r\n if (\r\n this.state.project.type.includes(\"HistoClassification\") &&\r\n this.state.gridSize &&\r\n this.rendererdict[this.state.activeFileId]\r\n ) {\r\n setTimeout(() => {\r\n this.onChangeTool(\"gridtool\");\r\n this.tools[\"gridtool\"].createGrid(this.state.gridSize, false, true);\r\n }, 400);\r\n setTimeout(\r\n () => this.rendererdict[this.state.activeFileId].centerRoi(),\r\n 600\r\n );\r\n }\r\n\r\n // if point counting project draw grid for next file\r\n if (\r\n this.state.project.type.includes(\"HistoPointCounting\") &&\r\n this.state.gridSize &&\r\n this.rendererdict[this.state.activeFileId]\r\n ) {\r\n setTimeout(() => {\r\n this.onChangeTool(\"gridtool\");\r\n this.tools[\"gridtool\"].createGrid(this.state.gridSize, true, true);\r\n }, 400);\r\n setTimeout(\r\n () => this.rendererdict[this.state.activeFileId].centerRoi(),\r\n 600\r\n );\r\n }\r\n\r\n if (!fileChange) {\r\n // set default selected layer\r\n this.setSelLayerConfig();\r\n }\r\n\r\n // if e.g. Tobacco Analysis and no Base-Roi set, set whole Scene as Base-Roi\r\n if (this.checkPropertyInConfig(\"AutomaticBaseRoiWholeImage\")) {\r\n let idx = 0;\r\n if (this.props.projectContext.selectedLayer != null) {\r\n idx = this.props.projectContext.selectedLayer;\r\n }\r\n setTimeout(() => {\r\n this.setSelectedLayer(0);\r\n this.onChangeTool(\"gridtool\");\r\n this.tools[\"gridtool\"].createGrid(1, true, false);\r\n this.onChangeTool(\"none\");\r\n this.setSelectedLayer(idx);\r\n }, 1000);\r\n }\r\n\r\n // set full image as structure\r\n let automaticFullImageRoiLayer =\r\n this.state.viewerConfig.project.projectStringProperties[\r\n \"AutomaticFullImageRoiLayer\"\r\n ];\r\n if (automaticFullImageRoiLayer) {\r\n this.setMountedState({\r\n opacity: 0,\r\n });\r\n let idx = 0;\r\n if (this.props.projectContext.selectedLayer != null) {\r\n idx = this.props.projectContext.selectedLayer;\r\n }\r\n setTimeout(() => {\r\n this.setSelectedLayer(parseInt(automaticFullImageRoiLayer, 10));\r\n let gridExists =\r\n roiLayers[id][parseInt(automaticFullImageRoiLayer, 10)].layer\r\n .regionRois.length > 0;\r\n if (!gridExists) {\r\n this.onChangeTool(\"gridtool\");\r\n this.tools[\"gridtool\"].createGrid(1, true, false);\r\n this.onChangeTool(\"none\");\r\n }\r\n this.onChangeTool(\"selection\");\r\n this.setSelectedLayer(idx);\r\n }, 2000);\r\n }\r\n\r\n // set file change false\r\n setTimeout(() => {\r\n this.props.resultTab.setFileChange(false);\r\n if (this._isMounted) this.forceUpdate();\r\n }, 1);\r\n },\r\n (error) => {\r\n let failedFilePath = this.state.project.files.find(\r\n (file) => file.id === id\r\n ).sourcePath;\r\n let msg = `Error importing file ${failedFilePath}:\\n${error}`;\r\n console.log(msg);\r\n window.openErrorDialog(msg);\r\n },\r\n (e) => {\r\n console.log(\"Import progress:\", e);\r\n this.setMountedState({ importProgress: e.progress });\r\n }\r\n );\r\n\r\n if (this.state.showGallery) {\r\n this.setMountedState({ showGallery: false });\r\n }\r\n }\r\n\r\n deleteRoiLayersForScene = () => {\r\n const { roiLayers, structures } = this.props.projectContext;\r\n const { activeFileId } = this.state;\r\n\r\n for (let i = 0; i < structures.length; i++) {\r\n if (roiLayers[activeFileId][i]) {\r\n roiLayers[activeFileId][i].layer.regionRois = [];\r\n roiLayers[activeFileId][i].tree.clear();\r\n }\r\n }\r\n this.props.projectContext.setState({ roiLayers });\r\n\r\n // remove file from annotated files\r\n const index = this.state.annotatedFileIds.indexOf(activeFileId);\r\n if (index > -1) {\r\n this.state.annotatedFileIds.splice(index, 1);\r\n }\r\n };\r\n\r\n // change the active tool\r\n onChangeTool = (activeTool, params) => {\r\n if (\r\n activeTool === \"iam_ai_inference\" &&\r\n this.props.projectContext.activeTab === 1 &&\r\n !this.state.aiUsedStructures.filter(\r\n (e) =>\r\n e.id ===\r\n this.props.projectContext.structures[\r\n this.props.projectContext.selectedLayer\r\n ].id\r\n ).length > 0\r\n ) {\r\n activeTool = \"none\";\r\n }\r\n if (this.state.showGallery) {\r\n setTimeout(() => this.galleryChangeTool(activeTool, params), 100);\r\n } else {\r\n if (\r\n this.rendererdict[this.state.activeFileId] &&\r\n this.rendererdict[this.state.activeFileId].updatePreviewRect &&\r\n this.checkTool(activeTool)\r\n ) {\r\n if (\r\n this.tools[this.state.activeTool] &&\r\n typeof this.tools[this.state.activeTool].exit === \"function\"\r\n ) {\r\n this.tools[this.state.activeTool].exit();\r\n }\r\n\r\n this.setMountedState({ activeTool }, () => {\r\n this.rendererdict[this.state.activeFileId].updatePreviewRect(\r\n activeTool\r\n );\r\n\r\n this.rendererdict[\r\n this.state.activeFileId\r\n ].props.drawLayer.regionRois = [];\r\n\r\n let tool = this.tools[activeTool];\r\n if (tool && tool.onParameterChange) {\r\n tool.onParameterChange(params);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n checkTool = (e) => {\r\n const { structures, selectedLayer } = this.props.projectContext;\r\n // check if tool can be selected with selected structure\r\n switch (e) {\r\n case \"selection\":\r\n if (!structures[selectedLayer].hasChild) {\r\n window.showWarningSnackbar(\"Structure has no children.\");\r\n return false;\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n return true;\r\n };\r\n\r\n checkToolInConfig = (toolName) => {\r\n if (this.state.viewerConfig) {\r\n if (this.state.viewerConfig.project.toolsInProject[toolName]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n };\r\n\r\n checkPropertyInConfig = (property) => {\r\n if (this.state.viewerConfig) {\r\n if (this.state.viewerConfig.project.projectProperties[property]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n };\r\n\r\n resultTabActive = () => {\r\n // check if active tab is result tab\r\n if (!this.checkToolInConfig(\"ResultTab\")) {\r\n return false;\r\n }\r\n\r\n // check which tabs exist in module --> then decide which index result tab has\r\n let persisObj = this.props.persistentStorage.load(\"activeTab\");\r\n let activeTab = persisObj ? persisObj : 0;\r\n if (\r\n this.checkToolInConfig(\"AICockpit\") &&\r\n this.checkToolInConfig(\"RoiTab\")\r\n ) {\r\n // resultTab = 3\r\n return activeTab === 3;\r\n } else if (\r\n this.checkToolInConfig(\"AICockpit\") ||\r\n this.checkToolInConfig(\"RoiTab\")\r\n ) {\r\n // resultTab = 2\r\n return activeTab === 2;\r\n } else {\r\n // resultTab = 1\r\n return activeTab === 1;\r\n }\r\n };\r\n\r\n updateStructureChange = () => {\r\n setTimeout(() => this.setMountedState({ updateStructure: true }), 100);\r\n };\r\n\r\n onGallerychangePage() {\r\n this.setMountedState({ activeTool: Tools.NONE });\r\n }\r\n\r\n galleryChangeTool(activeTool, params) {\r\n if (this.checkTool(activeTool)) {\r\n this.setMountedState({ activeTool: activeTool });\r\n let tool = this.tools[activeTool];\r\n if (tool && tool.onParameterChange) {\r\n tool.onParameterChange(params);\r\n }\r\n }\r\n }\r\n\r\n onSelectFile = (e) => {\r\n let { activeFileId, splitscreenFileIds } = this.state;\r\n if (splitscreenFileIds.includes(e)) {\r\n if (this.state.showFullscreen) {\r\n if (this.sliderRef && this.state.showOverlay) {\r\n this.sliderRef.fileCheck(e, () => {\r\n this.addFileToFullscreen(e, this.sliderRef.state.checkedUp ? 1 : 0);\r\n });\r\n } else {\r\n this.addFileToFullscreen(e, 0);\r\n }\r\n } else {\r\n this.addFileToFullscreen(e, 0);\r\n }\r\n activeFileId = e;\r\n this.props.persistentStorage.save(\"ActiveFileId\", activeFileId);\r\n this.setMountedState({\r\n activeFileId,\r\n });\r\n } else {\r\n this.props.tiles.resetVisibleImages(); //prevent ram issue\r\n this.props.tiles.resetColoredImages(); //prevent ram issue\r\n //this.props.tiles.setFileId(e);\r\n //this.props.projectContext.setChangingFile(true);\r\n // save annotations when changing file\r\n\r\n this.saveFunction(null, () => {\r\n this.onSwitchFileSplitscreen(e);\r\n if (this.sliderRef && this.state.showOverlay) {\r\n this.addFileToFullscreen(e, this.sliderRef.state.checkedUp ? 0 : 1);\r\n } else {\r\n this.addFileToFullscreen(e, 0);\r\n }\r\n if (\r\n !(\r\n this.state.project.type.includes(\"HistoPointCounting\") ||\r\n this.state.project.type.includes(\"HistoClassification\")\r\n )\r\n ) {\r\n this.clearOtherLayers();\r\n }\r\n });\r\n }\r\n };\r\n\r\n onExcludeFilesToggle = (files, value) => {\r\n let projectObject = this.state.project;\r\n for (let file of files) {\r\n for (let f of projectObject.files) {\r\n if (file.id === f.id) {\r\n file.excludeScene = value;\r\n }\r\n }\r\n }\r\n this.setMountedState(projectObject);\r\n };\r\n\r\n toggleFileTreeView = () => {\r\n this.setMountedState({\r\n showFileTreeView: !this.state.showFileTreeView,\r\n containerKey: new Date().getTime(),\r\n });\r\n };\r\n\r\n onExportParameters = () => {\r\n const { structures } = this.props.projectContext;\r\n\r\n let dataStr =\r\n \"data:text/json;charset=utf-8,\" +\r\n encodeURIComponent(JSON.stringify(structures));\r\n let dlAnchorElem = document.createElement(\"a\");\r\n dlAnchorElem.setAttribute(\"href\", dataStr);\r\n const strData = this.props.projectContext.getProjectStringInfos();\r\n dlAnchorElem.setAttribute(\r\n \"download\",\r\n strData.name + \"_\" + strData.type + \"_\" + strData.fileName + \".strhsa\"\r\n );\r\n dlAnchorElem.click();\r\n dlAnchorElem.remove();\r\n };\r\n\r\n //TODO: [HWB-910] to fix because probably broken because of turf integration\r\n loadSCNXMLAnnotations(docstr) {\r\n var parser = new DOMParser();\r\n var doc = parser.parseFromString(docstr, \"application/xml\");\r\n window.annodoc = doc;\r\n\r\n const annotations = doc.getElementsByTagName(\"Annotation\");\r\n for (let i = 0; i < annotations.length; i++) {\r\n console.log(i, \"=>\", annotations[i]);\r\n const regions = annotations[i].children[1];\r\n for (let region of regions.children) {\r\n if (region.tagName !== \"Region\") continue;\r\n const vertices = region.children[1];\r\n const points = [];\r\n for (let vertex of vertices.children) {\r\n points.push([\r\n parseInt(vertex.getAttribute(\"X\")),\r\n parseInt(vertex.getAttribute(\"Y\")),\r\n ]);\r\n }\r\n let drawRegion = {\r\n regions: [\r\n // NOTE: the last two parameters might have to be adjusted in case of bugs.\r\n createRegionRoi([points], \"#ff0000\", false, \"Tumor\", null, null),\r\n ],\r\n inverted: false,\r\n bounds: calcBoundingBox([points]),\r\n };\r\n const { roiLayers } = this.props.projectContext;\r\n // roiLayers[this.state.activeFileId][1].layer.regionRois.push(\r\n // drawRegion\r\n // );\r\n const selRoiLayer = roiLayers[this.state.activeFileId][i + 1]; // skip base roi\r\n updateLayer(\r\n selRoiLayer.layer,\r\n drawRegion,\r\n false,\r\n \"#ff0000\",\r\n false,\r\n \"Tumor\",\r\n selRoiLayer.tree\r\n );\r\n }\r\n }\r\n }\r\n\r\n onImportParameters = (e) => {\r\n let files = e.target.files;\r\n if (files.length <= 0) return false;\r\n\r\n let fr = new FileReader();\r\n fr.onload = (e) => {\r\n try {\r\n if (e.target.result.startsWith(\" 0 && structures[0].label) {\r\n this.props.projectContext.importStructures(structures);\r\n } else {\r\n window.showErrorSnackbar(\"File not supported!\");\r\n }\r\n }\r\n } catch (e) {\r\n console.log(\"import errror:\", e);\r\n window.showErrorSnackbar(\"File not supported!\");\r\n }\r\n };\r\n fr.readAsText(files.item(0));\r\n };\r\n\r\n deleteforAllScenes = (selectedLayer) => {\r\n const { roiLayers } = this.props.projectContext;\r\n Object.keys(roiLayers).forEach((e) => {\r\n roiLayers[e][selectedLayer].layer.regionRois = [];\r\n roiLayers[e][selectedLayer].tree.clear();\r\n });\r\n this.props.projectContext.setState({ roiLayers });\r\n };\r\n\r\n getNumberSubstructuresWithRois = () => {\r\n const { activeFileId } = this.state;\r\n const { selectedLayer, structures, roiLayers } = this.props.projectContext;\r\n // calculate number of substructures that have rois (for export)\r\n let parentLayer = this.getParentIndexLayer(structures[selectedLayer]);\r\n let nextParentLayer = parentLayer + 1;\r\n // calculate next substructure or parentlayer on same subtypelevel\r\n for (let i = parentLayer; i < structures.length; i++) {\r\n if (\r\n !structures[i].classificationSubtype &&\r\n structures[i].subtypeLevel === structures[parentLayer].subtypeLevel\r\n ) {\r\n nextParentLayer = i;\r\n }\r\n }\r\n\r\n // count substructures with rois between parentlayer and nextparentlayer\r\n let count = 0;\r\n for (let i = parentLayer + 1; i < nextParentLayer; i++) {\r\n if (\r\n structures[i].isSubtype &&\r\n !structures[i].classificationSubtype &&\r\n roiLayers[activeFileId][i].layer.regionRois.length !== 0\r\n ) {\r\n count = count + 1;\r\n }\r\n }\r\n return count;\r\n };\r\n\r\n createProjectModel = (layersToSave, previewRect) => {\r\n const {\r\n project,\r\n histogramConfig,\r\n viewerConfig,\r\n formDataAICockpit,\r\n commentLayers,\r\n landmarkLayers,\r\n } = this.state;\r\n const { selectedLayer, structures, roiLayers, user } =\r\n this.props.projectContext;\r\n\r\n //this.adjustRoiLayers();\r\n let parentLayer = this.getParentIndexLayer(structures[selectedLayer]);\r\n const projectModel = {\r\n name: project.name,\r\n user: user,\r\n id: project.id,\r\n readableId: project.readableId,\r\n metaData: JSON.parse(project.metaData),\r\n type: project.type,\r\n tools: viewerConfig.project.tools,\r\n job: viewerConfig.project.job,\r\n structures: structures,\r\n formDataAICockpit: JSON.stringify(formDataAICockpit),\r\n tMatrices: this.props.tiles.getAllTransformationMatrices(),\r\n tFactors: this.props.tiles.getAllTransformationFactors(),\r\n tOffsets: this.props.tiles.getAllTransformationOffsets(),\r\n files: project.files.map((file) => {\r\n let frameArray = this.state.frameArrayDict[file.id];\r\n\r\n return {\r\n id: file.id,\r\n fileName: file.fileName,\r\n sourcePath: file.sourcePath,\r\n histogram: histogramConfig[file.id],\r\n scene: file.scene,\r\n excludeScene: file.excludeScene,\r\n fullyAnnotated: file.fullyAnnotated,\r\n annotated: file.annotated === true,\r\n saved: file.saved,\r\n classId: file.classId,\r\n commentRois: commentLayers[file.id].commentRois.map((roi, i) => {\r\n return {\r\n id: i,\r\n regions: roi.regions,\r\n color: roi.color,\r\n type: roi.type,\r\n commentValue: roi.commentValue,\r\n };\r\n }),\r\n landmarkRois: landmarkLayers[file.id].landmarkRois.map((roi, i) => {\r\n return {\r\n id: i,\r\n regions: roi.regions,\r\n color: roi.color,\r\n type: roi.type,\r\n commentValue: roi.commentValue,\r\n };\r\n }),\r\n annotations: roiLayers[file.id].reduce((acc, roiLayer, i) => {\r\n if (\r\n (roiLayer.layer.regionRois ||\r\n this.state.annotatedFileIds.includes(file.id)) &&\r\n layersToSave !== \"none\"\r\n ) {\r\n if (layersToSave === \"all\" || layersToSave.includes(i)) {\r\n let rois;\r\n let current_id = roiLayer.id;\r\n let idTimeArr = {};\r\n\r\n for (let key in frameArray) {\r\n if (key in frameArray) {\r\n for (\r\n let idLayer = 0;\r\n idLayer < frameArray[key].length;\r\n idLayer++\r\n ) {\r\n if (frameArray[key][idLayer].id === current_id) {\r\n let tArrRois =\r\n frameArray[key][idLayer].layer.regionRois;\r\n let frameIdTimeArr = {\r\n type: \"MultiPolygon\",\r\n coordinates: tArrRois.map((c) => c.regions),\r\n withHoles: true,\r\n color1: tArrRois.map((c) => [c.color]),\r\n subtype: tArrRois.map((c) => [c.isSubtype]),\r\n name: tArrRois.map((c) => [c.subtypeName]),\r\n aiAnnotated: tArrRois.map((c) => [c.aiAnnotated]),\r\n isAnnotated: tArrRois.map((c) => [c.isAnnotated]),\r\n isLabeled: tArrRois.map((c) => [c.isLabeled]),\r\n isSelObj: tArrRois.map((c) => [c.isSelObj]),\r\n isSaved: tArrRois.map((c) => [c.isSaved]),\r\n z: tArrRois.map((c) => [c.z]),\r\n comment: tArrRois.map((c) => [c.comment]),\r\n tileName: tArrRois.map((c) => [c.tileName]),\r\n structureId: tArrRois.map((c) => [c.structureId]),\r\n isObject: tArrRois.map((c) => [c.isObject]),\r\n frequencyClass: tArrRois.map((c) => [\r\n c.frequencyClass,\r\n ]),\r\n };\r\n if (\r\n frameArray[key][idLayer].isKeyFrame &&\r\n frameArray[key][idLayer].isKeyFrame === true\r\n ) {\r\n frameIdTimeArr.isKeyFrame = true;\r\n }\r\n idTimeArr[key] = frameIdTimeArr;\r\n }\r\n }\r\n }\r\n }\r\n if (previewRect) {\r\n rois = roiLayer.tree\r\n .search({\r\n minX: previewRect.x,\r\n minY: previewRect.y,\r\n maxX: previewRect.x + previewRect.w,\r\n maxY: previewRect.y + previewRect.h,\r\n })\r\n .map((treeItem) => treeItem.roi);\r\n } else {\r\n rois = roiLayer.layer.regionRois;\r\n }\r\n acc.push({\r\n id: i,\r\n geoJSON: {\r\n structID: current_id,\r\n idframeArray: idTimeArr,\r\n type: \"MultiPolygon\",\r\n coordinates: rois.map((c) => c.regions),\r\n withHoles: true,\r\n color1: rois.map((c) => [c.color]),\r\n subtype: rois.map((c) => [c.isSubtype]),\r\n name: rois.map((c) => [c.subtypeName]),\r\n aiAnnotated: rois.map((c) => [c.aiAnnotated]),\r\n isAnnotated: rois.map((c) => [c.isAnnotated]),\r\n isLabeled: rois.map((c) => [c.isLabeled]),\r\n isSelObj: rois.map((c) => [c.isSelObj]),\r\n isSaved: rois.map((c) => [c.isSaved]),\r\n z: rois.map((c) => [c.z]),\r\n comment: rois.map((c) => [c.comment]),\r\n tileName: rois.map((c) => [c.tileName]),\r\n structureId: rois.map((c) => [c.structureId]),\r\n isObject: rois.map((c) => [c.isObject]),\r\n frequencyClass: rois.map((c) => [c.frequencyClass]),\r\n },\r\n });\r\n }\r\n }\r\n return acc;\r\n }, []),\r\n };\r\n }),\r\n\r\n selectedObjects: this.selObjects.coordinates,\r\n selLayer: selectedLayer,\r\n selStructure: structures[selectedLayer].label,\r\n selStructureId: structures[parentLayer].id,\r\n exportSubstructures: this.state.exportSubstructures, // not used at the moment (always export substructures)\r\n onlyAnnotations: false,\r\n zLevelClassification: this.props.tiles.getZLevel(),\r\n numberSubstructuresWithRois: this.getNumberSubstructuresWithRois(),\r\n };\r\n return projectModel;\r\n };\r\n\r\n getSelectedObjects = (x, fileID, fromActiveLearning) => {\r\n const { activeFileId } = this.state;\r\n //const { selectedLayer, roiLayers } = this.props.projectContext;\r\n // get classified objects from backend/training/classificaton and assign class and new properties\r\n\r\n this.selObjects = x;\r\n this.selObjs = true;\r\n this.updateCount = this.updateCount + 1;\r\n\r\n // isSaved property removed --> because with isSaved labeled images can not be classified by ai\r\n /*if (roiLayers[fileID] && roiLayers[fileID][selectedLayer]) {\r\n // set isSaved property true for all labeled images (by user) --> do not save twice (in next iterations)\r\n roiLayers[fileID][selectedLayer].layer.regionRois.forEach(function (\r\n element\r\n ) {\r\n if (!element.aiAnnotated && element.isSubtype) {\r\n // if roi is subtype but not annotated by ai\r\n element.isSaved = true;\r\n } else if (element.aiAnnotated && element.isLabeled) {\r\n // if roi annotated by ai but classified by user afterwards\r\n element.isSaved = true;\r\n }\r\n });\r\n }*/\r\n\r\n // if in current file --> set properties for objects/rois\r\n if (fileID === activeFileId) {\r\n this.setAIObjects(fromActiveLearning);\r\n }\r\n\r\n // set training finished and update\r\n this.setAlruns(false);\r\n if (this._isMounted) this.forceUpdate();\r\n };\r\n\r\n setAIObjects = (fromActiveLearning) => {\r\n const { activeFileId } = this.state;\r\n const { selectedLayer, structures, roiLayers } = this.props.projectContext;\r\n\r\n // set properties for rois (classification result)\r\n let fileID = activeFileId;\r\n let Objs = this.selObjects;\r\n\r\n if (Objs && Objs.coordinates.length > 0 && Objs.coordinates[0] !== null) {\r\n roiLayers[fileID][selectedLayer].layer.regionRois.forEach(function (roi) {\r\n // get same element from backend results\r\n let r = Objs.coordinates.filter(\r\n (element) =>\r\n parseInt(roi.bounds.left, 10) === element.x &&\r\n parseInt(roi.bounds.top, 10) === element.y\r\n )[0];\r\n // only set new properties if roi is not already classified by user\r\n if (r && !roi.isLabeled) {\r\n let subtypeStructureIdx = structures.findIndex(\r\n (element) => element.id === r.id && element.isSubtype\r\n );\r\n roi.structureId = structures[subtypeStructureIdx].id;\r\n roi.color = structures[subtypeStructureIdx].color;\r\n roi.subtypeColor = structures[subtypeStructureIdx].color;\r\n roi.subtypeName = structures[subtypeStructureIdx].label;\r\n roi.aiAnnotated = true;\r\n roi.isSelObj = true;\r\n }\r\n });\r\n }\r\n\r\n // if fromActiveLearning --> sort rois by uncertainty\r\n if (fromActiveLearning) {\r\n // get index of last unlabeled element in roiLayer\r\n let idxLastLabeled = 0;\r\n roiLayers[fileID][selectedLayer].layer.regionRois.forEach(\r\n (element, idx) => {\r\n if (element.isLabeled) {\r\n idxLastLabeled = idx;\r\n }\r\n }\r\n );\r\n\r\n // get array with labeled rois\r\n let labeled = roiLayers[fileID][selectedLayer].layer.regionRois.slice(\r\n 0,\r\n idxLastLabeled + 1\r\n );\r\n // get array with unlabeled rois\r\n let unlabeled = roiLayers[fileID][selectedLayer].layer.regionRois.slice(\r\n idxLastLabeled + 1\r\n );\r\n\r\n let sortedObjects = this.selObjects;\r\n let newSortedArray = [];\r\n sortedObjects.coordinates.forEach((element) => {\r\n // check if element exists in array with unlabeled data\r\n // get same element from backend results\r\n let r = unlabeled.filter(\r\n (roi) =>\r\n parseInt(roi.bounds.left, 10) === element.x &&\r\n parseInt(roi.bounds.top, 10) === element.y\r\n );\r\n // if element is in array --> put in new sorted array\r\n if (r[0]) {\r\n newSortedArray.push(r[0]);\r\n }\r\n });\r\n let updatedRoiLayer = labeled.concat(newSortedArray);\r\n roiLayers[fileID][selectedLayer].layer.regionRois = updatedRoiLayer;\r\n }\r\n\r\n this.selObjects = {\r\n coordinates: [],\r\n };\r\n\r\n // set firstTimeGallery true after scene switch\r\n this.setFirstTimeGallery();\r\n };\r\n\r\n setFirstTimeGallery = () => {\r\n // firstTimeGallery = true --> load new tiles\r\n const { activeFileId } = this.state;\r\n const { selectedLayer, roiLayers } = this.props.projectContext;\r\n\r\n roiLayers[activeFileId][selectedLayer].layer.regionRois.forEach(function (\r\n element\r\n ) {\r\n element.firstTimeGallery = true;\r\n });\r\n };\r\n\r\n setSelectedLayer = (x) => {\r\n if (this.state.selLayer !== x) {\r\n this.props.projectContext.setState({ selectedLayer: x });\r\n }\r\n };\r\n\r\n saveChangesGallery(fromExport) {\r\n this.saveFunction(fromExport);\r\n }\r\n\r\n updateViewer() {\r\n if (this._isMounted) this.forceUpdate();\r\n }\r\n\r\n setFUllyAnnotated = () => {\r\n let projectObject = this.state.project;\r\n projectObject.files[this.findFileIndex()].fullyAnnotated = true;\r\n this.setMountedState({ project: projectObject });\r\n };\r\n\r\n setAnnotated = () => {\r\n let projectObject = this.state.project;\r\n projectObject.files[this.findFileIndex()].annotated = true;\r\n this.setMountedState({ project: projectObject });\r\n };\r\n\r\n findFileIndex = () => {\r\n let idx = 0;\r\n this.state.project.files.forEach((element, i) => {\r\n if (element.id === this.state.activeFileId) {\r\n idx = i;\r\n }\r\n });\r\n return idx;\r\n };\r\n\r\n setApplyModelAfterTraining = (e) => {\r\n // set if apply model after training to unlabeled images\r\n this.applyModelAfterTraining = e;\r\n if (this._isMounted) this.forceUpdate();\r\n };\r\n\r\n startAutomaticTraining = () => {\r\n // start taining of dl model after x annotations automatically\r\n this.saveFunction();\r\n this.automaticTraining = true;\r\n\r\n // first do training with all annotated objects\r\n this.applyDL(\r\n this.tools[\"alm_gallery_tool\"],\r\n this.props.id,\r\n this.state.activeFileId,\r\n false\r\n );\r\n\r\n this.setAlruns(true);\r\n // then do classification for all unlabeled objects\r\n this.applyModelAfterTraining = true;\r\n };\r\n\r\n startPassiveLearningTraining = (tool, projectId, fileId) => {\r\n let previewRect = {\r\n // rect parameters for train model\r\n x: 2,\r\n y: 2,\r\n w: 2,\r\n h: 2,\r\n };\r\n if (tool.toolConfig.name.includes(\"alm_\")) {\r\n if (!this.automaticTraining) {\r\n // show loading spinner\r\n this.props.spinloader.show();\r\n }\r\n window.showSuccessSnackbar(\"Start training\");\r\n Backend.activeLearningSignalR(\r\n {\r\n name: tool.toolConfig.name,\r\n projectId: projectId,\r\n fileIds: [fileId],\r\n parameters: previewRect,\r\n preview: false,\r\n rect: null,\r\n project: this.createProjectModel(\"none\"),\r\n },\r\n (alModel) => {\r\n this.setAlruns(false);\r\n this.props.spinloader.hide();\r\n if (this.applyModelAfterTraining) {\r\n // apply model to all unlabeled rois after training\r\n this.applyDL(\r\n this.tools[\"alm_gallery_tool\"],\r\n this.props.id,\r\n this.state.activeFileId,\r\n true,\r\n true\r\n );\r\n } else {\r\n // put results from backend to frontend\r\n this.getSelectedObjects(alModel, fileId);\r\n this.saveFunction();\r\n if (this._isMounted) this.forceUpdate();\r\n }\r\n },\r\n (error) => {\r\n window.openErrorDialog(error);\r\n }\r\n );\r\n }\r\n };\r\n\r\n prepareImagesForTraining = (idx, tool, projectId, previewRect) => {\r\n // save/crop all labeled images of all files before training\r\n // if end of files --> stop\r\n if (idx >= this.state.project.files.length) {\r\n // when all images are saved --> start training\r\n this.startPassiveLearningTraining(\r\n tool,\r\n projectId,\r\n this.state.project.files[0].id\r\n );\r\n return;\r\n }\r\n // if saved --> images of secene already prepared --> TODO: fix this\r\n // if (false /*this.state.project.files[idx].saved*/) {\r\n // this.prepareImagesForTraining(idx + 1, tool, projectId, previewRect);\r\n // return;\r\n // }\r\n // if not annotated --> no classified images for training in this file --> TODO: fix this\r\n // else if (false /*!this.state.project.files[idx].annotated*/) {\r\n // this.prepareImagesForTraining(idx + 1, tool, projectId, previewRect);\r\n // return;\r\n // }\r\n else {\r\n if (!this.automaticTraining) {\r\n // show loading spinner\r\n this.props.spinloader.show();\r\n }\r\n let fileIDs = this.state.project.files;\r\n let x = this.createProjectModel(\"none\");\r\n Backend.activeLearningSignalR(\r\n {\r\n name: tool.toolConfig.name,\r\n projectId: projectId,\r\n fileIDs: [fileIDs[idx].id],\r\n parameters: previewRect,\r\n preview: false,\r\n rect: null,\r\n project: x,\r\n },\r\n () => {\r\n // set file saved true if all rois are annotated\r\n if (fileIDs[idx].fullyAnnotated === true) {\r\n let projectObject = this.state.project;\r\n projectObject.files[idx].saved = true;\r\n this.setMountedState({\r\n project: projectObject,\r\n });\r\n }\r\n\r\n // saves images for training recursively for each scene\r\n if (idx + 1 < this.state.project.files.length) {\r\n this.prepareImagesForTraining(\r\n idx + 1,\r\n tool,\r\n projectId,\r\n previewRect\r\n );\r\n } else {\r\n // when all images are saved --> start training\r\n this.startPassiveLearningTraining(tool, projectId, fileIDs[0].id);\r\n }\r\n },\r\n (error) => {\r\n window.openErrorDialog(error);\r\n }\r\n );\r\n }\r\n };\r\n\r\n startClassification = (idx, tool, projectId, previewRect) => {\r\n // start classification of rois with dl model\r\n // if end of files --> stop\r\n if (idx >= this.state.project.files.length) {\r\n this.setAlruns(false);\r\n this.props.spinloader.hide();\r\n return;\r\n }\r\n // if fullyAnnotated --> no unlabeled images ( --> fix this: when fully annotated apply model does not work because fullyannotated can be set wrong)\r\n // if (false /*this.state.project.files[idx].fullyAnnotated*/) {\r\n // this.startClassification(idx + 1, tool, projectId, previewRect);\r\n // } else {\r\n if (!this.automaticTraining) {\r\n // show loading spinner\r\n this.props.spinloader.show();\r\n }\r\n let fileIDs = this.state.project.files;\r\n let projModel = this.createProjectModel(\"none\");\r\n Backend.activeLearningSignalR(\r\n {\r\n name: tool.toolConfig.name,\r\n projectId: projectId,\r\n fileIDs: [fileIDs[idx].id],\r\n parameters: previewRect,\r\n preview: false,\r\n rect: null,\r\n project: projModel,\r\n },\r\n (alModel) => {\r\n // do classification recursively for each scene\r\n if (idx + 1 < this.state.project.files.length) {\r\n this.getSelectedObjects(alModel, fileIDs[idx].id);\r\n this.startClassification(idx + 1, tool, projectId, previewRect);\r\n } else {\r\n // put results from backend to frontend\r\n this.getSelectedObjects(alModel, fileIDs[idx].id);\r\n this.setAlruns(false);\r\n this.props.spinloader.hide();\r\n }\r\n },\r\n (error) => {\r\n window.openErrorDialog(error);\r\n this.props.spinloader.hide();\r\n }\r\n );\r\n // }\r\n };\r\n\r\n applyDL(tool, projectId, fileId, passiveLearning, applyModel) {\r\n let previewRect;\r\n if (passiveLearning) {\r\n // start passive learning\r\n if (!applyModel) {\r\n // start training\r\n previewRect = {\r\n // rect parameters for train model\r\n x: 1,\r\n y: 1,\r\n w: 2,\r\n h: 2,\r\n };\r\n if (tool.toolConfig.name.includes(\"alm_\")) {\r\n window.showSuccessSnackbar(\"Preparing data for training\");\r\n this.prepareImagesForTraining(0, tool, projectId, previewRect);\r\n }\r\n } else {\r\n // Apply Model (classify unlabeled images)\r\n previewRect = {\r\n // rect parameters for apply model\r\n x: 1,\r\n y: 1,\r\n w: 5,\r\n h: 5,\r\n };\r\n if (tool.toolConfig.name.includes(\"alm_\")) {\r\n window.showSuccessSnackbar(\"classify unlabeled images\");\r\n this.startClassification(0, tool, projectId, previewRect);\r\n }\r\n }\r\n } else {\r\n // start active learning\r\n previewRect = {\r\n // rect parameters for al\r\n x: 0,\r\n y: 0,\r\n w: 10,\r\n h: 10,\r\n };\r\n window.showSuccessSnackbar(\"Start Active Learning ...\");\r\n if (tool.toolConfig.name.includes(\"alm_\")) {\r\n Backend.activeLearningSignalR(\r\n {\r\n name: tool.toolConfig.name,\r\n projectId: projectId,\r\n fileIds: [fileId],\r\n parameters: previewRect,\r\n preview: false,\r\n rect: null,\r\n project: this.createProjectModel(\"none\"),\r\n },\r\n (alModel) => {\r\n // after active learning --> rois are sorted by uncertainty\r\n this.getSelectedObjects(alModel, fileId, true);\r\n this.saveFunction();\r\n if (this._isMounted) this.forceUpdate();\r\n },\r\n (error) => {\r\n window.openErrorDialog(error);\r\n }\r\n );\r\n }\r\n }\r\n }\r\n\r\n setAlruns(x) {\r\n this.setMountedState({ alruns: x, activeTool: Tools.NONE });\r\n }\r\n\r\n trainingWarning = (warning) => {\r\n // give snackbar warnings\r\n if (warning === \"subtype\") {\r\n window.showWarningSnackbar(\"Please switch to parent.\");\r\n } else if (warning === \"tooFewAnnotations\") {\r\n window.showWarningSnackbar(\r\n \"One subtype needs at least 5 objects to start training. And one other subtype needs at least one object.\"\r\n );\r\n } else if (warning === \"hasNoChilds\") {\r\n window.showWarningSnackbar(\"This structure has no classes.\");\r\n }\r\n };\r\n\r\n trainingProgress = (message) => {\r\n if (\r\n this.tools[this.state.activeTool] &&\r\n (this.tools[this.state.activeTool][\"name\"] === \"AI Training\" ||\r\n this.tools[this.state.activeTool][\"name\"] === \"Instance Segmentation\" ||\r\n this.tools[this.state.activeTool][\"name\"] === \"Classification\")\r\n ) {\r\n this.tools[this.state.activeTool].updateTrainingProgress(message);\r\n if (message.includes(\"training done!!!\")) this.props.spinloader.hide();\r\n else if (message.includes(\"No annotations in\")) {\r\n window.showWarningSnackbar(message);\r\n } else if (message.includes(\"Continue training with\")) {\r\n window.showSuccessSnackbar(message);\r\n } else if (message.includes(\"Train model from scratch\")) {\r\n window.showSuccessSnackbar(message);\r\n } else if (message.includes(\"time elapsed\")) this.props.spinloader.hide();\r\n else if (\r\n message.includes(\r\n \"No trainingdata, please annotate at least 15+ objects\"\r\n )\r\n ) {\r\n window.showErrorSnackbar(message);\r\n this.props.spinloader.hide();\r\n }\r\n }\r\n };\r\n\r\n galleryTrainingProgress = (message) => {\r\n // get training progress for gallery from backend messages\r\n if (this.gallery) {\r\n this.gallery.setProgress(message);\r\n }\r\n };\r\n\r\n setGridSize = (x) => {\r\n this.setMountedState({ gridSize: x });\r\n };\r\n\r\n /**\r\n * Writes all ROIs into both the parent (sub-) structure (as usual) as well\r\n * as the corresponding subtypes.\r\n * This causes a considerable overhead for the filesize, but removing it can\r\n * cause issues when training.\r\n */\r\n adjustRoiLayers = () => {\r\n // make all subtype rois in subtype roilayers\r\n const { structures, roiLayers } = this.props.projectContext;\r\n\r\n for (let file of this.state.project.files) {\r\n let fileId = file.id;\r\n if (typeof roiLayers[fileId] === \"undefined\") {\r\n continue;\r\n }\r\n // make subtype rois in subtype layers\r\n structures.forEach((element, idx) => {\r\n if (structures[idx].classificationSubtype) {\r\n let childIds = [];\r\n let childLabels = [];\r\n this.findAllSubtypes(structures[idx]).forEach((element) => {\r\n childIds.push(element.id);\r\n childLabels.push(element.label);\r\n });\r\n\r\n let parentLayer = this.getParentIndexLayer(structures[idx]);\r\n let subtypeLayer = structures.findIndex(\r\n (element) => element.id === structures[idx].id\r\n );\r\n\r\n if (\r\n roiLayers[fileId][parentLayer] &&\r\n roiLayers[fileId][subtypeLayer]\r\n ) {\r\n roiLayers[fileId][parentLayer].layer.regionRois.forEach((roi) => {\r\n if (\r\n roi.structureId === element.id ||\r\n childIds.includes(roi.structureId) ||\r\n childLabels.includes(roi.subtypeName)\r\n ) {\r\n roiLayers[fileId][subtypeLayer].layer.regionRois.push(roi);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n findChilds = (str) => {\r\n const { structures } = this.props.projectContext;\r\n // return direct classification subtypes\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === str.subtypeLevel + 1 &&\r\n element.parentId === str.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n findAllSubtypes = (structure) => {\r\n // get all subtypes of selectedLayer (also subsubtypes)\r\n\r\n // first get all direct childs\r\n let childs = this.findChilds(structure);\r\n let allChilds = [];\r\n\r\n // search for childs of childs until no childs are checked for childs\r\n while (childs.length !== 0) {\r\n // code block to be executed\r\n childs = childs.concat(this.findChilds(childs[0]));\r\n if (!allChilds.includes(childs[0]) && childs[0].classificationSubtype) {\r\n allChilds.push(childs[0]);\r\n }\r\n childs.shift();\r\n }\r\n return allChilds;\r\n };\r\n\r\n /**\r\n * Add object key and value to string\r\n * @param {*} string tmp string that is used to store parts of a large object\r\n * @param {*} key object key that should be added\r\n * @param {*} value object value(s) that should be added\r\n * @param {*} filesByteArray array of string parts\r\n * @returns [string, filesByteArray] after updating\r\n */\r\n addStuff = (string, key, value, filesByteArray) => {\r\n string += '\"' + key + '\":' + JSON.stringify(value);\r\n let res = this.checkStringLength(string, filesByteArray);\r\n return res;\r\n };\r\n\r\n /**\r\n * check string Length and if larger then 10000 chars, update filesByteArray\r\n * @param {*} string tmp string that is used to store parts of a large object\r\n * @param {*} filesByteArray array of string parts\r\n * @returns [string, filesByteArray] after updating\r\n */\r\n checkStringLength = (string, filesByteArray) => {\r\n // if more then 10000 chars add current string part to filesByteArray\r\n // clear string\r\n if (string.length > 10000) {\r\n filesByteArray.push(string);\r\n string = \"\";\r\n }\r\n return [string, filesByteArray];\r\n };\r\n\r\n /**\r\n * finalize filesByteArray by adding the last string part\r\n * @param {*} string tmp string that is used to store parts of a large object\r\n * @param {*} filesByteArray array of string parts\r\n * @returns [string, filesByteArray] after updating\r\n */\r\n finalizeByteArray(string, filesByteArray) {\r\n filesByteArray.push(string);\r\n string = \"\";\r\n return [string, filesByteArray];\r\n }\r\n\r\n /**\r\n * convert JSON files object, that's to large for JSON.stringify() manually\r\n * @param {*} files JSON object\r\n * @returns blob\r\n */\r\n largeFilesJSONtoBlobConverter = (files) => {\r\n let filesByteArray = [];\r\n let res;\r\n // Manually decompose the files object, save to string, split and convert parts to byteArray\r\n // Issue! ByteArray get's to big at some point -> blob has to be created and updated on the go\r\n let tmpString = \"[\";\r\n for (let fileIdx in files) {\r\n let file = files[fileIdx];\r\n let keys = Object.keys(files[fileIdx]);\r\n tmpString += \"{\";\r\n for (let keyIdx in keys) {\r\n let key = keys[keyIdx];\r\n let value = file[key];\r\n if (key !== \"annotations\") {\r\n res = this.addStuff(tmpString, key, value, filesByteArray);\r\n tmpString = res[0];\r\n filesByteArray = res[1];\r\n } else {\r\n let annotations = value;\r\n // Array of Objects\r\n tmpString += '\"annotations\":[';\r\n for (let annoIdx in annotations) {\r\n // new Object\r\n tmpString += \"{\";\r\n let anno = annotations[annoIdx];\r\n let annoKeys = Object.keys(anno);\r\n for (let annoKeyIdx in annoKeys) {\r\n let annoKey = annoKeys[annoKeyIdx];\r\n let annoValue = anno[annoKey];\r\n if (annoKey !== \"geoJSON\") {\r\n res = this.addStuff(\r\n tmpString,\r\n annoKey,\r\n annoValue,\r\n filesByteArray\r\n );\r\n tmpString = res[0];\r\n filesByteArray = res[1];\r\n } else {\r\n tmpString += '\"geoJSON\":{';\r\n let geoJSON = annoValue;\r\n let geoJSONKeys = Object.keys(geoJSON);\r\n for (let geoJSONKeyIdx in geoJSONKeys) {\r\n let paramKey = geoJSONKeys[geoJSONKeyIdx];\r\n let paramValue = geoJSON[paramKey];\r\n if (paramKey !== \"coordinates\") {\r\n res = this.addStuff(\r\n tmpString,\r\n paramKey,\r\n paramValue,\r\n filesByteArray\r\n );\r\n tmpString = res[0];\r\n filesByteArray = res[1];\r\n } else {\r\n tmpString += '\"coordinates\":[';\r\n for (let polyIdx in paramValue) {\r\n let poly = paramValue[polyIdx];\r\n tmpString += JSON.stringify(poly);\r\n if (polyIdx < paramValue.length - 1) tmpString += \",\";\r\n let res = this.checkStringLength(\r\n tmpString,\r\n filesByteArray\r\n );\r\n tmpString = res[0];\r\n filesByteArray = res[1];\r\n }\r\n tmpString += \"]\";\r\n }\r\n if (geoJSONKeyIdx < geoJSONKeys.length - 1) tmpString += \",\";\r\n }\r\n tmpString += \"}\";\r\n }\r\n if (annoKeyIdx < annoKeys.length - 1) tmpString += \",\";\r\n }\r\n tmpString += \"}\";\r\n if (annoIdx < annotations.length - 1) tmpString += \",\";\r\n }\r\n tmpString += \"]\";\r\n }\r\n if (keyIdx < keys.length - 1) tmpString += \",\";\r\n }\r\n tmpString += \"}\";\r\n if (fileIdx < files.length - 1) tmpString += \",\";\r\n }\r\n tmpString += \"]\";\r\n res = this.finalizeByteArray(tmpString, filesByteArray);\r\n tmpString = \"\";\r\n filesByteArray = res[1];\r\n\r\n // create blob from filesByteArray\r\n let blob = new Blob(filesByteArray, {\r\n type: \"application/octet-stream\",\r\n });\r\n filesByteArray = [];\r\n console.log(\"blob\", blob);\r\n\r\n return blob;\r\n };\r\n\r\n saveWithSpinloader(projectModel, callback = this.defaultSaveCallback) {\r\n if (this.loadAnnotationsFromDB) {\r\n window.showWarningSnackbar(\r\n \"Not saved because of too many Annotations in project!\"\r\n );\r\n if (typeof callback === \"function\") {\r\n callback();\r\n }\r\n return;\r\n }\r\n this.props.spinloader.show();\r\n setTimeout(() => {\r\n let files = projectModel.files.slice();\r\n\r\n let blob;\r\n try {\r\n blob = new Blob([JSON.stringify(files)]);\r\n } catch {\r\n console.log(\r\n \"Files to large for JSON.stringify(). Continuing with custom function.\"\r\n );\r\n blob = this.largeFilesJSONtoBlobConverter(files);\r\n }\r\n\r\n let projectId = projectModel.id;\r\n let fileId = this.state.activeFileId;\r\n // empty annotations, to save only project\r\n for (let file of projectModel.files) {\r\n // save without annotations, since annotations will be saved seperately\r\n file.annotations = null;\r\n }\r\n \r\n if (this.state.annotationsAreReduced) {\r\n window.showErrorSnackbar(\"Sample Annotations can't be saved!\");\r\n this.props.spinloader.hide();\r\n if (typeof callback === \"function\") {\r\n callback();\r\n }\r\n return;\r\n }\r\n\r\n Backend.saveProject(projectModel, (data) => {\r\n if (data.success) {\r\n Backend.saveAnnotations(projectId, fileId, blob, (data) => {\r\n this.props.spinloader.hide();\r\n if (data.success) {\r\n window.showSuccessSnackbar(\"Project saved succesfully!\");\r\n if (typeof callback === \"function\") {\r\n callback();\r\n }\r\n } else {\r\n window.showErrorSnackbar(\r\n \"Project couldn't be saved! Failed while saving annotations!\"\r\n );\r\n }\r\n });\r\n } else {\r\n this.props.spinloader.hide();\r\n window.showErrorSnackbar(\"Project couldn't be saved!\");\r\n }\r\n });\r\n }, 0);\r\n }\r\n\r\n defaultSaveCallback() {\r\n console.log(\"Saved successfully\");\r\n }\r\n\r\n saveFunction(fromExport, callback = this.defaultSaveCallback) {\r\n // this.props.persistentStorage.save(\"ActiveFileId\", this.state.activeFileId);\r\n //Backend.saveProject(projectModel, () => { });\r\n this.props.persistentStorage.save(\r\n \"SplitscreenFileIds\",\r\n this.state.splitscreenFileIds\r\n );\r\n this.props.persistentStorage.save(\"ActiveFileId\", this.state.activeFileId);\r\n const projectModel = this.createProjectModel(\"all\", null, fromExport);\r\n this.saveWithSpinloader(projectModel, () => {\r\n window.projectHistory.clear(); //clear to prevent history syncing bugs and clean up space\r\n if (callback && typeof callback === \"function\") {\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n dataURItoBlob(dataURI) {\r\n // convert base64/URLEncoded data component to raw binary data held in a string\r\n var byteString;\r\n if (dataURI.split(\",\")[0].indexOf(\"base64\") >= 0)\r\n byteString = atob(dataURI.split(\",\")[1]);\r\n else byteString = unescape(dataURI.split(\",\")[1]);\r\n\r\n // separate out the mime component\r\n var mimeString = dataURI.split(\",\")[0].split(\":\")[1].split(\";\")[0];\r\n\r\n // write the bytes of the string to a typed array\r\n var ia = new Uint8Array(byteString.length);\r\n for (var i = 0; i < byteString.length; i++) {\r\n ia[i] = byteString.charCodeAt(i);\r\n }\r\n\r\n return new Blob([ia], { type: mimeString });\r\n }\r\n\r\n /***\r\n * Needed for ScreenshotTool\r\n */\r\n getProjectInfoString = () => {\r\n const project = this.state.project;\r\n const file = project.files.find(\r\n (file) => file.id === this.state.activeFileId\r\n );\r\n const fileName = file.fileName.split(\".\").slice(0, -1).join(\".\");\r\n\r\n // projekt_methode_filename_SceneNr_001.png\r\n return project.name + \"_\" + project.type + \"_\" + fileName;\r\n };\r\n\r\n onSaveScreenshot = () => {\r\n const file = this.state.project.files.find(\r\n (file) => file.id === this.state.activeFileId\r\n );\r\n\r\n let img = this.rendererdict[this.state.activeFileId].canvas;\r\n\r\n let ctx = img.getContext(\"2d\");\r\n\r\n ctx.save();\r\n let a = ctx.getTransform().a;\r\n let d = ctx.getTransform().d;\r\n let e = ctx.getTransform().e;\r\n let f = ctx.getTransform().f;\r\n ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n\r\n let projectName = file.fileName.split(\".\").slice(0, -1).join(\".\");\r\n if (\r\n this.state.project.type.includes(\"HistoPointCounting\") ||\r\n this.state.project.type.includes(\"HistoClassification\")\r\n ) {\r\n if (projectName.includes(\"__\")) {\r\n projectName = projectName.split(\"-\").slice(0, -4).join(\"-\");\r\n } else {\r\n projectName = projectName.split(\"-\").slice(0, -3).join(\"-\");\r\n }\r\n }\r\n\r\n let fontSize = 20;\r\n ctx.font = fontSize + \"px Arial\";\r\n\r\n // Box-Position\r\n let x = 10;\r\n let y = 10;\r\n let width = ctx.measureText(projectName).width + 10;\r\n let height = parseInt(fontSize, 10) + 10;\r\n\r\n // Draw Box-Border\r\n ctx.fillStyle = \"black\";\r\n let thickness = 1;\r\n ctx.fillRect(\r\n x - thickness,\r\n y - thickness,\r\n width + thickness * 2,\r\n height + thickness * 2\r\n );\r\n\r\n // Draw Box\r\n // ctx.globalAlpha = 0.8;\r\n ctx.fillStyle = \"white\";\r\n ctx.fillRect(x, y, width, height);\r\n\r\n // Add Text\r\n // ctx.globalAlpha = 1;\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n ctx.fillStyle = \"black\";\r\n ctx.fillText(projectName, 15, 15);\r\n\r\n ctx.setTransform(a, 0, 0, d, e, f);\r\n ctx.restore();\r\n\r\n img = img.toDataURL(\"image/jpeg\", 0.9);\r\n\r\n if (\r\n this.state.project.type.includes(\"HistoPointCounting\") ||\r\n this.state.project.type.includes(\"HistoClassification\")\r\n ) {\r\n const fileName = file.fileName.split(\".\").slice(0, -1).join(\".\");\r\n let lastIndex = file.sourcePath.replace(/\\\\/g, \"/\").lastIndexOf(\"/\");\r\n const folderPath = file.sourcePath.substring(0, lastIndex + 1);\r\n Backend.saveScreenshot(\r\n folderPath,\r\n fileName,\r\n this.dataURItoBlob(img),\r\n (response) => {\r\n window.showSuccessSnackbar(\r\n \"Screenshot saved here: \" + response.savePath\r\n );\r\n }\r\n );\r\n } else {\r\n let link = document.createElement(\"a\");\r\n\r\n // projekt_methode_filename_SceneNr_001.png\r\n let screenShotName =\r\n this.getProjectInfoString() + \"_S\" + (file.scene + 1) + \".jpg\";\r\n link.download = screenShotName;\r\n link.href = img.replace(\"image/jpeg\", \"image/octet-stream\");\r\n link.click();\r\n }\r\n };\r\n\r\n getMousePosition = () => {\r\n return [this.mousePosition.mouseX, this.mousePosition.mouseY];\r\n };\r\n\r\n zoomToRect = (rect) => {\r\n // zoom to rect in viewer/rendererdict[this.state.activeFileId]\r\n this.rendererdict[this.state.activeFileId].zoomFit();\r\n //this.rendererdict[this.state.activeFileId].zoomToRect();\r\n let width = rect.right - rect.left;\r\n let height = rect.bottom - rect.top;\r\n this.createZoomObjectForRect(\r\n false,\r\n rect.left - width,\r\n rect.right + width,\r\n rect.top - height,\r\n rect.bottom + height\r\n );\r\n };\r\n\r\n moveToRect = (rect) => {\r\n // make roi/rect in center of screen\r\n if (!this.rendererdict[this.state.activeFileId]) {\r\n setTimeout(() => this.moveToRect(), 400);\r\n } else {\r\n this.rendererdict[this.state.activeFileId].centerRoi(rect);\r\n }\r\n };\r\n\r\n onZoomOriginal = () => {\r\n this.rendererdict[this.state.activeFileId].zoomOriginal();\r\n if (this.state.showFullscreen) {\r\n if (this.state.fullscreenChain) {\r\n for (const value of Object.values(this.state.fullscreenFileIds)) {\r\n this.rendererdict[\"Full\" + value].zoomOriginal();\r\n }\r\n } else {\r\n this.rendererdict[\"Full\" + this.state.activeFileId].zoomOriginal();\r\n }\r\n }\r\n };\r\n\r\n onZoomOneToN = (x) => {\r\n this.rendererdict[this.state.activeFileId].zoomOneToN(x);\r\n if (this.state.showFullscreen) {\r\n if (this.state.fullscreenChain) {\r\n for (const value of Object.values(this.state.fullscreenFileIds)) {\r\n this.rendererdict[\"Full\" + value].zoomOneToN(x);\r\n }\r\n } else {\r\n this.rendererdict[\"Full\" + this.state.activeFileId].zoomOneToN(x);\r\n }\r\n }\r\n };\r\n\r\n fullscreenInitFilePlacement = (pt, fileId, factor, fs = false) => {\r\n const r = fs\r\n ? this.rendererdict[\"Full\" + fileId]\r\n : this.rendererdict[fileId];\r\n\r\n let o = this.props.tiles.getTransformationOffset(fileId);\r\n\r\n r.ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n r.ctx.translate(pt.x, pt.y);\r\n r.ctx.translate(-o[0] * factor, -o[1] * factor);\r\n r.ctx.scale(factor, factor);\r\n };\r\n\r\n onZoomFit = () => {\r\n if (this.state.showFullscreen) {\r\n if (\r\n this.state.fullscreenChain &&\r\n this.state.fullscreenFileIds.length === 2\r\n ) {\r\n let pt = null;\r\n let factor = null;\r\n\r\n for (const value of Object.values(this.state.fullscreenFileIds)) {\r\n let m = this.props.tiles.getTransformationMatrix(value);\r\n this.rendererdict[\"Full\" + value].zoomFit();\r\n if (!Array.isArray(m)) {\r\n pt = this.rendererdict[\"Full\" + value].getPointInCanvasCoord(0, 0);\r\n factor = this.rendererdict[\"Full\" + value].state.initialScale;\r\n }\r\n }\r\n for (const value of Object.values(this.state.fullscreenFileIds)) {\r\n let m = this.props.tiles.getTransformationMatrix(value);\r\n if (Array.isArray(m) && pt !== null && factor !== null) {\r\n this.fullscreenInitFilePlacement(pt, value, factor, true);\r\n }\r\n }\r\n } else {\r\n this.rendererdict[\"Full\" + this.state.activeFileId].zoomFit();\r\n }\r\n } else {\r\n this.rendererdict[this.state.activeFileId].zoomFit();\r\n if (Object.keys(this.chainListFileIds).length > 1) {\r\n for (const value of Object.values(this.chainListFileIds)) {\r\n if (value !== this.props.activeFileId)\r\n this.rendererdict[value].zoomFit();\r\n }\r\n }\r\n let pt = null;\r\n let factor = null;\r\n\r\n for (const value of Object.values(this.state.splitscreenFileIds)) {\r\n let m = this.props.tiles.getTransformationMatrix(value);\r\n if (!Array.isArray(m)) {\r\n pt = this.rendererdict[value].getPointInCanvasCoord(0, 0);\r\n factor = this.rendererdict[value].state.initialScale;\r\n }\r\n }\r\n for (const value of Object.values(this.state.splitscreenFileIds)) {\r\n let m = this.props.tiles.getTransformationMatrix(value);\r\n if (Array.isArray(m) && pt !== null && factor !== null) {\r\n this.fullscreenInitFilePlacement(pt, value, factor);\r\n }\r\n }\r\n }\r\n };\r\n\r\n onZoomDelta = (delta) => {\r\n this.rendererdict[this.state.activeFileId].zoomDelta(delta);\r\n if (this.state.showFullscreen) {\r\n if (this.state.fullscreenChain) {\r\n for (const value of Object.values(this.state.fullscreenFileIds)) {\r\n this.rendererdict[\"Full\" + value].zoomDelta(delta);\r\n }\r\n } else {\r\n this.rendererdict[\"Full\" + this.state.activeFileId].zoomDelta(delta);\r\n }\r\n }\r\n };\r\n\r\n onSaveClick = (callback) => {\r\n this.saveFunction(null, callback);\r\n };\r\n\r\n onSaveGalleryClick = () => {\r\n this.saveFunction();\r\n };\r\n\r\n histogramChanged(histogramConfig) {\r\n this.rendererdict[this.state.activeFileId].updateFLChannels(\r\n histogramConfig\r\n );\r\n }\r\n\r\n toggleSideBar = () => {\r\n if (this.state.sideBarWidth > 0) {\r\n this.setMountedState({\r\n originalSideBarWidth: this.state.sideBarWidth,\r\n sideBarWidth: 0,\r\n });\r\n } else {\r\n this.setMountedState({\r\n sideBarWidth: this.state.originalSideBarWidth,\r\n });\r\n }\r\n this.updateDimensions();\r\n this.props.spinloader.setRightWidth(\r\n this.state.sideBarWidth +\r\n this.state.verticalToolBarWidth +\r\n this.state.classRoomChatWidth\r\n );\r\n };\r\n\r\n toggleClassRoomChat = () => {\r\n if (this.state.classRoomChatWidth === 0) {\r\n this.setMountedState({\r\n classRoomChatWidth: 300,\r\n });\r\n } else {\r\n this.setMountedState({\r\n classRoomChatWidth: this.state.classRoomChatWidth > 0 ? 0 : 300,\r\n });\r\n }\r\n this.updateDimensions();\r\n this.props.spinloader.setRightWidth(\r\n this.state.sideBarWidth +\r\n this.state.verticalToolBarWidth +\r\n this.state.classRoomChatWidth\r\n );\r\n };\r\n\r\n mouseWheelEvent = (e) => {\r\n if (e.ctrlKey) {\r\n this.setMountedState({\r\n opacity: Math.min(1, Math.max(0, this.state.opacity + e.deltaY / 1000)),\r\n });\r\n }\r\n if (\r\n typeof this.tools[this.state.activeTool] !== \"undefined\" &&\r\n this.tools[this.state.activeTool].mouseWheelEvent\r\n )\r\n this.tools[this.state.activeTool].mouseWheelEvent(e);\r\n };\r\n\r\n showGrid = () => {\r\n // check if show tile name in rois --> only if project contains tiles tool\r\n return this.state.project\r\n ? this.checkToolInConfig(\"TilesTool\")\r\n ? true\r\n : false\r\n : false;\r\n };\r\n\r\n resizeSideBar = (deltaX, resizeEnd) => {\r\n let newSideBarWidth = this.state.sideBarWidth + deltaX;\r\n if (\r\n newSideBarWidth > this.state.minSideBarWidth &&\r\n window.innerWidth - newSideBarWidth > this.state.minRendererWidth\r\n ) {\r\n this.setMountedState({ sideBarWidth: newSideBarWidth });\r\n this.props.persistentStorage.save(\"sideBarWidth\", newSideBarWidth);\r\n }\r\n if (resizeEnd) {\r\n this.updateDimensions();\r\n }\r\n };\r\n\r\n resizeTimeLine = (deltaY, resizeEnd) => {\r\n let newTimeLineHeight = this.state.timeLineHeight + deltaY;\r\n if (\r\n newTimeLineHeight > this.state.minTimeLineHeight &&\r\n window.innerHeight - newTimeLineHeight - 64 > this.state.minCanvasHeight\r\n ) {\r\n this.setMountedState({ timeLineHeight: newTimeLineHeight });\r\n this.props.persistentStorage.save(\"timeLineHeight\", newTimeLineHeight);\r\n }\r\n if (resizeEnd) {\r\n this.updateDimensions();\r\n }\r\n };\r\n\r\n updateToolBarWidth = (newToolBarWidth, galleryView) => {\r\n if (this.state.verticalToolBarWidth !== newToolBarWidth) {\r\n this.setMountedState({\r\n verticalToolBarWidth: newToolBarWidth,\r\n });\r\n this.updateDimensions();\r\n } else if (galleryView && this.state.verticalToolBarWidth !== 45) {\r\n this.setMountedState({\r\n verticalToolBarWidth: 45,\r\n });\r\n this.updateDimensions();\r\n }\r\n };\r\n\r\n isElementVisible = (el) => {\r\n // check if element was visible in previous use of project\r\n // check saved value of element\r\n let visible = this.props.persistentStorage.load(el);\r\n\r\n // if undefined make element visible\r\n if (typeof visible === \"undefined\") {\r\n return el === \"showResultTable\" || el === \"showZoomBar\" ? false : true;\r\n } else {\r\n return visible;\r\n }\r\n };\r\n\r\n setSideBarWidth = () => {\r\n // set sideBarWidth depending on project module\r\n // get saved SideBarWith from local storage\r\n let sideBarWidthObject = this.props.persistentStorage.load(\"sideBarWidth\");\r\n let sideBarWidthFromConfig =\r\n this.state.viewerConfig.project.projectStringProperties[\"SideBarWidth\"];\r\n let sideBarWidth;\r\n // check if special project module\r\n if (this.resultTabActive()) {\r\n if (this.state && this.state.verticalToolBarWidth) {\r\n sideBarWidth =\r\n window.innerWidth - this.state.verticalToolBarWidth - 5 - 900; // subtract verticalToolBar, Padding and Renderer\r\n } else {\r\n sideBarWidth = window.innerWidth - 45 - 5 - 900; // subtract verticalToolBar, Padding and Renderer\r\n }\r\n } else {\r\n if (sideBarWidthObject) {\r\n // if sideBarWidth was saved to persistentStorage\r\n sideBarWidth = sideBarWidthObject;\r\n } else {\r\n // check if sideBarWidth is set in config --> if not set default value 455\r\n sideBarWidth =\r\n sideBarWidthFromConfig && sideBarWidthFromConfig !== \"\"\r\n ? parseInt(sideBarWidthFromConfig, 10)\r\n : 455;\r\n }\r\n }\r\n this.setMountedState({ sideBarWidth });\r\n this.updateDimensions();\r\n };\r\n\r\n getProjectLabel = () => {\r\n if (this.state && this.state.viewerConfig) {\r\n return this.state.viewerConfig.project.label;\r\n }\r\n };\r\n\r\n saveChainStatus = () => {\r\n this.props.persistentStorage.save(\"chainList\", this.chainList);\r\n this.props.persistentStorage.save(\r\n \"chainListFileIds\",\r\n this.chainListFileIds\r\n );\r\n };\r\n\r\n onSelectFileSplitscreen = (fileId) => {\r\n //get all ome and histoconfig prepared\r\n let { splitscreenFileIds } = this.state;\r\n if (splitscreenFileIds.length < 9) {\r\n this.addFileToFullscreen(fileId, 0);\r\n splitscreenFileIds.push(fileId);\r\n this.props.persistentStorage.save(\"ActiveFileId\", fileId);\r\n this.props.persistentStorage.save(\r\n \"SplitscreenFileIds\",\r\n splitscreenFileIds\r\n );\r\n this.openFile(fileId, this.props.id, true);\r\n this.setMountedState({\r\n splitscreenFileIds,\r\n activeFileId: fileId,\r\n });\r\n this.updateDimensions();\r\n } else {\r\n window.showErrorSnackbar(\r\n \"A maximum of 9 images within the splitscreen is allowed\"\r\n );\r\n }\r\n };\r\n\r\n onSwitchFileSplitscreen = (newFileId) => {\r\n let { activeFileId, splitscreenFileIds } = this.state;\r\n\r\n let rendererRef = this.rendererdict[activeFileId];\r\n delete this.rendererdict[activeFileId];\r\n this.rendererdict[newFileId] = rendererRef;\r\n\r\n let index = splitscreenFileIds.indexOf(activeFileId);\r\n splitscreenFileIds[index] = newFileId;\r\n activeFileId = newFileId;\r\n this.openFile(activeFileId, this.props.id, true);\r\n this.props.persistentStorage.save(\"ActiveFileId\", activeFileId);\r\n this.props.persistentStorage.save(\"SplitscreenFileIds\", splitscreenFileIds);\r\n\r\n this.chainList[index] = false;\r\n delete this.chainListFileIds[index];\r\n this.saveChainStatus();\r\n\r\n this.setMountedState({\r\n splitscreenFileIds,\r\n activeFileId,\r\n });\r\n };\r\n\r\n onExcludeSplitscreen = (index, e) => {\r\n let { splitscreenFileIds, activeFileId } = this.state;\r\n\r\n if (activeFileId === splitscreenFileIds[index]) {\r\n splitscreenFileIds.splice(index, 1);\r\n activeFileId = splitscreenFileIds[Math.max(index - 1, 0)];\r\n } else {\r\n splitscreenFileIds.splice(index, 1);\r\n }\r\n this.props.persistentStorage.save(\"ActiveFileId\", activeFileId);\r\n this.props.persistentStorage.save(\"SplitscreenFileIds\", splitscreenFileIds);\r\n this.setMountedState({\r\n splitscreenFileIds,\r\n activeFileId,\r\n });\r\n\r\n this.chainList[index] = false;\r\n delete this.chainListFileIds[index];\r\n this.saveChainStatus();\r\n this.updateDimensions();\r\n e.stopPropagation();\r\n return false;\r\n };\r\n\r\n onChainSplitscreen = (index, currentFileId, e) => {\r\n if (!this.chainList[index]) {\r\n this.chainList[index] = true;\r\n this.chainListFileIds[index] = currentFileId;\r\n this.saveChainStatus();\r\n } else if (this.chainList[index]) {\r\n this.chainList[index] = false;\r\n delete this.chainListFileIds[index];\r\n this.saveChainStatus();\r\n }\r\n if (e) {\r\n e.stopPropagation();\r\n }\r\n };\r\n\r\n onChangeChain = (bool, index, fileId) => {\r\n this.chainList[index] = bool;\r\n this.chainListFileIds[index] = fileId;\r\n if (!bool) {\r\n delete this.chainListFileIds[index];\r\n }\r\n this.saveChainStatus();\r\n };\r\n\r\n onDropFile = (event) => {\r\n event.preventDefault();\r\n let id = event.dataTransfer.getData(\"Text\");\r\n for (let i = 0; i < this.state.project.files.length; i++) {\r\n if (this.state.project.files[i].id === id) {\r\n this.onSelectFileSplitscreen(id);\r\n }\r\n }\r\n this.setMountedState({ showSplitscreenDropzone: false });\r\n };\r\n\r\n setActiveView = (index) => {\r\n let { splitscreenFileIds, activeFileId } = this.state;\r\n if (activeFileId !== splitscreenFileIds[index]) {\r\n activeFileId = splitscreenFileIds[index];\r\n }\r\n this.addFileToFullscreen(activeFileId, 0);\r\n this.props.persistentStorage.save(\"ActiveFileId\", activeFileId);\r\n this.setMountedState({\r\n activeFileId,\r\n });\r\n };\r\n\r\n onToggleFullscreen = () => {\r\n if (this.state.showFullscreen) {\r\n this.setMountedState({ showOverlay: false, showWindowTool: false });\r\n this.setOpacityChangeFullscreen(0, 100);\r\n this.setOpacityChangeFullscreen(1, 0);\r\n }\r\n this.setMountedState({ showFullscreen: !this.state.showFullscreen });\r\n this.updateDimensions();\r\n };\r\n\r\n setOpacityChangeFullscreen = (id, value) => {\r\n if (id === 0) {\r\n this.setMountedState({ firstFullscreenOpacity: value });\r\n } else {\r\n this.setMountedState({ secFullscreenOpacity: value });\r\n }\r\n };\r\n\r\n addFileToFullscreen = (fileId, idx) => {\r\n let { fullscreenFileIds } = this.state;\r\n if (\r\n (idx === 0 && fullscreenFileIds[1] === fileId) ||\r\n (idx === 1 && fullscreenFileIds[0] === fileId)\r\n ) {\r\n let firstRef = this.rendererdict[\"Full\" + fullscreenFileIds[0]];\r\n let secRef = this.rendererdict[\"Full\" + fullscreenFileIds[1]];\r\n let firstId = fullscreenFileIds[0];\r\n let secId = fullscreenFileIds[1];\r\n this.rendererdict[\"Full\" + fullscreenFileIds[1]] = firstRef;\r\n this.rendererdict[\"Full\" + fullscreenFileIds[0]] = secRef;\r\n fullscreenFileIds[0] = secId;\r\n fullscreenFileIds[1] = firstId;\r\n } else if (fullscreenFileIds[idx] && fullscreenFileIds[idx] !== fileId) {\r\n let rendererRef = this.rendererdict[\"Full\" + fullscreenFileIds[idx]];\r\n delete this.rendererdict[\"Full\" + fullscreenFileIds[idx]];\r\n this.rendererdict[\"Full\" + fileId] = rendererRef;\r\n fullscreenFileIds[idx] = fileId;\r\n }\r\n if (fullscreenFileIds.length === 0 || fullscreenFileIds.length === 1) {\r\n fullscreenFileIds[idx] = fileId;\r\n }\r\n\r\n if (this.sliderRef) {\r\n this.sliderRef.setState({ init: false });\r\n }\r\n this.setMountedState({\r\n fullscreenFileIds,\r\n });\r\n };\r\n\r\n setActiveFileFullscreen = (fileId) => {\r\n this.setMountedState({ activeFileId: fileId });\r\n };\r\n\r\n onToggleFullscreenChain = () => {\r\n this.setMountedState({ fullscreenChain: !this.state.fullscreenChain });\r\n };\r\n\r\n onToggleOverlay = () => {\r\n this.setMountedState({\r\n showOverlay: !this.state.showOverlay,\r\n showWindowTool: false,\r\n });\r\n };\r\n\r\n onToggleWindowTool = () => {\r\n this.setMountedState({ showWindowTool: !this.state.showWindowTool });\r\n };\r\n\r\n toggleShowFirstAccordion = () => {\r\n this.setMountedState({\r\n showFirstAccordion: !this.state.showFirstAccordion,\r\n });\r\n };\r\n\r\n /**\r\n * Saves those structures to which AI results will be saved to.\r\n * @param {object} obj Structure information including the model used.\r\n * @param {string} task What to do with a given structure. Supports \"add\" and \"remove_all\".\r\n */\r\n setAiUsedStructures = (obj, task) => {\r\n switch (task) {\r\n // Add a strucuture with an assigend model\r\n case \"add\":\r\n {\r\n let aiStructures = this.state.aiUsedStructures;\r\n if (!aiStructures.filter((e) => e.id === obj.id).length > 0) {\r\n aiStructures.push(obj);\r\n }\r\n this.setMountedState({ aiUsedStructures: aiStructures });\r\n }\r\n break;\r\n\r\n // Remove everything\r\n case \"remove_all\":\r\n this.setMountedState({ aiUsedStructures: [] });\r\n break;\r\n\r\n default:\r\n console.warn(`Invalid task provided to setAiUsedStructures(): ${task}`);\r\n }\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const {\r\n verticalToolBarWidth,\r\n sideBarWidth,\r\n classRoomChatWidth,\r\n activeTool,\r\n project,\r\n containerKey,\r\n // view layout flags\r\n showGallery,\r\n galleryType,\r\n show3DViewer,\r\n showPointCloud,\r\n showTilesGallery,\r\n showTimeBar,\r\n displayTimeBar,\r\n showZStackBar,\r\n displayZStackBar,\r\n drawLayer,\r\n commentLayers,\r\n landmarkLayers,\r\n opacity,\r\n importProgress,\r\n splitscreenFileIds,\r\n showSplitscreenDropzone,\r\n activeFileId,\r\n omeDict,\r\n minZ,\r\n maxZ,\r\n fullscreenFileIds,\r\n histogramConfig,\r\n showFullscreen,\r\n showOverlay,\r\n showWindowTool,\r\n } = this.state;\r\n\r\n const {\r\n structures,\r\n roiLayers,\r\n //fileRoiLayers,\r\n selectedLayer,\r\n } = this.props.projectContext;\r\n\r\n return (\r\n \r\n (this.FindMissingFiles = c)}\r\n projectActionMode={ProjectActionMode.Update}\r\n />\r\n {\r\n if (\r\n this.state.viewerConfig.project.projectProperties[\r\n \"EnableSplitscreen\"\r\n ]\r\n )\r\n this.setMountedState({ showSplitscreenDropzone: true });\r\n })\r\n }\r\n onDragLeave={() => {\r\n this.setMountedState({ showSplitscreenDropzone: false });\r\n }}\r\n onDragOver={(e) => e.preventDefault()}\r\n onDrop={(e) => {\r\n if (\r\n this.state.viewerConfig.project.projectProperties[\r\n \"EnableSplitscreen\"\r\n ]\r\n )\r\n this.onDropFile(e);\r\n }}\r\n >\r\n {showSplitscreenDropzone && (\r\n
    \r\n Drop file here for split screen.\r\n
    \r\n )}\r\n {!showGallery &&\r\n !showTilesGallery &&\r\n !showFullscreen &&\r\n splitscreenFileIds.map((currentFileId, index) => (\r\n 2\r\n ? 4\r\n : splitscreenFileIds.length > 1\r\n ? 6\r\n : 12\r\n }\r\n style={{\r\n border: splitscreenFileIds.length > 1 && \"1px solid\",\r\n position: \"relative\",\r\n background: \"#EBEBEB\",\r\n height:\r\n splitscreenFileIds.length === 4\r\n ? \"50%\"\r\n : splitscreenFileIds.length > 6\r\n ? \"33.333333333%\"\r\n : splitscreenFileIds.length > 3\r\n ? \"50%\"\r\n : \"100%\",\r\n zIndex: currentFileId === activeFileId ? \"0\" : \"1\",\r\n }}\r\n onClick={() => this.setActiveView(index, currentFileId)}\r\n >\r\n -1 && importProgress < 100}\r\n hideBackdrop\r\n style={{ pointerEvents: \"none\" }}\r\n >\r\n \r\n Importing File:
    \r\n "\r\n {this.state.project &&\r\n this.state.project.files.find(\r\n (file) => file.id === this.state.activeFileId\r\n ).fileName}\r\n "\r\n
    \r\n \r\n \r\n {/* ADD 3D-Viewer-Component!!! */}\r\n {show3DViewer &&\r\n !showGallery &&\r\n !showTilesGallery &&\r\n omeDict[currentFileId] &&\r\n this.zoomObjectDict &&\r\n histogramConfig[currentFileId] && (\r\n \r\n {currentFileId === activeFileId &&\r\n splitscreenFileIds.length > 1 && (\r\n
    \r\n )}\r\n {splitscreenFileIds.length > 1 && (\r\n \r\n this.onExcludeSplitscreen(index, e)}\r\n >\r\n \r\n \r\n \r\n )}\r\n {splitscreenFileIds.length > 1 && (\r\n \r\n \r\n this.onChainSplitscreen(index, currentFileId, e)\r\n }\r\n >\r\n {this.chainList[index] ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n \r\n )}\r\n {!showGallery &&\r\n !show3DViewer &&\r\n !showTilesGallery &&\r\n omeDict[currentFileId] &&\r\n this.zoomObjectDict &&\r\n histogramConfig[currentFileId] && (\r\n \r\n {currentFileId === activeFileId &&\r\n splitscreenFileIds.length > 1 && (\r\n
    \r\n )}\r\n {splitscreenFileIds.length > 1 && (\r\n \r\n this.onExcludeSplitscreen(index, e)}\r\n >\r\n \r\n \r\n \r\n )}\r\n {splitscreenFileIds.length > 1 && (\r\n \r\n \r\n this.onChainSplitscreen(index, currentFileId, e)\r\n }\r\n >\r\n {this.chainList[index] ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n (this.rendererdict[currentFileId] = c)\r\n }\r\n rendererDict={this.rendererdict}\r\n projectConfig={this.state.projectConfig}\r\n ome={omeDict[currentFileId]}\r\n histogramConfig={histogramConfig[currentFileId]}\r\n rois={this.state.rois}\r\n fileId={currentFileId}\r\n activeFileId={activeFileId}\r\n projectId={this.props.id}\r\n activeTool={\r\n currentFileId === activeFileId\r\n ? activeTool\r\n : Tools.NONE\r\n }\r\n onChangeROIs={(e) => this.setMountedState({ rois: e })}\r\n // toggle different dialogs\r\n showGallery={showGallery}\r\n showTilesGallery={showTilesGallery}\r\n displayTimeBar={displayTimeBar}\r\n displayZStackBar={displayZStackBar}\r\n showZStackBar={showZStackBar}\r\n showTimeBar={showTimeBar}\r\n tools={this.tools}\r\n structures={structures}\r\n roiLayers={roiLayers[currentFileId]}\r\n allRoiLayers={roiLayers}\r\n drawLayer={\r\n currentFileId === activeFileId\r\n ? drawLayer\r\n : {\r\n regionRois: [],\r\n inverted: false,\r\n clear: false,\r\n }\r\n }\r\n commentLayer={commentLayers[currentFileId]}\r\n landmarkLayer={landmarkLayers[currentFileId]}\r\n selectedLayer={selectedLayer}\r\n opacity={opacity}\r\n changeHiConfig={this.setHistogramConfig}\r\n updateProject={this.updateProject}\r\n tzoomROI1={this.resetRoiZoomInDict}\r\n zoomROI={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomRoi\r\n : false\r\n }\r\n zoomLeft={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomLeft\r\n : 0\r\n }\r\n zoomRight={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomRight\r\n : 0\r\n }\r\n zoomTop={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomTop\r\n : 0\r\n }\r\n zoomBottom={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomBottom\r\n : 0\r\n }\r\n zoomROI1={this.resetRoiZoom}\r\n setSelectedRoi={this.setSelectedRoi}\r\n setAIObjects={this.setAIObjects}\r\n selRoi={this.state.selRoi}\r\n showGridLabels={this.showGrid()}\r\n viewerConfig={this.state.viewerConfig}\r\n activeTab={this.props.projectContext.activeTab}\r\n onChangeTool={this.onChangeTool}\r\n setChangingFile={\r\n this.props.projectContext.setChangingFile\r\n }\r\n changingFile={this.props.projectContext.changingFile}\r\n project={project}\r\n updateGlobalZ={this.updateGlobalZ}\r\n updateGlobalT={this.updateGlobalT}\r\n timeLineHeight={this.state.timeLineHeight}\r\n resizeTimeLine={this.resizeTimeLine}\r\n loadedAnnotationsCounter={\r\n this.state.loadedAnnotationsCounter\r\n }\r\n frameArrayDict={this.state.frameArrayDict}\r\n projectContext={this.props.projectContext}\r\n setSelectedLayer={this.setSelectedLayer}\r\n showMarks={activeTool === \"landmark\" ? true : false}\r\n landmarkLayers={landmarkLayers}\r\n showFullscreen={showFullscreen}\r\n splitscreenIdx={index}\r\n onChangeChain={this.onChangeChain}\r\n fsChain={this.onToggleFullscreenChain}\r\n resultTabActive={() => this.resultTabActive()}\r\n onSelectFile={this.onSelectFile}\r\n openNextFile={this.openNextFile}\r\n openPrevFile={this.openPrevFile}\r\n updateVisibleROIDebounced={\r\n this.updateVisibleROIDebounced\r\n }\r\n />\r\n \r\n )}\r\n \r\n ))}\r\n {!showGallery &&\r\n !showTilesGallery &&\r\n omeDict[activeFileId] &&\r\n this.zoomObjectDict &&\r\n histogramConfig[activeFileId] &&\r\n showFullscreen &&\r\n fullscreenFileIds.map((currentFileId, index) => (\r\n \r\n \r\n (this.rendererdict[\"Full\" + currentFileId] = c)\r\n }\r\n rendererDict={this.rendererdict}\r\n projectConfig={this.state.projectConfig}\r\n ome={omeDict[currentFileId]}\r\n histogramConfig={histogramConfig[currentFileId]}\r\n rois={this.state.rois}\r\n fileId={currentFileId}\r\n activeFileId={activeFileId}\r\n projectId={this.props.id}\r\n activeTool={\r\n currentFileId === activeFileId ? activeTool : Tools.NONE\r\n }\r\n onChangeROIs={(e) => this.setMountedState({ rois: e })}\r\n // toggle different dialogs\r\n showGallery={showGallery}\r\n showTilesGallery={showTilesGallery}\r\n displayTimeBar={displayTimeBar}\r\n displayZStackBar={displayZStackBar}\r\n showZStackBar={showZStackBar}\r\n showTimeBar={showTimeBar}\r\n tools={this.tools}\r\n structures={structures}\r\n roiLayers={roiLayers[currentFileId]}\r\n allRoiLayers={roiLayers}\r\n drawLayer={\r\n currentFileId === activeFileId\r\n ? drawLayer\r\n : {\r\n regionRois: [],\r\n inverted: false,\r\n clear: false,\r\n }\r\n }\r\n commentLayer={commentLayers[currentFileId]}\r\n landmarkLayer={landmarkLayers[currentFileId]}\r\n selectedLayer={selectedLayer}\r\n opacity={opacity}\r\n changeHiConfig={this.setHistogramConfig}\r\n updateProject={this.updateProject}\r\n tzoomROI1={this.resetRoiZoomInDict}\r\n zoomROI={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomRoi\r\n : false\r\n }\r\n zoomLeft={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomLeft\r\n : 0\r\n }\r\n zoomRight={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomRight\r\n : 0\r\n }\r\n zoomTop={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomTop\r\n : 0\r\n }\r\n zoomBottom={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomBottom\r\n : 0\r\n }\r\n zoomROI1={this.resetRoiZoom}\r\n setSelectedRoi={this.setSelectedRoi}\r\n setAIObjects={this.setAIObjects}\r\n selRoi={this.state.selRoi}\r\n showGridLabels={this.showGrid()}\r\n viewerConfig={this.state.viewerConfig}\r\n activeTab={this.props.projectContext.activeTab}\r\n onChangeTool={this.onChangeTool}\r\n setChangingFile={this.props.projectContext.setChangingFile}\r\n changingFile={this.props.projectContext.changingFile}\r\n project={project}\r\n updateGlobalZ={this.updateGlobalZ}\r\n updateGlobalT={this.updateGlobalT}\r\n timeLineHeight={this.state.timeLineHeight}\r\n resizeTimeLine={this.resizeTimeLine}\r\n loadedAnnotationsCounter={this.state.loadedAnnotationsCounter}\r\n frameArrayDict={this.state.frameArrayDict}\r\n showMarks={activeTool === \"landmark\" ? true : false}\r\n landmarkLayers={landmarkLayers}\r\n showFullscreen={showFullscreen}\r\n fullscreenIdx={index}\r\n onChangeChain={this.onChangeChain}\r\n fsChain={this.onToggleFullscreenChain}\r\n showWindowTool={showWindowTool}\r\n windowToolRef={this.windowToolRef}\r\n resultTabActive={() => this.resultTabActive()}\r\n updateVisibleROIDebounced={this.updateVisibleROIDebounced}\r\n />\r\n \r\n ))}\r\n {!showGallery &&\r\n !showTilesGallery &&\r\n omeDict[activeFileId] &&\r\n this.zoomObjectDict &&\r\n histogramConfig[activeFileId] &&\r\n showFullscreen &&\r\n showOverlay && (\r\n (this.sliderRef = c)}\r\n setOpacity={this.setOpacityChangeFullscreen}\r\n activeFileId={activeFileId}\r\n splitscreenFileIds={splitscreenFileIds}\r\n omeDict={omeDict}\r\n addFile={this.addFileToFullscreen}\r\n setActive={this.setActiveFileFullscreen}\r\n fullscreenFileIds={fullscreenFileIds}\r\n fsChain={this.onToggleFullscreenChain}\r\n isChained={this.state.fullscreenChain}\r\n rendererdict={this.rendererdict}\r\n >\r\n )}\r\n {!showGallery &&\r\n !showTilesGallery &&\r\n omeDict[activeFileId] &&\r\n this.zoomObjectDict &&\r\n histogramConfig[activeFileId] &&\r\n showFullscreen &&\r\n showWindowTool && (\r\n (this.windowToolRef = c)}\r\n activeFileId={activeFileId}\r\n rendererDict={this.rendererdict}\r\n fullscreenFileIds={fullscreenFileIds}\r\n >\r\n )}\r\n {(showGallery || showTilesGallery) && histogramConfig[activeFileId] && (\r\n (this.gallery = c)}\r\n ome={omeDict[activeFileId]}\r\n fileId={activeFileId}\r\n projectId={this.props.id}\r\n structures={structures}\r\n roiLayers={roiLayers[activeFileId]}\r\n selectedLayer={selectedLayer}\r\n visibleImage={this.visibleImage}\r\n coloredImages={this.coloredImages}\r\n histogramConfig={histogramConfig[activeFileId]}\r\n gallery={this.createZoomObjectForRect}\r\n activeTool={activeTool}\r\n tools={this.tools}\r\n visImgs={this.state.visImgs}\r\n selectedObjects={this.selObjects}\r\n drawLayer={drawLayer}\r\n saveChangesGallery={this.saveChangesGallery}\r\n applyDL={this.applyDL}\r\n setApplyModelAfterTraining={this.setApplyModelAfterTraining}\r\n makePredictions={this.applyModelAfterTraining}\r\n selObjs={this.selObjs}\r\n updateCount={this.updateCount}\r\n alruns={this.state.alruns}\r\n setAlruns={this.setAlruns}\r\n graphData={this.graphData}\r\n updateViewer={this.updateViewer}\r\n onGallerychangePage={this.onGallerychangePage}\r\n showZStackBar={\r\n this.props.persistentStorage.load(\r\n \"showZStackBar\" + activeFileId\r\n ) === true ||\r\n this.props.persistentStorage.load(\r\n \"showZStackBar\" + activeFileId\r\n ) === false\r\n ? this.props.persistentStorage.load(\r\n \"showZStackBar\" + activeFileId\r\n )\r\n : false\r\n }\r\n viewerConfig={this.state.viewerConfig}\r\n startAutomaticTraining={this.startAutomaticTraining}\r\n updateStructure={this.state.updateStructure}\r\n trainingWarning={this.trainingWarning}\r\n setFUllyAnnotated={this.setFUllyAnnotated}\r\n setAnnotated={this.setAnnotated}\r\n showGallery={showGallery}\r\n galleryType={galleryType}\r\n showTilesGallery={showTilesGallery}\r\n project={project}\r\n onSelectLayer={(e) => {\r\n this.props.projectContext.setState({ selectedLayer: e });\r\n }}\r\n globalZ={this.state.z}\r\n updateFileClasses={this.updateFileClasses}\r\n />\r\n )}\r\n \r\n {omeDict[activeFileId] &&\r\n histogramConfig[activeFileId] &&\r\n this.rendererdict[activeFileId] && (\r\n -1 && importProgress < 100}\r\n verticalToolBarWidth={this.state.verticalToolBarWidth}\r\n viewerConfig={this.state.viewerConfig}\r\n structures={structures}\r\n roiLayers={roiLayers[activeFileId]}\r\n // tool selection\r\n activeTool={activeTool}\r\n onChangeTool={this.onChangeTool}\r\n // layer selection\r\n selectedLayer={selectedLayer}\r\n // toggle different dialogs\r\n showGallery={showGallery}\r\n galleryType={galleryType}\r\n onToggleGallery={(e) => {\r\n this.setMountedState({\r\n showGallery: e,\r\n showTilesGallery: false,\r\n });\r\n if (showTilesGallery) {\r\n this.toggleSideBar();\r\n }\r\n if (showGallery) {\r\n this.updateDimensions();\r\n if (this.resultTabActive()) {\r\n this.onChangeTool(\"pointcountingtile\");\r\n }\r\n }\r\n if (this.state.project.type.includes(\"HistoPointCounting\")) {\r\n // make parent to selectedLayer again\r\n let parentIndex = selectedLayer;\r\n if (structures[selectedLayer].classificationSubtype) {\r\n parentIndex = this.getParentIndex(\r\n structures[selectedLayer].parentId\r\n );\r\n }\r\n this.props.projectContext.setState({\r\n selectedLayer: parentIndex,\r\n });\r\n // hide sidebar\r\n this.toggleSideBar();\r\n }\r\n }}\r\n changeToSelectedFile={this.changeToSelectedFile}\r\n showTilesGallery={showTilesGallery}\r\n // show 3D Viewer\r\n show3DViewer={show3DViewer}\r\n onToggle3DViewer={(e) => {\r\n this.toggleSideBar();\r\n this.saveFunction(null, () => {\r\n console.log(\"SaveFunction Callback\");\r\n this.setMountedState({\r\n show3DViewer: e,\r\n showGallery: false,\r\n showTilesGallery: false,\r\n });\r\n });\r\n }}\r\n showPointCloud={showPointCloud}\r\n onToggleMeshView={(e) => {\r\n this.setMountedState({ showPointCloud: e });\r\n }}\r\n onToggleTilesGallery={(e) => {\r\n this.setMountedState({\r\n showTilesGallery: e,\r\n showGallery: false,\r\n });\r\n this.toggleSideBar();\r\n }}\r\n onToggleTimeBar={() => {\r\n this.setMountedState({ showTimeBar: !this.state.showTimeBar });\r\n this.updateDimensions();\r\n }}\r\n onSaveScreenshot={this.onSaveScreenshot}\r\n onZoomOriginal={this.onZoomOriginal}\r\n onZoomOneToN={this.onZoomOneToN}\r\n onZoomFit={this.onZoomFit}\r\n // save project\r\n onSave={this.onSaveClick}\r\n //save gallery images\r\n onSaveGallery={this.onSaveGalleryClick}\r\n alruns={this.state.alruns}\r\n onZoomDelta={this.onZoomDelta}\r\n applyDL={this.applyDL}\r\n tools={this.tools}\r\n fileId={activeFileId}\r\n projectId={this.props.id}\r\n saveChangesGallery={this.saveChangesGallery}\r\n project={this.state.project}\r\n setGalleryTool={this.setGalleryTool}\r\n setAlruns={this.setAlruns}\r\n trainingWarning={this.trainingWarning}\r\n onToggleSideBar={this.toggleSideBar}\r\n resizeSideBar={this.resizeSideBar}\r\n updateToolBarWidth={this.updateToolBarWidth}\r\n ome={omeDict[activeFileId]}\r\n activeTab={this.props.projectContext.activeTab}\r\n splitscreenCount={splitscreenFileIds.length}\r\n displayTimeBar={displayTimeBar}\r\n displayZStackBar={displayZStackBar}\r\n rendererRef={\r\n showFullscreen\r\n ? this.rendererdict[\"Full\" + activeFileId]\r\n : this.rendererdict[activeFileId]\r\n }\r\n onToggleFullscreen={this.onToggleFullscreen}\r\n showFullscreen={showFullscreen}\r\n onToggleOverlay={this.onToggleOverlay}\r\n showOverlay={showOverlay}\r\n onToggleWindowTool={this.onToggleWindowTool}\r\n showWindowTool={showWindowTool}\r\n aiUsedStructures={this.state.aiUsedStructures}\r\n />\r\n )}\r\n {omeDict[activeFileId] && histogramConfig[activeFileId] && (\r\n (this.sidebar = c)}\r\n key={activeFileId}\r\n sideBarWidth={sideBarWidth}\r\n project={project}\r\n alterStructure={this.alterStructure}\r\n structures={structures}\r\n roiLayers={roiLayers[activeFileId]}\r\n // tool selection\r\n activeTool={activeTool}\r\n onChangeTool={this.onChangeTool}\r\n // layer selection\r\n selectedLayer={selectedLayer}\r\n // toggle different dialogs\r\n showGallery={showGallery}\r\n onToggleGallery={(e) => {\r\n this.setMountedState({\r\n showGallery: e,\r\n showTilesGallery: false,\r\n });\r\n if (showTilesGallery) {\r\n this.toggleSideBar();\r\n }\r\n if (showGallery) {\r\n this.updateDimensions();\r\n if (this.resultTabActive()) {\r\n this.onChangeTool(\"pointcountingtile\");\r\n }\r\n }\r\n if (this.state.project.type.includes(\"HistoPointCounting\")) {\r\n // make parent to selectedLayer again\r\n let parentIndex = selectedLayer;\r\n if (structures[selectedLayer].classificationSubtype) {\r\n parentIndex = this.getParentIndex(\r\n structures[selectedLayer].parentId\r\n );\r\n }\r\n this.props.projectContext.setState({\r\n selectedLayer: parentIndex,\r\n });\r\n // hide sidebar\r\n this.toggleSideBar();\r\n }\r\n }}\r\n showTilesGallery={showTilesGallery}\r\n // show 3D Viewer\r\n show3DViewer={show3DViewer}\r\n onToggle3DViewer={(e) => {\r\n this.saveFunction(null, () => {\r\n console.log(\"SaveFunction Callback\");\r\n this.setMountedState({\r\n show3DViewer: e,\r\n showGallery: false,\r\n showTilesGallery: false,\r\n });\r\n });\r\n }}\r\n showPointCloud={showPointCloud}\r\n onToggleMeshView={(e) => {\r\n this.setMountedState({ showPointCloud: e });\r\n }}\r\n onToggleTilesGallery={(e) => {\r\n this.setMountedState({ showTilesGallery: e, showGallery: false });\r\n this.toggleSideBar();\r\n }}\r\n onToggleTimeBar={() => {\r\n this.setMountedState({ showTimeBar: !this.state.showTimeBar });\r\n this.updateDimensions();\r\n }}\r\n onSaveScreenshot={this.onSaveScreenshot}\r\n onZoomOriginal={this.onZoomOriginal}\r\n onZoomOneToN={this.onZoomOneToN}\r\n onZoomFit={this.onZoomFit}\r\n // save project\r\n onSave={this.onSaveClick}\r\n //save gallery images\r\n onSaveGallery={this.onSaveGalleryClick}\r\n alruns={this.state.alruns}\r\n onZoomDelta={this.onZoomDelta}\r\n applyDL={this.applyDL}\r\n tools={this.tools}\r\n fileId={activeFileId}\r\n projectId={this.props.id}\r\n saveChangesGallery={this.saveChangesGallery}\r\n setGalleryTool={this.setGalleryTool}\r\n setAlruns={this.setAlruns}\r\n trainingWarning={this.trainingWarning}\r\n onToggleSideBar={this.toggleSideBar}\r\n resizeSideBar={this.resizeSideBar}\r\n ome={omeDict[activeFileId]}\r\n activeTab={this.props.projectContext.activeTab}\r\n splitscreenCount={splitscreenFileIds.length}\r\n displayTimeBar={displayTimeBar}\r\n displayZStackBar={displayZStackBar}\r\n rendererRef={this.rendererdict[activeFileId]}\r\n onToggleFullscreen={this.onToggleFullscreen}\r\n showFullscreen={showFullscreen}\r\n viewerConfig={this.state.viewerConfig}\r\n splitscreenFileIds={splitscreenFileIds}\r\n onSelectFile={this.onSelectFile}\r\n onExcludeFilesToggle={this.onExcludeFilesToggle}\r\n // meta data\r\n histogramConfig={histogramConfig}\r\n onChangeChannels={(e) => this.histogramChanged(e)}\r\n id={this.props.id}\r\n // roi list\r\n rois={this.state.rois}\r\n onCenterROI={(roi) =>\r\n this.rendererdict[activeFileId].centerROI(roi)\r\n }\r\n onHoverROI={(roi, en) =>\r\n this.rendererdict[activeFileId].hoverROI(roi, en)\r\n }\r\n // tool parameters\r\n tool={this.tools[this.state.activeTool]}\r\n // import export parametersets\r\n onExportParameters={this.onExportParameters}\r\n onImportParameters={this.onImportParameters}\r\n allRoiLayers={roiLayers}\r\n deleteforAllScenes={this.deleteforAllScenes}\r\n updateViewer={this.updateViewer}\r\n onChangeLayers={() => {\r\n if (this._isMounted) this.forceUpdate();\r\n }}\r\n onSelectLayer={(e, callback) => {\r\n this.props.projectContext.setState(\r\n { selectedLayer: e },\r\n callback\r\n );\r\n }}\r\n opacity={opacity}\r\n onChangeOpacity={(e) => this.setMountedState({ opacity: e })}\r\n setSelectedLayer={this.setSelectedLayer}\r\n updateStructureChange={this.updateStructureChange}\r\n setAIFormData={this.setAIFormData}\r\n formDataAICockpit={this.state.formDataAICockpit}\r\n setSideBarWidth={this.setSideBarWidth}\r\n onUpdateDimensions={() => this.updateDimensions()}\r\n showFirstAccordion={this.state.showFirstAccordion}\r\n toggleShowFirstAccordion={this.toggleShowFirstAccordion}\r\n aiUsedStructures={this.state.aiUsedStructures}\r\n setAiUsedStructures={this.setAiUsedStructures}\r\n />\r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nViewer.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n persistentStorage: PropTypes.object,\r\n projectContext: PropTypes.object,\r\n id: PropTypes.string,\r\n tiles: PropTypes.object,\r\n projectHistory: PropTypes.object,\r\n spinloader: PropTypes.object,\r\n resultTab: PropTypes.object,\r\n activeFileId: PropTypes.string,\r\n history: PropTypes.object,\r\n roiLayers: PropTypes.array,\r\n structures: PropTypes.array,\r\n};\r\n\r\nexport default withRouter(\r\n withTiles(withAllViewerContexts(withResultTab(withStyles(styles)(Viewer))))\r\n);\r\n","// Framework imports\r\nimport \"./css/global.css\";\r\nimport React, { Component } from \"react\";\r\nimport { Route } from \"react-router-dom\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// External packages\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { Button } from \"@mui/material\";\r\nimport { withSnackbar } from \"notistack\";\r\n\r\n// HSA packages\r\nimport { PrivateRoute } from \"./common/components\";\r\nimport { Role } from \"./common/utils\";\r\nimport { TilesProvider } from \"./viewer/contexts/TilesContext\";\r\nimport AboutPage from \"./about/AboutPage\";\r\nimport AdminPage from \"./admin/AdminPage\";\r\nimport AudioViewer from \"./audioViewer/AudioViewer\";\r\nimport AIViewer from \"./aiViewer/AIViewer\";\r\nimport CasesPage from \"./cases/CasesPage\";\r\nimport CustomDialog from \"./common/components/CustomDialog\";\r\nimport FileViewer from \"./fileViewer/FileViewer\";\r\nimport HomePage from \"./home/HomePage\";\r\nimport LicensingPage from \"./licensing/LicensingPage\";\r\nimport LoginPage from \"./account/LoginPage\";\r\nimport NavigationBar from \"./common/components/NavigationBar\";\r\nimport PersistentStorageProvider from \"./viewer/contexts/PersistentStorageContext\";\r\nimport PredictionPage from \"./prediction/PredictionPage\";\r\nimport ProjectHistoryProvider from \"./viewer/contexts/ProjectHistoryContext\";\r\nimport ProjectProvider from \"./viewer/contexts/ProjectContext\";\r\nimport ProteomViewer from \"./proteomViewer/ProteomViewer\";\r\nimport Report from \"./home/Report\";\r\nimport ResultTabProvider from \"./viewer/contexts/ResultTabContext\";\r\nimport ScanProvider from \"./scanViewer/contexts/ScanViewerContext\";\r\nimport ScanViewer from \"./scanViewer/ScanViewer\";\r\nimport SettingsPage from \"./settings/SettingsPage\";\r\nimport SpectraViewer from \"./spectraViewer/SpectraViewer\";\r\nimport SpectraViewerProvider from \"./spectraViewer/contexts/SpectraViewerContext\";\r\nimport UserHistoryPage from \"./userhistory/UserHistoryPage\";\r\nimport Viewer from \"./viewer/Viewer\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n height: \"100vh\",\r\n display: \"grid\",\r\n gridTemplateRows: \"auto 1fr\",\r\n },\r\n menuButton: {\r\n marginLeft: -12,\r\n marginRight: 20,\r\n height: 50,\r\n },\r\n appbarPlaceholder: theme.mixins.toolbar,\r\n});\r\n\r\nclass App extends Component {\r\n static displayName = App.name;\r\n\r\n render() {\r\n const { classes } = this.props;\r\n\r\n /**\r\n * Adds a green success snackbar at bottom left of window.\r\n * @param {string} str Message to display.\r\n */\r\n window.showSuccessSnackbar = (str) => {\r\n this.props.enqueueSnackbar(str, {\r\n variant: \"success\",\r\n });\r\n };\r\n\r\n /**\r\n * Adds an orange warning snackbar at bottom left of window.\r\n * @param {string} str Message to display.\r\n */\r\n window.showWarningSnackbar = (str) => {\r\n this.props.enqueueSnackbar(str, {\r\n variant: \"warning\",\r\n });\r\n };\r\n\r\n /**\r\n * Adds a red error snackbar at bottom left of window.\r\n * @param {string} str Message to display.\r\n */\r\n window.showErrorSnackbar = (str) => {\r\n this.props.enqueueSnackbar(str, {\r\n variant: \"error\",\r\n });\r\n };\r\n\r\n /**\r\n * Adds a black info snackbar at bottom left of window.\r\n * @param {string} str Message to display.\r\n * @param {function} action Action to perform once confirmed by user.\r\n * @param {string} action_msg Message displayed on the primary button.\r\n * @param {string} hide_msg Optional. Message displayed on dismiss button. If undefined, button will be hidden.\r\n */\r\n window.showActionSnackbar = (str, action, action_msg, hide_msg) => {\r\n // Close the old snackbar before showing the new one\r\n this.props.closeSnackbar();\r\n\r\n this.props.enqueueSnackbar(str, {\r\n action: (sbId) => (\r\n <>\r\n {\r\n action();\r\n this.props.closeSnackbar(sbId);\r\n }}\r\n >\r\n {action_msg}\r\n \r\n {(hide_msg || hide_msg === 0) && hide_msg && (\r\n this.props.closeSnackbar(sbId)}\r\n >\r\n {hide_msg}\r\n \r\n )}\r\n \r\n ),\r\n persist: true,\r\n });\r\n };\r\n\r\n return (\r\n
    \r\n
    \r\n }\r\n />\r\n\r\n } />\r\n\r\n (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n\r\n (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n\r\n (\r\n \r\n )}\r\n />\r\n (\r\n \r\n \r\n \r\n )}\r\n />\r\n (\r\n \r\n \r\n \r\n )}\r\n />\r\n } />\r\n } />\r\n }\r\n />\r\n } />\r\n } />\r\n } />\r\n } />\r\n }\r\n />\r\n } />\r\n \r\n\r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nApp.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n enqueueSnackbar: PropTypes.func.isRequired,\r\n closeSnackbar: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default withSnackbar(withStyles(styles)(App));\r\n","// In production, we register a service worker to serve assets from local cache.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport default function register () {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW (swUrl) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log('New content is available; please refresh.');\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker (swUrl) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n if (\r\n response.status === 404 ||\r\n response.headers.get('content-type').indexOf('javascript') === -1\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister () {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import \"bootstrap/dist/css/bootstrap.css\";\r\nimport React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport { BrowserRouter } from \"react-router-dom\";\r\nimport App from \"./App\";\r\nimport { unregister as unregisterServiceWorker } from \"./registerServiceWorker\";\r\nimport SpinloaderProvider from \"./common/components/Spinloader\";\r\n\r\nimport {\r\n ThemeProvider,\r\n StyledEngineProvider,\r\n createTheme,\r\n} from \"@mui/material/styles\";\r\nimport { SnackbarProvider } from \"notistack\";\r\n\r\nconst baseUrl = document.getElementsByTagName(\"base\")[0].getAttribute(\"href\");\r\nconst rootElement = document.getElementById(\"root\");\r\nexport const theme = createTheme({\r\n palette: {\r\n selected: {\r\n main: \"rgba(0, 0, 0, 0.2)\",\r\n },\r\n primary: {\r\n // light: will be calculated from palette.primary.main,\r\n main: \"#0673C1\",\r\n inactive: \"rgba(0, 0, 0, 0.54)\",\r\n // dark: will be calculated from palette.primary.main,\r\n // contrastText: will be calculated to contrast with palette.primary.main\r\n },\r\n secondary: {\r\n // light: will be calculated from palette.primary.main,\r\n main: \"#182A42\",\r\n // dark: will be calculated from palette.primary.main,\r\n // contrastText: will be calculated to contrast with palette.primary.main\r\n },\r\n icon: {\r\n main: \"rgba(0, 0, 0, 0.54)\",\r\n },\r\n default: {\r\n main: \"#ffffff\",\r\n },\r\n error: {\r\n main: \"#d84646\",\r\n },\r\n success: {\r\n main: \"#4e9a51\",\r\n },\r\n warning: {\r\n main: \"#f68a1c\",\r\n },\r\n },\r\n typography: {\r\n useNextVariants: true,\r\n },\r\n});\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n rootElement\r\n);\r\n\r\nunregisterServiceWorker();\r\n"],"sourceRoot":""}