@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,84 @@
1
+ import React from 'react'
2
+ import { Grid, IconButton, Typography } from '@mui/material'
3
+ import { observer } from 'mobx-react'
4
+ import { getParent } from 'mobx-state-tree'
5
+ import { makeStyles } from 'tss-react/mui'
6
+
7
+ // icons
8
+ import FilterIcon from '@mui/icons-material/FilterList'
9
+ import CloseIcon from '@mui/icons-material/Close'
10
+
11
+ const useStyles = makeStyles()(theme => ({
12
+ columnName: {
13
+ verticalAlign: 'middle',
14
+ paddingRight: '0.3em',
15
+ },
16
+ columnFilter: {
17
+ overflow: 'hidden',
18
+ whiteSpace: 'nowrap',
19
+ boxSizing: 'border-box',
20
+ width: '100%',
21
+ position: 'relative',
22
+ },
23
+ filterIcon: {
24
+ position: 'relative',
25
+ top: '12px',
26
+ },
27
+ filterIconBg: {
28
+ background: theme.palette.tertiary.main,
29
+ color: 'white',
30
+ padding: theme.spacing(1.5),
31
+ },
32
+ }))
33
+
34
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
+ function FilterOperations({ filterModel }: { filterModel: any }) {
36
+ if (filterModel) {
37
+ return <filterModel.ReactComponent filterModel={filterModel} />
38
+ }
39
+ return null
40
+ }
41
+
42
+ const ColumnFilterControls = observer(function ({
43
+ viewModel,
44
+ filterModel,
45
+ columnNumber,
46
+ height,
47
+ }: // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
+ any) {
49
+ const { classes } = useStyles()
50
+
51
+ const columnDefinition = viewModel.spreadsheet.columns[columnNumber]
52
+ if (!columnDefinition) {
53
+ throw new Error('no column definition! filters are probably out of date')
54
+ }
55
+ return (
56
+ <Grid
57
+ container
58
+ direction="row"
59
+ className={classes.columnFilter}
60
+ style={{ height }}
61
+ >
62
+ <Grid item className={classes.filterIconBg}>
63
+ <FilterIcon className={classes.filterIcon} />
64
+ </Grid>
65
+ <Grid item>
66
+ <IconButton
67
+ onClick={() =>
68
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
69
+ getParent<any>(filterModel, 2).removeColumnFilter(filterModel)
70
+ }
71
+ title="remove filter"
72
+ >
73
+ <CloseIcon />
74
+ </IconButton>
75
+ <Typography className={classes.columnName} component="span">
76
+ {columnDefinition.name}
77
+ </Typography>{' '}
78
+ <FilterOperations filterModel={filterModel} />
79
+ </Grid>
80
+ </Grid>
81
+ )
82
+ })
83
+
84
+ export default ColumnFilterControls
@@ -0,0 +1,166 @@
1
+ import React from 'react'
2
+ import { observer } from 'mobx-react'
3
+ import { iterMap } from '@jbrowse/core/util'
4
+ import { Menu } from '@jbrowse/core/ui'
5
+ import { MenuItem } from '@jbrowse/core/ui/Menu'
6
+ import { SpreadsheetModel } from '../models/Spreadsheet'
7
+ import { SpreadsheetViewModel } from '../models/SpreadsheetView'
8
+
9
+ // icons
10
+ import CheckIcon from '@mui/icons-material/Check'
11
+ import FilterListIcon from '@mui/icons-material/FilterList'
12
+ import PermDataSettingIcon from '@mui/icons-material/PermDataSetting'
13
+ import SortIcon from '@mui/icons-material/Sort'
14
+
15
+ const ColumnMenu = observer(function ({
16
+ viewModel,
17
+ spreadsheetModel,
18
+ currentColumnMenu,
19
+ setColumnMenu,
20
+ }: {
21
+ spreadsheetModel: SpreadsheetModel
22
+ viewModel: SpreadsheetViewModel
23
+ currentColumnMenu?: { colNumber: number; anchorEl: HTMLElement }
24
+ setColumnMenu: (arg?: { anchorEl: HTMLElement; colNumber: number }) => void
25
+ }) {
26
+ const columnMenuClose = () => setColumnMenu(undefined)
27
+ const columnNumber = currentColumnMenu?.colNumber || 0
28
+ const sortMenuClick = (descending: boolean) => {
29
+ spreadsheetModel.setSortColumns([
30
+ {
31
+ columnNumber,
32
+ descending,
33
+ },
34
+ ])
35
+ }
36
+
37
+ const { dataTypeChoices } = spreadsheetModel
38
+
39
+ // make a Map of categoryName => [entry...]
40
+ type Record = (typeof dataTypeChoices)[0]
41
+ type RecordGroup = { isCategory: boolean; subMenuItems: Record[] }
42
+ const dataTypeTopLevelMenu = new Map<string, Record | RecordGroup>()
43
+ dataTypeChoices.forEach(dataTypeRecord => {
44
+ const { displayName, categoryName } = dataTypeRecord
45
+ if (categoryName) {
46
+ let entry = dataTypeTopLevelMenu.get(categoryName) as RecordGroup
47
+ if (!entry) {
48
+ entry = {
49
+ isCategory: true,
50
+ subMenuItems: [],
51
+ }
52
+ dataTypeTopLevelMenu.set(categoryName, entry)
53
+ }
54
+ entry.subMenuItems.push(dataTypeRecord)
55
+ } else {
56
+ dataTypeTopLevelMenu.set(displayName, dataTypeRecord)
57
+ }
58
+ })
59
+
60
+ const { columns, sortColumns } = spreadsheetModel
61
+ const dataType = currentColumnMenu && columns[columnNumber].dataType
62
+ const dataTypeName = dataType?.type || ''
63
+ const dataTypeDisplayName =
64
+ (currentColumnMenu && columns[columnNumber].dataType.displayName) || ''
65
+
66
+ const isSortingAscending =
67
+ !!currentColumnMenu &&
68
+ sortColumns.some(
69
+ c => c.columnNumber === currentColumnMenu.colNumber && !c.descending,
70
+ )
71
+ const isSortingDescending =
72
+ !!currentColumnMenu &&
73
+ sortColumns.some(
74
+ c => c.columnNumber === currentColumnMenu.colNumber && c.descending,
75
+ )
76
+
77
+ const menuItems = [
78
+ // top-level column menu
79
+ {
80
+ label: 'Sort ascending',
81
+ icon: SortIcon,
82
+ type: 'radio',
83
+ checked: isSortingAscending,
84
+ onClick: () => sortMenuClick(false),
85
+ },
86
+ {
87
+ label: 'Sort descending',
88
+ icon: SortIcon,
89
+ type: 'radio',
90
+ checked: isSortingDescending,
91
+ onClick: () => sortMenuClick(true),
92
+ },
93
+ {
94
+ label: 'No sort',
95
+ icon: SortIcon,
96
+ type: 'radio',
97
+ checked: !isSortingDescending && !isSortingAscending,
98
+ onClick: () => spreadsheetModel.setSortColumns([]),
99
+ },
100
+ // data type menu
101
+ {
102
+ label: `Type: ${dataTypeDisplayName}`,
103
+ icon: PermDataSettingIcon,
104
+ subMenu: iterMap(
105
+ dataTypeTopLevelMenu.entries(),
106
+ ([displayName, record]) => {
107
+ if ('typeName' in record && record.typeName) {
108
+ const { typeName } = record
109
+ return {
110
+ label: displayName || typeName,
111
+ icon: dataTypeName === typeName ? CheckIcon : undefined,
112
+ onClick: () =>
113
+ spreadsheetModel.setColumnType(columnNumber, typeName),
114
+ }
115
+ } else if ('subMenuItems' in record && record.subMenuItems) {
116
+ const { subMenuItems } = record
117
+ return {
118
+ label: displayName,
119
+ icon: subMenuItems.some(i => i.typeName === dataTypeName)
120
+ ? CheckIcon
121
+ : undefined,
122
+ subMenu: subMenuItems.map(({ typeName, displayName }) => ({
123
+ label: displayName,
124
+ icon: typeName === dataTypeName ? CheckIcon : undefined,
125
+ onClick: () =>
126
+ spreadsheetModel.setColumnType(columnNumber, typeName),
127
+ })),
128
+ }
129
+ } else {
130
+ return null
131
+ }
132
+ },
133
+ ).filter(Boolean),
134
+ },
135
+ ] as MenuItem[]
136
+
137
+ // don't display the filter item if this data type doesn't have filtering
138
+ // implemented
139
+ if (dataType?.hasFilter) {
140
+ menuItems.push({
141
+ label: 'Create filter',
142
+ icon: FilterListIcon,
143
+ onClick: () =>
144
+ viewModel.filterControls.addBlankColumnFilter(columnNumber),
145
+ })
146
+ }
147
+
148
+ return (
149
+ <Menu
150
+ anchorEl={currentColumnMenu?.anchorEl}
151
+ open={Boolean(currentColumnMenu)}
152
+ onMenuItemClick={(_event, callback) => {
153
+ callback()
154
+ columnMenuClose()
155
+ }}
156
+ onClose={columnMenuClose}
157
+ menuItems={menuItems}
158
+ anchorOrigin={{
159
+ vertical: 'bottom',
160
+ horizontal: 'right',
161
+ }}
162
+ />
163
+ )
164
+ })
165
+
166
+ export default ColumnMenu
@@ -0,0 +1,126 @@
1
+ import React from 'react'
2
+ import { Checkbox, IconButton, FormControlLabel } from '@mui/material'
3
+ import { observer } from 'mobx-react'
4
+ import { Instance } from 'mobx-state-tree'
5
+ import { indigo } from '@mui/material/colors'
6
+ import { makeStyles } from 'tss-react/mui'
7
+
8
+ // icons
9
+ import ArrowDropDown from '@mui/icons-material/ArrowDropDown'
10
+
11
+ // locals
12
+ import SpreadsheetStateModel from '../models/Spreadsheet'
13
+ import RowStateModel from '../models/Row'
14
+ import CellData from './CellData'
15
+
16
+ type SpreadsheetModel = Instance<typeof SpreadsheetStateModel>
17
+ type RowModel = Instance<typeof RowStateModel>
18
+
19
+ const useStyles = makeStyles()(theme => ({
20
+ rowNumCell: {
21
+ textAlign: 'left',
22
+ border: `1px solid ${theme.palette.action.disabledBackground}`,
23
+ position: 'relative',
24
+ padding: '0 2px 0 0',
25
+ whiteSpace: 'nowrap',
26
+ userSelect: 'none',
27
+ },
28
+ rowNumber: {
29
+ fontWeight: 'normal',
30
+ display: 'inline-block',
31
+ flex: 'none',
32
+ paddingRight: '20px',
33
+ margin: 0,
34
+ whiteSpace: 'nowrap',
35
+ },
36
+ rowMenuButton: {
37
+ padding: 0,
38
+ margin: 0,
39
+ position: 'absolute',
40
+ right: 0,
41
+ display: 'inline-block',
42
+ whiteSpace: 'nowrap',
43
+ flex: 'none',
44
+ },
45
+ rowMenuButtonIcon: {},
46
+ rowSelector: {
47
+ position: 'relative',
48
+ top: '-2px',
49
+ margin: 0,
50
+ padding: '0 0.2rem',
51
+ },
52
+
53
+ dataRowSelected: {
54
+ background: indigo[100],
55
+ '& th': {
56
+ background: indigo[100],
57
+ },
58
+ },
59
+ }))
60
+
61
+ const DataRow = observer(function ({
62
+ rowModel,
63
+ rowNumber,
64
+ spreadsheetModel,
65
+ }: {
66
+ rowModel: RowModel
67
+ rowNumber: string
68
+ spreadsheetModel: SpreadsheetModel
69
+ }) {
70
+ const { classes } = useStyles()
71
+ const { hideRowSelection, columnDisplayOrder } = spreadsheetModel
72
+ let rowClass = ''
73
+ if (rowModel.isSelected) {
74
+ rowClass += `${classes.dataRowSelected}`
75
+ }
76
+
77
+ function labelClick(evt: React.MouseEvent) {
78
+ rowModel.toggleSelect()
79
+ evt.stopPropagation()
80
+ evt.preventDefault()
81
+ }
82
+
83
+ return (
84
+ <tr className={rowClass}>
85
+ <td className={classes.rowNumCell} onClick={labelClick}>
86
+ {hideRowSelection ? (
87
+ <FormControlLabel
88
+ className={classes.rowNumber}
89
+ control={
90
+ <Checkbox
91
+ className={classes.rowSelector}
92
+ checked={rowModel.isSelected}
93
+ onClick={labelClick}
94
+ />
95
+ }
96
+ label={rowModel.id}
97
+ />
98
+ ) : null}
99
+ <IconButton
100
+ className={classes.rowMenuButton}
101
+ onClick={event => {
102
+ spreadsheetModel.setRowMenuPosition({
103
+ anchorEl: event.currentTarget,
104
+ rowNumber,
105
+ })
106
+ event.preventDefault()
107
+ event.stopPropagation()
108
+ }}
109
+ >
110
+ <ArrowDropDown className={classes.rowMenuButtonIcon} />
111
+ </IconButton>
112
+ </td>
113
+ {columnDisplayOrder.map(colNumber => (
114
+ <td key={colNumber}>
115
+ <CellData
116
+ cell={rowModel.cellsWithDerived[colNumber]}
117
+ spreadsheetModel={spreadsheetModel}
118
+ columnNumber={colNumber}
119
+ />
120
+ </td>
121
+ ))}
122
+ </tr>
123
+ )
124
+ })
125
+
126
+ export default DataRow
@@ -0,0 +1,91 @@
1
+ import React from 'react'
2
+ import { observer } from 'mobx-react'
3
+ import { getParent, Instance } from 'mobx-state-tree'
4
+ import { makeStyles } from 'tss-react/mui'
5
+
6
+ // locals
7
+ import SpreadsheetStateModel from '../models/Spreadsheet'
8
+ import RowStateModel from '../models/Row'
9
+ import RowMenu from './RowMenu'
10
+ import DataRow from './DataRow'
11
+ import DataTableHeader from './DataTableHeader'
12
+
13
+ type SpreadsheetModel = Instance<typeof SpreadsheetStateModel>
14
+ type RowModel = Instance<typeof RowStateModel>
15
+
16
+ const useStyles = makeStyles()(theme => ({
17
+ dataTable: {
18
+ borderCollapse: 'collapse',
19
+ '& td': {
20
+ border: `1px solid ${theme.palette.action.disabledBackground}`,
21
+ padding: '0.2rem',
22
+ maxWidth: '50em',
23
+ overflow: 'hidden',
24
+ textOverflow: 'ellipsis',
25
+ },
26
+ },
27
+
28
+ emptyMessage: {
29
+ captionSide: 'bottom',
30
+ },
31
+ }))
32
+
33
+ const DataTableBody = observer(function ({
34
+ rows,
35
+ spreadsheetModel,
36
+ page,
37
+ rowsPerPage,
38
+ }: {
39
+ rows: RowModel[]
40
+ spreadsheetModel: SpreadsheetModel
41
+ page: number
42
+ rowsPerPage: number
43
+ }) {
44
+ return (
45
+ <tbody>
46
+ {rows.slice(rowsPerPage * page, rowsPerPage * (page + 1)).map(row => (
47
+ <DataRow
48
+ key={row.id}
49
+ rowNumber={row.id}
50
+ spreadsheetModel={spreadsheetModel}
51
+ rowModel={row}
52
+ />
53
+ ))}
54
+ </tbody>
55
+ )
56
+ })
57
+
58
+ const DataTable = observer(function ({
59
+ model,
60
+ page,
61
+ rowsPerPage,
62
+ }: {
63
+ model: SpreadsheetModel
64
+ page: number
65
+ rowsPerPage: number
66
+ }) {
67
+ const { rowSet } = model
68
+ const { classes } = useStyles()
69
+ const rows = rowSet.sortedFilteredRows
70
+ return (
71
+ <>
72
+ <RowMenu viewModel={getParent(model)} spreadsheetModel={model} />
73
+ <table className={classes.dataTable}>
74
+ <DataTableHeader model={model} />
75
+ <DataTableBody
76
+ rows={rows}
77
+ spreadsheetModel={model}
78
+ page={page}
79
+ rowsPerPage={rowsPerPage}
80
+ />
81
+ {!rows.length ? (
82
+ <caption className={classes.emptyMessage}>
83
+ {rowSet.count ? 'no rows match criteria' : 'no rows present'}
84
+ </caption>
85
+ ) : null}
86
+ </table>
87
+ </>
88
+ )
89
+ })
90
+
91
+ export default DataTable
@@ -0,0 +1,122 @@
1
+ import React, { useState } from 'react'
2
+ import { IconButton, Tooltip } from '@mui/material'
3
+ import { observer } from 'mobx-react'
4
+ import { getParent } from 'mobx-state-tree'
5
+ import { makeStyles } from 'tss-react/mui'
6
+
7
+ // icons
8
+ import CropFreeIcon from '@mui/icons-material/CropFree'
9
+ import ArrowDropDown from '@mui/icons-material/ArrowDropDown'
10
+
11
+ // locals
12
+ import { SpreadsheetModel } from '../models/Spreadsheet'
13
+ import ColumnMenu from './ColumnMenu'
14
+ import SortIndicator from './SortIndicator'
15
+ import { numToColName } from './util'
16
+
17
+ interface ColMenu {
18
+ colNumber: number
19
+ anchorEl: HTMLElement
20
+ }
21
+
22
+ const useStyles = makeStyles()(theme => ({
23
+ columnHead: {
24
+ fontWeight: 'normal',
25
+ background: theme.palette.mode === 'dark' ? '#333' : '#eee',
26
+ position: 'sticky',
27
+ top: 0,
28
+ zIndex: 2,
29
+ whiteSpace: 'nowrap',
30
+ },
31
+
32
+ columnButtonContainer: {
33
+ display: 'none',
34
+ position: 'absolute',
35
+ right: 0,
36
+ top: 0,
37
+ background: theme.palette.background.paper,
38
+ height: '100%',
39
+ },
40
+
41
+ topLeftCorner: {
42
+ background: theme.palette.mode === 'dark' ? '#333' : '#eee',
43
+ zIndex: 2,
44
+ position: 'sticky',
45
+ top: 0,
46
+ minWidth: theme.spacing(2),
47
+ textAlign: 'left',
48
+ },
49
+ }))
50
+
51
+ const DataTableHeader = observer(function ({
52
+ model,
53
+ }: {
54
+ model: SpreadsheetModel
55
+ }) {
56
+ const { classes } = useStyles()
57
+ const { columnDisplayOrder, columns, hasColumnNames, rowSet } = model
58
+ const [currentColumnMenu, setColumnMenu] = useState<ColMenu>()
59
+ const [currentHoveredColumn, setHoveredColumn] = useState<number>()
60
+
61
+ return (
62
+ <>
63
+ <thead>
64
+ <tr>
65
+ <th className={classes.topLeftCorner}>
66
+ <Tooltip title="Unselect all" placement="right">
67
+ <span>
68
+ <IconButton
69
+ onClick={() => model.unselectAll()}
70
+ disabled={!rowSet.selectedCount}
71
+ >
72
+ <CropFreeIcon />
73
+ </IconButton>
74
+ </span>
75
+ </Tooltip>
76
+ </th>
77
+ {columnDisplayOrder.map(colNumber => (
78
+ <th
79
+ className={classes.columnHead}
80
+ key={colNumber}
81
+ onMouseOver={() => setHoveredColumn(colNumber)}
82
+ onMouseOut={() => setHoveredColumn(undefined)}
83
+ >
84
+ <SortIndicator model={model} columnNumber={colNumber} />
85
+ {(hasColumnNames && columns[colNumber]?.name) ||
86
+ numToColName(colNumber)}
87
+ <div
88
+ className={classes.columnButtonContainer}
89
+ style={{
90
+ display:
91
+ currentHoveredColumn === colNumber ||
92
+ currentColumnMenu?.colNumber === colNumber
93
+ ? 'block'
94
+ : 'none',
95
+ }}
96
+ >
97
+ <IconButton
98
+ onClick={evt => {
99
+ setColumnMenu({
100
+ colNumber,
101
+ anchorEl: evt.currentTarget,
102
+ })
103
+ }}
104
+ >
105
+ <ArrowDropDown />
106
+ </IconButton>
107
+ </div>
108
+ </th>
109
+ ))}
110
+ </tr>
111
+ </thead>
112
+ <ColumnMenu
113
+ viewModel={getParent(model)}
114
+ spreadsheetModel={model}
115
+ currentColumnMenu={currentColumnMenu}
116
+ setColumnMenu={setColumnMenu}
117
+ />
118
+ </>
119
+ )
120
+ })
121
+
122
+ export default DataTableHeader
@@ -0,0 +1,70 @@
1
+ import React, { useState, useEffect } from 'react'
2
+
3
+ import { IconButton, InputAdornment, TextField } from '@mui/material'
4
+ import ClearIcon from '@mui/icons-material/Clear'
5
+ import FilterIcon from '@mui/icons-material/FilterList'
6
+
7
+ import { observer } from 'mobx-react'
8
+ import { makeStyles } from 'tss-react/mui'
9
+ import { useDebounce } from '@jbrowse/core/util'
10
+
11
+ const useStyles = makeStyles()({
12
+ textFilterControlEndAdornment: {
13
+ marginRight: '-18px',
14
+ },
15
+ })
16
+
17
+ const TextFilter = observer(function ({
18
+ textFilter,
19
+ }: {
20
+ textFilter: { stringToFind: string; setString: (arg: string) => void }
21
+ }) {
22
+ const { classes } = useStyles()
23
+ // this paragraph is silliness to debounce the text filter input
24
+ const [textFilterValue, setTextFilterValue] = useState(
25
+ textFilter.stringToFind,
26
+ )
27
+ const debouncedTextFilter = useDebounce(textFilterValue, 500)
28
+ useEffect(() => {
29
+ textFilter.setString(debouncedTextFilter)
30
+ }, [debouncedTextFilter, textFilter])
31
+
32
+ return (
33
+ <div>
34
+ <TextField
35
+ label="text filter"
36
+ value={textFilterValue}
37
+ onChange={evt => setTextFilterValue(evt.target.value)}
38
+ variant="outlined"
39
+ InputProps={{
40
+ startAdornment: (
41
+ <InputAdornment position="start">
42
+ <FilterIcon />
43
+ </InputAdornment>
44
+ ),
45
+ endAdornment: (
46
+ <InputAdornment
47
+ className={classes.textFilterControlEndAdornment}
48
+ position="end"
49
+ >
50
+ <IconButton
51
+ aria-label="clear filter"
52
+ onClick={() => setTextFilterValue('')}
53
+ >
54
+ <ClearIcon />
55
+ </IconButton>
56
+ </InputAdornment>
57
+ ),
58
+ }}
59
+ />
60
+ </div>
61
+ )
62
+ })
63
+
64
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
65
+ const GlobalFilterControls = observer(({ model }: { model: any }) => {
66
+ const textFilter = model.filterControls.rowFullText
67
+ return <TextFilter textFilter={textFilter} />
68
+ })
69
+
70
+ export default GlobalFilterControls