@gmfe/table-x 2.14.21-beta.1 → 2.14.26-beta.0
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.
- package/LICENSE.md +4 -0
- package/README.md +13 -13
- package/package.json +4 -4
- package/src/base/index.js +142 -142
- package/src/base/td.js +56 -56
- package/src/base/th.js +48 -48
- package/src/base/thead.js +26 -26
- package/src/base/tr.js +53 -53
- package/src/base/virtualized.js +219 -219
- package/src/hoc/diy_table_x/components/diy_table_x_modal.js +135 -135
- package/src/hoc/diy_table_x/components/modal_list.js +78 -78
- package/src/hoc/diy_table_x/components/modal_selector.js +56 -56
- package/src/hoc/diy_table_x/index.js +196 -196
- package/src/hoc/edit_table_x.js +20 -20
- package/src/hoc/expand_table_x/index.js +140 -140
- package/src/hoc/expand_table_x/util.js +27 -27
- package/src/hoc/fixed_columns_table_x.js +29 -29
- package/src/hoc/select_table_x/cell.js +51 -51
- package/src/hoc/select_table_x/header.js +28 -28
- package/src/hoc/select_table_x/index.js +139 -139
- package/src/hoc/select_table_x/util.js +10 -10
- package/src/hoc/sortable_table_x.js +52 -52
- package/src/hoc/sub_table_x.js +44 -44
- package/src/index.js +53 -53
- package/src/index.less +515 -515
- package/src/stories/table_x.stories.js +324 -324
- package/src/stories/table_x_hoc.stories.js +427 -427
- package/src/stories/table_x_hoc_select_expand.stories.js +256 -256
- package/src/util/batch_action_bar.js +124 -124
- package/src/util/edit.js +83 -83
- package/src/util/index.js +191 -191
- package/src/util/operation.js +249 -249
- package/src/util/sort_header.js +49 -49
- package/src/variables.less +28 -28
- package/svg/business.svg +20 -20
- package/svg/check-detail.svg +18 -18
- package/svg/closeup.svg +20 -20
- package/svg/delete.svg +10 -10
- package/svg/edit-pen.svg +17 -17
- package/svg/empty.svg +27 -27
- package/svg/expand.svg +21 -21
- package/svg/pen.svg +12 -12
- package/svg/recover.svg +33 -33
- package/svg/remove.svg +1 -1
- package/svg/setting.svg +17 -17
|
@@ -1,196 +1,196 @@
|
|
|
1
|
-
import React, { useState, useMemo, useRef, useEffect } from 'react'
|
|
2
|
-
import { getLocale } from '@gmfe/locales'
|
|
3
|
-
import _ from 'lodash'
|
|
4
|
-
import PropTypes from 'prop-types'
|
|
5
|
-
import { Storage, Popover } from '@gmfe/react'
|
|
6
|
-
import SVGSetting from '../../../svg/setting.svg'
|
|
7
|
-
import {
|
|
8
|
-
TABLE_X,
|
|
9
|
-
TABLE_X_SELECT_ID,
|
|
10
|
-
TABLE_X_EXPAND_ID,
|
|
11
|
-
TABLE_X_DIY_ID,
|
|
12
|
-
getColumnKey,
|
|
13
|
-
OperationIconTip
|
|
14
|
-
} from '../../util'
|
|
15
|
-
import TableX from '../../base'
|
|
16
|
-
import { devWarn } from '@gm-common/tool'
|
|
17
|
-
import DiyTableXModal from './components/diy_table_x_modal'
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* 把selector, expander 分离出来,不参与diy
|
|
21
|
-
* @param columns
|
|
22
|
-
* @returns {[][]}
|
|
23
|
-
*/
|
|
24
|
-
function splitColumns(columns) {
|
|
25
|
-
const notDiyCols = []
|
|
26
|
-
const diyCols = []
|
|
27
|
-
for (const item of columns) {
|
|
28
|
-
if ([TABLE_X_EXPAND_ID, TABLE_X_SELECT_ID].includes(item.id)) {
|
|
29
|
-
notDiyCols.push(item)
|
|
30
|
-
} else {
|
|
31
|
-
diyCols.push(item)
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
return [notDiyCols, diyCols]
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* 生成新的columns
|
|
39
|
-
* @param initColumns 原始columns
|
|
40
|
-
* @param mixColumns 需要混合的columns(优先取这里的值)
|
|
41
|
-
* @returns {(*[]|Array)[]}
|
|
42
|
-
*/
|
|
43
|
-
function generateDiyColumns(initColumns, mixColumns) {
|
|
44
|
-
const [notDiyCols, diyCols] = splitColumns(initColumns)
|
|
45
|
-
const mixColumnsMap = {}
|
|
46
|
-
_.forEach(mixColumns, (item, index) => {
|
|
47
|
-
item.sortNumber = index
|
|
48
|
-
mixColumnsMap[item.key] = item
|
|
49
|
-
})
|
|
50
|
-
let diyColumns = _.map(diyCols, column => {
|
|
51
|
-
const key = getColumnKey(column)
|
|
52
|
-
// 能获取 key 才可能使用 diy
|
|
53
|
-
if (key === null) {
|
|
54
|
-
return column
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// col 默认显示,以及 默认开启diy
|
|
58
|
-
const { show = true, diyEnable = true } = column
|
|
59
|
-
const newColumn = {
|
|
60
|
-
...column,
|
|
61
|
-
key, // 把key记录下来,作为这个列的唯一标识
|
|
62
|
-
show,
|
|
63
|
-
diyEnable
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// localstorage中储存的列
|
|
67
|
-
const localItem = mixColumnsMap[key]
|
|
68
|
-
// localstorage的值覆盖初始值
|
|
69
|
-
if (localItem) {
|
|
70
|
-
newColumn.show = localItem.show
|
|
71
|
-
newColumn.sortNumber = localItem.sortNumber
|
|
72
|
-
}
|
|
73
|
-
return newColumn
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
diyColumns = _.sortBy(diyColumns, function(o) {
|
|
77
|
-
return o.sortNumber
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
return [notDiyCols, diyColumns]
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* 过滤多余数据,避免复杂数据出现JSON循环引用报错问题
|
|
85
|
-
* @param columns
|
|
86
|
-
* @returns {Array}
|
|
87
|
-
*/
|
|
88
|
-
function getStorageColumns(columns) {
|
|
89
|
-
return _.map(columns, col => {
|
|
90
|
-
const { key, show, diyEnable } = col
|
|
91
|
-
return { key, show, diyEnable }
|
|
92
|
-
})
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
function diyTableXHOC(Component) {
|
|
96
|
-
const DiyTableX = ({ id, columns, diyGroupSorting, ...rest }) => {
|
|
97
|
-
// 没id强制报错
|
|
98
|
-
devWarn(() => {
|
|
99
|
-
if (id === undefined) {
|
|
100
|
-
throw Error('DiyTableX必须要有id!')
|
|
101
|
-
}
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
// 只需要执行第一遍就可以了,使用函数
|
|
105
|
-
const [diyCols, setDiyCols] = useState(
|
|
106
|
-
() => generateDiyColumns(columns, Storage.get(id) || [])[1]
|
|
107
|
-
)
|
|
108
|
-
|
|
109
|
-
useEffect(() => {
|
|
110
|
-
setDiyCols(generateDiyColumns(columns, Storage.get(id) || [])[1])
|
|
111
|
-
}, [columns])
|
|
112
|
-
|
|
113
|
-
const popoverRef = useRef()
|
|
114
|
-
|
|
115
|
-
const handleDiyColumnsSave = cols => {
|
|
116
|
-
setDiyCols(cols)
|
|
117
|
-
Storage.set(id, getStorageColumns(cols))
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const handleCancel = () => {
|
|
121
|
-
popoverRef.current.apiDoSetActive(false)
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const _columns = useMemo(() => {
|
|
125
|
-
const [notDiyCols, cols] = generateDiyColumns(columns, diyCols)
|
|
126
|
-
return [
|
|
127
|
-
{
|
|
128
|
-
id: TABLE_X_DIY_ID,
|
|
129
|
-
width: TABLE_X.WIDTH_FUN,
|
|
130
|
-
maxWidth: TABLE_X.WIDTH_FUN,
|
|
131
|
-
accessor: TABLE_X_DIY_ID,
|
|
132
|
-
fixed: 'left',
|
|
133
|
-
thClassName: 'gm-table-x-icon-column',
|
|
134
|
-
tdClassName: 'gm-table-x-icon-column',
|
|
135
|
-
Cell: () => null, // 只是用来占据空间
|
|
136
|
-
Header: () => (
|
|
137
|
-
<Popover
|
|
138
|
-
ref={popoverRef}
|
|
139
|
-
showArrow
|
|
140
|
-
offset={-10}
|
|
141
|
-
popup={
|
|
142
|
-
<DiyTableXModal
|
|
143
|
-
diyGroupSorting={diyGroupSorting}
|
|
144
|
-
columns={cols}
|
|
145
|
-
onSave={handleDiyColumnsSave}
|
|
146
|
-
onCancel={handleCancel}
|
|
147
|
-
/>
|
|
148
|
-
}
|
|
149
|
-
>
|
|
150
|
-
<div className='gm-table-x-icon'>
|
|
151
|
-
<OperationIconTip tip={getLocale('表头设置')}>
|
|
152
|
-
<div>
|
|
153
|
-
<SVGSetting className='gm-cursor gm-text-hover-primary' />
|
|
154
|
-
</div>
|
|
155
|
-
</OperationIconTip>
|
|
156
|
-
</div>
|
|
157
|
-
</Popover>
|
|
158
|
-
)
|
|
159
|
-
},
|
|
160
|
-
...notDiyCols,
|
|
161
|
-
...cols
|
|
162
|
-
]
|
|
163
|
-
}, [columns, diyCols])
|
|
164
|
-
|
|
165
|
-
return <Component {...rest} id={id} columns={_columns} />
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
DiyTableX.propTypes = {
|
|
169
|
-
...TableX.propTypes,
|
|
170
|
-
|
|
171
|
-
id: PropTypes.string.isRequired,
|
|
172
|
-
/** 分组排序 */
|
|
173
|
-
diyGroupSorting: PropTypes.array.isRequired,
|
|
174
|
-
/** column 需要有 diyGroupName 字段 和 (Header | diyItemText) */
|
|
175
|
-
columns: props => {
|
|
176
|
-
_.each(props.columns, column => {
|
|
177
|
-
const key = getColumnKey(column)
|
|
178
|
-
if (
|
|
179
|
-
key &&
|
|
180
|
-
![TABLE_X_SELECT_ID, TABLE_X_EXPAND_ID].includes(column.id)
|
|
181
|
-
) {
|
|
182
|
-
if (!_.isString(column.Header) && !column.Header) {
|
|
183
|
-
console.error('column need diyItemText', column)
|
|
184
|
-
}
|
|
185
|
-
if (!column.diyGroupName) {
|
|
186
|
-
console.error('column need diyGroupName', column)
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
})
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
return DiyTableX
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
export default diyTableXHOC
|
|
1
|
+
import React, { useState, useMemo, useRef, useEffect } from 'react'
|
|
2
|
+
import { getLocale } from '@gmfe/locales'
|
|
3
|
+
import _ from 'lodash'
|
|
4
|
+
import PropTypes from 'prop-types'
|
|
5
|
+
import { Storage, Popover } from '@gmfe/react'
|
|
6
|
+
import SVGSetting from '../../../svg/setting.svg'
|
|
7
|
+
import {
|
|
8
|
+
TABLE_X,
|
|
9
|
+
TABLE_X_SELECT_ID,
|
|
10
|
+
TABLE_X_EXPAND_ID,
|
|
11
|
+
TABLE_X_DIY_ID,
|
|
12
|
+
getColumnKey,
|
|
13
|
+
OperationIconTip
|
|
14
|
+
} from '../../util'
|
|
15
|
+
import TableX from '../../base'
|
|
16
|
+
import { devWarn } from '@gm-common/tool'
|
|
17
|
+
import DiyTableXModal from './components/diy_table_x_modal'
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 把selector, expander 分离出来,不参与diy
|
|
21
|
+
* @param columns
|
|
22
|
+
* @returns {[][]}
|
|
23
|
+
*/
|
|
24
|
+
function splitColumns(columns) {
|
|
25
|
+
const notDiyCols = []
|
|
26
|
+
const diyCols = []
|
|
27
|
+
for (const item of columns) {
|
|
28
|
+
if ([TABLE_X_EXPAND_ID, TABLE_X_SELECT_ID].includes(item.id)) {
|
|
29
|
+
notDiyCols.push(item)
|
|
30
|
+
} else {
|
|
31
|
+
diyCols.push(item)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return [notDiyCols, diyCols]
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 生成新的columns
|
|
39
|
+
* @param initColumns 原始columns
|
|
40
|
+
* @param mixColumns 需要混合的columns(优先取这里的值)
|
|
41
|
+
* @returns {(*[]|Array)[]}
|
|
42
|
+
*/
|
|
43
|
+
function generateDiyColumns(initColumns, mixColumns) {
|
|
44
|
+
const [notDiyCols, diyCols] = splitColumns(initColumns)
|
|
45
|
+
const mixColumnsMap = {}
|
|
46
|
+
_.forEach(mixColumns, (item, index) => {
|
|
47
|
+
item.sortNumber = index
|
|
48
|
+
mixColumnsMap[item.key] = item
|
|
49
|
+
})
|
|
50
|
+
let diyColumns = _.map(diyCols, column => {
|
|
51
|
+
const key = getColumnKey(column)
|
|
52
|
+
// 能获取 key 才可能使用 diy
|
|
53
|
+
if (key === null) {
|
|
54
|
+
return column
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// col 默认显示,以及 默认开启diy
|
|
58
|
+
const { show = true, diyEnable = true } = column
|
|
59
|
+
const newColumn = {
|
|
60
|
+
...column,
|
|
61
|
+
key, // 把key记录下来,作为这个列的唯一标识
|
|
62
|
+
show,
|
|
63
|
+
diyEnable
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// localstorage中储存的列
|
|
67
|
+
const localItem = mixColumnsMap[key]
|
|
68
|
+
// localstorage的值覆盖初始值
|
|
69
|
+
if (localItem) {
|
|
70
|
+
newColumn.show = localItem.show
|
|
71
|
+
newColumn.sortNumber = localItem.sortNumber
|
|
72
|
+
}
|
|
73
|
+
return newColumn
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
diyColumns = _.sortBy(diyColumns, function(o) {
|
|
77
|
+
return o.sortNumber
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
return [notDiyCols, diyColumns]
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* 过滤多余数据,避免复杂数据出现JSON循环引用报错问题
|
|
85
|
+
* @param columns
|
|
86
|
+
* @returns {Array}
|
|
87
|
+
*/
|
|
88
|
+
function getStorageColumns(columns) {
|
|
89
|
+
return _.map(columns, col => {
|
|
90
|
+
const { key, show, diyEnable } = col
|
|
91
|
+
return { key, show, diyEnable }
|
|
92
|
+
})
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function diyTableXHOC(Component) {
|
|
96
|
+
const DiyTableX = ({ id, columns, diyGroupSorting, ...rest }) => {
|
|
97
|
+
// 没id强制报错
|
|
98
|
+
devWarn(() => {
|
|
99
|
+
if (id === undefined) {
|
|
100
|
+
throw Error('DiyTableX必须要有id!')
|
|
101
|
+
}
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
// 只需要执行第一遍就可以了,使用函数
|
|
105
|
+
const [diyCols, setDiyCols] = useState(
|
|
106
|
+
() => generateDiyColumns(columns, Storage.get(id) || [])[1]
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
useEffect(() => {
|
|
110
|
+
setDiyCols(generateDiyColumns(columns, Storage.get(id) || [])[1])
|
|
111
|
+
}, [columns])
|
|
112
|
+
|
|
113
|
+
const popoverRef = useRef()
|
|
114
|
+
|
|
115
|
+
const handleDiyColumnsSave = cols => {
|
|
116
|
+
setDiyCols(cols)
|
|
117
|
+
Storage.set(id, getStorageColumns(cols))
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const handleCancel = () => {
|
|
121
|
+
popoverRef.current.apiDoSetActive(false)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const _columns = useMemo(() => {
|
|
125
|
+
const [notDiyCols, cols] = generateDiyColumns(columns, diyCols)
|
|
126
|
+
return [
|
|
127
|
+
{
|
|
128
|
+
id: TABLE_X_DIY_ID,
|
|
129
|
+
width: TABLE_X.WIDTH_FUN,
|
|
130
|
+
maxWidth: TABLE_X.WIDTH_FUN,
|
|
131
|
+
accessor: TABLE_X_DIY_ID,
|
|
132
|
+
fixed: 'left',
|
|
133
|
+
thClassName: 'gm-table-x-icon-column',
|
|
134
|
+
tdClassName: 'gm-table-x-icon-column',
|
|
135
|
+
Cell: () => null, // 只是用来占据空间
|
|
136
|
+
Header: () => (
|
|
137
|
+
<Popover
|
|
138
|
+
ref={popoverRef}
|
|
139
|
+
showArrow
|
|
140
|
+
offset={-10}
|
|
141
|
+
popup={
|
|
142
|
+
<DiyTableXModal
|
|
143
|
+
diyGroupSorting={diyGroupSorting}
|
|
144
|
+
columns={cols}
|
|
145
|
+
onSave={handleDiyColumnsSave}
|
|
146
|
+
onCancel={handleCancel}
|
|
147
|
+
/>
|
|
148
|
+
}
|
|
149
|
+
>
|
|
150
|
+
<div className='gm-table-x-icon'>
|
|
151
|
+
<OperationIconTip tip={getLocale('表头设置')}>
|
|
152
|
+
<div>
|
|
153
|
+
<SVGSetting className='gm-cursor gm-text-hover-primary' />
|
|
154
|
+
</div>
|
|
155
|
+
</OperationIconTip>
|
|
156
|
+
</div>
|
|
157
|
+
</Popover>
|
|
158
|
+
)
|
|
159
|
+
},
|
|
160
|
+
...notDiyCols,
|
|
161
|
+
...cols
|
|
162
|
+
]
|
|
163
|
+
}, [columns, diyCols])
|
|
164
|
+
|
|
165
|
+
return <Component {...rest} id={id} columns={_columns} />
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
DiyTableX.propTypes = {
|
|
169
|
+
...TableX.propTypes,
|
|
170
|
+
|
|
171
|
+
id: PropTypes.string.isRequired,
|
|
172
|
+
/** 分组排序 */
|
|
173
|
+
diyGroupSorting: PropTypes.array.isRequired,
|
|
174
|
+
/** column 需要有 diyGroupName 字段 和 (Header | diyItemText) */
|
|
175
|
+
columns: props => {
|
|
176
|
+
_.each(props.columns, column => {
|
|
177
|
+
const key = getColumnKey(column)
|
|
178
|
+
if (
|
|
179
|
+
key &&
|
|
180
|
+
![TABLE_X_SELECT_ID, TABLE_X_EXPAND_ID].includes(column.id)
|
|
181
|
+
) {
|
|
182
|
+
if (!_.isString(column.Header) && !column.Header) {
|
|
183
|
+
console.error('column need diyItemText', column)
|
|
184
|
+
}
|
|
185
|
+
if (!column.diyGroupName) {
|
|
186
|
+
console.error('column need diyGroupName', column)
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
})
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return DiyTableX
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export default diyTableXHOC
|
package/src/hoc/edit_table_x.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import classNames from 'classnames'
|
|
3
|
-
import TableX from '../base'
|
|
4
|
-
|
|
5
|
-
const editTableXHOC = Component => {
|
|
6
|
-
const EditTable = ({ className, ...rest }) => (
|
|
7
|
-
<Component
|
|
8
|
-
{...rest}
|
|
9
|
-
className={classNames('gm-table-x-edit-table', className)}
|
|
10
|
-
/>
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
EditTable.propTypes = {
|
|
14
|
-
...TableX.propTypes
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
return EditTable
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export default editTableXHOC
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import classNames from 'classnames'
|
|
3
|
+
import TableX from '../base'
|
|
4
|
+
|
|
5
|
+
const editTableXHOC = Component => {
|
|
6
|
+
const EditTable = ({ className, ...rest }) => (
|
|
7
|
+
<Component
|
|
8
|
+
{...rest}
|
|
9
|
+
className={classNames('gm-table-x-edit-table', className)}
|
|
10
|
+
/>
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
EditTable.propTypes = {
|
|
14
|
+
...TableX.propTypes
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return EditTable
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export default editTableXHOC
|