@@ -183,53 +183,122 @@ const DatasetFileTransfer: React.FC<DatasetFileTransferProps> = ({
183183 options ?: Partial < { page : number ; pageSize : number ; keyword : string } >
184184 ) => {
185185 if ( ! selectedDataset ) return ;
186- const page = options ?. page ?? filesPagination . current ;
187- const pageSize = options ?. pageSize ?? filesPagination . pageSize ;
186+ const page = options ?. page ?? 1 ;
187+ const pageSize = 10 ;
188188 const keyword = options ?. keyword ?? filesSearch ;
189+ const hasExtensionFilter = allowedFileExtensions && allowedFileExtensions . length > 0 ;
189190
190- const { data } = await queryDatasetFilesUsingGet ( selectedDataset . id , {
191- page,
192- size : pageSize ,
193- keyword,
194- } ) ;
195- const mapped = ( data . content || [ ] ) . map ( ( item : DatasetFile ) => ( {
196- ...item ,
197- id : item . id ,
198- key : String ( item . id ) , // rowKey 使用字符串,确保与 selectedRowKeys 类型一致
199- // 记录所属数据集,方便后续在“全不选”时只清空当前数据集的选择
200- // DatasetFile 接口是后端模型,这里在前端扩展 datasetId 字段
201- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
202- // @ts -ignore
203- datasetId : selectedDataset . id ,
204- datasetName : selectedDataset . name ,
205- } ) ) ;
206-
207- const filtered =
208- allowedFileExtensions && allowedFileExtensions . length > 0
209- ? mapped . filter ( ( file ) => {
210- const ext =
211- file . fileName ?. toLowerCase ( ) . match ( / \. [ ^ . ] + $ / ) ?. [ 0 ] || "" ;
212- return allowedFileExtensions . includes ( ext ) ;
213- } )
214- : mapped ;
215-
216- setFiles ( filtered ) ;
217- setFilesPagination ( ( prev ) => ( {
218- ...prev ,
219- current : page ,
220- pageSize,
221- total : data . totalElements ,
222- } ) ) ;
191+ console . log ( '[fetchFiles] 调用:' , { datasetId : selectedDataset . id , page, pageSize, keyword, hasExtensionFilter } ) ;
192+
193+ if ( hasExtensionFilter ) {
194+ // 有扩展名过滤:获取所有文件并在前端分页
195+ const fetchPageSize = 100 ;
196+ let allFiles : DatasetFile [ ] = [ ] ;
197+ let currentPage = 1 ;
198+ let hasMore = true ;
199+
200+ console . log ( '[fetchFiles] 开始获取所有文件...' ) ;
201+
202+ while ( hasMore ) {
203+ const { data } = await queryDatasetFilesUsingGet ( selectedDataset . id , {
204+ page : currentPage ,
205+ size : fetchPageSize ,
206+ keyword,
207+ } ) ;
208+
209+ const mapped = ( data . content || [ ] ) . map ( ( item : DatasetFile ) => ( {
210+ ...item ,
211+ id : item . id ,
212+ key : String ( item . id ) ,
213+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
214+ // @ts -ignore
215+ datasetId : selectedDataset . id ,
216+ datasetName : selectedDataset . name ,
217+ } ) ) ;
218+
219+ allFiles = [ ...allFiles , ...mapped ] ;
220+ console . log ( `[fetchFiles] 第 ${ currentPage } 页: 获取 ${ mapped . length } 个,累计 ${ allFiles . length } 个` ) ;
221+
222+ // 如果返回的数据少于 pageSize,说明最后一页
223+ if ( mapped . length < fetchPageSize ) {
224+ hasMore = false ;
225+ } else {
226+ currentPage ++ ;
227+ }
228+ }
229+
230+ console . log ( '[fetchFiles] 共获取:' , allFiles . length , '个文件' ) ;
231+
232+ // 在前端过滤
233+ const filtered = allFiles . filter ( ( file ) => {
234+ const ext = file . fileName ?. toLowerCase ( ) . match ( / \. [ ^ . ] + $ / ) ?. [ 0 ] || "" ;
235+ return allowedFileExtensions . includes ( ext ) ;
236+ } ) ;
237+
238+ console . log ( '[fetchFiles] 前端过滤:' , {
239+ totalFiles : allFiles . length ,
240+ filtered : filtered . length ,
241+ extensions : allowedFileExtensions
242+ } ) ;
243+
244+ // 前端分页
245+ const startIndex = ( page - 1 ) * pageSize ;
246+ const endIndex = startIndex + pageSize ;
247+ const paginatedFiles = filtered . slice ( startIndex , endIndex ) ;
248+
249+ console . log ( '[fetchFiles] 前端分页:' , {
250+ page,
251+ startIndex,
252+ endIndex,
253+ display : paginatedFiles . length ,
254+ total : filtered . length
255+ } ) ;
256+
257+ setFiles ( paginatedFiles ) ;
258+ setFilesPagination ( {
259+ current : page ,
260+ pageSize : pageSize ,
261+ total : filtered . length ,
262+ } ) ;
263+ } else {
264+ // 无扩展名过滤:使用后端分页
265+ const { data } = await queryDatasetFilesUsingGet ( selectedDataset . id , {
266+ page,
267+ size : pageSize ,
268+ keyword,
269+ } ) ;
270+
271+ const mapped = ( data . content || [ ] ) . map ( ( item : DatasetFile ) => ( {
272+ ...item ,
273+ id : item . id ,
274+ key : String ( item . id ) ,
275+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
276+ // @ts -ignore
277+ datasetId : selectedDataset . id ,
278+ datasetName : selectedDataset . name ,
279+ } ) ) ;
280+
281+ console . log ( '[fetchFiles] 后端分页:' , {
282+ totalElements : data . totalElements ,
283+ contentLength : mapped . length
284+ } ) ;
285+
286+ setFiles ( mapped ) ;
287+ setFilesPagination ( {
288+ current : page ,
289+ pageSize : pageSize ,
290+ total : data . totalElements ,
291+ } ) ;
292+ }
223293 } ,
224- [ selectedDataset , filesPagination . current , filesPagination . pageSize , filesSearch , allowedFileExtensions ]
294+ [ selectedDataset , filesSearch , allowedFileExtensions ]
225295 ) ;
226296
227297 useEffect ( ( ) => {
228- // 当数据集变化时,重置文件分页并拉取第一页文件,避免额外的循环请求
298+ // 当数据集变化时,重置文件分页并拉取第一页文件
229299 if ( selectedDataset ) {
230300 setFilesPagination ( { current : 1 , pageSize : 10 , total : 0 } ) ;
231- // 与其它页面保持一致,后端使用 1-based page 参数,这里传 1 获取第一页
232- fetchFiles ( { page : 1 , pageSize : 10 } ) . catch ( ( ) => { } ) ;
301+ fetchFiles ( { page : 1 } ) . catch ( ( ) => { } ) ;
233302 } else {
234303 setFiles ( [ ] ) ;
235304 setFilesPagination ( { current : 1 , pageSize : 10 , total : 0 } ) ;
@@ -242,6 +311,24 @@ const DatasetFileTransfer: React.FC<DatasetFileTransferProps> = ({
242311 onDatasetSelect ?.( selectedDataset ) ;
243312 } , [ selectedDataset , onDatasetSelect ] ) ;
244313
314+ // 当搜索关键词变化时,重新拉取
315+ useEffect ( ( ) => {
316+ if ( selectedDataset ) {
317+ setFilesPagination ( { current : 1 , pageSize : 10 , total : 0 } ) ;
318+ fetchFiles ( { page : 1 } ) . catch ( ( ) => { } ) ;
319+ }
320+ // eslint-disable-next-line react-hooks/exhaustive-deps
321+ } , [ filesSearch ] ) ;
322+
323+ // 当扩展名过滤变化时,重新拉取
324+ useEffect ( ( ) => {
325+ if ( selectedDataset ) {
326+ setFilesPagination ( { current : 1 , pageSize : 10 , total : 0 } ) ;
327+ fetchFiles ( { page : 1 } ) . catch ( ( ) => { } ) ;
328+ }
329+ // eslint-disable-next-line react-hooks/exhaustive-deps
330+ } , [ allowedFileExtensions ] ) ;
331+
245332 // 在 fixedDatasetId 场景下,数据集列表加载完成后自动选中该数据集
246333 useEffect ( ( ) => {
247334 if ( ! open ) return ;
@@ -537,17 +624,17 @@ const DatasetFileTransfer: React.FC<DatasetFileTransferProps> = ({
537624 dataSource = { files }
538625 columns = { fileCols . slice ( 1 , fileCols . length ) }
539626 pagination = { {
540- ...filesPagination ,
541- onChange : ( page , pageSize ) => {
542- if ( disabled ) return ;
543- const nextPageSize = pageSize || filesPagination . pageSize ;
627+ current : filesPagination . current ,
628+ pageSize : 10 ,
629+ total : filesPagination . total ,
630+ showSizeChanger : false ,
631+ onChange : ( page ) => {
632+ if ( disabled ) return ;
544633 setFilesPagination ( ( prev ) => ( {
545634 ...prev ,
546635 current : page ,
547- pageSize : nextPageSize ,
548636 } ) ) ;
549- // 前端分页与后端统一使用 1-based page 参数
550- fetchFiles ( { page, pageSize : nextPageSize } ) . catch ( ( ) => { } ) ;
637+ fetchFiles ( { page } ) . catch ( ( ) => { } ) ;
551638 } ,
552639 } }
553640 onRow = { ( record : DatasetFile ) => ( {
0 commit comments