fix(grid): 保留 JSON 详情双击选词不进编辑

Co-authored-by: zipg <4047349+zipg@users.noreply.github.com>
This commit is contained in:
zipg 2026-08-10 10:28:33 +08:00 committed by GitHub
parent 4311ace960
commit a8495b2454
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 35 additions and 2 deletions

View File

@ -55,6 +55,18 @@ void geometryCanvas;
void detailsEditorContainer;
void sideJsonPreviewContainer;
function startJsonEditFromBlankArea(event: MouseEvent) {
const target = event.target as { closest?: (selector: string) => Element | null } | null;
const line = target?.closest?.(".cm-line");
if (line) {
const range = line.ownerDocument.createRange();
range.selectNodeContents(line);
const textHit = Array.from(range.getClientRects()).some((rect) => event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom);
if (textHit) return;
}
emit("startEdit");
}
defineExpose({ openSearch });
</script>
@ -159,9 +171,10 @@ defineExpose({ openSearch });
v-else-if="detail.formattedJson"
ref="sideJsonPreviewContainer"
data-cell-detail-editor-root
data-cell-detail-json-preview
class="overflow-hidden rounded border bg-muted/20 p-2"
:class="[{ 'cursor-text': detail.isEditable }, valueFillsHeight ? 'min-h-0 flex-1' : 'h-72 max-h-[42vh]']"
@dblclick.capture="emit('startEdit')"
@dblclick.capture="startJsonEditFromBlankArea"
/>
<pre
v-else

View File

@ -916,7 +916,7 @@ describe("cell detail surfaces", () => {
expect(updateOpen).toHaveBeenCalledWith(false);
});
it("forwards panel edit/copy/cancel actions and exposes search", () => {
it("forwards panel actions and only starts JSON editing from preview whitespace", async () => {
const startEdit = vi.fn();
const copyValue = vi.fn();
const cancel = vi.fn();
@ -959,6 +959,26 @@ describe("cell detail surfaces", () => {
expect(cancel).toHaveBeenCalledOnce();
mounted.exposed.value.openSearch();
expect(mocks.panelOpenSearch).toHaveBeenCalledOnce();
await mounted.setProps({ detail: detail() });
const jsonPreview = findOne(mounted.root, (node) => node.props["data-cell-detail-json-preview"] === "");
const doubleClickCapture = jsonPreview.props.onDblclickCapture;
const textLine = {
ownerDocument: {
createRange: () => ({
selectNodeContents: vi.fn(),
getClientRects: () => [{ left: 10, right: 110, top: 20, bottom: 40 }],
}),
},
};
const lineTarget = { closest: (selector: string) => (selector === ".cm-line" ? textLine : null) };
doubleClickCapture({ target: lineTarget, clientX: 60, clientY: 30 });
expect(startEdit).toHaveBeenCalledTimes(2);
doubleClickCapture({ target: lineTarget, clientX: 160, clientY: 30 });
doubleClickCapture({ target: { closest: () => null }, clientX: 60, clientY: 80 });
expect(startEdit).toHaveBeenCalledTimes(4);
});
});