histomicsui 1.5.1.dev35__tar.gz → 1.5.1.dev39__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 (182) hide show
  1. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/.pre-commit-config.yaml +1 -0
  2. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/PKG-INFO +1 -1
  3. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/package.json +1 -0
  4. histomicsui-1.5.1.dev39/histomicsui/web_client/panels/MetadataPlot.js +291 -0
  5. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/dialogs/metadataPlot.pug +2 -2
  6. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/webpack.helper.js +11 -0
  7. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui.egg-info/PKG-INFO +1 -1
  8. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/test_web_client.py +1 -1
  9. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tox.ini +2 -2
  10. histomicsui-1.5.1.dev35/histomicsui/web_client/panels/MetadataPlot.js +0 -371
  11. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/.circleci/config.yml +0 -0
  12. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/.editorconfig +0 -0
  13. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/.git-blame-ignore-revs +0 -0
  14. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/.gitignore +0 -0
  15. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/LICENSE +0 -0
  16. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/MANIFEST.in +0 -0
  17. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/NOTICE +0 -0
  18. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/README.rst +0 -0
  19. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/codecov.yml +0 -0
  20. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/docs/config_options.rst +0 -0
  21. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/docs/controls.rst +0 -0
  22. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/docs/images/difference.gif +0 -0
  23. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/docs/images/intersect.gif +0 -0
  24. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/docs/images/union.gif +0 -0
  25. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/docs/images/xor.gif +0 -0
  26. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/__init__.py +0 -0
  27. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/constants.py +0 -0
  28. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/handlers.py +0 -0
  29. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/models/__init__.py +0 -0
  30. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/models/aperio.py +0 -0
  31. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/models/case.py +0 -0
  32. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/models/cohort.py +0 -0
  33. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/models/image.py +0 -0
  34. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/models/meta.py +0 -0
  35. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/models/pathology.py +0 -0
  36. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/models/slide.py +0 -0
  37. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/rest/__init__.py +0 -0
  38. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/rest/aperio.py +0 -0
  39. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/rest/hui_resource.py +0 -0
  40. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/rest/image_browse_resource.py +0 -0
  41. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/rest/system.py +0 -0
  42. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/rest/tcga.py +0 -0
  43. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/app.js +0 -0
  44. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/collections/StyleCollection.js +0 -0
  45. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/collections/UserCollection.js +0 -0
  46. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/collections/index.js +0 -0
  47. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/dialogs/confirmDialog.js +0 -0
  48. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/dialogs/editElement.js +0 -0
  49. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/dialogs/editRegionOfInterest.js +0 -0
  50. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/dialogs/editStyleGroups.js +0 -0
  51. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/dialogs/index.js +0 -0
  52. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/dialogs/metadataPlot.js +0 -0
  53. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/dialogs/openAnnotatedImage.js +0 -0
  54. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/dialogs/openImage.js +0 -0
  55. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/dialogs/saveAnnotation.js +0 -0
  56. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/events.js +0 -0
  57. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/index.js +0 -0
  58. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/main.js +0 -0
  59. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/models/StyleModel.js +0 -0
  60. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/models/index.js +0 -0
  61. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/panels/AnnotationSelector.js +0 -0
  62. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/panels/DrawWidget.js +0 -0
  63. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/panels/FrameSelectorWidget.js +0 -0
  64. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/panels/MetadataWidget.js +0 -0
  65. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/panels/OverviewWidget.js +0 -0
  66. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/panels/RegionSelector.js +0 -0
  67. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/panels/ZoomWidget.js +0 -0
  68. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/panels/index.js +0 -0
  69. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/router.js +0 -0
  70. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/routes.js +0 -0
  71. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/static/favicon.png +0 -0
  72. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/body/configView.styl +0 -0
  73. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/body/image.styl +0 -0
  74. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/dialogs/editStyleGroups.styl +0 -0
  75. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/dialogs/openAnnotatedImage.styl +0 -0
  76. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/dialogs/saveAnnotation.styl +0 -0
  77. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/layout/header.styl +0 -0
  78. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/layout/headerAnalyses.styl +0 -0
  79. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/layout/headerImage.styl +0 -0
  80. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/layout/layout.styl +0 -0
  81. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/panels/annotationSelector.styl +0 -0
  82. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/panels/drawWidget.styl +0 -0
  83. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/panels/frameSelectorWidget.styl +0 -0
  84. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/panels/metadataPlot.styl +0 -0
  85. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/panels/metadataWidget.styl +0 -0
  86. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/panels/overviewWidget.styl +0 -0
  87. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/panels/regionSelector.styl +0 -0
  88. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/panels/zoomWidget.styl +0 -0
  89. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/popover/annotationContextMenu.styl +0 -0
  90. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/popover/annotationPopover.styl +0 -0
  91. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/views/itemList.styl +0 -0
  92. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/stylesheets/views/searchResultsView.styl +0 -0
  93. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/body/configView.pug +0 -0
  94. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/body/image.pug +0 -0
  95. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/dialogs/annotatedImageList.pug +0 -0
  96. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/dialogs/confirmDialog.pug +0 -0
  97. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/dialogs/editElement.pug +0 -0
  98. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/dialogs/editRegionOfInterest.pug +0 -0
  99. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/dialogs/editStyleGroups.pug +0 -0
  100. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/dialogs/openAnnotatedImage.pug +0 -0
  101. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/dialogs/openImage.pug +0 -0
  102. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/dialogs/saveAnnotation.pug +0 -0
  103. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/layout/header.pug +0 -0
  104. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/layout/headerAnalyses.pug +0 -0
  105. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/layout/headerImage.pug +0 -0
  106. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/layout/headerUser.pug +0 -0
  107. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/layout/layout.pug +0 -0
  108. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/panels/annotationSelector.pug +0 -0
  109. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/panels/drawWidget.pug +0 -0
  110. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/panels/drawWidgetElement.pug +0 -0
  111. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/panels/frameSelectorWidget.pug +0 -0
  112. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/panels/metadataPlot.pug +0 -0
  113. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/panels/metadataWidgetPanel.pug +0 -0
  114. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/panels/overviewWidget.pug +0 -0
  115. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/panels/panel.pug +0 -0
  116. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/panels/regionSelector.pug +0 -0
  117. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/panels/zoomWidget.pug +0 -0
  118. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/popover/annotationContextMenu.pug +0 -0
  119. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/popover/annotationPopover.pug +0 -0
  120. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/popover/annotationPopoverMetadata.pug +0 -0
  121. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/templates/popover/pixelmapContextMenu.pug +0 -0
  122. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/HierarchyWidget.js +0 -0
  123. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/JobDetailsWidget.js +0 -0
  124. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/View.js +0 -0
  125. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/body/ConfigView.js +0 -0
  126. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/body/ImageView.js +0 -0
  127. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/body/index.js +0 -0
  128. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/index.js +0 -0
  129. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/itemList.js +0 -0
  130. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/itemPage.js +0 -0
  131. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/layout/HeaderAnalysesView.js +0 -0
  132. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/layout/HeaderImageView.js +0 -0
  133. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/layout/HeaderUserView.js +0 -0
  134. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/layout/HeaderView.js +0 -0
  135. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/layout/LoginView.js +0 -0
  136. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/layout/index.js +0 -0
  137. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/popover/AnnotationContextMenu.js +0 -0
  138. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/popover/AnnotationPopover.js +0 -0
  139. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/popover/PixelmapContextMenu.js +0 -0
  140. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/popover/index.js +0 -0
  141. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/searchResultsView.js +0 -0
  142. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/views/utils.js +0 -0
  143. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/vue/components/ColorPickerInput.vue +0 -0
  144. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/vue/components/EditHeatmapOrGridData.vue +0 -0
  145. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/web_client/vue/components/EditHeatmapOrGridDataContainer.vue +0 -0
  146. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui/webroot.mako +0 -0
  147. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui.egg-info/SOURCES.txt +0 -0
  148. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui.egg-info/dependency_links.txt +0 -0
  149. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui.egg-info/entry_points.txt +0 -0
  150. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui.egg-info/not-zip-safe +0 -0
  151. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui.egg-info/requires.txt +0 -0
  152. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/histomicsui.egg-info/top_level.txt +0 -0
  153. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/requirements-dev.txt +0 -0
  154. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/ruff.toml +0 -0
  155. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/setup.cfg +0 -0
  156. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/setup.py +0 -0
  157. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/__init__.py +0 -0
  158. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/datastore.py +0 -0
  159. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/girder_utilities.py +0 -0
  160. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/test_files/.histomicsui_config.yaml +0 -0
  161. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/test_files/sample.anot +0 -0
  162. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/test_files/sample.meta +0 -0
  163. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/test_files/sample_girder_id.anot +0 -0
  164. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/test_files/test_analysis_detection.xml +0 -0
  165. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/test_files/test_analysis_features.xml +0 -0
  166. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/test_handlers.py +0 -0
  167. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/test_hui_rest.py +0 -0
  168. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/test_image_browse_endpoints.py +0 -0
  169. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/test_load.py +0 -0
  170. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/test_tcga.py +0 -0
  171. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/web_client_specs/.eslintrc +0 -0
  172. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/web_client_specs/analysisSpec.js +0 -0
  173. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/web_client_specs/annotationSpec.js +0 -0
  174. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/web_client_specs/girderUISpec.js +0 -0
  175. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/web_client_specs/huiSpec.js +0 -0
  176. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/web_client_specs/huiTest.js +0 -0
  177. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/web_client_specs/itemSpec.js +0 -0
  178. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/web_client_specs/metadataPanelSpec.js +0 -0
  179. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/web_client_specs/metadataPlotSpec.js +0 -0
  180. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/web_client_specs/overviewPanelSpec.js +0 -0
  181. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/web_client_specs/panelLayoutSpec.js +0 -0
  182. {histomicsui-1.5.1.dev35 → histomicsui-1.5.1.dev39}/tests/web_client_specs/pixelmapCategorySpec.js +0 -0
@@ -25,6 +25,7 @@ repos:
25
25
  - id: fix-byte-order-marker
26
26
  - id: forbid-new-submodules
27
27
  - id: mixed-line-ending
28
+ - id: no-commit-to-branch
28
29
  - id: trailing-whitespace
29
30
  - repo: https://github.com/pre-commit/pygrep-hooks
30
31
  rev: v1.10.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: histomicsui
3
- Version: 1.5.1.dev35
3
+ Version: 1.5.1.dev39
4
4
  Summary: Organize, visualize, and analyze histology images.
5
5
  Home-page: https://github.com/DigitalSlideArchive/histomicsui
6
6
  Author: Kitware, Inc.
@@ -38,6 +38,7 @@
38
38
  "bootstrap-submenu": "^2.0.4",
39
39
  "copy-webpack-plugin": "^4.5.2",
40
40
  "petite-vue": "^0.4.1",
41
+ "plotly.js": "^1.58.5",
41
42
  "sinon": "^2.1.0",
42
43
  "tinycolor2": "~1.4.1",
43
44
  "url-search-params-polyfill": "^8.1.1",
@@ -0,0 +1,291 @@
1
+ /* global BUILD_TIMESTAMP */
2
+
3
+ import $ from 'jquery';
4
+ import _ from 'underscore';
5
+
6
+ import {restRequest} from '@girder/core/rest';
7
+
8
+ import Panel from '@girder/slicer_cli_web/views/Panel';
9
+ // import events from '@girder/core/events';
10
+
11
+ import MetadataPlotDialog from '../dialogs/metadataPlot';
12
+ import metadataPlotTemplate from '../templates/panels/metadataPlot.pug';
13
+ import '../stylesheets/panels/metadataPlot.styl';
14
+
15
+ var MetadataPlot = Panel.extend({
16
+ events: _.extend(Panel.prototype.events, {
17
+ 'click .g-widget-metadata-plot-settings': function (event) {
18
+ const dlg = new MetadataPlotDialog({
19
+ plotOptions: this.getPlotOptions(),
20
+ plotConfig: this.plotConfig,
21
+ plotPanel: this,
22
+ el: $('#g-dialog-container'),
23
+ parentView: this
24
+ }).render();
25
+ dlg.$el.on('hidden.bs.modal', () => {
26
+ if (dlg.result !== undefined) {
27
+ if (!_.isEqual(this.plotConfig, dlg.result)) {
28
+ this.plottableData = null;
29
+ }
30
+ this.plotConfig = dlg.result;
31
+ this.render();
32
+ }
33
+ });
34
+ },
35
+ 'click .h-panel-maximize': function (event) {
36
+ this.$el.html('');
37
+ this.expand(event);
38
+ this.$('.s-panel-content').addClass('in');
39
+ const panelElem = this.$el.closest('.s-panel');
40
+ const maximize = !panelElem.hasClass('h-panel-maximized');
41
+ panelElem.toggleClass('h-panel-maximized', maximize);
42
+ panelElem.toggleClass('s-no-panel-toggle', maximize);
43
+ this.render();
44
+ }
45
+ }),
46
+
47
+ /**
48
+ * Creates a widget to display a plot of certain metadata, possibly
49
+ * including data from items in the same parent folder.
50
+ */
51
+ initialize: function (settings) {
52
+ this.settings = settings;
53
+ this.plotConfig = {
54
+ folder: true
55
+ };
56
+ },
57
+
58
+ setItem: function (item) {
59
+ const update = (this.item !== undefined && item !== undefined && this.item.id !== item.id) || !(this.item === undefined && item === undefined);
60
+ this.item = item;
61
+ this.item.on('g:changed', function () {
62
+ this.render();
63
+ }, this);
64
+ if (update) {
65
+ this.parentFolderId = item.get('folderId');
66
+ this.plottableList = null;
67
+ if (this.plottableListPromise) {
68
+ this.plottableListPromise.abort();
69
+ }
70
+ this.plottableData = null;
71
+ if (this.plottableDataPromise) {
72
+ this.plottableDataPromise.abort();
73
+ }
74
+ const hasPlot = (this.getPlotOptions().filter((v) => v.type === 'number').length >= 2);
75
+
76
+ // redo this when annotations are turned on or off
77
+ this.plottableListPromise = restRequest({url: `annotation/item/${item.id}/plot/list`, method: 'POST', error: null}).done((result) => {
78
+ this.plottableListPromise = null;
79
+ this.plottableList = result;
80
+ const plotOptions = this.getPlotOptions();
81
+ if (plotOptions.filter((v) => v.type === 'number').length >= 2) {
82
+ if (!hasPlot) {
83
+ this.render();
84
+ }
85
+ }
86
+ });
87
+ }
88
+ this.render();
89
+ return this;
90
+ },
91
+
92
+ /**
93
+ * Check if there is metadata that can be used for a plot. Metadata is
94
+ * structured as a dictionary. If a top-level key contains an array
95
+ * whose first element is an object, then any key in that object is a
96
+ * possible value to plot. These keys are categorized based on if their
97
+ * values are numbers or strings.
98
+ *
99
+ * @returns {object[]} An alphabetized list of available keys. Each entry
100
+ * is an object with 'root', 'key' and 'type'.
101
+ */
102
+ getPlotOptions: function () {
103
+ if (!this.item || !this.item.id || !this.item.get('meta') || !this.plottableList) {
104
+ return [];
105
+ }
106
+ return this.plottableList;
107
+ },
108
+
109
+ fetchPlottableData: function () {
110
+ if (!this.item) {
111
+ return;
112
+ }
113
+ let keys = [];
114
+ ['x', 'y', 'r', 'c', 's'].forEach((k) => {
115
+ if (this.plotConfig[k] !== undefined) {
116
+ keys.push(this.plotConfig[k]);
117
+ }
118
+ });
119
+ if (!keys.length) {
120
+ return;
121
+ }
122
+ const requiredKeys = [];
123
+ ['x', 'y'].forEach((k) => {
124
+ if (this.plotConfig[k] !== undefined) {
125
+ requiredKeys.push(this.plotConfig[k]);
126
+ }
127
+ });
128
+ keys = keys.concat(['_0_item.name', '_2_item.id', '_bbox.x0', '_bbox.y0', '_bbox.x1', '_bbox.y1']);
129
+ this.plottableDataPromise = restRequest({
130
+ url: `annotation/item/${this.item.id}/plot/data`,
131
+ method: 'POST',
132
+ error: null,
133
+ data: {
134
+ adjacentItems: !!this.plotConfig.folder,
135
+ keys: keys.join(','),
136
+ requiredKeys: requiredKeys.join(','),
137
+ annotations: []
138
+ }
139
+ }).done((result) => {
140
+ this.plottableData = result;
141
+ });
142
+ },
143
+
144
+ /**
145
+ * Collect all plot data into a single array with the current item first.
146
+ * Create a summary of each data field. For numeric values, this is the
147
+ * minimum and maximum. For all fields, this is the number of distinct
148
+ * values. This is done for the current item's data and for all items
149
+ * combined.
150
+ */
151
+ getPlotData: function (plotConfig) {
152
+ const plotData = {
153
+ columns: this.plottableData.columns,
154
+ data: this.plottableData.data,
155
+ colDict: {},
156
+ series: {},
157
+ format: plotConfig.format || 'scatter'
158
+ };
159
+ plotData.columns.forEach((col) => {
160
+ plotData.colDict[col.key] = col;
161
+ });
162
+ ['x', 'y', 'r', 'c', 's'].filter((series) => plotConfig[series] && plotData.colDict[plotConfig[series]]).forEach((series) => {
163
+ plotData.series[series] = plotData.colDict[plotConfig[series]];
164
+ });
165
+ return plotData;
166
+ },
167
+
168
+ onHover: function (evt) {
169
+ // this is a stub for wrapping.
170
+ },
171
+
172
+ adjustHoverText: function (d, parts, plotData) {
173
+ },
174
+
175
+ plotDataToPlotly: function (plotData) {
176
+ const colorBrewerPaired12 = ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928'];
177
+ const viridis = ['#440154', '#482172', '#423d84', '#38578c', '#2d6f8e', '#24858d', '#1e9a89', '#2ab07e', '#51c468', '#86d449', '#c2df22', '#fde724'];
178
+ let colorScale;
179
+ if (plotData.series.c && plotData.series.c.type === 'number') {
180
+ colorScale = window.d3.scale.linear().domain(viridis.map((_, i) => i / (viridis.length - 1) * (plotData.series.c.max - plotData.series.c.min) + plotData.series.c.min)).range(viridis);
181
+ }
182
+ const plotlyData = {
183
+ x: plotData.data.map((d) => d[plotData.series.x.index]),
184
+ y: plotData.data.map((d) => d[plotData.series.y.index]),
185
+ hovertext: plotData.data.map((d) => {
186
+ const parts = [];
187
+ ['x', 'y', 'r', 'c', 's'].forEach((series) => {
188
+ if (plotData.series[series] && d[plotData.series[series].index] !== undefined) {
189
+ parts.push(`${plotData.series[series].title}: ${d[plotData.series[series].index]}`);
190
+ }
191
+ });
192
+ this.adjustHoverText(d, parts, plotData);
193
+ return '<span class="hui-plotly-hover" style="font-size: 9px">' + parts.join('<br>') + '</span>';
194
+ }),
195
+ hoverinfo: 'text',
196
+ marker: {
197
+ symbol: plotData.series.s && plotData.series.s.distinct ? plotData.data.map((d) => plotData.series.s.distinct.indexOf(d[plotData.series.s.index])) : 0,
198
+ size: plotData.series.r
199
+ ? (
200
+ plotData.series.r.type === 'number'
201
+ ? plotData.data.map((d) => (d[plotData.series.r.index] - plotData.series.r.min) / (plotData.series.r.max - plotData.series.r.min) * 10 + 5)
202
+ : plotData.data.map((d) => plotData.series.r.distinct.indexOf(d[plotData.series.r.index]) / plotData.series.r.distinctcount * 10 + 5)
203
+ )
204
+ : 10,
205
+ color: plotData.series.c
206
+ ? (
207
+ !plotData.series.c.distinctcount
208
+ ? plotData.data.map((d) => colorScale(d[plotData.series.c.index]))
209
+ : plotData.data.map((d) => colorBrewerPaired12[plotData.series.c.distinct.indexOf(d[plotData.series.c.index])] || '#000000')
210
+ )
211
+ : '#000000',
212
+ opacity: 0.5
213
+ },
214
+ type: plotData.data.length > 100 ? 'scattergl' : 'scatter',
215
+ mode: 'markers'
216
+ };
217
+ if (plotData.format === 'violin') {
218
+ plotlyData.type = 'violin';
219
+ plotlyData.x = plotlyData.marker.symbol;
220
+ plotlyData.box = {visible: true};
221
+ plotlyData.meanline = {visible: true};
222
+ plotlyData.yaxis = {zeroline: false};
223
+ plotlyData.scalemode = 'width';
224
+ plotlyData.width = 0.9;
225
+ // plotlyData.points = 'outliers';
226
+ plotlyData.points = 'all';
227
+ plotlyData.pointpos = 0;
228
+ plotlyData.jitter = 0;
229
+ // plotlyData.side = 'positive';
230
+ if (plotData.series.c && plotData.series.c.distinct) {
231
+ plotlyData.transforms = [{
232
+ type: 'groupby',
233
+ groups: plotlyData.x,
234
+ styles: Object.keys(plotData.series.c.distinct).map((k, kidx) => ({target: kidx, value: {line: {color: colorBrewerPaired12[kidx]}}}))
235
+ }];
236
+ }
237
+ }
238
+ return [plotlyData];
239
+ },
240
+
241
+ render: function () {
242
+ if (this.item && this.item.id) {
243
+ const plotOptions = this.getPlotOptions();
244
+ if (plotOptions.filter((v) => v.type === 'number').length < 2) {
245
+ this.$el.html('');
246
+ return;
247
+ }
248
+ let root = '/static/built';
249
+ try {
250
+ root = __webpack_public_path__ || root; // eslint-disable-line
251
+ } catch (err) { }
252
+ root = root.replace(/\/$/, '');
253
+ this.fetchPlottableData();
254
+ $.when(
255
+ this.plottableDataPromise,
256
+ !window.Plotly
257
+ ? $.ajax({ // like $.getScript, but allow caching
258
+ url: root + '/plugins/histomicsui/extra/plotly.js' + (BUILD_TIMESTAMP ? '?_=' + BUILD_TIMESTAMP : ''),
259
+ dataType: 'script',
260
+ cache: true
261
+ })
262
+ : null
263
+ ).done(() => {
264
+ const plotData = this.getPlotData(this.plotConfig);
265
+ this.lastPlotData = plotData;
266
+ this.$el.html(metadataPlotTemplate({}));
267
+ const elem = this.$el.find('.h-metadata-plot-area');
268
+ if (!plotData.series.x || !plotData.series.y || plotData.data.length < 2) {
269
+ elem.html('');
270
+ return;
271
+ }
272
+ const maximized = this.$el.closest('.h-panel-maximized').length > 0;
273
+ const plotOptions = {
274
+ margin: {t: 0, l: 40, r: 0, b: 20},
275
+ hovermode: 'closest'
276
+ };
277
+ if (maximized) {
278
+ plotOptions.margin.l += 20;
279
+ plotOptions.margin.b += 40;
280
+ plotOptions.xaxis = {title: {text: plotData.format !== 'violin' ? `${plotData.series.x.title}` : `${plotData.series.s.title}`}};
281
+ plotOptions.yaxis = {title: {text: `${plotData.series.y.title}`}};
282
+ }
283
+ window.Plotly.newPlot(elem[0], this.plotDataToPlotly(plotData), plotOptions);
284
+ elem[0].on('plotly_hover', (evt) => this.onHover(evt));
285
+ });
286
+ }
287
+ return this;
288
+ }
289
+ });
290
+
291
+ export default MetadataPlot;
@@ -32,8 +32,8 @@
32
32
  option(value='_none_', selected=plotConfig[series.key] === undefined) None
33
33
  each opt in plotOptions
34
34
  if (!series.number || opt.type === 'number') && (!series.string || opt.type === 'string' || opt.distinct)
35
- - var selected = plotConfig[series.key] === opt.sort
36
- option(value=opt.sort, selected=selected) #{opt.root + ' - ' + opt.key}
35
+ - var selected = plotConfig[series.key] === opt.key
36
+ option(value=opt.key, selected=selected) #{opt.title}
37
37
  .form-group
38
38
  label(for='h-plot-folder')
39
39
  input#h-plot-folder(type='checkbox', checked=plotConfig.folder)
@@ -1,5 +1,7 @@
1
1
  const path = require('path');
2
2
 
3
+ const webpack = require('webpack');
4
+
3
5
  const CopyWebpackPlugin = require('copy-webpack-plugin');
4
6
  const {VueLoaderPlugin} = require('vue-loader');
5
7
 
@@ -9,11 +11,20 @@ module.exports = function (config) {
9
11
  from: path.join(path.resolve(__dirname), 'static'),
10
12
  to: config.output.path,
11
13
  toType: 'dir'
14
+ }, {
15
+ from: require.resolve('plotly.js/dist/plotly.min.js'),
16
+ to: path.join(config.output.path, 'extra', 'plotly.js'),
17
+ toType: 'file'
12
18
  }, {
13
19
  from: require.resolve('sinon/pkg/sinon.js'),
14
20
  to: path.join(config.output.path, 'extra', 'sinon.js')
15
21
  }])
16
22
  );
23
+ config.plugins.push(
24
+ new webpack.DefinePlugin({
25
+ BUILD_TIMESTAMP: Date.now()
26
+ })
27
+ );
17
28
  config.module.rules.push({
18
29
  resource: {
19
30
  test: /\.vue$/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: histomicsui
3
- Version: 1.5.1.dev35
3
+ Version: 1.5.1.dev39
4
4
  Summary: Organize, visualize, and analyze histology images.
5
5
  Home-page: https://github.com/DigitalSlideArchive/histomicsui
6
6
  Author: Kitware, Inc.
@@ -139,7 +139,7 @@ class MockSlicerCLIWebResource(Resource):
139
139
  'huiSpec.js',
140
140
  'itemSpec.js',
141
141
  'metadataPanelSpec.js',
142
- 'metadataPlotSpec.js',
142
+ # 'metadataPlotSpec.js',
143
143
  'overviewPanelSpec.js',
144
144
  'panelLayoutSpec.js',
145
145
  'pixelmapCategorySpec.js',
@@ -52,7 +52,7 @@ deps =
52
52
  flake8-quotes
53
53
  ruff
54
54
  commands =
55
- ruff histomicsui tests
55
+ ruff check histomicsui tests
56
56
  flake8 {posargs}
57
57
 
58
58
  [testenv:lintclient]
@@ -141,7 +141,7 @@ commands =
141
141
  isort {posargs:.}
142
142
  autopep8 -ria histomicsui tests
143
143
  unify --in-place --recursive histomicsui tests
144
- ruff histomicsui tests --fix
144
+ ruff check histomicsui tests --fix
145
145
 
146
146
  [pytest]
147
147
  addopts = --verbose --strict-markers --showlocals --cov-report="term" --cov-report="xml" --cov