@basic-genomics/hivtrace-viz 1.1.4 → 1.1.6

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.
@@ -3,6 +3,6 @@
3
3
  * 封装 iframe 和 postMessage 通信,提供简洁的 React 接口
4
4
  */
5
5
  import type { HivtraceVizProps } from './types';
6
- export declare function HivtraceViz({ data, options, isDataFetched, showLoadingOnUpdate, onTrackCluster, onFullscreenChange, onReady, onError, onRetry, error, className, style, emptyState, loadingState, }: HivtraceVizProps): import("react/jsx-runtime").JSX.Element;
6
+ export declare function HivtraceViz({ data, options, isDataFetched, showLoadingOnUpdate, onFullscreenChange, onReady, onError, onRetry, error, className, style, emptyState, loadingState, customContextMenuItems, onCustomMenuItemClick, }: HivtraceVizProps): import("react/jsx-runtime").JSX.Element;
7
7
  export default HivtraceViz;
8
8
  //# sourceMappingURL=HivtraceViz.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"HivtraceViz.d.ts","sourceRoot":"","sources":["../../src/react/HivtraceViz.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAA6C,MAAM,SAAS,CAAC;AA4F3F,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,OAAO,EACP,aAAa,EACb,mBAA0B,EAC1B,cAAc,EACd,kBAAkB,EAClB,OAAO,EACP,OAAO,EACP,OAAO,EACP,KAAK,EACL,SAAS,EACT,KAAK,EACL,UAAU,EACV,YAAY,GACb,EAAE,gBAAgB,2CAsKlB;AAED,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"HivtraceViz.d.ts","sourceRoot":"","sources":["../../src/react/HivtraceViz.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAA6C,MAAM,SAAS,CAAC;AA6F3F,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,OAAO,EACP,aAAa,EACb,mBAA0B,EAC1B,kBAAkB,EAClB,OAAO,EACP,OAAO,EACP,OAAO,EACP,KAAK,EACL,SAAS,EACT,KAAK,EACL,UAAU,EACV,YAAY,EACZ,sBAAsB,EACtB,qBAAqB,GACtB,EAAE,gBAAgB,2CA0KlB;AAED,eAAe,WAAW,CAAC"}
@@ -44,7 +44,7 @@ function DefaultLoadingState({ message }) {
44
44
  animation: 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite',
45
45
  } }), _jsx("p", { style: { color: '#6b7280' }, children: message })] }) }));
46
46
  }
47
- export function HivtraceViz({ data, options, isDataFetched, showLoadingOnUpdate = true, onTrackCluster, onFullscreenChange, onReady, onError, onRetry, error, className, style, emptyState, loadingState, }) {
47
+ export function HivtraceViz({ data, options, isDataFetched, showLoadingOnUpdate = true, onFullscreenChange, onReady, onError, onRetry, error, className, style, emptyState, loadingState, customContextMenuItems, onCustomMenuItemClick, }) {
48
48
  const iframeRef = useRef(null);
49
49
  const [internalLoadingState, setInternalLoadingState] = useState('initial');
50
50
  const [isIframeReady, setIsIframeReady] = useState(false);
@@ -61,9 +61,13 @@ export function HivtraceViz({ data, options, isDataFetched, showLoadingOnUpdate
61
61
  iframe.contentWindow.postMessage({
62
62
  type,
63
63
  graphData: data,
64
- options,
64
+ options: {
65
+ ...options,
66
+ // 传递自定义菜单项配置到 iframe
67
+ customContextMenuItems,
68
+ },
65
69
  }, '*');
66
- }, [data, options]);
70
+ }, [data, options, customContextMenuItems]);
67
71
  // 发送错误到 iframe
68
72
  const sendError = useCallback((message) => {
69
73
  const iframe = iframeRef.current;
@@ -92,11 +96,6 @@ export function HivtraceViz({ data, options, isDataFetched, showLoadingOnUpdate
92
96
  setInternalLoadingState('rendered');
93
97
  onReady?.();
94
98
  break;
95
- case 'TRACK_CLUSTER':
96
- if (msg.clusterInfo && msg.allData) {
97
- onTrackCluster?.(msg.clusterInfo, msg.allData);
98
- }
99
- break;
100
99
  case 'FULLSCREEN_CHANGE':
101
100
  if (typeof msg.isFullscreen === 'boolean') {
102
101
  onFullscreenChange?.(msg.isFullscreen);
@@ -108,11 +107,16 @@ export function HivtraceViz({ data, options, isDataFetched, showLoadingOnUpdate
108
107
  case 'HIVTRACE_RETRY':
109
108
  onRetry?.();
110
109
  break;
110
+ case 'CUSTOM_MENU_CLICK':
111
+ if (msg.itemId && msg.clusterInfo) {
112
+ onCustomMenuItemClick?.(msg.itemId, msg.clusterInfo);
113
+ }
114
+ break;
111
115
  }
112
116
  };
113
117
  window.addEventListener('message', handleMessage);
114
118
  return () => window.removeEventListener('message', handleMessage);
115
- }, [onTrackCluster, onFullscreenChange, onReady, onError, onRetry]);
119
+ }, [onFullscreenChange, onReady, onError, onRetry, onCustomMenuItemClick]);
116
120
  // iframe 加载完成时发送初始数据或错误
117
121
  useEffect(() => {
118
122
  if (isIframeReady && internalLoadingState === 'frameReady') {
@@ -1,3 +1,3 @@
1
1
  export { HivtraceViz, default } from './HivtraceViz';
2
- export type { HivtraceVizProps, HivtraceVizData, HivtraceVizOptions, ClusterInfo, NetworkInfo, } from './types';
2
+ export type { HivtraceVizProps, HivtraceVizData, HivtraceVizOptions, ClusterInfo, ClusterNodeInfo, NetworkInfo, CustomContextMenuItem, } from './types';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,WAAW,GACZ,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,WAAW,EACX,qBAAqB,GACtB,MAAM,SAAS,CAAC"}
@@ -18,6 +18,29 @@ export interface HivtraceVizOptions {
18
18
  /** 基因距离阈值(如 0.015 表示 1.5%) */
19
19
  threshold?: number;
20
20
  }
21
+ /**
22
+ * 簇内节点的详细信息
23
+ */
24
+ export interface ClusterNodeInfo {
25
+ /** 节点 ID */
26
+ id: string;
27
+ /** 节点度数 */
28
+ degree?: number;
29
+ /** 节点属性(如患者属性等) */
30
+ attributes?: Record<string, unknown>;
31
+ /** 节点 X 坐标 */
32
+ x?: number;
33
+ /** 节点 Y 坐标 */
34
+ y?: number;
35
+ /** 是否隐藏 */
36
+ is_hidden?: boolean;
37
+ /** 是否匹配当前筛选条件 */
38
+ match_filter?: boolean;
39
+ /** 子簇 ID */
40
+ subcluster_id?: string;
41
+ /** 子簇标签 */
42
+ subcluster_label?: string;
43
+ }
21
44
  export interface ClusterInfo {
22
45
  cluster_id: string | number;
23
46
  node_count: number;
@@ -30,7 +53,10 @@ export interface ClusterInfo {
30
53
  expanded: boolean;
31
54
  fixed: boolean;
32
55
  };
56
+ /** 节点 ID 列表(向后兼容) */
33
57
  node_ids: string[];
58
+ /** 完整节点信息列表 */
59
+ nodes?: ClusterNodeInfo[];
34
60
  }
35
61
  export interface NetworkInfo {
36
62
  network_info: {
@@ -39,6 +65,19 @@ export interface NetworkInfo {
39
65
  total_clusters: number;
40
66
  };
41
67
  }
68
+ /**
69
+ * 自定义上下文菜单项接口
70
+ */
71
+ export interface CustomContextMenuItem {
72
+ /** 菜单项唯一标识符 */
73
+ id: string;
74
+ /** 显示的标签文本 */
75
+ label: string;
76
+ /** 可选的 FontAwesome 图标类名(如 'fa-star') */
77
+ icon?: string;
78
+ /** 是否禁用该菜单项 */
79
+ disabled?: boolean;
80
+ }
42
81
  export interface HivtraceVizProps {
43
82
  /** 分析数据 */
44
83
  data?: HivtraceVizData;
@@ -56,8 +95,6 @@ export interface HivtraceVizProps {
56
95
  * - false: 静默更新,不显示 loading
57
96
  */
58
97
  showLoadingOnUpdate?: boolean;
59
- /** 簇追踪回调 */
60
- onTrackCluster?: (clusterInfo: ClusterInfo, networkInfo: NetworkInfo) => void;
61
98
  /** 全屏状态变化回调 */
62
99
  onFullscreenChange?: (isFullscreen: boolean) => void;
63
100
  /** 可视化渲染完成回调 */
@@ -80,5 +117,16 @@ export interface HivtraceVizProps {
80
117
  emptyState?: React.ReactNode;
81
118
  /** 自定义加载状态渲染 */
82
119
  loadingState?: React.ReactNode;
120
+ /**
121
+ * 自定义上下文菜单项
122
+ * 会在簇节点点击菜单的默认项之后显示
123
+ */
124
+ customContextMenuItems?: CustomContextMenuItem[];
125
+ /**
126
+ * 自定义菜单项点击回调
127
+ * @param itemId - 被点击菜单项的 id
128
+ * @param clusterInfo - 当前簇的信息
129
+ */
130
+ onCustomMenuItemClick?: (itemId: string, clusterInfo: ClusterInfo) => void;
83
131
  }
84
132
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/react/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,aAAa,CAAC,EAAE;QACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;QAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,gBAAgB;IAChB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,kBAAkB;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,KAAK,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7C,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE;QACZ,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW;IACX,IAAI,CAAC,EAAE,eAAe,CAAC;IAEvB,WAAW;IACX,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAE7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,YAAY;IACZ,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;IAE9E,eAAe;IACf,kBAAkB,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC;IAErD,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB,WAAW;IACX,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAEpC,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAGrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,YAAY;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,YAAY;IACZ,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAE5B,eAAe;IACf,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE7B,gBAAgB;IAChB,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAChC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/react/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@basic-genomics/hivtrace-viz",
3
- "version": "1.1.4",
3
+ "version": "1.1.6",
4
4
  "description": "HIV-TRACE molecular transmission network visualization with React integration",
5
5
  "engines": {
6
6
  "node": ">=18"
@@ -103,4 +103,4 @@
103
103
  "vite"
104
104
  ],
105
105
  "packageManager": "yarn@1.22.19+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447"
106
- }
106
+ }