@gmfe/table-x 2.14.20 → 2.14.24

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.
Files changed (44) hide show
  1. package/README.md +13 -13
  2. package/package.json +4 -4
  3. package/src/base/index.js +142 -142
  4. package/src/base/td.js +56 -56
  5. package/src/base/th.js +48 -48
  6. package/src/base/thead.js +26 -26
  7. package/src/base/tr.js +53 -53
  8. package/src/base/virtualized.js +219 -219
  9. package/src/hoc/diy_table_x/components/diy_table_x_modal.js +135 -135
  10. package/src/hoc/diy_table_x/components/modal_list.js +78 -78
  11. package/src/hoc/diy_table_x/components/modal_selector.js +56 -56
  12. package/src/hoc/diy_table_x/index.js +196 -196
  13. package/src/hoc/edit_table_x.js +20 -20
  14. package/src/hoc/expand_table_x/index.js +140 -140
  15. package/src/hoc/expand_table_x/util.js +27 -27
  16. package/src/hoc/fixed_columns_table_x.js +29 -29
  17. package/src/hoc/select_table_x/cell.js +51 -51
  18. package/src/hoc/select_table_x/header.js +28 -28
  19. package/src/hoc/select_table_x/index.js +139 -139
  20. package/src/hoc/select_table_x/util.js +10 -10
  21. package/src/hoc/sortable_table_x.js +52 -52
  22. package/src/hoc/sub_table_x.js +44 -44
  23. package/src/index.js +53 -53
  24. package/src/index.less +515 -515
  25. package/src/stories/table_x.stories.js +324 -324
  26. package/src/stories/table_x_hoc.stories.js +427 -427
  27. package/src/stories/table_x_hoc_select_expand.stories.js +256 -256
  28. package/src/util/batch_action_bar.js +124 -124
  29. package/src/util/edit.js +83 -83
  30. package/src/util/index.js +191 -191
  31. package/src/util/operation.js +249 -249
  32. package/src/util/sort_header.js +49 -49
  33. package/src/variables.less +28 -28
  34. package/svg/business.svg +20 -20
  35. package/svg/check-detail.svg +18 -18
  36. package/svg/closeup.svg +20 -20
  37. package/svg/delete.svg +10 -10
  38. package/svg/edit-pen.svg +17 -17
  39. package/svg/empty.svg +27 -27
  40. package/svg/expand.svg +21 -21
  41. package/svg/pen.svg +12 -12
  42. package/svg/recover.svg +33 -33
  43. package/svg/remove.svg +1 -1
  44. 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
@@ -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