diff --git a/frontend/src/components/DataGrid.tsx b/frontend/src/components/DataGrid.tsx index 2fc595d..2da39c1 100644 --- a/frontend/src/components/DataGrid.tsx +++ b/frontend/src/components/DataGrid.tsx @@ -91,6 +91,7 @@ import { findDataGridTextRanges, hasDataGridFindRenderVersionChanged, normalizeDataGridFindQuery, + resolveDataGridColumnQuickFindTarget, resolveDataGridFindNavigationIndex, summarizeDataGridFindMatches, type DataGridFindMatch, @@ -6284,13 +6285,9 @@ const DataGrid: React.FC = ({ [visibleColumnQuickFindMatches], ); - const resolveColumnQuickFindTarget = useCallback((): string => { - const exactMatch = displayColumnNames.find((columnName) => ( - normalizeDataGridFindQuery(columnName) === normalizedColumnQuickFindText - )); - if (exactMatch) return exactMatch; - return visibleColumnQuickFindMatches[0] || ''; - }, [displayColumnNames, normalizedColumnQuickFindText, visibleColumnQuickFindMatches]); + const resolveColumnQuickFindTarget = useCallback((query: string): string => ( + resolveDataGridColumnQuickFindTarget(displayColumnNames, query) + ), [displayColumnNames]); const highlightColumnQuickFindTarget = useCallback((columnName: string) => { setHighlightedColumnName(columnName); @@ -6530,8 +6527,9 @@ const DataGrid: React.FC = ({ syncExternalScrollFromTargets, ]); - const handleSubmitColumnQuickFind = useCallback(() => { - const targetColumnName = resolveColumnQuickFindTarget(); + const handleSubmitColumnQuickFind = useCallback((submittedValue?: string) => { + const effectiveQuery = String(submittedValue ?? columnQuickFindText); + const targetColumnName = resolveColumnQuickFindTarget(effectiveQuery); if (!targetColumnName) { if (columnQuickFindText.trim()) { void message.warning(`未找到字段列:${columnQuickFindText.trim()}`); @@ -7037,7 +7035,7 @@ const DataGrid: React.FC = ({ inputProps={noAutoCapInputProps as Record} value={columnQuickFindText} options={columnQuickFindOptions} - hasTarget={!!resolveColumnQuickFindTarget()} + hasTarget={!!resolveColumnQuickFindTarget(columnQuickFindText)} onChange={setColumnQuickFindText} onSubmit={handleSubmitColumnQuickFind} /> diff --git a/frontend/src/components/DataGridColumnQuickFind.tsx b/frontend/src/components/DataGridColumnQuickFind.tsx index d6509e3..1b8b586 100644 --- a/frontend/src/components/DataGridColumnQuickFind.tsx +++ b/frontend/src/components/DataGridColumnQuickFind.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { AutoComplete, Button, Input, Tooltip } from 'antd'; -import { AimOutlined, SearchOutlined } from '@ant-design/icons'; +import { AutoComplete, Input, Tooltip } from 'antd'; +import { SearchOutlined } from '@ant-design/icons'; export interface DataGridColumnQuickFindProps { isV2Ui: boolean; @@ -10,68 +10,62 @@ export interface DataGridColumnQuickFindProps { options: Array<{ value: string; label?: React.ReactNode }>; hasTarget: boolean; onChange: (value: string) => void; - onSubmit: () => void; + onSubmit: (value?: string) => void; } const DataGridColumnQuickFind: React.FC = ({ isV2Ui, - darkMode, inputProps, value, options, - hasTarget, onChange, onSubmit, -}) => ( - -
-
-
- - } - placeholder="跳到字段列..." - value={value} - onChange={(event) => onChange(event.target.value)} - onPressEnter={onSubmit} - style={isV2Ui ? undefined : { width: 220 }} - /> - -
- +
+ { + onChange(nextValue); + onSubmit(nextValue); + }} + filterOption={false} + popupMatchSelectWidth={280} + > + } + placeholder="跳到字段列..." + value={value} + onChange={(event) => onChange(event.target.value)} + onPressEnter={() => onSubmit(value)} + style={isV2Ui ? undefined : { width: 168, height: 32 }} + /> + +
+
- {!isV2Ui && ( - - 定位字段列 - - )} - -
-); + + ); +}; export default DataGridColumnQuickFind; diff --git a/frontend/src/utils/dataGridFind.test.ts b/frontend/src/utils/dataGridFind.test.ts index a2bf351..e7ecfa5 100644 --- a/frontend/src/utils/dataGridFind.test.ts +++ b/frontend/src/utils/dataGridFind.test.ts @@ -6,6 +6,7 @@ import { findDataGridTextRanges, hasDataGridFindRenderVersionChanged, normalizeDataGridFindQuery, + resolveDataGridColumnQuickFindTarget, resolveDataGridFindNavigationIndex, summarizeDataGridFindMatches, } from './dataGridFind'; @@ -89,6 +90,15 @@ describe('dataGridFind', () => { expect(resolveDataGridFindNavigationIndex(0, 0, 'next')).toBe(-1); }); + it('prefers an exact quick-find column match over earlier fuzzy matches', () => { + const columnNames = ['user_id', 'username', 'created_at']; + + expect(resolveDataGridColumnQuickFindTarget(columnNames, 'username')).toBe('username'); + expect(resolveDataGridColumnQuickFindTarget(columnNames, 'user')).toBe('user_id'); + expect(resolveDataGridColumnQuickFindTarget(columnNames, ' ')).toBe(''); + expect(resolveDataGridColumnQuickFindTarget(columnNames, 'missing')).toBe(''); + }); + it('tracks render version changes without exposing metadata as row data', () => { const rows = [{ id: 1, name: 'Alpha' }]; diff --git a/frontend/src/utils/dataGridFind.ts b/frontend/src/utils/dataGridFind.ts index 56b1f45..3d53a2f 100644 --- a/frontend/src/utils/dataGridFind.ts +++ b/frontend/src/utils/dataGridFind.ts @@ -143,3 +143,20 @@ export const resolveDataGridFindNavigationIndex = ( } return currentIndex < 0 || currentIndex >= matchCount - 1 ? 0 : currentIndex + 1; }; + +export const resolveDataGridColumnQuickFindTarget = ( + columnNames: string[], + query: string, +): string => { + const normalizedQuery = normalizeDataGridFindQuery(query); + if (!normalizedQuery) return ''; + + const exactMatch = columnNames.find((columnName) => ( + normalizeDataGridFindQuery(columnName) === normalizedQuery + )); + if (exactMatch) return exactMatch; + + return columnNames.find((columnName) => ( + normalizeDataGridFindQuery(columnName).includes(normalizedQuery) + )) || ''; +};