@jbrowse/plugin-spreadsheet-view 2.17.0 → 3.0.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.
- package/dist/LaunchSpreadsheetView/index.d.ts +1 -1
- package/dist/LaunchSpreadsheetView/index.js +1 -3
- package/dist/SpreadsheetView/ImportWizard.d.ts +51 -0
- package/dist/SpreadsheetView/ImportWizard.js +250 -0
- package/dist/SpreadsheetView/SpreadsheetModel.d.ts +78 -0
- package/dist/SpreadsheetView/SpreadsheetModel.js +119 -0
- package/dist/SpreadsheetView/SpreadsheetViewModel.d.ts +299 -0
- package/dist/SpreadsheetView/SpreadsheetViewModel.js +101 -0
- package/dist/SpreadsheetView/components/BreakendMultiLevelOptionDialog.d.ts +1 -0
- package/dist/SpreadsheetView/components/BreakendMultiLevelOptionDialog.js +5 -0
- package/dist/SpreadsheetView/components/BreakendSingleLevelOptionDialog.d.ts +1 -0
- package/dist/SpreadsheetView/components/BreakendSingleLevelOptionDialog.js +5 -0
- package/dist/SpreadsheetView/components/FeatureMenu.d.ts +7 -0
- package/dist/SpreadsheetView/components/FeatureMenu.js +105 -0
- package/dist/SpreadsheetView/components/ImportWizard.d.ts +3 -4
- package/dist/SpreadsheetView/components/ImportWizard.js +25 -68
- package/dist/SpreadsheetView/components/LocationCell.d.ts +7 -0
- package/dist/SpreadsheetView/components/LocationCell.js +29 -0
- package/dist/SpreadsheetView/components/NumberEditor.d.ts +2 -3
- package/dist/SpreadsheetView/components/NumberEditor.js +4 -28
- package/dist/SpreadsheetView/components/SpreadsheetDataGrid.d.ts +5 -0
- package/dist/SpreadsheetView/components/SpreadsheetDataGrid.js +23 -0
- package/dist/SpreadsheetView/components/SpreadsheetView.d.ts +4 -5
- package/dist/SpreadsheetView/components/SpreadsheetView.js +25 -63
- package/dist/SpreadsheetView/components/SpreadsheetViewActual.d.ts +5 -0
- package/dist/SpreadsheetView/components/SpreadsheetViewActual.js +34 -0
- package/dist/SpreadsheetView/components/TrackSelector.d.ts +6 -0
- package/dist/SpreadsheetView/components/TrackSelector.js +27 -0
- package/dist/SpreadsheetView/importAdapters/BedImport.d.ts +26 -17
- package/dist/SpreadsheetView/importAdapters/BedImport.js +53 -139
- package/dist/SpreadsheetView/importAdapters/BedpeImport.d.ts +36 -0
- package/dist/SpreadsheetView/importAdapters/BedpeImport.js +79 -0
- package/dist/SpreadsheetView/importAdapters/STARFusionImport.d.ts +25 -9
- package/dist/SpreadsheetView/importAdapters/STARFusionImport.js +27 -62
- package/dist/SpreadsheetView/importAdapters/VcfImport.d.ts +19 -12
- package/dist/SpreadsheetView/importAdapters/VcfImport.js +53 -98
- package/dist/SpreadsheetView/importAdapters/isNumber.d.ts +1 -0
- package/dist/SpreadsheetView/importAdapters/isNumber.js +14 -0
- package/dist/SpreadsheetView/importAdapters/util.d.ts +2 -0
- package/dist/SpreadsheetView/importAdapters/util.js +22 -0
- package/dist/SpreadsheetView/index.d.ts +2 -2
- package/dist/SpreadsheetView/index.js +19 -9
- package/dist/SpreadsheetView/util.d.ts +7 -0
- package/dist/SpreadsheetView/util.js +13 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -3
- package/esm/LaunchSpreadsheetView/index.d.ts +1 -1
- package/esm/LaunchSpreadsheetView/index.js +1 -3
- package/esm/SpreadsheetView/ImportWizard.d.ts +51 -0
- package/esm/SpreadsheetView/ImportWizard.js +214 -0
- package/esm/SpreadsheetView/SpreadsheetModel.d.ts +78 -0
- package/esm/SpreadsheetView/SpreadsheetModel.js +113 -0
- package/esm/SpreadsheetView/SpreadsheetViewModel.d.ts +299 -0
- package/esm/SpreadsheetView/SpreadsheetViewModel.js +95 -0
- package/esm/SpreadsheetView/components/BreakendMultiLevelOptionDialog.d.ts +1 -0
- package/esm/SpreadsheetView/components/BreakendMultiLevelOptionDialog.js +1 -0
- package/esm/SpreadsheetView/components/BreakendSingleLevelOptionDialog.d.ts +1 -0
- package/esm/SpreadsheetView/components/BreakendSingleLevelOptionDialog.js +1 -0
- package/esm/SpreadsheetView/components/FeatureMenu.d.ts +7 -0
- package/esm/SpreadsheetView/components/FeatureMenu.js +66 -0
- package/esm/SpreadsheetView/components/ImportWizard.d.ts +3 -4
- package/esm/SpreadsheetView/components/ImportWizard.js +26 -46
- package/esm/SpreadsheetView/components/LocationCell.d.ts +7 -0
- package/esm/SpreadsheetView/components/LocationCell.js +23 -0
- package/esm/SpreadsheetView/components/NumberEditor.d.ts +2 -3
- package/esm/SpreadsheetView/components/NumberEditor.js +4 -5
- package/esm/SpreadsheetView/components/SpreadsheetDataGrid.d.ts +5 -0
- package/esm/SpreadsheetView/components/SpreadsheetDataGrid.js +21 -0
- package/esm/SpreadsheetView/components/SpreadsheetView.d.ts +4 -5
- package/esm/SpreadsheetView/components/SpreadsheetView.js +8 -56
- package/esm/SpreadsheetView/components/SpreadsheetViewActual.d.ts +5 -0
- package/esm/SpreadsheetView/components/SpreadsheetViewActual.js +29 -0
- package/esm/SpreadsheetView/components/TrackSelector.d.ts +6 -0
- package/esm/SpreadsheetView/components/TrackSelector.js +25 -0
- package/esm/SpreadsheetView/importAdapters/BedImport.d.ts +26 -17
- package/esm/SpreadsheetView/importAdapters/BedImport.js +53 -137
- package/esm/SpreadsheetView/importAdapters/BedpeImport.d.ts +36 -0
- package/esm/SpreadsheetView/importAdapters/BedpeImport.js +76 -0
- package/esm/SpreadsheetView/importAdapters/STARFusionImport.d.ts +25 -9
- package/esm/SpreadsheetView/importAdapters/STARFusionImport.js +27 -62
- package/esm/SpreadsheetView/importAdapters/VcfImport.d.ts +19 -12
- package/esm/SpreadsheetView/importAdapters/VcfImport.js +53 -97
- package/esm/SpreadsheetView/importAdapters/isNumber.d.ts +1 -0
- package/esm/SpreadsheetView/importAdapters/isNumber.js +11 -0
- package/esm/SpreadsheetView/importAdapters/util.d.ts +2 -0
- package/esm/SpreadsheetView/importAdapters/util.js +18 -0
- package/esm/SpreadsheetView/index.d.ts +2 -2
- package/esm/SpreadsheetView/index.js +2 -2
- package/esm/SpreadsheetView/util.d.ts +7 -0
- package/esm/SpreadsheetView/util.js +10 -0
- package/esm/index.d.ts +1 -1
- package/esm/index.js +1 -3
- package/package.json +7 -7
- package/dist/SpreadsheetView/components/CellData.d.ts +0 -9
- package/dist/SpreadsheetView/components/CellData.js +0 -14
- package/dist/SpreadsheetView/components/ColumnFilterControls.d.ts +0 -3
- package/dist/SpreadsheetView/components/ColumnFilterControls.js +0 -58
- package/dist/SpreadsheetView/components/ColumnMenu.d.ts +0 -16
- package/dist/SpreadsheetView/components/ColumnMenu.js +0 -140
- package/dist/SpreadsheetView/components/DataRow.d.ts +0 -12
- package/dist/SpreadsheetView/components/DataRow.js +0 -81
- package/dist/SpreadsheetView/components/DataTable.d.ts +0 -10
- package/dist/SpreadsheetView/components/DataTable.js +0 -42
- package/dist/SpreadsheetView/components/DataTableHeader.d.ts +0 -6
- package/dist/SpreadsheetView/components/DataTableHeader.js +0 -104
- package/dist/SpreadsheetView/components/GlobalFilterControls.d.ts +0 -5
- package/dist/SpreadsheetView/components/GlobalFilterControls.js +0 -68
- package/dist/SpreadsheetView/components/RowCountMessage.d.ts +0 -6
- package/dist/SpreadsheetView/components/RowCountMessage.js +0 -33
- package/dist/SpreadsheetView/components/RowMenu.d.ts +0 -9
- package/dist/SpreadsheetView/components/RowMenu.js +0 -39
- package/dist/SpreadsheetView/components/SortIndicator.d.ts +0 -6
- package/dist/SpreadsheetView/components/SortIndicator.js +0 -27
- package/dist/SpreadsheetView/components/Spreadsheet.d.ts +0 -11
- package/dist/SpreadsheetView/components/Spreadsheet.js +0 -25
- package/dist/SpreadsheetView/components/StatusBar.d.ts +0 -11
- package/dist/SpreadsheetView/components/StatusBar.js +0 -44
- package/dist/SpreadsheetView/importAdapters/ImportUtils.d.ts +0 -42
- package/dist/SpreadsheetView/importAdapters/ImportUtils.js +0 -123
- package/dist/SpreadsheetView/models/ColumnDataTypes/LocEnd.d.ts +0 -12
- package/dist/SpreadsheetView/models/ColumnDataTypes/LocEnd.js +0 -20
- package/dist/SpreadsheetView/models/ColumnDataTypes/LocRef.d.ts +0 -12
- package/dist/SpreadsheetView/models/ColumnDataTypes/LocRef.js +0 -20
- package/dist/SpreadsheetView/models/ColumnDataTypes/LocStart.d.ts +0 -12
- package/dist/SpreadsheetView/models/ColumnDataTypes/LocStart.js +0 -20
- package/dist/SpreadsheetView/models/ColumnDataTypes/LocString.d.ts +0 -13
- package/dist/SpreadsheetView/models/ColumnDataTypes/LocString.js +0 -183
- package/dist/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.d.ts +0 -19
- package/dist/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js +0 -23
- package/dist/SpreadsheetView/models/ColumnDataTypes/Number.d.ts +0 -30
- package/dist/SpreadsheetView/models/ColumnDataTypes/Number.js +0 -126
- package/dist/SpreadsheetView/models/ColumnDataTypes/Text.d.ts +0 -28
- package/dist/SpreadsheetView/models/ColumnDataTypes/Text.js +0 -129
- package/dist/SpreadsheetView/models/ColumnDataTypes/index.d.ts +0 -71
- package/dist/SpreadsheetView/models/ColumnDataTypes/index.js +0 -37
- package/dist/SpreadsheetView/models/FilterControls.d.ts +0 -26
- package/dist/SpreadsheetView/models/FilterControls.js +0 -85
- package/dist/SpreadsheetView/models/ImportWizard.d.ts +0 -31
- package/dist/SpreadsheetView/models/ImportWizard.js +0 -186
- package/dist/SpreadsheetView/models/Row.d.ts +0 -17
- package/dist/SpreadsheetView/models/Row.js +0 -43
- package/dist/SpreadsheetView/models/Spreadsheet.d.ts +0 -260
- package/dist/SpreadsheetView/models/Spreadsheet.js +0 -174
- package/dist/SpreadsheetView/models/SpreadsheetView.d.ts +0 -482
- package/dist/SpreadsheetView/models/SpreadsheetView.js +0 -199
- package/dist/SpreadsheetView/models/StaticRowSet.d.ts +0 -163
- package/dist/SpreadsheetView/models/StaticRowSet.js +0 -56
- package/esm/SpreadsheetView/components/CellData.d.ts +0 -9
- package/esm/SpreadsheetView/components/CellData.js +0 -9
- package/esm/SpreadsheetView/components/ColumnFilterControls.d.ts +0 -3
- package/esm/SpreadsheetView/components/ColumnFilterControls.js +0 -53
- package/esm/SpreadsheetView/components/ColumnMenu.d.ts +0 -16
- package/esm/SpreadsheetView/components/ColumnMenu.js +0 -135
- package/esm/SpreadsheetView/components/DataRow.d.ts +0 -12
- package/esm/SpreadsheetView/components/DataRow.js +0 -76
- package/esm/SpreadsheetView/components/DataTable.d.ts +0 -10
- package/esm/SpreadsheetView/components/DataTable.js +0 -37
- package/esm/SpreadsheetView/components/DataTableHeader.d.ts +0 -6
- package/esm/SpreadsheetView/components/DataTableHeader.js +0 -76
- package/esm/SpreadsheetView/components/GlobalFilterControls.d.ts +0 -5
- package/esm/SpreadsheetView/components/GlobalFilterControls.js +0 -40
- package/esm/SpreadsheetView/components/RowCountMessage.d.ts +0 -6
- package/esm/SpreadsheetView/components/RowCountMessage.js +0 -28
- package/esm/SpreadsheetView/components/RowMenu.d.ts +0 -9
- package/esm/SpreadsheetView/components/RowMenu.js +0 -34
- package/esm/SpreadsheetView/components/SortIndicator.d.ts +0 -6
- package/esm/SpreadsheetView/components/SortIndicator.js +0 -21
- package/esm/SpreadsheetView/components/Spreadsheet.d.ts +0 -11
- package/esm/SpreadsheetView/components/Spreadsheet.js +0 -20
- package/esm/SpreadsheetView/components/StatusBar.d.ts +0 -11
- package/esm/SpreadsheetView/components/StatusBar.js +0 -39
- package/esm/SpreadsheetView/importAdapters/ImportUtils.d.ts +0 -42
- package/esm/SpreadsheetView/importAdapters/ImportUtils.js +0 -95
- package/esm/SpreadsheetView/models/ColumnDataTypes/LocEnd.d.ts +0 -12
- package/esm/SpreadsheetView/models/ColumnDataTypes/LocEnd.js +0 -15
- package/esm/SpreadsheetView/models/ColumnDataTypes/LocRef.d.ts +0 -12
- package/esm/SpreadsheetView/models/ColumnDataTypes/LocRef.js +0 -15
- package/esm/SpreadsheetView/models/ColumnDataTypes/LocStart.d.ts +0 -12
- package/esm/SpreadsheetView/models/ColumnDataTypes/LocStart.js +0 -15
- package/esm/SpreadsheetView/models/ColumnDataTypes/LocString.d.ts +0 -13
- package/esm/SpreadsheetView/models/ColumnDataTypes/LocString.js +0 -178
- package/esm/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.d.ts +0 -19
- package/esm/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js +0 -20
- package/esm/SpreadsheetView/models/ColumnDataTypes/Number.d.ts +0 -30
- package/esm/SpreadsheetView/models/ColumnDataTypes/Number.js +0 -119
- package/esm/SpreadsheetView/models/ColumnDataTypes/Text.d.ts +0 -28
- package/esm/SpreadsheetView/models/ColumnDataTypes/Text.js +0 -122
- package/esm/SpreadsheetView/models/ColumnDataTypes/index.d.ts +0 -71
- package/esm/SpreadsheetView/models/ColumnDataTypes/index.js +0 -29
- package/esm/SpreadsheetView/models/FilterControls.d.ts +0 -26
- package/esm/SpreadsheetView/models/FilterControls.js +0 -83
- package/esm/SpreadsheetView/models/ImportWizard.d.ts +0 -31
- package/esm/SpreadsheetView/models/ImportWizard.js +0 -161
- package/esm/SpreadsheetView/models/Row.d.ts +0 -17
- package/esm/SpreadsheetView/models/Row.js +0 -41
- package/esm/SpreadsheetView/models/Spreadsheet.d.ts +0 -260
- package/esm/SpreadsheetView/models/Spreadsheet.js +0 -169
- package/esm/SpreadsheetView/models/SpreadsheetView.d.ts +0 -482
- package/esm/SpreadsheetView/models/SpreadsheetView.js +0 -194
- package/esm/SpreadsheetView/models/StaticRowSet.d.ts +0 -163
- 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 };
|