@basic-genomics/hivtrace-viz 1.5.1 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/embed/index.html +112 -46
  2. package/package.json +1 -1
@@ -1646,6 +1646,10 @@
1646
1646
  if (window._treeData) {
1647
1647
  window._treeData = null;
1648
1648
  }
1649
+ // 清除所有树相关的全局状态
1650
+ window._treeSelectTreeCluster = null;
1651
+ window._treeCurrentClusterIndex = undefined;
1652
+ window._treeExportId = null;
1649
1653
  tree_viz = null;
1650
1654
  }
1651
1655
 
@@ -1742,6 +1746,7 @@
1742
1746
  // 选择簇
1743
1747
  function selectTreeCluster(index) {
1744
1748
  currentClusterIndex = index;
1749
+ window._treeCurrentClusterIndex = currentClusterIndex; // 暴露到全局作用域
1745
1750
  var label = document.getElementById('tree_cluster_selector_label');
1746
1751
 
1747
1752
  if (index < 0) {
@@ -1755,6 +1760,11 @@
1755
1760
  updateTreeNavButtons();
1756
1761
  }
1757
1762
 
1763
+ // 暴露函数到全局作用域供事件处理器使用
1764
+ window._treeSelectTreeCluster = selectTreeCluster;
1765
+ window._treeCurrentClusterIndex = currentClusterIndex;
1766
+ window._treeExportId = options && options.exportId ? options.exportId : null;
1767
+
1758
1768
  // 默认高亮簇
1759
1769
  if (options && options.treeDefaultClusterId != null) {
1760
1770
  var defaultIndex = clusters.findIndex(function (c) {
@@ -1766,71 +1776,124 @@
1766
1776
  }
1767
1777
 
1768
1778
  updateTreeNavButtons();
1779
+ }
1769
1780
 
1781
+ // 进化树工具栏事件初始化(在页面加载时调用一次,使用 null 检查确保安全)
1782
+ function initTreeToolbarEvents() {
1770
1783
  // 适应窗口按钮
1771
- document.getElementById('tree_fit_btn').addEventListener('click', function () {
1772
- tree_viz.fitView();
1773
- });
1784
+ var treeFitBtn = document.getElementById('tree_fit_btn');
1785
+ if (treeFitBtn) {
1786
+ treeFitBtn.addEventListener('click', function () {
1787
+ if (tree_viz && tree_viz.cy) {
1788
+ tree_viz.fitView();
1789
+ }
1790
+ });
1791
+ }
1774
1792
 
1775
1793
  // 标签按钮
1776
- document.getElementById('tree_labels_btn').addEventListener('click', function () {
1777
- var showing = tree_viz.toggleLabels();
1778
- document.getElementById('tree_labels_text').textContent = showing ? '隐藏标签' : '显示标签';
1779
- });
1794
+ var treeLabelsBtn = document.getElementById('tree_labels_btn');
1795
+ if (treeLabelsBtn) {
1796
+ treeLabelsBtn.addEventListener('click', function () {
1797
+ if (tree_viz && tree_viz.cy) {
1798
+ var showing = tree_viz.toggleLabels();
1799
+ var labelsText = document.getElementById('tree_labels_text');
1800
+ if (labelsText) {
1801
+ labelsText.textContent = showing ? '隐藏标签' : '显示标签';
1802
+ }
1803
+ }
1804
+ });
1805
+ }
1780
1806
 
1781
1807
  // 聚焦根按钮
1782
- document.getElementById('tree_show_root_btn').addEventListener('click', function () {
1783
- tree_viz.focusOnRoot();
1784
- });
1808
+ var treeShowRootBtn = document.getElementById('tree_show_root_btn');
1809
+ if (treeShowRootBtn) {
1810
+ treeShowRootBtn.addEventListener('click', function () {
1811
+ if (tree_viz && tree_viz.cy) {
1812
+ tree_viz.focusOnRoot();
1813
+ }
1814
+ });
1815
+ }
1785
1816
 
1786
1817
  // 上一个簇
1787
- document.getElementById('tree_cluster_prev_btn').addEventListener('click', function () {
1788
- if (currentClusterIndex >= 0) {
1789
- selectTreeCluster(currentClusterIndex - 1);
1790
- }
1791
- });
1818
+ var treePrevBtn = document.getElementById('tree_cluster_prev_btn');
1819
+ if (treePrevBtn) {
1820
+ treePrevBtn.addEventListener('click', function () {
1821
+ if (tree_viz && window._treeCurrentClusterIndex >= 0 && window._treeSelectTreeCluster) {
1822
+ window._treeSelectTreeCluster(window._treeCurrentClusterIndex - 1);
1823
+ }
1824
+ });
1825
+ }
1792
1826
 
1793
1827
  // 下一个簇
1794
- document.getElementById('tree_cluster_next_btn').addEventListener('click', function () {
1795
- if (currentClusterIndex < clusters.length - 1) {
1796
- selectTreeCluster(currentClusterIndex + 1);
1797
- }
1798
- });
1828
+ var treeNextBtn = document.getElementById('tree_cluster_next_btn');
1829
+ if (treeNextBtn) {
1830
+ treeNextBtn.addEventListener('click', function () {
1831
+ if (tree_viz && window._treeSelectTreeCluster) {
1832
+ var clusters = tree_viz.getAvailableClusters();
1833
+ if (typeof window._treeCurrentClusterIndex !== 'undefined' &&
1834
+ window._treeCurrentClusterIndex < clusters.length - 1) {
1835
+ window._treeSelectTreeCluster(window._treeCurrentClusterIndex + 1);
1836
+ }
1837
+ }
1838
+ });
1839
+ }
1799
1840
 
1800
1841
  // 簇选择器下拉菜单点击
1801
- document.getElementById('tree_cluster_selector_menu').addEventListener('click', function (e) {
1802
- e.preventDefault();
1803
- var link = e.target.closest('a[data-value]');
1804
- if (!link) return;
1805
-
1806
- var value = link.getAttribute('data-value');
1807
- if (value === '') {
1808
- selectTreeCluster(-1);
1809
- } else {
1810
- var index = parseInt(link.getAttribute('data-index'), 10);
1811
- if (!isNaN(index)) {
1812
- selectTreeCluster(index);
1842
+ var treeClusterMenu = document.getElementById('tree_cluster_selector_menu');
1843
+ if (treeClusterMenu) {
1844
+ treeClusterMenu.addEventListener('click', function (e) {
1845
+ e.preventDefault();
1846
+ var link = e.target.closest('a[data-value]');
1847
+ if (!link) return;
1848
+
1849
+ if (!window._treeSelectTreeCluster) return;
1850
+
1851
+ var value = link.getAttribute('data-value');
1852
+ if (value === '') {
1853
+ window._treeSelectTreeCluster(-1);
1854
+ } else {
1855
+ var index = parseInt(link.getAttribute('data-index'), 10);
1856
+ if (!isNaN(index)) {
1857
+ window._treeSelectTreeCluster(index);
1858
+ }
1813
1859
  }
1814
- }
1815
- });
1860
+ });
1861
+ }
1816
1862
 
1817
1863
  // 导出 PNG
1818
- document.getElementById('tree_export_png').addEventListener('click', function (e) {
1819
- e.preventDefault();
1820
- tree_viz.exportPNG(options && options.exportId ? options.exportId + '_tree' : 'tree');
1821
- });
1864
+ var treeExportPng = document.getElementById('tree_export_png');
1865
+ if (treeExportPng) {
1866
+ treeExportPng.addEventListener('click', function (e) {
1867
+ e.preventDefault();
1868
+ if (tree_viz && tree_viz.cy) {
1869
+ var exportId = window._treeExportId || 'tree';
1870
+ tree_viz.exportPNG(exportId + '_tree');
1871
+ }
1872
+ });
1873
+ }
1822
1874
 
1823
1875
  // 导出 JSON
1824
- document.getElementById('tree_export_json').addEventListener('click', function (e) {
1825
- e.preventDefault();
1826
- tree_viz.exportJSON(treeData, options && options.exportId ? options.exportId + '_tree' : 'tree');
1827
- });
1876
+ var treeExportJson = document.getElementById('tree_export_json');
1877
+ if (treeExportJson) {
1878
+ treeExportJson.addEventListener('click', function (e) {
1879
+ e.preventDefault();
1880
+ if (tree_viz && window._treeData) {
1881
+ var exportId = window._treeExportId || 'tree';
1882
+ tree_viz.exportJSON(window._treeData, exportId + '_tree');
1883
+ }
1884
+ });
1885
+ }
1828
1886
 
1829
1887
  // 播放动画按钮
1830
- document.getElementById('tree_animate_btn').addEventListener('click', function (e) {
1831
- e.preventDefault();
1832
- tree_viz.animateFromRoot({ delay: 100 });
1833
- });
1888
+ var treeAnimateBtn = document.getElementById('tree_animate_btn');
1889
+ if (treeAnimateBtn) {
1890
+ treeAnimateBtn.addEventListener('click', function (e) {
1891
+ e.preventDefault();
1892
+ if (tree_viz && tree_viz.cy) {
1893
+ tree_viz.animateFromRoot({ delay: 100 });
1894
+ }
1895
+ });
1896
+ }
1834
1897
  }
1835
1898
 
1836
1899
  function HandleAppError(err_string) {
@@ -2634,6 +2697,9 @@
2634
2697
  // 初始化全屏功能
2635
2698
  FullscreenManager.init();
2636
2699
 
2700
+ // 初始化进化树工具栏事件(只注册一次,使用 null 检查确保安全)
2701
+ initTreeToolbarEvents();
2702
+
2637
2703
  // 通知父窗口准备就绪
2638
2704
  window.parent.postMessage({ type: 'HIVTRACE_INIT_READY' }, '*');
2639
2705
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@basic-genomics/hivtrace-viz",
3
- "version": "1.5.1",
3
+ "version": "1.5.2",
4
4
  "description": "HIV-TRACE molecular transmission network visualization with React integration",
5
5
  "engines": {
6
6
  "node": ">=18"