lw-cdp-ui 1.2.21 → 1.2.23

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.
@@ -3,379 +3,283 @@ import { onBeforeMount, reactive, ref, watch, toRefs, getCurrentInstance } from
3
3
  import dayjs from 'dayjs'
4
4
 
5
5
  export default {
6
- name: 'lwTable',
7
- props: {
8
- refName: { type: String, default: 'multipleTableRef' },
9
- tableName: { type: String, default: '' },
10
- isRadio: { type: Boolean, default: false },
11
- bordered: { type: Boolean, default: true },
12
- stripe: { type: Boolean, default: false },
13
- summaryMethod: { type: Function, default: () => [] },
14
- rowKey: { type: String, default: 'id' },
15
- defaultSelectData: { type: Array, default: () => [] },
16
- searchParams: { type: Object, default: () => ({ page: 1, size: 20 }) },
17
- selectStatus: { type: Function, default: () => true },
18
- pageSizes: { type: Array, default: () => [10, 20, 30, 40, 50] },
19
- isShowPagination: { type: Boolean, default: true },
20
- tableData: { type: Array, default: [] },
21
- totalCount: { type: Number, default: 0 },
22
- tableColumns: { type: Array, default: [] },
23
- hoverable: { type: Boolean, default: true },
24
- defaultExpandAll: { type: Boolean, default: false },
25
- isSetting: { type: Boolean, default: false },
26
- saveKey: { type: String, default: '' },
27
- orderPage: { type: Boolean, default: false },
28
- tableSize: { type: String, default: 'large' },
29
- loading: { type: Boolean, default: false },
30
- rowSelection: { type: Boolean, default: false },
31
- selectedKeys: { type: Array },
32
- selectDatas: { type: Array },
33
- hideTool: { type: Boolean, default: true },
34
- virtualListProps: { type: Object, default: undefined },
35
- draggable: { type: Object },
36
- maxHeight: { type: String, default: 'calc(100vh - 270px)' }
37
- },
38
- setup(props, context) {
39
- const multipleTable = ref()
40
- const {
41
- proxy: { $bus, $tool }
42
- } = getCurrentInstance()
43
- const { isFullscreen, toggle: toggleFullScreen } = useFullscreen()
44
- const state = reactive({
45
- dialogVisible: false,
46
- tableSettingTitle: '选择字段',
47
-
48
- tableHeaderListAll: [],
49
- checkedList: [],
50
- defaultProps: {
51
- children: 'children',
52
- label: 'label'
53
- },
54
- num: 0,
55
- endFixed: false,
56
- filterHeader: [],
57
- tableSize: props.tableSize,
58
-
59
- checkedKeys: [],
60
- treeData: [],
61
- allCheck: true,
62
- lastColumsFixed: true,
63
- tableHeaders: [],
64
- fixNum: 0
65
- })
66
-
67
- // 处理数据
68
- const filterData = () => {
69
- let list = props.tableColumns
70
-
71
- state.checkedKeys = []
72
- let arr = []
73
- list.forEach((item, index) => {
74
- if (!item.key) {
75
- item.key = $tool.getUUID()
76
- }
77
- if (!!item.checked || item.checked == undefined) {
78
- state.checkedKeys.push(item.key)
79
- arr.push(item)
80
- }
81
- })
82
- state.treeData = list
83
- state.tableHeaders = arr
84
- }
85
-
86
- onBeforeMount(async () => {
87
- window.addEventListener('resize', () => {
88
- let isFull =
89
- document.mozFullScreen || document.fullScreen || document.webkitIsFullScreen || document.webkitRequestFullScreen || document.mozRequestFullScreen || document.msFullscreenEnabled
90
- if (isFull === undefined) {
91
- isFull = false
92
- }
93
- if (isFull == false) {
94
- $bus.$emit('tableFullScreen', false)
95
- }
96
- })
97
- })
98
-
99
- watch(
100
- () => props.tableColumns,
101
- (newVal) => {
102
- filterData()
103
- },
104
- { deep: true, immediate: true }
105
- )
106
-
107
- const selectedKeysForm = ref([])
108
- const selectGoodsDatas = ref([])
109
- const selectAllGoods = ref([])
110
-
111
- watch(
112
- () => props.tableData,
113
- (newVal) => {
114
- const allArr = [...newVal, ...selectAllGoods.value]
115
- const allObj = {}
116
- const newAllArr = allArr.reduce((cur, next) => {
117
- allObj[next[props.rowKey]] ? '' : (allObj[next[props.rowKey]] = true && cur.push(next))
118
- return cur
119
- }, [])
120
- selectAllGoods.value = newAllArr || []
121
- },
122
- { deep: true, immediate: true }
123
- )
124
-
125
- watch(
126
- () => props.selectedKeys,
127
- (newVal) => {
128
- selectedKeysForm.value = newVal
129
- selectGoodsDatas.value = []
130
-
131
- if (selectAllGoods.value.length && !!newVal) {
132
- const data = selectAllGoods.value.filter((item) => {
133
- return newVal.includes(item[props.rowKey])
134
- })
135
- const arr = [...data, ...selectGoodsDatas.value]
136
- const obj = {}
137
- const newArr = arr.reduce((cur, next) => {
138
- obj[next[props.rowKey]] ? '' : (obj[next[props.rowKey]] = true && cur.push(next))
139
- return cur
140
- }, [])
141
- selectGoodsDatas.value = newArr || []
142
- context.emit('update:selectDatas', newArr)
143
- }
144
- },
145
- { deep: true, immediate: true }
146
- )
147
-
148
- const handleChange = (currentData) => {
149
- context.emit('draggable', currentData)
150
- }
151
-
152
- const handleSelectionChange = (val) => {
153
- context.emit('multipleSelection', val)
154
- }
155
-
156
- const handleCurrentChange = (val) => {
157
- context.emit('currentChange', val)
158
- }
159
-
160
- const sizeChange = (val) => {
161
- props.searchParams.size = val
162
- context.emit('getTableData')
163
- }
164
-
165
- const currentChange = (page) => {
166
- props.searchParams.page = page - 1
167
-
168
- context.emit('getTableData', props.searchParams.page)
169
- }
170
-
171
- const refresh = () => {
172
- currentChange(1)
173
- }
174
-
175
- const toggleRowChange = (row, status) => {
176
- multipleTable.value.toggleRowSelection(row, status)
177
- }
178
-
179
- const clearTableSelection = (row, status) => {
180
- multipleTable.value.clearSelection()
181
- }
182
-
183
- const allowDrop = (draggingNode, dropNode, type) => {
184
- return type !== 'inner'
185
- }
186
-
187
- const allowDrag = (draggingNode) => {
188
- return draggingNode.data.label.indexOf('Level three 3-1-1') === -1
189
- }
190
-
191
- const tableSetting = () => {
192
- state.tableSettingTitle = '选择字段'
193
- state.dialogVisible = true
194
- }
195
-
196
- const next = () => {
197
- if (state.checkedList.length === 0) {
198
- Message.error('选择字段不可以为空!')
199
- return
200
- }
201
- state.tableSettingTitle = '排序'
202
-
203
- state.treeData = []
204
- let num = 0
205
- let list = JSON.parse(JSON.stringify(state.checkedList))
206
- list.forEach((item, index) => {
207
- props.tableHeader.forEach((it) => {
208
- if (item === it.label) {
209
- let obj = {
210
- label: item,
211
- children: [],
212
- index: index,
213
- fixed: it.fixed ? it.fixed : ''
214
- }
215
- state.treeData.push(obj)
216
- if (it.fixed === 'left') {
217
- num++
218
- } else if (it.fixed === 'right') {
219
- state.endFixed = true
220
- }
221
- }
222
- })
223
-
224
- state.num = num
225
- })
226
- }
227
-
228
- const prev = () => {
229
- state.tableSettingTitle = '选择字段'
230
- }
231
-
232
- const tableHeaderConfirm = () => {
233
- if ((state.num > 2 && state.endFixed) || (state.num > 3 && !state.endFixed)) {
234
- Message.error('固定列最多只能选择3列!')
235
- return
236
- }
237
- state.tableHeaderList = []
238
- state.treeData.forEach((item, index) => {
239
- if (state.num > 0 && state.num > index) {
240
- item.fixed = 'left'
241
- } else if (state.endFixed && index === state.treeData.length - 1) {
242
- item.fixed = 'right'
243
- } else {
244
- item.fixed = ''
245
- }
246
- state.tableHeaderList.push(item)
247
- })
248
- state.dialogVisible = false
249
- let obj = {
250
- userId: 1,
251
- json: state.tableHeaderList
252
- }
253
- localStorage.setItem('userTable', JSON.stringify(obj))
254
- }
255
-
256
- const download = (url) => {
257
- let fileUrl =
258
- (process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'test') && location.hostname !== 'localhost' ? location.origin + url : 'http://dev.yihai.lianwei.com.cn' + url
259
- window.open(fileUrl, '_blank')
260
- }
261
-
262
- const sortChange = ({ column, prop, order }) => {
263
- props.searchParams.sortField = prop?.split(',')[0]
264
- props.searchParams.sortType = order
265
- const data = { ...props.searchParams }
266
- context.emit('getTableData', data)
267
- }
268
-
269
- const getHeader = (header) => {
270
- context.emit('getHeader', header)
271
- }
272
-
273
- const handleSelect = (v) => {
274
- state.tableSize = v
275
- }
276
-
277
- const checkAll = (selected) => {
278
- if (selected) {
279
- state.tableHeaders = JSON.parse(JSON.stringify(props.tableColumns))
280
- state.tableHeaders.forEach((item, index) => {
281
- if (!item.key) {
282
- item.key = $tool.getUUID()
283
- }
284
- state.checkedKeys.push(item.key)
285
- })
286
- } else {
287
- state.tableHeaders = []
288
- state.checkedKeys = []
289
- }
290
-
291
- state.treeData.forEach((item) => {
292
- item.checked = selected
293
- })
294
- }
295
-
296
- const treeCheck = () => {
297
- let list = state.treeData.filter((t) => state.checkedKeys.includes(t.key))
298
- state.tableHeaders = list
299
- }
300
-
301
- const tableToggleFullScreen = () => {
302
- $bus.$emit('tableFullScreen', !isFullscreen.value)
303
- toggleFullScreen()
304
- }
305
-
306
- const fixNumChange = () => {
307
- let num = state.fixNum
308
- if (num > 0) {
309
- state.tableHeaders.forEach((item, index) => {
310
- if (index < num) {
311
- item.fixed = 'left'
312
- item.width = item.width ?? '120'
313
- }
314
- })
315
- } else {
316
- state.tableHeaders.forEach((item) => {
317
- if (item.fixed === 'left') {
318
- delete item.fixed
319
- }
320
- })
321
- }
322
- }
323
-
324
- const setSelectAll = (status) => {
325
- multipleTable.value.selectAll(status)
326
- context.emit('update:selectedKeys', status ? props.tableData.map((item) => item.id) : [])
327
- }
328
-
329
- const setSelect = (rowKey, status) => {
330
- multipleTable.value.select(rowKey, status)
331
- const selectedKeys = [...props.selectedKeys]
332
- context.emit('update:selectedKeys', status ? selectedKeys.push(rowKey) : selectedKeys.filter((item) => item !== rowKey))
333
- }
334
-
335
- const selectAll = (status) => {
336
- context.emit('update:selectedKeys', status ? props.tableData.map((item) => item[props.rowKey]) : [])
337
- }
338
-
339
- const select = (rowKeys, rowKey, record) => {
340
- context.emit('update:selectedKeys', rowKeys)
341
- }
342
-
343
- const changeColWidth = (newWidth, oldWidth, { property }) => {}
344
-
345
- return {
346
- ...toRefs(state),
347
- refresh,
348
- dayjs,
349
- handleChange,
350
- handleSelectionChange,
351
- handleCurrentChange,
352
- sizeChange,
353
- currentChange,
354
- multipleTable,
355
- allowDrop,
356
- allowDrag,
357
- tableSetting,
358
- next,
359
- prev,
360
- tableHeaderConfirm,
361
- toggleRowChange,
362
- clearTableSelection,
363
- download,
364
- sortChange,
365
- getHeader,
366
- handleSelect,
367
- checkAll,
368
- tableToggleFullScreen,
369
- isFullscreen,
370
- treeCheck,
371
- fixNumChange,
372
- setSelectAll,
373
- setSelect,
374
- selectedKeysForm,
375
- selectGoodsDatas,
376
- selectAll,
377
- select,
378
- changeColWidth
379
- }
380
- }
381
- }
6
+ name: 'lwTable',
7
+
8
+ // 组件属性定义
9
+ props: {
10
+ refName: { type: String, default: 'multipleTableRef' }, // 表格ref名称
11
+ tableName: { type: String, default: '' }, // 表格名称
12
+ isRadio: { type: Boolean, default: false }, // 是否单选
13
+ bordered: { type: Boolean, default: true }, // 是否显示边框
14
+ stripe: { type: Boolean, default: false }, // 是否显示斑马纹
15
+ summaryMethod: { type: Function, default: () => [] }, // 合计行计算方法
16
+ rowKey: { type: String, default: 'id' }, // 行数据的唯一标识
17
+ defaultSelectData: { type: Array, default: () => [] }, // 默认选中的数据
18
+ searchParams: { type: Object, default: () => ({ page: 1, size: 20 }) }, // 查询参数
19
+ selectStatus: { type: Function, default: () => true }, // 选择状态判断函数
20
+ pageSizes: { type: Array, default: () => [10, 20, 30, 40, 50] }, // 分页大小选项
21
+ isShowPagination: { type: Boolean, default: true }, // 是否显示分页
22
+ tableData: { type: Array, default: [] }, // 表格数据
23
+ totalCount: { type: Number, default: 0 }, // 数据总数
24
+ tableColumns: { type: Array, default: [] }, // 表格列配置
25
+ hoverable: { type: Boolean, default: true }, // 是否启用悬停效果
26
+ defaultExpandAll: { type: Boolean, default: false }, // 是否默认展开所有行
27
+ isSetting: { type: Boolean, default: false }, // 是否启用设置功能
28
+ saveKey: { type: String, default: '' }, // 保存设置的键名
29
+ orderPage: { type: Boolean, default: false }, // 是否为订单页面
30
+ tableSize: { type: String, default: 'large' }, // 表格大小
31
+ loading: { type: Boolean, default: false }, // 加载状态
32
+ rowSelection: { type: Boolean, default: false }, // 是否可选择行
33
+ selectedKeys: { type: Array }, // 选中的键值数组
34
+ selectDatas: { type: Array }, // 选中的数据数组
35
+ hideTool: { type: Boolean, default: true }, // 是否隐藏工具栏
36
+ virtualListProps: { type: Object, default: undefined }, // 虚拟列表属性
37
+ draggable: { type: Object }, // 拖拽配置
38
+ maxHeight: { type: String, default: 'calc(100vh - 270px)' } // 最大高度
39
+ },
40
+
41
+ setup(props, context) {
42
+ // 表格引用
43
+ const multipleTable = ref()
44
+
45
+ // 获取全局实例
46
+ const { proxy: { $bus, $tool } } = getCurrentInstance()
47
+
48
+ // 全屏相关状态
49
+ const { isFullscreen, toggle: toggleFullScreen } = useFullscreen()
50
+
51
+ // 响应式状态
52
+ const state = reactive({
53
+ dialogVisible: false, // 对话框可见性
54
+ tableSettingTitle: '选择字段', // 表格设置标题
55
+ tableHeaderListAll: [], // 所有表头列表
56
+ checkedList: [], // 已选中列表
57
+ defaultProps: {
58
+ children: 'children',
59
+ label: 'label'
60
+ },
61
+ num: 0, // 计数器
62
+ endFixed: false, // 是否固定末尾
63
+ filterHeader: [], // 过滤后的表头
64
+ tableSize: props.tableSize, // 表格大小
65
+ checkedKeys: [], // 选中的键
66
+ treeData: [], // 树形数据
67
+ allCheck: true, // 是否全选
68
+ lastColumsFixed: true, // 最后一列是否固定
69
+ tableHeaders: [], // 表格表头
70
+ fixNum: 0 // 固定列数量
71
+ })
72
+
73
+ // 过滤数据处理
74
+ const filterData = () => {
75
+ let list = props.tableColumns
76
+ state.checkedKeys = []
77
+ let arr = []
78
+ list.forEach((item, index) => {
79
+ if (!item.key) {
80
+ item.key = $tool.getUUID()
81
+ }
82
+ if (!!item.checked || item.checked == undefined) {
83
+ state.checkedKeys.push(item.key)
84
+ arr.push(item)
85
+ }
86
+ })
87
+ state.treeData = list
88
+ state.tableHeaders = arr
89
+ }
90
+
91
+ // 组件挂载前
92
+ onBeforeMount(async () => {
93
+ // 监听窗口大小变化
94
+ window.addEventListener('resize', () => {
95
+ let isFull = document.mozFullScreen ||
96
+ document.fullScreen ||
97
+ document.webkitIsFullScreen ||
98
+ document.webkitRequestFullScreen ||
99
+ document.mozRequestFullScreen ||
100
+ document.msFullscreenEnabled
101
+ if (isFull === undefined) {
102
+ isFull = false
103
+ }
104
+ if (isFull == false) {
105
+ $bus.$emit('tableFullScreen', false)
106
+ }
107
+ })
108
+ })
109
+
110
+ // 监听表格列变化
111
+ watch(() => props.tableColumns, (newVal) => {
112
+ filterData()
113
+ }, { deep: true, immediate: true })
114
+
115
+ // 选择相关的响应式引用
116
+ const selectedKeysForm = ref([])
117
+ const selectGoodsDatas = ref([])
118
+ const selectAllGoods = ref([])
119
+
120
+ // 监听表格数据变化
121
+ watch(() => props.tableData, (newVal) => {
122
+ // 合并并去重数据
123
+ const allArr = [...newVal, ...selectAllGoods.value]
124
+ const allObj = {}
125
+ const newAllArr = allArr.reduce((cur, next) => {
126
+ allObj[next[props.rowKey]] ? '' : (allObj[next[props.rowKey]] = true && cur.push(next))
127
+ return cur
128
+ }, [])
129
+ selectAllGoods.value = newAllArr || []
130
+ }, { deep: true, immediate: true })
131
+
132
+ // 监听选中键变化
133
+ watch(() => props.selectedKeys, (newVal) => {
134
+ selectedKeysForm.value = newVal
135
+ selectGoodsDatas.value = []
136
+
137
+ if (selectAllGoods.value.length && !!newVal) {
138
+ // 过滤并合并选中数据
139
+ const data = selectAllGoods.value.filter((item) => {
140
+ return newVal.includes(item[props.rowKey])
141
+ })
142
+ const arr = [...data, ...selectGoodsDatas.value]
143
+ const obj = {}
144
+ const newArr = arr.reduce((cur, next) => {
145
+ obj[next[props.rowKey]] ? '' : (obj[next[props.rowKey]] = true && cur.push(next))
146
+ return cur
147
+ }, [])
148
+ selectGoodsDatas.value = newArr || []
149
+ context.emit('update:selectDatas', newArr)
150
+ }
151
+ }, { deep: true, immediate: true })
152
+
153
+ // 表格功能方法
154
+ const handleChange = (currentData) => {
155
+ context.emit('draggable', currentData)
156
+ }
157
+
158
+ const handleSelectionChange = (val) => {
159
+ context.emit('multipleSelection', val)
160
+ }
161
+
162
+ const handleCurrentChange = (val) => {
163
+ context.emit('currentChange', val)
164
+ }
165
+
166
+ const sizeChange = (val) => {
167
+ props.searchParams.size = val
168
+ context.emit('getTableData')
169
+ }
170
+
171
+ const currentChange = (page) => {
172
+ props.searchParams.page = page - 1
173
+ context.emit('getTableData', props.searchParams.page)
174
+ }
175
+
176
+ const refresh = () => {
177
+ currentChange(1)
178
+ }
179
+
180
+ // 表格行选择方法
181
+ const toggleRowChange = (row, status) => {
182
+ multipleTable.value.toggleRowSelection(row, status)
183
+ }
184
+
185
+ const clearTableSelection = () => {
186
+ multipleTable.value.clearSelection()
187
+ }
188
+
189
+ // 表格设置相关方法
190
+ const handleSelect = (v) => {
191
+ state.tableSize = v
192
+ }
193
+
194
+ const checkAll = (selected) => {
195
+ if (selected) {
196
+ state.tableHeaders = JSON.parse(JSON.stringify(props.tableColumns))
197
+ state.tableHeaders.forEach((item) => {
198
+ if (!item.key) {
199
+ item.key = $tool.getUUID()
200
+ }
201
+ state.checkedKeys.push(item.key)
202
+ })
203
+ } else {
204
+ state.tableHeaders = []
205
+ state.checkedKeys = []
206
+ }
207
+
208
+ state.treeData.forEach((item) => {
209
+ item.checked = selected
210
+ })
211
+ }
212
+
213
+ const treeCheck = () => {
214
+ let list = state.treeData.filter((t) => state.checkedKeys.includes(t.key))
215
+ state.tableHeaders = list
216
+ }
217
+
218
+ // 全屏切换
219
+ const tableToggleFullScreen = () => {
220
+ $bus.$emit('tableFullScreen', !isFullscreen.value)
221
+ toggleFullScreen()
222
+ }
223
+
224
+ // 固定列设置
225
+ const fixNumChange = () => {
226
+ let num = state.fixNum
227
+ if (num > 0) {
228
+ state.tableHeaders.forEach((item, index) => {
229
+ if (index < num) {
230
+ item.fixed = 'left'
231
+ item.width = item.width ?? '120'
232
+ }
233
+ })
234
+ } else {
235
+ state.tableHeaders.forEach((item) => {
236
+ if (item.fixed === 'left') {
237
+ delete item.fixed
238
+ }
239
+ })
240
+ }
241
+ }
242
+
243
+ // 权限检查
244
+ const checkAuth = (auth) => {
245
+ const data = JSON.parse(localStorage.getItem('userAuthInfo'))
246
+ const { menus, authorities } = data
247
+ if (!auth) return true
248
+ if (Array.isArray(auth)) {
249
+ return auth.some((permission) => [...menus, ...authorities].includes(permission))
250
+ } else if (typeof auth === 'string') {
251
+ return [...menus, ...authorities].includes(auth)
252
+ }
253
+ return false
254
+ }
255
+
256
+ // 操作按钮过滤
257
+ const filterOperations = (operations, row) => {
258
+ return operations.filter((o) => (!o?.isShow || o.isShow(row)) && checkAuth(o.auth))
259
+ }
260
+
261
+ return {
262
+ ...toRefs(state),
263
+ checkAuth,
264
+ filterOperations,
265
+ refresh,
266
+ dayjs,
267
+ handleChange,
268
+ handleSelectionChange,
269
+ handleCurrentChange,
270
+ sizeChange,
271
+ currentChange,
272
+ multipleTable,
273
+ toggleRowChange,
274
+ clearTableSelection,
275
+ handleSelect,
276
+ checkAll,
277
+ tableToggleFullScreen,
278
+ isFullscreen,
279
+ treeCheck,
280
+ fixNumChange,
281
+ selectedKeysForm,
282
+ selectGoodsDatas
283
+ }
284
+ }
285
+ }