@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,173 @@
1
+ import React from 'react'
2
+ import {
3
+ IconButton,
4
+ TextField,
5
+ MenuItem,
6
+ InputAdornment,
7
+ Select,
8
+ } from '@mui/material'
9
+ import { makeStyles } from 'tss-react/mui'
10
+ import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType'
11
+ import { types, getPropertyMembers } from 'mobx-state-tree'
12
+ import { observer } from 'mobx-react'
13
+ import {
14
+ getPropertyType,
15
+ getEnumerationValues,
16
+ getSubType,
17
+ } from '@jbrowse/core/util/mst-reflection'
18
+
19
+ // icons
20
+ import ClearIcon from '@mui/icons-material/Clear'
21
+
22
+ const OPERATIONS = [
23
+ 'equals',
24
+ 'contains',
25
+ 'does not contain',
26
+ 'does not equal',
27
+ 'starts with',
28
+ 'ends with',
29
+ ]
30
+
31
+ // NOTE: assembly names, if present, are ignored in all of these predicates
32
+ const OPERATION_PREDICATES = {
33
+ contains: (textInCell, stringToFind) => {
34
+ return textInCell.toLowerCase().includes(stringToFind)
35
+ },
36
+ equals: (textInCell, stringToFind) => {
37
+ return textInCell.toLowerCase() === stringToFind
38
+ },
39
+ 'starts with': (textInCell, stringToFind) => {
40
+ return textInCell.toLowerCase().indexOf(stringToFind) === 0
41
+ },
42
+ 'ends with': (textInCell, stringToFind) => {
43
+ const index = textInCell.toLowerCase().indexOf(stringToFind)
44
+ if (index === -1) {
45
+ return false
46
+ }
47
+ return index === textInCell.length - stringToFind.length
48
+ },
49
+ } as { [key: string]: (a: string, b: string) => boolean }
50
+
51
+ OPERATION_PREDICATES['does not contain'] = (textInCell, stringToFind) => {
52
+ return !OPERATION_PREDICATES.contains(textInCell, stringToFind)
53
+ }
54
+ OPERATION_PREDICATES['does not equal'] = (textInCell, stringToFind) => {
55
+ return !OPERATION_PREDICATES.equals(textInCell, stringToFind)
56
+ }
57
+
58
+ const useStyles = makeStyles()({
59
+ textFilterControlAdornment: { marginRight: '-18px' },
60
+ textFilterControl: {
61
+ margin: 0,
62
+ '& .MuiInput-formControl': {
63
+ marginTop: 8,
64
+ },
65
+ '& .MuiInputLabel-formControl': {
66
+ top: '-7px',
67
+ '&.MuiInputLabel-shrink': {
68
+ top: '-3px',
69
+ },
70
+ },
71
+ },
72
+ })
73
+
74
+ // React component for the column filter control
75
+ const FilterReactComponent = observer(
76
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
77
+ ({ filterModel }: { filterModel: any }) => {
78
+ const { classes } = useStyles()
79
+ const operationChoices = getEnumerationValues(
80
+ getSubType(getPropertyType(getPropertyMembers(filterModel), 'operation')),
81
+ )
82
+ return (
83
+ <>
84
+ <Select
85
+ value={filterModel.operation}
86
+ onChange={event => {
87
+ filterModel.setOperation(String(event.target.value))
88
+ }}
89
+ >
90
+ {operationChoices.map(name => (
91
+ <MenuItem key={name} value={name}>
92
+ {name}
93
+ </MenuItem>
94
+ ))}
95
+ </Select>{' '}
96
+ <TextField
97
+ label="text"
98
+ value={filterModel.stringToFind}
99
+ onChange={evt => filterModel.setString(evt.target.value)}
100
+ className={classes.textFilterControl}
101
+ InputProps={{
102
+ endAdornment: (
103
+ <InputAdornment
104
+ className={classes.textFilterControlAdornment}
105
+ position="end"
106
+ >
107
+ <IconButton
108
+ aria-label="clear filter"
109
+ onClick={() => filterModel.setString('')}
110
+ >
111
+ <ClearIcon />
112
+ </IconButton>
113
+ </InputAdornment>
114
+ ),
115
+ }}
116
+ />
117
+ </>
118
+ )
119
+ },
120
+ )
121
+
122
+ // MST model for the column filter control
123
+ const ColumnTextFilter = types
124
+ .model('ColumnTextFilter', {
125
+ type: types.literal('Text'),
126
+ columnNumber: types.integer,
127
+ stringToFind: '',
128
+ operation: types.optional(types.enumeration(OPERATIONS), OPERATIONS[0]),
129
+ })
130
+ .views(self => ({
131
+ // returns a function that tests the given row
132
+ get predicate() {
133
+ const { stringToFind, columnNumber, operation } = self // avoid closing over self
134
+ if (!stringToFind) {
135
+ return function alwaysTrue() {
136
+ return true
137
+ }
138
+ }
139
+ const s = stringToFind.toLowerCase() // case insensitive match
140
+
141
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
142
+ return function stringPredicate(_sheet: any, row: any) {
143
+ const { cellsWithDerived } = row
144
+ const cell = cellsWithDerived[columnNumber]
145
+ if (!cell || !cell.text) {
146
+ return false
147
+ }
148
+ const predicate = OPERATION_PREDICATES[operation]
149
+ if (!predicate) {
150
+ throw new Error(`"${operation}" not implemented in location filter`)
151
+ }
152
+ return predicate(cell.text, s)
153
+ }
154
+ },
155
+ }))
156
+ .actions(self => ({
157
+ setString(s: string) {
158
+ self.stringToFind = s
159
+ },
160
+ setOperation(op: string) {
161
+ self.operation = op
162
+ },
163
+ }))
164
+ .volatile(() => ({ ReactComponent: FilterReactComponent }))
165
+
166
+ const TextColumnType = MakeSpreadsheetColumnType('Text', {
167
+ compare(cellA: { text: string }, cellB: { text: string }) {
168
+ return cellA.text.localeCompare(cellB.text)
169
+ },
170
+ FilterModelType: ColumnTextFilter,
171
+ })
172
+
173
+ export { TextColumnType as TextColumn, ColumnTextFilter as FilterModelType }
@@ -0,0 +1,34 @@
1
+ import LocString from './LocString'
2
+ import LocRef from './LocRef'
3
+ import LocStart from './LocStart'
4
+ import LocEnd from './LocEnd'
5
+ import { NumberColumn as Number } from './Number'
6
+ import { TextColumn as Text } from './Text'
7
+ import { types, IAnyModelType } from 'mobx-state-tree'
8
+
9
+ const ColumnTypes = {
10
+ Number,
11
+ Text,
12
+ LocString,
13
+ LocRef,
14
+ LocStart,
15
+ LocEnd,
16
+ }
17
+
18
+ const allColumnTypes = Object.values(ColumnTypes)
19
+ const AnyColumnType = types.union(...allColumnTypes)
20
+ const AnyFilterModelType = types.union(
21
+ ...allColumnTypes
22
+ .map(columnType => {
23
+ // just instantiate the blank types to get their filter model types
24
+ const { FilterModelType } = columnType.create({
25
+ // @ts-expect-error
26
+ type: columnType.properties.type.value,
27
+ })
28
+ return FilterModelType as unknown as IAnyModelType
29
+ })
30
+ // some column types might not have filter machinery, filter those out
31
+ .filter(t => !!t),
32
+ )
33
+
34
+ export { ColumnTypes, AnyColumnType, AnyFilterModelType }
@@ -0,0 +1,95 @@
1
+ import { types, getParent, SnapshotIn } from 'mobx-state-tree'
2
+ import { AnyFilterModelType as AnyColumnFilter } from './ColumnDataTypes'
3
+
4
+ // filter that finds a simple string in any of the cells of a row
5
+ const RowFullTextFilter = types
6
+ .model('RowFullTextFilter', {
7
+ type: types.literal('RowFullText'),
8
+ stringToFind: '',
9
+ })
10
+ .views(self => ({
11
+ // returns a function that tests the given row
12
+ get predicate() {
13
+ let s = self.stringToFind // avoid closing over self
14
+ if (!s) {
15
+ return function alwaysTrue() {
16
+ return true
17
+ }
18
+ }
19
+ s = s.toLowerCase()
20
+ return function stringPredicate(
21
+ _sheet: unknown,
22
+ row: { cellsWithDerived: { text: string }[] },
23
+ ) {
24
+ const { cellsWithDerived } = row
25
+ for (const cell of cellsWithDerived) {
26
+ // note: case insensitive
27
+ if (cell.text && cell.text.toLowerCase().includes(s)) {
28
+ return true
29
+ }
30
+ }
31
+ return false
32
+ }
33
+ },
34
+ }))
35
+ .actions(self => ({
36
+ setString(s: string) {
37
+ self.stringToFind = s
38
+ },
39
+ clear() {
40
+ self.stringToFind = ''
41
+ },
42
+ }))
43
+
44
+ const model = types
45
+ .model('SpreadsheetFilterControls', {
46
+ rowFullText: types.optional(
47
+ RowFullTextFilter,
48
+ () =>
49
+ ({
50
+ type: 'RowFullText',
51
+ stringToFind: '',
52
+ } as SnapshotIn<typeof RowFullTextFilter>),
53
+ ),
54
+ columnFilters: types.array(AnyColumnFilter),
55
+ })
56
+ .views(self => ({
57
+ get filters() {
58
+ return [self.rowFullText, ...self.columnFilters].filter(f => !!f)
59
+ },
60
+ setRowFullTextFilter(stringToFind: string) {
61
+ // @ts-expect-error
62
+ self.rowFullText = {
63
+ type: 'RowFullText',
64
+ stringToFind,
65
+ }
66
+ },
67
+ rowPassesFilters(sheet: unknown, row: unknown) {
68
+ for (let i = 0; i < this.filters.length; i += 1) {
69
+ if (!this.filters[i].predicate(sheet, row)) {
70
+ return false
71
+ }
72
+ }
73
+ return true
74
+ },
75
+ }))
76
+ .actions(self => ({
77
+ addBlankColumnFilter(columnNumber: number) {
78
+ const { dataType } =
79
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
80
+ getParent<any>(self).spreadsheet.columns[columnNumber]
81
+ self.columnFilters.push({
82
+ type: dataType.type,
83
+ columnNumber,
84
+ })
85
+ },
86
+ removeColumnFilter(filter: typeof AnyColumnFilter) {
87
+ return self.columnFilters.remove(filter)
88
+ },
89
+ clearAllFilters() {
90
+ self.columnFilters.clear()
91
+ self.rowFullText.clear()
92
+ },
93
+ }))
94
+
95
+ export default model
@@ -0,0 +1,203 @@
1
+ import { types, getParent, Instance } from 'mobx-state-tree'
2
+ import { openLocation } from '@jbrowse/core/util/io'
3
+ import { getSession, getEnv } from '@jbrowse/core/util'
4
+
5
+ // 30MB
6
+ const IMPORT_SIZE_LIMIT = 30_000_000
7
+
8
+ const fileTypes = ['CSV', 'TSV', 'VCF', 'BED', 'BEDPE', 'STAR-Fusion']
9
+ const fileTypeParsers = {
10
+ CSV: () =>
11
+ import('../importAdapters/ImportUtils').then(r => r.parseCsvBuffer),
12
+ TSV: () =>
13
+ import('../importAdapters/ImportUtils').then(r => r.parseTsvBuffer),
14
+ VCF: () => import('../importAdapters/VcfImport').then(r => r.parseVcfBuffer),
15
+ BED: () => import('../importAdapters/BedImport').then(r => r.parseBedBuffer),
16
+ BEDPE: () =>
17
+ import('../importAdapters/BedImport').then(r => r.parseBedPEBuffer),
18
+ 'STAR-Fusion': () =>
19
+ import('../importAdapters/STARFusionImport').then(
20
+ r => r.parseSTARFusionBuffer,
21
+ ),
22
+ }
23
+ // regexp used to guess the type of a file or URL from its file extension
24
+ const fileTypesRegexp = new RegExp(`\\.(${fileTypes.join('|')})(\\.gz)?$`, 'i')
25
+
26
+ /**
27
+ * #stateModel SpreadsheetImportWizard
28
+ * #category view
29
+ */
30
+ function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars
31
+
32
+ const ImportWizard = types
33
+ .model('SpreadsheetImportWizard', {
34
+ /**
35
+ * #property
36
+ */
37
+ fileType: types.optional(types.enumeration(fileTypes), 'CSV'),
38
+ /**
39
+ * #property
40
+ */
41
+ hasColumnNameLine: true,
42
+ /**
43
+ * #property
44
+ */
45
+ columnNameLineNumber: 1,
46
+ /**
47
+ * #property
48
+ */
49
+ selectedAssemblyName: types.maybe(types.string),
50
+ })
51
+ .volatile(() => ({
52
+ fileTypes,
53
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
54
+ fileSource: undefined as any,
55
+ error: undefined as unknown,
56
+ loading: false,
57
+ }))
58
+ .views(self => ({
59
+ get isReadyToOpen() {
60
+ return (
61
+ !self.error &&
62
+ self.fileSource &&
63
+ (self.fileSource.blobId ||
64
+ self.fileSource.localPath ||
65
+ self.fileSource.uri)
66
+ )
67
+ },
68
+ get canCancel() {
69
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
70
+ return getParent<any>(self).readyToDisplay
71
+ },
72
+
73
+ get fileName() {
74
+ return (
75
+ self.fileSource.uri ||
76
+ self.fileSource.localPath ||
77
+ (self.fileSource.blobId && self.fileSource.name)
78
+ )
79
+ },
80
+
81
+ get requiresUnzip() {
82
+ return this.fileName.endsWith('gz')
83
+ },
84
+
85
+ isValidRefName(refName: string, assemblyName?: string) {
86
+ const { assemblyManager } = getSession(self)
87
+ if (!assemblyName) {
88
+ return false
89
+ }
90
+ return assemblyManager.isValidRefName(refName, assemblyName)
91
+ },
92
+ }))
93
+ .actions(self => ({
94
+ setSelectedAssemblyName(s: string) {
95
+ self.selectedAssemblyName = s
96
+ },
97
+ setFileSource(newSource: unknown) {
98
+ self.fileSource = newSource
99
+ self.error = undefined
100
+
101
+ if (self.fileSource) {
102
+ // try to autodetect the file type, ignore errors
103
+ const name = self.fileName
104
+
105
+ if (name) {
106
+ const match = fileTypesRegexp.exec(name)
107
+ if (match && match[1]) {
108
+ self.fileType =
109
+ match[1] === 'tsv' && name.includes('star-fusion')
110
+ ? 'STAR-Fusion'
111
+ : match[1].toUpperCase()
112
+ }
113
+ }
114
+ }
115
+ },
116
+
117
+ toggleHasColumnNameLine() {
118
+ self.hasColumnNameLine = !self.hasColumnNameLine
119
+ },
120
+
121
+ setColumnNameLineNumber(newnumber: number) {
122
+ if (newnumber > 0) {
123
+ self.columnNameLineNumber = newnumber
124
+ }
125
+ },
126
+
127
+ setFileType(typeName: string) {
128
+ self.fileType = typeName
129
+ },
130
+
131
+ setError(error: unknown) {
132
+ console.error(error)
133
+ self.loading = false
134
+ self.error = error
135
+ },
136
+
137
+ setLoaded() {
138
+ self.loading = false
139
+ self.error = undefined
140
+ },
141
+
142
+ cancelButton() {
143
+ self.error = undefined
144
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
145
+ getParent<any>(self).setDisplayMode()
146
+ },
147
+
148
+ // fetch and parse the file, make a new Spreadsheet model for it,
149
+ // then set the parent to display it
150
+ async import(assemblyName: string) {
151
+ if (!self.fileSource) {
152
+ return
153
+ }
154
+
155
+ if (self.loading) {
156
+ throw new Error('Cannot import, load already in progress')
157
+ }
158
+
159
+ self.selectedAssemblyName = assemblyName
160
+ self.loading = true
161
+ const type = self.fileType as keyof typeof fileTypeParsers
162
+ const typeParser = await fileTypeParsers[type]()
163
+ if (!typeParser) {
164
+ throw new Error(`cannot open files of type '${self.fileType}'`)
165
+ }
166
+
167
+ const { unzip } = await import('@gmod/bgzf-filehandle')
168
+ const { pluginManager } = getEnv(self)
169
+ const filehandle = openLocation(self.fileSource, pluginManager)
170
+ try {
171
+ const stat = await filehandle.stat()
172
+ if (stat.size > IMPORT_SIZE_LIMIT) {
173
+ throw new Error(
174
+ `File is too big. Tabular files are limited to at most ${(
175
+ IMPORT_SIZE_LIMIT / 1000
176
+ ).toLocaleString()}kb.`,
177
+ )
178
+ }
179
+ } catch (e) {
180
+ // not required for stat to succeed to proceed, but it is helpful
181
+ console.warn(e)
182
+ }
183
+
184
+ try {
185
+ await filehandle
186
+ .readFile()
187
+ .then(buffer => (self.requiresUnzip ? unzip(buffer) : buffer))
188
+ .then(buffer => typeParser(buffer, self))
189
+ .then(spreadsheet => {
190
+ this.setLoaded()
191
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
192
+ getParent<any>(self).displaySpreadsheet(spreadsheet)
193
+ })
194
+ } catch (e) {
195
+ this.setError(e)
196
+ }
197
+ },
198
+ }))
199
+
200
+ export type ImportWizardStateModel = typeof ImportWizard
201
+ export type ImportWizardModel = Instance<ImportWizardStateModel>
202
+
203
+ export default ImportWizard
@@ -0,0 +1,46 @@
1
+ import { types, getParent } from 'mobx-state-tree'
2
+
3
+ const CellModel = types.model('SpreadsheetCell', {
4
+ text: types.string,
5
+ extendedData: types.maybe(types.frozen()),
6
+ })
7
+
8
+ const RowModel = types
9
+ .model('SpreadsheetRow', {
10
+ id: types.identifier,
11
+ cells: types.array(CellModel),
12
+ extendedData: types.maybe(types.frozen()),
13
+ isSelected: false,
14
+ })
15
+ .actions(self => ({
16
+ toggleSelect() {
17
+ self.isSelected = !self.isSelected
18
+ },
19
+ unSelect() {
20
+ self.isSelected = false
21
+ },
22
+ select() {
23
+ self.isSelected = true
24
+ },
25
+ setExtendedData(data: unknown) {
26
+ self.extendedData = data
27
+ },
28
+ }))
29
+ .views(self => ({
30
+ get cellsWithDerived() {
31
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
+ const { columns } = getParent<any>(self, 3)
33
+ let i = 0
34
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
+ return columns.map((column: { isDerived: boolean; expr: any }) => {
36
+ if (column.isDerived) {
37
+ return column.expr.evalSync({
38
+ row: self,
39
+ })
40
+ }
41
+ return self.cells[i++]
42
+ })
43
+ },
44
+ }))
45
+
46
+ export default RowModel