From bf51003c6632a90b6c5b3de4e1e2ca7608e5d885 Mon Sep 17 00:00:00 2001 From: Syngnat Date: Sat, 27 Jun 2026 10:21:39 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(query-results):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=89=A7=E8=A1=8C=E6=B6=88=E6=81=AF=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=E5=B8=83=E5=B1=80=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QueryEditor.results-and-drop.test.tsx | 30 +++++++++++++++++-- .../components/QueryEditorResultsPanel.tsx | 10 +++++-- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/QueryEditor.results-and-drop.test.tsx b/frontend/src/components/QueryEditor.results-and-drop.test.tsx index 5bc6438..1b25d90 100644 --- a/frontend/src/components/QueryEditor.results-and-drop.test.tsx +++ b/frontend/src/components/QueryEditor.results-and-drop.test.tsx @@ -495,6 +495,11 @@ const findResultMessageTextarea = (renderer: ReactTestRenderer, mode: 'compact' node.type === 'textarea' && node.props['data-query-result-message-textarea'] === mode, ); +const findByClassName = (renderer: ReactTestRenderer, className: string) => + renderer.root.find((node) => + typeof node.props?.className === 'string' && node.props.className.includes(className), + ); + const findEditorAction = (id: string) => editorState.editor.addAction.mock.calls .map((call: any[]) => call[0]) @@ -1162,6 +1167,8 @@ describe('QueryEditor external SQL save', () => { const rendered = textContent(renderer!.toJSON()); const messageTextarea = findResultMessageTextarea(renderer!); + const messageBlock = findByClassName(renderer!, 'query-result-message-block'); + const messageScrollBody = findByClassName(renderer!, 'query-result-message-scroll-body'); expect(rendered).toContain('消息 1'); expect(messageTextarea.props.value).toBe([ " select c.queryno,'' ,left(dbo.f_vendor_class(''' + b.groupid + ''',' + colname + '),", @@ -1174,6 +1181,20 @@ describe('QueryEditor external SQL save', () => { display: 'block', whiteSpace: 'pre', overflow: 'auto', + width: '100%', + minWidth: 0, + }); + expect(messageTextarea.props.style.minWidth).not.toBe('max-content'); + expect(messageBlock.props.style).toMatchObject({ + alignItems: 'stretch', + width: '100%', + }); + expect(messageScrollBody.props.style).toMatchObject({ + display: 'flex', + alignItems: 'stretch', + width: '100%', + overflow: 'hidden', + minWidth: 0, }); expect(messageTextarea.props.value).not.toContain('mssql:'); }); @@ -2645,6 +2666,9 @@ describe('QueryEditor external SQL save', () => { expect(source).toContain("flex: fillHeight ? 1 : '0 1 auto'"); expect(source).toContain('wrap="off"'); expect(source).toContain("whiteSpace: 'pre'"); + expect(source).toContain("alignItems: 'stretch'"); + expect(source).toContain("minWidth: 0"); + expect(source).not.toContain("minWidth: 'max-content'"); expect(source).toContain("data-query-result-message-textarea"); expect(source).toContain("query_editor.results_panel.message.action.copy"); expect(source).toContain("typeof navigator?.clipboard?.writeText !== 'function'"); @@ -2988,7 +3012,7 @@ describe('QueryEditor external SQL save', () => { }); }); - expect(storeState.setActiveContext).toHaveBeenCalledWith({ connectionId: 'conn-1', dbName: 'front_end_sys' }); + expect(storeState.setActiveContext).not.toHaveBeenCalled(); expect(storeState.addTab).toHaveBeenCalledWith(expect.objectContaining({ type: 'table', connectionId: 'conn-1', @@ -2998,7 +3022,7 @@ describe('QueryEditor external SQL save', () => { })); }); - it('keeps sidebar object navigation tied to the dragged database after drop', async () => { + it('keeps object hyperlink tab opening tied to the dragged database after drop', async () => { const domListeners: Record void)[]> = {}; editorState.domNode = { style: { cursor: '' }, @@ -3070,7 +3094,7 @@ describe('QueryEditor external SQL save', () => { }); }); - expect(storeState.setActiveContext).toHaveBeenCalledWith({ connectionId: 'conn-1', dbName: 'front_end_sys' }); + expect(storeState.setActiveContext).not.toHaveBeenCalled(); expect(storeState.addTab).toHaveBeenCalledWith(expect.objectContaining({ type: 'table', connectionId: 'conn-1', diff --git a/frontend/src/components/QueryEditorResultsPanel.tsx b/frontend/src/components/QueryEditorResultsPanel.tsx index a317bcf..9cfdf3a 100644 --- a/frontend/src/components/QueryEditorResultsPanel.tsx +++ b/frontend/src/components/QueryEditorResultsPanel.tsx @@ -143,6 +143,7 @@ const QueryEditorResultsPanel: React.FC = ({ border: darkMode ? '1px solid rgba(255,255,255,0.12)' : '1px solid rgba(0,0,0,0.08)', background: darkMode ? 'rgba(255,255,255,0.03)' : '#fff', textAlign: 'left', + alignItems: 'stretch', marginTop, width: maxWidth ? `min(100%, ${maxWidth}px)` : '100%', flex: fillHeight ? 1 : undefined, @@ -171,9 +172,12 @@ const QueryEditorResultsPanel: React.FC = ({ className="query-result-message-scroll-body" style={{ flex: fillHeight ? 1 : '0 1 auto', + display: 'flex', + alignItems: 'stretch', + width: '100%', minHeight: compact ? 72 : 0, maxHeight: compact ? 160 : undefined, - overflow: 'auto', + overflow: 'hidden', minWidth: 0, borderRadius: 6, }} @@ -188,8 +192,9 @@ const QueryEditorResultsPanel: React.FC = ({ onKeyDown={handleMessageTextareaKeyDown} style={{ display: 'block', + flex: '1 1 auto', width: '100%', - minWidth: 'max-content', + minWidth: 0, height: '100%', minHeight: compact ? 72 : 0, padding: 0, @@ -310,6 +315,7 @@ const QueryEditorResultsPanel: React.FC = ({
{renderMessageBlock({