react-msaview 4.4.3 → 4.4.5

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 (49) hide show
  1. package/bundle/index.js +112 -112
  2. package/bundle/index.js.LICENSE.txt +24 -6
  3. package/bundle/index.js.map +1 -1
  4. package/dist/components/dialogs/InterProScanDialog.js +1 -1
  5. package/dist/components/dialogs/InterProScanDialog.js.map +1 -1
  6. package/dist/components/dialogs/SettingsDialog.js +1 -1
  7. package/dist/components/dialogs/SettingsDialog.js.map +1 -1
  8. package/dist/components/msa/MSACanvasBlock.js +8 -1
  9. package/dist/components/msa/MSACanvasBlock.js.map +1 -1
  10. package/dist/components/msa/renderMSABlock.js +22 -4
  11. package/dist/components/msa/renderMSABlock.js.map +1 -1
  12. package/dist/components/msa/renderMSAMouseover.js +21 -1
  13. package/dist/components/msa/renderMSAMouseover.js.map +1 -1
  14. package/dist/components/tree/TreeCanvas.js +61 -2
  15. package/dist/components/tree/TreeCanvas.js.map +1 -1
  16. package/dist/components/tree/TreeCanvasBlock.js +56 -5
  17. package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
  18. package/dist/components/tree/TreeNodeMenu.js +6 -2
  19. package/dist/components/tree/TreeNodeMenu.js.map +1 -1
  20. package/dist/components/tree/renderTreeCanvas.d.ts +14 -4
  21. package/dist/components/tree/renderTreeCanvas.js +3 -0
  22. package/dist/components/tree/renderTreeCanvas.js.map +1 -1
  23. package/dist/components/util.js +1 -1
  24. package/dist/components/util.js.map +1 -1
  25. package/dist/layout.d.ts +4 -1
  26. package/dist/layout.js +30 -8
  27. package/dist/layout.js.map +1 -1
  28. package/dist/model/treeModel.js +2 -2
  29. package/dist/model/treeModel.js.map +1 -1
  30. package/dist/model.d.ts +14 -79
  31. package/dist/model.js +94 -4
  32. package/dist/model.js.map +1 -1
  33. package/dist/version.d.ts +1 -1
  34. package/dist/version.js +1 -1
  35. package/package.json +4 -3
  36. package/src/components/dialogs/InterProScanDialog.tsx +1 -1
  37. package/src/components/dialogs/SettingsDialog.tsx +1 -1
  38. package/src/components/msa/MSACanvasBlock.tsx +8 -1
  39. package/src/components/msa/renderMSABlock.ts +32 -2
  40. package/src/components/msa/renderMSAMouseover.ts +26 -0
  41. package/src/components/tree/TreeCanvas.tsx +76 -1
  42. package/src/components/tree/TreeCanvasBlock.tsx +69 -5
  43. package/src/components/tree/TreeNodeMenu.tsx +12 -1
  44. package/src/components/tree/renderTreeCanvas.ts +20 -4
  45. package/src/components/util.ts +1 -1
  46. package/src/layout.ts +48 -8
  47. package/src/model/treeModel.ts +2 -2
  48. package/src/model.ts +108 -5
  49. package/src/version.ts +1 -1
package/src/model.ts CHANGED
@@ -289,6 +289,14 @@ function stateModelFactory() {
289
289
  */
290
290
  mouseClickCol: undefined as number | undefined,
291
291
 
292
+ /**
293
+ * #volatile
294
+ * the currently hovered tree node ID and its descendant leaf names
295
+ */
296
+ hoveredTreeNode: undefined as
297
+ | { nodeId: string; descendantNames: string[] }
298
+ | undefined,
299
+
292
300
  /**
293
301
  * #volatile
294
302
  * a dummy variable that is incremented when ref changes so autorun for
@@ -327,7 +335,7 @@ function stateModelFactory() {
327
335
  /**
328
336
  * #action
329
337
  */
330
- drawRelativeTo(id: string) {
338
+ drawRelativeTo(id: string | undefined) {
331
339
  self.relativeTo = id
332
340
  },
333
341
  /**
@@ -396,6 +404,31 @@ function stateModelFactory() {
396
404
  self.mouseCol = col
397
405
  self.mouseRow = row
398
406
  },
407
+
408
+ /**
409
+ * #action
410
+ * set hovered tree node and its descendants
411
+ */
412
+ setHoveredTreeNode(nodeId?: string) {
413
+ if (!nodeId) {
414
+ self.hoveredTreeNode = undefined
415
+ return
416
+ }
417
+
418
+ // Find the node in the hierarchy
419
+ const node = (self as any).hierarchy.find(
420
+ (n: any) => n.data.id === nodeId,
421
+ )
422
+ if (!node) {
423
+ self.hoveredTreeNode = undefined
424
+ return
425
+ }
426
+
427
+ // Get all descendant leaf names
428
+ const descendantNames = node.leaves().map((leaf: any) => leaf.data.name)
429
+
430
+ self.hoveredTreeNode = { nodeId, descendantNames }
431
+ },
399
432
  /**
400
433
  * #action
401
434
  */
@@ -673,6 +706,7 @@ function stateModelFactory() {
673
706
  // todo: investigate whether needed, typescript says children always true
674
707
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
675
708
  .sum(d => (d.children ? 0 : 1))
709
+ // eslint-disable-next-line unicorn/no-array-sort
676
710
  .sort((a, b) => ascending(a.data.length || 1, b.data.length || 1))
677
711
 
678
712
  if (self.showOnly) {
@@ -911,7 +945,7 @@ function stateModelFactory() {
911
945
  * #getter
912
946
  */
913
947
  get maxScrollX() {
914
- return -self.totalWidth + (self.msaAreaWidth - 100)
948
+ return Math.min(-self.totalWidth + (self.msaAreaWidth - 100), 0)
915
949
  },
916
950
  /**
917
951
  * #getter
@@ -1009,7 +1043,7 @@ function stateModelFactory() {
1009
1043
  * #action
1010
1044
  */
1011
1045
  doScrollX(deltaX: number) {
1012
- self.scrollX = clamp(self.scrollX + deltaX, self.maxScrollX, 0)
1046
+ this.setScrollX(self.scrollX + deltaX)
1013
1047
  },
1014
1048
 
1015
1049
  /**
@@ -1243,7 +1277,7 @@ function stateModelFactory() {
1243
1277
  }
1244
1278
  }
1245
1279
  }
1246
- return ret.sort((a, b) => len(b) - len(a))
1280
+ return ret.toSorted((a, b) => len(b) - len(a))
1247
1281
  },
1248
1282
  /**
1249
1283
  * #getter
@@ -1525,6 +1559,75 @@ function stateModelFactory() {
1525
1559
  ...rest
1526
1560
  } = snap
1527
1561
 
1562
+ // Default values to filter out
1563
+ const defaults = {
1564
+ // Main model defaults
1565
+ showDomains: false,
1566
+ hideGaps: true,
1567
+ allowedGappyness: 100,
1568
+ contrastLettering: true,
1569
+ subFeatureRows: false,
1570
+ drawMsaLetters: true,
1571
+ height: 550,
1572
+ rowHeight: defaultRowHeight,
1573
+ scrollY: 0,
1574
+ scrollX: 0,
1575
+ colWidth: defaultColWidth,
1576
+ currentAlignment: 0,
1577
+ // MSA model defaults
1578
+ bgColor: true,
1579
+ colorSchemeName: 'maeditor',
1580
+ // Tree model defaults
1581
+ drawLabels: true,
1582
+ labelsAlignRight: false,
1583
+ treeAreaWidth: 400,
1584
+ treeWidth: 300,
1585
+ treeWidthMatchesArea: true,
1586
+ showBranchLen: true,
1587
+ drawTree: true,
1588
+ drawNodeBubbles: true,
1589
+ }
1590
+
1591
+ // Properties that should always be included even if they match defaults
1592
+ const alwaysInclude = new Set(['id', 'type', 'relativeTo'])
1593
+
1594
+ // Filter out properties that match default values
1595
+ function filterDefaults(obj: Record<string, any>): Record<string, any> {
1596
+ const filtered: Record<string, any> = {}
1597
+ for (const [key, value] of Object.entries(obj)) {
1598
+ // Always include essential properties
1599
+ if (alwaysInclude.has(key)) {
1600
+ filtered[key] = value
1601
+ continue
1602
+ }
1603
+
1604
+ // Skip if value matches default
1605
+ if (defaults[key as keyof typeof defaults] === value) {
1606
+ continue
1607
+ }
1608
+
1609
+ // Handle nested objects
1610
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
1611
+ const filteredNested = filterDefaults(value)
1612
+ // Only include nested object if it has non-default properties
1613
+ if (Object.keys(filteredNested).length > 0) {
1614
+ filtered[key] = filteredNested
1615
+ }
1616
+ } else if (Array.isArray(value)) {
1617
+ // Only include arrays that aren't empty
1618
+ if (value.length > 0) {
1619
+ filtered[key] = value
1620
+ }
1621
+ } else {
1622
+ // Include non-default primitives
1623
+ filtered[key] = value
1624
+ }
1625
+ }
1626
+ return filtered
1627
+ }
1628
+
1629
+ const filteredRest = filterDefaults(rest)
1630
+
1528
1631
  // remove the MSA/tree data from the tree if the filehandle available in
1529
1632
  // which case it can be reloaded on refresh
1530
1633
  return {
@@ -1533,7 +1636,7 @@ function stateModelFactory() {
1533
1636
  ...(result.msaFilehandle ? {} : { msa }),
1534
1637
  ...(result.treeMetadataFilehandle ? {} : { treeMetadata }),
1535
1638
  },
1536
- ...rest,
1639
+ ...filteredRest,
1537
1640
  }
1538
1641
  })
1539
1642
  }
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '4.4.3'
1
+ export const version = '4.4.5'