@@ -14,7 +14,15 @@ import {
14
14
} from '@ant-design/pro-form' ;
15
15
import type { ProDescriptionsItemProps } from '@ant-design/pro-descriptions' ;
16
16
import ProDescriptions from '@ant-design/pro-descriptions' ;
17
- import { list , addList , updateList , removeList , importList , getTemplate } from './service' ;
17
+ import {
18
+ requestList ,
19
+ addList ,
20
+ updateList ,
21
+ removeList ,
22
+ importList ,
23
+ getTemplate ,
24
+ exportList ,
25
+ } from './service' ;
18
26
import type { TableListItem , TableListPagination } from './data' ;
19
27
import { useParams } from 'react-router' ;
20
28
import { history } from 'umi' ;
@@ -130,6 +138,7 @@ const TableList: React.FC = () => {
130
138
const [ selectedRowsState , setSelectedRows ] = useState < TableListItem [ ] > ( [ ] ) ;
131
139
const params : any = useParams ( ) ;
132
140
const [ templateData , setTemplateData ] = useState < any > ( [ ] ) ;
141
+ const [ options , setOptions ] = useState < any [ ] > ( [ ] ) ;
133
142
const getTemplateData = async ( key : string ) => {
134
143
let template : any = [ ] ;
135
144
if ( path . includes ( 'template' ) ) {
@@ -154,13 +163,26 @@ const TableList: React.FC = () => {
154
163
if ( location . href . includes ( 'id' ) ) {
155
164
const arr = location . href . split ( '?id=' ) ;
156
165
const id : string = arr [ arr . length - 1 ] ;
157
- const result = await list ( { current : 1 , pageSize : 1 } , { id } ) ;
158
- setCurrentRow ( result . data [ 0 ] ) ;
159
- setShowDetail ( true ) ;
166
+ const result = await requestList ( { current : 1 , pageSize : 1 } , { id } ) ;
167
+ setOptions ( result . data ) ;
168
+ }
169
+ } ;
170
+ const handleOnSearch = async ( ) => {
171
+ const { data } = await requestList ( { current : 1 , pageSize : 1000 } ) ;
172
+ const targetArr = [ ] ,
173
+ obj = { } ;
174
+ for ( let i = 0 ; i < data . length ; i ++ ) {
175
+ const { typeName = '' } = data [ i ] ;
176
+ if ( ! obj [ typeName ] ) {
177
+ obj [ typeName ] = true ;
178
+ targetArr . push ( { label : typeName , value : typeName } ) ;
179
+ }
160
180
}
181
+ setOptions ( targetArr ) ;
161
182
} ;
162
183
useEffect ( ( ) => {
163
184
getTemplateData ( params . id ) ;
185
+ handleOnSearch ( ) ;
164
186
} , [ ] ) ;
165
187
const handleOnTabChange = async ( key : string ) => {
166
188
await getTemplateData ( key ) ;
@@ -192,37 +214,40 @@ const TableList: React.FC = () => {
192
214
) ;
193
215
} ,
194
216
} ,
195
- ...templateData . map ( ( item : any ) => ( {
196
- ...item ,
197
- ...item . table ,
198
- renderFormItem : ( ) => {
199
- if ( item . search && item . search . type === 'select' ) {
200
- return < ProFormSelect name = { item . dataIndex } options = { item . search . data } /> ;
201
- } else {
202
- return < ProFormText name = { item . dataIndex } /> ;
203
- }
204
- } ,
205
- render : ( dom : any ) => {
206
- if ( ! item . hideInTable && item . table && item . table . type === 'image' ) {
207
- if ( Array . isArray ( dom ) ) {
208
- return dom . map ( ( i : any ) => < Image height = { 100 } src = { i } /> ) ;
217
+ ...templateData . map ( ( item : any ) => {
218
+ item . hideInSearch = ! item . search || JSON . stringify ( item . search ) === '{}' ;
219
+ item . hideInTable = ! item . table || JSON . stringify ( item . table ) === '{}' ;
220
+ return {
221
+ ...item ,
222
+ defaultSortOrder : 'descend' ,
223
+ sorter : ( a : any , b : any ) => a [ item . dataIndex ] - b [ item . dataIndex ] ,
224
+ ...item . table ,
225
+ renderFormItem : ( ) => {
226
+ if ( item . search && item . search . type === 'select' ) {
227
+ // if(item.search.data){
228
+ // return <ProFormSelect name={item.dataIndex} options={item.search.data} />;
229
+ // }else{
230
+ return < ProFormSelect name = { item . dataIndex } options = { options } /> ;
231
+ // }
209
232
} else {
210
- return < Image height = { 100 } src = { dom } /> ;
233
+ return < ProFormText name = { item . dataIndex } /> ;
211
234
}
212
- }
213
- if ( ! item . hideInTable && item . table && item . table . type === 'time' ) {
214
- return < div style = { { whiteSpace : 'pre-line' } } > { moment ( dom ) . fromNow ( ) } </ div > ;
215
- }
216
- if ( ! item . hideInTable && item . table && item . table . type === 'select' ) {
217
- return (
218
- < div style = { { whiteSpace : 'pre-line' } } >
219
- { item . table . data . find ( ( o : any ) => o . value === dom ) . name }
220
- </ div >
221
- ) ;
222
- }
223
- return dom ;
224
- } ,
225
- } ) ) ,
235
+ } ,
236
+ render : ( dom : any ) => {
237
+ if ( ! item . hideInTable && item . table && item . table . type === 'image' ) {
238
+ if ( Array . isArray ( dom ) ) {
239
+ return dom . map ( ( i : any ) => < Image height = { 100 } src = { i } /> ) ;
240
+ } else {
241
+ return < Image height = { 100 } src = { dom } /> ;
242
+ }
243
+ }
244
+ if ( ! item . hideInTable && item . table && item . table . type === 'time' ) {
245
+ return < div style = { { whiteSpace : 'pre-line' } } > { moment ( dom ) . fromNow ( ) } </ div > ;
246
+ }
247
+ return dom ;
248
+ } ,
249
+ } ;
250
+ } ) ,
226
251
{
227
252
title : '操作' ,
228
253
dataIndex : 'option' ,
@@ -292,27 +317,27 @@ const TableList: React.FC = () => {
292
317
} ,
293
318
] ;
294
319
const descriptions : ProColumns < TableListItem > [ ] = templateData
295
- . filter ( ( item : any ) => item . view )
320
+ . filter ( ( item : any ) => JSON . stringify ( item . view ) !== '{}' )
296
321
. map ( ( item : any ) => {
297
322
const { width, view, ellipsis, ...rest } = item ;
298
323
return {
299
324
...rest ,
300
325
render : ( text : any ) => {
301
- if ( ! item . hideInTable && item . view && item . view . type === 'image' ) {
326
+ if ( item . view && item . view . type === 'image' ) {
302
327
if ( Array . isArray ( text ) ) {
303
328
return text . map ( ( i : any ) => < Image height = { 300 } src = { i } /> ) ;
304
329
} else {
305
330
return < Image height = { 300 } src = { text } /> ;
306
331
}
307
332
}
308
- if ( ! item . hideInTable && item . view && item . view . type === 'time' ) {
309
- return (
310
- < div style = { { color : 'lightblue' , whiteSpace : 'pre-line' } } >
311
- { moment ( text ) . fromNow ( ) }
312
- </ div >
313
- ) ;
333
+ if ( item . view && item . view . type === 'time' ) {
334
+ return < div style = { { whiteSpace : 'pre-line' } } > { moment ( text ) . fromNow ( ) } </ div > ;
314
335
}
315
- return < div style = { { color : 'lightblue' , whiteSpace : 'pre-line' } } > { text } </ div > ;
336
+ return (
337
+ < div style = { { whiteSpace : 'pre-line' } } >
338
+ { typeof text === 'string' ? text : JSON . stringify ( text ) }
339
+ </ div >
340
+ ) ;
316
341
} ,
317
342
} ;
318
343
} ) ;
@@ -365,6 +390,7 @@ const TableList: React.FC = () => {
365
390
actionRef = { actionRef }
366
391
ghost = { true }
367
392
rowKey = "id"
393
+ scroll = { { x : 1500 , y : 480 } }
368
394
search = { {
369
395
labelWidth : 100 ,
370
396
optionRender : ( searchConfig , formProps , dom ) => {
@@ -400,20 +426,13 @@ const TableList: React.FC = () => {
400
426
type = "primary"
401
427
key = "primary"
402
428
onClick = { ( ) : any => {
403
- if ( ! selectedRowsState . length ) {
404
- return message . warning ( '请选择数据' ) ;
405
- }
406
429
Modal . confirm ( {
407
- title : '删除数据 ' ,
408
- content : '确定删除该数据吗 ?' ,
430
+ title : '导出数据 ' ,
431
+ content : '确定导出全部数据吗 ?' ,
409
432
okText : '确认' ,
410
433
cancelText : '取消' ,
411
434
onOk : async ( ) => {
412
- await handleDelete ( selectedRowsState ) ;
413
- setSelectedRows ( [ ] ) ;
414
- if ( actionRef . current ) {
415
- actionRef . current . reload ( ) ;
416
- }
435
+ await exportList ( ) ;
417
436
} ,
418
437
} ) ;
419
438
} }
@@ -424,11 +443,32 @@ const TableList: React.FC = () => {
424
443
type = "primary"
425
444
key = "primary"
426
445
onClick = { async ( ) => {
427
- await handleDelete ( selectedRowsState ) ;
428
- setSelectedRows ( [ ] ) ;
429
- if ( actionRef . current ) {
430
- actionRef . current . reload ( ) ;
431
- }
446
+ Modal . confirm ( {
447
+ title : '导出数据' ,
448
+ content : '确定导出选中数据吗?' ,
449
+ okText : '确认' ,
450
+ cancelText : '取消' ,
451
+ onOk : async ( ) => {
452
+ const res : any = await exportList ( selectedRowsState ) ;
453
+ debugger ;
454
+ const blob = new Blob ( [ res . data ] , {
455
+ type : 'application/vnd.ms-excel;charset=utf-8' ,
456
+ } ) ;
457
+ const downloadElement = document . createElement ( 'a' ) ;
458
+ const href = window . URL . createObjectURL ( blob ) ; //创建下载的链接
459
+ downloadElement . href = href ;
460
+ downloadElement . download =
461
+ decodeURI ( res . headers [ 'content-disposition' ] . split ( 'filename=' ) [ 1 ] ) || '' ; //下载后文件名
462
+ document . body . appendChild ( downloadElement ) ;
463
+ downloadElement . click ( ) ; //点击下载
464
+ document . body . removeChild ( downloadElement ) ; //下载完成移除元素
465
+ window . URL . revokeObjectURL ( href ) ; //释放掉blob对象
466
+ setSelectedRows ( [ ] ) ;
467
+ if ( actionRef . current ) {
468
+ actionRef . current . reload ( ) ;
469
+ }
470
+ } ,
471
+ } ) ;
432
472
} }
433
473
>
434
474
批量导出
@@ -471,7 +511,7 @@ const TableList: React.FC = () => {
471
511
< PlusOutlined /> 批量添加
472
512
</ Button > ,
473
513
] }
474
- request = { list }
514
+ request = { requestList }
475
515
columns = { columns }
476
516
rowSelection = { {
477
517
onChange : ( _ , selectedRows ) => {
0 commit comments