@jbrowse/plugin-variants 3.2.0 → 3.4.0

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 (239) hide show
  1. package/dist/LinearVariantDisplay/model.d.ts +1 -1
  2. package/dist/MultiLinearVariantDisplay/components/VariantDisplayComponent.js +3 -3
  3. package/dist/MultiLinearVariantDisplay/index.js +1 -1
  4. package/dist/MultiLinearVariantDisplay/model.d.ts +40 -4
  5. package/dist/MultiLinearVariantDisplay/model.js +0 -1
  6. package/dist/MultiLinearVariantDisplay/renderSvg.js +2 -2
  7. package/dist/MultiLinearVariantMatrixDisplay/components/LinesConnectingMatrixToGenomicPosition.js +15 -5
  8. package/dist/MultiLinearVariantMatrixDisplay/components/VariantDisplayComponent.js +3 -3
  9. package/dist/MultiLinearVariantMatrixDisplay/index.js +1 -1
  10. package/dist/MultiLinearVariantMatrixDisplay/model.d.ts +40 -3
  11. package/dist/MultiLinearVariantMatrixDisplay/model.js +1 -0
  12. package/dist/MultiLinearVariantMatrixDisplay/renderSvg.js +2 -2
  13. package/dist/MultiLinearVariantMatrixRenderer/{LinearVariantMatrixRenderer.d.ts → MultiLinearVariantMatrixRenderer.d.ts} +14 -11
  14. package/dist/MultiLinearVariantMatrixRenderer/{LinearVariantMatrixRenderer.js → MultiLinearVariantMatrixRenderer.js} +3 -3
  15. package/dist/MultiLinearVariantMatrixRenderer/components/MultiLinearVariantMatrixRendering.d.ts +8 -0
  16. package/dist/MultiLinearVariantMatrixRenderer/components/MultiLinearVariantMatrixRendering.js +41 -0
  17. package/dist/MultiLinearVariantMatrixRenderer/index.js +4 -4
  18. package/dist/MultiLinearVariantMatrixRenderer/makeImageData.d.ts +3 -3
  19. package/dist/MultiLinearVariantMatrixRenderer/makeImageData.js +71 -17
  20. package/dist/MultiLinearVariantMatrixRenderer/types.d.ts +2 -4
  21. package/dist/MultiLinearVariantRenderer/MultiVariantRenderer.d.ts +34 -5
  22. package/dist/MultiLinearVariantRenderer/MultiVariantRenderer.js +13 -7
  23. package/dist/MultiLinearVariantRenderer/components/{MultiVariantRendering.d.ts → MultiLinearVariantRendering.d.ts} +10 -4
  24. package/dist/MultiLinearVariantRenderer/{MultiVariantRendering.js → components/MultiLinearVariantRendering.js} +25 -7
  25. package/dist/MultiLinearVariantRenderer/components/util.d.ts +1 -0
  26. package/dist/MultiLinearVariantRenderer/components/util.js +15 -0
  27. package/dist/MultiLinearVariantRenderer/index.js +2 -2
  28. package/dist/MultiLinearVariantRenderer/makeImageData.d.ts +9 -0
  29. package/dist/MultiLinearVariantRenderer/makeImageData.js +104 -41
  30. package/dist/MultiLinearVariantRenderer/types.d.ts +2 -0
  31. package/dist/MultiVariantBaseRenderer.d.ts +4 -4
  32. package/dist/SplitVcfTabixAdapter/SplitVcfTabixAdapter.d.ts +0 -1
  33. package/dist/SplitVcfTabixAdapter/SplitVcfTabixAdapter.js +0 -1
  34. package/dist/SplitVcfTabixAdapter/configSchema.js +4 -2
  35. package/dist/VariantFeatureWidget/AltFormatter.d.ts +4 -0
  36. package/dist/VariantFeatureWidget/AltFormatter.js +13 -0
  37. package/dist/VariantFeatureWidget/Checkbox2.js +1 -8
  38. package/dist/VariantFeatureWidget/Formatter.d.ts +3 -0
  39. package/dist/VariantFeatureWidget/Formatter.js +23 -0
  40. package/dist/VariantFeatureWidget/{VariantConsequenceDataGridWrapper.js → VariantConsequence/VariantConsequenceDataGridWrapper.js} +3 -5
  41. package/dist/VariantFeatureWidget/VariantFeatureWidget.js +16 -6
  42. package/dist/VariantFeatureWidget/VariantSampleGrid/VariantGenotypeFrequencyTable.d.ts +4 -0
  43. package/dist/VariantFeatureWidget/VariantSampleGrid/VariantGenotypeFrequencyTable.js +80 -0
  44. package/dist/VariantFeatureWidget/VariantSampleGrid/VariantSampleGrid.d.ts +3 -9
  45. package/dist/VariantFeatureWidget/VariantSampleGrid/VariantSampleGrid.js +41 -20
  46. package/dist/VariantFeatureWidget/VariantSampleGrid/types.d.ts +21 -0
  47. package/dist/VariantFeatureWidget/VariantSampleGrid/util.d.ts +1 -0
  48. package/dist/VariantFeatureWidget/VariantSampleGrid/util.js +14 -0
  49. package/dist/VariantFeatureWidget/stateModelFactory.d.ts +9 -6
  50. package/dist/VariantRPC/MultiVariantClusterGenotypeMatrix.d.ts +2 -16
  51. package/dist/VariantRPC/MultiVariantClusterGenotypeMatrix.js +4 -7
  52. package/dist/VariantRPC/MultiVariantGetGenotypeMatrix.d.ts +2 -15
  53. package/dist/VariantRPC/MultiVariantGetSimplifiedFeatures.d.ts +3 -13
  54. package/dist/VariantRPC/MultiVariantGetSimplifiedFeatures.js +14 -8
  55. package/dist/VariantRPC/getGenotypeMatrix.js +20 -7
  56. package/dist/VariantRPC/types.d.ts +23 -0
  57. package/dist/VcfAdapter/VcfAdapter.d.ts +0 -1
  58. package/dist/VcfAdapter/VcfAdapter.js +0 -1
  59. package/dist/VcfFeature/index.js +0 -1
  60. package/dist/VcfFeature/util.d.ts +2 -0
  61. package/dist/VcfFeature/util.js +123 -25
  62. package/dist/VcfTabixAdapter/VcfTabixAdapter.d.ts +0 -1
  63. package/dist/VcfTabixAdapter/VcfTabixAdapter.js +12 -8
  64. package/dist/getMultiVariantFeaturesAutorun.d.ts +2 -0
  65. package/dist/getMultiVariantFeaturesAutorun.js +9 -2
  66. package/dist/getMultiVariantSourcesAutorun.js +3 -2
  67. package/dist/shared/MultiVariantBaseModel.d.ts +41 -4
  68. package/dist/shared/MultiVariantBaseModel.js +69 -3
  69. package/dist/shared/SharedVariantMixin.d.ts +1 -1
  70. package/dist/shared/components/AddFiltersDialog.d.ts +9 -0
  71. package/dist/shared/components/AddFiltersDialog.js +61 -0
  72. package/dist/shared/components/MultiVariantBaseDisplayComponent.d.ts +5 -0
  73. package/dist/shared/components/MultiVariantBaseDisplayComponent.js +29 -0
  74. package/dist/shared/components/{ClusterDialog → MultiVariantClusterDialog}/ClusterDialog.js +2 -2
  75. package/dist/shared/components/{ClusterDialog → MultiVariantClusterDialog}/ClusterDialogAuto.js +8 -3
  76. package/dist/shared/components/{ClusterDialog → MultiVariantClusterDialog}/ClusterDialogManual.js +29 -28
  77. package/dist/shared/components/{ClusterDialog → MultiVariantClusterDialog}/types.d.ts +1 -0
  78. package/dist/shared/components/MultiVariantClusterDialog/types.js +2 -0
  79. package/{esm/shared/components/ColorLegend.d.ts → dist/shared/components/MultiVariantColorLegend.d.ts} +2 -2
  80. package/dist/shared/components/{ColorLegend.js → MultiVariantColorLegend.js} +5 -3
  81. package/dist/shared/components/MultiVariantCrosshairs.d.ts +7 -0
  82. package/dist/shared/components/MultiVariantCrosshairs.js +40 -0
  83. package/dist/shared/components/MultiVariantLegendBar.d.ts +7 -0
  84. package/dist/shared/components/{LegendBar.js → MultiVariantLegendBar.js} +2 -2
  85. package/dist/shared/components/MultiVariantTooltip.d.ts +4 -0
  86. package/dist/shared/components/MultiVariantTooltip.js +3 -2
  87. package/dist/shared/components/RectBg.js +4 -2
  88. package/dist/shared/components/SetColorDialog.js +1 -1
  89. package/dist/shared/components/SourcesDataGrid.d.ts +2 -1
  90. package/dist/shared/components/SourcesDataGrid.js +40 -47
  91. package/dist/shared/components/SourcesGrid.js +1 -1
  92. package/dist/shared/components/SourcesGridHeader.d.ts +2 -1
  93. package/dist/shared/drawAlleleCount.d.ts +2 -1
  94. package/dist/shared/drawAlleleCount.js +26 -24
  95. package/dist/shared/drawPhased.d.ts +1 -1
  96. package/dist/shared/drawPhased.js +14 -10
  97. package/dist/shared/minorAlleleFrequencyUtils.d.ts +9 -4
  98. package/dist/shared/minorAlleleFrequencyUtils.js +19 -14
  99. package/dist/shared/sourcesGridUtils.d.ts +3 -2
  100. package/esm/LinearVariantDisplay/model.d.ts +1 -1
  101. package/esm/MultiLinearVariantDisplay/components/VariantDisplayComponent.js +2 -2
  102. package/esm/MultiLinearVariantDisplay/index.js +1 -1
  103. package/esm/MultiLinearVariantDisplay/model.d.ts +40 -4
  104. package/esm/MultiLinearVariantDisplay/model.js +0 -1
  105. package/esm/MultiLinearVariantDisplay/renderSvg.js +1 -1
  106. package/esm/MultiLinearVariantMatrixDisplay/components/LinesConnectingMatrixToGenomicPosition.js +15 -8
  107. package/esm/MultiLinearVariantMatrixDisplay/components/VariantDisplayComponent.js +2 -2
  108. package/esm/MultiLinearVariantMatrixDisplay/index.js +1 -1
  109. package/esm/MultiLinearVariantMatrixDisplay/model.d.ts +40 -3
  110. package/esm/MultiLinearVariantMatrixDisplay/model.js +1 -0
  111. package/esm/MultiLinearVariantMatrixDisplay/renderSvg.js +1 -1
  112. package/esm/MultiLinearVariantMatrixRenderer/{LinearVariantMatrixRenderer.d.ts → MultiLinearVariantMatrixRenderer.d.ts} +14 -11
  113. package/esm/MultiLinearVariantMatrixRenderer/{LinearVariantMatrixRenderer.js → MultiLinearVariantMatrixRenderer.js} +3 -3
  114. package/esm/MultiLinearVariantMatrixRenderer/components/MultiLinearVariantMatrixRendering.d.ts +8 -0
  115. package/esm/MultiLinearVariantMatrixRenderer/components/MultiLinearVariantMatrixRendering.js +39 -0
  116. package/esm/MultiLinearVariantMatrixRenderer/index.js +4 -4
  117. package/esm/MultiLinearVariantMatrixRenderer/makeImageData.d.ts +3 -3
  118. package/esm/MultiLinearVariantMatrixRenderer/makeImageData.js +73 -19
  119. package/esm/MultiLinearVariantMatrixRenderer/types.d.ts +2 -4
  120. package/esm/MultiLinearVariantRenderer/MultiVariantRenderer.d.ts +34 -5
  121. package/esm/MultiLinearVariantRenderer/MultiVariantRenderer.js +13 -7
  122. package/esm/MultiLinearVariantRenderer/components/{MultiVariantRendering.d.ts → MultiLinearVariantRendering.d.ts} +10 -4
  123. package/esm/MultiLinearVariantRenderer/components/{MultiVariantRendering.js → MultiLinearVariantRendering.js} +25 -7
  124. package/esm/MultiLinearVariantRenderer/components/util.d.ts +1 -0
  125. package/esm/MultiLinearVariantRenderer/components/util.js +12 -0
  126. package/esm/MultiLinearVariantRenderer/index.js +1 -1
  127. package/esm/MultiLinearVariantRenderer/makeImageData.d.ts +9 -0
  128. package/esm/MultiLinearVariantRenderer/makeImageData.js +106 -43
  129. package/esm/MultiLinearVariantRenderer/types.d.ts +2 -0
  130. package/esm/MultiVariantBaseRenderer.d.ts +4 -4
  131. package/esm/SplitVcfTabixAdapter/SplitVcfTabixAdapter.d.ts +0 -1
  132. package/esm/SplitVcfTabixAdapter/SplitVcfTabixAdapter.js +0 -1
  133. package/esm/SplitVcfTabixAdapter/configSchema.js +4 -2
  134. package/esm/VariantFeatureWidget/AltFormatter.d.ts +4 -0
  135. package/esm/VariantFeatureWidget/AltFormatter.js +10 -0
  136. package/esm/VariantFeatureWidget/Checkbox2.js +2 -9
  137. package/esm/VariantFeatureWidget/Formatter.d.ts +3 -0
  138. package/esm/VariantFeatureWidget/Formatter.js +17 -0
  139. package/esm/VariantFeatureWidget/{VariantConsequenceDataGridWrapper.js → VariantConsequence/VariantConsequenceDataGridWrapper.js} +4 -6
  140. package/esm/VariantFeatureWidget/VariantFeatureWidget.js +16 -6
  141. package/esm/VariantFeatureWidget/VariantSampleGrid/VariantGenotypeFrequencyTable.d.ts +4 -0
  142. package/esm/VariantFeatureWidget/VariantSampleGrid/VariantGenotypeFrequencyTable.js +74 -0
  143. package/esm/VariantFeatureWidget/VariantSampleGrid/VariantSampleGrid.d.ts +3 -9
  144. package/esm/VariantFeatureWidget/VariantSampleGrid/VariantSampleGrid.js +43 -22
  145. package/esm/VariantFeatureWidget/VariantSampleGrid/types.d.ts +21 -0
  146. package/esm/VariantFeatureWidget/VariantSampleGrid/util.d.ts +1 -0
  147. package/esm/VariantFeatureWidget/VariantSampleGrid/util.js +11 -0
  148. package/esm/VariantFeatureWidget/stateModelFactory.d.ts +9 -6
  149. package/esm/VariantRPC/MultiVariantClusterGenotypeMatrix.d.ts +2 -16
  150. package/esm/VariantRPC/MultiVariantClusterGenotypeMatrix.js +4 -7
  151. package/esm/VariantRPC/MultiVariantGetGenotypeMatrix.d.ts +2 -15
  152. package/esm/VariantRPC/MultiVariantGetSimplifiedFeatures.d.ts +3 -13
  153. package/esm/VariantRPC/MultiVariantGetSimplifiedFeatures.js +14 -8
  154. package/esm/VariantRPC/getGenotypeMatrix.js +20 -7
  155. package/esm/VariantRPC/types.d.ts +23 -0
  156. package/esm/VcfAdapter/VcfAdapter.d.ts +0 -1
  157. package/esm/VcfAdapter/VcfAdapter.js +0 -1
  158. package/esm/VcfFeature/index.js +0 -1
  159. package/esm/VcfFeature/util.d.ts +2 -0
  160. package/esm/VcfFeature/util.js +121 -25
  161. package/esm/VcfTabixAdapter/VcfTabixAdapter.d.ts +0 -1
  162. package/esm/VcfTabixAdapter/VcfTabixAdapter.js +13 -9
  163. package/esm/getMultiVariantFeaturesAutorun.d.ts +2 -0
  164. package/esm/getMultiVariantFeaturesAutorun.js +9 -2
  165. package/esm/getMultiVariantSourcesAutorun.js +3 -2
  166. package/esm/shared/MultiVariantBaseModel.d.ts +41 -4
  167. package/esm/shared/MultiVariantBaseModel.js +71 -5
  168. package/esm/shared/SharedVariantMixin.d.ts +1 -1
  169. package/esm/shared/components/AddFiltersDialog.d.ts +9 -0
  170. package/esm/shared/components/AddFiltersDialog.js +59 -0
  171. package/esm/shared/components/MultiVariantBaseDisplayComponent.d.ts +5 -0
  172. package/esm/shared/components/MultiVariantBaseDisplayComponent.js +24 -0
  173. package/esm/shared/components/{ClusterDialog → MultiVariantClusterDialog}/ClusterDialog.js +2 -2
  174. package/esm/shared/components/{ClusterDialog → MultiVariantClusterDialog}/ClusterDialogAuto.js +9 -4
  175. package/esm/shared/components/{ClusterDialog → MultiVariantClusterDialog}/ClusterDialogManual.js +29 -28
  176. package/esm/shared/components/{ClusterDialog → MultiVariantClusterDialog}/types.d.ts +1 -0
  177. package/esm/shared/components/MultiVariantClusterDialog/types.js +1 -0
  178. package/{dist/shared/components/ColorLegend.d.ts → esm/shared/components/MultiVariantColorLegend.d.ts} +2 -2
  179. package/esm/shared/components/{ColorLegend.js → MultiVariantColorLegend.js} +6 -4
  180. package/esm/shared/components/MultiVariantCrosshairs.d.ts +7 -0
  181. package/esm/shared/components/MultiVariantCrosshairs.js +35 -0
  182. package/esm/shared/components/MultiVariantLegendBar.d.ts +7 -0
  183. package/esm/shared/components/{LegendBar.js → MultiVariantLegendBar.js} +1 -1
  184. package/esm/shared/components/MultiVariantTooltip.d.ts +4 -0
  185. package/esm/shared/components/MultiVariantTooltip.js +3 -2
  186. package/esm/shared/components/RectBg.js +4 -2
  187. package/esm/shared/components/SetColorDialog.js +1 -1
  188. package/esm/shared/components/SourcesDataGrid.d.ts +2 -1
  189. package/esm/shared/components/SourcesDataGrid.js +40 -47
  190. package/esm/shared/components/SourcesGrid.js +1 -1
  191. package/esm/shared/components/SourcesGridHeader.d.ts +2 -1
  192. package/esm/shared/drawAlleleCount.d.ts +2 -1
  193. package/esm/shared/drawAlleleCount.js +25 -24
  194. package/esm/shared/drawPhased.d.ts +1 -1
  195. package/esm/shared/drawPhased.js +14 -10
  196. package/esm/shared/minorAlleleFrequencyUtils.d.ts +9 -4
  197. package/esm/shared/minorAlleleFrequencyUtils.js +20 -15
  198. package/esm/shared/sourcesGridUtils.d.ts +3 -2
  199. package/package.json +12 -11
  200. package/dist/MultiLinearVariantDisplay/components/Crosshair.d.ts +0 -7
  201. package/dist/MultiLinearVariantDisplay/components/Crosshair.js +0 -35
  202. package/dist/MultiLinearVariantMatrixDisplay/components/Crosshair.d.ts +0 -7
  203. package/dist/MultiLinearVariantMatrixDisplay/components/Crosshair.js +0 -28
  204. package/dist/MultiLinearVariantMatrixRenderer/components/LinearVariantMatrixRendering.d.ts +0 -7
  205. package/dist/MultiLinearVariantMatrixRenderer/components/LinearVariantMatrixRendering.js +0 -38
  206. package/dist/MultiLinearVariantRenderer/MultiVariantRendering.d.ts +0 -22
  207. package/dist/MultiLinearVariantRenderer/components/MultiVariantRendering.js +0 -52
  208. package/dist/VariantFeatureWidget/VariantConsequencePanel.d.ts +0 -5
  209. package/dist/VariantFeatureWidget/VariantConsequencePanel.js +0 -15
  210. package/dist/VariantRPC/cluster.d.ts +0 -17
  211. package/dist/VariantRPC/cluster.js +0 -84
  212. package/dist/shared/components/LegendBar.d.ts +0 -18
  213. package/esm/MultiLinearVariantDisplay/components/Crosshair.d.ts +0 -7
  214. package/esm/MultiLinearVariantDisplay/components/Crosshair.js +0 -30
  215. package/esm/MultiLinearVariantMatrixDisplay/components/Crosshair.d.ts +0 -7
  216. package/esm/MultiLinearVariantMatrixDisplay/components/Crosshair.js +0 -23
  217. package/esm/MultiLinearVariantMatrixRenderer/components/LinearVariantMatrixRendering.d.ts +0 -7
  218. package/esm/MultiLinearVariantMatrixRenderer/components/LinearVariantMatrixRendering.js +0 -36
  219. package/esm/MultiLinearVariantRenderer/MultiVariantRendering.d.ts +0 -22
  220. package/esm/MultiLinearVariantRenderer/MultiVariantRendering.js +0 -47
  221. package/esm/VariantFeatureWidget/VariantConsequencePanel.d.ts +0 -5
  222. package/esm/VariantFeatureWidget/VariantConsequencePanel.js +0 -9
  223. package/esm/VariantRPC/cluster.d.ts +0 -17
  224. package/esm/VariantRPC/cluster.js +0 -79
  225. package/esm/shared/components/LegendBar.d.ts +0 -18
  226. /package/dist/VariantFeatureWidget/{VariantConsequenceDataGrid.d.ts → VariantConsequence/VariantConsequenceDataGrid.d.ts} +0 -0
  227. /package/dist/VariantFeatureWidget/{VariantConsequenceDataGrid.js → VariantConsequence/VariantConsequenceDataGrid.js} +0 -0
  228. /package/dist/VariantFeatureWidget/{VariantConsequenceDataGridWrapper.d.ts → VariantConsequence/VariantConsequenceDataGridWrapper.d.ts} +0 -0
  229. /package/dist/{shared/components/ClusterDialog → VariantFeatureWidget/VariantSampleGrid}/types.js +0 -0
  230. /package/dist/shared/components/{ClusterDialog → MultiVariantClusterDialog}/ClusterDialog.d.ts +0 -0
  231. /package/dist/shared/components/{ClusterDialog → MultiVariantClusterDialog}/ClusterDialogAuto.d.ts +0 -0
  232. /package/dist/shared/components/{ClusterDialog → MultiVariantClusterDialog}/ClusterDialogManual.d.ts +0 -0
  233. /package/esm/VariantFeatureWidget/{VariantConsequenceDataGrid.d.ts → VariantConsequence/VariantConsequenceDataGrid.d.ts} +0 -0
  234. /package/esm/VariantFeatureWidget/{VariantConsequenceDataGrid.js → VariantConsequence/VariantConsequenceDataGrid.js} +0 -0
  235. /package/esm/VariantFeatureWidget/{VariantConsequenceDataGridWrapper.d.ts → VariantConsequence/VariantConsequenceDataGridWrapper.d.ts} +0 -0
  236. /package/esm/{shared/components/ClusterDialog → VariantFeatureWidget/VariantSampleGrid}/types.js +0 -0
  237. /package/esm/shared/components/{ClusterDialog → MultiVariantClusterDialog}/ClusterDialog.d.ts +0 -0
  238. /package/esm/shared/components/{ClusterDialog → MultiVariantClusterDialog}/ClusterDialogAuto.d.ts +0 -0
  239. /package/esm/shared/components/{ClusterDialog → MultiVariantClusterDialog}/ClusterDialogManual.d.ts +0 -0
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const jsx_runtime_1 = require("react/jsx-runtime");
4
+ const react_1 = require("react");
5
+ const ui_1 = require("@jbrowse/core/ui");
6
+ const jexlStrings_1 = require("@jbrowse/core/util/jexlStrings");
7
+ const material_1 = require("@mui/material");
8
+ const mobx_react_1 = require("mobx-react");
9
+ const mui_1 = require("tss-react/mui");
10
+ const useStyles = (0, mui_1.makeStyles)()({
11
+ dialogContent: {
12
+ width: '80em',
13
+ },
14
+ textAreaFont: {
15
+ fontFamily: 'Courier New',
16
+ },
17
+ error: {
18
+ color: 'red',
19
+ fontSize: '0.8em',
20
+ },
21
+ });
22
+ function checkJexl(code) {
23
+ (0, jexlStrings_1.stringToJexlExpression)(code);
24
+ }
25
+ const AddFiltersDialog = (0, mobx_react_1.observer)(function ({ model, handleClose, }) {
26
+ const { classes } = useStyles();
27
+ const { activeFilters } = model;
28
+ const [data, setData] = (0, react_1.useState)(activeFilters.join('\n'));
29
+ const [error, setError] = (0, react_1.useState)();
30
+ (0, react_1.useEffect)(() => {
31
+ try {
32
+ data
33
+ .split('\n')
34
+ .map(line => line.trim())
35
+ .filter(line => !!line)
36
+ .map(line => {
37
+ checkJexl(line.trim());
38
+ });
39
+ setError(undefined);
40
+ }
41
+ catch (e) {
42
+ console.error(e);
43
+ setError(e);
44
+ }
45
+ }, [data]);
46
+ return ((0, jsx_runtime_1.jsxs)(ui_1.Dialog, { maxWidth: "xl", open: true, onClose: handleClose, title: "Add track filters", children: [(0, jsx_runtime_1.jsxs)(material_1.DialogContent, { children: [(0, jsx_runtime_1.jsxs)("div", { children: ["Add filters, in jexl format, one per line, starting with the string jexl:. Examples:", ' ', (0, jsx_runtime_1.jsxs)("ul", { children: [(0, jsx_runtime_1.jsxs)("li", { children: [(0, jsx_runtime_1.jsx)("code", { children: "jexl:get(feature,'name')=='BRCA1'" }), " - show only feature where the name attribute is BRCA1"] }), (0, jsx_runtime_1.jsxs)("li", { children: [(0, jsx_runtime_1.jsx)("code", { children: "jexl:get(feature,'type')=='gene'" }), " - show only gene type features in a GFF that has many other feature types"] }), (0, jsx_runtime_1.jsxs)("li", { children: [(0, jsx_runtime_1.jsx)("code", { children: "jexl:get(feature,'score') > 400" }), " - show only features that have a score greater than 400"] }), (0, jsx_runtime_1.jsxs)("li", { children: [(0, jsx_runtime_1.jsx)("code", { children: "jexl:get(feature,'end') - get(feature,'start') < 1000000" }), ' ', "- show only features with length less than 1Mbp"] })] })] }), error ? (0, jsx_runtime_1.jsx)("p", { className: classes.error, children: `${error}` }) : null, (0, jsx_runtime_1.jsx)(material_1.TextField, { variant: "outlined", multiline: true, minRows: 5, maxRows: 10, className: classes.dialogContent, fullWidth: true, value: data, onChange: event => {
47
+ setData(event.target.value);
48
+ }, slotProps: {
49
+ input: {
50
+ classes: {
51
+ input: classes.textAreaFont,
52
+ },
53
+ },
54
+ } })] }), (0, jsx_runtime_1.jsxs)(material_1.DialogActions, { children: [(0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", color: "primary", type: "submit", autoFocus: true, disabled: !!error, onClick: () => {
55
+ model.setJexlFilters(data.split('\n'));
56
+ handleClose();
57
+ }, children: "Submit" }), (0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", color: "secondary", onClick: () => {
58
+ handleClose();
59
+ }, children: "Cancel" })] })] }));
60
+ });
61
+ exports.default = AddFiltersDialog;
@@ -0,0 +1,5 @@
1
+ import type { MultiVariantBaseModel } from '../MultiVariantBaseModel';
2
+ declare const MultiVariantBaseDisplayComponent: (props: {
3
+ model: MultiVariantBaseModel;
4
+ }) => import("react/jsx-runtime").JSX.Element;
5
+ export default MultiVariantBaseDisplayComponent;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ const react_1 = require("react");
8
+ const plugin_linear_genome_view_1 = require("@jbrowse/plugin-linear-genome-view");
9
+ const mobx_react_1 = require("mobx-react");
10
+ const MultiVariantCrosshairs_1 = __importDefault(require("./MultiVariantCrosshairs"));
11
+ const MultiVariantLegendBar_1 = __importDefault(require("./MultiVariantLegendBar"));
12
+ const MultiVariantBaseDisplayComponent = (0, mobx_react_1.observer)(function (props) {
13
+ const { model } = props;
14
+ const ref = (0, react_1.useRef)(null);
15
+ const [mouseY, setMouseY] = (0, react_1.useState)();
16
+ const [mouseX, setMouseX] = (0, react_1.useState)();
17
+ return ((0, jsx_runtime_1.jsxs)("div", { ref: ref, onMouseMove: event => {
18
+ var _a;
19
+ const rect = (_a = ref.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();
20
+ const top = (rect === null || rect === void 0 ? void 0 : rect.top) || 0;
21
+ const left = (rect === null || rect === void 0 ? void 0 : rect.left) || 0;
22
+ setMouseY(event.clientY - top);
23
+ setMouseX(event.clientX - left);
24
+ }, onMouseLeave: () => {
25
+ setMouseY(undefined);
26
+ setMouseX(undefined);
27
+ }, children: [(0, jsx_runtime_1.jsx)(plugin_linear_genome_view_1.BaseLinearDisplayComponent, { ...props }), (0, jsx_runtime_1.jsx)(MultiVariantLegendBar_1.default, { model: model }), mouseX && mouseY ? ((0, jsx_runtime_1.jsx)(MultiVariantCrosshairs_1.default, { mouseX: mouseX, mouseY: mouseY, model: model })) : null] }));
28
+ });
29
+ exports.default = MultiVariantBaseDisplayComponent;
@@ -12,8 +12,8 @@ const ClusterDialogAuto_1 = __importDefault(require("./ClusterDialogAuto"));
12
12
  const ClusterDialogManual_1 = __importDefault(require("./ClusterDialogManual"));
13
13
  function Header({ activeMode, setActiveMode, }) {
14
14
  return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(material_1.Typography, { style: { marginBottom: 30 }, children: "This procedure will cluster the visible genotype data using hierarchical clustering" }), (0, jsx_runtime_1.jsx)(material_1.RadioGroup, { children: Object.entries({
15
- auto: ((0, jsx_runtime_1.jsx)("div", { children: "Run in-app clustering (slow for large data, built in JS clustering)" })),
16
- manual: ((0, jsx_runtime_1.jsx)("div", { children: "Download R script to run clustering (faster for large data, uses hclust, may be more accurate)" })),
15
+ auto: ((0, jsx_runtime_1.jsx)("div", { children: "Run in-app clustering (slower, particularly for large numbers of samples, uses JS implementation of hclust)" })),
16
+ manual: ((0, jsx_runtime_1.jsx)("div", { children: "Download R script to run clustering (faster, uses R implementation of hclust)" })),
17
17
  }).map(([key, val]) => ((0, jsx_runtime_1.jsx)(material_1.FormControlLabel, { control: (0, jsx_runtime_1.jsx)(material_1.Radio, { checked: activeMode === key, onChange: () => {
18
18
  setActiveMode(key);
19
19
  } }), label: val }, key))) })] }));
@@ -11,19 +11,22 @@ const mobx_react_1 = require("mobx-react");
11
11
  const mobx_state_tree_1 = require("mobx-state-tree");
12
12
  const ClusterDialogAuto = (0, mobx_react_1.observer)(function ({ model, children, handleClose, }) {
13
13
  const [progress, setProgress] = (0, react_1.useState)('');
14
+ const [loading, setLoading] = (0, react_1.useState)(false);
14
15
  const [error, setError] = (0, react_1.useState)();
15
16
  const [stopToken, setStopToken] = (0, react_1.useState)('');
16
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(material_1.DialogContent, { children: [children, (0, jsx_runtime_1.jsxs)("div", { children: [progress ? ((0, jsx_runtime_1.jsxs)("div", { style: { padding: 50 }, children: [(0, jsx_runtime_1.jsxs)("span", { style: { width: 400 }, children: ["Progress: ", progress] }), (0, jsx_runtime_1.jsx)(material_1.Button, { onClick: () => {
17
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(material_1.DialogContent, { children: [children, (0, jsx_runtime_1.jsxs)("div", { children: [loading ? ((0, jsx_runtime_1.jsxs)("div", { style: { padding: 50 }, children: [(0, jsx_runtime_1.jsx)("span", { children: progress || 'Loading...' }), (0, jsx_runtime_1.jsx)(material_1.Button, { onClick: () => {
17
18
  (0, stopToken_1.stopStopToken)(stopToken);
18
- }, children: "Stop" })] })) : null, error ? (0, jsx_runtime_1.jsx)(ui_1.ErrorMessage, { error: error }) : null] })] }), (0, jsx_runtime_1.jsxs)(material_1.DialogActions, { children: [(0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", onClick: async () => {
19
+ }, children: "Stop" })] })) : null, error ? (0, jsx_runtime_1.jsx)(ui_1.ErrorMessage, { error: error }) : null] })] }), (0, jsx_runtime_1.jsxs)(material_1.DialogActions, { children: [(0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", disabled: loading, onClick: async () => {
19
20
  try {
20
21
  setError(undefined);
22
+ setProgress('Initializing');
23
+ setLoading(true);
21
24
  const view = (0, util_1.getContainingView)(model);
22
25
  if (!view.initialized) {
23
26
  return;
24
27
  }
25
28
  const { rpcManager } = (0, util_1.getSession)(model);
26
- const { sourcesWithoutLayout, minorAlleleFrequencyFilter, adapterConfig, } = model;
29
+ const { sourcesWithoutLayout, minorAlleleFrequencyFilter, lengthCutoffFilter, adapterConfig, } = model;
27
30
  if (sourcesWithoutLayout) {
28
31
  const sessionId = (0, tracks_1.getRpcSessionId)(model);
29
32
  const stopToken = (0, stopToken_1.createStopToken)();
@@ -32,6 +35,7 @@ const ClusterDialogAuto = (0, mobx_react_1.observer)(function ({ model, children
32
35
  regions: view.dynamicBlocks.contentBlocks,
33
36
  sources: sourcesWithoutLayout,
34
37
  minorAlleleFrequencyFilter,
38
+ lengthCutoffFilter,
35
39
  sessionId,
36
40
  adapterConfig,
37
41
  stopToken,
@@ -56,6 +60,7 @@ const ClusterDialogAuto = (0, mobx_react_1.observer)(function ({ model, children
56
60
  }
57
61
  }
58
62
  finally {
63
+ setLoading(false);
59
64
  setProgress('');
60
65
  setStopToken('');
61
66
  }
@@ -30,8 +30,8 @@ const ClusterDialogManuals = (0, mobx_react_1.observer)(function ({ model, handl
30
30
  const [ret, setRet] = (0, react_1.useState)();
31
31
  const [error, setError] = (0, react_1.useState)();
32
32
  const [loading, setLoading] = (0, react_1.useState)(false);
33
- const [showAdvanced, setShowAdvanced] = (0, react_1.useState)(false);
34
- const [clusterMethod, setClusterMethod] = (0, util_1.useLocalStorage)('cluster-clusterMethod', 'single');
33
+ const [showAdvanced, setShowAdvanced] = (0, util_1.useLocalStorage)('cluster-showAdvanced', false);
34
+ const [clusterMethod, setClusterMethod] = (0, react_1.useState)('single');
35
35
  (0, react_1.useEffect)(() => {
36
36
  ;
37
37
  (async () => {
@@ -44,12 +44,13 @@ const ClusterDialogManuals = (0, mobx_react_1.observer)(function ({ model, handl
44
44
  return;
45
45
  }
46
46
  const { rpcManager } = (0, util_1.getSession)(model);
47
- const { sourcesWithoutLayout, minorAlleleFrequencyFilter, adapterConfig, } = model;
47
+ const { sourcesWithoutLayout, minorAlleleFrequencyFilter, lengthCutoffFilter, adapterConfig, } = model;
48
48
  const sessionId = (0, tracks_1.getRpcSessionId)(model);
49
49
  const ret = (await rpcManager.call(sessionId, 'MultiVariantGetGenotypeMatrix', {
50
50
  regions: view.dynamicBlocks.contentBlocks,
51
51
  sources: sourcesWithoutLayout,
52
52
  minorAlleleFrequencyFilter,
53
+ lengthCutoffFilter,
53
54
  sessionId,
54
55
  adapterConfig,
55
56
  }));
@@ -82,31 +83,31 @@ cat(resultClusters$order,sep='\\n')`
82
83
  .map(([key, val]) => [key, ...val].join('\t'))
83
84
  .join('\n')
84
85
  : undefined;
85
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(material_1.DialogContent, { children: [children, (0, jsx_runtime_1.jsxs)(material_1.Paper, { style: { padding: 16 }, children: [(0, jsx_runtime_1.jsxs)("div", { style: {
86
- display: 'flex',
87
- gap: '8px',
88
- flexWrap: 'wrap',
89
- marginBottom: '16px',
90
- }, children: [(0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", onClick: () => {
91
- (0, file_saver_1.saveAs)(new Blob([results || ''], {
92
- type: 'text/plain;charset=utf-8',
93
- }), 'cluster.R');
94
- }, children: "Download Rscript" }), ' ', "or", ' ', (0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", onClick: () => {
95
- (0, copy_to_clipboard_1.default)(results || '');
96
- }, children: "Copy Rscript to clipboard" }), ' ', "or", ' ', (0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", onClick: () => {
97
- (0, file_saver_1.saveAs)(new Blob([resultsTsv || ''], {
98
- type: 'text/plain;charset=utf-8',
99
- }), 'genotypes.tsv');
100
- }, children: "Download TSV" }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", onClick: () => {
101
- setShowAdvanced(!showAdvanced);
102
- }, children: showAdvanced
103
- ? 'Hide advanced options'
104
- : 'Show advanced options' }), showAdvanced ? ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(material_1.Typography, { variant: "h6", children: "Advanced options" }), (0, jsx_runtime_1.jsx)(material_1.RadioGroup, { children: Object.entries({
105
- single: 'Single',
106
- complete: 'Complete',
107
- }).map(([key, val]) => ((0, jsx_runtime_1.jsx)(material_1.FormControlLabel, { control: (0, jsx_runtime_1.jsx)(material_1.Radio, { checked: clusterMethod === key, onChange: () => {
108
- setClusterMethod(key);
109
- } }), label: val }, key))) })] })) : null] }), results ? ((0, jsx_runtime_1.jsx)("div", {})) : loading ? ((0, jsx_runtime_1.jsx)(ui_1.LoadingEllipses, { variant: "h6", title: "Generating genotype matrix" })) : error ? ((0, jsx_runtime_1.jsx)(ui_1.ErrorMessage, { error: error })) : null] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(material_1.Typography, { variant: "subtitle2", gutterBottom: true, style: { marginTop: '16px' }, children: "Clustering Results:" }), (0, jsx_runtime_1.jsx)(material_1.TextField, { multiline: true, fullWidth: true, variant: "outlined", placeholder: "Paste results from Rscript here (sequence of numbers, one per line, specifying the new ordering)", rows: 10, value: paste, onChange: event => {
86
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(material_1.DialogContent, { children: [children, (0, jsx_runtime_1.jsxs)(material_1.Paper, { style: { padding: 16 }, children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { style: {
87
+ display: 'flex',
88
+ gap: '8px',
89
+ flexWrap: 'wrap',
90
+ marginBottom: '16px',
91
+ }, children: [(0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", onClick: () => {
92
+ (0, file_saver_1.saveAs)(new Blob([results || ''], {
93
+ type: 'text/plain;charset=utf-8',
94
+ }), 'cluster.R');
95
+ }, children: "Download Rscript" }), ' ', "or", ' ', (0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", onClick: () => {
96
+ (0, copy_to_clipboard_1.default)(results || '');
97
+ }, children: "Copy Rscript to clipboard" }), ' ', "or", ' ', (0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", onClick: () => {
98
+ (0, file_saver_1.saveAs)(new Blob([resultsTsv || ''], {
99
+ type: 'text/plain;charset=utf-8',
100
+ }), 'genotypes.tsv');
101
+ }, children: "Download TSV" }), (0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", onClick: () => {
102
+ setShowAdvanced(!showAdvanced);
103
+ }, children: showAdvanced
104
+ ? 'Hide advanced options'
105
+ : 'Show advanced options' }) })] }), showAdvanced ? ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(material_1.Typography, { variant: "h6", children: "Advanced options" }), (0, jsx_runtime_1.jsx)(material_1.RadioGroup, { children: Object.entries({
106
+ single: 'Single',
107
+ complete: 'Complete',
108
+ }).map(([key, val]) => ((0, jsx_runtime_1.jsx)(material_1.FormControlLabel, { control: (0, jsx_runtime_1.jsx)(material_1.Radio, { checked: clusterMethod === key, onChange: () => {
109
+ setClusterMethod(key);
110
+ } }), label: val }, key))) })] })) : null, results ? ((0, jsx_runtime_1.jsx)("div", {})) : loading ? ((0, jsx_runtime_1.jsx)(ui_1.LoadingEllipses, { variant: "h6", title: "Generating genotype matrix" })) : error ? ((0, jsx_runtime_1.jsx)(ui_1.ErrorMessage, { error: error })) : null] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(material_1.Typography, { variant: "subtitle2", gutterBottom: true, style: { marginTop: '16px' }, children: "Clustering Results:" }), (0, jsx_runtime_1.jsx)(material_1.TextField, { multiline: true, fullWidth: true, variant: "outlined", placeholder: "Paste results from Rscript here (sequence of numbers, one per line, specifying the new ordering)", rows: 10, value: paste, onChange: event => {
110
111
  setPaste(event.target.value);
111
112
  }, slotProps: {
112
113
  input: {
@@ -3,6 +3,7 @@ import type { AnyConfigurationModel } from '@jbrowse/core/configuration';
3
3
  export interface ReducedModel {
4
4
  sourcesWithoutLayout?: Source[];
5
5
  minorAlleleFrequencyFilter?: number;
6
+ lengthCutoffFilter: number;
6
7
  adapterConfig: AnyConfigurationModel;
7
8
  setLayout: (arg: Source[]) => void;
8
9
  clearLayout: () => void;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,5 +1,5 @@
1
1
  import type { Source } from '../types';
2
- declare const ColorLegend: ({ model, labelWidth, }: {
2
+ declare const MultiVariantColorLegend: ({ model, labelWidth, }: {
3
3
  model: {
4
4
  canDisplayLabels: boolean;
5
5
  rowHeight: number;
@@ -7,4 +7,4 @@ declare const ColorLegend: ({ model, labelWidth, }: {
7
7
  };
8
8
  labelWidth: number;
9
9
  }) => import("react/jsx-runtime").JSX.Element | null;
10
- export default ColorLegend;
10
+ export default MultiVariantColorLegend;
@@ -6,17 +6,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const jsx_runtime_1 = require("react/jsx-runtime");
7
7
  const react_1 = require("react");
8
8
  const util_1 = require("@jbrowse/core/util");
9
+ const material_1 = require("@mui/material");
9
10
  const mobx_react_1 = require("mobx-react");
10
11
  const RectBg_1 = __importDefault(require("./RectBg"));
11
- const ColorLegend = (0, mobx_react_1.observer)(function ({ model, labelWidth, }) {
12
+ const MultiVariantColorLegend = (0, mobx_react_1.observer)(function ({ model, labelWidth, }) {
12
13
  const { canDisplayLabels, rowHeight, sources } = model;
13
14
  const svgFontSize = (0, util_1.clamp)(rowHeight, 8, 12);
14
15
  const colorBoxWidth = 15;
15
16
  const hasColors = sources === null || sources === void 0 ? void 0 : sources.some(s => s.color);
16
17
  const legendWidth = labelWidth + (hasColors ? colorBoxWidth + 5 : 0);
18
+ const theme = (0, material_1.useTheme)();
17
19
  return sources ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [canDisplayLabels ? ((0, jsx_runtime_1.jsx)(RectBg_1.default, { y: 0, x: 0, width: legendWidth, height: (sources.length + 0.25) * rowHeight })) : null, sources.map((source, idx) => {
18
20
  const { color, name, label } = source;
19
- return ((0, jsx_runtime_1.jsxs)(react_1.Fragment, { children: [color ? ((0, jsx_runtime_1.jsx)(RectBg_1.default, { y: idx * rowHeight, x: 0, width: colorBoxWidth + 0.5, height: rowHeight + 0.5, color: color })) : null, canDisplayLabels ? ((0, jsx_runtime_1.jsx)("text", { y: idx * rowHeight + svgFontSize, x: color ? colorBoxWidth + 2 : 0, fontSize: svgFontSize, children: label || name })) : null] }, `${label}-${idx}`));
21
+ return ((0, jsx_runtime_1.jsxs)(react_1.Fragment, { children: [color ? ((0, jsx_runtime_1.jsx)(RectBg_1.default, { y: idx * rowHeight, x: 0, width: colorBoxWidth + 0.5, height: rowHeight + 0.5, color: color })) : null, canDisplayLabels ? ((0, jsx_runtime_1.jsx)("text", { y: idx * rowHeight + svgFontSize, x: color ? colorBoxWidth + 2 : 0, fontSize: svgFontSize, ...(0, util_1.getFillProps)(theme.palette.text.primary), children: label || name })) : null] }, `${label}-${idx}`));
20
22
  })] })) : null;
21
23
  });
22
- exports.default = ColorLegend;
24
+ exports.default = MultiVariantColorLegend;
@@ -0,0 +1,7 @@
1
+ import type { MultiVariantBaseModel } from '../MultiVariantBaseModel';
2
+ declare const MultiVariantCrosshairs: ({ mouseX, mouseY, model, }: {
3
+ mouseX: number;
4
+ mouseY: number;
5
+ model: MultiVariantBaseModel;
6
+ }) => import("react/jsx-runtime").JSX.Element;
7
+ export default MultiVariantCrosshairs;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ const util_1 = require("@jbrowse/core/util");
8
+ const material_1 = require("@mui/material");
9
+ const mobx_react_1 = require("mobx-react");
10
+ const mui_1 = require("tss-react/mui");
11
+ const MultiVariantTooltip_1 = __importDefault(require("./MultiVariantTooltip"));
12
+ const useStyles = (0, mui_1.makeStyles)()({
13
+ rel: {
14
+ position: 'relative',
15
+ },
16
+ cursor: {
17
+ pointerEvents: 'none',
18
+ zIndex: 800,
19
+ position: 'absolute',
20
+ },
21
+ color: {
22
+ width: 10,
23
+ height: 10,
24
+ },
25
+ });
26
+ const MultiVariantCrosshairs = (0, mobx_react_1.observer)(function ({ mouseX, mouseY, model, }) {
27
+ const { classes } = useStyles();
28
+ const theme = (0, material_1.useTheme)();
29
+ const { hoveredGenotype, height, scrollTop, sourceMap } = model;
30
+ const { width } = (0, util_1.getContainingView)(model);
31
+ const source = hoveredGenotype ? sourceMap === null || sourceMap === void 0 ? void 0 : sourceMap[hoveredGenotype.name] : undefined;
32
+ const y = mouseY - scrollTop;
33
+ return ((0, jsx_runtime_1.jsxs)("div", { className: classes.rel, children: [(0, jsx_runtime_1.jsxs)("svg", { className: classes.cursor, width: width, height: height, style: {
34
+ top: scrollTop,
35
+ }, children: [(0, jsx_runtime_1.jsx)("line", { x1: 0, x2: width, y1: y, y2: y, stroke: theme.palette.text.primary }), (0, jsx_runtime_1.jsx)("line", { x1: mouseX, x2: mouseX, y1: 0, y2: height, stroke: theme.palette.text.primary })] }), source ? ((0, jsx_runtime_1.jsx)(MultiVariantTooltip_1.default, { source: {
36
+ ...source,
37
+ ...hoveredGenotype,
38
+ } })) : null] }));
39
+ });
40
+ exports.default = MultiVariantCrosshairs;
@@ -0,0 +1,7 @@
1
+ import type { MultiVariantBaseModel } from '../MultiVariantBaseModel';
2
+ export declare const LegendBar: (props: {
3
+ model: MultiVariantBaseModel;
4
+ orientation?: string;
5
+ exportSVG?: boolean;
6
+ }) => import("react/jsx-runtime").JSX.Element | null;
7
+ export default LegendBar;
@@ -7,7 +7,7 @@ exports.LegendBar = void 0;
7
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  const util_1 = require("@jbrowse/core/util");
9
9
  const mobx_react_1 = require("mobx-react");
10
- const ColorLegend_1 = __importDefault(require("./ColorLegend"));
10
+ const MultiVariantColorLegend_1 = __importDefault(require("./MultiVariantColorLegend"));
11
11
  const Wrapper = (0, mobx_react_1.observer)(function ({ children, model, exportSVG, }) {
12
12
  const { id, scrollTop, height } = model;
13
13
  const clipid = `legend-${id}`;
@@ -25,7 +25,7 @@ exports.LegendBar = (0, mobx_react_1.observer)(function (props) {
25
25
  const { model } = props;
26
26
  const { canDisplayLabels, rowHeight, sources } = model;
27
27
  const svgFontSize = (0, util_1.clamp)(rowHeight, 8, 12);
28
- return sources ? ((0, jsx_runtime_1.jsx)(Wrapper, { ...props, children: (0, jsx_runtime_1.jsx)(ColorLegend_1.default, { model: model, labelWidth: (0, util_1.max)(sources
28
+ return sources ? ((0, jsx_runtime_1.jsx)(Wrapper, { ...props, children: (0, jsx_runtime_1.jsx)(MultiVariantColorLegend_1.default, { model: model, labelWidth: (0, util_1.max)(sources
29
29
  .map(s => (0, util_1.measureText)(s.label, svgFontSize) + 10)
30
30
  .map(width => (canDisplayLabels ? width : 20)), 0) }) })) : null;
31
31
  });
@@ -1,6 +1,10 @@
1
1
  export default function MultiVariantTooltip({ source, }: {
2
2
  source: {
3
3
  color?: string;
4
+ hoveredGenotype?: {
5
+ genotype: string;
6
+ name: string;
7
+ };
4
8
  [key: string]: unknown;
5
9
  };
6
10
  }): import("react/jsx-runtime").JSX.Element;
@@ -7,6 +7,7 @@ exports.default = MultiVariantTooltip;
7
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  const ui_1 = require("@jbrowse/core/ui");
9
9
  const BaseTooltip_1 = __importDefault(require("@jbrowse/core/ui/BaseTooltip"));
10
+ const escape_html_1 = __importDefault(require("escape-html"));
10
11
  function MultiVariantTooltip({ source, }) {
11
12
  return ((0, jsx_runtime_1.jsxs)(BaseTooltip_1.default, { children: [source.color ? ((0, jsx_runtime_1.jsx)("div", { style: {
12
13
  width: 10,
@@ -14,10 +15,10 @@ function MultiVariantTooltip({ source, }) {
14
15
  backgroundColor: source.color,
15
16
  } })) : null, (0, jsx_runtime_1.jsx)(ui_1.SanitizedHTML, { html: Object.entries(source)
16
17
  .filter(([key, val]) => key !== 'color' &&
17
- key !== 'name' &&
18
18
  key !== 'HP' &&
19
+ key !== 'name' &&
19
20
  key !== 'id' &&
20
21
  val !== undefined)
21
- .map(([key, value]) => `${key}:${value}`)
22
+ .map(([key, value]) => `${key}:${(0, escape_html_1.default)(`${value}`)}`)
22
23
  .join('<br/>') })] }));
23
24
  }
@@ -2,7 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const jsx_runtime_1 = require("react/jsx-runtime");
4
4
  const util_1 = require("@jbrowse/core/util");
5
- const RectBg = ({ x, y, width, height, color = 'rgba(255,255,255,0.5)', }) => {
6
- return ((0, jsx_runtime_1.jsx)("rect", { pointerEvents: "auto", x: x, y: y, width: width, height: height, ...(0, util_1.getFillProps)(color) }));
5
+ const material_1 = require("@mui/material");
6
+ const RectBg = ({ x, y, width, height, color, }) => {
7
+ const theme = (0, material_1.useTheme)();
8
+ return ((0, jsx_runtime_1.jsx)("rect", { pointerEvents: "auto", x: x, y: y, width: width, height: height, ...(0, util_1.getFillProps)(color || (0, material_1.alpha)(theme.palette.background.paper, 0.3)) }));
7
9
  };
8
10
  exports.default = RectBg;
@@ -33,7 +33,7 @@ function SetColorDialog({ model, handleClose, }) {
33
33
  const [showBulkEditor, setShowBulkEditor] = (0, react_1.useState)(false);
34
34
  const [currLayout, setCurrLayout] = (0, react_1.useState)(sources || []);
35
35
  const [showTips, setShowTips] = (0, util_1.useLocalStorage)('multivariant-showTips', false);
36
- return ((0, jsx_runtime_1.jsx)(DraggableDialog_1.default, { open: true, onClose: handleClose, maxWidth: "xl", title: "Multi-variant color/arrangement editor", children: showBulkEditor ? ((0, jsx_runtime_1.jsx)(BulkEditPanel_1.default, { currLayout: currLayout, onClose: arg => {
36
+ return ((0, jsx_runtime_1.jsx)(DraggableDialog_1.default, { open: true, onClose: handleClose, maxWidth: "xl", title: "Multi-sample variant display - Color/arrangement editor", children: showBulkEditor ? ((0, jsx_runtime_1.jsx)(BulkEditPanel_1.default, { currLayout: currLayout, onClose: arg => {
37
37
  if (arg) {
38
38
  setCurrLayout(arg);
39
39
  }
@@ -1,6 +1,7 @@
1
1
  import type { Source } from '../types';
2
+ import type { GridRowId } from '@mui/x-data-grid';
2
3
  export default function SourcesDataGrid({ rows, onChange, setSelected, }: {
3
4
  rows: Source[];
4
5
  onChange: (arg: Source[]) => void;
5
- setSelected: (arg: string[]) => void;
6
+ setSelected: (arg: GridRowId[]) => void;
6
7
  }): import("react/jsx-runtime").JSX.Element;
@@ -20,56 +20,49 @@ const useStyles = (0, mui_1.makeStyles)()({
20
20
  });
21
21
  function SourcesDataGrid({ rows, onChange, setSelected, }) {
22
22
  const { classes } = useStyles();
23
+ const { id: _id, name: _name, label: _label, color: _color, baseUri: _baseUri, HP: _HP, ...rest } = rows[0];
23
24
  const [currSort, setCurrSort] = (0, react_1.useState)({
24
25
  idx: 0,
25
26
  field: null,
26
27
  });
27
- if (rows.length) {
28
- const { id: _id, name: _name, label: _label, color: _color, baseUri: _baseUri, HP: _HP, ...rest } = rows[0];
29
- return ((0, jsx_runtime_1.jsx)("div", { style: { height: 400, width: '100%' }, children: (0, jsx_runtime_1.jsx)(x_data_grid_1.DataGrid, { checkboxSelection: true, disableRowSelectionOnClick: true, onRowSelectionModelChange: arg => {
30
- setSelected(arg);
31
- }, rows: rows, rowHeight: 25, columnHeaderHeight: 33, columns: [
32
- {
33
- field: 'color',
34
- headerName: 'Color',
35
- renderCell: params => {
36
- const { value, id } = params;
37
- return ((0, jsx_runtime_1.jsx)(ColorPicker_1.default, { color: value || 'blue', onChange: c => {
38
- const elt = rows.find(f => f.name === id);
39
- if (elt) {
40
- elt.color = c;
41
- }
42
- onChange([...rows]);
43
- } }));
44
- },
28
+ return ((0, jsx_runtime_1.jsx)("div", { style: { height: 400, width: '100%' }, children: (0, jsx_runtime_1.jsx)(x_data_grid_1.DataGrid, { checkboxSelection: true, onRowSelectionModelChange: arg => {
29
+ setSelected([...arg.ids]);
30
+ }, rows: rows, rowHeight: 25, columnHeaderHeight: 33, columns: [
31
+ {
32
+ field: 'color',
33
+ headerName: 'Color',
34
+ renderCell: params => {
35
+ const { value, id } = params;
36
+ return ((0, jsx_runtime_1.jsx)(ColorPicker_1.default, { color: value || 'blue', onChange: c => {
37
+ const elt = rows.find(f => f.name === id);
38
+ if (elt) {
39
+ elt.color = c;
40
+ }
41
+ onChange([...rows]);
42
+ } }));
45
43
  },
46
- {
47
- field: 'label',
48
- headerName: 'Name',
49
- width: (0, util_1.measureGridWidth)(rows.map(r => r.label)),
50
- },
51
- ...Object.keys(rest).map(val => ({
52
- field: val,
53
- renderCell: ({ value }) => ((0, jsx_runtime_1.jsx)("div", { className: classes.cell, children: (0, jsx_runtime_1.jsx)(ui_1.SanitizedHTML, { html: (0, util_1.getStr)(value) }) })),
54
- width: (0, util_1.measureGridWidth)(rows.map(r => `${r[val]}`)),
55
- })),
56
- ], sortModel: [], onSortModelChange: args => {
57
- const sort = args[0];
58
- const idx = (currSort.idx + 1) % 2;
59
- const field = sort.field || currSort.field;
60
- setCurrSort({ idx, field });
61
- onChange(field
62
- ? [...rows].sort((a, b) => {
63
- const aa = (0, util_1.getStr)(a[field]);
64
- const bb = (0, util_1.getStr)(b[field]);
65
- return idx === 1
66
- ? aa.localeCompare(bb)
67
- : bb.localeCompare(aa);
68
- })
69
- : rows);
70
- } }) }));
71
- }
72
- else {
73
- return (0, jsx_runtime_1.jsx)("div", { children: "No rows, check sample metadata configuration" });
74
- }
44
+ },
45
+ {
46
+ field: 'label',
47
+ headerName: 'Name',
48
+ width: (0, util_1.measureGridWidth)(rows.map(r => r.label)),
49
+ },
50
+ ...Object.keys(rest).map(val => ({
51
+ field: val,
52
+ renderCell: ({ value }) => ((0, jsx_runtime_1.jsx)("div", { className: classes.cell, children: (0, jsx_runtime_1.jsx)(ui_1.SanitizedHTML, { html: (0, util_1.getStr)(value) }) })),
53
+ width: (0, util_1.measureGridWidth)(rows.map(r => `${r[val]}`)),
54
+ })),
55
+ ], sortModel: [], onSortModelChange: args => {
56
+ const sort = args[0];
57
+ const idx = (currSort.idx + 1) % 2;
58
+ const field = sort.field || currSort.field;
59
+ setCurrSort({ idx, field });
60
+ onChange(field
61
+ ? [...rows].sort((a, b) => {
62
+ const aa = (0, util_1.getStr)(a[field]);
63
+ const bb = (0, util_1.getStr)(b[field]);
64
+ return idx === 1 ? aa.localeCompare(bb) : bb.localeCompare(aa);
65
+ })
66
+ : rows);
67
+ } }) }));
75
68
  }
@@ -9,6 +9,6 @@ const SourcesDataGrid_1 = __importDefault(require("./SourcesDataGrid"));
9
9
  const SourcesGridHeader_1 = __importDefault(require("./SourcesGridHeader"));
10
10
  function SourcesGrid({ rows, onChange, showTips, }) {
11
11
  const [selected, setSelected] = (0, react_1.useState)([]);
12
- return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(SourcesGridHeader_1.default, { selected: selected, rows: rows, showTips: showTips, onChange: onChange }), (0, jsx_runtime_1.jsx)(SourcesDataGrid_1.default, { rows: rows, onChange: onChange, setSelected: setSelected })] }));
12
+ return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(SourcesGridHeader_1.default, { selected: selected, rows: rows, showTips: showTips, onChange: onChange }), rows.length ? ((0, jsx_runtime_1.jsx)(SourcesDataGrid_1.default, { rows: rows, onChange: onChange, setSelected: setSelected })) : ((0, jsx_runtime_1.jsx)("div", { children: "No rows" }))] }));
13
13
  }
14
14
  exports.default = SourcesGrid;
@@ -1,7 +1,8 @@
1
1
  import type { Source } from '../types';
2
+ import type { GridRowId } from '@mui/x-data-grid';
2
3
  export default function SourcesGridHeader({ selected, onChange, rows, showTips, }: {
3
4
  onChange: (arg: Source[]) => void;
4
5
  rows: Source[];
5
- selected: string[];
6
+ selected: GridRowId[];
6
7
  showTips: boolean;
7
8
  }): import("react/jsx-runtime").JSX.Element;
@@ -1 +1,2 @@
1
- export declare function drawColorAlleleCount(alleles: string[], ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, mostFrequentAlt: string): void;
1
+ export declare function getColorAlleleCount(ref: number, alt: number, alt2: number, uncalled: number, total: number, drawReference?: boolean): any;
2
+ export declare function drawColorAlleleCount(c: string, ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, featureType?: string, featureStrand?: number, alpha?: number): void;