@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.
Files changed (201) 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 +250 -0
  5. package/dist/SpreadsheetView/SpreadsheetModel.d.ts +78 -0
  6. package/dist/SpreadsheetView/SpreadsheetModel.js +119 -0
  7. package/dist/SpreadsheetView/SpreadsheetViewModel.d.ts +299 -0
  8. package/dist/SpreadsheetView/SpreadsheetViewModel.js +101 -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 +7 -0
  14. package/dist/SpreadsheetView/components/FeatureMenu.js +105 -0
  15. package/dist/SpreadsheetView/components/ImportWizard.d.ts +3 -4
  16. package/dist/SpreadsheetView/components/ImportWizard.js +25 -68
  17. package/dist/SpreadsheetView/components/LocationCell.d.ts +7 -0
  18. package/dist/SpreadsheetView/components/LocationCell.js +29 -0
  19. package/dist/SpreadsheetView/components/NumberEditor.d.ts +2 -3
  20. package/dist/SpreadsheetView/components/NumberEditor.js +4 -28
  21. package/dist/SpreadsheetView/components/SpreadsheetDataGrid.d.ts +5 -0
  22. package/dist/SpreadsheetView/components/SpreadsheetDataGrid.js +23 -0
  23. package/dist/SpreadsheetView/components/SpreadsheetView.d.ts +4 -5
  24. package/dist/SpreadsheetView/components/SpreadsheetView.js +25 -63
  25. package/dist/SpreadsheetView/components/SpreadsheetViewActual.d.ts +5 -0
  26. package/dist/SpreadsheetView/components/SpreadsheetViewActual.js +34 -0
  27. package/dist/SpreadsheetView/components/TrackSelector.d.ts +6 -0
  28. package/dist/SpreadsheetView/components/TrackSelector.js +27 -0
  29. package/dist/SpreadsheetView/importAdapters/BedImport.d.ts +26 -17
  30. package/dist/SpreadsheetView/importAdapters/BedImport.js +53 -139
  31. package/dist/SpreadsheetView/importAdapters/BedpeImport.d.ts +36 -0
  32. package/dist/SpreadsheetView/importAdapters/BedpeImport.js +79 -0
  33. package/dist/SpreadsheetView/importAdapters/STARFusionImport.d.ts +25 -9
  34. package/dist/SpreadsheetView/importAdapters/STARFusionImport.js +27 -62
  35. package/dist/SpreadsheetView/importAdapters/VcfImport.d.ts +19 -12
  36. package/dist/SpreadsheetView/importAdapters/VcfImport.js +53 -98
  37. package/dist/SpreadsheetView/importAdapters/isNumber.d.ts +1 -0
  38. package/dist/SpreadsheetView/importAdapters/isNumber.js +14 -0
  39. package/dist/SpreadsheetView/importAdapters/util.d.ts +2 -0
  40. package/dist/SpreadsheetView/importAdapters/util.js +22 -0
  41. package/dist/SpreadsheetView/index.d.ts +2 -2
  42. package/dist/SpreadsheetView/index.js +19 -9
  43. package/dist/SpreadsheetView/util.d.ts +7 -0
  44. package/dist/SpreadsheetView/util.js +13 -0
  45. package/dist/index.d.ts +1 -1
  46. package/dist/index.js +1 -3
  47. package/esm/LaunchSpreadsheetView/index.d.ts +1 -1
  48. package/esm/LaunchSpreadsheetView/index.js +1 -3
  49. package/esm/SpreadsheetView/ImportWizard.d.ts +51 -0
  50. package/esm/SpreadsheetView/ImportWizard.js +214 -0
  51. package/esm/SpreadsheetView/SpreadsheetModel.d.ts +78 -0
  52. package/esm/SpreadsheetView/SpreadsheetModel.js +113 -0
  53. package/esm/SpreadsheetView/SpreadsheetViewModel.d.ts +299 -0
  54. package/esm/SpreadsheetView/SpreadsheetViewModel.js +95 -0
  55. package/esm/SpreadsheetView/components/BreakendMultiLevelOptionDialog.d.ts +1 -0
  56. package/esm/SpreadsheetView/components/BreakendMultiLevelOptionDialog.js +1 -0
  57. package/esm/SpreadsheetView/components/BreakendSingleLevelOptionDialog.d.ts +1 -0
  58. package/esm/SpreadsheetView/components/BreakendSingleLevelOptionDialog.js +1 -0
  59. package/esm/SpreadsheetView/components/FeatureMenu.d.ts +7 -0
  60. package/esm/SpreadsheetView/components/FeatureMenu.js +66 -0
  61. package/esm/SpreadsheetView/components/ImportWizard.d.ts +3 -4
  62. package/esm/SpreadsheetView/components/ImportWizard.js +26 -46
  63. package/esm/SpreadsheetView/components/LocationCell.d.ts +7 -0
  64. package/esm/SpreadsheetView/components/LocationCell.js +23 -0
  65. package/esm/SpreadsheetView/components/NumberEditor.d.ts +2 -3
  66. package/esm/SpreadsheetView/components/NumberEditor.js +4 -5
  67. package/esm/SpreadsheetView/components/SpreadsheetDataGrid.d.ts +5 -0
  68. package/esm/SpreadsheetView/components/SpreadsheetDataGrid.js +21 -0
  69. package/esm/SpreadsheetView/components/SpreadsheetView.d.ts +4 -5
  70. package/esm/SpreadsheetView/components/SpreadsheetView.js +8 -56
  71. package/esm/SpreadsheetView/components/SpreadsheetViewActual.d.ts +5 -0
  72. package/esm/SpreadsheetView/components/SpreadsheetViewActual.js +29 -0
  73. package/esm/SpreadsheetView/components/TrackSelector.d.ts +6 -0
  74. package/esm/SpreadsheetView/components/TrackSelector.js +25 -0
  75. package/esm/SpreadsheetView/importAdapters/BedImport.d.ts +26 -17
  76. package/esm/SpreadsheetView/importAdapters/BedImport.js +53 -137
  77. package/esm/SpreadsheetView/importAdapters/BedpeImport.d.ts +36 -0
  78. package/esm/SpreadsheetView/importAdapters/BedpeImport.js +76 -0
  79. package/esm/SpreadsheetView/importAdapters/STARFusionImport.d.ts +25 -9
  80. package/esm/SpreadsheetView/importAdapters/STARFusionImport.js +27 -62
  81. package/esm/SpreadsheetView/importAdapters/VcfImport.d.ts +19 -12
  82. package/esm/SpreadsheetView/importAdapters/VcfImport.js +53 -97
  83. package/esm/SpreadsheetView/importAdapters/isNumber.d.ts +1 -0
  84. package/esm/SpreadsheetView/importAdapters/isNumber.js +11 -0
  85. package/esm/SpreadsheetView/importAdapters/util.d.ts +2 -0
  86. package/esm/SpreadsheetView/importAdapters/util.js +18 -0
  87. package/esm/SpreadsheetView/index.d.ts +2 -2
  88. package/esm/SpreadsheetView/index.js +2 -2
  89. package/esm/SpreadsheetView/util.d.ts +7 -0
  90. package/esm/SpreadsheetView/util.js +10 -0
  91. package/esm/index.d.ts +1 -1
  92. package/esm/index.js +1 -3
  93. package/package.json +7 -7
  94. package/dist/SpreadsheetView/components/CellData.d.ts +0 -9
  95. package/dist/SpreadsheetView/components/CellData.js +0 -14
  96. package/dist/SpreadsheetView/components/ColumnFilterControls.d.ts +0 -3
  97. package/dist/SpreadsheetView/components/ColumnFilterControls.js +0 -58
  98. package/dist/SpreadsheetView/components/ColumnMenu.d.ts +0 -16
  99. package/dist/SpreadsheetView/components/ColumnMenu.js +0 -140
  100. package/dist/SpreadsheetView/components/DataRow.d.ts +0 -12
  101. package/dist/SpreadsheetView/components/DataRow.js +0 -81
  102. package/dist/SpreadsheetView/components/DataTable.d.ts +0 -10
  103. package/dist/SpreadsheetView/components/DataTable.js +0 -42
  104. package/dist/SpreadsheetView/components/DataTableHeader.d.ts +0 -6
  105. package/dist/SpreadsheetView/components/DataTableHeader.js +0 -104
  106. package/dist/SpreadsheetView/components/GlobalFilterControls.d.ts +0 -5
  107. package/dist/SpreadsheetView/components/GlobalFilterControls.js +0 -68
  108. package/dist/SpreadsheetView/components/RowCountMessage.d.ts +0 -6
  109. package/dist/SpreadsheetView/components/RowCountMessage.js +0 -33
  110. package/dist/SpreadsheetView/components/RowMenu.d.ts +0 -9
  111. package/dist/SpreadsheetView/components/RowMenu.js +0 -39
  112. package/dist/SpreadsheetView/components/SortIndicator.d.ts +0 -6
  113. package/dist/SpreadsheetView/components/SortIndicator.js +0 -27
  114. package/dist/SpreadsheetView/components/Spreadsheet.d.ts +0 -11
  115. package/dist/SpreadsheetView/components/Spreadsheet.js +0 -25
  116. package/dist/SpreadsheetView/components/StatusBar.d.ts +0 -11
  117. package/dist/SpreadsheetView/components/StatusBar.js +0 -44
  118. package/dist/SpreadsheetView/importAdapters/ImportUtils.d.ts +0 -42
  119. package/dist/SpreadsheetView/importAdapters/ImportUtils.js +0 -123
  120. package/dist/SpreadsheetView/models/ColumnDataTypes/LocEnd.d.ts +0 -12
  121. package/dist/SpreadsheetView/models/ColumnDataTypes/LocEnd.js +0 -20
  122. package/dist/SpreadsheetView/models/ColumnDataTypes/LocRef.d.ts +0 -12
  123. package/dist/SpreadsheetView/models/ColumnDataTypes/LocRef.js +0 -20
  124. package/dist/SpreadsheetView/models/ColumnDataTypes/LocStart.d.ts +0 -12
  125. package/dist/SpreadsheetView/models/ColumnDataTypes/LocStart.js +0 -20
  126. package/dist/SpreadsheetView/models/ColumnDataTypes/LocString.d.ts +0 -13
  127. package/dist/SpreadsheetView/models/ColumnDataTypes/LocString.js +0 -183
  128. package/dist/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.d.ts +0 -19
  129. package/dist/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js +0 -23
  130. package/dist/SpreadsheetView/models/ColumnDataTypes/Number.d.ts +0 -30
  131. package/dist/SpreadsheetView/models/ColumnDataTypes/Number.js +0 -126
  132. package/dist/SpreadsheetView/models/ColumnDataTypes/Text.d.ts +0 -28
  133. package/dist/SpreadsheetView/models/ColumnDataTypes/Text.js +0 -129
  134. package/dist/SpreadsheetView/models/ColumnDataTypes/index.d.ts +0 -71
  135. package/dist/SpreadsheetView/models/ColumnDataTypes/index.js +0 -37
  136. package/dist/SpreadsheetView/models/FilterControls.d.ts +0 -26
  137. package/dist/SpreadsheetView/models/FilterControls.js +0 -85
  138. package/dist/SpreadsheetView/models/ImportWizard.d.ts +0 -31
  139. package/dist/SpreadsheetView/models/ImportWizard.js +0 -186
  140. package/dist/SpreadsheetView/models/Row.d.ts +0 -17
  141. package/dist/SpreadsheetView/models/Row.js +0 -43
  142. package/dist/SpreadsheetView/models/Spreadsheet.d.ts +0 -260
  143. package/dist/SpreadsheetView/models/Spreadsheet.js +0 -174
  144. package/dist/SpreadsheetView/models/SpreadsheetView.d.ts +0 -482
  145. package/dist/SpreadsheetView/models/SpreadsheetView.js +0 -199
  146. package/dist/SpreadsheetView/models/StaticRowSet.d.ts +0 -163
  147. package/dist/SpreadsheetView/models/StaticRowSet.js +0 -56
  148. package/esm/SpreadsheetView/components/CellData.d.ts +0 -9
  149. package/esm/SpreadsheetView/components/CellData.js +0 -9
  150. package/esm/SpreadsheetView/components/ColumnFilterControls.d.ts +0 -3
  151. package/esm/SpreadsheetView/components/ColumnFilterControls.js +0 -53
  152. package/esm/SpreadsheetView/components/ColumnMenu.d.ts +0 -16
  153. package/esm/SpreadsheetView/components/ColumnMenu.js +0 -135
  154. package/esm/SpreadsheetView/components/DataRow.d.ts +0 -12
  155. package/esm/SpreadsheetView/components/DataRow.js +0 -76
  156. package/esm/SpreadsheetView/components/DataTable.d.ts +0 -10
  157. package/esm/SpreadsheetView/components/DataTable.js +0 -37
  158. package/esm/SpreadsheetView/components/DataTableHeader.d.ts +0 -6
  159. package/esm/SpreadsheetView/components/DataTableHeader.js +0 -76
  160. package/esm/SpreadsheetView/components/GlobalFilterControls.d.ts +0 -5
  161. package/esm/SpreadsheetView/components/GlobalFilterControls.js +0 -40
  162. package/esm/SpreadsheetView/components/RowCountMessage.d.ts +0 -6
  163. package/esm/SpreadsheetView/components/RowCountMessage.js +0 -28
  164. package/esm/SpreadsheetView/components/RowMenu.d.ts +0 -9
  165. package/esm/SpreadsheetView/components/RowMenu.js +0 -34
  166. package/esm/SpreadsheetView/components/SortIndicator.d.ts +0 -6
  167. package/esm/SpreadsheetView/components/SortIndicator.js +0 -21
  168. package/esm/SpreadsheetView/components/Spreadsheet.d.ts +0 -11
  169. package/esm/SpreadsheetView/components/Spreadsheet.js +0 -20
  170. package/esm/SpreadsheetView/components/StatusBar.d.ts +0 -11
  171. package/esm/SpreadsheetView/components/StatusBar.js +0 -39
  172. package/esm/SpreadsheetView/importAdapters/ImportUtils.d.ts +0 -42
  173. package/esm/SpreadsheetView/importAdapters/ImportUtils.js +0 -95
  174. package/esm/SpreadsheetView/models/ColumnDataTypes/LocEnd.d.ts +0 -12
  175. package/esm/SpreadsheetView/models/ColumnDataTypes/LocEnd.js +0 -15
  176. package/esm/SpreadsheetView/models/ColumnDataTypes/LocRef.d.ts +0 -12
  177. package/esm/SpreadsheetView/models/ColumnDataTypes/LocRef.js +0 -15
  178. package/esm/SpreadsheetView/models/ColumnDataTypes/LocStart.d.ts +0 -12
  179. package/esm/SpreadsheetView/models/ColumnDataTypes/LocStart.js +0 -15
  180. package/esm/SpreadsheetView/models/ColumnDataTypes/LocString.d.ts +0 -13
  181. package/esm/SpreadsheetView/models/ColumnDataTypes/LocString.js +0 -178
  182. package/esm/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.d.ts +0 -19
  183. package/esm/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.js +0 -20
  184. package/esm/SpreadsheetView/models/ColumnDataTypes/Number.d.ts +0 -30
  185. package/esm/SpreadsheetView/models/ColumnDataTypes/Number.js +0 -119
  186. package/esm/SpreadsheetView/models/ColumnDataTypes/Text.d.ts +0 -28
  187. package/esm/SpreadsheetView/models/ColumnDataTypes/Text.js +0 -122
  188. package/esm/SpreadsheetView/models/ColumnDataTypes/index.d.ts +0 -71
  189. package/esm/SpreadsheetView/models/ColumnDataTypes/index.js +0 -29
  190. package/esm/SpreadsheetView/models/FilterControls.d.ts +0 -26
  191. package/esm/SpreadsheetView/models/FilterControls.js +0 -83
  192. package/esm/SpreadsheetView/models/ImportWizard.d.ts +0 -31
  193. package/esm/SpreadsheetView/models/ImportWizard.js +0 -161
  194. package/esm/SpreadsheetView/models/Row.d.ts +0 -17
  195. package/esm/SpreadsheetView/models/Row.js +0 -41
  196. package/esm/SpreadsheetView/models/Spreadsheet.d.ts +0 -260
  197. package/esm/SpreadsheetView/models/Spreadsheet.js +0 -169
  198. package/esm/SpreadsheetView/models/SpreadsheetView.d.ts +0 -482
  199. package/esm/SpreadsheetView/models/SpreadsheetView.js +0 -194
  200. package/esm/SpreadsheetView/models/StaticRowSet.d.ts +0 -163
  201. package/esm/SpreadsheetView/models/StaticRowSet.js +0 -51
@@ -1,67 +1,32 @@
1
- import { parseTsvBuffer } from './ImportUtils';
1
+ import { isNumber } from './isNumber';
2
+ import { bufferToLines, parseStrand } from './util';
2
3
  function parseSTARFusionBreakpointString(str) {
3
4
  const fields = str.split(':');
4
- const refName = fields[0];
5
- const pos = Number.parseInt(fields[1], 10);
6
- const strand = fields[2] === '-' ? -1 : 1;
7
- return { refName, pos, strand };
5
+ return {
6
+ refName: fields[0],
7
+ start: +fields[1],
8
+ end: +fields[1] + 1,
9
+ strand: parseStrand(fields[2]),
10
+ };
8
11
  }
9
- const numericColumns = {
10
- SpanningFragCount: true,
11
- FFPM: true,
12
- LeftBreakEntropy: true,
13
- RightBreakEntropy: true,
14
- JunctionReadCount: true,
15
- };
16
- export async function parseSTARFusionBuffer(buffer, options) {
17
- const data = await parseTsvBuffer(buffer, {
18
- hasColumnNameLine: true,
19
- columnNameLineNumber: 1,
20
- selectedAssemblyName: options.selectedAssemblyName,
21
- isValidRefName: () => false,
22
- });
23
- // remove the # in #FusionName
24
- data.columns[0].name = data.columns[0].name.replace('#', '');
25
- // set some columns to be numeric
26
- data.columns.forEach(col => {
27
- if (numericColumns[col.name]) {
28
- col.dataType = { type: 'Number' };
29
- }
30
- });
31
- // decorate each row with a feature object in its extendedData
32
- data.rowSet.rows.forEach((row, rowNumber) => {
33
- const featureData = {};
34
- row.cells.forEach(({ text }, columnNumber) => {
35
- const column = data.columns[columnNumber];
36
- if (column.name === 'LeftBreakpoint' && text) {
37
- const { refName, pos, strand } = parseSTARFusionBreakpointString(text);
38
- featureData.refName = refName;
39
- featureData.start = pos;
40
- featureData.end = pos;
41
- featureData.strand = strand;
42
- }
43
- else if (column.name === 'RightBreakpoint' && text) {
44
- const { refName, pos, strand } = parseSTARFusionBreakpointString(text);
45
- featureData.mate = {
46
- refName,
47
- start: pos,
48
- end: pos,
49
- strand,
12
+ export function parseSTARFusionBuffer(buffer) {
13
+ const lines = bufferToLines(buffer);
14
+ const columns = lines[0].slice(1).split('\t');
15
+ return {
16
+ columns: columns.map(c => ({ name: c })),
17
+ rowSet: {
18
+ rows: lines.slice(1).map((line, rowNumber) => {
19
+ const cols = line.split('\t');
20
+ const row = Object.fromEntries(columns.map((h, i) => [h, isNumber(cols[i]) ? +cols[i] : cols[i]]));
21
+ return {
22
+ cellData: row,
23
+ feature: {
24
+ uniqueId: `sf-${rowNumber}`,
25
+ ...parseSTARFusionBreakpointString(row.LeftBreakpoint),
26
+ mate: parseSTARFusionBreakpointString(row.RightBreakpoint),
27
+ },
50
28
  };
51
- }
52
- else if (text && numericColumns[column.name]) {
53
- // some other column, numeric
54
- featureData[column.name] = Number.parseFloat(text);
55
- }
56
- else {
57
- // some other column, text
58
- featureData[column.name] = text;
59
- }
60
- });
61
- featureData.uniqueId = `sf-${rowNumber + 1}`;
62
- row.extendedData = {
63
- feature: featureData,
64
- };
65
- });
66
- return data;
29
+ }),
30
+ },
31
+ };
67
32
  }
@@ -1,13 +1,20 @@
1
- import { RowSet, Column, ParseOptions } from './ImportUtils';
2
- import type { Buffer } from 'buffer';
3
- export declare function parseVcfBuffer(buffer: Buffer, options?: ParseOptions): {
4
- rowSet: RowSet;
5
- columnDisplayOrder: number[];
6
- hasColumnNames: boolean;
7
- columns: Column[];
8
- assemblyName: string | undefined;
9
- };
10
- export declare function splitVcfFileHeaderAndBody(wholeFile: string): {
11
- header: string;
12
- body: string;
1
+ export declare function parseVcfBuffer(buffer: Uint8Array): {
2
+ columns: {
3
+ name: string;
4
+ }[];
5
+ rowSet: {
6
+ rows: {
7
+ cellData: {
8
+ CHROM: string | undefined;
9
+ POS: number;
10
+ ID: string | undefined;
11
+ REF: string | undefined;
12
+ ALT: string | undefined;
13
+ QUAL: string | number | undefined;
14
+ FILTER: string | undefined;
15
+ FORMAT: string | undefined;
16
+ };
17
+ feature: any;
18
+ }[];
19
+ };
13
20
  };
@@ -1,104 +1,60 @@
1
1
  import VCF from '@gmod/vcf';
2
2
  import { VcfFeature } from '@jbrowse/plugin-variants';
3
- import { bufferToString, } from './ImportUtils';
4
- const vcfCoreColumns = [
5
- { name: 'CHROM', type: 'Text' }, // 0
6
- { name: 'POS', type: 'Number' }, // 1
7
- { name: 'ID', type: 'Text' }, // 2
8
- { name: 'REF', type: 'Text' }, // 3
9
- { name: 'ALT', type: 'Text' }, // 4
10
- { name: 'QUAL', type: 'Number' }, // 5
11
- { name: 'FILTER', type: 'Text' }, // 6
12
- { name: 'INFO', type: 'Text' }, // 7
13
- { name: 'FORMAT', type: 'Text' }, // 8
14
- ];
15
- function vcfRecordToRow(vcfParser, line, lineNumber) {
16
- const vcfVariant = vcfParser.parseLine(line);
17
- const vcfFeature = new VcfFeature({
18
- variant: vcfVariant,
19
- parser: vcfParser,
20
- id: `vcf-${lineNumber}`,
21
- });
22
- const data = line.split('\t').map(d => (d === '.' ? '' : d));
23
- // no format column, add blank
24
- if (data.length === 8) {
25
- data.push('');
26
- }
27
- const row = {
28
- id: String(lineNumber + 1),
29
- extendedData: { vcfFeature: vcfFeature.toJSON() },
30
- cells: data.map((text, columnNumber) => {
31
- return {
32
- columnNumber,
33
- text,
34
- };
35
- }),
36
- };
37
- return row;
38
- }
39
- export function parseVcfBuffer(buffer, options = {}) {
40
- const { selectedAssemblyName } = options;
41
- let { header, body } = splitVcfFileHeaderAndBody(bufferToString(buffer));
42
- const rows = [];
3
+ import { isNumber } from './isNumber';
4
+ import { bufferToLines } from './util';
5
+ export function parseVcfBuffer(buffer) {
6
+ const lines = bufferToLines(buffer);
7
+ const header = lines.filter(l => l.startsWith('#')).join('\n');
8
+ const body = lines.filter(l => !l.startsWith('#'));
43
9
  const vcfParser = new VCF({ header });
44
- header = ''; // garbage collect
45
- body.split(/\n|\r\n|\r/).forEach((line, lineNumber) => {
46
- if (/\S/.test(line)) {
47
- rows.push(vcfRecordToRow(vcfParser, line, lineNumber));
48
- }
49
- });
50
- body = ''; // garbage collect
51
- const rowSet = {
52
- isLoaded: true,
53
- rows,
54
- };
55
- const columnDisplayOrder = [];
56
- const columns = [];
57
- for (let i = 0; i < vcfCoreColumns.length; i += 1) {
58
- columnDisplayOrder.push(i);
59
- columns[i] = {
60
- name: vcfCoreColumns[i].name,
61
- dataType: { type: vcfCoreColumns[i].type },
62
- };
63
- }
64
- for (let i = 0; i < vcfParser.samples.length; i += 1) {
65
- const oi = vcfCoreColumns.length + i;
66
- columnDisplayOrder.push(oi);
67
- columns[oi] = {
68
- name: vcfParser.samples[i],
69
- dataType: { type: 'Text' },
70
- };
71
- }
72
- columnDisplayOrder.push(columnDisplayOrder.length);
73
- columns.unshift({
74
- name: 'Location',
75
- dataType: { type: 'LocString' },
76
- isDerived: true,
77
- derivationFunctionText: `jexl:{text:row.extendedData.vcfFeature.refName+':'\n
78
- +row.extendedData.vcfFeature.start+'..'+row.extendedData.vcfFeature.end, extendedData:\n
79
- {refName:row.extendedData.vcfFeature.refName,start:row.extendedData.vcfFeature.start,end:row.extendedData.vcfFeature.end}}`,
80
- });
81
- return {
82
- rowSet,
83
- columnDisplayOrder,
84
- hasColumnNames: true,
85
- columns,
86
- assemblyName: selectedAssemblyName,
87
- };
88
- }
89
- export function splitVcfFileHeaderAndBody(wholeFile) {
90
- // split into header and the rest of the file
91
- let headerEndIndex = 0;
92
- let prevChar;
93
- for (; headerEndIndex < wholeFile.length; headerEndIndex += 1) {
94
- const c = wholeFile[headerEndIndex];
95
- if (prevChar === '\n' && c !== '#') {
96
- break;
97
- }
98
- prevChar = c;
10
+ const keys = new Set();
11
+ const rows = [];
12
+ let i = 0;
13
+ for (const line of body) {
14
+ const [CHROM, POS, ID, REF, ALT, QUAL, FILTER, INFO, FORMAT, ...rest] = line.split('\t');
15
+ const ret = Object.fromEntries((INFO === null || INFO === void 0 ? void 0 : INFO.split(';').map(f => f.trim()).map(e => {
16
+ const [key, val = 'true'] = e.split('=');
17
+ const k = `INFO.${key.trim()}`;
18
+ keys.add(k);
19
+ const v = val.trim();
20
+ return [k, isNumber(v) ? +v : v];
21
+ })) || []);
22
+ rows.push({
23
+ cellData: {
24
+ CHROM,
25
+ POS: +POS,
26
+ ID,
27
+ REF,
28
+ ALT,
29
+ QUAL: isNumber(QUAL) ? +QUAL : QUAL,
30
+ FILTER,
31
+ FORMAT,
32
+ ...ret,
33
+ ...Object.fromEntries(vcfParser.samples.map((s, idx) => [s, rest[idx]])),
34
+ },
35
+ feature: new VcfFeature({
36
+ parser: vcfParser,
37
+ variant: vcfParser.parseLine(line),
38
+ id: `vcf-${i}`,
39
+ }).toJSON(),
40
+ });
41
+ i++;
99
42
  }
100
43
  return {
101
- header: wholeFile.slice(0, Math.max(0, headerEndIndex)),
102
- body: wholeFile.slice(headerEndIndex),
44
+ columns: [
45
+ 'CHROM',
46
+ 'POS',
47
+ 'ID',
48
+ 'REF',
49
+ 'ALT',
50
+ 'QUAL',
51
+ 'FILTER',
52
+ ...keys,
53
+ 'FORMAT',
54
+ ...vcfParser.samples,
55
+ ].map(c => ({ name: c })),
56
+ rowSet: {
57
+ rows,
58
+ },
103
59
  };
104
60
  }
@@ -0,0 +1 @@
1
+ export declare function isNumber(num: unknown): num is number;
@@ -0,0 +1,11 @@
1
+ export function isNumber(num) {
2
+ if (typeof num === 'number') {
3
+ return num - num === 0;
4
+ }
5
+ else if (typeof num === 'string' && num.trim() !== '') {
6
+ return Number.isFinite(+num);
7
+ }
8
+ else {
9
+ return false;
10
+ }
11
+ }
@@ -0,0 +1,2 @@
1
+ export declare function parseStrand(strand?: string): 1 | -1 | undefined;
2
+ export declare function bufferToLines(buffer: Uint8Array): string[];
@@ -0,0 +1,18 @@
1
+ export function parseStrand(strand) {
2
+ if (strand === '+') {
3
+ return 1;
4
+ }
5
+ else if (strand === '-') {
6
+ return -1;
7
+ }
8
+ else {
9
+ return undefined;
10
+ }
11
+ }
12
+ export function bufferToLines(buffer) {
13
+ return new TextDecoder('utf8')
14
+ .decode(buffer)
15
+ .split(/\n|\r\n|\r/)
16
+ .map(f => f.trim())
17
+ .filter(f => !!f);
18
+ }
@@ -1,3 +1,3 @@
1
- import PluginManager from '@jbrowse/core/PluginManager';
1
+ import type PluginManager from '@jbrowse/core/PluginManager';
2
2
  export default function SpreadsheetViewF(pluginManager: PluginManager): void;
3
- export { type SpreadsheetViewModel, type SpreadsheetViewStateModel, } from './models/SpreadsheetView';
3
+ export type { SpreadsheetViewModel, SpreadsheetViewStateModel, } from './SpreadsheetViewModel';
@@ -1,12 +1,12 @@
1
1
  import { lazy } from 'react';
2
2
  import { ViewType } from '@jbrowse/core/pluggableElementTypes';
3
- import stateModel from './models/SpreadsheetView';
3
+ import stateModelFactory from './SpreadsheetViewModel';
4
4
  export default function SpreadsheetViewF(pluginManager) {
5
5
  pluginManager.addViewType(() => {
6
6
  return new ViewType({
7
7
  name: 'SpreadsheetView',
8
8
  displayName: 'Spreadsheet view',
9
- stateModel,
9
+ stateModel: stateModelFactory(),
10
10
  ReactComponent: lazy(() => import('./components/SpreadsheetView')),
11
11
  });
12
12
  });
@@ -0,0 +1,7 @@
1
+ import type { AbstractSessionModel } from '@jbrowse/core/util';
2
+ export declare function locationLinkClick({ assemblyName, session, locString, spreadsheetViewId, }: {
3
+ assemblyName: string;
4
+ session: AbstractSessionModel;
5
+ locString: string;
6
+ spreadsheetViewId: string;
7
+ }): Promise<void>;
@@ -0,0 +1,10 @@
1
+ export function locationLinkClick({ assemblyName, session, locString, spreadsheetViewId, }) {
2
+ const newViewId = `${spreadsheetViewId}_${assemblyName}`;
3
+ let view = session.views.find(v => v.id === newViewId);
4
+ if (!view) {
5
+ view = session.addView('LinearGenomeView', {
6
+ id: newViewId,
7
+ });
8
+ }
9
+ return view.navToLocString(locString, assemblyName);
10
+ }
package/esm/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import PluginManager from '@jbrowse/core/PluginManager';
2
1
  import Plugin from '@jbrowse/core/Plugin';
2
+ import type PluginManager from '@jbrowse/core/PluginManager';
3
3
  export default class SpreadsheetViewPlugin extends Plugin {
4
4
  name: string;
5
5
  install(pluginManager: PluginManager): void;
package/esm/index.js CHANGED
@@ -1,10 +1,8 @@
1
1
  import Plugin from '@jbrowse/core/Plugin';
2
2
  import { isAbstractMenuManager } from '@jbrowse/core/util';
3
- // icons
4
3
  import ViewComfyIcon from '@mui/icons-material/ViewComfy';
5
- // locals
6
- import SpreadsheetViewF from './SpreadsheetView';
7
4
  import LaunchSpreadsheetViewF from './LaunchSpreadsheetView';
5
+ import SpreadsheetViewF from './SpreadsheetView';
8
6
  export default class SpreadsheetViewPlugin extends Plugin {
9
7
  constructor() {
10
8
  super(...arguments);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbrowse/plugin-spreadsheet-view",
3
- "version": "2.17.0",
3
+ "version": "3.0.0",
4
4
  "description": "JBrowse 2 spreadsheet view",
5
5
  "keywords": [
6
6
  "jbrowse",
@@ -36,16 +36,16 @@
36
36
  "clean": "rimraf dist esm *.tsbuildinfo"
37
37
  },
38
38
  "dependencies": {
39
- "@gmod/bgzf-filehandle": "^1.4.3",
40
- "@gmod/vcf": "^5.0.9",
41
- "@jbrowse/plugin-variants": "^2.17.0",
42
- "@mui/icons-material": "^6.0.0",
43
- "csvtojson": "^2.0.10"
39
+ "@gmod/bgzf-filehandle": "^2.0.1",
40
+ "@gmod/vcf": "^6.0.0",
41
+ "@jbrowse/plugin-variants": "^3.0.0",
42
+ "@mui/icons-material": "^6.0.0"
44
43
  },
45
44
  "peerDependencies": {
46
45
  "@jbrowse/core": "^2.0.0",
47
46
  "@jbrowse/plugin-linear-genome-view": "^2.0.0",
48
47
  "@mui/material": "^6.0.0",
48
+ "@mui/x-data-grid": "^7.0.0",
49
49
  "mobx": "^6.0.0",
50
50
  "mobx-react": "^9.0.0",
51
51
  "mobx-state-tree": "^5.0.0",
@@ -60,5 +60,5 @@
60
60
  "publishConfig": {
61
61
  "access": "public"
62
62
  },
63
- "gitHead": "eed30b5e671f8f7823652d7cecc51aa89226de46"
63
+ "gitHead": "2c6897f1fa732b1db5b094d1dca197e333e95319"
64
64
  }
@@ -1,9 +0,0 @@
1
- import { Instance } from 'mobx-state-tree';
2
- import type SpreadsheetStateModel from '../models/Spreadsheet';
3
- type SpreadsheetModel = Instance<typeof SpreadsheetStateModel>;
4
- declare const CellData: ({ cell, spreadsheetModel, columnNumber, }: {
5
- cell: any;
6
- spreadsheetModel: SpreadsheetModel;
7
- columnNumber: number;
8
- }) => any;
9
- export default CellData;
@@ -1,14 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const react_1 = __importDefault(require("react"));
7
- const mobx_react_1 = require("mobx-react");
8
- const CellData = (0, mobx_react_1.observer)(function ({ cell, spreadsheetModel, columnNumber, }) {
9
- const column = spreadsheetModel.columns[columnNumber];
10
- return column &&
11
- 'dataType' in column &&
12
- column.dataType.DataCellReactComponent ? (react_1.default.createElement(column.dataType.DataCellReactComponent, { cell: cell, dataType: column.dataType, columnNumber: columnNumber, spreadsheet: spreadsheetModel })) : (cell.text);
13
- });
14
- exports.default = CellData;
@@ -1,3 +0,0 @@
1
- import React from 'react';
2
- declare const ColumnFilterControls: ({ viewModel, filterModel, columnNumber, height, }: any) => React.JSX.Element;
3
- export default ColumnFilterControls;
@@ -1,58 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const react_1 = __importDefault(require("react"));
7
- const material_1 = require("@mui/material");
8
- const mobx_react_1 = require("mobx-react");
9
- const mobx_state_tree_1 = require("mobx-state-tree");
10
- const mui_1 = require("tss-react/mui");
11
- // icons
12
- const FilterList_1 = __importDefault(require("@mui/icons-material/FilterList"));
13
- const Close_1 = __importDefault(require("@mui/icons-material/Close"));
14
- const useStyles = (0, mui_1.makeStyles)()(theme => ({
15
- columnName: {
16
- verticalAlign: 'middle',
17
- paddingRight: '0.3em',
18
- },
19
- columnFilter: {
20
- overflow: 'hidden',
21
- whiteSpace: 'nowrap',
22
- boxSizing: 'border-box',
23
- width: '100%',
24
- position: 'relative',
25
- },
26
- filterIcon: {
27
- position: 'relative',
28
- top: '12px',
29
- },
30
- filterIconBg: {
31
- background: theme.palette.tertiary.main,
32
- color: 'white',
33
- padding: theme.spacing(1.5),
34
- },
35
- }));
36
- function FilterOperations({ filterModel }) {
37
- if (filterModel) {
38
- return react_1.default.createElement(filterModel.ReactComponent, { filterModel: filterModel });
39
- }
40
- return null;
41
- }
42
- const ColumnFilterControls = (0, mobx_react_1.observer)(function ({ viewModel, filterModel, columnNumber, height, }) {
43
- const { classes } = useStyles();
44
- const columnDefinition = viewModel.spreadsheet.columns[columnNumber];
45
- if (!columnDefinition) {
46
- throw new Error('no column definition! filters are probably out of date');
47
- }
48
- return (react_1.default.createElement(material_1.Grid, { container: true, direction: "row", className: classes.columnFilter, style: { height } },
49
- react_1.default.createElement(material_1.Grid, { item: true, className: classes.filterIconBg },
50
- react_1.default.createElement(FilterList_1.default, { className: classes.filterIcon })),
51
- react_1.default.createElement(material_1.Grid, { item: true },
52
- react_1.default.createElement(material_1.IconButton, { onClick: () => (0, mobx_state_tree_1.getParent)(filterModel, 2).removeColumnFilter(filterModel), title: "remove filter" },
53
- react_1.default.createElement(Close_1.default, null)),
54
- react_1.default.createElement(material_1.Typography, { className: classes.columnName, component: "span" }, columnDefinition.name),
55
- ' ',
56
- react_1.default.createElement(FilterOperations, { filterModel: filterModel }))));
57
- });
58
- exports.default = ColumnFilterControls;
@@ -1,16 +0,0 @@
1
- import React from 'react';
2
- import { SpreadsheetModel } from '../models/Spreadsheet';
3
- import { SpreadsheetViewModel } from '../models/SpreadsheetView';
4
- declare const ColumnMenu: ({ viewModel, spreadsheetModel, currentColumnMenu, setColumnMenu, }: {
5
- spreadsheetModel: SpreadsheetModel;
6
- viewModel: SpreadsheetViewModel;
7
- currentColumnMenu?: {
8
- colNumber: number;
9
- anchorEl: HTMLElement;
10
- };
11
- setColumnMenu: (arg?: {
12
- anchorEl: HTMLElement;
13
- colNumber: number;
14
- }) => void;
15
- }) => React.JSX.Element;
16
- export default ColumnMenu;