@chromepilot/recording-ui 0.1.0 → 0.1.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/components/EventStreamPanel.d.ts +10 -1
- package/dist/components/EventStreamPanel.d.ts.map +1 -1
- package/dist/components/EventStreamPanel.js +290 -6
- package/dist/components/EventStreamPanel.js.map +1 -1
- package/dist/components/EventStreamPanel.test.d.ts +2 -0
- package/dist/components/EventStreamPanel.test.d.ts.map +1 -0
- package/dist/components/EventStreamPanel.test.js +200 -0
- package/dist/components/EventStreamPanel.test.js.map +1 -0
- package/dist/components/RecordingCompareBody.d.ts +30 -0
- package/dist/components/RecordingCompareBody.d.ts.map +1 -0
- package/dist/components/RecordingCompareBody.js +243 -0
- package/dist/components/RecordingCompareBody.js.map +1 -0
- package/dist/components/RecordingCompareBody.test.d.ts +2 -0
- package/dist/components/RecordingCompareBody.test.d.ts.map +1 -0
- package/dist/components/RecordingCompareBody.test.js +225 -0
- package/dist/components/RecordingCompareBody.test.js.map +1 -0
- package/dist/components/RecordingDetailBody.d.ts +14 -1
- package/dist/components/RecordingDetailBody.d.ts.map +1 -1
- package/dist/components/RecordingDetailBody.js +7 -3
- package/dist/components/RecordingDetailBody.js.map +1 -1
- package/dist/components/RequestDiffModal.d.ts +11 -0
- package/dist/components/RequestDiffModal.d.ts.map +1 -0
- package/dist/components/RequestDiffModal.js +150 -0
- package/dist/components/RequestDiffModal.js.map +1 -0
- package/dist/components/RequestDiffModal.test.d.ts +2 -0
- package/dist/components/RequestDiffModal.test.d.ts.map +1 -0
- package/dist/components/RequestDiffModal.test.js +115 -0
- package/dist/components/RequestDiffModal.test.js.map +1 -0
- package/dist/diff.d.ts +59 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +137 -0
- package/dist/diff.js.map +1 -0
- package/dist/diff.test.d.ts +2 -0
- package/dist/diff.test.d.ts.map +1 -0
- package/dist/diff.test.js +137 -0
- package/dist/diff.test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/logic.d.ts +1 -0
- package/dist/logic.d.ts.map +1 -1
- package/dist/logic.js +1 -0
- package/dist/logic.js.map +1 -1
- package/dist/player.d.ts +2 -0
- package/dist/player.d.ts.map +1 -1
- package/dist/player.js +2 -0
- package/dist/player.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -11,6 +11,15 @@ export interface EventStreamPanelProps {
|
|
|
11
11
|
/** 点击事件行 → seek 播放器 */
|
|
12
12
|
onSeek: (offsetMs: number) => void;
|
|
13
13
|
height?: number;
|
|
14
|
+
/** 会话标识(折叠状态持久化 key);不传用 baseTimestamp */
|
|
15
|
+
sessionId?: string;
|
|
16
|
+
/**
|
|
17
|
+
* 逃生门:true 时渲染 FID-133 旧三页签实现(chromepilot 对端反馈通道,
|
|
18
|
+
* FID-134 iter2 后视反馈删除)。
|
|
19
|
+
*/
|
|
20
|
+
tabs?: boolean;
|
|
21
|
+
/** 网络分区勾选对比开关;hm/cp 消费方可关,默认开 */
|
|
22
|
+
selectionMode?: boolean;
|
|
14
23
|
}
|
|
15
|
-
export declare function EventStreamPanel(
|
|
24
|
+
export declare function EventStreamPanel(props: EventStreamPanelProps): import("react").JSX.Element;
|
|
16
25
|
//# sourceMappingURL=EventStreamPanel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventStreamPanel.d.ts","sourceRoot":"","sources":["../../src/components/EventStreamPanel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EventStreamPanel.d.ts","sourceRoot":"","sources":["../../src/components/EventStreamPanel.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;AAElE,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,6CAA6C;IAC7C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,0CAA0C;IAC1C,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,uBAAuB;IACvB,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iCAAiC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAqkBD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,+BAI5D"}
|
|
@@ -1,25 +1,47 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
|
-
* FID-
|
|
3
|
+
* FID-134 iter2:事件流面板——三分区(网络请求/控制台/页面异常)同屏平铺可折叠,
|
|
4
4
|
* 与回放播放器时间轴联动:播放进度高亮"当前事件"(最后一个已越过的),
|
|
5
|
-
* 点击事件行 seek
|
|
5
|
+
* 点击事件行 seek 播放器到对应时间点;网络分区支持勾选多条发起请求级对比弹窗。
|
|
6
6
|
*
|
|
7
7
|
* 时间口径:事件 timestamp 是 epoch ms;播放器 getCurrentTime 是回放偏移 ms。
|
|
8
|
-
* 换算基准 = 首个 rrweb 事件 timestamp(调用方传入 baseTimestamp)
|
|
8
|
+
* 换算基准 = 首个 rrweb 事件 timestamp(调用方传入 baseTimestamp);
|
|
9
|
+
* 时间列展示相对偏移 m:ss.mmm。
|
|
10
|
+
*
|
|
11
|
+
* 逃生门:props.tabs=true 渲染 FID-133 旧三页签实现(chromepilot 对端反馈通道,
|
|
12
|
+
* FID-134 iter2 后视反馈删除)。
|
|
9
13
|
*/
|
|
10
14
|
import { useEffect, useMemo, useRef, useState } from "react";
|
|
15
|
+
import { RequestDiffModal } from "./RequestDiffModal.js";
|
|
16
|
+
/** 分区键与展示配置(顺序即高亮优先级顺序) */
|
|
17
|
+
const SECTIONS = [
|
|
18
|
+
{ key: "network", label: "网络请求", color: "#2563eb", empty: "这次录制没有产生网络请求" },
|
|
19
|
+
{ key: "console", label: "控制台", color: "#f59e0b", empty: "这次录制没有产生控制台输出" },
|
|
20
|
+
{ key: "exceptions", label: "页面异常", color: "#ef4444", empty: "这次录制没有产生页面异常" },
|
|
21
|
+
];
|
|
11
22
|
function formatClock(ts) {
|
|
12
23
|
const d = new Date(ts);
|
|
13
24
|
const pad = (n, l = 2) => n.toString().padStart(l, "0");
|
|
14
25
|
return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}.${pad(d.getMilliseconds(), 3)}`;
|
|
15
26
|
}
|
|
27
|
+
/** 相对偏移 m:ss.mmm(分不补零,秒/毫秒补零) */
|
|
28
|
+
function formatOffset(ms) {
|
|
29
|
+
if (!Number.isFinite(ms) || ms < 0)
|
|
30
|
+
return "-";
|
|
31
|
+
const totalSec = Math.floor(ms / 1000);
|
|
32
|
+
const min = Math.floor(totalSec / 60);
|
|
33
|
+
const sec = totalSec % 60;
|
|
34
|
+
const milli = Math.floor(ms % 1000);
|
|
35
|
+
const pad = (n, l = 2) => n.toString().padStart(l, "0");
|
|
36
|
+
return `${min}:${pad(sec)}.${pad(milli, 3)}`;
|
|
37
|
+
}
|
|
16
38
|
function rowText(kind, ev) {
|
|
17
39
|
const p = ev.payload;
|
|
18
40
|
if (kind === "network") {
|
|
19
41
|
const status = p.status;
|
|
20
42
|
return {
|
|
21
43
|
main: `${p.method || "GET"} ${p.url || ""}`,
|
|
22
|
-
sub: p.phase === "request" ? "
|
|
44
|
+
sub: p.phase === "request" ? "已发送" : p.phase === "response" ? "已返回" : undefined,
|
|
23
45
|
badge: status != null ? String(status) : p.phase,
|
|
24
46
|
badgeColor: status != null ? (status >= 400 ? "#ef4444" : status >= 300 ? "#f59e0b" : "#22c55e") : "#9ca3af",
|
|
25
47
|
};
|
|
@@ -40,7 +62,263 @@ function rowText(kind, ev) {
|
|
|
40
62
|
badgeColor: "#ef4444",
|
|
41
63
|
};
|
|
42
64
|
}
|
|
43
|
-
|
|
65
|
+
function storageKey(sessionId, baseTimestamp) {
|
|
66
|
+
return `esp-collapsed:${sessionId ?? String(baseTimestamp)}`;
|
|
67
|
+
}
|
|
68
|
+
function readCollapsed(key) {
|
|
69
|
+
try {
|
|
70
|
+
const raw = sessionStorage.getItem(key);
|
|
71
|
+
if (!raw)
|
|
72
|
+
return null;
|
|
73
|
+
const parsed = JSON.parse(raw);
|
|
74
|
+
return Array.isArray(parsed) ? parsed.filter((x) => typeof x === "string") : null;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function writeCollapsed(key, collapsed) {
|
|
81
|
+
try {
|
|
82
|
+
sessionStorage.setItem(key, JSON.stringify(collapsed));
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// 存储不可用时折叠状态仅内存生效
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/** 勾选持久化(验收检必修#2):存 key 列表(`${timestamp}-${idx}`),刷新后按 network 数组还原 */
|
|
89
|
+
function selectedStorageKey(sessionId, baseTimestamp) {
|
|
90
|
+
return `esp-selected:${sessionId ?? String(baseTimestamp)}`;
|
|
91
|
+
}
|
|
92
|
+
function readSelectedKeys(key) {
|
|
93
|
+
try {
|
|
94
|
+
const raw = sessionStorage.getItem(key);
|
|
95
|
+
if (!raw)
|
|
96
|
+
return null;
|
|
97
|
+
const parsed = JSON.parse(raw);
|
|
98
|
+
return Array.isArray(parsed) ? parsed.filter((x) => typeof x === "string") : null;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function writeSelectedKeys(key, keys) {
|
|
105
|
+
try {
|
|
106
|
+
if (keys.length === 0)
|
|
107
|
+
sessionStorage.removeItem(key);
|
|
108
|
+
else
|
|
109
|
+
sessionStorage.setItem(key, JSON.stringify(keys));
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// 存储不可用时勾选仅内存生效
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// ---------- 平铺视图(FID-134 iter2 默认) ----------
|
|
116
|
+
function FlatView({ network, console: consoleEvents, exceptions, baseTimestamp, currentOffsetMs, onSeek, height = 260, sessionId, selectionMode = true }) {
|
|
117
|
+
const compact = height <= 200;
|
|
118
|
+
const storeKey = storageKey(sessionId, baseTimestamp);
|
|
119
|
+
const sectionRefs = useRef({});
|
|
120
|
+
// 折叠状态:compact 默认只展开控制台+页面异常;持久化 sessionStorage
|
|
121
|
+
const [collapsedKeys, setCollapsedKeys] = useState(() => {
|
|
122
|
+
const stored = readCollapsed(storeKey);
|
|
123
|
+
if (stored)
|
|
124
|
+
return stored;
|
|
125
|
+
return compact ? ["network"] : [];
|
|
126
|
+
});
|
|
127
|
+
useEffect(() => {
|
|
128
|
+
writeCollapsed(storeKey, collapsedKeys);
|
|
129
|
+
}, [storeKey, collapsedKeys]);
|
|
130
|
+
const items = {
|
|
131
|
+
network,
|
|
132
|
+
console: consoleEvents,
|
|
133
|
+
exceptions,
|
|
134
|
+
};
|
|
135
|
+
const totalCount = network.length + consoleEvents.length + exceptions.length;
|
|
136
|
+
// 各分区独立高亮:最后一个 timestamp <= 基准+偏移 的下标
|
|
137
|
+
const linkageOn = baseTimestamp != null && currentOffsetMs != null;
|
|
138
|
+
const highlighted = useMemo(() => {
|
|
139
|
+
const out = { network: -1, console: -1, exceptions: -1 };
|
|
140
|
+
if (!linkageOn)
|
|
141
|
+
return out;
|
|
142
|
+
const nowTs = baseTimestamp + currentOffsetMs;
|
|
143
|
+
for (const s of SECTIONS) {
|
|
144
|
+
const list = items[s.key];
|
|
145
|
+
let best = -1;
|
|
146
|
+
for (let i = 0; i < list.length; i++) {
|
|
147
|
+
if (list[i].timestamp <= nowTs)
|
|
148
|
+
best = i;
|
|
149
|
+
else
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
out[s.key] = best;
|
|
153
|
+
}
|
|
154
|
+
return out;
|
|
155
|
+
}, [network, consoleEvents, exceptions, baseTimestamp, currentOffsetMs, linkageOn]);
|
|
156
|
+
// 播放头所在分区 = 高亮优先级(network<console<exceptions)中最后一个 highlightedIdx>=0
|
|
157
|
+
const activeSection = [...SECTIONS].reverse().find((s) => highlighted[s.key] >= 0)?.key;
|
|
158
|
+
// 自动滚入抑制:用户手动滚动后 3 秒内不强制 scrollIntoView。
|
|
159
|
+
// 程序化滚动计数器:effect 触发的 scrollIntoView 也会冒 scroll 事件,
|
|
160
|
+
// 必须排除,否则自动跟随退化为「每 3 秒一跳」(验收检建议项)。
|
|
161
|
+
const suppressUntilRef = useRef(0);
|
|
162
|
+
const programmaticScrollsRef = useRef(0);
|
|
163
|
+
const handleSectionScroll = () => {
|
|
164
|
+
if (programmaticScrollsRef.current > 0) {
|
|
165
|
+
programmaticScrollsRef.current -= 1;
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
suppressUntilRef.current = Date.now() + 3000;
|
|
169
|
+
};
|
|
170
|
+
useEffect(() => {
|
|
171
|
+
if (!linkageOn)
|
|
172
|
+
return;
|
|
173
|
+
if (Date.now() < suppressUntilRef.current)
|
|
174
|
+
return;
|
|
175
|
+
for (const s of SECTIONS) {
|
|
176
|
+
const idx = highlighted[s.key];
|
|
177
|
+
if (idx < 0)
|
|
178
|
+
continue;
|
|
179
|
+
const listEl = sectionRefs.current[s.key];
|
|
180
|
+
const rowEl = listEl?.children[idx];
|
|
181
|
+
if (!rowEl?.scrollIntoView)
|
|
182
|
+
continue;
|
|
183
|
+
programmaticScrollsRef.current += 1;
|
|
184
|
+
try {
|
|
185
|
+
rowEl.scrollIntoView({ block: "nearest" });
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
programmaticScrollsRef.current -= 1;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}, [highlighted, linkageOn]);
|
|
192
|
+
// 勾选(仅网络分区):key=`${timestamp}-${idx}`,值保留完整事件(勾选序);
|
|
193
|
+
// 勾选集持久化 sessionStorage(验收检必修#2),刷新按 network 数组还原
|
|
194
|
+
const selectedKey = selectedStorageKey(sessionId, baseTimestamp);
|
|
195
|
+
const [selectedMap, setSelectedMap] = useState(() => {
|
|
196
|
+
const m = new Map();
|
|
197
|
+
const stored = readSelectedKeys(selectedKey);
|
|
198
|
+
if (stored && network.length > 0) {
|
|
199
|
+
const byKey = new Map(network.map((ev, idx) => [`${ev.timestamp}-${idx}`, ev]));
|
|
200
|
+
for (const k of stored) {
|
|
201
|
+
const ev = byKey.get(k);
|
|
202
|
+
if (ev)
|
|
203
|
+
m.set(k, ev);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return m;
|
|
207
|
+
});
|
|
208
|
+
const [selectOn, setSelectOn] = useState(false);
|
|
209
|
+
const [guideVisible, setGuideVisible] = useState(false);
|
|
210
|
+
const [modalOpen, setModalOpen] = useState(false);
|
|
211
|
+
useEffect(() => {
|
|
212
|
+
writeSelectedKeys(selectedKey, [...selectedMap.keys()]);
|
|
213
|
+
}, [selectedKey, selectedMap]);
|
|
214
|
+
// 切录制(baseTimestamp 或 network 数组引用变化即新会话)→ 清空勾选。
|
|
215
|
+
// 首挂跳过:勾选可能来自 sessionStorage 持久化还原(验收检必修#2)
|
|
216
|
+
const prevSessionRef = useRef(null);
|
|
217
|
+
useEffect(() => {
|
|
218
|
+
const prev = prevSessionRef.current;
|
|
219
|
+
prevSessionRef.current = { baseTimestamp, network };
|
|
220
|
+
if (prev === null)
|
|
221
|
+
return;
|
|
222
|
+
if (prev.baseTimestamp === baseTimestamp && prev.network === network)
|
|
223
|
+
return;
|
|
224
|
+
setSelectedMap(new Map());
|
|
225
|
+
setGuideVisible(false);
|
|
226
|
+
setModalOpen(false);
|
|
227
|
+
}, [baseTimestamp, network]);
|
|
228
|
+
// 勾选第 1 条 → 灰字引导,选第 2 条或 3 秒后消失
|
|
229
|
+
useEffect(() => {
|
|
230
|
+
if (selectedMap.size === 1) {
|
|
231
|
+
setGuideVisible(true);
|
|
232
|
+
const t = setTimeout(() => setGuideVisible(false), 3000);
|
|
233
|
+
return () => clearTimeout(t);
|
|
234
|
+
}
|
|
235
|
+
setGuideVisible(false);
|
|
236
|
+
return undefined;
|
|
237
|
+
}, [selectedMap.size]);
|
|
238
|
+
const toggleSelect = (key, ev) => {
|
|
239
|
+
setSelectedMap((prev) => {
|
|
240
|
+
const next = new Map(prev);
|
|
241
|
+
if (next.has(key))
|
|
242
|
+
next.delete(key);
|
|
243
|
+
else
|
|
244
|
+
next.set(key, ev);
|
|
245
|
+
return next;
|
|
246
|
+
});
|
|
247
|
+
};
|
|
248
|
+
const selectedItems = [...selectedMap.values()];
|
|
249
|
+
return (_jsxs("div", { style: { border: "1px solid #e5e7eb", borderRadius: 6, background: "#fff" }, children: [_jsx("style", { children: `.esp-row .esp-cb{opacity:0;transition:opacity .12s}.esp-row:hover .esp-cb,.esp-cb[data-on="1"]{opacity:1}` }), _jsxs("div", { style: { display: "flex", alignItems: "center", gap: 4, padding: "6px 8px", borderBottom: "1px solid #f3f4f6", flexWrap: "wrap" }, children: [_jsxs("span", { style: { fontSize: 11, padding: "1px 7px", borderRadius: 8, background: "#f3f4f6", color: "#6b7280", marginRight: 4 }, children: ["\u5168\u90E8 ", totalCount] }), SECTIONS.map((s) => (_jsxs("button", { onClick: () => sectionRefs.current[s.key]?.scrollIntoView?.({ block: "start" }), style: {
|
|
250
|
+
fontSize: 12,
|
|
251
|
+
padding: "3px 8px",
|
|
252
|
+
border: "none",
|
|
253
|
+
borderRadius: 4,
|
|
254
|
+
background: activeSection === s.key ? "#dbeafe" : "transparent",
|
|
255
|
+
color: activeSection === s.key ? "#2563eb" : "#6b7280",
|
|
256
|
+
cursor: "pointer",
|
|
257
|
+
fontWeight: activeSection === s.key ? 600 : 400,
|
|
258
|
+
}, children: [s.label, " (", items[s.key].length, ")"] }, s.key)))] }), selectionMode && (_jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "flex-end", gap: 8, padding: "4px 8px", borderBottom: "1px solid #f3f4f6", minHeight: 28 }, children: [selectedMap.size > 0 && (_jsxs("span", { style: { fontSize: 11, color: "#6b7280" }, children: ["\u5DF2\u9009 ", selectedMap.size, " \u6761", _jsx("button", { "aria-label": "\u6E05\u9664\u9009\u62E9", onClick: () => setSelectedMap(new Map()), style: { marginLeft: 6, border: "none", background: "transparent", cursor: "pointer", color: "#9ca3af", fontSize: 12, lineHeight: 1 }, children: "\u00D7" })] })), guideVisible && _jsx("span", { style: { fontSize: 11, color: "#9ca3af" }, children: "\u518D\u9009\u4E00\u6761\u5373\u53EF\u5BF9\u6BD4" }), _jsx("button", { onClick: () => setSelectOn((v) => !v), style: {
|
|
259
|
+
fontSize: 11,
|
|
260
|
+
padding: "2px 8px",
|
|
261
|
+
borderRadius: 4,
|
|
262
|
+
border: "1px solid #d1d5db",
|
|
263
|
+
background: selectOn ? "#eff6ff" : "#fff",
|
|
264
|
+
color: selectOn ? "#2563eb" : "#6b7280",
|
|
265
|
+
cursor: "pointer",
|
|
266
|
+
}, children: "\u9009\u62E9\u5BF9\u6BD4" })] })), totalCount === 0 ? (_jsx("div", { style: { padding: "20px 0", textAlign: "center", fontSize: 12, color: "#9ca3af" }, children: "\u8FD9\u6B21\u5F55\u5236\u8FD8\u6CA1\u6709\u6355\u6349\u5230\u4EFB\u4F55\u4E8B\u4EF6" })) : (SECTIONS.map((s) => {
|
|
267
|
+
const list = items[s.key];
|
|
268
|
+
const collapsed = collapsedKeys.includes(s.key);
|
|
269
|
+
const hi = highlighted[s.key];
|
|
270
|
+
return (_jsxs("div", { ref: (el) => {
|
|
271
|
+
sectionRefs.current[s.key] = el;
|
|
272
|
+
}, style: { scrollMarginTop: 4 }, children: [_jsxs("div", { style: {
|
|
273
|
+
display: "flex",
|
|
274
|
+
alignItems: "center",
|
|
275
|
+
gap: 6,
|
|
276
|
+
padding: "5px 8px",
|
|
277
|
+
borderBottom: "1px solid #f3f4f6",
|
|
278
|
+
background: "#fafafa",
|
|
279
|
+
}, children: [_jsx("button", { "aria-label": collapsed ? `展开${s.label}` : `折叠${s.label}`, onClick: () => setCollapsedKeys((prev) => collapsed ? prev.filter((k) => k !== s.key) : [...prev, s.key]), style: { border: "none", background: "transparent", cursor: "pointer", fontSize: 11, color: "#6b7280", padding: "0 2px" }, children: collapsed ? "▸" : "▾" }), _jsxs("span", { style: { fontSize: 12, fontWeight: 600, color: "#374151" }, children: [s.label, " (", list.length, ")"] }), _jsx("button", { onClick: () => setCollapsedKeys((prev) => collapsed ? prev.filter((k) => k !== s.key) : [...prev, s.key]), style: { marginLeft: "auto", border: "none", background: "transparent", cursor: "pointer", fontSize: 11, color: "#9ca3af" }, children: "[\u6298\u53E0]" })] }), !collapsed && (_jsx("div", { onScroll: handleSectionScroll, style: { maxHeight: height, overflowY: "auto", padding: "4px 0" }, "data-section": s.key, children: list.length === 0 ? (_jsx("div", { style: { padding: "14px 0", textAlign: "center", fontSize: 12, color: "#9ca3af" }, children: s.empty })) : (list.map((ev, idx) => {
|
|
280
|
+
const { main, sub, badge, badgeColor } = rowText(s.key, ev);
|
|
281
|
+
const highlightedRow = idx === hi;
|
|
282
|
+
const offsetMs = baseTimestamp != null ? ev.timestamp - baseTimestamp : null;
|
|
283
|
+
const seekable = offsetMs != null && offsetMs >= 0;
|
|
284
|
+
const rowKey = `${ev.timestamp}-${idx}`;
|
|
285
|
+
const checked = selectedMap.has(rowKey);
|
|
286
|
+
return (_jsxs("div", { className: "esp-row", "data-row": rowKey, onClick: () => seekable && onSeek(offsetMs), title: offsetMs != null ? `点击跳转到这一刻 · 完整时刻 ${formatClock(ev.timestamp)}` : undefined, style: {
|
|
287
|
+
display: "flex",
|
|
288
|
+
alignItems: "flex-start",
|
|
289
|
+
gap: 8,
|
|
290
|
+
padding: "4px 10px",
|
|
291
|
+
fontSize: 12,
|
|
292
|
+
background: checked ? "#eff6ff" : highlightedRow ? "#dbeafe" : idx % 2 === 0 ? "#fafafa" : "#fff",
|
|
293
|
+
cursor: seekable ? "pointer" : "default",
|
|
294
|
+
borderLeft: `3px solid ${s.color}`,
|
|
295
|
+
}, children: [selectionMode && s.key === "network" && (_jsx("input", { type: "checkbox", className: "esp-cb", "data-on": selectOn || checked ? "1" : "0", "aria-label": `选择第 ${idx + 1} 条请求`, checked: checked, onClick: (e) => e.stopPropagation(), onChange: () => toggleSelect(rowKey, ev), style: { marginTop: 2, flexShrink: 0, cursor: "pointer" } })), _jsx("span", { style: { fontFamily: "monospace", fontSize: 11, color: "#9ca3af", flexShrink: 0, minWidth: 76 }, children: offsetMs != null ? formatOffset(offsetMs) : formatClock(ev.timestamp) }), _jsx("span", { style: {
|
|
296
|
+
fontSize: 10,
|
|
297
|
+
padding: "1px 5px",
|
|
298
|
+
borderRadius: 4,
|
|
299
|
+
color: "#fff",
|
|
300
|
+
background: badgeColor ?? "#9ca3af",
|
|
301
|
+
flexShrink: 0,
|
|
302
|
+
marginTop: 1,
|
|
303
|
+
}, children: badge ?? "-" }), _jsxs("span", { style: { flex: 1, minWidth: 0 }, children: [_jsx("span", { style: { display: "block", color: "#111827", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", fontFamily: s.key === "console" || s.key === "exceptions" ? "monospace" : undefined }, children: main }), sub && (_jsx("span", { style: { display: "block", color: "#9ca3af", fontSize: 10, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", fontFamily: "monospace" }, children: sub }))] })] }, rowKey));
|
|
304
|
+
})) }))] }, s.key));
|
|
305
|
+
})), selectionMode && selectedMap.size >= 2 && (_jsxs("button", { onClick: () => setModalOpen(true), style: {
|
|
306
|
+
position: "fixed",
|
|
307
|
+
bottom: 24,
|
|
308
|
+
right: 24,
|
|
309
|
+
zIndex: 1000,
|
|
310
|
+
padding: "8px 16px",
|
|
311
|
+
borderRadius: 20,
|
|
312
|
+
border: "none",
|
|
313
|
+
background: "#2563eb",
|
|
314
|
+
color: "#fff",
|
|
315
|
+
fontSize: 13,
|
|
316
|
+
cursor: "pointer",
|
|
317
|
+
boxShadow: "0 4px 14px rgba(37,99,235,0.4)",
|
|
318
|
+
}, children: ["\u5BF9\u6BD4\u8FD9 ", selectedMap.size, " \u6761\u8BF7\u6C42"] })), _jsx(RequestDiffModal, { open: modalOpen, onClose: () => setModalOpen(false), selected: selectedItems, initialBaselineIndex: 0 })] }));
|
|
319
|
+
}
|
|
320
|
+
// ---------- 页签视图(FID-133 旧实现,逃生门) ----------
|
|
321
|
+
function TabsView({ network, console: consoleEvents, exceptions, baseTimestamp, currentOffsetMs, onSeek, height = 260 }) {
|
|
44
322
|
const [tab, setTab] = useState("network");
|
|
45
323
|
const listRef = useRef(null);
|
|
46
324
|
const tabs = [
|
|
@@ -103,4 +381,10 @@ export function EventStreamPanel({ network, console: consoleEvents, exceptions,
|
|
|
103
381
|
}, children: badge ?? "-" }), _jsxs("span", { style: { flex: 1, minWidth: 0 }, children: [_jsx("span", { style: { display: "block", color: "#111827", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", fontFamily: tab === "console" || tab === "exceptions" ? "monospace" : undefined }, children: main }), sub && (_jsx("span", { style: { display: "block", color: "#9ca3af", fontSize: 10, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", fontFamily: "monospace" }, children: sub }))] })] }, `${ev.timestamp}-${idx}`));
|
|
104
382
|
})) })] }));
|
|
105
383
|
}
|
|
384
|
+
export function EventStreamPanel(props) {
|
|
385
|
+
// 逃生门:tabs=true → 旧三页签实现(chromepilot 对端反馈通道)
|
|
386
|
+
if (props.tabs)
|
|
387
|
+
return _jsx(TabsView, { ...props });
|
|
388
|
+
return _jsx(FlatView, { ...props });
|
|
389
|
+
}
|
|
106
390
|
//# sourceMappingURL=EventStreamPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventStreamPanel.js","sourceRoot":"","sources":["../../src/components/EventStreamPanel.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EventStreamPanel.js","sourceRoot":"","sources":["../../src/components/EventStreamPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventStreamPanel.test.d.ts","sourceRoot":"","sources":["../../src/components/EventStreamPanel.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// @vitest-environment happy-dom
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
|
+
import { act } from "react";
|
|
5
|
+
import { createRoot } from "react-dom/client";
|
|
6
|
+
import { EventStreamPanel } from "./EventStreamPanel.js";
|
|
7
|
+
globalThis.IS_REACT_ACT_ENVIRONMENT = true;
|
|
8
|
+
const BASE_TS = 1_700_000_000_000;
|
|
9
|
+
function netEv(url, ts, phase = "response", status = 200) {
|
|
10
|
+
return { type: "network", timestamp: ts, sessionId: "s", payload: { method: "GET", url, phase, status } };
|
|
11
|
+
}
|
|
12
|
+
function consoleEv(ts, level = "log") {
|
|
13
|
+
return { type: "console", timestamp: ts, sessionId: "s", payload: { level, message: "hello" } };
|
|
14
|
+
}
|
|
15
|
+
let container;
|
|
16
|
+
let root;
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
sessionStorage.clear();
|
|
19
|
+
container = document.createElement("div");
|
|
20
|
+
document.body.appendChild(container);
|
|
21
|
+
});
|
|
22
|
+
afterEach(() => {
|
|
23
|
+
act(() => root.unmount());
|
|
24
|
+
container.remove();
|
|
25
|
+
});
|
|
26
|
+
function render(ui) {
|
|
27
|
+
root = createRoot(container);
|
|
28
|
+
act(() => root.render(ui));
|
|
29
|
+
return container;
|
|
30
|
+
}
|
|
31
|
+
const PROPS = {
|
|
32
|
+
network: [netEv("https://a.com/1", BASE_TS + 1000), netEv("https://a.com/2", BASE_TS + 2000)],
|
|
33
|
+
console: [consoleEv(BASE_TS + 1500)],
|
|
34
|
+
exceptions: [],
|
|
35
|
+
baseTimestamp: BASE_TS,
|
|
36
|
+
currentOffsetMs: 1600,
|
|
37
|
+
onSeek: (_ms) => { },
|
|
38
|
+
};
|
|
39
|
+
describe("EventStreamPanel 平铺视图", () => {
|
|
40
|
+
it("三分区同屏渲染,分区头带计数与全部徽标", () => {
|
|
41
|
+
const c = render(_jsx(EventStreamPanel, { ...PROPS }));
|
|
42
|
+
const text = c.textContent ?? "";
|
|
43
|
+
expect(text).toContain("全部 3");
|
|
44
|
+
expect(text).toContain("网络请求 (2)");
|
|
45
|
+
expect(text).toContain("控制台 (1)");
|
|
46
|
+
expect(text).toContain("页面异常 (0)");
|
|
47
|
+
});
|
|
48
|
+
it("空分区独立空态文案;三分区全空整板空态", () => {
|
|
49
|
+
const c = render(_jsx(EventStreamPanel, { ...PROPS }));
|
|
50
|
+
expect(c.textContent).toContain("这次录制没有产生页面异常");
|
|
51
|
+
act(() => root.unmount());
|
|
52
|
+
const empty = render(_jsx(EventStreamPanel, { ...PROPS, network: [], console: [], exceptions: [] }));
|
|
53
|
+
expect(empty.textContent).toContain("这次录制还没有捕捉到任何事件");
|
|
54
|
+
});
|
|
55
|
+
it("时间列展示相对偏移 m:ss.mmm,title 带完整时刻", () => {
|
|
56
|
+
const c = render(_jsx(EventStreamPanel, { ...PROPS }));
|
|
57
|
+
const netSection = c.querySelector("[data-section='network']");
|
|
58
|
+
expect(netSection.textContent).toContain("0:01.000");
|
|
59
|
+
expect(netSection.textContent).toContain("0:02.000");
|
|
60
|
+
const row = netSection.querySelector("[data-row]");
|
|
61
|
+
expect(row.title).toContain("点击跳转到这一刻 · 完整时刻");
|
|
62
|
+
});
|
|
63
|
+
it("baseTimestamp=null 时显示原始时钟且禁用联动", () => {
|
|
64
|
+
const c = render(_jsx(EventStreamPanel, { ...PROPS, baseTimestamp: null, currentOffsetMs: null }));
|
|
65
|
+
const netSection = c.querySelector("[data-section='network']");
|
|
66
|
+
// 原始时钟 HH:MM:SS.mmm
|
|
67
|
+
expect(netSection.textContent).toMatch(/\d{2}:\d{2}:\d{2}\.\d{3}/);
|
|
68
|
+
});
|
|
69
|
+
it("播放头所在分区名高亮(最后一个 highlightedIdx>=0)", () => {
|
|
70
|
+
const c = render(_jsx(EventStreamPanel, { ...PROPS }));
|
|
71
|
+
const headerButtons = [...c.querySelectorAll("button")].filter((b) => /网络请求 \(2\)|控制台 \(1\)|页面异常 \(0\)/.test(b.textContent ?? ""));
|
|
72
|
+
const active = headerButtons.filter((b) => b.style.fontWeight === "600");
|
|
73
|
+
expect(active).toHaveLength(1);
|
|
74
|
+
expect(active[0].textContent).toContain("控制台"); // 1500<=1600,网络第 2 条 2000>1600
|
|
75
|
+
});
|
|
76
|
+
it("compact(height<=200)默认折叠网络分区并写入 sessionStorage", () => {
|
|
77
|
+
render(_jsx(EventStreamPanel, { ...PROPS, height: 200, sessionId: "s" }));
|
|
78
|
+
expect(sessionStorage.getItem("esp-collapsed:s")).toBe(JSON.stringify(["network"]));
|
|
79
|
+
});
|
|
80
|
+
it("折叠/展开写入 sessionStorage(无 sessionId 用 baseTimestamp)", () => {
|
|
81
|
+
const c = render(_jsx(EventStreamPanel, { ...PROPS }));
|
|
82
|
+
const collapseBtn = [...c.querySelectorAll("button")].find((b) => b.textContent === "[折叠]");
|
|
83
|
+
act(() => {
|
|
84
|
+
collapseBtn.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
|
85
|
+
});
|
|
86
|
+
expect(sessionStorage.getItem(`esp-collapsed:${BASE_TS}`)).toBe(JSON.stringify(["network"]));
|
|
87
|
+
act(() => root.unmount());
|
|
88
|
+
// 重挂:读回折叠状态 → 网络分区行不可见
|
|
89
|
+
const c2 = render(_jsx(EventStreamPanel, { ...PROPS }));
|
|
90
|
+
expect(c2.querySelector("[data-section='network']")).toBeNull();
|
|
91
|
+
expect(c2.querySelector("[data-section='console']")).toBeTruthy();
|
|
92
|
+
});
|
|
93
|
+
it("网络行 phase 文案:已发送/已返回", () => {
|
|
94
|
+
const c = render(_jsx(EventStreamPanel, { ...PROPS, network: [netEv("https://a.com/1", BASE_TS + 1000, "request"), netEv("https://a.com/2", BASE_TS + 2000, "response")] }));
|
|
95
|
+
const text = c.textContent ?? "";
|
|
96
|
+
expect(text).toContain("已发送");
|
|
97
|
+
expect(text).toContain("已返回");
|
|
98
|
+
});
|
|
99
|
+
it("勾选两条 → 已选计数/引导/对比按钮/弹窗打开,关闭弹窗不丢勾选", () => {
|
|
100
|
+
const c = render(_jsx(EventStreamPanel, { ...PROPS, sessionId: "sel1" }));
|
|
101
|
+
const boxes = c.querySelectorAll("[data-section='network'] input[type='checkbox']");
|
|
102
|
+
expect(boxes).toHaveLength(2);
|
|
103
|
+
act(() => {
|
|
104
|
+
boxes[0].dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
|
105
|
+
});
|
|
106
|
+
expect(c.textContent).toContain("已选 1 条");
|
|
107
|
+
expect(c.textContent).toContain("再选一条即可对比");
|
|
108
|
+
act(() => {
|
|
109
|
+
boxes[1].dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
|
110
|
+
});
|
|
111
|
+
expect(c.textContent).toContain("已选 2 条");
|
|
112
|
+
expect(c.textContent).toContain("对比这 2 条请求");
|
|
113
|
+
const cmpBtn = [...c.querySelectorAll("button")].find((b) => b.textContent?.includes("对比这 2 条"));
|
|
114
|
+
act(() => {
|
|
115
|
+
cmpBtn.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
|
116
|
+
});
|
|
117
|
+
expect(c.querySelector('[role="dialog"]')).toBeTruthy();
|
|
118
|
+
// 关闭弹窗不丢勾选
|
|
119
|
+
act(() => {
|
|
120
|
+
c.querySelector("button[aria-label='关闭']").dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
|
121
|
+
});
|
|
122
|
+
expect(c.querySelector('[role="dialog"]')).toBeNull();
|
|
123
|
+
expect(c.textContent).toContain("已选 2 条");
|
|
124
|
+
});
|
|
125
|
+
it("× 清除勾选", () => {
|
|
126
|
+
const c = render(_jsx(EventStreamPanel, { ...PROPS, sessionId: "sel2" }));
|
|
127
|
+
const box = c.querySelector("[data-section='network'] input[type='checkbox']");
|
|
128
|
+
act(() => {
|
|
129
|
+
box.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
|
130
|
+
});
|
|
131
|
+
expect(c.textContent).toContain("已选 1 条");
|
|
132
|
+
act(() => {
|
|
133
|
+
c.querySelector("button[aria-label='清除选择']").dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
|
134
|
+
});
|
|
135
|
+
expect(c.textContent).not.toContain("已选 1 条");
|
|
136
|
+
});
|
|
137
|
+
it("勾选变化写入 sessionStorage(key 含会话标识;验收检必修#2)", () => {
|
|
138
|
+
const c = render(_jsx(EventStreamPanel, { ...PROPS, sessionId: "sel5" }));
|
|
139
|
+
const box = c.querySelector("[data-section='network'] input[type='checkbox']");
|
|
140
|
+
act(() => {
|
|
141
|
+
box.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
|
142
|
+
});
|
|
143
|
+
expect(sessionStorage.getItem("esp-selected:sel5")).toBe(JSON.stringify([`${BASE_TS + 1000}-0`]));
|
|
144
|
+
expect(c.textContent).toContain("已选 1 条");
|
|
145
|
+
});
|
|
146
|
+
it("勾选持久化:重挂载(模拟刷新)后勾选还原,取消后存储清空(验收检必修#2)", () => {
|
|
147
|
+
// 预置上次会话勾了第 2 条(`${BASE_TS + 2000}-1`)
|
|
148
|
+
sessionStorage.setItem("esp-selected:sel4", JSON.stringify([`${BASE_TS + 2000}-1`]));
|
|
149
|
+
const c = render(_jsx(EventStreamPanel, { ...PROPS, sessionId: "sel4" }));
|
|
150
|
+
expect(c.textContent).toContain("已选 1 条");
|
|
151
|
+
const boxes = c.querySelectorAll("[data-section='network'] input[type='checkbox']");
|
|
152
|
+
expect(boxes[1].checked).toBe(true);
|
|
153
|
+
act(() => {
|
|
154
|
+
boxes[1].dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
|
155
|
+
});
|
|
156
|
+
expect(c.textContent).not.toContain("已选 1 条");
|
|
157
|
+
expect(sessionStorage.getItem("esp-selected:sel4")).toBeNull();
|
|
158
|
+
});
|
|
159
|
+
it("切换录制(network 引用变化)清空勾选", () => {
|
|
160
|
+
const c = render(_jsx(EventStreamPanel, { ...PROPS, sessionId: "sel3" }));
|
|
161
|
+
const box = c.querySelector("[data-section='network'] input[type='checkbox']");
|
|
162
|
+
act(() => {
|
|
163
|
+
box.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
|
164
|
+
});
|
|
165
|
+
expect(c.textContent).toContain("已选 1 条");
|
|
166
|
+
act(() => {
|
|
167
|
+
root.render(_jsx(EventStreamPanel, { ...PROPS, network: [netEv("https://a.com/9", BASE_TS + 500)], sessionId: "sel3" }));
|
|
168
|
+
});
|
|
169
|
+
expect(c.textContent).not.toContain("已选 1 条");
|
|
170
|
+
});
|
|
171
|
+
it("selectionMode=false 不渲染勾选工具行", () => {
|
|
172
|
+
const c = render(_jsx(EventStreamPanel, { ...PROPS, selectionMode: false }));
|
|
173
|
+
expect(c.textContent).not.toContain("选择对比");
|
|
174
|
+
expect(c.querySelector("[data-section='network'] input[type='checkbox']")).toBeNull();
|
|
175
|
+
});
|
|
176
|
+
it("点击行触发 onSeek(相对偏移)", () => {
|
|
177
|
+
const onSeek = vi.fn();
|
|
178
|
+
const c = render(_jsx(EventStreamPanel, { ...PROPS, onSeek: onSeek }));
|
|
179
|
+
const row = c.querySelector("[data-section='network'] [data-row]");
|
|
180
|
+
act(() => {
|
|
181
|
+
row.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
|
182
|
+
});
|
|
183
|
+
expect(onSeek).toHaveBeenCalledWith(1000);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
describe("EventStreamPanel tabs 逃生门", () => {
|
|
187
|
+
it("tabs=true 渲染旧三页签实现", () => {
|
|
188
|
+
const c = render(_jsx(EventStreamPanel, { ...PROPS, tabs: true }));
|
|
189
|
+
// 页签实现:无平铺分区容器
|
|
190
|
+
expect(c.textContent).toContain("网络请求 (2)");
|
|
191
|
+
expect(c.querySelector("[data-section='network']")).toBeNull();
|
|
192
|
+
// 切到控制台页签
|
|
193
|
+
const consoleTab = [...c.querySelectorAll("button")].find((b) => b.textContent === "控制台 (1)");
|
|
194
|
+
act(() => {
|
|
195
|
+
consoleTab.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
|
196
|
+
});
|
|
197
|
+
expect(c.textContent).toContain("hello");
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
//# sourceMappingURL=EventStreamPanel.test.js.map
|