@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.
- package/dist/embed/index.html +112 -46
- package/package.json +1 -1
package/dist/embed/index.html
CHANGED
|
@@ -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')
|
|
1772
|
-
|
|
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')
|
|
1777
|
-
|
|
1778
|
-
|
|
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')
|
|
1783
|
-
|
|
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')
|
|
1788
|
-
|
|
1789
|
-
|
|
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')
|
|
1795
|
-
|
|
1796
|
-
|
|
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')
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
var
|
|
1811
|
-
if (
|
|
1812
|
-
|
|
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')
|
|
1819
|
-
|
|
1820
|
-
|
|
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')
|
|
1825
|
-
|
|
1826
|
-
|
|
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')
|
|
1831
|
-
|
|
1832
|
-
|
|
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
|
|