histomicsui 1.7.3.dev16__tar.gz → 1.7.3.dev40__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/.circleci/config.yml +0 -15
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/.pre-commit-config.yaml +1 -1
- {histomicsui-1.7.3.dev16/histomicsui.egg-info → histomicsui-1.7.3.dev40}/PKG-INFO +3 -4
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/README.rst +1 -1
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/dialogs/saveAnnotation.js +28 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/panels/AnnotationSelector.js +3 -1
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/dialogs/saveAnnotation.pug +1 -0
- histomicsui-1.7.3.dev40/histomicsui/web_client/vue/components/AnnotationHistoryBrowser.vue +104 -0
- histomicsui-1.7.3.dev40/histomicsui/web_client/vue/components/AnnotationHistoryBrowserContainer.vue +162 -0
- histomicsui-1.7.3.dev40/histomicsui/web_client/vue/components/AnnotationHistoryGroup.vue +128 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40/histomicsui.egg-info}/PKG-INFO +3 -4
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui.egg-info/SOURCES.txt +3 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/setup.py +1 -2
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/.editorconfig +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/.git-blame-ignore-revs +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/.gitignore +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/LICENSE +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/MANIFEST.in +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/NOTICE +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/codecov.yml +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/docs/config_options.rst +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/docs/controls.rst +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/docs/images/difference.gif +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/docs/images/intersect.gif +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/docs/images/union.gif +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/docs/images/xor.gif +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/docs/slicer_cli_plugins.rst +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/__init__.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/constants.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/handlers.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/models/__init__.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/models/aperio.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/models/case.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/models/cohort.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/models/image.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/models/meta.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/models/pathology.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/models/slide.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/rest/__init__.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/rest/aperio.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/rest/hui_resource.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/rest/image_browse_resource.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/rest/system.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/rest/tcga.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/app.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/collections/StyleCollection.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/collections/UserCollection.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/collections/index.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/dialogs/confirmDialog.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/dialogs/editElement.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/dialogs/editRegionOfInterest.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/dialogs/editStyleGroups.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/dialogs/index.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/dialogs/metadataPlot.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/dialogs/openAnnotatedImage.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/dialogs/openImage.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/events.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/index.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/main.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/models/StyleModel.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/models/index.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/package.json +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/panels/DrawWidget.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/panels/FrameSelectorWidget.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/panels/MetadataPlot.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/panels/MetadataWidget.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/panels/OverviewWidget.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/panels/RegionSelector.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/panels/ZoomWidget.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/panels/index.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/router.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/routes.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/static/favicon.png +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/body/configView.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/body/image.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/dialogs/editStyleGroups.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/dialogs/metadataPlot.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/dialogs/openAnnotatedImage.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/dialogs/saveAnnotation.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/layout/header.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/layout/headerAnalyses.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/layout/headerImage.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/layout/layout.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/panels/annotationSelector.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/panels/drawWidget.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/panels/frameSelectorWidget.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/panels/metadataPlot.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/panels/metadataWidget.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/panels/overviewWidget.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/panels/regionSelector.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/panels/zoomWidget.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/popover/annotationContextMenu.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/popover/annotationPopover.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/views/itemList.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/stylesheets/views/searchResultsView.styl +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/body/configView.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/body/image.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/dialogs/annotatedImageList.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/dialogs/confirmDialog.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/dialogs/editElement.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/dialogs/editRegionOfInterest.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/dialogs/editStyleGroups.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/dialogs/metadataPlot.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/dialogs/openAnnotatedImage.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/dialogs/openImage.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/layout/header.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/layout/headerAnalyses.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/layout/headerImage.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/layout/headerUser.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/layout/layout.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/panels/annotationSelector.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/panels/drawWidget.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/panels/drawWidgetElement.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/panels/frameSelectorWidget.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/panels/metadataPlot.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/panels/metadataWidgetPanel.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/panels/overviewWidget.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/panels/panel.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/panels/regionSelector.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/panels/zoomWidget.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/popover/annotationContextMenu.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/popover/annotationPopover.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/popover/annotationPopoverMetadata.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/templates/popover/pixelmapContextMenu.pug +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/HierarchyWidget.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/JobDetailsWidget.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/View.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/body/ConfigView.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/body/ImageView.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/body/index.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/index.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/itemList.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/itemPage.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/layout/HeaderAnalysesView.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/layout/HeaderImageView.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/layout/HeaderUserView.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/layout/HeaderView.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/layout/LoginView.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/layout/index.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/popover/AnnotationContextMenu.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/popover/AnnotationPopover.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/popover/PixelmapContextMenu.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/popover/index.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/searchResultsView.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/views/utils.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/vue/components/ColorPickerInput.vue +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/vue/components/EditHeatmapOrGridData.vue +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/vue/components/EditHeatmapOrGridDataContainer.vue +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/webpack.helper.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/webroot.mako +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui.egg-info/dependency_links.txt +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui.egg-info/entry_points.txt +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui.egg-info/not-zip-safe +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui.egg-info/requires.txt +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui.egg-info/top_level.txt +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/pyproject.toml +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/requirements-dev.txt +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/ruff.toml +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/setup.cfg +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/__init__.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/datastore.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/girder_utilities.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/test_files/.histomicsui_config.yaml +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/test_files/sample.anot +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/test_files/sample.meta +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/test_files/sample_girder_id.anot +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/test_files/test_analysis_detection.xml +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/test_files/test_analysis_features.xml +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/test_handlers.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/test_hui_rest.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/test_image_browse_endpoints.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/test_load.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/test_tcga.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/test_web_client.py +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/web_client_specs/.eslintrc +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/web_client_specs/analysisSpec.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/web_client_specs/annotationSpec.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/web_client_specs/girderUISpec.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/web_client_specs/huiSpec.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/web_client_specs/huiTest.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/web_client_specs/itemSpec.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/web_client_specs/metadataPanelSpec.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/web_client_specs/metadataPlotSpec.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/web_client_specs/overviewPanelSpec.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/web_client_specs/panelLayoutSpec.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tests/web_client_specs/pixelmapCategorySpec.js +0 -0
- {histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/tox.ini +0 -0
|
@@ -37,13 +37,6 @@ commands:
|
|
|
37
37
|
command: for i in $(seq 1 10); do [ $i -gt 1 ] && echo "retrying $i" && sleep 5; ./codecov --disable search pycov gcov --file .tox/coverage/py_coverage.xml,.tox/coverage/cobertura-coverage.xml && s=0 && break || s=$?; done; (exit $s)
|
|
38
38
|
|
|
39
39
|
jobs:
|
|
40
|
-
py38:
|
|
41
|
-
executor: toxandnode
|
|
42
|
-
steps:
|
|
43
|
-
- checkout
|
|
44
|
-
- tox:
|
|
45
|
-
env: py38
|
|
46
|
-
- coverage
|
|
47
40
|
py39:
|
|
48
41
|
executor: toxandnode
|
|
49
42
|
steps:
|
|
@@ -107,13 +100,6 @@ workflows:
|
|
|
107
100
|
version: 2
|
|
108
101
|
ci:
|
|
109
102
|
jobs:
|
|
110
|
-
- py38:
|
|
111
|
-
filters:
|
|
112
|
-
tags:
|
|
113
|
-
only: /^v.*/
|
|
114
|
-
branches:
|
|
115
|
-
ignore:
|
|
116
|
-
- gh-pages
|
|
117
103
|
- py39:
|
|
118
104
|
filters:
|
|
119
105
|
tags:
|
|
@@ -165,7 +151,6 @@ workflows:
|
|
|
165
151
|
- gh-pages
|
|
166
152
|
- release:
|
|
167
153
|
requires:
|
|
168
|
-
- py38
|
|
169
154
|
- py39
|
|
170
155
|
- py310
|
|
171
156
|
- py311
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: histomicsui
|
|
3
|
-
Version: 1.7.3.
|
|
3
|
+
Version: 1.7.3.dev40
|
|
4
4
|
Summary: Organize, visualize, and analyze histology images.
|
|
5
5
|
Home-page: https://github.com/DigitalSlideArchive/histomicsui
|
|
6
6
|
Author: Kitware, Inc.
|
|
@@ -11,13 +11,12 @@ Classifier: Development Status :: 5 - Production/Stable
|
|
|
11
11
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
12
12
|
Classifier: Natural Language :: English
|
|
13
13
|
Classifier: Programming Language :: Python :: 3
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
15
14
|
Classifier: Programming Language :: Python :: 3.9
|
|
16
15
|
Classifier: Programming Language :: Python :: 3.10
|
|
17
16
|
Classifier: Programming Language :: Python :: 3.11
|
|
18
17
|
Classifier: Programming Language :: Python :: 3.12
|
|
19
18
|
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
-
Requires-Python: >=3.
|
|
19
|
+
Requires-Python: >=3.9
|
|
21
20
|
Description-Content-Type: text/x-rst
|
|
22
21
|
License-File: LICENSE
|
|
23
22
|
License-File: NOTICE
|
|
@@ -81,7 +80,7 @@ Installation
|
|
|
81
80
|
Linux
|
|
82
81
|
=====
|
|
83
82
|
|
|
84
|
-
In linux with Python 3.
|
|
83
|
+
In linux with Python 3.9 or newer:
|
|
85
84
|
|
|
86
85
|
Prerequisites:
|
|
87
86
|
|
{histomicsui-1.7.3.dev16 → histomicsui-1.7.3.dev40}/histomicsui/web_client/dialogs/saveAnnotation.js
RENAMED
|
@@ -8,6 +8,8 @@ import AccessWidget from '@girder/core/views/widgets/AccessWidget';
|
|
|
8
8
|
// import MetadataWidget from '@girder/core/views/widgets/MetadataWidget';
|
|
9
9
|
import View from '@girder/core/views/View';
|
|
10
10
|
|
|
11
|
+
import AnnotationHistoryBrowserContainer from '../vue/components/AnnotationHistoryBrowserContainer.vue';
|
|
12
|
+
|
|
11
13
|
import MetadataWidget from '../panels/MetadataWidget';
|
|
12
14
|
import '../stylesheets/dialogs/saveAnnotation.styl';
|
|
13
15
|
import saveAnnotation from '../templates/dialogs/saveAnnotation.pug';
|
|
@@ -332,6 +334,23 @@ var SaveAnnotation = View.extend({
|
|
|
332
334
|
|
|
333
335
|
this.$el.find('.modal-dialog').addClass('hui-save-annotation-dialog');
|
|
334
336
|
this._updateFuncValues();
|
|
337
|
+
|
|
338
|
+
// Mount Vue component for annotation history if editing an existing annotation
|
|
339
|
+
const historyBrowserElement = this.$('.vue-component-annotation-history').get(0);
|
|
340
|
+
if (historyBrowserElement) {
|
|
341
|
+
const historyBrowser = new AnnotationHistoryBrowserContainer({
|
|
342
|
+
historyBrowserElement,
|
|
343
|
+
propsData: {
|
|
344
|
+
annotationId: this.annotation.id,
|
|
345
|
+
parentView: this,
|
|
346
|
+
defaultGroup: this.options.defaultGroup || 'default'
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
historyBrowser.$mount();
|
|
350
|
+
historyBrowserElement.appendChild(historyBrowser.$el);
|
|
351
|
+
this.historyBrowser = historyBrowser;
|
|
352
|
+
}
|
|
353
|
+
|
|
335
354
|
return this;
|
|
336
355
|
},
|
|
337
356
|
|
|
@@ -425,6 +444,15 @@ var SaveAnnotation = View.extend({
|
|
|
425
444
|
return setValue;
|
|
426
445
|
},
|
|
427
446
|
|
|
447
|
+
onRevert() {
|
|
448
|
+
if (this.annotation) {
|
|
449
|
+
delete this.annotation._meta;
|
|
450
|
+
delete this.annotation._styleFuncs;
|
|
451
|
+
}
|
|
452
|
+
this.annotation.trigger('h:revert:annotation', this.annotation, {});
|
|
453
|
+
this.$el.modal('hide');
|
|
454
|
+
},
|
|
455
|
+
|
|
428
456
|
/**
|
|
429
457
|
* Respond to form submission. Triggers a `g:save` event on the
|
|
430
458
|
* AnnotationModel.
|
|
@@ -57,6 +57,7 @@ var AnnotationSelector = Panel.extend({
|
|
|
57
57
|
this.listenTo(eventStream, 'g:eventStream.start', this._refreshAnnotations);
|
|
58
58
|
this.listenTo(eventStream, 'g:event.large_image_annotation.create', this._refreshAnnotations);
|
|
59
59
|
this.listenTo(eventStream, 'g:event.large_image_annotation.remove', this._refreshAnnotations);
|
|
60
|
+
this.listenTo(this.collection, 'h:revert:annotation', this._refreshAnnotations);
|
|
60
61
|
this.listenTo(this.collection, 'change:annotation change:groups', this._saveAnnotation);
|
|
61
62
|
this.listenTo(girderEvents, 'g:login', () => {
|
|
62
63
|
this.collection.reset();
|
|
@@ -238,8 +239,9 @@ var AnnotationSelector = Panel.extend({
|
|
|
238
239
|
editAnnotationMetadata(evt) {
|
|
239
240
|
const id = $(evt.currentTarget).parents('.h-annotation').data('id');
|
|
240
241
|
const model = this.collection.get(id);
|
|
242
|
+
const defaultGroup = this.parentView._defaultGroup;
|
|
241
243
|
this.listenToOnce(
|
|
242
|
-
showSaveAnnotationDialog(model, {title: 'Edit annotation', viewer: this.viewer}),
|
|
244
|
+
showSaveAnnotationDialog(model, {title: 'Edit annotation', viewer: this.viewer, defaultGroup}),
|
|
243
245
|
'g:submit',
|
|
244
246
|
() => {
|
|
245
247
|
if (model.get('displayed')) {
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import AnnotationHistoryGroup from './AnnotationHistoryGroup.vue';
|
|
3
|
+
export default {
|
|
4
|
+
components: {
|
|
5
|
+
AnnotationHistoryGroup
|
|
6
|
+
},
|
|
7
|
+
props: ['annotationHistory', 'loading', 'userMap', 'defaultGroup'],
|
|
8
|
+
emits: ['revert'],
|
|
9
|
+
data() {
|
|
10
|
+
return {
|
|
11
|
+
collapsed: true
|
|
12
|
+
};
|
|
13
|
+
},
|
|
14
|
+
computed: {
|
|
15
|
+
annotationGroups() {
|
|
16
|
+
if (!this.annotationHistory.length) {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
const annotationGroups = [];
|
|
20
|
+
let currentGroup = [this.annotationHistory[0]];
|
|
21
|
+
let lastTime = new Date(this.annotationHistory[0].updated);
|
|
22
|
+
this.annotationHistory.slice(1).forEach((annotation) => {
|
|
23
|
+
const updatedTime = new Date(annotation.updated);
|
|
24
|
+
const timeDiff = Math.abs(updatedTime - lastTime);
|
|
25
|
+
if (timeDiff >= 60 * 60 * 1000) {
|
|
26
|
+
// Start a new group
|
|
27
|
+
annotationGroups.push(currentGroup);
|
|
28
|
+
currentGroup = [annotation];
|
|
29
|
+
} else {
|
|
30
|
+
currentGroup.push(annotation);
|
|
31
|
+
}
|
|
32
|
+
lastTime = updatedTime;
|
|
33
|
+
});
|
|
34
|
+
annotationGroups.push(currentGroup);
|
|
35
|
+
return annotationGroups;
|
|
36
|
+
},
|
|
37
|
+
annotationHistoryEnabled() {
|
|
38
|
+
if (!this.annotationHistory || this.annotationHistory.length === 0) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
if (this.annotationHistory.length > 1) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
const firstVersion = this.annotationHistory[0];
|
|
45
|
+
return firstVersion.created === firstVersion.updated;
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
methods: {
|
|
49
|
+
handleRevert(version) {
|
|
50
|
+
this.$emit('revert', version);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
</script>
|
|
55
|
+
|
|
56
|
+
<template>
|
|
57
|
+
<div>
|
|
58
|
+
<div class="history-header">
|
|
59
|
+
<span
|
|
60
|
+
class="history-container-toggle"
|
|
61
|
+
@click="collapsed = !collapsed"
|
|
62
|
+
>
|
|
63
|
+
<i :class="collapsed ? 'icon-right-open' : 'icon-down-open'" />
|
|
64
|
+
Annotation Edit History
|
|
65
|
+
</span>
|
|
66
|
+
</div>
|
|
67
|
+
<div v-if="!collapsed">
|
|
68
|
+
<div v-if="!annotationHistoryEnabled">
|
|
69
|
+
<span>Ensure annotation history is turned on to track previous versions.</span>
|
|
70
|
+
</div>
|
|
71
|
+
<div v-else>
|
|
72
|
+
<div
|
|
73
|
+
class="history-body"
|
|
74
|
+
>
|
|
75
|
+
<div v-if="!annotationHistory || loading">
|
|
76
|
+
<i class="icon-spin4 animate-spin" />
|
|
77
|
+
Loading...
|
|
78
|
+
</div>
|
|
79
|
+
<div v-else>
|
|
80
|
+
<annotation-history-group
|
|
81
|
+
v-for="(group, index) in annotationGroups"
|
|
82
|
+
:key="index"
|
|
83
|
+
:history-group="group"
|
|
84
|
+
:user-id-map="userMap"
|
|
85
|
+
:allow-revert-initial="index !== 0"
|
|
86
|
+
:default-group="defaultGroup"
|
|
87
|
+
@revertToAnnotation="handleRevert"
|
|
88
|
+
/>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
</template>
|
|
95
|
+
|
|
96
|
+
<style scoped>
|
|
97
|
+
.history-container-toggle:hover {
|
|
98
|
+
cursor: pointer;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.history-body {
|
|
102
|
+
margin-left: 20px;
|
|
103
|
+
}
|
|
104
|
+
</style>
|
histomicsui-1.7.3.dev40/histomicsui/web_client/vue/components/AnnotationHistoryBrowserContainer.vue
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import _ from 'underscore';
|
|
3
|
+
import Vue from 'vue';
|
|
4
|
+
|
|
5
|
+
import UserModel from '@girder/core/models/UserModel';
|
|
6
|
+
import {getCurrentUser} from '@girder/core/auth';
|
|
7
|
+
import {restRequest} from '@girder/core/rest';
|
|
8
|
+
|
|
9
|
+
import AnnotationHistoryBrowser from './AnnotationHistoryBrowser.vue';
|
|
10
|
+
|
|
11
|
+
const Promise = require('bluebird');
|
|
12
|
+
|
|
13
|
+
export default Vue.extend({
|
|
14
|
+
components: {
|
|
15
|
+
AnnotationHistoryBrowser
|
|
16
|
+
},
|
|
17
|
+
props: ['annotationId', 'parentView', 'defaultGroup'],
|
|
18
|
+
data() {
|
|
19
|
+
return {
|
|
20
|
+
annotationCopy: _.clone(this.annotation || {}),
|
|
21
|
+
history: null,
|
|
22
|
+
loading: false,
|
|
23
|
+
userIdToLogin: null,
|
|
24
|
+
waitingForRevert: false
|
|
25
|
+
};
|
|
26
|
+
},
|
|
27
|
+
mounted() {
|
|
28
|
+
this.positionShield();
|
|
29
|
+
this.updateAnnotationHistory();
|
|
30
|
+
},
|
|
31
|
+
methods: {
|
|
32
|
+
makeUserMap(shouldRefresh) {
|
|
33
|
+
this.loading = true;
|
|
34
|
+
const userMap = {};
|
|
35
|
+
// First, see if we can use the logged in user
|
|
36
|
+
const currentUser = getCurrentUser();
|
|
37
|
+
userMap[currentUser.id] = currentUser.get('login');
|
|
38
|
+
// Then, get all annotation editor IDs that aren't the logged in user
|
|
39
|
+
const userRequestPromises = [];
|
|
40
|
+
const uniqueUserIds = new Set([currentUser.id]);
|
|
41
|
+
this.history.forEach((annotation) => {
|
|
42
|
+
if (!uniqueUserIds.has(annotation.updatedId)) {
|
|
43
|
+
uniqueUserIds.add(annotation.updatedId);
|
|
44
|
+
const user = new UserModel();
|
|
45
|
+
user.id = annotation.updatedId;
|
|
46
|
+
userRequestPromises.push(user.fetch());
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
Promise.all(userRequestPromises).then((users) => {
|
|
50
|
+
users.forEach((user) => {
|
|
51
|
+
userMap[user._id] = user.login;
|
|
52
|
+
});
|
|
53
|
+
this.userIdToLogin = userMap;
|
|
54
|
+
this.loading = false;
|
|
55
|
+
this.waitingForRevert = false;
|
|
56
|
+
if (shouldRefresh) {
|
|
57
|
+
this.parentView.onRevert();
|
|
58
|
+
}
|
|
59
|
+
return true;
|
|
60
|
+
});
|
|
61
|
+
},
|
|
62
|
+
updateAnnotationHistory(shouldRefresh) {
|
|
63
|
+
if (!this.annotationId) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
this.loading = true;
|
|
67
|
+
restRequest({
|
|
68
|
+
url: `annotation/${this.annotationId}/history`,
|
|
69
|
+
method: 'GET',
|
|
70
|
+
error: null
|
|
71
|
+
}).done((annotationHistory) => {
|
|
72
|
+
this.history = annotationHistory;
|
|
73
|
+
this.makeUserMap(shouldRefresh);
|
|
74
|
+
});
|
|
75
|
+
},
|
|
76
|
+
positionShield() {
|
|
77
|
+
const shield = this.$refs.shield;
|
|
78
|
+
if (shield && shield.parentNode !== document.body) {
|
|
79
|
+
document.body.appendChild(shield);
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
onRevert(version) {
|
|
83
|
+
this.loading = true;
|
|
84
|
+
// If an annotation takes > 1 second to be reverted, throw up a loading screen
|
|
85
|
+
setTimeout(() => {
|
|
86
|
+
if (this.loading) {
|
|
87
|
+
this.waitingForRevert = true;
|
|
88
|
+
this.$nextTick(() => {
|
|
89
|
+
this.positionShield();
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}, 1000);
|
|
93
|
+
restRequest({
|
|
94
|
+
url: `annotation/${this.annotationId}/history/revert`,
|
|
95
|
+
method: 'PUT',
|
|
96
|
+
data: {version},
|
|
97
|
+
error: null
|
|
98
|
+
}).done(() => {
|
|
99
|
+
this.updateAnnotationHistory(true);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
</script>
|
|
105
|
+
|
|
106
|
+
<template>
|
|
107
|
+
<div>
|
|
108
|
+
<div
|
|
109
|
+
v-if="waitingForRevert"
|
|
110
|
+
ref="shield"
|
|
111
|
+
class="loading-shield"
|
|
112
|
+
>
|
|
113
|
+
<div class="shield-content">
|
|
114
|
+
<i class="icon-spin3 animate-spin" />
|
|
115
|
+
Reverting to previous version. This may some time...
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
<annotation-history-browser
|
|
119
|
+
:annotation-history="history"
|
|
120
|
+
:loading="loading"
|
|
121
|
+
:user-map="userIdToLogin"
|
|
122
|
+
:default-group="defaultGroup"
|
|
123
|
+
@revert="onRevert"
|
|
124
|
+
/>
|
|
125
|
+
</div>
|
|
126
|
+
</template>
|
|
127
|
+
|
|
128
|
+
<style scoped>
|
|
129
|
+
.loading-shield {
|
|
130
|
+
position: fixed;
|
|
131
|
+
top: 0;
|
|
132
|
+
left: 0;
|
|
133
|
+
width: 100vw;
|
|
134
|
+
height: 100vh;
|
|
135
|
+
background-color: rgba(0, 0, 0, 0.4);
|
|
136
|
+
z-index: 9999;
|
|
137
|
+
pointer-events: all;
|
|
138
|
+
cursor: wait;
|
|
139
|
+
display: flex;
|
|
140
|
+
align-items: center;
|
|
141
|
+
justify-content: center;
|
|
142
|
+
|
|
143
|
+
animation: fadeIn 0.3s ease-out;
|
|
144
|
+
}
|
|
145
|
+
.shield-content {
|
|
146
|
+
padding: 24px;
|
|
147
|
+
background-color: white;
|
|
148
|
+
}
|
|
149
|
+
.loading-shield > i, span {
|
|
150
|
+
font-size: 24px;
|
|
151
|
+
z-index: 9999;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
@keyframes fadeIn {
|
|
155
|
+
from {
|
|
156
|
+
opacity: 0;
|
|
157
|
+
}
|
|
158
|
+
to {
|
|
159
|
+
opacity: 1;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
</style>
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import {formatDate, DATE_SECOND} from '@girder/core/misc';
|
|
3
|
+
export default {
|
|
4
|
+
props: ['historyGroup', 'userIdMap', 'allowRevertInitial', 'defaultGroup'],
|
|
5
|
+
emits: ['revertToAnnotation'],
|
|
6
|
+
data() {
|
|
7
|
+
return {
|
|
8
|
+
collapsed: this.allowRevertInitial
|
|
9
|
+
};
|
|
10
|
+
},
|
|
11
|
+
computed: {
|
|
12
|
+
startingAnnotation() {
|
|
13
|
+
return this.historyGroup[0];
|
|
14
|
+
},
|
|
15
|
+
hiddenAnnotations() {
|
|
16
|
+
return this.historyGroup.slice(1);
|
|
17
|
+
},
|
|
18
|
+
iconClass() {
|
|
19
|
+
const classes = ['hidden-version-toggle'];
|
|
20
|
+
if (this.collapsed) {
|
|
21
|
+
classes.push('icon-right-open');
|
|
22
|
+
} else {
|
|
23
|
+
classes.push('icon-down-open');
|
|
24
|
+
}
|
|
25
|
+
if (!this.hiddenAnnotations.length) {
|
|
26
|
+
classes.push('display-none');
|
|
27
|
+
}
|
|
28
|
+
return classes;
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
methods: {
|
|
32
|
+
displayDate(dateString) {
|
|
33
|
+
return formatDate(dateString, DATE_SECOND);
|
|
34
|
+
},
|
|
35
|
+
displayGroups(annotationVersion) {
|
|
36
|
+
return annotationVersion.groups.map((group) => (
|
|
37
|
+
group === null ? this.defaultGroup : group
|
|
38
|
+
)).join(', ');
|
|
39
|
+
},
|
|
40
|
+
getUser(userId) {
|
|
41
|
+
return (this.userIdMap && this.userIdMap[userId]) ? this.userIdMap[userId] : userId;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
</script>
|
|
46
|
+
|
|
47
|
+
<template>
|
|
48
|
+
<div>
|
|
49
|
+
<span class="history-group-header attribute-block">
|
|
50
|
+
<i
|
|
51
|
+
v-if="hiddenAnnotations.length"
|
|
52
|
+
:class="iconClass"
|
|
53
|
+
@click="collapsed = !collapsed"
|
|
54
|
+
/>
|
|
55
|
+
<span
|
|
56
|
+
v-else
|
|
57
|
+
class="hidden-version-toggle"
|
|
58
|
+
/>
|
|
59
|
+
<span class="attribute-display">Edited: {{ displayDate(startingAnnotation.updated) }}</span>
|
|
60
|
+
<span class="attribute-display">Author: {{ getUser(startingAnnotation.updatedId) }}</span>
|
|
61
|
+
<span class="attribute-display">Version: {{ startingAnnotation._version }}</span>
|
|
62
|
+
<span
|
|
63
|
+
class="attribute-display"
|
|
64
|
+
:title="displayGroups(startingAnnotation)"
|
|
65
|
+
>
|
|
66
|
+
Groups: {{ displayGroups(startingAnnotation) }}
|
|
67
|
+
</span>
|
|
68
|
+
<i
|
|
69
|
+
v-if="allowRevertInitial"
|
|
70
|
+
class="revert-button icon-ccw"
|
|
71
|
+
@click="$emit('revertToAnnotation', startingAnnotation._version)"
|
|
72
|
+
/>
|
|
73
|
+
</span>
|
|
74
|
+
<div
|
|
75
|
+
v-if="!collapsed && hiddenAnnotations.length"
|
|
76
|
+
class="hidden-version-container"
|
|
77
|
+
>
|
|
78
|
+
<div
|
|
79
|
+
v-for="entry in hiddenAnnotations"
|
|
80
|
+
:key="entry._version"
|
|
81
|
+
class="hidden-version-entry attribute-block"
|
|
82
|
+
>
|
|
83
|
+
<span class="hidden-version-toggle" />
|
|
84
|
+
<span class="attribute-display">Edited: {{ displayDate(entry.updated) }}</span>
|
|
85
|
+
<span class="attribute-display">Author: {{ getUser(entry.updatedId) }}</span>
|
|
86
|
+
<span class="attribute-display">Version: {{ entry._version }}</span>
|
|
87
|
+
<span
|
|
88
|
+
class="attribute-display"
|
|
89
|
+
:title="displayGroups(startingAnnotation)"
|
|
90
|
+
>
|
|
91
|
+
Groups: {{ displayGroups(entry) }}
|
|
92
|
+
</span>
|
|
93
|
+
<i
|
|
94
|
+
class="revert-button icon-ccw"
|
|
95
|
+
@click="$emit('revertToAnnotation', entry._version)"
|
|
96
|
+
/>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
</template>
|
|
101
|
+
|
|
102
|
+
<style scoped>
|
|
103
|
+
.hidden-version-toggle {
|
|
104
|
+
display: inline-block;
|
|
105
|
+
min-width: 20px;
|
|
106
|
+
}
|
|
107
|
+
.hidden-version-toggle:hover {
|
|
108
|
+
cursor: pointer;
|
|
109
|
+
}
|
|
110
|
+
.revert-button:hover {
|
|
111
|
+
cursor:pointer;
|
|
112
|
+
}
|
|
113
|
+
.attribute-block > span, i {
|
|
114
|
+
max-width: 250px;
|
|
115
|
+
overflow: hidden;
|
|
116
|
+
white-space: nowrap;
|
|
117
|
+
text-overflow: ellipses;
|
|
118
|
+
}
|
|
119
|
+
.attribute-block {
|
|
120
|
+
display: flex;
|
|
121
|
+
}
|
|
122
|
+
.attribute-block > span {
|
|
123
|
+
padding-right: 8px;
|
|
124
|
+
}
|
|
125
|
+
.display-none {
|
|
126
|
+
display: none;
|
|
127
|
+
}
|
|
128
|
+
</style>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: histomicsui
|
|
3
|
-
Version: 1.7.3.
|
|
3
|
+
Version: 1.7.3.dev40
|
|
4
4
|
Summary: Organize, visualize, and analyze histology images.
|
|
5
5
|
Home-page: https://github.com/DigitalSlideArchive/histomicsui
|
|
6
6
|
Author: Kitware, Inc.
|
|
@@ -11,13 +11,12 @@ Classifier: Development Status :: 5 - Production/Stable
|
|
|
11
11
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
12
12
|
Classifier: Natural Language :: English
|
|
13
13
|
Classifier: Programming Language :: Python :: 3
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
15
14
|
Classifier: Programming Language :: Python :: 3.9
|
|
16
15
|
Classifier: Programming Language :: Python :: 3.10
|
|
17
16
|
Classifier: Programming Language :: Python :: 3.11
|
|
18
17
|
Classifier: Programming Language :: Python :: 3.12
|
|
19
18
|
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
-
Requires-Python: >=3.
|
|
19
|
+
Requires-Python: >=3.9
|
|
21
20
|
Description-Content-Type: text/x-rst
|
|
22
21
|
License-File: LICENSE
|
|
23
22
|
License-File: NOTICE
|
|
@@ -81,7 +80,7 @@ Installation
|
|
|
81
80
|
Linux
|
|
82
81
|
=====
|
|
83
82
|
|
|
84
|
-
In linux with Python 3.
|
|
83
|
+
In linux with Python 3.9 or newer:
|
|
85
84
|
|
|
86
85
|
Prerequisites:
|
|
87
86
|
|
|
@@ -151,6 +151,9 @@ histomicsui/web_client/views/popover/AnnotationContextMenu.js
|
|
|
151
151
|
histomicsui/web_client/views/popover/AnnotationPopover.js
|
|
152
152
|
histomicsui/web_client/views/popover/PixelmapContextMenu.js
|
|
153
153
|
histomicsui/web_client/views/popover/index.js
|
|
154
|
+
histomicsui/web_client/vue/components/AnnotationHistoryBrowser.vue
|
|
155
|
+
histomicsui/web_client/vue/components/AnnotationHistoryBrowserContainer.vue
|
|
156
|
+
histomicsui/web_client/vue/components/AnnotationHistoryGroup.vue
|
|
154
157
|
histomicsui/web_client/vue/components/ColorPickerInput.vue
|
|
155
158
|
histomicsui/web_client/vue/components/EditHeatmapOrGridData.vue
|
|
156
159
|
histomicsui/web_client/vue/components/EditHeatmapOrGridDataContainer.vue
|
|
@@ -35,7 +35,6 @@ setup(
|
|
|
35
35
|
'License :: OSI Approved :: Apache Software License',
|
|
36
36
|
'Natural Language :: English',
|
|
37
37
|
'Programming Language :: Python :: 3',
|
|
38
|
-
'Programming Language :: Python :: 3.8',
|
|
39
38
|
'Programming Language :: Python :: 3.9',
|
|
40
39
|
'Programming Language :: Python :: 3.10',
|
|
41
40
|
'Programming Language :: Python :: 3.11',
|
|
@@ -59,7 +58,7 @@ setup(
|
|
|
59
58
|
packages=find_packages(exclude=['test', 'test.*']),
|
|
60
59
|
url='https://github.com/DigitalSlideArchive/histomicsui',
|
|
61
60
|
zip_safe=False,
|
|
62
|
-
python_requires='>=3.
|
|
61
|
+
python_requires='>=3.9',
|
|
63
62
|
entry_points={
|
|
64
63
|
'girder.plugin': [
|
|
65
64
|
'histomicsui = histomicsui:GirderPlugin',
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|