@bit-sun/business-component 2.2.1 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,724 @@
1
+ // @ts-nocheck
2
+ import React from 'react';
3
+ import { Table, message, Checkbox, Modal, Input, Button, Tooltip } from 'antd';
4
+ import axios from 'axios';
5
+ // import { request } from 'umi';
6
+ import {
7
+ SortableContainer,
8
+ SortableElement,
9
+ SortableHandle,
10
+ } from 'react-sortable-hoc';
11
+ import { MenuOutlined, SearchOutlined } from '@ant-design/icons';
12
+ import { arrayMoveImmutable } from 'array-move';
13
+ import { setConfigTableColumns, getConfigTableColumns } from '@/utils/LocalstorageUtils';
14
+ import shezhi from '../../assets/icon-shezhi.svg';
15
+ import close from '../../assets/close.svg';
16
+ import drag from '../../assets/drag.svg';
17
+ import fixedLeft from '../../assets/fixed-left.svg';
18
+ import fixedLeftActive from '../../assets/fixed-left-active.svg';
19
+ import fixedRight from '../../assets/fixed-right.svg';
20
+ import fixedRightActive from '../../assets/fixed-right-active.svg';
21
+ import './index.less';
22
+
23
+ interface TableColumnSettingProps {
24
+ /** tableCode必填,做用户存储关键key,*/
25
+ tableCode: string;
26
+ /** datasource必填,为要操作的表头(即原始表头),*/
27
+ datasource: any;
28
+ /** showColumns必填,为当前用户设置的表头,*/
29
+ showColumns: any;
30
+ /** setShowColumns必填,设置当前表头的方法,*/
31
+ setShowColumns: void;
32
+ /** settingImgAttribute非必填,设置当前设置img样式,*/
33
+ settingImgAttribute: {
34
+ [propName: string]: any;
35
+ };
36
+ [propName: string]: any;
37
+ }
38
+ const { Search } = Input;
39
+
40
+ const DragHandle = SortableHandle(() => <img src={drag} />);
41
+
42
+ const SortableItem = SortableElement((props: any) => <tr {...props} />);
43
+ const SortableBody = SortableContainer((props: any) => <tbody {...props} />);
44
+
45
+ class TableColumnSetting extends React.Component<TableColumnSettingProps> {
46
+ state = {
47
+ dataSource: [],
48
+ columns: [],
49
+ selectedRowKeys: [],
50
+ sortDataSource: [],
51
+ setVisible: false,
52
+ searchDataSource: false,
53
+ onSearchSort: false,
54
+ };
55
+
56
+ patchUserColumnConfig = (config: any) => {
57
+ const { tableCode }: any = this.props;
58
+ if (!tableCode) return;
59
+ let configvalue = config.map((item:any) => ({
60
+ key: item.key,
61
+ dataIndex: item.dataIndex,
62
+ width: item.width,
63
+ hidden: item.hidden,
64
+ fixed: item.fixed
65
+ }))
66
+
67
+ axios({
68
+ url: '/user/appConfig/saveUserOrder',
69
+ method:'POST',
70
+ data: {
71
+ "code": tableCode,
72
+ "detail": JSON.stringify(configvalue)
73
+ },
74
+ }).then((res:any) => {
75
+ if (res?.data?.status === '0') {
76
+ setConfigTableColumns(configvalue, tableCode)
77
+ } else {
78
+ message.error('保存表头列自定义失败,请稍后尝试');
79
+ }
80
+ })
81
+ }
82
+
83
+ setInitValue = (datasource: any[]) => {
84
+ const { showColumns=[], tableCode } = this.props;
85
+ // 获取当前列表定义数据
86
+ let columnConfig = getConfigTableColumns(tableCode);
87
+ let initialDataSourceData = columnConfig.length ? datasource.map(item => {
88
+ let inner = columnConfig.filter((innerItem: any) => (
89
+ innerItem.dataIndex && innerItem.dataIndex === item.dataIndex
90
+ ) || (innerItem.key && innerItem.key === item.key));
91
+ let showColumnItem = showColumns.filter((inneritem:any) => ((inneritem.dataIndex && inneritem.dataIndex === item.dataIndex) || (inneritem.key && inneritem.key === item.key)))
92
+ return {
93
+ ...item,
94
+ fixed: inner.length ? inner[0]?.fixed : item?.fixed,
95
+ key: item.key || item.dataIndex,
96
+ width: showColumnItem[0]?.width || inner[0]?.width || item.width,
97
+ hidden: columnConfig.length && !inner.length,
98
+ }
99
+ })
100
+ : [...datasource]
101
+ this.setState({
102
+ dataSource: initialDataSourceData.map((item: any) => ({
103
+ ...item,
104
+ key: item.key || item.dataIndex,
105
+ })),
106
+ sortDataSource: initialDataSourceData.filter((item: any) => !item.hidden)
107
+ .map((item: any) => ({
108
+ ...item,
109
+ key: item.key || item.dataIndex,
110
+ })),
111
+ });
112
+ };
113
+
114
+ componentWillReceiveProps(nextProps: any) {
115
+ if (
116
+ this.props?.datasource &&
117
+ JSON.stringify(this.props?.datasource) !=
118
+ JSON.stringify(nextProps?.datasource)
119
+ ) {
120
+ this.setInitValue(nextProps?.datasource || []);
121
+ }
122
+ }
123
+
124
+ componentDidMount() {
125
+ const { datasource = [] }: any = this.props;
126
+ this.setInitValue(datasource);
127
+ }
128
+
129
+ columns = [
130
+ {
131
+ title: '列名称',
132
+ dataIndex: 'title',
133
+ className: 'drag-visible',
134
+ width: 100,
135
+ },
136
+ {
137
+ title: '列首',
138
+ dataIndex: 'fixedLeft',
139
+ render: (text, record) => {
140
+ return (
141
+ <span
142
+ onClick={() => {
143
+ const { sortDataSource } = this.state;
144
+ if (record?.fixed !== 'left') {
145
+ let newSortData = sortDataSource.map((item) => {
146
+ if (item.title === record.title) {
147
+ return {
148
+ ...item,
149
+ fixed: 'left',
150
+ };
151
+ }
152
+ return item;
153
+ });
154
+ this.setState({
155
+ sortDataSource: [
156
+ ...newSortData.filter((item) => item.fixed === 'left'),
157
+ ...newSortData.filter((item) => !item.fixed),
158
+ ...newSortData.filter((item) => item.fixed === 'right'),
159
+ ],
160
+ dataSource: [
161
+ ...this.state.dataSource.map((item) => {
162
+ if (item.title === record.title) {
163
+ return {
164
+ ...item,
165
+ fixed: 'left',
166
+ };
167
+ }
168
+ return item;
169
+ }),
170
+ ],
171
+ });
172
+ } else {
173
+ let newSortData = sortDataSource.map((item) => {
174
+ if (item.title === record.title) {
175
+ return {
176
+ ...item,
177
+ fixed: null,
178
+ };
179
+ }
180
+ return item;
181
+ });
182
+ this.setState({
183
+ sortDataSource: [
184
+ ...newSortData.filter((item) => item.fixed === 'left'),
185
+ ...newSortData.filter((item) => !item.fixed),
186
+ ...newSortData.filter((item) => item.fixed === 'right'),
187
+ ],
188
+ dataSource: [
189
+ ...this.state.dataSource.map((item) => {
190
+ if (item.title === record.title) {
191
+ return {
192
+ ...item,
193
+ fixed: null,
194
+ };
195
+ }
196
+ return item;
197
+ }),
198
+ ],
199
+ });
200
+ }
201
+ }}
202
+ >
203
+ <Tooltip
204
+ placement="top"
205
+ title={record?.fixed === 'left' ? '取消固定' : '固定列首'}
206
+ >
207
+ <img
208
+ src={record?.fixed === 'left' ? fixedLeftActive : fixedLeft}
209
+ />
210
+ </Tooltip>
211
+ </span>
212
+ );
213
+ },
214
+ },
215
+ {
216
+ title: '列尾',
217
+ dataIndex: 'fixedRight',
218
+ render: (text, record) => {
219
+ return (
220
+ <span
221
+ onClick={() => {
222
+ const { sortDataSource } = this.state;
223
+ if (record?.fixed !== 'right') {
224
+ let newSortData = sortDataSource.map((item) => {
225
+ if (item.title === record.title) {
226
+ return {
227
+ ...item,
228
+ fixed: 'right',
229
+ };
230
+ }
231
+ return item;
232
+ });
233
+ this.setState({
234
+ sortDataSource: [
235
+ ...newSortData.filter((item) => item.fixed === 'left'),
236
+ ...newSortData.filter((item) => !item.fixed),
237
+ ...newSortData.filter((item) => item.fixed === 'right'),
238
+ ],
239
+ dataSource: [
240
+ ...this.state.dataSource.map((item) => {
241
+ if (item.title === record.title) {
242
+ return {
243
+ ...item,
244
+ fixed: 'right',
245
+ };
246
+ }
247
+ return item;
248
+ }),
249
+ ],
250
+ });
251
+ } else {
252
+ let newSortData = sortDataSource.map((item) => {
253
+ if (item.title === record.title) {
254
+ return {
255
+ ...item,
256
+ fixed: null,
257
+ };
258
+ }
259
+ return item;
260
+ });
261
+ this.setState({
262
+ sortDataSource: [
263
+ ...newSortData.filter((item) => item.fixed === 'left'),
264
+ ...newSortData.filter((item) => !item.fixed),
265
+ ...newSortData.filter((item) => item.fixed === 'right'),
266
+ ],
267
+ dataSource: [
268
+ ...this.state.dataSource.map((item) => {
269
+ if (item.title === record.title) {
270
+ return {
271
+ ...item,
272
+ fixed: null,
273
+ };
274
+ }
275
+ return item;
276
+ }),
277
+ ],
278
+ });
279
+ }
280
+ }}
281
+ >
282
+ <Tooltip
283
+ placement="top"
284
+ title={record?.fixed === 'right' ? '取消固定' : '固定列尾'}
285
+ >
286
+ <img
287
+ src={record?.fixed === 'right' ? fixedRightActive : fixedRight}
288
+ />
289
+ </Tooltip>
290
+ </span>
291
+ );
292
+ },
293
+ },
294
+ {
295
+ title: '删除',
296
+ dataIndex: 'title1',
297
+ render: (text: any, record: any) => {
298
+ return (
299
+ <span
300
+ onClick={() => {
301
+ this.setState({
302
+ sortDataSource: this.state.sortDataSource.filter((item:any) => {
303
+ return item.title !== record.title;
304
+ }),
305
+ dataSource: [
306
+ ...this.state.dataSource.map((item:any) => {
307
+ if (item.title === record.title) {
308
+ return {
309
+ ...item,
310
+ hidden: true,
311
+ };
312
+ }
313
+
314
+ return item;
315
+ }),
316
+ ],
317
+ });
318
+ }}
319
+ >
320
+ <img src={close} />
321
+ </span>
322
+ );
323
+ },
324
+ },
325
+ {
326
+ title: 'Sort',
327
+ dataIndex: 'sort',
328
+ className: 'drag-visible',
329
+ render: () => <DragHandle />,
330
+ },
331
+ ];
332
+
333
+ showModal = () => {
334
+ const { datasource = [] }: any = this.props;
335
+ this.setState({
336
+ visible: true,
337
+ });
338
+ this.setInitValue(datasource);
339
+ };
340
+
341
+ handleOk = (e?: React.MouseEvent<HTMLElement>) => {
342
+ const { sortDataSource }: any = this.state;
343
+ const { setShowColumns }: any = this.props;
344
+ if (!sortDataSource.length) {
345
+ message.warning('至少选择一列!')
346
+ return;
347
+ }
348
+ this.setState({
349
+ visible: false,
350
+ });
351
+ setShowColumns([...sortDataSource]);
352
+ this.patchUserColumnConfig(sortDataSource)
353
+ };
354
+
355
+ handleCancel = (e: React.MouseEvent<HTMLElement>) => {
356
+ this.setState({
357
+ visible: false,
358
+ });
359
+ };
360
+
361
+ handleTableHeadHidden = (title: string) => {
362
+ const { sortDataSource, dataSource } = this.state;
363
+ this.setState(
364
+ {
365
+ sortDataSource: sortDataSource.filter((item: any) => {
366
+ return item.title !== title;
367
+ }),
368
+ dataSource: [
369
+ ...dataSource.map((item:any) => {
370
+ if (item.title === title) {
371
+ return {
372
+ ...item,
373
+ hidden: true,
374
+ };
375
+ }
376
+
377
+ return item;
378
+ }),
379
+ ],
380
+ },
381
+ () => {
382
+ this.handleOk();
383
+ },
384
+ );
385
+ };
386
+
387
+ onSortEnd = ({ oldIndex, newIndex }: any) => {
388
+ const { sortDataSource } = this.state;
389
+ const { value, setValue }: any = this.props;
390
+ // if (sortDataSource[oldIndex]['fixed']) {
391
+ // message.warning('固定列不可移动');
392
+ // return;
393
+ // }
394
+ if (oldIndex !== newIndex) {
395
+ const newData = arrayMoveImmutable(
396
+ [].concat(sortDataSource),
397
+ oldIndex,
398
+ newIndex,
399
+ ).filter((el) => !!el);
400
+ this.setState({
401
+ sortDataSource: [
402
+ ...newData.filter((item) => item.fixed === 'left'),
403
+ ...newData.filter((item) => !item.fixed),
404
+ ...newData.filter((item) => item.fixed === 'right'),
405
+ ],
406
+ });
407
+ }
408
+ };
409
+
410
+ DraggableContainer = (props: any) => (
411
+ <SortableBody
412
+ useDragHandle
413
+ disableAutoscroll
414
+ helperClass="row-dragging"
415
+ onSortEnd={this.onSortEnd}
416
+ {...props}
417
+ />
418
+ );
419
+
420
+ DraggableBodyRow = ({ className, style, ...restProps }: any) => {
421
+ const { sortDataSource } = this.state;
422
+ // function findIndex base on Table rowKey props and should always be a right array index
423
+ const index = sortDataSource.findIndex(
424
+ (x:any) => x.key === restProps['data-row-key'],
425
+ );
426
+ return <SortableItem index={index} {...restProps} />;
427
+ };
428
+
429
+ onChange = (e: any, title: any) => {
430
+ const { sortDataSource, dataSource } = this.state;
431
+ if (!e.target.checked) {
432
+ this.setState({
433
+ sortDataSource: sortDataSource.filter((item: any) => {
434
+ return item.title !== title;
435
+ }),
436
+ dataSource: [
437
+ ...dataSource.map((item: any) => {
438
+ if (item.title === title) {
439
+ return {
440
+ ...item,
441
+ hidden: true,
442
+ };
443
+ }
444
+
445
+ return item;
446
+ }),
447
+ ],
448
+ });
449
+ } else {
450
+ let fixedLeft: any[] = [];
451
+ let fixedRight: any[] = [];
452
+ let noFixedSortSource: any = [];
453
+ sortDataSource.forEach((item: any) => {
454
+ if (item?.fixed === 'left') {
455
+ fixedLeft.push(item);
456
+ } else if (item?.fixed === 'right') {
457
+ fixedRight.push(item);
458
+ } else {
459
+ noFixedSortSource.push(item);
460
+ }
461
+ });
462
+ this.setState({
463
+ sortDataSource: [
464
+ ...fixedLeft,
465
+ ...noFixedSortSource,
466
+ ...dataSource
467
+ .filter((item: any) => item.title === title)
468
+ .map((source: any) => {
469
+ return {
470
+ ...source,
471
+ hidden: false,
472
+ };
473
+ }),
474
+ ...fixedRight,
475
+ ],
476
+ dataSource: [
477
+ ...dataSource.map((item: any) => {
478
+ if (item.title === title) {
479
+ return {
480
+ ...item,
481
+ hidden: false,
482
+ };
483
+ }
484
+
485
+ return item;
486
+ }),
487
+ ],
488
+ });
489
+ }
490
+ };
491
+
492
+ handleReset = () => {
493
+ const { datasource = [] }: any = this.props;
494
+ this.setInitValue(datasource);
495
+ };
496
+
497
+ onSearch = (e: any) => {
498
+ this.setState({
499
+ searchDataSource: e.target.value,
500
+ });
501
+ };
502
+
503
+ onSearchSort = (e: any) => {
504
+ this.setState({
505
+ onSearchSort: e.target.value,
506
+ });
507
+ };
508
+
509
+ render() {
510
+ const {
511
+ dataSource,
512
+ searchDataSource,
513
+ sortDataSource,
514
+ visible,
515
+ onSearchSort,
516
+ }: any = this.state;
517
+ const { settingImgAttribute={} } = this.props;
518
+ const settingImgAttributeProps={width: 32,...settingImgAttribute};
519
+
520
+ let seatchDataSource = dataSource.filter(
521
+ (item: any) => item?.title?.indexOf(searchDataSource || '') > -1,
522
+ );
523
+
524
+ return (
525
+ <div className={'sort_table_wrapper'}>
526
+ <Modal
527
+ title="设置表头内容"
528
+ wrapClassName={'sort_table_wrapper'}
529
+ width={820}
530
+ visible={visible}
531
+ onOk={this.handleOk}
532
+ onCancel={this.handleCancel}
533
+ footer={[
534
+ <Button key="back" onClick={this.handleReset}>
535
+ 恢复默认
536
+ </Button>,
537
+ <Button key="submit" onClick={this.handleOk}>
538
+ 取消
539
+ </Button>,
540
+ <Button key="submit" type="primary" onClick={this.handleOk}>
541
+ 确认
542
+ </Button>,
543
+ ]}
544
+ >
545
+ <div className={'sort_table'}>
546
+ <div className={'sort_table_column_wrapper'}>
547
+ <span className={'sort_table_column_count'}>
548
+ 可选字段 <span>(共{dataSource.length}个)</span>
549
+ </span>
550
+ <div className={'sort_table_column'}>
551
+ <Input
552
+ prefix={<SearchOutlined className="site-form-item-icon" />}
553
+ placeholder="搜索"
554
+ allowClear
555
+ onChange={this.onSearch}
556
+ style={{ width: 540 }}
557
+ />
558
+ <div>
559
+ {!searchDataSource && (
560
+ <Checkbox
561
+ checked={
562
+ !dataSource.some((item: any) => {
563
+ if (item.hidden) return true;
564
+
565
+ return false;
566
+ })
567
+ }
568
+ onClick={(e:any) => {
569
+ this.setState({
570
+ dataSource: [
571
+ ...dataSource.map((item: any) => {
572
+ return {
573
+ ...item,
574
+ hidden: !e.target.checked,
575
+ };
576
+ }),
577
+ ],
578
+ sortDataSource: e.target.checked
579
+ ? [
580
+ ...dataSource.map((item: any) => {
581
+ return {
582
+ ...item,
583
+ hidden: false,
584
+ };
585
+ }),
586
+ ]
587
+ : [],
588
+ });
589
+ }}
590
+ >
591
+ 全选
592
+ </Checkbox>
593
+ )}
594
+ </div>
595
+ <div className={'sort_table_column_all'}>
596
+ {searchDataSource
597
+ ? seatchDataSource.map((item: any) => {
598
+ return (
599
+ <Checkbox
600
+ checked={!item.hidden}
601
+ onChange={(e) => {
602
+ this.onChange(e, item.title);
603
+ }}
604
+ >
605
+ {item.title}
606
+ </Checkbox>
607
+ );
608
+ })
609
+ : dataSource
610
+ .filter(
611
+ (item: any) =>
612
+ item?.title?.indexOf('人') === -1 &&
613
+ item?.title?.indexOf('日期') === -1,
614
+ )
615
+ .map((item: any) => {
616
+ return (
617
+ <Checkbox
618
+ checked={!item.hidden}
619
+ onChange={(e) => {
620
+ this.onChange(e, item.title);
621
+ }}
622
+ >
623
+ {item.title}
624
+ </Checkbox>
625
+ );
626
+ })}
627
+ {!!seatchDataSource.length && (
628
+ <span style={{ width: '144px' }}></span>
629
+ )}
630
+
631
+ {!seatchDataSource.length && (
632
+ <div className={'sort_table_column_all_empty'}>
633
+ 未查询到结果
634
+ </div>
635
+ )}
636
+ </div>
637
+ {!searchDataSource && (
638
+ <div>
639
+ <div className={'sort_table_column_special'}>
640
+ <span>人员时间字段</span>
641
+ </div>
642
+ <div className={'sort_table_column_all'}>
643
+ {[...dataSource]
644
+ .filter(
645
+ (item) =>
646
+ item?.title?.indexOf('人') > -1 ||
647
+ item?.title?.indexOf('日期') > -1,
648
+ )
649
+ .map((item) => {
650
+ return (
651
+ <Checkbox
652
+ checked={!item.hidden}
653
+ onChange={(e) => {
654
+ this.onChange(e, item.title);
655
+ }}
656
+ >
657
+ {item.title}
658
+ </Checkbox>
659
+ );
660
+ })}
661
+ <span style={{ width: '144px' }}></span>
662
+ </div>
663
+ </div>
664
+ )}
665
+
666
+ {/* <Checkbox.Group
667
+ options={dataSource.map(item => {
668
+ return {
669
+ label: item.title,
670
+ value: item.title,
671
+ }
672
+ })}
673
+ defaultValue={selectedRowKeys}
674
+ onChange={() => {}}
675
+ /> */}
676
+ </div>
677
+ </div>
678
+ <div className={'sort_table_content_wrapper'}>
679
+ <span className={'sort_table_content_count'}>
680
+ 已选字段 <span>(共{sortDataSource.length}个)</span>
681
+ </span>
682
+ <div className={'sort_table_content'}>
683
+ <span style={{ paddingLeft: '10px' }}>
684
+ <Input
685
+ prefix={<SearchOutlined className="site-form-item-icon" />}
686
+ placeholder="搜索"
687
+ allowClear
688
+ onChange={this.onSearchSort}
689
+ style={{ width: 190 }}
690
+ />
691
+ </span>
692
+ <Table
693
+ pagination={false}
694
+ showHeader={false}
695
+ dataSource={
696
+ onSearchSort
697
+ ? sortDataSource.filter(
698
+ (item:any) => item?.title?.indexOf(onSearchSort) > -1,
699
+ )
700
+ : sortDataSource
701
+ }
702
+ columns={this.columns}
703
+ rowKey="key"
704
+ // rowSelection={rowSelection}
705
+ components={{
706
+ body: {
707
+ wrapper: this.DraggableContainer,
708
+ row: this.DraggableBodyRow,
709
+ },
710
+ }}
711
+ />
712
+ </div>
713
+ </div>
714
+ </div>
715
+ </Modal>
716
+ <Tooltip title="列设置">
717
+ <img {...settingImgAttributeProps} onClick={this.showModal} src={shezhi} />
718
+ </Tooltip>
719
+ </div>
720
+ );
721
+ }
722
+ }
723
+
724
+ export default TableColumnSetting;