@jbrowse/plugin-spreadsheet-view 2.6.1

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 (279) hide show
  1. package/LICENSE +201 -0
  2. package/dist/LaunchSpreadsheetView/index.d.ts +3 -0
  3. package/dist/LaunchSpreadsheetView/index.js +26 -0
  4. package/dist/LaunchSpreadsheetView/index.js.map +1 -0
  5. package/dist/SpreadsheetView/components/CellData.d.ts +9 -0
  6. package/dist/SpreadsheetView/components/CellData.js +16 -0
  7. package/dist/SpreadsheetView/components/CellData.js.map +1 -0
  8. package/dist/SpreadsheetView/components/ColumnFilterControls.d.ts +3 -0
  9. package/dist/SpreadsheetView/components/ColumnFilterControls.js +62 -0
  10. package/dist/SpreadsheetView/components/ColumnFilterControls.js.map +1 -0
  11. package/dist/SpreadsheetView/components/ColumnMenu.d.ts +16 -0
  12. package/dist/SpreadsheetView/components/ColumnMenu.js +127 -0
  13. package/dist/SpreadsheetView/components/ColumnMenu.js.map +1 -0
  14. package/dist/SpreadsheetView/components/DataRow.d.ts +12 -0
  15. package/dist/SpreadsheetView/components/DataRow.js +82 -0
  16. package/dist/SpreadsheetView/components/DataRow.js.map +1 -0
  17. package/dist/SpreadsheetView/components/DataTable.d.ts +10 -0
  18. package/dist/SpreadsheetView/components/DataTable.js +43 -0
  19. package/dist/SpreadsheetView/components/DataTable.js.map +1 -0
  20. package/dist/SpreadsheetView/components/DataTableHeader.d.ts +6 -0
  21. package/dist/SpreadsheetView/components/DataTableHeader.js +102 -0
  22. package/dist/SpreadsheetView/components/DataTableHeader.js.map +1 -0
  23. package/dist/SpreadsheetView/components/GlobalFilterControls.d.ts +5 -0
  24. package/dist/SpreadsheetView/components/GlobalFilterControls.js +64 -0
  25. package/dist/SpreadsheetView/components/GlobalFilterControls.js.map +1 -0
  26. package/dist/SpreadsheetView/components/ImportWizard.d.ts +6 -0
  27. package/dist/SpreadsheetView/components/ImportWizard.js +81 -0
  28. package/dist/SpreadsheetView/components/ImportWizard.js.map +1 -0
  29. package/dist/SpreadsheetView/components/NumberEditor.d.ts +9 -0
  30. package/dist/SpreadsheetView/components/NumberEditor.js +54 -0
  31. package/dist/SpreadsheetView/components/NumberEditor.js.map +1 -0
  32. package/dist/SpreadsheetView/components/RowCountMessage.d.ts +8 -0
  33. package/dist/SpreadsheetView/components/RowCountMessage.js +33 -0
  34. package/dist/SpreadsheetView/components/RowCountMessage.js.map +1 -0
  35. package/dist/SpreadsheetView/components/RowMenu.d.ts +9 -0
  36. package/dist/SpreadsheetView/components/RowMenu.js +39 -0
  37. package/dist/SpreadsheetView/components/RowMenu.js.map +1 -0
  38. package/dist/SpreadsheetView/components/SortIndicator.d.ts +6 -0
  39. package/dist/SpreadsheetView/components/SortIndicator.js +28 -0
  40. package/dist/SpreadsheetView/components/SortIndicator.js.map +1 -0
  41. package/dist/SpreadsheetView/components/Spreadsheet.d.ts +11 -0
  42. package/dist/SpreadsheetView/components/Spreadsheet.js +25 -0
  43. package/dist/SpreadsheetView/components/Spreadsheet.js.map +1 -0
  44. package/dist/SpreadsheetView/components/SpreadsheetView.d.ts +6 -0
  45. package/dist/SpreadsheetView/components/SpreadsheetView.js +86 -0
  46. package/dist/SpreadsheetView/components/SpreadsheetView.js.map +1 -0
  47. package/dist/SpreadsheetView/components/StatusBar.d.ts +11 -0
  48. package/dist/SpreadsheetView/components/StatusBar.js +42 -0
  49. package/dist/SpreadsheetView/components/StatusBar.js.map +1 -0
  50. package/dist/SpreadsheetView/components/util.d.ts +1 -0
  51. package/dist/SpreadsheetView/components/util.js +19 -0
  52. package/dist/SpreadsheetView/components/util.js.map +1 -0
  53. package/dist/SpreadsheetView/importAdapters/BedImport.d.ts +17 -0
  54. package/dist/SpreadsheetView/importAdapters/BedImport.js +147 -0
  55. package/dist/SpreadsheetView/importAdapters/BedImport.js.map +1 -0
  56. package/dist/SpreadsheetView/importAdapters/ImportUtils.d.ts +42 -0
  57. package/dist/SpreadsheetView/importAdapters/ImportUtils.js +124 -0
  58. package/dist/SpreadsheetView/importAdapters/ImportUtils.js.map +1 -0
  59. package/dist/SpreadsheetView/importAdapters/STARFusionImport.d.ts +9 -0
  60. package/dist/SpreadsheetView/importAdapters/STARFusionImport.js +73 -0
  61. package/dist/SpreadsheetView/importAdapters/STARFusionImport.js.map +1 -0
  62. package/dist/SpreadsheetView/importAdapters/VcfImport.d.ts +13 -0
  63. package/dist/SpreadsheetView/importAdapters/VcfImport.js +111 -0
  64. package/dist/SpreadsheetView/importAdapters/VcfImport.js.map +1 -0
  65. package/dist/SpreadsheetView/index.d.ts +4 -0
  66. package/dist/SpreadsheetView/index.js +42 -0
  67. package/dist/SpreadsheetView/index.js.map +1 -0
  68. package/dist/SpreadsheetView/models/ColumnDataTypes/LocEnd.d.ts +13 -0
  69. package/dist/SpreadsheetView/models/ColumnDataTypes/LocEnd.js +21 -0
  70. package/dist/SpreadsheetView/models/ColumnDataTypes/LocEnd.js.map +1 -0
  71. package/dist/SpreadsheetView/models/ColumnDataTypes/LocRef.d.ts +13 -0
  72. package/dist/SpreadsheetView/models/ColumnDataTypes/LocRef.js +21 -0
  73. package/dist/SpreadsheetView/models/ColumnDataTypes/LocRef.js.map +1 -0
  74. package/dist/SpreadsheetView/models/ColumnDataTypes/LocStart.d.ts +13 -0
  75. package/dist/SpreadsheetView/models/ColumnDataTypes/LocStart.js +21 -0
  76. package/dist/SpreadsheetView/models/ColumnDataTypes/LocStart.js.map +1 -0
  77. package/dist/SpreadsheetView/models/ColumnDataTypes/LocString.d.ts +13 -0
  78. package/dist/SpreadsheetView/models/ColumnDataTypes/LocString.js +190 -0
  79. package/dist/SpreadsheetView/models/ColumnDataTypes/LocString.js.map +1 -0
  80. package/dist/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.d.ts +19 -0
  81. package/dist/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js +24 -0
  82. package/dist/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js.map +1 -0
  83. package/dist/SpreadsheetView/models/ColumnDataTypes/Number.d.ts +30 -0
  84. package/dist/SpreadsheetView/models/ColumnDataTypes/Number.js +130 -0
  85. package/dist/SpreadsheetView/models/ColumnDataTypes/Number.js.map +1 -0
  86. package/dist/SpreadsheetView/models/ColumnDataTypes/Text.d.ts +28 -0
  87. package/dist/SpreadsheetView/models/ColumnDataTypes/Text.js +131 -0
  88. package/dist/SpreadsheetView/models/ColumnDataTypes/Text.js.map +1 -0
  89. package/dist/SpreadsheetView/models/ColumnDataTypes/index.d.ts +72 -0
  90. package/dist/SpreadsheetView/models/ColumnDataTypes/index.js +38 -0
  91. package/dist/SpreadsheetView/models/ColumnDataTypes/index.js.map +1 -0
  92. package/dist/SpreadsheetView/models/FilterControls.d.ts +26 -0
  93. package/dist/SpreadsheetView/models/FilterControls.js +88 -0
  94. package/dist/SpreadsheetView/models/FilterControls.js.map +1 -0
  95. package/dist/SpreadsheetView/models/ImportWizard.d.ts +31 -0
  96. package/dist/SpreadsheetView/models/ImportWizard.js +193 -0
  97. package/dist/SpreadsheetView/models/ImportWizard.js.map +1 -0
  98. package/dist/SpreadsheetView/models/Row.d.ts +17 -0
  99. package/dist/SpreadsheetView/models/Row.js +46 -0
  100. package/dist/SpreadsheetView/models/Row.js.map +1 -0
  101. package/dist/SpreadsheetView/models/Spreadsheet.d.ts +256 -0
  102. package/dist/SpreadsheetView/models/Spreadsheet.js +176 -0
  103. package/dist/SpreadsheetView/models/Spreadsheet.js.map +1 -0
  104. package/dist/SpreadsheetView/models/SpreadsheetView.d.ts +485 -0
  105. package/dist/SpreadsheetView/models/SpreadsheetView.js +204 -0
  106. package/dist/SpreadsheetView/models/SpreadsheetView.js.map +1 -0
  107. package/dist/SpreadsheetView/models/StaticRowSet.d.ts +163 -0
  108. package/dist/SpreadsheetView/models/StaticRowSet.js +60 -0
  109. package/dist/SpreadsheetView/models/StaticRowSet.js.map +1 -0
  110. package/dist/index.d.ts +8 -0
  111. package/dist/index.js +36 -0
  112. package/dist/index.js.map +1 -0
  113. package/esm/LaunchSpreadsheetView/index.d.ts +3 -0
  114. package/esm/LaunchSpreadsheetView/index.js +24 -0
  115. package/esm/LaunchSpreadsheetView/index.js.map +1 -0
  116. package/esm/SpreadsheetView/components/CellData.d.ts +9 -0
  117. package/esm/SpreadsheetView/components/CellData.js +11 -0
  118. package/esm/SpreadsheetView/components/CellData.js.map +1 -0
  119. package/esm/SpreadsheetView/components/ColumnFilterControls.d.ts +3 -0
  120. package/esm/SpreadsheetView/components/ColumnFilterControls.js +57 -0
  121. package/esm/SpreadsheetView/components/ColumnFilterControls.js.map +1 -0
  122. package/esm/SpreadsheetView/components/ColumnMenu.d.ts +16 -0
  123. package/esm/SpreadsheetView/components/ColumnMenu.js +122 -0
  124. package/esm/SpreadsheetView/components/ColumnMenu.js.map +1 -0
  125. package/esm/SpreadsheetView/components/DataRow.d.ts +12 -0
  126. package/esm/SpreadsheetView/components/DataRow.js +77 -0
  127. package/esm/SpreadsheetView/components/DataRow.js.map +1 -0
  128. package/esm/SpreadsheetView/components/DataTable.d.ts +10 -0
  129. package/esm/SpreadsheetView/components/DataTable.js +38 -0
  130. package/esm/SpreadsheetView/components/DataTable.js.map +1 -0
  131. package/esm/SpreadsheetView/components/DataTableHeader.d.ts +6 -0
  132. package/esm/SpreadsheetView/components/DataTableHeader.js +74 -0
  133. package/esm/SpreadsheetView/components/DataTableHeader.js.map +1 -0
  134. package/esm/SpreadsheetView/components/GlobalFilterControls.d.ts +5 -0
  135. package/esm/SpreadsheetView/components/GlobalFilterControls.js +36 -0
  136. package/esm/SpreadsheetView/components/GlobalFilterControls.js.map +1 -0
  137. package/esm/SpreadsheetView/components/ImportWizard.d.ts +6 -0
  138. package/esm/SpreadsheetView/components/ImportWizard.js +53 -0
  139. package/esm/SpreadsheetView/components/ImportWizard.js.map +1 -0
  140. package/esm/SpreadsheetView/components/NumberEditor.d.ts +9 -0
  141. package/esm/SpreadsheetView/components/NumberEditor.js +29 -0
  142. package/esm/SpreadsheetView/components/NumberEditor.js.map +1 -0
  143. package/esm/SpreadsheetView/components/RowCountMessage.d.ts +8 -0
  144. package/esm/SpreadsheetView/components/RowCountMessage.js +28 -0
  145. package/esm/SpreadsheetView/components/RowCountMessage.js.map +1 -0
  146. package/esm/SpreadsheetView/components/RowMenu.d.ts +9 -0
  147. package/esm/SpreadsheetView/components/RowMenu.js +34 -0
  148. package/esm/SpreadsheetView/components/RowMenu.js.map +1 -0
  149. package/esm/SpreadsheetView/components/SortIndicator.d.ts +6 -0
  150. package/esm/SpreadsheetView/components/SortIndicator.js +22 -0
  151. package/esm/SpreadsheetView/components/SortIndicator.js.map +1 -0
  152. package/esm/SpreadsheetView/components/Spreadsheet.d.ts +11 -0
  153. package/esm/SpreadsheetView/components/Spreadsheet.js +20 -0
  154. package/esm/SpreadsheetView/components/Spreadsheet.js.map +1 -0
  155. package/esm/SpreadsheetView/components/SpreadsheetView.d.ts +6 -0
  156. package/esm/SpreadsheetView/components/SpreadsheetView.js +58 -0
  157. package/esm/SpreadsheetView/components/SpreadsheetView.js.map +1 -0
  158. package/esm/SpreadsheetView/components/StatusBar.d.ts +11 -0
  159. package/esm/SpreadsheetView/components/StatusBar.js +37 -0
  160. package/esm/SpreadsheetView/components/StatusBar.js.map +1 -0
  161. package/esm/SpreadsheetView/components/util.d.ts +1 -0
  162. package/esm/SpreadsheetView/components/util.js +15 -0
  163. package/esm/SpreadsheetView/components/util.js.map +1 -0
  164. package/esm/SpreadsheetView/importAdapters/BedImport.d.ts +17 -0
  165. package/esm/SpreadsheetView/importAdapters/BedImport.js +141 -0
  166. package/esm/SpreadsheetView/importAdapters/BedImport.js.map +1 -0
  167. package/esm/SpreadsheetView/importAdapters/ImportUtils.d.ts +42 -0
  168. package/esm/SpreadsheetView/importAdapters/ImportUtils.js +95 -0
  169. package/esm/SpreadsheetView/importAdapters/ImportUtils.js.map +1 -0
  170. package/esm/SpreadsheetView/importAdapters/STARFusionImport.d.ts +9 -0
  171. package/esm/SpreadsheetView/importAdapters/STARFusionImport.js +69 -0
  172. package/esm/SpreadsheetView/importAdapters/STARFusionImport.js.map +1 -0
  173. package/esm/SpreadsheetView/importAdapters/VcfImport.d.ts +13 -0
  174. package/esm/SpreadsheetView/importAdapters/VcfImport.js +103 -0
  175. package/esm/SpreadsheetView/importAdapters/VcfImport.js.map +1 -0
  176. package/esm/SpreadsheetView/index.d.ts +4 -0
  177. package/esm/SpreadsheetView/index.js +14 -0
  178. package/esm/SpreadsheetView/index.js.map +1 -0
  179. package/esm/SpreadsheetView/models/ColumnDataTypes/LocEnd.d.ts +13 -0
  180. package/esm/SpreadsheetView/models/ColumnDataTypes/LocEnd.js +16 -0
  181. package/esm/SpreadsheetView/models/ColumnDataTypes/LocEnd.js.map +1 -0
  182. package/esm/SpreadsheetView/models/ColumnDataTypes/LocRef.d.ts +13 -0
  183. package/esm/SpreadsheetView/models/ColumnDataTypes/LocRef.js +16 -0
  184. package/esm/SpreadsheetView/models/ColumnDataTypes/LocRef.js.map +1 -0
  185. package/esm/SpreadsheetView/models/ColumnDataTypes/LocStart.d.ts +13 -0
  186. package/esm/SpreadsheetView/models/ColumnDataTypes/LocStart.js +16 -0
  187. package/esm/SpreadsheetView/models/ColumnDataTypes/LocStart.js.map +1 -0
  188. package/esm/SpreadsheetView/models/ColumnDataTypes/LocString.d.ts +13 -0
  189. package/esm/SpreadsheetView/models/ColumnDataTypes/LocString.js +185 -0
  190. package/esm/SpreadsheetView/models/ColumnDataTypes/LocString.js.map +1 -0
  191. package/esm/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.d.ts +19 -0
  192. package/esm/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js +21 -0
  193. package/esm/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js.map +1 -0
  194. package/esm/SpreadsheetView/models/ColumnDataTypes/Number.d.ts +30 -0
  195. package/esm/SpreadsheetView/models/ColumnDataTypes/Number.js +123 -0
  196. package/esm/SpreadsheetView/models/ColumnDataTypes/Number.js.map +1 -0
  197. package/esm/SpreadsheetView/models/ColumnDataTypes/Text.d.ts +28 -0
  198. package/esm/SpreadsheetView/models/ColumnDataTypes/Text.js +124 -0
  199. package/esm/SpreadsheetView/models/ColumnDataTypes/Text.js.map +1 -0
  200. package/esm/SpreadsheetView/models/ColumnDataTypes/index.d.ts +72 -0
  201. package/esm/SpreadsheetView/models/ColumnDataTypes/index.js +30 -0
  202. package/esm/SpreadsheetView/models/ColumnDataTypes/index.js.map +1 -0
  203. package/esm/SpreadsheetView/models/FilterControls.d.ts +26 -0
  204. package/esm/SpreadsheetView/models/FilterControls.js +86 -0
  205. package/esm/SpreadsheetView/models/FilterControls.js.map +1 -0
  206. package/esm/SpreadsheetView/models/ImportWizard.d.ts +31 -0
  207. package/esm/SpreadsheetView/models/ImportWizard.js +168 -0
  208. package/esm/SpreadsheetView/models/ImportWizard.js.map +1 -0
  209. package/esm/SpreadsheetView/models/Row.d.ts +17 -0
  210. package/esm/SpreadsheetView/models/Row.js +44 -0
  211. package/esm/SpreadsheetView/models/Row.js.map +1 -0
  212. package/esm/SpreadsheetView/models/Spreadsheet.d.ts +256 -0
  213. package/esm/SpreadsheetView/models/Spreadsheet.js +171 -0
  214. package/esm/SpreadsheetView/models/Spreadsheet.js.map +1 -0
  215. package/esm/SpreadsheetView/models/SpreadsheetView.d.ts +485 -0
  216. package/esm/SpreadsheetView/models/SpreadsheetView.js +199 -0
  217. package/esm/SpreadsheetView/models/SpreadsheetView.js.map +1 -0
  218. package/esm/SpreadsheetView/models/StaticRowSet.d.ts +163 -0
  219. package/esm/SpreadsheetView/models/StaticRowSet.js +55 -0
  220. package/esm/SpreadsheetView/models/StaticRowSet.js.map +1 -0
  221. package/esm/index.d.ts +8 -0
  222. package/esm/index.js +30 -0
  223. package/esm/index.js.map +1 -0
  224. package/package.json +65 -0
  225. package/src/LaunchSpreadsheetView/index.ts +40 -0
  226. package/src/SpreadsheetView/components/CellData.tsx +35 -0
  227. package/src/SpreadsheetView/components/ColumnFilterControls.tsx +84 -0
  228. package/src/SpreadsheetView/components/ColumnMenu.tsx +166 -0
  229. package/src/SpreadsheetView/components/DataRow.tsx +126 -0
  230. package/src/SpreadsheetView/components/DataTable.tsx +91 -0
  231. package/src/SpreadsheetView/components/DataTableHeader.tsx +122 -0
  232. package/src/SpreadsheetView/components/GlobalFilterControls.tsx +70 -0
  233. package/src/SpreadsheetView/components/ImportWizard.tsx +139 -0
  234. package/src/SpreadsheetView/components/NumberEditor.tsx +50 -0
  235. package/src/SpreadsheetView/components/RowCountMessage.tsx +44 -0
  236. package/src/SpreadsheetView/components/RowMenu.tsx +65 -0
  237. package/src/SpreadsheetView/components/SortIndicator.tsx +36 -0
  238. package/src/SpreadsheetView/components/Spreadsheet.test.ts +17 -0
  239. package/src/SpreadsheetView/components/Spreadsheet.tsx +46 -0
  240. package/src/SpreadsheetView/components/SpreadsheetView.tsx +119 -0
  241. package/src/SpreadsheetView/components/StatusBar.tsx +75 -0
  242. package/src/SpreadsheetView/components/util.ts +16 -0
  243. package/src/SpreadsheetView/importAdapters/BedImport.test.ts +14 -0
  244. package/src/SpreadsheetView/importAdapters/BedImport.ts +155 -0
  245. package/src/SpreadsheetView/importAdapters/ImportUtils.test.ts +25 -0
  246. package/src/SpreadsheetView/importAdapters/ImportUtils.ts +152 -0
  247. package/src/SpreadsheetView/importAdapters/STARFusionImport.test.ts +27 -0
  248. package/src/SpreadsheetView/importAdapters/STARFusionImport.ts +74 -0
  249. package/src/SpreadsheetView/importAdapters/VcfImport.test.ts +42 -0
  250. package/src/SpreadsheetView/importAdapters/VcfImport.ts +118 -0
  251. package/src/SpreadsheetView/importAdapters/__snapshots__/ImportUtils.test.ts.snap +6555 -0
  252. package/src/SpreadsheetView/importAdapters/__snapshots__/STARFusionImport.test.ts.snap +2354 -0
  253. package/src/SpreadsheetView/importAdapters/__snapshots__/VcfImport.test.ts.snap +16329 -0
  254. package/src/SpreadsheetView/index.ts +20 -0
  255. package/src/SpreadsheetView/models/ColumnDataTypes/LocEnd.ts +21 -0
  256. package/src/SpreadsheetView/models/ColumnDataTypes/LocRef.ts +21 -0
  257. package/src/SpreadsheetView/models/ColumnDataTypes/LocStart.ts +21 -0
  258. package/src/SpreadsheetView/models/ColumnDataTypes/LocString.tsx +328 -0
  259. package/src/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.tsx +38 -0
  260. package/src/SpreadsheetView/models/ColumnDataTypes/Number.tsx +177 -0
  261. package/src/SpreadsheetView/models/ColumnDataTypes/Text.tsx +173 -0
  262. package/src/SpreadsheetView/models/ColumnDataTypes/index.ts +34 -0
  263. package/src/SpreadsheetView/models/FilterControls.ts +95 -0
  264. package/src/SpreadsheetView/models/ImportWizard.ts +203 -0
  265. package/src/SpreadsheetView/models/Row.ts +46 -0
  266. package/src/SpreadsheetView/models/Spreadsheet.ts +209 -0
  267. package/src/SpreadsheetView/models/SpreadsheetView.test.ts +8 -0
  268. package/src/SpreadsheetView/models/SpreadsheetView.ts +243 -0
  269. package/src/SpreadsheetView/models/StaticRowSet.ts +65 -0
  270. package/src/SpreadsheetView/test_data/1801160099-N32519_26611_S51_56704.hard-filtered.vcf +174 -0
  271. package/src/SpreadsheetView/test_data/breast_cancer.subset.csv +50 -0
  272. package/src/SpreadsheetView/test_data/diabetes_target.csv.gz +0 -0
  273. package/src/SpreadsheetView/test_data/foo.bed +11 -0
  274. package/src/SpreadsheetView/test_data/location_test.csv +3 -0
  275. package/src/SpreadsheetView/test_data/location_test_2.csv +3 -0
  276. package/src/SpreadsheetView/test_data/reads_lr_skbr3.fa_ngmlr-0.2.3_mapped.bam.sniffles1kb_auto_l8_s5_noalt.bedpe +1405 -0
  277. package/src/SpreadsheetView/test_data/starfusion_example.fusion_predictions.tsv +25 -0
  278. package/src/SpreadsheetView/test_data/volvox.sort.bed +109 -0
  279. package/src/index.ts +38 -0
@@ -0,0 +1,139 @@
1
+ import React, { useState } from 'react'
2
+ import {
3
+ Button,
4
+ Checkbox,
5
+ FormControl,
6
+ FormGroup,
7
+ FormLabel,
8
+ FormControlLabel,
9
+ RadioGroup,
10
+ Radio,
11
+ } from '@mui/material'
12
+ import { observer } from 'mobx-react'
13
+ import { getRoot } from 'mobx-state-tree'
14
+ import { AbstractRootModel, getSession } from '@jbrowse/core/util'
15
+ import { FileSelector, ErrorMessage, AssemblySelector } from '@jbrowse/core/ui'
16
+
17
+ // locals
18
+ import { ImportWizardModel } from '../models/ImportWizard'
19
+ import NumberEditor from './NumberEditor'
20
+ import { makeStyles } from 'tss-react/mui'
21
+
22
+ const useStyles = makeStyles()({
23
+ container: {
24
+ margin: '0 auto',
25
+ maxWidth: '25em',
26
+ padding: 20,
27
+ },
28
+ })
29
+
30
+ const ImportWizard = observer(({ model }: { model: ImportWizardModel }) => {
31
+ const session = getSession(model)
32
+ const { classes } = useStyles()
33
+ const { assemblyNames, assemblyManager } = session
34
+ const {
35
+ fileType,
36
+ canCancel,
37
+ fileSource,
38
+ isReadyToOpen,
39
+ fileTypes,
40
+ hasColumnNameLine,
41
+ error,
42
+ } = model
43
+ const [selected, setSelected] = useState(assemblyNames[0])
44
+ const err = assemblyManager.get(selected)?.error || error
45
+ const showRowControls = fileType === 'CSV' || fileType === 'TSV'
46
+ const rootModel = getRoot(model)
47
+
48
+ return (
49
+ <div className={classes.container}>
50
+ {err ? <ErrorMessage error={err} /> : null}
51
+ <div>
52
+ <FormControl component="fieldset">
53
+ <FormLabel component="legend">Tabular file</FormLabel>
54
+ <FormGroup>
55
+ <FileSelector
56
+ location={fileSource}
57
+ setLocation={arg => model.setFileSource(arg)}
58
+ rootModel={rootModel as AbstractRootModel}
59
+ />
60
+ </FormGroup>
61
+ </FormControl>
62
+ </div>
63
+ <div>
64
+ <FormControl component="fieldset">
65
+ <FormLabel component="legend">File Type</FormLabel>
66
+ <RadioGroup row aria-label="file type" name="type" value={fileType}>
67
+ {fileTypes.map(fileTypeName => (
68
+ <FormControlLabel
69
+ key={fileTypeName}
70
+ checked={fileType === fileTypeName}
71
+ value={fileTypeName}
72
+ onClick={() => model.setFileType(fileTypeName)}
73
+ control={<Radio />}
74
+ label={fileTypeName}
75
+ />
76
+ ))}
77
+ </RadioGroup>
78
+ </FormControl>
79
+ </div>
80
+ {showRowControls ? (
81
+ <div>
82
+ <FormControl component="fieldset">
83
+ <FormLabel component="legend">Column Names</FormLabel>
84
+ <FormControlLabel
85
+ disabled={!showRowControls}
86
+ label="has column names on line"
87
+ labelPlacement="end"
88
+ control={
89
+ <Checkbox
90
+ checked={hasColumnNameLine}
91
+ onClick={() => model.toggleHasColumnNameLine()}
92
+ />
93
+ }
94
+ />
95
+ <NumberEditor
96
+ model={model}
97
+ disabled={!showRowControls || !hasColumnNameLine}
98
+ modelPropName="columnNameLineNumber"
99
+ modelSetterName="setColumnNameLineNumber"
100
+ />
101
+ </FormControl>
102
+ </div>
103
+ ) : null}
104
+ <div>
105
+ <AssemblySelector
106
+ session={session}
107
+ selected={selected}
108
+ onChange={val => setSelected(val)}
109
+ />
110
+ </div>
111
+ <div>
112
+ {canCancel ? (
113
+ <Button
114
+ variant="contained"
115
+ color="secondary"
116
+ onClick={() => model.cancelButton()}
117
+ disabled={!canCancel}
118
+ >
119
+ Cancel
120
+ </Button>
121
+ ) : null}{' '}
122
+ <Button
123
+ disabled={!isReadyToOpen || !!err}
124
+ variant="contained"
125
+ data-testid="open_spreadsheet"
126
+ color="primary"
127
+ onClick={() => {
128
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
129
+ model.import(selected)
130
+ }}
131
+ >
132
+ Open
133
+ </Button>
134
+ </div>
135
+ </div>
136
+ )
137
+ })
138
+
139
+ export default ImportWizard
@@ -0,0 +1,50 @@
1
+ import React, { useState, useEffect } from 'react'
2
+ import { TextField } from '@mui/material'
3
+ import { makeStyles } from 'tss-react/mui'
4
+ import { observer } from 'mobx-react'
5
+
6
+ // locals
7
+ import { ImportWizardModel } from '../models/ImportWizard'
8
+
9
+ const useStyles = makeStyles()({
10
+ textField: {
11
+ width: '2rem',
12
+ verticalAlign: 'baseline',
13
+ },
14
+ })
15
+
16
+ export default observer(function ({
17
+ model,
18
+ disabled,
19
+ modelPropName,
20
+ modelSetterName,
21
+ }: {
22
+ model: ImportWizardModel
23
+ disabled: boolean
24
+ modelPropName: string
25
+ modelSetterName: string
26
+ }) {
27
+ // @ts-expect-error
28
+ const [val, setVal] = useState(model[modelPropName])
29
+ const { classes } = useStyles()
30
+ useEffect(() => {
31
+ const num = Number.parseInt(val, 10)
32
+ if (!Number.isNaN(num)) {
33
+ if (num > 0) {
34
+ // @ts-expect-error
35
+ model[modelSetterName](num)
36
+ } else {
37
+ setVal(1)
38
+ }
39
+ }
40
+ }, [model, modelSetterName, val])
41
+ return (
42
+ <TextField
43
+ value={val}
44
+ disabled={disabled}
45
+ type="number"
46
+ onChange={evt => setVal(evt.target.value)}
47
+ className={classes.textField}
48
+ />
49
+ )
50
+ })
@@ -0,0 +1,44 @@
1
+ import React from 'react'
2
+ import { observer } from 'mobx-react'
3
+ import { Instance } from 'mobx-state-tree'
4
+
5
+ // locals
6
+ import SpreadsheetStateModel from '../models/Spreadsheet'
7
+
8
+ type SpreadsheetModel = Instance<typeof SpreadsheetStateModel>
9
+
10
+ const RowCountMessage = observer(function ({
11
+ spreadsheet,
12
+ }: {
13
+ spreadsheet: SpreadsheetModel
14
+ }) {
15
+ if (spreadsheet.rowSet.isLoaded) {
16
+ const {
17
+ passingFiltersCount,
18
+ count,
19
+ selectedCount,
20
+ selectedAndPassingFiltersCount,
21
+ } = spreadsheet.rowSet
22
+
23
+ let rowMessage
24
+ if (passingFiltersCount !== count) {
25
+ rowMessage = `${spreadsheet.rowSet.passingFiltersCount} rows of ${spreadsheet.rowSet.count} total`
26
+ if (selectedCount) {
27
+ rowMessage += `, ${selectedAndPassingFiltersCount} selected`
28
+ const selectedAndNotPassingFiltersCount =
29
+ selectedCount - selectedAndPassingFiltersCount
30
+ if (selectedAndNotPassingFiltersCount) {
31
+ rowMessage += ` (${selectedAndNotPassingFiltersCount} selected rows do not pass filters)`
32
+ }
33
+ }
34
+ } else {
35
+ rowMessage = `${spreadsheet.rowSet.count} rows`
36
+ if (selectedCount) {
37
+ rowMessage += `, ${selectedCount} selected`
38
+ }
39
+ }
40
+ return <>{rowMessage}</>
41
+ }
42
+ return null
43
+ })
44
+ export default RowCountMessage
@@ -0,0 +1,65 @@
1
+ import React from 'react'
2
+ import { observer } from 'mobx-react'
3
+ import { Menu, MenuItem } from '@jbrowse/core/ui'
4
+ import { Instance } from 'mobx-state-tree'
5
+
6
+ // locals
7
+ import SpreadsheetModel from '../models/Spreadsheet'
8
+ import ViewModel from '../models/SpreadsheetView'
9
+
10
+ const RowMenu = observer(function ({
11
+ viewModel,
12
+ spreadsheetModel,
13
+ }: {
14
+ viewModel: Instance<typeof ViewModel>
15
+ spreadsheetModel: Instance<typeof SpreadsheetModel>
16
+ }) {
17
+ const currentRowMenu = spreadsheetModel.rowMenuPosition
18
+ const { setRowMenuPosition } = spreadsheetModel
19
+
20
+ const rowMenuClose = () => {
21
+ setRowMenuPosition(null)
22
+ }
23
+
24
+ const rowNumber = spreadsheetModel.rowMenuPosition?.rowNumber
25
+ if (rowNumber === undefined) {
26
+ return null
27
+ }
28
+
29
+ const row = spreadsheetModel.rowSet.rows[+rowNumber - 1]
30
+
31
+ function handleMenuItemClick(_event: unknown, callback: Function) {
32
+ callback(viewModel, spreadsheetModel, rowNumber, row)
33
+ rowMenuClose()
34
+ }
35
+
36
+ // got through and evaluate all the `disabled` callbacks of the menu items
37
+ const menuItems: MenuItem[] = viewModel.rowMenuItems.map(item => {
38
+ if (typeof item.disabled === 'function') {
39
+ const disabled = item.disabled(
40
+ viewModel,
41
+ spreadsheetModel,
42
+ +rowNumber,
43
+ row,
44
+ )
45
+ return { ...item, disabled }
46
+ }
47
+ return item
48
+ })
49
+
50
+ return (
51
+ <Menu
52
+ anchorEl={currentRowMenu && currentRowMenu.anchorEl}
53
+ open={Boolean(currentRowMenu)}
54
+ onMenuItemClick={handleMenuItemClick}
55
+ onClose={rowMenuClose}
56
+ menuItems={menuItems}
57
+ anchorOrigin={{
58
+ vertical: 'bottom',
59
+ horizontal: 'right',
60
+ }}
61
+ />
62
+ )
63
+ })
64
+
65
+ export default RowMenu
@@ -0,0 +1,36 @@
1
+ import React from 'react'
2
+ import { makeStyles } from 'tss-react/mui'
3
+
4
+ // icons
5
+ import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'
6
+ import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'
7
+ import { SpreadsheetModel } from '../models/Spreadsheet'
8
+
9
+ const useStyles = makeStyles()({
10
+ sortIndicator: {
11
+ position: 'relative',
12
+ top: '0.2rem',
13
+ fontSize: '1rem',
14
+ },
15
+ })
16
+
17
+ export default function SortIndicator({
18
+ model,
19
+ columnNumber,
20
+ }: {
21
+ model: SpreadsheetModel
22
+ columnNumber: number
23
+ }) {
24
+ const { classes } = useStyles()
25
+ const sortSpec = model.sortColumns.find(c => c.columnNumber === columnNumber)
26
+
27
+ if (sortSpec) {
28
+ const { descending } = sortSpec
29
+ return descending ? (
30
+ <KeyboardArrowUpIcon className={classes.sortIndicator} />
31
+ ) : (
32
+ <KeyboardArrowDownIcon className={classes.sortIndicator} />
33
+ )
34
+ }
35
+ return null
36
+ }
@@ -0,0 +1,17 @@
1
+ import { numToColName } from './util'
2
+
3
+ describe('num to col name', () => {
4
+ const cases = [
5
+ [10, 'K'],
6
+ [26, 'AA'],
7
+ [0, 'A'],
8
+ [25, 'Z'],
9
+ [27 * 26 - 1, 'ZZ'],
10
+ ] as const
11
+
12
+ cases.forEach(([input, output]) => {
13
+ test(`${input} -> ${output}`, () => {
14
+ expect(numToColName(input)).toBe(output)
15
+ })
16
+ })
17
+ })
@@ -0,0 +1,46 @@
1
+ import React from 'react'
2
+ import { observer } from 'mobx-react'
3
+ import { Instance } from 'mobx-state-tree'
4
+ import { makeStyles } from 'tss-react/mui'
5
+
6
+ // locals
7
+ import SpreadsheetStateModel from '../models/Spreadsheet'
8
+ import { LoadingEllipses } from '@jbrowse/core/ui'
9
+ import DataTable from './DataTable'
10
+
11
+ type SpreadsheetModel = Instance<typeof SpreadsheetStateModel>
12
+
13
+ const useStyles = makeStyles()(theme => ({
14
+ root: {
15
+ position: 'relative',
16
+ marginBottom: theme.spacing(1),
17
+ background: theme.palette.background.paper,
18
+ overflow: 'auto',
19
+ },
20
+ }))
21
+
22
+ const Spreadsheet = observer(function ({
23
+ model,
24
+ height,
25
+ page,
26
+ rowsPerPage,
27
+ }: {
28
+ model: SpreadsheetModel
29
+ height: number
30
+ page: number
31
+ rowsPerPage: number
32
+ }) {
33
+ const { classes } = useStyles()
34
+
35
+ return (
36
+ <div className={classes.root} style={{ height }}>
37
+ {model?.rowSet?.isLoaded && model.initialized ? (
38
+ <DataTable model={model} page={page} rowsPerPage={rowsPerPage} />
39
+ ) : (
40
+ <LoadingEllipses variant="h6" />
41
+ )}
42
+ </div>
43
+ )
44
+ })
45
+
46
+ export default Spreadsheet
@@ -0,0 +1,119 @@
1
+ import React, { useState } from 'react'
2
+ import { Grid } from '@mui/material'
3
+ import { makeStyles } from 'tss-react/mui'
4
+ import { observer } from 'mobx-react'
5
+ import { ResizeHandle } from '@jbrowse/core/ui'
6
+
7
+ // locals
8
+ import ImportWizard from './ImportWizard'
9
+ import Spreadsheet from './Spreadsheet'
10
+ import GlobalFilterControls from './GlobalFilterControls'
11
+ import ColumnFilterControls from './ColumnFilterControls'
12
+ import { SpreadsheetViewModel } from '../models/SpreadsheetView'
13
+ import StatusBar from './StatusBar'
14
+
15
+ const headerHeight = 52
16
+ const colFilterHeight = 46
17
+ const statusBarHeight = 40
18
+
19
+ const useStyles = makeStyles()(theme => ({
20
+ header: {
21
+ overflow: 'hidden',
22
+ whiteSpace: 'nowrap',
23
+ boxSizing: 'border-box',
24
+ height: headerHeight,
25
+ paddingLeft: theme.spacing(1),
26
+ },
27
+ contentArea: {
28
+ overflow: 'auto',
29
+ },
30
+ resizeHandle: {
31
+ height: 3,
32
+ position: 'absolute',
33
+ bottom: 0,
34
+ left: 0,
35
+ background: theme.palette.action.disabled,
36
+ boxSizing: 'border-box',
37
+ borderTop: '1px solid #fafafa',
38
+ },
39
+ }))
40
+
41
+ export default observer(function ({ model }: { model: SpreadsheetViewModel }) {
42
+ const { classes } = useStyles()
43
+ const {
44
+ spreadsheet,
45
+ filterControls,
46
+ hideFilterControls,
47
+ hideVerticalResizeHandle,
48
+ mode,
49
+ height,
50
+ } = model
51
+ const [page, setPage] = useState(0)
52
+ const [rowsPerPage, setRowsPerPage] = useState(100)
53
+
54
+ return (
55
+ <div>
56
+ {mode !== 'display' || hideFilterControls ? null : (
57
+ <>
58
+ <Grid container direction="row" className={classes.header}>
59
+ <Grid item>
60
+ <GlobalFilterControls model={model} />
61
+ </Grid>
62
+ </Grid>
63
+ {filterControls.columnFilters.map((f, i) => (
64
+ <ColumnFilterControls
65
+ key={`${f.columnNumber}-${i}`}
66
+ viewModel={model}
67
+ filterModel={f}
68
+ columnNumber={f.columnNumber}
69
+ height={colFilterHeight}
70
+ />
71
+ ))}
72
+ </>
73
+ )}
74
+
75
+ {mode === 'import' ? (
76
+ <ImportWizard model={model.importWizard} />
77
+ ) : (
78
+ <div className={classes.contentArea}>
79
+ <div
80
+ style={{
81
+ position: 'relative',
82
+ display: mode === 'display' ? undefined : 'none',
83
+ }}
84
+ >
85
+ {spreadsheet ? (
86
+ <Spreadsheet
87
+ page={page}
88
+ rowsPerPage={rowsPerPage}
89
+ model={spreadsheet}
90
+ height={
91
+ height -
92
+ headerHeight -
93
+ filterControls.columnFilters.length * colFilterHeight -
94
+ statusBarHeight
95
+ }
96
+ />
97
+ ) : null}
98
+ </div>
99
+ </div>
100
+ )}
101
+ {spreadsheet ? (
102
+ <StatusBar
103
+ page={page}
104
+ setPage={setPage}
105
+ rowsPerPage={rowsPerPage}
106
+ setRowsPerPage={setRowsPerPage}
107
+ mode={mode}
108
+ spreadsheet={spreadsheet}
109
+ />
110
+ ) : null}
111
+ {hideVerticalResizeHandle ? null : (
112
+ <ResizeHandle
113
+ onDrag={model.resizeHeight}
114
+ className={classes.resizeHandle}
115
+ />
116
+ )}
117
+ </div>
118
+ )
119
+ })
@@ -0,0 +1,75 @@
1
+ import React from 'react'
2
+ import { FormGroup, TablePagination } from '@mui/material'
3
+ import { makeStyles } from 'tss-react/mui'
4
+
5
+ // locals
6
+ import RowCountMessage from './RowCountMessage'
7
+ import { SpreadsheetModel } from '../models/Spreadsheet'
8
+ import { observer } from 'mobx-react'
9
+
10
+ const statusBarHeight = 40
11
+
12
+ const useStyles = makeStyles()(theme => ({
13
+ statusBar: {
14
+ height: statusBarHeight,
15
+ boxSizing: 'border-box',
16
+ borderTop: '1px outset #b1b1b1',
17
+ paddingLeft: theme.spacing(1),
18
+ },
19
+ verticallyCenter: {
20
+ display: 'flex',
21
+ justifyContent: 'center',
22
+ flexDirection: 'column',
23
+ },
24
+ spacer: {
25
+ flexGrow: 1,
26
+ },
27
+ }))
28
+
29
+ const StatusBar = observer(function StatusBar({
30
+ page,
31
+ rowsPerPage,
32
+ setPage,
33
+ setRowsPerPage,
34
+ spreadsheet,
35
+ mode,
36
+ }: {
37
+ page: number
38
+ mode: string
39
+ spreadsheet: SpreadsheetModel
40
+ rowsPerPage: number
41
+ setPage: (arg: number) => void
42
+ setRowsPerPage: (arg: number) => void
43
+ }) {
44
+ const { classes } = useStyles()
45
+ return (
46
+ <div
47
+ className={classes.statusBar}
48
+ style={{ display: mode === 'display' ? undefined : 'none' }}
49
+ >
50
+ {spreadsheet ? (
51
+ <FormGroup row>
52
+ <div className={classes.verticallyCenter}>
53
+ <RowCountMessage spreadsheet={spreadsheet} />
54
+ </div>
55
+ <div className={classes.spacer} />
56
+ <TablePagination
57
+ rowsPerPageOptions={[10, 25, 100, 1000]}
58
+ count={spreadsheet.rowSet.count}
59
+ component="div"
60
+ rowsPerPage={rowsPerPage}
61
+ page={page}
62
+ onPageChange={(_, newPage) => setPage(newPage)}
63
+ onRowsPerPageChange={event => {
64
+ setRowsPerPage(+event.target.value)
65
+ setPage(0)
66
+ }}
67
+ />
68
+ <div className={classes.spacer} />
69
+ </FormGroup>
70
+ ) : null}
71
+ </div>
72
+ )
73
+ })
74
+
75
+ export default StatusBar
@@ -0,0 +1,16 @@
1
+ function letterFor(n: number) {
2
+ return String.fromCharCode(n + 65)
3
+ }
4
+
5
+ export function numToColName(num: number) {
6
+ if (num >= 0) {
7
+ if (num < 26) {
8
+ return letterFor(num)
9
+ }
10
+ if (num < 27 * 26) {
11
+ return letterFor(Math.floor(num / 26 - 1)) + letterFor(num % 26)
12
+ }
13
+ }
14
+
15
+ throw new RangeError('column number out of range')
16
+ }
@@ -0,0 +1,14 @@
1
+ import { promises as fsPromises } from 'fs'
2
+ import path from 'path'
3
+
4
+ import { removeBedHeaders } from './BedImport'
5
+
6
+ test('bed header trimming', async () => {
7
+ const filepath = path.join(__dirname, '..', 'test_data', 'foo.bed')
8
+ const buf = await fsPromises.readFile(filepath)
9
+ expect(buf[0]).toEqual(98)
10
+ expect(buf[1]).toEqual(114)
11
+ const trimmedBuffer = removeBedHeaders(buf)
12
+ expect(trimmedBuffer[0]).toEqual(99)
13
+ expect(trimmedBuffer.length).toBe(275)
14
+ })