@jbrowse/plugin-spreadsheet-view 2.6.1 → 2.6.2

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 (204) hide show
  1. package/dist/LaunchSpreadsheetView/index.js +0 -1
  2. package/dist/SpreadsheetView/components/CellData.js +0 -1
  3. package/dist/SpreadsheetView/components/ColumnFilterControls.js +0 -1
  4. package/dist/SpreadsheetView/components/ColumnMenu.js +0 -1
  5. package/dist/SpreadsheetView/components/DataRow.js +0 -1
  6. package/dist/SpreadsheetView/components/DataTable.js +0 -1
  7. package/dist/SpreadsheetView/components/DataTableHeader.js +0 -1
  8. package/dist/SpreadsheetView/components/GlobalFilterControls.js +0 -1
  9. package/dist/SpreadsheetView/components/ImportWizard.js +0 -1
  10. package/dist/SpreadsheetView/components/NumberEditor.js +0 -1
  11. package/dist/SpreadsheetView/components/RowCountMessage.js +0 -1
  12. package/dist/SpreadsheetView/components/RowMenu.js +0 -1
  13. package/dist/SpreadsheetView/components/SortIndicator.js +0 -1
  14. package/dist/SpreadsheetView/components/Spreadsheet.js +0 -1
  15. package/dist/SpreadsheetView/components/SpreadsheetView.js +0 -1
  16. package/dist/SpreadsheetView/components/StatusBar.js +0 -1
  17. package/dist/SpreadsheetView/components/util.js +0 -1
  18. package/dist/SpreadsheetView/importAdapters/BedImport.js +0 -1
  19. package/dist/SpreadsheetView/importAdapters/ImportUtils.js +0 -1
  20. package/dist/SpreadsheetView/importAdapters/STARFusionImport.js +0 -1
  21. package/dist/SpreadsheetView/importAdapters/VcfImport.js +0 -1
  22. package/dist/SpreadsheetView/index.js +0 -1
  23. package/dist/SpreadsheetView/models/ColumnDataTypes/LocEnd.js +0 -1
  24. package/dist/SpreadsheetView/models/ColumnDataTypes/LocRef.js +0 -1
  25. package/dist/SpreadsheetView/models/ColumnDataTypes/LocStart.js +0 -1
  26. package/dist/SpreadsheetView/models/ColumnDataTypes/LocString.js +0 -1
  27. package/dist/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js +0 -1
  28. package/dist/SpreadsheetView/models/ColumnDataTypes/Number.js +0 -1
  29. package/dist/SpreadsheetView/models/ColumnDataTypes/Text.js +0 -1
  30. package/dist/SpreadsheetView/models/ColumnDataTypes/index.js +0 -1
  31. package/dist/SpreadsheetView/models/FilterControls.js +0 -1
  32. package/dist/SpreadsheetView/models/ImportWizard.js +0 -1
  33. package/dist/SpreadsheetView/models/Row.js +0 -1
  34. package/dist/SpreadsheetView/models/Spreadsheet.js +0 -1
  35. package/dist/SpreadsheetView/models/SpreadsheetView.js +0 -1
  36. package/dist/SpreadsheetView/models/StaticRowSet.js +0 -1
  37. package/dist/index.js +0 -1
  38. package/esm/LaunchSpreadsheetView/index.js +0 -1
  39. package/esm/SpreadsheetView/components/CellData.js +0 -1
  40. package/esm/SpreadsheetView/components/ColumnFilterControls.js +0 -1
  41. package/esm/SpreadsheetView/components/ColumnMenu.js +0 -1
  42. package/esm/SpreadsheetView/components/DataRow.js +0 -1
  43. package/esm/SpreadsheetView/components/DataTable.js +0 -1
  44. package/esm/SpreadsheetView/components/DataTableHeader.js +0 -1
  45. package/esm/SpreadsheetView/components/GlobalFilterControls.js +0 -1
  46. package/esm/SpreadsheetView/components/ImportWizard.js +0 -1
  47. package/esm/SpreadsheetView/components/NumberEditor.js +0 -1
  48. package/esm/SpreadsheetView/components/RowCountMessage.js +0 -1
  49. package/esm/SpreadsheetView/components/RowMenu.js +0 -1
  50. package/esm/SpreadsheetView/components/SortIndicator.js +0 -1
  51. package/esm/SpreadsheetView/components/Spreadsheet.js +0 -1
  52. package/esm/SpreadsheetView/components/SpreadsheetView.js +0 -1
  53. package/esm/SpreadsheetView/components/StatusBar.js +0 -1
  54. package/esm/SpreadsheetView/components/util.js +0 -1
  55. package/esm/SpreadsheetView/importAdapters/BedImport.js +0 -1
  56. package/esm/SpreadsheetView/importAdapters/ImportUtils.js +0 -1
  57. package/esm/SpreadsheetView/importAdapters/STARFusionImport.js +0 -1
  58. package/esm/SpreadsheetView/importAdapters/VcfImport.js +0 -1
  59. package/esm/SpreadsheetView/index.js +0 -1
  60. package/esm/SpreadsheetView/models/ColumnDataTypes/LocEnd.js +0 -1
  61. package/esm/SpreadsheetView/models/ColumnDataTypes/LocRef.js +0 -1
  62. package/esm/SpreadsheetView/models/ColumnDataTypes/LocStart.js +0 -1
  63. package/esm/SpreadsheetView/models/ColumnDataTypes/LocString.js +0 -1
  64. package/esm/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js +0 -1
  65. package/esm/SpreadsheetView/models/ColumnDataTypes/Number.js +0 -1
  66. package/esm/SpreadsheetView/models/ColumnDataTypes/Text.js +0 -1
  67. package/esm/SpreadsheetView/models/ColumnDataTypes/index.js +0 -1
  68. package/esm/SpreadsheetView/models/FilterControls.js +0 -1
  69. package/esm/SpreadsheetView/models/ImportWizard.js +0 -1
  70. package/esm/SpreadsheetView/models/Row.js +0 -1
  71. package/esm/SpreadsheetView/models/Spreadsheet.js +0 -1
  72. package/esm/SpreadsheetView/models/SpreadsheetView.js +0 -1
  73. package/esm/SpreadsheetView/models/StaticRowSet.js +0 -1
  74. package/esm/index.js +0 -1
  75. package/package.json +4 -5
  76. package/dist/LaunchSpreadsheetView/index.js.map +0 -1
  77. package/dist/SpreadsheetView/components/CellData.js.map +0 -1
  78. package/dist/SpreadsheetView/components/ColumnFilterControls.js.map +0 -1
  79. package/dist/SpreadsheetView/components/ColumnMenu.js.map +0 -1
  80. package/dist/SpreadsheetView/components/DataRow.js.map +0 -1
  81. package/dist/SpreadsheetView/components/DataTable.js.map +0 -1
  82. package/dist/SpreadsheetView/components/DataTableHeader.js.map +0 -1
  83. package/dist/SpreadsheetView/components/GlobalFilterControls.js.map +0 -1
  84. package/dist/SpreadsheetView/components/ImportWizard.js.map +0 -1
  85. package/dist/SpreadsheetView/components/NumberEditor.js.map +0 -1
  86. package/dist/SpreadsheetView/components/RowCountMessage.js.map +0 -1
  87. package/dist/SpreadsheetView/components/RowMenu.js.map +0 -1
  88. package/dist/SpreadsheetView/components/SortIndicator.js.map +0 -1
  89. package/dist/SpreadsheetView/components/Spreadsheet.js.map +0 -1
  90. package/dist/SpreadsheetView/components/SpreadsheetView.js.map +0 -1
  91. package/dist/SpreadsheetView/components/StatusBar.js.map +0 -1
  92. package/dist/SpreadsheetView/components/util.js.map +0 -1
  93. package/dist/SpreadsheetView/importAdapters/BedImport.js.map +0 -1
  94. package/dist/SpreadsheetView/importAdapters/ImportUtils.js.map +0 -1
  95. package/dist/SpreadsheetView/importAdapters/STARFusionImport.js.map +0 -1
  96. package/dist/SpreadsheetView/importAdapters/VcfImport.js.map +0 -1
  97. package/dist/SpreadsheetView/index.js.map +0 -1
  98. package/dist/SpreadsheetView/models/ColumnDataTypes/LocEnd.js.map +0 -1
  99. package/dist/SpreadsheetView/models/ColumnDataTypes/LocRef.js.map +0 -1
  100. package/dist/SpreadsheetView/models/ColumnDataTypes/LocStart.js.map +0 -1
  101. package/dist/SpreadsheetView/models/ColumnDataTypes/LocString.js.map +0 -1
  102. package/dist/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js.map +0 -1
  103. package/dist/SpreadsheetView/models/ColumnDataTypes/Number.js.map +0 -1
  104. package/dist/SpreadsheetView/models/ColumnDataTypes/Text.js.map +0 -1
  105. package/dist/SpreadsheetView/models/ColumnDataTypes/index.js.map +0 -1
  106. package/dist/SpreadsheetView/models/FilterControls.js.map +0 -1
  107. package/dist/SpreadsheetView/models/ImportWizard.js.map +0 -1
  108. package/dist/SpreadsheetView/models/Row.js.map +0 -1
  109. package/dist/SpreadsheetView/models/Spreadsheet.js.map +0 -1
  110. package/dist/SpreadsheetView/models/SpreadsheetView.js.map +0 -1
  111. package/dist/SpreadsheetView/models/StaticRowSet.js.map +0 -1
  112. package/dist/index.js.map +0 -1
  113. package/esm/LaunchSpreadsheetView/index.js.map +0 -1
  114. package/esm/SpreadsheetView/components/CellData.js.map +0 -1
  115. package/esm/SpreadsheetView/components/ColumnFilterControls.js.map +0 -1
  116. package/esm/SpreadsheetView/components/ColumnMenu.js.map +0 -1
  117. package/esm/SpreadsheetView/components/DataRow.js.map +0 -1
  118. package/esm/SpreadsheetView/components/DataTable.js.map +0 -1
  119. package/esm/SpreadsheetView/components/DataTableHeader.js.map +0 -1
  120. package/esm/SpreadsheetView/components/GlobalFilterControls.js.map +0 -1
  121. package/esm/SpreadsheetView/components/ImportWizard.js.map +0 -1
  122. package/esm/SpreadsheetView/components/NumberEditor.js.map +0 -1
  123. package/esm/SpreadsheetView/components/RowCountMessage.js.map +0 -1
  124. package/esm/SpreadsheetView/components/RowMenu.js.map +0 -1
  125. package/esm/SpreadsheetView/components/SortIndicator.js.map +0 -1
  126. package/esm/SpreadsheetView/components/Spreadsheet.js.map +0 -1
  127. package/esm/SpreadsheetView/components/SpreadsheetView.js.map +0 -1
  128. package/esm/SpreadsheetView/components/StatusBar.js.map +0 -1
  129. package/esm/SpreadsheetView/components/util.js.map +0 -1
  130. package/esm/SpreadsheetView/importAdapters/BedImport.js.map +0 -1
  131. package/esm/SpreadsheetView/importAdapters/ImportUtils.js.map +0 -1
  132. package/esm/SpreadsheetView/importAdapters/STARFusionImport.js.map +0 -1
  133. package/esm/SpreadsheetView/importAdapters/VcfImport.js.map +0 -1
  134. package/esm/SpreadsheetView/index.js.map +0 -1
  135. package/esm/SpreadsheetView/models/ColumnDataTypes/LocEnd.js.map +0 -1
  136. package/esm/SpreadsheetView/models/ColumnDataTypes/LocRef.js.map +0 -1
  137. package/esm/SpreadsheetView/models/ColumnDataTypes/LocStart.js.map +0 -1
  138. package/esm/SpreadsheetView/models/ColumnDataTypes/LocString.js.map +0 -1
  139. package/esm/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js.map +0 -1
  140. package/esm/SpreadsheetView/models/ColumnDataTypes/Number.js.map +0 -1
  141. package/esm/SpreadsheetView/models/ColumnDataTypes/Text.js.map +0 -1
  142. package/esm/SpreadsheetView/models/ColumnDataTypes/index.js.map +0 -1
  143. package/esm/SpreadsheetView/models/FilterControls.js.map +0 -1
  144. package/esm/SpreadsheetView/models/ImportWizard.js.map +0 -1
  145. package/esm/SpreadsheetView/models/Row.js.map +0 -1
  146. package/esm/SpreadsheetView/models/Spreadsheet.js.map +0 -1
  147. package/esm/SpreadsheetView/models/SpreadsheetView.js.map +0 -1
  148. package/esm/SpreadsheetView/models/StaticRowSet.js.map +0 -1
  149. package/esm/index.js.map +0 -1
  150. package/src/LaunchSpreadsheetView/index.ts +0 -40
  151. package/src/SpreadsheetView/components/CellData.tsx +0 -35
  152. package/src/SpreadsheetView/components/ColumnFilterControls.tsx +0 -84
  153. package/src/SpreadsheetView/components/ColumnMenu.tsx +0 -166
  154. package/src/SpreadsheetView/components/DataRow.tsx +0 -126
  155. package/src/SpreadsheetView/components/DataTable.tsx +0 -91
  156. package/src/SpreadsheetView/components/DataTableHeader.tsx +0 -122
  157. package/src/SpreadsheetView/components/GlobalFilterControls.tsx +0 -70
  158. package/src/SpreadsheetView/components/ImportWizard.tsx +0 -139
  159. package/src/SpreadsheetView/components/NumberEditor.tsx +0 -50
  160. package/src/SpreadsheetView/components/RowCountMessage.tsx +0 -44
  161. package/src/SpreadsheetView/components/RowMenu.tsx +0 -65
  162. package/src/SpreadsheetView/components/SortIndicator.tsx +0 -36
  163. package/src/SpreadsheetView/components/Spreadsheet.test.ts +0 -17
  164. package/src/SpreadsheetView/components/Spreadsheet.tsx +0 -46
  165. package/src/SpreadsheetView/components/SpreadsheetView.tsx +0 -119
  166. package/src/SpreadsheetView/components/StatusBar.tsx +0 -75
  167. package/src/SpreadsheetView/components/util.ts +0 -16
  168. package/src/SpreadsheetView/importAdapters/BedImport.test.ts +0 -14
  169. package/src/SpreadsheetView/importAdapters/BedImport.ts +0 -155
  170. package/src/SpreadsheetView/importAdapters/ImportUtils.test.ts +0 -25
  171. package/src/SpreadsheetView/importAdapters/ImportUtils.ts +0 -152
  172. package/src/SpreadsheetView/importAdapters/STARFusionImport.test.ts +0 -27
  173. package/src/SpreadsheetView/importAdapters/STARFusionImport.ts +0 -74
  174. package/src/SpreadsheetView/importAdapters/VcfImport.test.ts +0 -42
  175. package/src/SpreadsheetView/importAdapters/VcfImport.ts +0 -118
  176. package/src/SpreadsheetView/importAdapters/__snapshots__/ImportUtils.test.ts.snap +0 -6555
  177. package/src/SpreadsheetView/importAdapters/__snapshots__/STARFusionImport.test.ts.snap +0 -2354
  178. package/src/SpreadsheetView/importAdapters/__snapshots__/VcfImport.test.ts.snap +0 -16329
  179. package/src/SpreadsheetView/index.ts +0 -20
  180. package/src/SpreadsheetView/models/ColumnDataTypes/LocEnd.ts +0 -21
  181. package/src/SpreadsheetView/models/ColumnDataTypes/LocRef.ts +0 -21
  182. package/src/SpreadsheetView/models/ColumnDataTypes/LocStart.ts +0 -21
  183. package/src/SpreadsheetView/models/ColumnDataTypes/LocString.tsx +0 -328
  184. package/src/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.tsx +0 -38
  185. package/src/SpreadsheetView/models/ColumnDataTypes/Number.tsx +0 -177
  186. package/src/SpreadsheetView/models/ColumnDataTypes/Text.tsx +0 -173
  187. package/src/SpreadsheetView/models/ColumnDataTypes/index.ts +0 -34
  188. package/src/SpreadsheetView/models/FilterControls.ts +0 -95
  189. package/src/SpreadsheetView/models/ImportWizard.ts +0 -203
  190. package/src/SpreadsheetView/models/Row.ts +0 -46
  191. package/src/SpreadsheetView/models/Spreadsheet.ts +0 -209
  192. package/src/SpreadsheetView/models/SpreadsheetView.test.ts +0 -8
  193. package/src/SpreadsheetView/models/SpreadsheetView.ts +0 -243
  194. package/src/SpreadsheetView/models/StaticRowSet.ts +0 -65
  195. package/src/SpreadsheetView/test_data/1801160099-N32519_26611_S51_56704.hard-filtered.vcf +0 -174
  196. package/src/SpreadsheetView/test_data/breast_cancer.subset.csv +0 -50
  197. package/src/SpreadsheetView/test_data/diabetes_target.csv.gz +0 -0
  198. package/src/SpreadsheetView/test_data/foo.bed +0 -11
  199. package/src/SpreadsheetView/test_data/location_test.csv +0 -3
  200. package/src/SpreadsheetView/test_data/location_test_2.csv +0 -3
  201. package/src/SpreadsheetView/test_data/reads_lr_skbr3.fa_ngmlr-0.2.3_mapped.bam.sniffles1kb_auto_l8_s5_noalt.bedpe +0 -1405
  202. package/src/SpreadsheetView/test_data/starfusion_example.fusion_predictions.tsv +0 -25
  203. package/src/SpreadsheetView/test_data/volvox.sort.bed +0 -109
  204. package/src/index.ts +0 -38
@@ -1,20 +0,0 @@
1
- import { lazy } from 'react'
2
- import { ViewType } from '@jbrowse/core/pluggableElementTypes'
3
- import PluginManager from '@jbrowse/core/PluginManager'
4
- import stateModel from './models/SpreadsheetView'
5
-
6
- export default (pluginManager: PluginManager) => {
7
- pluginManager.addViewType(() => {
8
- return new ViewType({
9
- name: 'SpreadsheetView',
10
- displayName: 'Spreadsheet view',
11
- stateModel,
12
- ReactComponent: lazy(() => import('./components/SpreadsheetView')),
13
- })
14
- })
15
- }
16
-
17
- export {
18
- type SpreadsheetViewModel,
19
- type SpreadsheetViewStateModel,
20
- } from './models/SpreadsheetView'
@@ -1,21 +0,0 @@
1
- import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType'
2
- import { FilterModelType as NumberFilterModel } from './Number'
3
- import { types } from 'mobx-state-tree'
4
-
5
- const FilterModelType = types.compose(
6
- NumberFilterModel,
7
- types.model({
8
- type: types.literal('LocEnd'),
9
- }),
10
- )
11
-
12
- const LocEnd = MakeSpreadsheetColumnType('LocEnd', {
13
- categoryName: 'Location',
14
- displayName: 'End',
15
- compare(cellA: { text: string }, cellB: { text: string }) {
16
- return parseFloat(cellA.text) - parseFloat(cellB.text)
17
- },
18
- FilterModelType,
19
- })
20
-
21
- export default LocEnd
@@ -1,21 +0,0 @@
1
- import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType'
2
- import { FilterModelType as NumberFilterModel } from './Text'
3
- import { types } from 'mobx-state-tree'
4
-
5
- const FilterModelType = types.compose(
6
- NumberFilterModel,
7
- types.model({
8
- type: types.literal('LocRef'),
9
- }),
10
- )
11
-
12
- const LocRef = MakeSpreadsheetColumnType('LocRef', {
13
- categoryName: 'Location',
14
- displayName: 'Reference seq',
15
- compare(cellA: { text: string }, cellB: { text: string }) {
16
- return cellA.text.localeCompare(cellB.text)
17
- },
18
- FilterModelType,
19
- })
20
-
21
- export default LocRef
@@ -1,21 +0,0 @@
1
- import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType'
2
- import { types } from 'mobx-state-tree'
3
- import { FilterModelType as NumberFilterModel } from './Number'
4
-
5
- const FilterModelType = types.compose(
6
- NumberFilterModel,
7
- types.model({
8
- type: types.literal('LocStart'),
9
- }),
10
- )
11
-
12
- const LocStart = MakeSpreadsheetColumnType('LocStart', {
13
- categoryName: 'Location',
14
- displayName: 'Start',
15
- compare(cellA: { text: string }, cellB: { text: string }) {
16
- return parseFloat(cellA.text) - parseFloat(cellB.text)
17
- },
18
- FilterModelType,
19
- })
20
-
21
- export default LocStart
@@ -1,328 +0,0 @@
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 { observer } from 'mobx-react'
11
- import { types, getParent, getPropertyMembers } from 'mobx-state-tree'
12
-
13
- // jbrowse imports
14
- import {
15
- getPropertyType,
16
- getEnumerationValues,
17
- getSubType,
18
- } from '@jbrowse/core/util/mst-reflection'
19
- import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'
20
- import {
21
- doesIntersect2,
22
- isContainedWithin,
23
- compareLocs,
24
- getSession,
25
- parseLocString,
26
- } from '@jbrowse/core/util'
27
-
28
- // icons
29
- import ClearIcon from '@mui/icons-material/Clear'
30
-
31
- // locals
32
- import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType'
33
-
34
- type LGV = LinearGenomeViewModel
35
-
36
- const useStyles = makeStyles()({
37
- textFilterControlAdornment: { marginRight: '-18px' },
38
- textFilterControl: {
39
- '& .MuiInput-formControl': {
40
- marginTop: 8,
41
- },
42
- '& .MuiInputLabel-formControl': {
43
- top: '-7px',
44
- '&.MuiInputLabel-shrink': {
45
- top: '-3px',
46
- },
47
- },
48
- },
49
- })
50
-
51
- // React component for the column filter control
52
- const FilterReactComponent = observer(function ({
53
- filterModel,
54
- }: {
55
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
56
- filterModel: any
57
- }) {
58
- const { classes } = useStyles()
59
- const operationChoices = getEnumerationValues(
60
- getSubType(getPropertyType(getPropertyMembers(filterModel), 'operation')),
61
- )
62
- return (
63
- <>
64
- <Select
65
- value={filterModel.operation}
66
- onChange={event => filterModel.setOperation(String(event.target.value))}
67
- >
68
- {operationChoices.map(name => (
69
- <MenuItem key={name} value={name}>
70
- {name}
71
- </MenuItem>
72
- ))}
73
- </Select>{' '}
74
- <TextField
75
- label="range"
76
- placeholder="chr1:100-200"
77
- error={filterModel.locStringIsInvalid}
78
- value={filterModel.locString}
79
- onChange={evt => filterModel.setLocString(evt.target.value)}
80
- className={classes.textFilterControl}
81
- InputProps={{
82
- endAdornment: (
83
- <InputAdornment
84
- className={classes.textFilterControlAdornment}
85
- position="end"
86
- >
87
- <IconButton
88
- aria-label="clear filter"
89
- onClick={() => filterModel.setLocString('')}
90
- >
91
- <ClearIcon />
92
- </IconButton>
93
- </InputAdornment>
94
- ),
95
- }}
96
- />
97
- </>
98
- )
99
- })
100
-
101
- const OPERATIONS = [
102
- 'overlaps with',
103
- 'contained within',
104
- 'fully contains',
105
- 'does not overlap',
106
- 'not contained within',
107
- 'does not contain',
108
- ]
109
-
110
- interface Loc {
111
- start: number
112
- end: number
113
- refName: string
114
- }
115
-
116
- // NOTE: assembly names, if present, are ignored in all of these predicates
117
- const OPERATION_PREDICATES = {
118
- 'overlaps with': (cellLocation, specifiedLocation) => {
119
- return (
120
- cellLocation.refName === specifiedLocation.refName &&
121
- doesIntersect2(
122
- cellLocation.start,
123
- cellLocation.end,
124
- specifiedLocation.start,
125
- specifiedLocation.end,
126
- )
127
- )
128
- },
129
- 'contained within': (cellLocation, specifiedLocation) => {
130
- return (
131
- cellLocation.refName === specifiedLocation.refName &&
132
- isContainedWithin(
133
- cellLocation.start,
134
- cellLocation.end,
135
- specifiedLocation.start,
136
- specifiedLocation.end,
137
- )
138
- )
139
- },
140
- 'fully contains': (cellLocation, specifiedLocation) => {
141
- return (
142
- cellLocation.refName === specifiedLocation.refName &&
143
- isContainedWithin(
144
- specifiedLocation.start,
145
- specifiedLocation.end,
146
- cellLocation.start,
147
- cellLocation.end,
148
- )
149
- )
150
- },
151
- } as { [key: string]: (a: Loc, b: Loc) => boolean }
152
-
153
- OPERATION_PREDICATES['does not overlap'] = (
154
- cellLocation,
155
- specifiedLocation,
156
- ) => {
157
- return !OPERATION_PREDICATES['overlaps with'](cellLocation, specifiedLocation)
158
- }
159
- OPERATION_PREDICATES['not contained within'] = (
160
- cellLocation,
161
- specifiedLocation,
162
- ) => {
163
- return !OPERATION_PREDICATES['contained within'](
164
- cellLocation,
165
- specifiedLocation,
166
- )
167
- }
168
- OPERATION_PREDICATES['does not contain'] = (
169
- cellLocation,
170
- specifiedLocation,
171
- ) => {
172
- return !OPERATION_PREDICATES['fully contains'](
173
- cellLocation,
174
- specifiedLocation,
175
- )
176
- }
177
-
178
- // MST model for the column filter control
179
- const FilterModelType = types
180
- .model('ColumnLocStringFilter', {
181
- type: types.literal('LocString'),
182
- columnNumber: types.integer,
183
- locString: '',
184
- operation: types.optional(types.enumeration(OPERATIONS), OPERATIONS[0]),
185
- })
186
- .views(self => ({
187
- get locStringIsInvalid() {
188
- if (self.locString) {
189
- const parsed = this.parsedLocString
190
- return (
191
- !parsed ||
192
- parsed.refName === '' ||
193
- typeof parsed.start !== 'number' ||
194
- typeof parsed.end !== 'number' ||
195
- parsed.start > parsed.end
196
- )
197
- }
198
- return false
199
- },
200
- get parsedLocString() {
201
- const session = getSession(self)
202
-
203
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
204
- const model = getParent<any>(self, 3).spreadsheet
205
- const { assemblyName } = model
206
- try {
207
- return parseLocString(self.locString, refName =>
208
- session.assemblyManager.isValidRefName(refName, assemblyName),
209
- )
210
- } catch (e) {
211
- return undefined
212
- }
213
- },
214
- }))
215
- .views(self => ({
216
- // returns a function that tests the given row
217
- get predicate() {
218
- const {
219
- locString,
220
- locStringIsInvalid,
221
- parsedLocString,
222
- operation,
223
- columnNumber,
224
- } = self // avoid closing over self
225
- if (!locString || locStringIsInvalid || !parsedLocString) {
226
- return function alwaysTrue() {
227
- return true
228
- }
229
- }
230
-
231
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
232
- return function stringPredicate(_sheet: any, row: any) {
233
- const { cellsWithDerived: cells } = row
234
- const cell = cells[columnNumber]
235
-
236
- if (!cell || !cell.text || !cell.extendedData) {
237
- return false
238
- }
239
- const parsedCellText = cell.extendedData
240
- if (!parsedCellText.refName) {
241
- return false
242
- }
243
-
244
- const predicate = OPERATION_PREDICATES[operation]
245
- if (!predicate) {
246
- throw new Error(`"${operation}" not implemented in location filter`)
247
- }
248
-
249
- return predicate(parsedCellText, parsedLocString as Loc)
250
- }
251
- },
252
- }))
253
- .actions(self => ({
254
- setLocString(s: string) {
255
- self.locString = s
256
- },
257
- setOperation(op: string) {
258
- self.operation = op
259
- },
260
- }))
261
- .volatile(() => ({ ReactComponent: FilterReactComponent }))
262
-
263
- // opens a new LGV at the location described in the locString in the cell text
264
-
265
- async function locationLinkClick(
266
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
267
- spreadsheet: any,
268
- _columnNumber: number,
269
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
270
- cell: any,
271
- ) {
272
- const session = getSession(spreadsheet)
273
- const { assemblyName } = spreadsheet
274
-
275
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
276
- const { id } = getParent<any>(spreadsheet)
277
-
278
- const newViewId = `${id}_${assemblyName}`
279
- let view = session.views.find(v => v.id === newViewId) as LGV
280
- if (!view) {
281
- view = session.addView('LinearGenomeView', {
282
- id: newViewId,
283
- }) as LGV
284
- }
285
- await view.navToLocString(cell.text, assemblyName)
286
- }
287
-
288
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
289
- type DataCell = any
290
-
291
- const DataCellReactComponent = observer(function ({
292
- cell,
293
- columnNumber,
294
- spreadsheet,
295
- }: DataCell) {
296
- return (
297
- <a
298
- onClick={async evt => {
299
- evt.preventDefault()
300
- const session = getSession(spreadsheet)
301
- try {
302
- await locationLinkClick(spreadsheet, columnNumber, cell)
303
- } catch (e) {
304
- console.error(e)
305
- session.notify(`${e}`, 'error')
306
- }
307
- }}
308
- title="open a new linear genome view here"
309
- href="#link"
310
- >
311
- {cell.text}
312
- </a>
313
- )
314
- })
315
-
316
- const LocStringColumnType = MakeSpreadsheetColumnType('LocString', {
317
- categoryName: 'Location',
318
- displayName: 'Full location',
319
-
320
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
321
- compare(cellA: { extendedData: any }, cellB: { extendedData: any }) {
322
- return compareLocs(cellA.extendedData, cellB.extendedData)
323
- },
324
- FilterModelType,
325
- DataCellReactComponent,
326
- })
327
-
328
- export default LocStringColumnType
@@ -1,38 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import React from 'react'
3
- import { types } from 'mobx-state-tree'
4
-
5
- /** utility function for assembling the MST model of a column data type */
6
- export default function MakeSpreadsheetColumnType(
7
- name: string,
8
- {
9
- DataCellReactComponent = null,
10
- FilterModelType = null,
11
- compare,
12
- displayName = undefined,
13
- categoryName = undefined,
14
- }: {
15
- compare?: any
16
- DataCellReactComponent?: React.FC<any> | null
17
- FilterModelType?: any
18
- displayName?: string
19
- categoryName?: string
20
- },
21
- ) {
22
- return types
23
- .model(`ColumnDataType${name}`, {
24
- type: types.literal(name),
25
- })
26
- .volatile(() => ({
27
- DataCellReactComponent,
28
- FilterModelType: FilterModelType,
29
- displayName: displayName || name,
30
- categoryName,
31
- }))
32
- .views(() => ({
33
- compare,
34
- get hasFilter() {
35
- return !!FilterModelType
36
- },
37
- }))
38
- }
@@ -1,177 +0,0 @@
1
- import React from 'react'
2
- import { types } from 'mobx-state-tree'
3
- import { observer } from 'mobx-react'
4
- import { MenuItem, Select, TextField } from '@mui/material'
5
- import { makeStyles } from 'tss-react/mui'
6
- import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType'
7
-
8
- const OPERATIONS = [
9
- 'equals',
10
- 'greater than',
11
- 'less than',
12
- 'between',
13
- 'not between',
14
- ]
15
-
16
- // NOTE: assembly names, if present, are ignored in all of these predicates
17
- const OPERATION_PREDICATES = {
18
- equals: (numberInCell, firstNumber) => {
19
- return numberInCell === firstNumber
20
- },
21
- 'greater than': (numberInCell, firstNumber) => {
22
- return numberInCell > firstNumber
23
- },
24
- 'less than': (numberInCell, firstNumber) => {
25
- return numberInCell < firstNumber
26
- },
27
- between: (numberInCell, firstNumber, secondNumber) => {
28
- return (
29
- numberInCell > firstNumber &&
30
- secondNumber !== undefined &&
31
- numberInCell < secondNumber
32
- )
33
- },
34
- } as { [key: string]: (arg0: number, a: number, b?: number) => boolean }
35
-
36
- OPERATION_PREDICATES['not between'] = (
37
- numberInCell,
38
- firstNumber,
39
- secondNumber,
40
- ) => {
41
- return !OPERATION_PREDICATES.between(numberInCell, firstNumber, secondNumber)
42
- }
43
-
44
- const useStyles = makeStyles()({
45
- textFilterControlAdornment: { marginRight: '-18px' },
46
- textFilterControl: {
47
- '& .MuiInput-formControl': {
48
- marginTop: 8,
49
- },
50
- '& .MuiInputLabel-formControl': {
51
- top: '-7px',
52
- '&.MuiInputLabel-shrink': {
53
- top: '-3px',
54
- },
55
- },
56
- },
57
- })
58
-
59
- // React component for the column filter control
60
- const FilterReactComponent = observer(
61
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
62
- ({ filterModel }: { filterModel: any }) => {
63
- const { classes } = useStyles()
64
-
65
- const operationChoices = OPERATIONS
66
-
67
- return (
68
- <>
69
- <Select
70
- value={filterModel.operation}
71
- onChange={e => filterModel.setOperation(String(e.target.value))}
72
- >
73
- {operationChoices.map(name => (
74
- <MenuItem key={name} value={name}>
75
- {name}
76
- </MenuItem>
77
- ))}
78
- </Select>{' '}
79
- <TextField
80
- label="number"
81
- placeholder="123"
82
- type="number"
83
- error={filterModel.firstNumberIsInvalid}
84
- defaultValue={filterModel.firstNumber}
85
- onChange={evt => {
86
- filterModel.setFirstNumber(parseFloat(evt.target.value))
87
- }}
88
- className={classes.textFilterControl}
89
- />
90
- {filterModel.operation !== 'between' &&
91
- filterModel.operation !== 'not between' ? null : (
92
- <>
93
- {' and '}
94
- <TextField
95
- label="number"
96
- placeholder="456"
97
- type="number"
98
- error={filterModel.secondNumberIsInvalid}
99
- defaultValue={filterModel.secondNumber}
100
- onChange={evt =>
101
- filterModel.setSecondNumber(parseFloat(evt.target.value))
102
- }
103
- className={classes.textFilterControl}
104
- />
105
- </>
106
- )}
107
- </>
108
- )
109
- },
110
- )
111
-
112
- // MST model for the column filter control
113
- const FilterModelType = types
114
- .model('ColumnNumberFilter', {
115
- type: types.literal('Number'),
116
- columnNumber: types.integer,
117
- firstNumber: types.maybe(types.number),
118
- secondNumber: types.maybe(types.number),
119
- operation: types.optional(types.enumeration(OPERATIONS), OPERATIONS[0]),
120
- })
121
- .views(self => ({
122
- // returns a function that tests the given row
123
- get predicate() {
124
- if (typeof self.firstNumber !== 'number') {
125
- return function alwaysTrue() {
126
- return true
127
- }
128
- }
129
-
130
- const { firstNumber, secondNumber, operation, columnNumber } = self // avoid closing over self
131
-
132
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
133
- return function stringPredicate(_sheet: any, row: any) {
134
- const { cellsWithDerived } = row
135
- const cell = cellsWithDerived[columnNumber]
136
-
137
- if (!cell || !cell.text) {
138
- return false
139
- }
140
-
141
- const parsedCellText = parseFloat(cell.text)
142
- if (typeof parsedCellText !== 'number') {
143
- return false
144
- }
145
-
146
- const predicate = OPERATION_PREDICATES[operation]
147
- if (!predicate) {
148
- throw new Error(`"${operation}" not implemented in location filter`)
149
- }
150
-
151
- return predicate(parsedCellText, firstNumber, secondNumber)
152
- }
153
- },
154
- }))
155
- .actions(self => ({
156
- setFirstNumber(n: number) {
157
- self.firstNumber =
158
- Number.isNaN(n) || typeof n !== 'number' ? undefined : n
159
- },
160
- setSecondNumber(n: number) {
161
- self.secondNumber =
162
- Number.isNaN(n) || typeof n !== 'number' ? undefined : n
163
- },
164
- setOperation(op: string) {
165
- self.operation = op
166
- },
167
- }))
168
- .volatile(() => ({ ReactComponent: FilterReactComponent }))
169
-
170
- const NumberColumn = MakeSpreadsheetColumnType('Number', {
171
- compare(cellA: { text: string }, cellB: { text: string }) {
172
- return parseFloat(cellA.text) - parseFloat(cellB.text)
173
- },
174
- FilterModelType,
175
- })
176
-
177
- export { NumberColumn, FilterModelType }