histomicsui 1.7.3.dev14__tar.gz → 1.7.3.dev38__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.
Files changed (187) hide show
  1. {histomicsui-1.7.3.dev14/histomicsui.egg-info → histomicsui-1.7.3.dev38}/PKG-INFO +1 -1
  2. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/dialogs/saveAnnotation.js +28 -0
  3. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/panels/AnnotationSelector.js +3 -1
  4. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/panels/annotationSelector.styl +15 -0
  5. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/panels/drawWidget.styl +32 -10
  6. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/dialogs/saveAnnotation.pug +1 -0
  7. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/panels/annotationSelector.pug +29 -5
  8. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/panels/drawWidgetElement.pug +19 -4
  9. histomicsui-1.7.3.dev38/histomicsui/web_client/vue/components/AnnotationHistoryBrowser.vue +104 -0
  10. histomicsui-1.7.3.dev38/histomicsui/web_client/vue/components/AnnotationHistoryBrowserContainer.vue +162 -0
  11. histomicsui-1.7.3.dev38/histomicsui/web_client/vue/components/AnnotationHistoryGroup.vue +128 -0
  12. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38/histomicsui.egg-info}/PKG-INFO +1 -1
  13. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui.egg-info/SOURCES.txt +3 -0
  14. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/.circleci/config.yml +0 -0
  15. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/.editorconfig +0 -0
  16. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/.git-blame-ignore-revs +0 -0
  17. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/.gitignore +0 -0
  18. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/.pre-commit-config.yaml +0 -0
  19. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/LICENSE +0 -0
  20. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/MANIFEST.in +0 -0
  21. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/NOTICE +0 -0
  22. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/README.rst +0 -0
  23. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/codecov.yml +0 -0
  24. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/docs/config_options.rst +0 -0
  25. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/docs/controls.rst +0 -0
  26. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/docs/images/difference.gif +0 -0
  27. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/docs/images/intersect.gif +0 -0
  28. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/docs/images/union.gif +0 -0
  29. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/docs/images/xor.gif +0 -0
  30. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/docs/slicer_cli_plugins.rst +0 -0
  31. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/__init__.py +0 -0
  32. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/constants.py +0 -0
  33. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/handlers.py +0 -0
  34. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/models/__init__.py +0 -0
  35. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/models/aperio.py +0 -0
  36. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/models/case.py +0 -0
  37. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/models/cohort.py +0 -0
  38. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/models/image.py +0 -0
  39. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/models/meta.py +0 -0
  40. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/models/pathology.py +0 -0
  41. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/models/slide.py +0 -0
  42. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/rest/__init__.py +0 -0
  43. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/rest/aperio.py +0 -0
  44. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/rest/hui_resource.py +0 -0
  45. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/rest/image_browse_resource.py +0 -0
  46. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/rest/system.py +0 -0
  47. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/rest/tcga.py +0 -0
  48. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/app.js +0 -0
  49. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/collections/StyleCollection.js +0 -0
  50. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/collections/UserCollection.js +0 -0
  51. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/collections/index.js +0 -0
  52. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/dialogs/confirmDialog.js +0 -0
  53. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/dialogs/editElement.js +0 -0
  54. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/dialogs/editRegionOfInterest.js +0 -0
  55. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/dialogs/editStyleGroups.js +0 -0
  56. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/dialogs/index.js +0 -0
  57. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/dialogs/metadataPlot.js +0 -0
  58. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/dialogs/openAnnotatedImage.js +0 -0
  59. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/dialogs/openImage.js +0 -0
  60. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/events.js +0 -0
  61. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/index.js +0 -0
  62. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/main.js +0 -0
  63. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/models/StyleModel.js +0 -0
  64. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/models/index.js +0 -0
  65. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/package.json +0 -0
  66. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/panels/DrawWidget.js +0 -0
  67. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/panels/FrameSelectorWidget.js +0 -0
  68. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/panels/MetadataPlot.js +0 -0
  69. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/panels/MetadataWidget.js +0 -0
  70. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/panels/OverviewWidget.js +0 -0
  71. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/panels/RegionSelector.js +0 -0
  72. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/panels/ZoomWidget.js +0 -0
  73. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/panels/index.js +0 -0
  74. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/router.js +0 -0
  75. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/routes.js +0 -0
  76. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/static/favicon.png +0 -0
  77. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/body/configView.styl +0 -0
  78. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/body/image.styl +0 -0
  79. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/dialogs/editStyleGroups.styl +0 -0
  80. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/dialogs/metadataPlot.styl +0 -0
  81. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/dialogs/openAnnotatedImage.styl +0 -0
  82. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/dialogs/saveAnnotation.styl +0 -0
  83. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/layout/header.styl +0 -0
  84. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/layout/headerAnalyses.styl +0 -0
  85. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/layout/headerImage.styl +0 -0
  86. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/layout/layout.styl +0 -0
  87. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/panels/frameSelectorWidget.styl +0 -0
  88. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/panels/metadataPlot.styl +0 -0
  89. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/panels/metadataWidget.styl +0 -0
  90. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/panels/overviewWidget.styl +0 -0
  91. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/panels/regionSelector.styl +0 -0
  92. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/panels/zoomWidget.styl +0 -0
  93. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/popover/annotationContextMenu.styl +0 -0
  94. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/popover/annotationPopover.styl +0 -0
  95. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/views/itemList.styl +0 -0
  96. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/stylesheets/views/searchResultsView.styl +0 -0
  97. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/body/configView.pug +0 -0
  98. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/body/image.pug +0 -0
  99. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/dialogs/annotatedImageList.pug +0 -0
  100. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/dialogs/confirmDialog.pug +0 -0
  101. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/dialogs/editElement.pug +0 -0
  102. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/dialogs/editRegionOfInterest.pug +0 -0
  103. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/dialogs/editStyleGroups.pug +0 -0
  104. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/dialogs/metadataPlot.pug +0 -0
  105. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/dialogs/openAnnotatedImage.pug +0 -0
  106. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/dialogs/openImage.pug +0 -0
  107. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/layout/header.pug +0 -0
  108. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/layout/headerAnalyses.pug +0 -0
  109. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/layout/headerImage.pug +0 -0
  110. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/layout/headerUser.pug +0 -0
  111. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/layout/layout.pug +0 -0
  112. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/panels/drawWidget.pug +0 -0
  113. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/panels/frameSelectorWidget.pug +0 -0
  114. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/panels/metadataPlot.pug +0 -0
  115. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/panels/metadataWidgetPanel.pug +0 -0
  116. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/panels/overviewWidget.pug +0 -0
  117. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/panels/panel.pug +0 -0
  118. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/panels/regionSelector.pug +0 -0
  119. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/panels/zoomWidget.pug +0 -0
  120. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/popover/annotationContextMenu.pug +0 -0
  121. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/popover/annotationPopover.pug +0 -0
  122. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/popover/annotationPopoverMetadata.pug +0 -0
  123. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/templates/popover/pixelmapContextMenu.pug +0 -0
  124. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/HierarchyWidget.js +0 -0
  125. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/JobDetailsWidget.js +0 -0
  126. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/View.js +0 -0
  127. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/body/ConfigView.js +0 -0
  128. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/body/ImageView.js +0 -0
  129. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/body/index.js +0 -0
  130. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/index.js +0 -0
  131. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/itemList.js +0 -0
  132. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/itemPage.js +0 -0
  133. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/layout/HeaderAnalysesView.js +0 -0
  134. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/layout/HeaderImageView.js +0 -0
  135. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/layout/HeaderUserView.js +0 -0
  136. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/layout/HeaderView.js +0 -0
  137. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/layout/LoginView.js +0 -0
  138. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/layout/index.js +0 -0
  139. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/popover/AnnotationContextMenu.js +0 -0
  140. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/popover/AnnotationPopover.js +0 -0
  141. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/popover/PixelmapContextMenu.js +0 -0
  142. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/popover/index.js +0 -0
  143. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/searchResultsView.js +0 -0
  144. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/views/utils.js +0 -0
  145. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/vue/components/ColorPickerInput.vue +0 -0
  146. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/vue/components/EditHeatmapOrGridData.vue +0 -0
  147. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/vue/components/EditHeatmapOrGridDataContainer.vue +0 -0
  148. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/web_client/webpack.helper.js +0 -0
  149. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui/webroot.mako +0 -0
  150. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui.egg-info/dependency_links.txt +0 -0
  151. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui.egg-info/entry_points.txt +0 -0
  152. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui.egg-info/not-zip-safe +0 -0
  153. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui.egg-info/requires.txt +0 -0
  154. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/histomicsui.egg-info/top_level.txt +0 -0
  155. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/pyproject.toml +0 -0
  156. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/requirements-dev.txt +0 -0
  157. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/ruff.toml +0 -0
  158. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/setup.cfg +0 -0
  159. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/setup.py +0 -0
  160. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/__init__.py +0 -0
  161. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/datastore.py +0 -0
  162. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/girder_utilities.py +0 -0
  163. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/test_files/.histomicsui_config.yaml +0 -0
  164. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/test_files/sample.anot +0 -0
  165. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/test_files/sample.meta +0 -0
  166. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/test_files/sample_girder_id.anot +0 -0
  167. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/test_files/test_analysis_detection.xml +0 -0
  168. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/test_files/test_analysis_features.xml +0 -0
  169. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/test_handlers.py +0 -0
  170. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/test_hui_rest.py +0 -0
  171. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/test_image_browse_endpoints.py +0 -0
  172. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/test_load.py +0 -0
  173. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/test_tcga.py +0 -0
  174. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/test_web_client.py +0 -0
  175. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/web_client_specs/.eslintrc +0 -0
  176. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/web_client_specs/analysisSpec.js +0 -0
  177. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/web_client_specs/annotationSpec.js +0 -0
  178. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/web_client_specs/girderUISpec.js +0 -0
  179. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/web_client_specs/huiSpec.js +0 -0
  180. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/web_client_specs/huiTest.js +0 -0
  181. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/web_client_specs/itemSpec.js +0 -0
  182. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/web_client_specs/metadataPanelSpec.js +0 -0
  183. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/web_client_specs/metadataPlotSpec.js +0 -0
  184. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/web_client_specs/overviewPanelSpec.js +0 -0
  185. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/web_client_specs/panelLayoutSpec.js +0 -0
  186. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tests/web_client_specs/pixelmapCategorySpec.js +0 -0
  187. {histomicsui-1.7.3.dev14 → histomicsui-1.7.3.dev38}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: histomicsui
3
- Version: 1.7.3.dev14
3
+ Version: 1.7.3.dev38
4
4
  Summary: Organize, visualize, and analyze histology images.
5
5
  Home-page: https://github.com/DigitalSlideArchive/histomicsui
6
6
  Author: Kitware, Inc.
@@ -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')) {
@@ -53,12 +53,27 @@
53
53
  border-width 0
54
54
  white-space nowrap
55
55
  overflow hidden
56
+ display flex
57
+ gap 6px
56
58
 
57
59
  i
58
60
  margin-right 2px
59
61
  float left
60
62
  color #6b6b6b
61
63
 
64
+ .h-annotation-group-text
65
+ flex 1 1 auto
66
+ overflow hidden
67
+ white-space nowrap
68
+ min-width 0
69
+
70
+ .h-annotation-group-legend
71
+ width 18px
72
+ height 18px
73
+ border solid #0000
74
+ backrground #0000
75
+ flex-shrink 0
76
+
62
77
  &:hover
63
78
  background-color #eee
64
79
  cursor pointer
@@ -53,27 +53,49 @@
53
53
  border-width 1px 0
54
54
  border-style solid
55
55
  border-color #bababa
56
- padding 5px 4px 0 3px
57
- margin 5px 5px 0
58
- width fit-content
59
- max-width calc(100% - 10px)
56
+ padding 5px 0 0
57
+ margin 0
58
+ display flex
59
+ flex-direction row
60
60
 
61
61
  .h-group-count-label
62
- display inline-block
63
62
  vertical-align top
63
+ flex-shrink 0
64
64
 
65
65
  .h-group-count-options
66
- display inline-block
67
66
  padding-left 5px
68
- max-width 200px
67
+ flex-shrink 1
68
+ flex-grow 1
69
+ display flex
70
+ flex-direction column
71
+ overflow hidden
69
72
 
70
73
  .h-group-count-option
71
74
  white-space nowrap
72
75
  overflow hidden
73
76
  text-overflow ellipsis
74
-
75
- .h-group-count-select
76
- padding-left 10px
77
+ flex-shrink 1
78
+ display flex
79
+
80
+ .h-group-count-value
81
+ flex-shrink 1
82
+ text-overflow ellipsis
83
+ overflow hidden
84
+ min-width 0
85
+
86
+ .h-group-count-legend
87
+ width 16px
88
+ height 16px
89
+ vertical-align middle
90
+ flex-shrink 0
91
+ padding-left 4px
92
+ border solid #0000
93
+ margin-top 2px
94
+ margin-left auto
95
+
96
+ .h-group-count-select
97
+ flex-shrink 0
98
+ padding-left 6px
77
99
 
78
100
  .btn-default.active
79
101
  background-color #5790ff
@@ -91,6 +91,7 @@ mixin functional(name, key, title, color)
91
91
  = ' '
92
92
  i.icon-angle-circled-down
93
93
  | Global Version: #{model.get('_version')}
94
+ .vue-component-annotation-history
94
95
  .hui-annotation-metadata.hui-annotation-metadata-dialog
95
96
  if showStyleEditor
96
97
  hr
@@ -24,16 +24,40 @@ block content
24
24
  - var groups = _.keys(annotationGroups);
25
25
  - groups.sort();
26
26
  each groupName in groups
27
- - var annotations = annotationGroups[groupName];
28
- - var expanded = expandedGroups.has(groupName);
29
- - var expandedClass = expanded ? 'h-group-expanded' : 'h-group-collapsed';
27
+ -
28
+ var annotations = annotationGroups[groupName];
29
+ var expanded = expandedGroups.has(groupName);
30
+ var expandedClass = expanded ? 'h-group-expanded' : 'h-group-collapsed';
31
+ var samplestyle={};
32
+ annotations.some((a) => {
33
+ var elems = (a.get('annotation') || {}).elements;
34
+ if (!elems) {
35
+ return false;
36
+ }
37
+ return elems.some((e) => {
38
+ if (e.group === groupName) {
39
+ if (e.fillColor) {
40
+ samplestyle.background = e.fillColor;
41
+ }
42
+ if (e.lineColor) {
43
+ samplestyle['border-color'] = e.lineColor;
44
+ }
45
+ if (e.lineWidth) {
46
+ samplestyle['border-width'] = e.lineWidth + 'px';
47
+ }
48
+ return samplestyle.background && samplestyle['border-color'] && samplestyle['border-width'];
49
+ }
50
+ });
51
+ })
30
52
  .h-annotation-group(class=[expandedClass], data-group-name=groupName)
31
- .h-annotation-group-name.clearfix
53
+ .h-annotation-group-name
32
54
  if expanded
33
55
  i.icon-folder-open
34
56
  else
35
57
  i.icon-folder
36
- = groupName
58
+ .h-annotation-group-text
59
+ = groupName
60
+ span.h-annotation-group-legend(style=samplestyle)
37
61
  if expanded
38
62
  each annotation in annotations
39
63
  - var name = annotation.get('annotation').name;
@@ -1,13 +1,18 @@
1
- - var counts = {};
2
- - var displayIdOffset = 0;
3
- - var pixelmap = false;
4
- - var typeCounts = {};
1
+ -
2
+ var counts = {};
3
+ var displayIdOffset = 0;
4
+ var pixelmap = false;
5
+ var typeCounts = {};
6
+ var groupStyles = {};
5
7
  if elements.length
6
8
  each element in elements
7
9
  -
8
10
  var classes = highlighted[element.id] ? ['h-highlight-element'] : [];
9
11
  element = element.toJSON();
10
12
  var groupName = element['group'] ? element['group'] : defaultGroup;
13
+ if (!groupStyles[groupName]) {
14
+ groupStyles[groupName] = {};
15
+ }
11
16
  var type = element.type === 'polyline' ? (element.closed ? 'polygon' : 'line') : element.type;
12
17
  var displayId = ++displayIdOffset + displayIdStart;
13
18
  var label = ((element.label || {}).value || type);
@@ -36,6 +41,15 @@ if elements.length
36
41
  if (element.type === 'pixelmap') {
37
42
  pixelmap = true;
38
43
  }
44
+ if (!groupStyles[groupName]['background-color'] && element['fillColor']) {
45
+ groupStyles[groupName]['background-color'] = element['fillColor'];
46
+ }
47
+ if (!groupStyles[groupName]['border-color'] && element['lineColor']) {
48
+ groupStyles[groupName]['border-color'] = element['lineColor'];
49
+ }
50
+ if (!groupStyles[groupName]['border-width'] && element['lineWidth']) {
51
+ groupStyles[groupName]['border-width'] = element['lineWidth'] + 'px';
52
+ }
39
53
  .h-element(data-id=element.id, class=classes)
40
54
  span.icon-cog.h-edit-element(title='Change style')
41
55
  span.h-element-label(title=label, display_id=displayId) #{label}
@@ -58,6 +72,7 @@ if firstRender
58
72
  .h-group-count-option(data-group=group[0], data-count=group[1])
59
73
  span.h-group-count-value #{group[1]} #{group[0]}
60
74
  span.icon-marquee.h-group-count-select(title="Select all elements in this group")
75
+ span.h-group-count-legend(style=groupStyles[group[0]])
61
76
  else
62
77
  - for (let group in counts)
63
78
  - updateCount(group, counts[group]);
@@ -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>
@@ -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.dev14
3
+ Version: 1.7.3.dev38
4
4
  Summary: Organize, visualize, and analyze histology images.
5
5
  Home-page: https://github.com/DigitalSlideArchive/histomicsui
6
6
  Author: Kitware, Inc.
@@ -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