@basic-genomics/hivtrace-viz 1.1.3 → 1.1.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.
@@ -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, 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;AA2F3F,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,OAAO,EACP,aAAa,EACb,mBAA0B,EAC1B,cAAc,EACd,kBAAkB,EAClB,OAAO,EACP,OAAO,EACP,KAAK,EACL,SAAS,EACT,KAAK,EACL,UAAU,EACV,YAAY,GACb,EAAE,gBAAgB,2CAiKlB;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, 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);
@@ -105,11 +104,19 @@ export function HivtraceViz({ data, options, isDataFetched, showLoadingOnUpdate
105
104
  case 'ERROR':
106
105
  onError?.(msg.message || 'Unknown error');
107
106
  break;
107
+ case 'HIVTRACE_RETRY':
108
+ onRetry?.();
109
+ break;
110
+ case 'CUSTOM_MENU_CLICK':
111
+ if (msg.itemId && msg.clusterInfo) {
112
+ onCustomMenuItemClick?.(msg.itemId, msg.clusterInfo);
113
+ }
114
+ break;
108
115
  }
109
116
  };
110
117
  window.addEventListener('message', handleMessage);
111
118
  return () => window.removeEventListener('message', handleMessage);
112
- }, [onTrackCluster, onFullscreenChange, onReady, onError]);
119
+ }, [onFullscreenChange, onReady, onError, onRetry, onCustomMenuItemClick]);
113
120
  // iframe 加载完成时发送初始数据或错误
114
121
  useEffect(() => {
115
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,14 +95,14 @@ 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
  /** 可视化渲染完成回调 */
64
101
  onReady?: () => void;
65
102
  /** 错误回调 */
66
103
  onError?: (message: string) => void;
104
+ /** 重试回调(用户点击错误状态下的重试按钮时触发) */
105
+ onRetry?: () => void;
67
106
  /**
68
107
  * 错误信息
69
108
  * - 传入错误消息时,组件会显示错误状态而不是加载态
@@ -78,5 +117,16 @@ export interface HivtraceVizProps {
78
117
  emptyState?: React.ReactNode;
79
118
  /** 自定义加载状态渲染 */
80
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;
81
131
  }
82
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;;;;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.3",
3
+ "version": "1.1.5",
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
+ }