histomicsui 1.8.1.dev28__tar.gz → 1.8.1.dev43__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.8.1.dev28 → histomicsui-1.8.1.dev43}/PKG-INFO +1 -1
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/docs/config_options.rst +9 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/panels/DrawWidget.js +159 -1
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/panels/drawWidget.styl +22 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/panels/drawWidget.pug +11 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/body/ImageView.js +20 -2
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui.egg-info/PKG-INFO +1 -1
- histomicsui-1.8.1.dev43/histomicsui.egg-info/scm_version.json +8 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/test_files/.histomicsui_config.yaml +1 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/web_client_specs/annotationSpec.js +125 -4
- histomicsui-1.8.1.dev28/histomicsui.egg-info/scm_version.json +0 -8
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/.circleci/config.yml +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/.editorconfig +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/.git-blame-ignore-revs +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/.gitignore +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/.pre-commit-config.yaml +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/LICENSE +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/MANIFEST.in +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/NOTICE +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/README.rst +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/codecov.yml +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/docs/annotation_group_restrictions.rst +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/docs/controls.rst +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/docs/images/cut.gif +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/docs/images/difference.gif +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/docs/images/intersect.gif +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/docs/images/union.gif +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/docs/images/xor.gif +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/docs/slicer_cli_plugins.rst +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/__init__.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/constants.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/handlers.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/models/__init__.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/models/aperio.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/models/case.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/models/cohort.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/models/image.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/models/meta.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/models/pathology.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/models/slide.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/rest/__init__.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/rest/aperio.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/rest/hui_resource.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/rest/image_browse_resource.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/rest/system.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/rest/tcga.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/app.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/collections/StyleCollection.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/collections/UserCollection.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/collections/index.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/dialogs/confirmDialog.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/dialogs/editElement.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/dialogs/editRegionOfInterest.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/dialogs/editStyleGroups.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/dialogs/index.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/dialogs/metadataPlot.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/dialogs/openAnnotatedImage.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/dialogs/openImage.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/dialogs/saveAnnotation.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/events.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/index.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/main.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/models/StyleModel.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/models/index.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/package.json +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/panels/AnnotationSelector.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/panels/FrameSelectorWidget.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/panels/MetadataPlot.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/panels/MetadataWidget.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/panels/OverviewWidget.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/panels/RegionSelector.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/panels/ZoomWidget.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/panels/index.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/router.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/routes.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/static/favicon.png +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/body/configView.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/body/image.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/dialogs/editStyleGroups.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/dialogs/metadataPlot.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/dialogs/openAnnotatedImage.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/dialogs/saveAnnotation.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/layout/header.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/layout/headerAnalyses.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/layout/headerImage.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/layout/layout.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/panels/annotationSelector.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/panels/frameSelectorWidget.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/panels/metadataPlot.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/panels/metadataWidget.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/panels/overviewWidget.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/panels/regionSelector.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/panels/zoomWidget.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/popover/annotationContextMenu.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/popover/annotationPopover.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/views/itemList.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/stylesheets/views/searchResultsView.styl +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/body/configView.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/body/image.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/dialogs/annotatedImageList.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/dialogs/confirmDialog.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/dialogs/editElement.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/dialogs/editRegionOfInterest.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/dialogs/editStyleGroups.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/dialogs/metadataPlot.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/dialogs/openAnnotatedImage.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/dialogs/openImage.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/dialogs/saveAnnotation.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/elementProps.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/layout/header.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/layout/headerAnalyses.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/layout/headerImage.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/layout/headerUser.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/layout/layout.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/panels/annotationSelector.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/panels/drawWidgetElement.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/panels/frameSelectorWidget.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/panels/metadataPlot.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/panels/metadataWidgetPanel.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/panels/overviewWidget.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/panels/panel.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/panels/regionSelector.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/panels/zoomWidget.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/popover/annotationContextMenu.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/popover/annotationPopover.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/popover/annotationPopoverMetadata.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/templates/popover/pixelmapContextMenu.pug +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/utilities/allowedGroups.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/HierarchyWidget.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/JobDetailsWidget.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/View.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/body/ConfigView.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/body/index.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/index.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/itemList.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/itemPage.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/layout/HeaderAnalysesView.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/layout/HeaderImageView.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/layout/HeaderUserView.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/layout/HeaderView.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/layout/LoginView.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/layout/index.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/popover/AnnotationContextMenu.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/popover/AnnotationPopover.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/popover/PixelmapContextMenu.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/popover/index.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/searchResultsView.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/utils.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/vue/components/AnnotationHistoryBrowser.vue +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/vue/components/AnnotationHistoryBrowserContainer.vue +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/vue/components/AnnotationHistoryGroup.vue +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/vue/components/ColorPickerInput.vue +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/vue/components/EditHeatmapOrGridData.vue +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/vue/components/EditHeatmapOrGridDataContainer.vue +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/webpack.helper.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/webroot.mako +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui.egg-info/SOURCES.txt +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui.egg-info/dependency_links.txt +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui.egg-info/entry_points.txt +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui.egg-info/not-zip-safe +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui.egg-info/requires.txt +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui.egg-info/scm_file_list.json +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui.egg-info/top_level.txt +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/pyproject.toml +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/requirements-dev.txt +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/ruff.toml +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/setup.cfg +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/setup.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/__init__.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/datastore.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/girder_utilities.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/test_files/sample.anot +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/test_files/sample.meta +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/test_files/sample_girder_id.anot +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/test_files/test_analysis_detection.xml +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/test_files/test_analysis_features.xml +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/test_handlers.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/test_hui_rest.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/test_image_browse_endpoints.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/test_load.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/test_tcga.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/test_web_client.py +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/web_client_specs/.eslintrc +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/web_client_specs/allowedGroupsSpec.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/web_client_specs/analysisSpec.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/web_client_specs/girderUISpec.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/web_client_specs/huiSpec.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/web_client_specs/huiTest.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/web_client_specs/itemSpec.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/web_client_specs/metadataPanelSpec.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/web_client_specs/metadataPlotSpec.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/web_client_specs/overviewPanelSpec.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/web_client_specs/panelLayoutSpec.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/web_client_specs/pixelmapCategorySpec.js +0 -0
- {histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tox.ini +0 -0
|
@@ -79,6 +79,15 @@ If a hotkey is specified for a group, it will only be active if the group was lo
|
|
|
79
79
|
action: group
|
|
80
80
|
param: Red
|
|
81
81
|
|
|
82
|
+
Unselected Annotation Capacity
|
|
83
|
+
______________________________
|
|
84
|
+
When annotation elements are selected, the annotations not included in the user's selection have their opacity decreased to 0.33 times their specified opacity. This can be modified:
|
|
85
|
+
::
|
|
86
|
+
---
|
|
87
|
+
# A lower value will make unselected annotations more transparent.
|
|
88
|
+
unselectedOpacityMultiplier: 0.33
|
|
89
|
+
|
|
90
|
+
|
|
82
91
|
UI Settings
|
|
83
92
|
___________
|
|
84
93
|
|
{histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/panels/DrawWidget.js
RENAMED
|
@@ -32,6 +32,8 @@ var DrawWidget = Panel.extend({
|
|
|
32
32
|
'click .h-draw': 'drawElement',
|
|
33
33
|
'click .h-group-count-option .h-group-count-select': 'selectElementsInGroup',
|
|
34
34
|
'change .h-style-group': '_setToSelectedStyleGroup',
|
|
35
|
+
'change .h-sort-mode': '_changeSortMode',
|
|
36
|
+
'click .h-sort-order': '_toggleSortOrder',
|
|
35
37
|
'change .h-brush-shape,.h-brush-size,.h-brush-screen': '_changeBrush',
|
|
36
38
|
'change .h-fixed-shape,.h-fixed-height,.h-fixed-width': '_changeShapeConstraint',
|
|
37
39
|
'click .h-configure-style-group': '_styleGroupEditor',
|
|
@@ -69,6 +71,7 @@ var DrawWidget = Panel.extend({
|
|
|
69
71
|
this.listenTo(this.collection, 'add remove reset', this._recalculateGroupAggregation);
|
|
70
72
|
this.listenTo(this.collection, 'change update reset', this.render);
|
|
71
73
|
// if the annotation's metadata is edited while it is active, react immediately
|
|
74
|
+
this._lastAllowedGroupsKey = this._allowedGroupsKey();
|
|
72
75
|
this.listenTo(this.annotation, 'change:annotation', this._handleAnnotationAttributesChange);
|
|
73
76
|
this._groups.fetch().done(() => {
|
|
74
77
|
// ensure the default style exists
|
|
@@ -116,6 +119,7 @@ var DrawWidget = Panel.extend({
|
|
|
116
119
|
delete this._skipRenderHTML;
|
|
117
120
|
}
|
|
118
121
|
} else {
|
|
122
|
+
this._sortElements();
|
|
119
123
|
this.$el.html(drawWidget({
|
|
120
124
|
title: 'Draw',
|
|
121
125
|
elements: this.collection.models,
|
|
@@ -129,6 +133,8 @@ var DrawWidget = Panel.extend({
|
|
|
129
133
|
collapsed: this.$('.s-panel-content.collapse').length && !this.$('.s-panel-content').hasClass('in'),
|
|
130
134
|
firstRender: true,
|
|
131
135
|
displayIdStart: 0,
|
|
136
|
+
sortMode: this._editOptions.sort_mode || 'label',
|
|
137
|
+
sortOrder: this._editOptions.sort_order || 'asc',
|
|
132
138
|
partialCount: this.annotation && this.annotation._pageElements
|
|
133
139
|
}));
|
|
134
140
|
this.$('.h-dropdown-content').collapse({toggle: false});
|
|
@@ -378,6 +384,7 @@ var DrawWidget = Panel.extend({
|
|
|
378
384
|
}
|
|
379
385
|
}
|
|
380
386
|
}
|
|
387
|
+
this._reorderElementDom();
|
|
381
388
|
},
|
|
382
389
|
|
|
383
390
|
/**
|
|
@@ -824,6 +831,17 @@ var DrawWidget = Panel.extend({
|
|
|
824
831
|
if (!opts.size_mode) {
|
|
825
832
|
opts.size_mode = 'unconstrained';
|
|
826
833
|
}
|
|
834
|
+
if (opts.sort_mode === 'label-reverse') {
|
|
835
|
+
// migrate the legacy combined mode/order value
|
|
836
|
+
opts.sort_mode = 'label';
|
|
837
|
+
opts.sort_order = 'desc';
|
|
838
|
+
}
|
|
839
|
+
if (!opts.sort_mode || !['label', 'group', 'shape', 'count'].includes(opts.sort_mode)) {
|
|
840
|
+
opts.sort_mode = 'label';
|
|
841
|
+
}
|
|
842
|
+
if (!opts.sort_order || !['asc', 'desc'].includes(opts.sort_order)) {
|
|
843
|
+
opts.sort_order = 'asc';
|
|
844
|
+
}
|
|
827
845
|
},
|
|
828
846
|
|
|
829
847
|
updateCount(groupName, change) {
|
|
@@ -1097,11 +1115,29 @@ var DrawWidget = Panel.extend({
|
|
|
1097
1115
|
return getAllowedGroups(this.annotation);
|
|
1098
1116
|
},
|
|
1099
1117
|
|
|
1118
|
+
/**
|
|
1119
|
+
* Compute a stable, order-independent key for the current `allowed_groups` restriction, used
|
|
1120
|
+
* to detect whether it actually changed. Returns an empty string for "unrestricted".
|
|
1121
|
+
*
|
|
1122
|
+
* @returns {string} The restriction key.
|
|
1123
|
+
*/
|
|
1124
|
+
_allowedGroupsKey() {
|
|
1125
|
+
const allowed = this._getAllowedGroups();
|
|
1126
|
+
return allowed ? allowed.slice().sort().join('\u0000') : '';
|
|
1127
|
+
},
|
|
1128
|
+
|
|
1100
1129
|
/**
|
|
1101
1130
|
* Respond to the active annotation's metadata being edited, which may have changed its
|
|
1102
|
-
* `allowed_groups` restriction.
|
|
1131
|
+
* `allowed_groups` restriction. The annotation's `change:annotation` event also fires on
|
|
1132
|
+
* every autosave refetch, regardless of whether `allowed_groups` changed, so this bails out
|
|
1133
|
+
* early when the restriction is unchanged to avoid re-rendering on unrelated edits.
|
|
1103
1134
|
*/
|
|
1104
1135
|
_handleAnnotationAttributesChange() {
|
|
1136
|
+
const key = this._allowedGroupsKey();
|
|
1137
|
+
if (key === this._lastAllowedGroupsKey) {
|
|
1138
|
+
return;
|
|
1139
|
+
}
|
|
1140
|
+
this._lastAllowedGroupsKey = key;
|
|
1105
1141
|
this._ensureAllowedGroupsExist();
|
|
1106
1142
|
this._restrictStyleToAllowedGroups();
|
|
1107
1143
|
this._debounceRender();
|
|
@@ -1166,6 +1202,128 @@ var DrawWidget = Panel.extend({
|
|
|
1166
1202
|
this.parentView.trigger('h:highlightAnnotation');
|
|
1167
1203
|
},
|
|
1168
1204
|
|
|
1205
|
+
/**
|
|
1206
|
+
* Resolve the displayed shape name of an element, matching the label logic in
|
|
1207
|
+
* drawWidgetElement.pug (closed polylines are polygons, open ones are lines).
|
|
1208
|
+
*
|
|
1209
|
+
* @param {ElementModel} model The element to inspect.
|
|
1210
|
+
* @returns {string} The shape name.
|
|
1211
|
+
*/
|
|
1212
|
+
_elementShape(model) {
|
|
1213
|
+
const element = model.attributes;
|
|
1214
|
+
return element.type === 'polyline'
|
|
1215
|
+
? (element.closed ? 'polygon' : 'line')
|
|
1216
|
+
: element.type;
|
|
1217
|
+
},
|
|
1218
|
+
|
|
1219
|
+
/**
|
|
1220
|
+
* Resolve the group name of an element, falling back to the default group.
|
|
1221
|
+
*
|
|
1222
|
+
* @param {ElementModel} model The element to inspect.
|
|
1223
|
+
* @returns {string} The group name.
|
|
1224
|
+
*/
|
|
1225
|
+
_elementGroupName(model) {
|
|
1226
|
+
return model.attributes.group || this.parentView._defaultGroup;
|
|
1227
|
+
},
|
|
1228
|
+
|
|
1229
|
+
/**
|
|
1230
|
+
* Compute a lexical sort key for an element that matches its displayed label. The number is
|
|
1231
|
+
* intentionally omitted so that elements sort by their base label before enumeration.
|
|
1232
|
+
*
|
|
1233
|
+
* @param {ElementModel} model The element to compute a key for.
|
|
1234
|
+
* @returns {string} A lower-case sort key.
|
|
1235
|
+
*/
|
|
1236
|
+
_elementSortKey(model) {
|
|
1237
|
+
const element = model.attributes;
|
|
1238
|
+
const userLabel = (element.label || {}).value;
|
|
1239
|
+
if (userLabel) {
|
|
1240
|
+
return ('' + userLabel).toLowerCase();
|
|
1241
|
+
}
|
|
1242
|
+
const shape = this._elementShape(model);
|
|
1243
|
+
if (['point', 'polyline', 'rectangle', 'ellipse', 'circle'].includes(element.type)) {
|
|
1244
|
+
return `${this._elementGroupName(model)} ${shape}`.toLowerCase();
|
|
1245
|
+
}
|
|
1246
|
+
return ('' + shape).toLowerCase();
|
|
1247
|
+
},
|
|
1248
|
+
|
|
1249
|
+
/**
|
|
1250
|
+
* Count how many elements in the current collection belong to each group.
|
|
1251
|
+
*
|
|
1252
|
+
* @returns {Object} A map of group name to element count.
|
|
1253
|
+
*/
|
|
1254
|
+
_elementGroupCounts() {
|
|
1255
|
+
const counts = {};
|
|
1256
|
+
this.collection.models.forEach((model) => {
|
|
1257
|
+
const group = this._elementGroupName(model);
|
|
1258
|
+
counts[group] = (counts[group] || 0) + 1;
|
|
1259
|
+
});
|
|
1260
|
+
return counts;
|
|
1261
|
+
},
|
|
1262
|
+
|
|
1263
|
+
/**
|
|
1264
|
+
* Sort the element collection's models in place according to the current sort mode.
|
|
1265
|
+
*/
|
|
1266
|
+
_sortElements() {
|
|
1267
|
+
const groupCounts = this._elementGroupCounts();
|
|
1268
|
+
const comparators = {
|
|
1269
|
+
label: (elementA, elementB) => this._elementSortKey(elementA).localeCompare(this._elementSortKey(elementB)),
|
|
1270
|
+
group: (elementA, elementB) => this._elementGroupName(elementA).toLowerCase().localeCompare(this._elementGroupName(elementB).toLowerCase()),
|
|
1271
|
+
shape: (elementA, elementB) => this._elementShape(elementA).toLowerCase().localeCompare(this._elementShape(elementB).toLowerCase()),
|
|
1272
|
+
count: (elementA, elementB) => {
|
|
1273
|
+
const groupA = this._elementGroupName(elementA);
|
|
1274
|
+
const groupB = this._elementGroupName(elementB);
|
|
1275
|
+
const countDiff = groupCounts[groupA] - groupCounts[groupB];
|
|
1276
|
+
if (countDiff !== 0) {
|
|
1277
|
+
return countDiff;
|
|
1278
|
+
}
|
|
1279
|
+
return groupA.toLowerCase().localeCompare(groupB.toLowerCase());
|
|
1280
|
+
}
|
|
1281
|
+
};
|
|
1282
|
+
const comparator = comparators[this._editOptions.sort_mode] || comparators.label;
|
|
1283
|
+
const ordered = this._editOptions.sort_order === 'desc'
|
|
1284
|
+
? (elementA, elementB) => -comparator(elementA, elementB)
|
|
1285
|
+
: comparator;
|
|
1286
|
+
this.collection.models.sort(ordered);
|
|
1287
|
+
},
|
|
1288
|
+
|
|
1289
|
+
/**
|
|
1290
|
+
* Reorder the already-rendered element rows to match the current sort without rebuilding the
|
|
1291
|
+
* list. Auto-assigned enumeration numbers are left as-is here and are recomputed on the next
|
|
1292
|
+
* full render.
|
|
1293
|
+
*/
|
|
1294
|
+
_reorderElementDom() {
|
|
1295
|
+
const container = this.$el.find('.h-elements-container');
|
|
1296
|
+
if (!container.length) {
|
|
1297
|
+
return;
|
|
1298
|
+
}
|
|
1299
|
+
this._sortElements();
|
|
1300
|
+
const rowsById = {};
|
|
1301
|
+
container.children('.h-element').each((index, node) => {
|
|
1302
|
+
rowsById[$(node).attr('data-id')] = node;
|
|
1303
|
+
});
|
|
1304
|
+
this.collection.models.forEach((model) => {
|
|
1305
|
+
const node = rowsById[model.id];
|
|
1306
|
+
if (node) {
|
|
1307
|
+
container.append(node);
|
|
1308
|
+
}
|
|
1309
|
+
});
|
|
1310
|
+
},
|
|
1311
|
+
|
|
1312
|
+
_changeSortMode() {
|
|
1313
|
+
this._saveEditOptions({sort_mode: this.$('.h-sort-mode').val()});
|
|
1314
|
+
this.render();
|
|
1315
|
+
},
|
|
1316
|
+
|
|
1317
|
+
/**
|
|
1318
|
+
* Toggle between ascending and descending order for the current sort
|
|
1319
|
+
* mode, persist the choice, and re-render.
|
|
1320
|
+
*/
|
|
1321
|
+
_toggleSortOrder() {
|
|
1322
|
+
const order = this._editOptions.sort_order === 'desc' ? 'asc' : 'desc';
|
|
1323
|
+
this._saveEditOptions({sort_order: order});
|
|
1324
|
+
this.render();
|
|
1325
|
+
},
|
|
1326
|
+
|
|
1169
1327
|
_recalculateGroupAggregation() {
|
|
1170
1328
|
const groups = [];
|
|
1171
1329
|
const used = {};
|
|
@@ -97,6 +97,28 @@
|
|
|
97
97
|
flex-shrink 0
|
|
98
98
|
padding-left 6px
|
|
99
99
|
|
|
100
|
+
.h-sort-row
|
|
101
|
+
display flex
|
|
102
|
+
flex-direction row
|
|
103
|
+
align-items center
|
|
104
|
+
width 100%
|
|
105
|
+
margin 10px 0
|
|
106
|
+
|
|
107
|
+
.h-sort-label
|
|
108
|
+
flex-shrink 0
|
|
109
|
+
margin 0 6px 0 0
|
|
110
|
+
font-weight bold
|
|
111
|
+
|
|
112
|
+
.h-sort-mode
|
|
113
|
+
flex-grow 1
|
|
114
|
+
flex-shrink 1
|
|
115
|
+
width auto
|
|
116
|
+
|
|
117
|
+
.h-sort-order
|
|
118
|
+
flex-shrink 0
|
|
119
|
+
margin-left 6px
|
|
120
|
+
cursor pointer
|
|
121
|
+
|
|
100
122
|
.btn-default.active
|
|
101
123
|
background-color #5790ff
|
|
102
124
|
|
|
@@ -103,6 +103,17 @@ block content
|
|
|
103
103
|
label(title="If checked, the size is in screen pixels. If unchecked, the size is in base image pixels")
|
|
104
104
|
input.h-brush-screen(type="checkbox", checked=opts.brush_screen ? 'checked' : undefined)
|
|
105
105
|
| Screen
|
|
106
|
+
.h-sort-row
|
|
107
|
+
label.h-sort-label(for='h-sort-mode') Sort By
|
|
108
|
+
select#h-sort-mode.h-sort-mode.form-control.input-sm(title='Sort annotation elements')
|
|
109
|
+
option(value='label', selected=sortMode === 'label') Label
|
|
110
|
+
option(value='group', selected=sortMode === 'group') Group
|
|
111
|
+
option(value='shape', selected=sortMode === 'shape') Shape
|
|
112
|
+
option(value='count', selected=sortMode === 'count') Count
|
|
113
|
+
a.h-sort-order(
|
|
114
|
+
href='javascript:void(0)',
|
|
115
|
+
title=sortOrder === 'desc' ? 'Sort descending (click to sort ascending)' : 'Sort ascending (click to sort descending)')
|
|
116
|
+
i(class=sortOrder === 'desc' ? 'icon-sort-alt-down' : 'icon-sort-alt-up')
|
|
106
117
|
.h-group-count
|
|
107
118
|
if partialCount
|
|
108
119
|
b.h-group-count-label(title='* These counts only apply to loaded elements') Count*:
|
{histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/views/body/ImageView.js
RENAMED
|
@@ -205,13 +205,17 @@ var ImageView = View.extend({
|
|
|
205
205
|
// it is very confusing if this value is smaller than the
|
|
206
206
|
// AnnotationSelector MAX_ELEMENTS_LIST_LENGTH
|
|
207
207
|
highlightFeatureSizeLimit: 5000,
|
|
208
|
-
scale: {position: {bottom: 20, right: 10}}
|
|
208
|
+
scale: {position: {bottom: 20, right: 10}},
|
|
209
|
+
unselectedOpacityMultiplier: typeof this._unselectedOpacityMultiplier !== 'number'
|
|
210
|
+
? 0.33
|
|
211
|
+
: this._unselectedOpacityMultiplier
|
|
209
212
|
});
|
|
210
213
|
// Don't unclamp bounds for the image even if image overlays are present.
|
|
211
214
|
if (this.viewerWidget.setUnclampBoundsForOverlay) {
|
|
212
215
|
this.viewerWidget.setUnclampBoundsForOverlay(false);
|
|
213
216
|
}
|
|
214
217
|
this.trigger('h:viewerWidgetCreated', this.viewerWidget);
|
|
218
|
+
this.viewerWidget.setUnselectedOpacityMultiplier(this._unselectedOpacityMultiplier);
|
|
215
219
|
|
|
216
220
|
// handle annotation mouse events
|
|
217
221
|
this.listenTo(this.viewerWidget, 'g:mouseOverAnnotation', this.mouseOverAnnotation);
|
|
@@ -1784,10 +1788,24 @@ var ImageView = View.extend({
|
|
|
1784
1788
|
group.label = group.label ? {value: group.label} : undefined;
|
|
1785
1789
|
groups.add(group);
|
|
1786
1790
|
});
|
|
1787
|
-
groups.
|
|
1791
|
+
const saves = groups.map((model) => model.save());
|
|
1792
|
+
// Other views (e.g. the annotation context menu) may have already
|
|
1793
|
+
// fetched their own style collection from localStorage before this
|
|
1794
|
+
// config finished loading; let them know to refetch now that it has.
|
|
1795
|
+
$.when(...saves).done(() => {
|
|
1796
|
+
this.trigger('h:styleGroupsEdited', groups);
|
|
1797
|
+
});
|
|
1788
1798
|
}
|
|
1789
1799
|
});
|
|
1790
1800
|
}
|
|
1801
|
+
if (val.unselectedOpacityMultiplier !== undefined) {
|
|
1802
|
+
this._unselectedOpacityMultiplier = typeof val.unselectedOpacityMultiplier !== 'number'
|
|
1803
|
+
? 0.33
|
|
1804
|
+
: val.unselectedOpacityMultiplier;
|
|
1805
|
+
if (this.viewerWidget) {
|
|
1806
|
+
this.viewerWidget.setUnselectedOpacityMultiplier(val.unselectedOpacityMultiplier);
|
|
1807
|
+
}
|
|
1808
|
+
}
|
|
1791
1809
|
});
|
|
1792
1810
|
},
|
|
1793
1811
|
|
{histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/tests/web_client_specs/annotationSpec.js
RENAMED
|
@@ -276,13 +276,21 @@ girderTest.promise.done(function () {
|
|
|
276
276
|
return $('.h-elements-container .h-element').length === 2;
|
|
277
277
|
}, 'point to be created');
|
|
278
278
|
runs(function () {
|
|
279
|
-
|
|
279
|
+
// Elements are sorted lexically by label, so target the newly drawn point by
|
|
280
|
+
// its label rather than by position.
|
|
281
|
+
expect($('.h-elements-container .h-element .h-element-label').filter(function () {
|
|
282
|
+
return $(this).text() === 'default point 2';
|
|
283
|
+
}).length).toBe(1);
|
|
280
284
|
});
|
|
281
285
|
checkAutoSave('drawn 1', 2, annotationInfo);
|
|
282
286
|
});
|
|
283
287
|
|
|
284
288
|
it('delete the second point', function () {
|
|
285
|
-
|
|
289
|
+
// Elements are sorted lexically by label, so delete the just drawn point by its
|
|
290
|
+
// label rather than by position.
|
|
291
|
+
$('.h-elements-container .h-element').filter(function () {
|
|
292
|
+
return $(this).find('.h-element-label').text() === 'default point 2';
|
|
293
|
+
}).find('.h-delete-element').click();
|
|
286
294
|
expect($('.h-elements-container .h-element').length).toBe(1);
|
|
287
295
|
checkAutoSave('drawn 1', 1, annotationInfo);
|
|
288
296
|
});
|
|
@@ -312,7 +320,11 @@ girderTest.promise.done(function () {
|
|
|
312
320
|
return $('.h-elements-container .h-element').length === 2;
|
|
313
321
|
}, 'point to be created');
|
|
314
322
|
runs(function () {
|
|
315
|
-
|
|
323
|
+
// Elements are sorted lexically by label, so target the newly drawn point by
|
|
324
|
+
// its label rather than by position.
|
|
325
|
+
expect($('.h-elements-container .h-element .h-element-label').filter(function () {
|
|
326
|
+
return $(this).text() === 'default point 2';
|
|
327
|
+
}).length).toBe(1);
|
|
316
328
|
});
|
|
317
329
|
checkAutoSave('drawn 1', 2, annotationInfo);
|
|
318
330
|
});
|
|
@@ -349,7 +361,11 @@ girderTest.promise.done(function () {
|
|
|
349
361
|
});
|
|
350
362
|
|
|
351
363
|
it('delete the last point', function () {
|
|
352
|
-
|
|
364
|
+
// Elements are sorted lexically by label, so delete the just drawn point by its
|
|
365
|
+
// label rather than by position.
|
|
366
|
+
$('.h-elements-container .h-element').filter(function () {
|
|
367
|
+
return $(this).find('.h-element-label').text() === 'default point 2';
|
|
368
|
+
}).find('.h-delete-element').click();
|
|
353
369
|
expect($('.h-elements-container .h-element').length).toBe(1);
|
|
354
370
|
|
|
355
371
|
// reset the draw state
|
|
@@ -609,6 +625,106 @@ girderTest.promise.done(function () {
|
|
|
609
625
|
});
|
|
610
626
|
});
|
|
611
627
|
|
|
628
|
+
describe('Sort By', function () {
|
|
629
|
+
var drawWidget;
|
|
630
|
+
var testLabels = ['Alpha', 'Bravo', 'Charlie', 'Delta'];
|
|
631
|
+
var testIds = ['sort-test-alpha', 'sort-test-bravo', 'sort-test-charlie', 'sort-test-delta'];
|
|
632
|
+
|
|
633
|
+
function testElementLabels() {
|
|
634
|
+
return $('.h-elements-container .h-element-label').map(function () {
|
|
635
|
+
return $(this).text();
|
|
636
|
+
}).get().filter(function (text) {
|
|
637
|
+
return testLabels.indexOf(text) !== -1;
|
|
638
|
+
});
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
it('add elements with distinct labels, groups, and shapes', function () {
|
|
642
|
+
runs(function () {
|
|
643
|
+
drawWidget = huiTest.app.bodyView.drawWidget;
|
|
644
|
+
drawWidget.collection.add([
|
|
645
|
+
{id: 'sort-test-charlie', type: 'point', label: {value: 'Charlie'}, group: 'rareGroup'},
|
|
646
|
+
{id: 'sort-test-alpha', type: 'point', label: {value: 'Alpha'}, group: 'commonGroup'},
|
|
647
|
+
{id: 'sort-test-bravo', type: 'rectangle', label: {value: 'Bravo'}, group: 'commonGroup'},
|
|
648
|
+
{id: 'sort-test-delta', type: 'polyline', closed: false, label: {value: 'Delta'}, group: 'commonGroup'}
|
|
649
|
+
]);
|
|
650
|
+
});
|
|
651
|
+
waitsFor(function () {
|
|
652
|
+
return testElementLabels().length === testLabels.length;
|
|
653
|
+
}, 'test elements to be added');
|
|
654
|
+
});
|
|
655
|
+
|
|
656
|
+
it('defaults to sorting by label, ascending', function () {
|
|
657
|
+
runs(function () {
|
|
658
|
+
expect($('.h-sort-mode').val()).toBe('label');
|
|
659
|
+
expect($('.h-sort-order i').hasClass('icon-sort-alt-up')).toBe(true);
|
|
660
|
+
expect(testElementLabels()).toEqual(['Alpha', 'Bravo', 'Charlie', 'Delta']);
|
|
661
|
+
});
|
|
662
|
+
});
|
|
663
|
+
|
|
664
|
+
it('toggles to descending order', function () {
|
|
665
|
+
runs(function () {
|
|
666
|
+
$('.h-sort-order').click();
|
|
667
|
+
});
|
|
668
|
+
runs(function () {
|
|
669
|
+
expect($('.h-sort-order i').hasClass('icon-sort-alt-down')).toBe(true);
|
|
670
|
+
expect($('.h-sort-order').attr('title')).toMatch(/^Sort descending/);
|
|
671
|
+
expect(testElementLabels()).toEqual(['Delta', 'Charlie', 'Bravo', 'Alpha']);
|
|
672
|
+
});
|
|
673
|
+
});
|
|
674
|
+
|
|
675
|
+
it('toggles back to ascending order', function () {
|
|
676
|
+
runs(function () {
|
|
677
|
+
$('.h-sort-order').click();
|
|
678
|
+
});
|
|
679
|
+
runs(function () {
|
|
680
|
+
expect($('.h-sort-order i').hasClass('icon-sort-alt-up')).toBe(true);
|
|
681
|
+
expect($('.h-sort-order').attr('title')).toMatch(/^Sort ascending/);
|
|
682
|
+
expect(testElementLabels()).toEqual(['Alpha', 'Bravo', 'Charlie', 'Delta']);
|
|
683
|
+
});
|
|
684
|
+
});
|
|
685
|
+
|
|
686
|
+
it('sorts by group', function () {
|
|
687
|
+
runs(function () {
|
|
688
|
+
$('.h-sort-mode').val('group').trigger('change');
|
|
689
|
+
});
|
|
690
|
+
runs(function () {
|
|
691
|
+
var order = testElementLabels();
|
|
692
|
+
// "commonGroup" sorts before "rareGroup" lexically.
|
|
693
|
+
expect(order.indexOf('Charlie')).toBe(order.length - 1);
|
|
694
|
+
});
|
|
695
|
+
});
|
|
696
|
+
|
|
697
|
+
it('sorts by shape', function () {
|
|
698
|
+
runs(function () {
|
|
699
|
+
$('.h-sort-mode').val('shape').trigger('change');
|
|
700
|
+
});
|
|
701
|
+
runs(function () {
|
|
702
|
+
var order = testElementLabels();
|
|
703
|
+
expect(order.indexOf('Delta')).toBeLessThan(order.indexOf('Bravo'));
|
|
704
|
+
});
|
|
705
|
+
});
|
|
706
|
+
|
|
707
|
+
it('sorts by count, rare groups first', function () {
|
|
708
|
+
runs(function () {
|
|
709
|
+
$('.h-sort-mode').val('count').trigger('change');
|
|
710
|
+
});
|
|
711
|
+
runs(function () {
|
|
712
|
+
var order = testElementLabels();
|
|
713
|
+
expect(order[0]).toBe('Charlie');
|
|
714
|
+
});
|
|
715
|
+
});
|
|
716
|
+
|
|
717
|
+
it('removes the test elements and restores label sort', function () {
|
|
718
|
+
runs(function () {
|
|
719
|
+
drawWidget.collection.remove(testIds);
|
|
720
|
+
$('.h-sort-mode').val('label').trigger('change');
|
|
721
|
+
});
|
|
722
|
+
waitsFor(function () {
|
|
723
|
+
return testElementLabels().length === 0;
|
|
724
|
+
}, 'test elements to be removed');
|
|
725
|
+
});
|
|
726
|
+
});
|
|
727
|
+
|
|
612
728
|
describe('Annotation styles', function () {
|
|
613
729
|
it('create a new annotation', function () {
|
|
614
730
|
$('.h-create-annotation').click();
|
|
@@ -1812,6 +1928,11 @@ girderTest.promise.done(function () {
|
|
|
1812
1928
|
it('open image', function () {
|
|
1813
1929
|
huiTest.openImage('image.svs', ['subfolder']);
|
|
1814
1930
|
});
|
|
1931
|
+
it('respects unselected opacity config', function () {
|
|
1932
|
+
girderTest.waitForLoad();
|
|
1933
|
+
expect(huiTest.app.bodyView._unselectedOpacityMultiplier).toBe(0.5);
|
|
1934
|
+
expect(huiTest.app.bodyView.viewerWidget._unselectedOpacityMultiplier).toBe(0.5);
|
|
1935
|
+
});
|
|
1815
1936
|
it('create a new annotation', function () {
|
|
1816
1937
|
girderTest.waitForLoad();
|
|
1817
1938
|
runs(function () {
|
|
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
|
|
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
|
{histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/rest/image_browse_resource.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/collections/index.js
RENAMED
|
File without changes
|
{histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/dialogs/confirmDialog.js
RENAMED
|
File without changes
|
{histomicsui-1.8.1.dev28 → histomicsui-1.8.1.dev43}/histomicsui/web_client/dialogs/editElement.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|