@jbrowse/plugin-spreadsheet-view 2.17.0 → 2.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/dist/LaunchSpreadsheetView/index.d.ts +1 -1
  2. package/dist/LaunchSpreadsheetView/index.js +1 -3
  3. package/dist/SpreadsheetView/ImportWizard.d.ts +51 -0
  4. package/dist/SpreadsheetView/ImportWizard.js +240 -0
  5. package/dist/SpreadsheetView/SpreadsheetModel.d.ts +79 -0
  6. package/dist/SpreadsheetView/SpreadsheetModel.js +133 -0
  7. package/dist/SpreadsheetView/SpreadsheetViewModel.d.ts +299 -0
  8. package/dist/SpreadsheetView/SpreadsheetViewModel.js +94 -0
  9. package/dist/SpreadsheetView/components/BreakendMultiLevelOptionDialog.d.ts +1 -0
  10. package/dist/SpreadsheetView/components/BreakendMultiLevelOptionDialog.js +5 -0
  11. package/dist/SpreadsheetView/components/BreakendSingleLevelOptionDialog.d.ts +1 -0
  12. package/dist/SpreadsheetView/components/BreakendSingleLevelOptionDialog.js +5 -0
  13. package/dist/SpreadsheetView/components/FeatureMenu.d.ts +8 -0
  14. package/dist/SpreadsheetView/components/FeatureMenu.js +95 -0
  15. package/dist/SpreadsheetView/components/ImportWizard.d.ts +2 -2
  16. package/dist/SpreadsheetView/components/ImportWizard.js +40 -43
  17. package/dist/SpreadsheetView/components/LocationCell.d.ts +8 -0
  18. package/dist/SpreadsheetView/components/LocationCell.js +31 -0
  19. package/dist/SpreadsheetView/components/NumberEditor.d.ts +1 -1
  20. package/dist/SpreadsheetView/components/NumberEditor.js +1 -3
  21. package/dist/SpreadsheetView/components/SpreadsheetDataGrid.d.ts +6 -0
  22. package/dist/SpreadsheetView/components/SpreadsheetDataGrid.js +27 -0
  23. package/dist/SpreadsheetView/components/SpreadsheetView.d.ts +3 -3
  24. package/dist/SpreadsheetView/components/SpreadsheetView.js +23 -44
  25. package/dist/SpreadsheetView/components/TrackSelector.d.ts +7 -0
  26. package/dist/SpreadsheetView/components/TrackSelector.js +49 -0
  27. package/dist/SpreadsheetView/importAdapters/BedImport.d.ts +26 -17
  28. package/dist/SpreadsheetView/importAdapters/BedImport.js +53 -139
  29. package/dist/SpreadsheetView/importAdapters/BedpeImport.d.ts +36 -0
  30. package/dist/SpreadsheetView/importAdapters/BedpeImport.js +79 -0
  31. package/dist/SpreadsheetView/importAdapters/STARFusionImport.d.ts +25 -9
  32. package/dist/SpreadsheetView/importAdapters/STARFusionImport.js +27 -62
  33. package/dist/SpreadsheetView/importAdapters/VcfImport.d.ts +19 -12
  34. package/dist/SpreadsheetView/importAdapters/VcfImport.js +53 -98
  35. package/dist/SpreadsheetView/importAdapters/isNumber.d.ts +1 -0
  36. package/dist/SpreadsheetView/importAdapters/isNumber.js +14 -0
  37. package/dist/SpreadsheetView/importAdapters/util.d.ts +2 -0
  38. package/dist/SpreadsheetView/importAdapters/util.js +22 -0
  39. package/dist/SpreadsheetView/index.d.ts +2 -2
  40. package/dist/SpreadsheetView/index.js +2 -2
  41. package/dist/SpreadsheetView/util.d.ts +7 -0
  42. package/dist/SpreadsheetView/util.js +13 -0
  43. package/dist/index.d.ts +1 -1
  44. package/dist/index.js +1 -3
  45. package/esm/LaunchSpreadsheetView/index.d.ts +1 -1
  46. package/esm/LaunchSpreadsheetView/index.js +1 -3
  47. package/esm/SpreadsheetView/ImportWizard.d.ts +51 -0
  48. package/esm/SpreadsheetView/ImportWizard.js +214 -0
  49. package/esm/SpreadsheetView/SpreadsheetModel.d.ts +79 -0
  50. package/esm/SpreadsheetView/SpreadsheetModel.js +127 -0
  51. package/esm/SpreadsheetView/SpreadsheetViewModel.d.ts +299 -0
  52. package/esm/SpreadsheetView/SpreadsheetViewModel.js +88 -0
  53. package/esm/SpreadsheetView/components/BreakendMultiLevelOptionDialog.d.ts +1 -0
  54. package/esm/SpreadsheetView/components/BreakendMultiLevelOptionDialog.js +1 -0
  55. package/esm/SpreadsheetView/components/BreakendSingleLevelOptionDialog.d.ts +1 -0
  56. package/esm/SpreadsheetView/components/BreakendSingleLevelOptionDialog.js +1 -0
  57. package/esm/SpreadsheetView/components/FeatureMenu.d.ts +8 -0
  58. package/esm/SpreadsheetView/components/FeatureMenu.js +66 -0
  59. package/esm/SpreadsheetView/components/ImportWizard.d.ts +2 -2
  60. package/esm/SpreadsheetView/components/ImportWizard.js +41 -44
  61. package/esm/SpreadsheetView/components/LocationCell.d.ts +8 -0
  62. package/esm/SpreadsheetView/components/LocationCell.js +25 -0
  63. package/esm/SpreadsheetView/components/NumberEditor.d.ts +1 -1
  64. package/esm/SpreadsheetView/components/NumberEditor.js +2 -4
  65. package/esm/SpreadsheetView/components/SpreadsheetDataGrid.d.ts +6 -0
  66. package/esm/SpreadsheetView/components/SpreadsheetDataGrid.js +22 -0
  67. package/esm/SpreadsheetView/components/SpreadsheetView.d.ts +3 -3
  68. package/esm/SpreadsheetView/components/SpreadsheetView.js +24 -45
  69. package/esm/SpreadsheetView/components/TrackSelector.d.ts +7 -0
  70. package/esm/SpreadsheetView/components/TrackSelector.js +24 -0
  71. package/esm/SpreadsheetView/importAdapters/BedImport.d.ts +26 -17
  72. package/esm/SpreadsheetView/importAdapters/BedImport.js +53 -137
  73. package/esm/SpreadsheetView/importAdapters/BedpeImport.d.ts +36 -0
  74. package/esm/SpreadsheetView/importAdapters/BedpeImport.js +76 -0
  75. package/esm/SpreadsheetView/importAdapters/STARFusionImport.d.ts +25 -9
  76. package/esm/SpreadsheetView/importAdapters/STARFusionImport.js +27 -62
  77. package/esm/SpreadsheetView/importAdapters/VcfImport.d.ts +19 -12
  78. package/esm/SpreadsheetView/importAdapters/VcfImport.js +53 -97
  79. package/esm/SpreadsheetView/importAdapters/isNumber.d.ts +1 -0
  80. package/esm/SpreadsheetView/importAdapters/isNumber.js +11 -0
  81. package/esm/SpreadsheetView/importAdapters/util.d.ts +2 -0
  82. package/esm/SpreadsheetView/importAdapters/util.js +18 -0
  83. package/esm/SpreadsheetView/index.d.ts +2 -2
  84. package/esm/SpreadsheetView/index.js +2 -2
  85. package/esm/SpreadsheetView/util.d.ts +7 -0
  86. package/esm/SpreadsheetView/util.js +10 -0
  87. package/esm/index.d.ts +1 -1
  88. package/esm/index.js +1 -3
  89. package/package.json +6 -6
  90. package/dist/SpreadsheetView/components/CellData.d.ts +0 -9
  91. package/dist/SpreadsheetView/components/CellData.js +0 -14
  92. package/dist/SpreadsheetView/components/ColumnFilterControls.d.ts +0 -3
  93. package/dist/SpreadsheetView/components/ColumnFilterControls.js +0 -58
  94. package/dist/SpreadsheetView/components/ColumnMenu.d.ts +0 -16
  95. package/dist/SpreadsheetView/components/ColumnMenu.js +0 -140
  96. package/dist/SpreadsheetView/components/DataRow.d.ts +0 -12
  97. package/dist/SpreadsheetView/components/DataRow.js +0 -81
  98. package/dist/SpreadsheetView/components/DataTable.d.ts +0 -10
  99. package/dist/SpreadsheetView/components/DataTable.js +0 -42
  100. package/dist/SpreadsheetView/components/DataTableHeader.d.ts +0 -6
  101. package/dist/SpreadsheetView/components/DataTableHeader.js +0 -104
  102. package/dist/SpreadsheetView/components/GlobalFilterControls.d.ts +0 -5
  103. package/dist/SpreadsheetView/components/GlobalFilterControls.js +0 -68
  104. package/dist/SpreadsheetView/components/RowCountMessage.d.ts +0 -6
  105. package/dist/SpreadsheetView/components/RowCountMessage.js +0 -33
  106. package/dist/SpreadsheetView/components/RowMenu.d.ts +0 -9
  107. package/dist/SpreadsheetView/components/RowMenu.js +0 -39
  108. package/dist/SpreadsheetView/components/SortIndicator.d.ts +0 -6
  109. package/dist/SpreadsheetView/components/SortIndicator.js +0 -27
  110. package/dist/SpreadsheetView/components/Spreadsheet.d.ts +0 -11
  111. package/dist/SpreadsheetView/components/Spreadsheet.js +0 -25
  112. package/dist/SpreadsheetView/components/StatusBar.d.ts +0 -11
  113. package/dist/SpreadsheetView/components/StatusBar.js +0 -44
  114. package/dist/SpreadsheetView/importAdapters/ImportUtils.d.ts +0 -42
  115. package/dist/SpreadsheetView/importAdapters/ImportUtils.js +0 -123
  116. package/dist/SpreadsheetView/models/ColumnDataTypes/LocEnd.d.ts +0 -12
  117. package/dist/SpreadsheetView/models/ColumnDataTypes/LocEnd.js +0 -20
  118. package/dist/SpreadsheetView/models/ColumnDataTypes/LocRef.d.ts +0 -12
  119. package/dist/SpreadsheetView/models/ColumnDataTypes/LocRef.js +0 -20
  120. package/dist/SpreadsheetView/models/ColumnDataTypes/LocStart.d.ts +0 -12
  121. package/dist/SpreadsheetView/models/ColumnDataTypes/LocStart.js +0 -20
  122. package/dist/SpreadsheetView/models/ColumnDataTypes/LocString.d.ts +0 -13
  123. package/dist/SpreadsheetView/models/ColumnDataTypes/LocString.js +0 -183
  124. package/dist/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.d.ts +0 -19
  125. package/dist/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js +0 -23
  126. package/dist/SpreadsheetView/models/ColumnDataTypes/Number.d.ts +0 -30
  127. package/dist/SpreadsheetView/models/ColumnDataTypes/Number.js +0 -126
  128. package/dist/SpreadsheetView/models/ColumnDataTypes/Text.d.ts +0 -28
  129. package/dist/SpreadsheetView/models/ColumnDataTypes/Text.js +0 -129
  130. package/dist/SpreadsheetView/models/ColumnDataTypes/index.d.ts +0 -71
  131. package/dist/SpreadsheetView/models/ColumnDataTypes/index.js +0 -37
  132. package/dist/SpreadsheetView/models/FilterControls.d.ts +0 -26
  133. package/dist/SpreadsheetView/models/FilterControls.js +0 -85
  134. package/dist/SpreadsheetView/models/ImportWizard.d.ts +0 -31
  135. package/dist/SpreadsheetView/models/ImportWizard.js +0 -186
  136. package/dist/SpreadsheetView/models/Row.d.ts +0 -17
  137. package/dist/SpreadsheetView/models/Row.js +0 -43
  138. package/dist/SpreadsheetView/models/Spreadsheet.d.ts +0 -260
  139. package/dist/SpreadsheetView/models/Spreadsheet.js +0 -174
  140. package/dist/SpreadsheetView/models/SpreadsheetView.d.ts +0 -482
  141. package/dist/SpreadsheetView/models/SpreadsheetView.js +0 -199
  142. package/dist/SpreadsheetView/models/StaticRowSet.d.ts +0 -163
  143. package/dist/SpreadsheetView/models/StaticRowSet.js +0 -56
  144. package/esm/SpreadsheetView/components/CellData.d.ts +0 -9
  145. package/esm/SpreadsheetView/components/CellData.js +0 -9
  146. package/esm/SpreadsheetView/components/ColumnFilterControls.d.ts +0 -3
  147. package/esm/SpreadsheetView/components/ColumnFilterControls.js +0 -53
  148. package/esm/SpreadsheetView/components/ColumnMenu.d.ts +0 -16
  149. package/esm/SpreadsheetView/components/ColumnMenu.js +0 -135
  150. package/esm/SpreadsheetView/components/DataRow.d.ts +0 -12
  151. package/esm/SpreadsheetView/components/DataRow.js +0 -76
  152. package/esm/SpreadsheetView/components/DataTable.d.ts +0 -10
  153. package/esm/SpreadsheetView/components/DataTable.js +0 -37
  154. package/esm/SpreadsheetView/components/DataTableHeader.d.ts +0 -6
  155. package/esm/SpreadsheetView/components/DataTableHeader.js +0 -76
  156. package/esm/SpreadsheetView/components/GlobalFilterControls.d.ts +0 -5
  157. package/esm/SpreadsheetView/components/GlobalFilterControls.js +0 -40
  158. package/esm/SpreadsheetView/components/RowCountMessage.d.ts +0 -6
  159. package/esm/SpreadsheetView/components/RowCountMessage.js +0 -28
  160. package/esm/SpreadsheetView/components/RowMenu.d.ts +0 -9
  161. package/esm/SpreadsheetView/components/RowMenu.js +0 -34
  162. package/esm/SpreadsheetView/components/SortIndicator.d.ts +0 -6
  163. package/esm/SpreadsheetView/components/SortIndicator.js +0 -21
  164. package/esm/SpreadsheetView/components/Spreadsheet.d.ts +0 -11
  165. package/esm/SpreadsheetView/components/Spreadsheet.js +0 -20
  166. package/esm/SpreadsheetView/components/StatusBar.d.ts +0 -11
  167. package/esm/SpreadsheetView/components/StatusBar.js +0 -39
  168. package/esm/SpreadsheetView/importAdapters/ImportUtils.d.ts +0 -42
  169. package/esm/SpreadsheetView/importAdapters/ImportUtils.js +0 -95
  170. package/esm/SpreadsheetView/models/ColumnDataTypes/LocEnd.d.ts +0 -12
  171. package/esm/SpreadsheetView/models/ColumnDataTypes/LocEnd.js +0 -15
  172. package/esm/SpreadsheetView/models/ColumnDataTypes/LocRef.d.ts +0 -12
  173. package/esm/SpreadsheetView/models/ColumnDataTypes/LocRef.js +0 -15
  174. package/esm/SpreadsheetView/models/ColumnDataTypes/LocStart.d.ts +0 -12
  175. package/esm/SpreadsheetView/models/ColumnDataTypes/LocStart.js +0 -15
  176. package/esm/SpreadsheetView/models/ColumnDataTypes/LocString.d.ts +0 -13
  177. package/esm/SpreadsheetView/models/ColumnDataTypes/LocString.js +0 -178
  178. package/esm/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.d.ts +0 -19
  179. package/esm/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js +0 -20
  180. package/esm/SpreadsheetView/models/ColumnDataTypes/Number.d.ts +0 -30
  181. package/esm/SpreadsheetView/models/ColumnDataTypes/Number.js +0 -119
  182. package/esm/SpreadsheetView/models/ColumnDataTypes/Text.d.ts +0 -28
  183. package/esm/SpreadsheetView/models/ColumnDataTypes/Text.js +0 -122
  184. package/esm/SpreadsheetView/models/ColumnDataTypes/index.d.ts +0 -71
  185. package/esm/SpreadsheetView/models/ColumnDataTypes/index.js +0 -29
  186. package/esm/SpreadsheetView/models/FilterControls.d.ts +0 -26
  187. package/esm/SpreadsheetView/models/FilterControls.js +0 -83
  188. package/esm/SpreadsheetView/models/ImportWizard.d.ts +0 -31
  189. package/esm/SpreadsheetView/models/ImportWizard.js +0 -161
  190. package/esm/SpreadsheetView/models/Row.d.ts +0 -17
  191. package/esm/SpreadsheetView/models/Row.js +0 -41
  192. package/esm/SpreadsheetView/models/Spreadsheet.d.ts +0 -260
  193. package/esm/SpreadsheetView/models/Spreadsheet.js +0 -169
  194. package/esm/SpreadsheetView/models/SpreadsheetView.d.ts +0 -482
  195. package/esm/SpreadsheetView/models/SpreadsheetView.js +0 -194
  196. package/esm/SpreadsheetView/models/StaticRowSet.d.ts +0 -163
  197. package/esm/SpreadsheetView/models/StaticRowSet.js +0 -51
@@ -1,12 +0,0 @@
1
- declare const LocStart: import("mobx-state-tree").IModelType<{
2
- type: import("mobx-state-tree").ISimpleType<string>;
3
- }, {
4
- DataCellReactComponent: import("react").FC<any> | null;
5
- FilterModelType: any;
6
- displayName: string;
7
- categoryName: string | undefined;
8
- } & {
9
- compare: any;
10
- readonly hasFilter: boolean;
11
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
12
- export default LocStart;
@@ -1,15 +0,0 @@
1
- import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType';
2
- import { types } from 'mobx-state-tree';
3
- import { FilterModelType as NumberFilterModel } from './Number';
4
- const FilterModelType = types.compose(NumberFilterModel, types.model({
5
- type: types.literal('LocStart'),
6
- }));
7
- const LocStart = MakeSpreadsheetColumnType('LocStart', {
8
- categoryName: 'Location',
9
- displayName: 'Start',
10
- compare(cellA, cellB) {
11
- return Number.parseFloat(cellA.text) - Number.parseFloat(cellB.text);
12
- },
13
- FilterModelType,
14
- });
15
- export default LocStart;
@@ -1,13 +0,0 @@
1
- import React from 'react';
2
- declare const LocStringColumnType: import("mobx-state-tree").IModelType<{
3
- type: import("mobx-state-tree").ISimpleType<string>;
4
- }, {
5
- DataCellReactComponent: React.FC<any> | null;
6
- FilterModelType: any;
7
- displayName: string;
8
- categoryName: string | undefined;
9
- } & {
10
- compare: any;
11
- readonly hasFilter: boolean;
12
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
13
- export default LocStringColumnType;
@@ -1,178 +0,0 @@
1
- import React from 'react';
2
- import { IconButton, TextField, MenuItem, InputAdornment, Select, } from '@mui/material';
3
- import { makeStyles } from 'tss-react/mui';
4
- import { observer } from 'mobx-react';
5
- import { types, getParent, getPropertyMembers } from 'mobx-state-tree';
6
- // jbrowse imports
7
- import { getPropertyType, getEnumerationValues, getSubType, } from '@jbrowse/core/util/mst-reflection';
8
- import { doesIntersect2, isContainedWithin, compareLocs, getSession, parseLocString, } from '@jbrowse/core/util';
9
- // icons
10
- import ClearIcon from '@mui/icons-material/Clear';
11
- // locals
12
- import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType';
13
- const useStyles = makeStyles()({
14
- textFilterControlAdornment: { marginRight: '-18px' },
15
- textFilterControl: {
16
- '& .MuiInput-formControl': {
17
- marginTop: 8,
18
- },
19
- '& .MuiInputLabel-formControl': {
20
- top: '-7px',
21
- '&.MuiInputLabel-shrink': {
22
- top: '-3px',
23
- },
24
- },
25
- },
26
- });
27
- // React component for the column filter control
28
- const FilterReactComponent = observer(function ({ filterModel, }) {
29
- const { classes } = useStyles();
30
- const operationChoices = getEnumerationValues(getSubType(getPropertyType(getPropertyMembers(filterModel), 'operation')));
31
- return (React.createElement(React.Fragment, null,
32
- React.createElement(Select, { value: filterModel.operation, onChange: event => filterModel.setOperation(String(event.target.value)) }, operationChoices.map(name => (React.createElement(MenuItem, { key: name, value: name }, name)))),
33
- ' ',
34
- React.createElement(TextField, { label: "range", placeholder: "chr1:100-200", error: filterModel.locStringIsInvalid, value: filterModel.locString, onChange: evt => filterModel.setLocString(evt.target.value), className: classes.textFilterControl, slotProps: {
35
- input: {
36
- endAdornment: (React.createElement(InputAdornment, { className: classes.textFilterControlAdornment, position: "end" },
37
- React.createElement(IconButton, { "aria-label": "clear filter", onClick: () => filterModel.setLocString('') },
38
- React.createElement(ClearIcon, null)))),
39
- },
40
- } })));
41
- });
42
- const OPERATIONS = [
43
- 'overlaps with',
44
- 'contained within',
45
- 'fully contains',
46
- 'does not overlap',
47
- 'not contained within',
48
- 'does not contain',
49
- ];
50
- // NOTE: assembly names, if present, are ignored in all of these predicates
51
- const OPERATION_PREDICATES = {
52
- 'overlaps with': (cellLocation, specifiedLocation) => {
53
- return (cellLocation.refName === specifiedLocation.refName &&
54
- doesIntersect2(cellLocation.start, cellLocation.end, specifiedLocation.start, specifiedLocation.end));
55
- },
56
- 'contained within': (cellLocation, specifiedLocation) => {
57
- return (cellLocation.refName === specifiedLocation.refName &&
58
- isContainedWithin(cellLocation.start, cellLocation.end, specifiedLocation.start, specifiedLocation.end));
59
- },
60
- 'fully contains': (cellLocation, specifiedLocation) => {
61
- return (cellLocation.refName === specifiedLocation.refName &&
62
- isContainedWithin(specifiedLocation.start, specifiedLocation.end, cellLocation.start, cellLocation.end));
63
- },
64
- };
65
- OPERATION_PREDICATES['does not overlap'] = (cellLocation, specifiedLocation) => {
66
- return !OPERATION_PREDICATES['overlaps with'](cellLocation, specifiedLocation);
67
- };
68
- OPERATION_PREDICATES['not contained within'] = (cellLocation, specifiedLocation) => {
69
- return !OPERATION_PREDICATES['contained within'](cellLocation, specifiedLocation);
70
- };
71
- OPERATION_PREDICATES['does not contain'] = (cellLocation, specifiedLocation) => {
72
- return !OPERATION_PREDICATES['fully contains'](cellLocation, specifiedLocation);
73
- };
74
- // MST model for the column filter control
75
- const FilterModelType = types
76
- .model('ColumnLocStringFilter', {
77
- type: types.literal('LocString'),
78
- columnNumber: types.integer,
79
- locString: '',
80
- operation: types.optional(types.string, OPERATIONS[0]),
81
- })
82
- .views(self => ({
83
- get locStringIsInvalid() {
84
- if (self.locString) {
85
- const parsed = this.parsedLocString;
86
- return (!parsed ||
87
- parsed.refName === '' ||
88
- typeof parsed.start !== 'number' ||
89
- typeof parsed.end !== 'number' ||
90
- parsed.start > parsed.end);
91
- }
92
- return false;
93
- },
94
- get parsedLocString() {
95
- const session = getSession(self);
96
- const model = getParent(self, 3).spreadsheet;
97
- const { assemblyName } = model;
98
- try {
99
- return parseLocString(self.locString, refName => session.assemblyManager.isValidRefName(refName, assemblyName));
100
- }
101
- catch (e) {
102
- return undefined;
103
- }
104
- },
105
- }))
106
- .views(self => ({
107
- // returns a function that tests the given row
108
- get predicate() {
109
- const { locString, locStringIsInvalid, parsedLocString, operation, columnNumber, } = self; // avoid closing over self
110
- if (!locString || locStringIsInvalid || !parsedLocString) {
111
- return function alwaysTrue() {
112
- return true;
113
- };
114
- }
115
- return function stringPredicate(_sheet, row) {
116
- const { cellsWithDerived: cells } = row;
117
- const cell = cells[columnNumber];
118
- if (!(cell === null || cell === void 0 ? void 0 : cell.text) || !cell.extendedData) {
119
- return false;
120
- }
121
- const parsedCellText = cell.extendedData;
122
- if (!parsedCellText.refName) {
123
- return false;
124
- }
125
- const predicate = OPERATION_PREDICATES[operation];
126
- if (!predicate) {
127
- throw new Error(`"${operation}" not implemented in location filter`);
128
- }
129
- return predicate(parsedCellText, parsedLocString);
130
- };
131
- },
132
- }))
133
- .actions(self => ({
134
- setLocString(s) {
135
- self.locString = s;
136
- },
137
- setOperation(op) {
138
- self.operation = op;
139
- },
140
- }))
141
- .volatile(() => ({ ReactComponent: FilterReactComponent }));
142
- // opens a new LGV at the location described in the locString in the cell text
143
- async function locationLinkClick(spreadsheet, _columnNumber, cell) {
144
- const session = getSession(spreadsheet);
145
- const { assemblyName } = spreadsheet;
146
- const { id } = getParent(spreadsheet);
147
- const newViewId = `${id}_${assemblyName}`;
148
- let view = session.views.find(v => v.id === newViewId);
149
- if (!view) {
150
- view = session.addView('LinearGenomeView', {
151
- id: newViewId,
152
- });
153
- }
154
- await view.navToLocString(cell.text, assemblyName);
155
- }
156
- const DataCellReactComponent = observer(function ({ cell, columnNumber, spreadsheet, }) {
157
- return (React.createElement("a", { onClick: async (evt) => {
158
- evt.preventDefault();
159
- const session = getSession(spreadsheet);
160
- try {
161
- await locationLinkClick(spreadsheet, columnNumber, cell);
162
- }
163
- catch (e) {
164
- console.error(e);
165
- session.notifyError(`${e}`, e);
166
- }
167
- }, title: "open a new linear genome view here", href: "#" }, cell.text));
168
- });
169
- const LocStringColumnType = MakeSpreadsheetColumnType('LocString', {
170
- categoryName: 'Location',
171
- displayName: 'Full location',
172
- compare(cellA, cellB) {
173
- return compareLocs(cellA.extendedData, cellB.extendedData);
174
- },
175
- FilterModelType,
176
- DataCellReactComponent,
177
- });
178
- export default LocStringColumnType;
@@ -1,19 +0,0 @@
1
- import React from 'react';
2
- /** utility function for assembling the MST model of a column data type */
3
- export default function MakeSpreadsheetColumnType(name: string, { DataCellReactComponent, FilterModelType, compare, displayName, categoryName, }: {
4
- compare?: any;
5
- DataCellReactComponent?: React.FC<any> | null;
6
- FilterModelType?: any;
7
- displayName?: string;
8
- categoryName?: string;
9
- }): import("mobx-state-tree").IModelType<{
10
- type: import("mobx-state-tree").ISimpleType<string>;
11
- }, {
12
- DataCellReactComponent: React.FC<any> | null;
13
- FilterModelType: any;
14
- displayName: string;
15
- categoryName: string | undefined;
16
- } & {
17
- compare: any;
18
- readonly hasFilter: boolean;
19
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
@@ -1,20 +0,0 @@
1
- import { types } from 'mobx-state-tree';
2
- /** utility function for assembling the MST model of a column data type */
3
- export default function MakeSpreadsheetColumnType(name, { DataCellReactComponent = null, FilterModelType = null, compare, displayName = undefined, categoryName = undefined, }) {
4
- return types
5
- .model(`ColumnDataType${name}`, {
6
- type: types.literal(name),
7
- })
8
- .volatile(() => ({
9
- DataCellReactComponent,
10
- FilterModelType: FilterModelType,
11
- displayName: displayName || name,
12
- categoryName,
13
- }))
14
- .views(() => ({
15
- compare,
16
- get hasFilter() {
17
- return !!FilterModelType;
18
- },
19
- }));
20
- }
@@ -1,30 +0,0 @@
1
- import React from 'react';
2
- declare const FilterModelType: import("mobx-state-tree").IModelType<{
3
- type: import("mobx-state-tree").ISimpleType<"Number">;
4
- columnNumber: import("mobx-state-tree").ISimpleType<number>;
5
- firstNumber: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<number>>;
6
- secondNumber: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<number>>;
7
- operation: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
8
- }, {
9
- readonly predicate: (_sheet: any, row: any) => boolean;
10
- } & {
11
- setFirstNumber(n: number): void;
12
- setSecondNumber(n: number): void;
13
- setOperation(op: string): void;
14
- } & {
15
- ReactComponent: ({ filterModel }: {
16
- filterModel: any;
17
- }) => React.JSX.Element;
18
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
19
- declare const NumberColumn: import("mobx-state-tree").IModelType<{
20
- type: import("mobx-state-tree").ISimpleType<string>;
21
- }, {
22
- DataCellReactComponent: React.FC<any> | null;
23
- FilterModelType: any;
24
- displayName: string;
25
- categoryName: string | undefined;
26
- } & {
27
- compare: any;
28
- readonly hasFilter: boolean;
29
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
30
- export { NumberColumn, FilterModelType };
@@ -1,119 +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
- const OPERATIONS = [
8
- 'equals',
9
- 'greater than',
10
- 'less than',
11
- 'between',
12
- 'not between',
13
- ];
14
- // NOTE: assembly names, if present, are ignored in all of these predicates
15
- const OPERATION_PREDICATES = {
16
- equals: (numberInCell, firstNumber) => {
17
- return numberInCell === firstNumber;
18
- },
19
- 'greater than': (numberInCell, firstNumber) => {
20
- return numberInCell > firstNumber;
21
- },
22
- 'less than': (numberInCell, firstNumber) => {
23
- return numberInCell < firstNumber;
24
- },
25
- between: (numberInCell, firstNumber, secondNumber) => {
26
- return (numberInCell > firstNumber &&
27
- secondNumber !== undefined &&
28
- numberInCell < secondNumber);
29
- },
30
- };
31
- OPERATION_PREDICATES['not between'] = (numberInCell, firstNumber, secondNumber) => {
32
- return !OPERATION_PREDICATES.between(numberInCell, firstNumber, secondNumber);
33
- };
34
- const useStyles = makeStyles()({
35
- textFilterControlAdornment: { marginRight: '-18px' },
36
- textFilterControl: {
37
- '& .MuiInput-formControl': {
38
- marginTop: 8,
39
- },
40
- '& .MuiInputLabel-formControl': {
41
- top: '-7px',
42
- '&.MuiInputLabel-shrink': {
43
- top: '-3px',
44
- },
45
- },
46
- },
47
- });
48
- // React component for the column filter control
49
- const FilterReactComponent = observer(({ filterModel }) => {
50
- const { classes } = useStyles();
51
- const operationChoices = OPERATIONS;
52
- return (React.createElement(React.Fragment, null,
53
- React.createElement(Select, { value: filterModel.operation, onChange: e => filterModel.setOperation(String(e.target.value)) }, operationChoices.map(name => (React.createElement(MenuItem, { key: name, value: name }, name)))),
54
- ' ',
55
- React.createElement(TextField, { label: "number", placeholder: "123", type: "number", error: filterModel.firstNumberIsInvalid, defaultValue: filterModel.firstNumber, onChange: evt => {
56
- filterModel.setFirstNumber(Number.parseFloat(evt.target.value));
57
- }, className: classes.textFilterControl }),
58
- filterModel.operation !== 'between' &&
59
- filterModel.operation !== 'not between' ? null : (React.createElement(React.Fragment, null,
60
- ' and ',
61
- React.createElement(TextField, { label: "number", placeholder: "456", type: "number", error: filterModel.secondNumberIsInvalid, defaultValue: filterModel.secondNumber, onChange: evt => filterModel.setSecondNumber(Number.parseFloat(evt.target.value)), className: classes.textFilterControl })))));
62
- });
63
- // MST model for the column filter control
64
- const FilterModelType = types
65
- .model('ColumnNumberFilter', {
66
- type: types.literal('Number'),
67
- columnNumber: types.integer,
68
- firstNumber: types.maybe(types.number),
69
- secondNumber: types.maybe(types.number),
70
- operation: types.optional(types.enumeration(OPERATIONS), OPERATIONS[0]),
71
- })
72
- .views(self => ({
73
- // returns a function that tests the given row
74
- get predicate() {
75
- if (typeof self.firstNumber !== 'number') {
76
- return function alwaysTrue() {
77
- return true;
78
- };
79
- }
80
- const { firstNumber, secondNumber, operation, columnNumber } = self; // avoid closing over self
81
- return function stringPredicate(_sheet, row) {
82
- const { cellsWithDerived } = row;
83
- const cell = cellsWithDerived[columnNumber];
84
- if (!(cell === null || cell === void 0 ? void 0 : cell.text)) {
85
- return false;
86
- }
87
- const parsedCellText = Number.parseFloat(cell.text);
88
- if (typeof parsedCellText !== 'number') {
89
- return false;
90
- }
91
- const predicate = OPERATION_PREDICATES[operation];
92
- if (!predicate) {
93
- throw new Error(`"${operation}" not implemented in location filter`);
94
- }
95
- return predicate(parsedCellText, firstNumber, secondNumber);
96
- };
97
- },
98
- }))
99
- .actions(self => ({
100
- setFirstNumber(n) {
101
- self.firstNumber =
102
- Number.isNaN(n) || typeof n !== 'number' ? undefined : n;
103
- },
104
- setSecondNumber(n) {
105
- self.secondNumber =
106
- Number.isNaN(n) || typeof n !== 'number' ? undefined : n;
107
- },
108
- setOperation(op) {
109
- self.operation = op;
110
- },
111
- }))
112
- .volatile(() => ({ ReactComponent: FilterReactComponent }));
113
- const NumberColumn = MakeSpreadsheetColumnType('Number', {
114
- compare(cellA, cellB) {
115
- return Number.parseFloat(cellA.text) - Number.parseFloat(cellB.text);
116
- },
117
- FilterModelType,
118
- });
119
- export { NumberColumn, FilterModelType };
@@ -1,28 +0,0 @@
1
- import React from 'react';
2
- declare const ColumnTextFilter: import("mobx-state-tree").IModelType<{
3
- type: import("mobx-state-tree").ISimpleType<"Text">;
4
- columnNumber: import("mobx-state-tree").ISimpleType<number>;
5
- stringToFind: import("mobx-state-tree").IType<string | undefined, string, string>;
6
- operation: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
7
- }, {
8
- readonly predicate: (_sheet: any, row: any) => boolean;
9
- } & {
10
- setString(s: string): void;
11
- setOperation(op: string): void;
12
- } & {
13
- ReactComponent: ({ filterModel }: {
14
- filterModel: any;
15
- }) => React.JSX.Element;
16
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
17
- declare const TextColumnType: import("mobx-state-tree").IModelType<{
18
- type: import("mobx-state-tree").ISimpleType<string>;
19
- }, {
20
- DataCellReactComponent: React.FC<any> | null;
21
- FilterModelType: any;
22
- displayName: string;
23
- categoryName: string | undefined;
24
- } & {
25
- compare: any;
26
- readonly hasFilter: boolean;
27
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
28
- export { TextColumnType as TextColumn, ColumnTextFilter as FilterModelType };
@@ -1,122 +0,0 @@
1
- import React from 'react';
2
- import { IconButton, TextField, MenuItem, InputAdornment, Select, } from '@mui/material';
3
- import { makeStyles } from 'tss-react/mui';
4
- import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType';
5
- import { types, getPropertyMembers } from 'mobx-state-tree';
6
- import { observer } from 'mobx-react';
7
- import { getPropertyType, getEnumerationValues, getSubType, } from '@jbrowse/core/util/mst-reflection';
8
- // icons
9
- import ClearIcon from '@mui/icons-material/Clear';
10
- const OPERATIONS = [
11
- 'equals',
12
- 'contains',
13
- 'does not contain',
14
- 'does not equal',
15
- 'starts with',
16
- 'ends with',
17
- ];
18
- // NOTE: assembly names, if present, are ignored in all of these predicates
19
- const OPERATION_PREDICATES = {
20
- contains: (textInCell, stringToFind) => {
21
- return textInCell.toLowerCase().includes(stringToFind);
22
- },
23
- equals: (textInCell, stringToFind) => {
24
- return textInCell.toLowerCase() === stringToFind;
25
- },
26
- 'starts with': (textInCell, stringToFind) => {
27
- return textInCell.toLowerCase().startsWith(stringToFind);
28
- },
29
- 'ends with': (textInCell, stringToFind) => {
30
- const index = textInCell.toLowerCase().indexOf(stringToFind);
31
- if (index === -1) {
32
- return false;
33
- }
34
- return index === textInCell.length - stringToFind.length;
35
- },
36
- };
37
- OPERATION_PREDICATES['does not contain'] = (textInCell, stringToFind) => {
38
- return !OPERATION_PREDICATES.contains(textInCell, stringToFind);
39
- };
40
- OPERATION_PREDICATES['does not equal'] = (textInCell, stringToFind) => {
41
- return !OPERATION_PREDICATES.equals(textInCell, stringToFind);
42
- };
43
- const useStyles = makeStyles()({
44
- textFilterControlAdornment: { marginRight: '-18px' },
45
- textFilterControl: {
46
- margin: 0,
47
- '& .MuiInput-formControl': {
48
- marginTop: 8,
49
- },
50
- '& .MuiInputLabel-formControl': {
51
- top: '-7px',
52
- '&.MuiInputLabel-shrink': {
53
- top: '-3px',
54
- },
55
- },
56
- },
57
- });
58
- // React component for the column filter control
59
- const FilterReactComponent = observer(({ filterModel }) => {
60
- const { classes } = useStyles();
61
- const operationChoices = getEnumerationValues(getSubType(getPropertyType(getPropertyMembers(filterModel), 'operation')));
62
- return (React.createElement(React.Fragment, null,
63
- React.createElement(Select, { value: filterModel.operation, onChange: event => {
64
- filterModel.setOperation(String(event.target.value));
65
- } }, operationChoices.map(name => (React.createElement(MenuItem, { key: name, value: name }, name)))),
66
- ' ',
67
- React.createElement(TextField, { label: "text", value: filterModel.stringToFind, onChange: evt => filterModel.setString(evt.target.value), className: classes.textFilterControl, slotProps: {
68
- input: {
69
- endAdornment: (React.createElement(InputAdornment, { className: classes.textFilterControlAdornment, position: "end" },
70
- React.createElement(IconButton, { "aria-label": "clear filter", onClick: () => filterModel.setString('') },
71
- React.createElement(ClearIcon, null)))),
72
- },
73
- } })));
74
- });
75
- // MST model for the column filter control
76
- const ColumnTextFilter = types
77
- .model('ColumnTextFilter', {
78
- type: types.literal('Text'),
79
- columnNumber: types.integer,
80
- stringToFind: '',
81
- operation: types.optional(types.enumeration(OPERATIONS), OPERATIONS[0]),
82
- })
83
- .views(self => ({
84
- // returns a function that tests the given row
85
- get predicate() {
86
- const { stringToFind, columnNumber, operation } = self; // avoid closing over self
87
- if (!stringToFind) {
88
- return function alwaysTrue() {
89
- return true;
90
- };
91
- }
92
- const s = stringToFind.toLowerCase(); // case insensitive match
93
- return function stringPredicate(_sheet, row) {
94
- const { cellsWithDerived } = row;
95
- const cell = cellsWithDerived[columnNumber];
96
- if (!(cell === null || cell === void 0 ? void 0 : cell.text)) {
97
- return false;
98
- }
99
- const predicate = OPERATION_PREDICATES[operation];
100
- if (!predicate) {
101
- throw new Error(`"${operation}" not implemented in location filter`);
102
- }
103
- return predicate(cell.text, s);
104
- };
105
- },
106
- }))
107
- .actions(self => ({
108
- setString(s) {
109
- self.stringToFind = s;
110
- },
111
- setOperation(op) {
112
- self.operation = op;
113
- },
114
- }))
115
- .volatile(() => ({ ReactComponent: FilterReactComponent }));
116
- const TextColumnType = MakeSpreadsheetColumnType('Text', {
117
- compare(cellA, cellB) {
118
- return cellA.text.localeCompare(cellB.text);
119
- },
120
- FilterModelType: ColumnTextFilter,
121
- });
122
- export { TextColumnType as TextColumn, ColumnTextFilter as FilterModelType };
@@ -1,71 +0,0 @@
1
- declare const ColumnTypes: {
2
- Number: import("mobx-state-tree").IModelType<{
3
- type: import("mobx-state-tree").ISimpleType<string>;
4
- }, {
5
- DataCellReactComponent: import("react").FC<any> | null;
6
- FilterModelType: any;
7
- displayName: string;
8
- categoryName: string | undefined;
9
- } & {
10
- compare: any;
11
- readonly hasFilter: boolean;
12
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
13
- Text: import("mobx-state-tree").IModelType<{
14
- type: import("mobx-state-tree").ISimpleType<string>;
15
- }, {
16
- DataCellReactComponent: import("react").FC<any> | null;
17
- FilterModelType: any;
18
- displayName: string;
19
- categoryName: string | undefined;
20
- } & {
21
- compare: any;
22
- readonly hasFilter: boolean;
23
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
24
- LocString: import("mobx-state-tree").IModelType<{
25
- type: import("mobx-state-tree").ISimpleType<string>;
26
- }, {
27
- DataCellReactComponent: import("react").FC<any> | null;
28
- FilterModelType: any;
29
- displayName: string;
30
- categoryName: string | undefined;
31
- } & {
32
- compare: any;
33
- readonly hasFilter: boolean;
34
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
35
- LocRef: import("mobx-state-tree").IModelType<{
36
- type: import("mobx-state-tree").ISimpleType<string>;
37
- }, {
38
- DataCellReactComponent: import("react").FC<any> | null;
39
- FilterModelType: any;
40
- displayName: string;
41
- categoryName: string | undefined;
42
- } & {
43
- compare: any;
44
- readonly hasFilter: boolean;
45
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
46
- LocStart: import("mobx-state-tree").IModelType<{
47
- type: import("mobx-state-tree").ISimpleType<string>;
48
- }, {
49
- DataCellReactComponent: import("react").FC<any> | null;
50
- FilterModelType: any;
51
- displayName: string;
52
- categoryName: string | undefined;
53
- } & {
54
- compare: any;
55
- readonly hasFilter: boolean;
56
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
57
- LocEnd: import("mobx-state-tree").IModelType<{
58
- type: import("mobx-state-tree").ISimpleType<string>;
59
- }, {
60
- DataCellReactComponent: import("react").FC<any> | null;
61
- FilterModelType: any;
62
- displayName: string;
63
- categoryName: string | undefined;
64
- } & {
65
- compare: any;
66
- readonly hasFilter: boolean;
67
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
68
- };
69
- declare const AnyColumnType: import("mobx-state-tree").IAnyType;
70
- declare const AnyFilterModelType: import("mobx-state-tree").IAnyType;
71
- export { ColumnTypes, AnyColumnType, AnyFilterModelType };
@@ -1,29 +0,0 @@
1
- import LocString from './LocString';
2
- import LocRef from './LocRef';
3
- import LocStart from './LocStart';
4
- import LocEnd from './LocEnd';
5
- import { NumberColumn } from './Number';
6
- import { TextColumn as Text } from './Text';
7
- import { types } from 'mobx-state-tree';
8
- const ColumnTypes = {
9
- Number: NumberColumn,
10
- Text,
11
- LocString,
12
- LocRef,
13
- LocStart,
14
- LocEnd,
15
- };
16
- const allColumnTypes = Object.values(ColumnTypes);
17
- const AnyColumnType = types.union(...allColumnTypes);
18
- const AnyFilterModelType = types.union(...allColumnTypes
19
- .map(columnType => {
20
- // just instantiate the blank types to get their filter model types
21
- const { FilterModelType } = columnType.create({
22
- // @ts-expect-error
23
- type: columnType.properties.type.value,
24
- });
25
- return FilterModelType;
26
- })
27
- // some column types might not have filter machinery, filter those out
28
- .filter(t => !!t));
29
- export { ColumnTypes, AnyColumnType, AnyFilterModelType };