sh-view 2.1.0 → 2.3.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.
Files changed (128) hide show
  1. package/package.json +9 -13
  2. package/packages/components/global-components/sh-alert/index.vue +175 -173
  3. package/packages/components/global-components/sh-badge/index.vue +57 -43
  4. package/packages/components/global-components/sh-card/index.vue +24 -16
  5. package/packages/components/global-components/sh-code-editor/index.vue +250 -260
  6. package/packages/components/global-components/sh-col/index.vue +44 -36
  7. package/packages/components/global-components/sh-corner/index.vue +230 -228
  8. package/packages/components/global-components/sh-count-to/index.vue +60 -51
  9. package/packages/components/global-components/sh-drawer/index.vue +209 -182
  10. package/packages/components/global-components/sh-drawer/scrollbar.js +44 -42
  11. package/packages/components/global-components/sh-empty/index.vue +0 -1
  12. package/packages/components/global-components/sh-form/form.vue +110 -0
  13. package/packages/components/global-components/sh-form/js/props.js +76 -63
  14. package/packages/components/global-components/sh-form/js/useForm.js +236 -0
  15. package/packages/components/global-components/sh-form/query.vue +70 -0
  16. package/packages/components/global-components/sh-header/index.vue +35 -50
  17. package/packages/components/global-components/sh-icon/css/index.scss +44 -0
  18. package/packages/components/global-components/sh-icon/index.vue +24 -11
  19. package/packages/components/global-components/sh-image/index.vue +47 -38
  20. package/packages/components/global-components/sh-list/index.vue +42 -37
  21. package/packages/components/global-components/sh-loading/index.vue +12 -8
  22. package/packages/components/global-components/sh-modal/index.vue +49 -40
  23. package/packages/components/global-components/sh-noticebar/index.vue +68 -54
  24. package/packages/components/global-components/sh-poptip/index.vue +247 -130
  25. package/packages/components/global-components/sh-progress/index.vue +71 -69
  26. package/packages/components/global-components/sh-pull-refresh/index.vue +156 -157
  27. package/packages/components/global-components/sh-result/index.vue +37 -28
  28. package/packages/components/global-components/sh-row/index.vue +21 -18
  29. package/packages/components/global-components/sh-split/index.vue +115 -109
  30. package/packages/components/global-components/sh-table/components/importModal.vue +95 -86
  31. package/packages/components/global-components/sh-table/components/sh-column.vue +62 -0
  32. package/packages/components/global-components/sh-table/{index.vue → grid.vue} +34 -145
  33. package/packages/components/global-components/sh-table/js/tableMethods.js +175 -0
  34. package/packages/components/global-components/sh-table/js/useTable.js +592 -0
  35. package/packages/components/global-components/sh-table/table.vue +266 -0
  36. package/packages/components/global-components/sh-tabs/index.vue +118 -93
  37. package/packages/components/global-components/sh-tag/index.vue +52 -51
  38. package/packages/components/global-components/sh-toolbar/index.vue +53 -47
  39. package/packages/components/global-components/sh-tree/components/table-tree.vue +152 -139
  40. package/packages/components/global-components/sh-tree/index.vue +218 -195
  41. package/packages/components/global-components/sh-tree/mixin/treeProps.js +118 -120
  42. package/packages/components/global-components/sh-upload/index.vue +308 -51
  43. package/packages/components/global-components/sh-water-fall/index.vue +4 -11
  44. package/packages/components/index.js +5 -3
  45. package/packages/components/other-components/sh-cron-modal/components/cron-content.vue +140 -129
  46. package/packages/components/other-components/sh-cron-modal/css/index.scss +0 -5
  47. package/packages/components/other-components/sh-cron-modal/index.vue +81 -67
  48. package/packages/components/other-components/sh-cron-modal/mixin/cron-emits.js +1 -0
  49. package/packages/components/other-components/sh-cron-modal/mixin/cron-hooks.js +179 -0
  50. package/packages/components/other-components/sh-cron-modal/mixin/cron-props.js +9 -0
  51. package/packages/components/other-components/sh-cron-modal/tabs/cron-day-box.vue +101 -92
  52. package/packages/components/other-components/sh-cron-modal/tabs/cron-hour-box.vue +68 -56
  53. package/packages/components/other-components/sh-cron-modal/tabs/cron-minute-box.vue +68 -56
  54. package/packages/components/other-components/sh-cron-modal/tabs/cron-month-box.vue +68 -56
  55. package/packages/components/other-components/sh-cron-modal/tabs/cron-second-box.vue +68 -56
  56. package/packages/components/other-components/sh-cron-modal/tabs/cron-week-box.vue +126 -115
  57. package/packages/components/other-components/sh-cron-modal/tabs/cron-year-box.vue +59 -46
  58. package/packages/components/other-components/sh-menu/index.vue +73 -60
  59. package/packages/components/other-components/sh-menu/menu-group-content.vue +71 -59
  60. package/packages/components/other-components/sh-menu/menu-item-content.vue +40 -30
  61. package/packages/components/other-components/sh-menu-card/index.vue +70 -64
  62. package/packages/components/other-components/sh-menu-card/menu-box.vue +50 -44
  63. package/packages/components/other-components/sh-preview/components/sh-excel.vue +182 -0
  64. package/packages/components/other-components/sh-preview/components/sh-word.vue +73 -0
  65. package/packages/components/other-components/sh-preview/index.vue +86 -85
  66. package/packages/components/other-components/sh-preview/js/data-hook.js +37 -0
  67. package/packages/components/other-components/sh-preview/js/data-props.js +11 -0
  68. package/packages/components/other-components/sh-system-tip/index.vue +28 -24
  69. package/packages/css/index.js +4 -4
  70. package/packages/directive/module/prevent-click.js +1 -1
  71. package/packages/directive/module/resize.js +11 -154
  72. package/packages/index.js +39 -39
  73. package/packages/mixin/index.js +86 -87
  74. package/packages/vxeTable/render/cell/vxe-render-checkbox.vue +14 -5
  75. package/packages/vxeTable/render/cell/vxe-render-checkgroup.vue +43 -36
  76. package/packages/vxeTable/render/cell/vxe-render-code.vue +14 -5
  77. package/packages/vxeTable/render/cell/vxe-render-goption.vue +34 -24
  78. package/packages/vxeTable/render/cell/vxe-render-href.vue +21 -11
  79. package/packages/vxeTable/render/cell/vxe-render-img.vue +16 -10
  80. package/packages/vxeTable/render/cell/vxe-render-input.vue +83 -79
  81. package/packages/vxeTable/render/cell/vxe-render-money.vue +14 -6
  82. package/packages/vxeTable/render/cell/vxe-render-progress.vue +28 -19
  83. package/packages/vxeTable/render/cell/vxe-render-radio.vue +14 -5
  84. package/packages/vxeTable/render/cell/vxe-render-radiogroup.vue +43 -36
  85. package/packages/vxeTable/render/cell/vxe-render-select.vue +44 -36
  86. package/packages/vxeTable/render/cell/vxe-render-switch.vue +14 -5
  87. package/packages/vxeTable/render/cell/vxe-render-table.vue +51 -78
  88. package/packages/vxeTable/render/cell/vxe-render-textarea.vue +14 -5
  89. package/packages/vxeTable/render/cell/vxe-render-time.vue +23 -13
  90. package/packages/vxeTable/render/cell/vxe-render-tree.vue +23 -27
  91. package/packages/vxeTable/render/cell/vxe-render-upload.vue +11 -7
  92. package/packages/vxeTable/render/filters/vxe-filter-input.vue +25 -43
  93. package/packages/vxeTable/render/footer/vxe-footer-input.vue +23 -13
  94. package/packages/vxeTable/render/footer/vxe-footer-money.vue +30 -20
  95. package/packages/vxeTable/render/globalRenders.jsx +1 -1
  96. package/packages/vxeTable/render/header/vxe-header-money.vue +31 -21
  97. package/packages/vxeTable/render/mixin/cell-hooks.js +162 -0
  98. package/packages/vxeTable/render/mixin/cell-props.js +23 -0
  99. package/packages/vxeTable/render/mixin/filter-hooks.js +28 -0
  100. package/packages/components/global-components/sh-form/components/form-item.vue +0 -25
  101. package/packages/components/global-components/sh-form/css/index.scss +0 -55
  102. package/packages/components/global-components/sh-form/index.vue +0 -114
  103. package/packages/components/global-components/sh-form/js/methods.js +0 -146
  104. package/packages/components/global-components/sh-form/mixin/defaultData.js +0 -32
  105. package/packages/components/global-components/sh-icon/css/default/index.scss +0 -27
  106. package/packages/components/global-components/sh-icon/css/font/index.scss +0 -16
  107. package/packages/components/global-components/sh-icon/icon-default.vue +0 -32
  108. package/packages/components/global-components/sh-icon/icon-font.vue +0 -32
  109. package/packages/components/global-components/sh-poptip/popper.js +0 -115
  110. package/packages/components/global-components/sh-query/index.vue +0 -317
  111. package/packages/components/global-components/sh-table/js/methods.js +0 -549
  112. package/packages/components/global-components/sh-table/mixin/defaultData.js +0 -94
  113. package/packages/components/global-components/sh-upload/js/mixin.js +0 -257
  114. package/packages/components/other-components/sh-cron-modal/mixin/cron-box.js +0 -169
  115. package/packages/vxeTable/render/mixin/cell-mixin.js +0 -195
  116. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.svg → ionicons.svg} +0 -0
  117. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.ttf → ionicons.ttf} +0 -0
  118. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.woff → ionicons.woff} +0 -0
  119. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.woff2 → ionicons.woff2} +0 -0
  120. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.js → iconfont.js} +0 -0
  121. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.json → iconfont.json} +0 -0
  122. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.ttf → iconfont.ttf} +0 -0
  123. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.woff → iconfont.woff} +0 -0
  124. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.woff2 → iconfont.woff2} +0 -0
  125. /package/packages/{assets/css → css}/animated.scss +0 -0
  126. /package/packages/{assets/css → css}/loader.scss +0 -0
  127. /package/packages/{assets/css → css}/main.scss +0 -0
  128. /package/packages/{assets/css → css}/theme.scss +0 -0
@@ -0,0 +1,592 @@
1
+ import { computed, ref, watch } from 'vue'
2
+ import { columnDefaultFilterMethod, tableFooterCompute, getTransfarFields, getFieldsRules, turnColumnItemFilters } from './tableMethods'
3
+
4
+ const globalConfigDefault = {
5
+ tableName: '',
6
+ title: false, // 是否显示 tableName
7
+ checkbox: true, // 是否展示复选框
8
+ radio: false, // 是否展示单选框
9
+ seq: true, // 是否展示序号列
10
+ ghost: false, // 是否开启透明
11
+ search: false, // 表格是否开启查询,默认不开启,根据columns配置字段 search 为 true
12
+ globalFilter: false, // 表格是否开启全局过滤
13
+ zoom: false, // 表格是否开启缩放
14
+ formToggleNum: 4,
15
+ formToggle: true
16
+ }
17
+ const exportAndPrintDefault = {
18
+ mode: 'current',
19
+ original: false,
20
+ message: true,
21
+ isHeader: true,
22
+ isColgroup: true,
23
+ isFooter: false,
24
+ isMerge: false,
25
+ isAllExpand: true,
26
+ download: true,
27
+ useStyle: false,
28
+ columnFilterMethod: columnDefaultFilterMethod
29
+ }
30
+ const toolsList = [
31
+ { status: 'primary', code: 'addRow', content: '新增行' },
32
+ { status: 'danger', code: 'deleteRow', content: '删除行' },
33
+ { status: 'primary', code: 'import', icon: 'vxe-icon-upload', content: '导入' },
34
+ { status: 'success', code: 'export', icon: 'vxe-icon-download', content: '导出' },
35
+ { status: 'warning', code: 'print', icon: 'vxe-icon-print', content: '打印' }
36
+ ]
37
+ // 表头默认值
38
+ const columnObjDefault = { minWidth: 120, sortable: true, filter: true }
39
+ // 表头默认列
40
+ const columnsConfigDefault = [
41
+ { title: '', type: 'checkbox', width: 60, align: 'center', fixed: 'left', sortable: false, resizable: false, className: 'table-row-checkbox' },
42
+ { title: '单选', type: 'radio', width: 60, align: 'center', fixed: 'left', sortable: false, resizable: false, className: 'table-row-radio' },
43
+ { title: '序号', type: 'seq', width: 70, align: 'center', fixed: 'left', sortable: false, resizable: false, className: 'table-row-seq' }
44
+ ]
45
+
46
+ export default function (props, context, proxy, isGrid) {
47
+ const { $vUtils, $vxePluginNames } = proxy
48
+ const { emit, slots } = context
49
+
50
+ const tableRef = ref()
51
+ const renderKey = ref(1) // 渲染key值
52
+ const selectedRowKeys = ref([]) // table选中keys
53
+ const selectionRows = ref([]) // table选中records
54
+ const tableColumnsFixed = ref([]) // 表格格式化后表头
55
+ const tableFilterData = ref(null) // 表格全表搜索数据
56
+ const tableColumnsFlat = ref([]) // 多层转一维后表头
57
+ const tableFormItems = ref([]) // 根据表格表头生成表单项配置
58
+ const tableEditRules = ref({}) // 表格根据表头自动生成验证规则
59
+ const tableFilterText = ref('') // 全局过滤关键字
60
+ const tableCurrentRowData = ref(null) // 表格当前高亮行
61
+ const importVisible = ref(false) // 导出入弹窗开关
62
+ const tableRowDefaultData = ref({}) // 根据表头生成行默认值
63
+
64
+ const wrapHeight = computed(() => ([100, '100%', 'auto'].includes(props.height) ? '100%' : 'auto'))
65
+ const hasTree = computed(() => props.columns.some(_ => _.treeNode))
66
+ const tableVmConfig = computed(() => ({ size: props.size }))
67
+ const tableGlobalConfig = computed(() => Object.assign({}, globalConfigDefault, props.globalConfig))
68
+ const tableTools = computed(() => {
69
+ let tools = props.globalConfig?.tools || []
70
+ return toolsList.filter(tool => tools.includes(tool.code))
71
+ })
72
+ const tableViewData = computed(() => tableFilterData.value || props.dataSourse)
73
+ const tableColumns = computed(() => {
74
+ let defaultColumns = columnsConfigDefault.filter(item => tableGlobalConfig.value[item.type])
75
+ return defaultColumns.concat(tableColumnsFixed.value)
76
+ })
77
+ const tableColumnObjConfig = computed(() => Object.assign({}, columnObjDefault, props.columnObj))
78
+ const tableColumnConfig = computed(() => Object.assign({ isCurrent: false, isHover: true, resizable: true }, props.columnConfig))
79
+ const tablePagerConfig = computed(() =>
80
+ Object.assign({ enabled: Boolean(props.pagerConfig), total: 0, className: 'sh-table-footer', slots: { left: 'pagerLeft', right: 'pagerRight' } }, props.pagerConfig)
81
+ )
82
+ const tableCheckboxConfig = computed(() => {
83
+ return Object.assign({ range: !hasTree.value }, props.checkboxConfig)
84
+ })
85
+ const tableTreeConfig = computed(() => {
86
+ return hasTree.value ? Object.assign({}, props.treeConfig) : null
87
+ })
88
+ const tableSeqConfig = computed(() => {
89
+ return {
90
+ seqMethod: ({ $table, seq, $seq, $$seq, $rowIndex }) => {
91
+ const tablePage = tablePagerConfig.value.enabled
92
+ if ($$seq) {
93
+ return $$seq
94
+ } else if (tablePage) {
95
+ const pageStart = (+tablePagerConfig.value.pageSize || 50) * ((+tablePagerConfig.value.currentPage || 1) - 1)
96
+ return hasTree.value && $seq ? Number(pageStart) + Number($seq) + '.' + seq : Number(pageStart) + Number(seq)
97
+ } else if (hasTree.value) {
98
+ return $seq ? $seq + '.' + seq : seq
99
+ }
100
+ return seq === -1 ? $rowIndex + 1 : seq
101
+ }
102
+ }
103
+ })
104
+ const tableExportConfig = computed(() =>
105
+ Object.assign(
106
+ {
107
+ filename: tableGlobalConfig.value.tableName,
108
+ sheetName: 'sheet1',
109
+ type: 'xlsx',
110
+ types: ['xlsx', 'csv', 'pdf', 'html', 'xml', 'txt'],
111
+ beforeExportMethod: obj => getExportPrintDataByOption(obj, 'export')
112
+ },
113
+ exportAndPrintDefault,
114
+ props.exportConfig
115
+ )
116
+ )
117
+ const tablePrintConfig = computed(() =>
118
+ Object.assign(
119
+ {
120
+ filename: tableGlobalConfig.value.tableName,
121
+ sheetName: tableGlobalConfig.value.tableName,
122
+ beforePrintMethod: obj => getExportPrintDataByOption(obj, 'print')
123
+ },
124
+ exportAndPrintDefault,
125
+ props.printConfig
126
+ )
127
+ )
128
+ const tableEditConfig = computed(() =>
129
+ Object.assign({ enabled: !props.disabled, showStatus: !props.disabled, showUpdateStatus: !props.disabled, showInsertStatus: !props.disabled }, props.editConfig)
130
+ )
131
+ const tableQueryConfig = computed(() => {
132
+ let otherConfig = isGrid ? { transformitem: false, items: tableFormItems.value } : { items: props.columns }
133
+ return Object.assign(
134
+ { data: props.queryData, rules: tableEditRules.value, validConfig: props.validConfig, globalConfig: tableGlobalConfig.value, valid: false, footer: true },
135
+ otherConfig,
136
+ tableVmConfig.value
137
+ )
138
+ })
139
+ const tableFilterConfig = computed(() => Object.assign({ clearable: true, type: 'search', placeholder: '全局关键字搜索' }, tableVmConfig.value))
140
+ const tableSlots = computed(() => {
141
+ let disSlots = ['head', 'form', 'formLeft', 'formRight', 'toolbar', 'toolbarLeft', 'toolbarRight', 'pagerLeft', 'pagerRight']
142
+ return Object.keys(slots).filter(key => !disSlots.includes(key))
143
+ })
144
+
145
+ // 获取选中数据
146
+ const getSelectionData = () => {
147
+ return selectionRows.value || []
148
+ }
149
+ // 获取全部数据
150
+ const getFullData = () => {
151
+ let data = $vUtils.clone(tableRef.value.getTableData().fullData, true)
152
+ const columns = tableRef.value.getColumns()
153
+ let rnameColumns = columns.filter(col => col.rname)
154
+ rnameColumns.forEach(col => {
155
+ let { property, rname, rprops } = col
156
+ data.forEach(row => {
157
+ let cellValue = $vUtils.get(row, property)
158
+ if (!$vUtils.isNone(cellValue)) {
159
+ let { rvalue, rtext } = $vUtils.formatRender(cellValue, property, row, rname, rprops, proxy)
160
+ $vUtils.set(row, property, rtext)
161
+ }
162
+ })
163
+ })
164
+ return data
165
+ }
166
+ // 表格打印、导出统一导出前渲染数据
167
+ const getExportPrintDataByOption = (obj = {}, type) => {
168
+ let { options, content } = obj
169
+ let { data, columns, mode } = options
170
+ if (!data) {
171
+ options.data = mode === 'selected' ? getSelectionData() : getFullData()
172
+ }
173
+ return type === 'print' ? content : obj
174
+ }
175
+
176
+ // 默认求底部绑定方法vxe
177
+ const tableFooterMethod = ({ columns, data }) => {
178
+ const { footerCalculate } = props
179
+ let footerData = []
180
+ let footerCalculateList = footerCalculate.calculate || []
181
+ footerCalculateList.forEach(key => {
182
+ footerData.push(tableFooterCompute(columns, data, key, footerCalculate[key]))
183
+ })
184
+ return footerData
185
+ }
186
+ const tableFooterSpanMethod = ({ $rowIndex, column, $columnIndex, data }) => {
187
+ let defaultColumns = columnsConfigDefault.filter(item => tableGlobalConfig.value[item.type])
188
+ let colspan = defaultColumns.length || 1
189
+ if (column.type === 'seq') {
190
+ return { rowspan: 1, colspan: colspan }
191
+ } else if (column.type === 'checkbox' || column.type === 'radio') {
192
+ return { rowspan: 1, colspan: 0 }
193
+ }
194
+ return { rowspan: 1, colspan: 1 }
195
+ }
196
+
197
+ // -------- 表格
198
+ // 当前行变化
199
+ const onCurrentChange = params => {
200
+ tableCurrentRowData.value = params
201
+ emit('current-change', params)
202
+ }
203
+ // 单选框变化
204
+ const onRadioChange = params => {
205
+ selectionRows.value = [params.row]
206
+ emit('radio-change', selectionRows.value, params)
207
+ }
208
+ // 复选框变化
209
+ const onSelectionChange = params => {
210
+ let { records } = params
211
+ if (tableTreeConfig.value && tableTreeConfig.value?.transform) {
212
+ let keyField = tableTreeConfig.value?.rowField || props.rowConfig.keyField || '_XID'
213
+ let keyRowChild = '_X_ROW_CHILD'
214
+ let childRowsKeys = []
215
+ $vUtils.eachTree(records, row => {
216
+ if (row[keyRowChild] && row[keyRowChild].length > 0) {
217
+ row[keyRowChild].forEach(child => {
218
+ childRowsKeys.push(child[keyField])
219
+ })
220
+ }
221
+ })
222
+ records = records.filter(row => !childRowsKeys.includes(row[keyField]))
223
+ }
224
+ selectionRows.value = records
225
+ emit('selection-change', selectionRows.value, params)
226
+ }
227
+ // 单元格点击事件
228
+ const onCellClick = params => {
229
+ emit('cell-click', params)
230
+ }
231
+ // 单元格双击事件
232
+ const onCellDblClick = params => {
233
+ emit('cell-dblclick', params)
234
+ }
235
+ // 单元格双击事件
236
+ const onHeaderCellClick = params => {
237
+ emit('header-cell-click', params)
238
+ }
239
+ // 排序变化事件
240
+ const onSortChange = params => {
241
+ emit('sort-change', params)
242
+ }
243
+ // 过滤变化事件
244
+ const onFilterChange = params => {
245
+ emit('filter-change', params)
246
+ }
247
+ // 当行展开或收起时会触发该事件
248
+ const onToggleRowExpand = params => {
249
+ emit('toggle-row-expand', params)
250
+ }
251
+ // 当树节点展开或收起时会触发该事件
252
+ const onToggleTreeExpand = params => {
253
+ emit('toggle-tree-expand', params)
254
+ }
255
+ // 只对 edit-config 配置时有效,单元格编辑状态下被关闭时会触发该事件
256
+ const onEditClosed = params => {
257
+ // 此操作火狐浏览器(bug(vxe):编辑后不触发渲染器的blur问题)待后续修复,目前没有啥好办法
258
+ emit('edit-closed', params)
259
+ }
260
+ // 只对 edit-config 配置时有效,单元格被激活编辑时会触发该事件
261
+ const onEditActived = params => {
262
+ emit('edit-actived', params)
263
+ }
264
+ // 滚动事件
265
+ const onScroll = params => {
266
+ emit('scroll', params)
267
+ }
268
+ // 如果与工具栏关联,在自定义列按钮被手动点击后会触发该事件
269
+ const onCustom = params => {
270
+ emit('custom', params)
271
+ }
272
+ // 分页变化触发
273
+ const onPageChange = params => {
274
+ selectionRows.value = []
275
+ emit('page-change', params)
276
+ }
277
+
278
+ // -------- 工具栏
279
+ // 只对 toolbar.buttons 配置时有效,当左侧按钮被点击时会后触发该事件
280
+ const onToolbarButtonClick = params => {
281
+ emit('toolbar-button-click', params)
282
+ }
283
+ // 只对 toolbar.tools 配置时有效,当右侧工具被点击时会后触发该事件
284
+ const onToolbarToolClick = params => {
285
+ emit('toolbar-tool-click', params)
286
+ }
287
+
288
+ // -------- 搜索
289
+ // 表单展开全部/收起切换事件
290
+ const onFormCollapsed = value => {
291
+ setTimeout(() => {
292
+ tableRef.value.recalculate(true)
293
+ })
294
+ }
295
+ const onFormSubmit = () => {
296
+ emit('form-submit', props.queryData)
297
+ }
298
+ // 表单重置
299
+ const onFormReset = params => {
300
+ emit('form-reset', params)
301
+ }
302
+ // 表单项编辑回调
303
+ const onFormEditClosed = (obj, renderbox, $form) => {
304
+ emit('form-edit-closed', obj, renderbox, $form)
305
+ }
306
+ // 表单校验不通过
307
+ const onFormSubmitInvalid = obj => {
308
+ emit('form-submit-invalid', obj)
309
+ }
310
+
311
+ // // vxe组件方法可通过 tableRef 调用
312
+ // 表格导入方法
313
+ const setImportData = params => {
314
+ emit('import-confirm', params)
315
+ }
316
+
317
+ // 初始化生成新表头数据
318
+ const initTableColumns = (columns = []) => {
319
+ let rules = getFieldsRules(columns)
320
+ initEditRules(rules)
321
+ if (isGrid) {
322
+ let { columnsArr, columnsFlatArr, formItemsArr } = getTransfarFields(columns, tableColumnObjConfig.value, tableGlobalConfig.value.search)
323
+ tableColumnsFlat.value = columnsFlatArr
324
+ tableFormItems.value = formItemsArr
325
+ tableColumnsFixed.value = $vUtils.clone(columnsArr, true)
326
+ }
327
+ }
328
+ // 初始化验证规则
329
+ const initEditRules = rules => {
330
+ if (rules && $vUtils.isPlainObject(rules)) {
331
+ Object.keys(rules).forEach(key => {
332
+ if (tableEditRules.value[key]) {
333
+ tableEditRules.value[key] = Array.from(new Set(tableEditRules.value[key].concat(rules[key])))
334
+ } else {
335
+ tableEditRules.value[key] = rules[key]
336
+ }
337
+ })
338
+ }
339
+ }
340
+ // 初始化表头配置默认值
341
+ const initColsDefaultValue = () => {
342
+ let colsDefaultValue = {}
343
+ let colsFormulaValue = {}
344
+ $vUtils.eachTree(props.columns, item => {
345
+ let columnProps = item.renderProps || item.editRender?.props || item.cellRender?.props || {}
346
+ if (!$vUtils.isNone(columnProps.defaultValue)) {
347
+ colsDefaultValue[item.field] = columnProps.defaultValue
348
+ }
349
+ if (!$vUtils.isNone(columnProps.formula)) {
350
+ colsFormulaValue[item.field] = columnProps.formula
351
+ }
352
+ })
353
+ tableRowDefaultData.value = colsDefaultValue
354
+ if (Array.isArray(props.dataSourse)) {
355
+ props.dataSourse.forEach(row => {
356
+ if (Object.keys(colsDefaultValue).length > 0) {
357
+ Object.keys(colsDefaultValue).forEach(defaultKey => {
358
+ if ($vUtils.isNone($vUtils.get(row, defaultKey))) {
359
+ $vUtils.set(row, defaultKey, colsDefaultValue[defaultKey])
360
+ }
361
+ })
362
+ }
363
+ if (Object.keys(colsFormulaValue).length > 0) {
364
+ Object.keys(colsFormulaValue).forEach(formulaKey => {
365
+ let formulaValue = $vUtils.calculate(colsFormulaValue[formulaKey], row)
366
+ $vUtils.set(row, formulaKey, formulaValue)
367
+ })
368
+ }
369
+ })
370
+ }
371
+ }
372
+
373
+ // 全局搜索输入框事件
374
+ const handleTableFilter = obj => {
375
+ let filterText = tableFilterText.value
376
+ let filterData = null
377
+ if (filterText) {
378
+ let searchFields = []
379
+ let tableColumnsAll = tableRef.value.getColumns()
380
+ tableColumnsAll.forEach(col => {
381
+ let renderObj = col.cellRender || col.editRender || col.itemRender
382
+ let noSearchArr = ['$vGlobalOption', '$vImg', '$vCheckbox', '$vRadio', '$vUpload', '$vCode', 'seq', 'checkbox', 'radio']
383
+ if (col.property && renderObj && renderObj.name && !noSearchArr.includes(renderObj.name) && !noSearchArr.includes(col.type)) {
384
+ searchFields.push({ rkey: col.property, rname: renderObj.name, rprops: Object.assign({}, renderObj.props, col.rprops) })
385
+ }
386
+ })
387
+ filterData = $vUtils.searchTree(props.dataSourse, row => {
388
+ return searchFields.some(item => {
389
+ let cellValue = $vUtils.get(row, item.rkey)
390
+ if ($vxePluginNames.expendRenders && $vxePluginNames.expendRenders.includes(item.rname)) {
391
+ let { rtext } = $vUtils.formatRender(cellValue, item.rkey, row, item.rname, item.rprops, proxy)
392
+ return String(rtext).toLowerCase().indexOf(filterText) > -1
393
+ }
394
+ return $vUtils.trim(cellValue).toLowerCase().indexOf(filterText) > -1
395
+ })
396
+ })
397
+ }
398
+ if (tableFilterData.value === null && !filterText) {
399
+ return
400
+ }
401
+ tableFilterData.value = filterData
402
+ }
403
+ // 表格验证方法
404
+ const validate = (rows = true) => {
405
+ return tableRef.value.validate(rows)
406
+ }
407
+ // 刷新表格视图
408
+ const refreshRender = () => {
409
+ renderKey.value++
410
+ }
411
+ // 表格工具按钮点击
412
+ const handleTableTool = ({ code }) => {
413
+ switch (code) {
414
+ case 'addRow':
415
+ handleTableAddRow(null, undefined, true)
416
+ break
417
+ case 'deleteRow':
418
+ handleTableDeleteRow(null, true)
419
+ break
420
+ case 'import':
421
+ handleTableImportBtn()
422
+ break
423
+ case 'export':
424
+ handleTableExportBtn()
425
+ break
426
+ case 'print':
427
+ handleTablePrintBtn()
428
+ break
429
+ }
430
+ }
431
+ // 表格导出按钮
432
+ const handleTableExportBtn = options => {
433
+ if (typeof props.onExportMethod === 'function') {
434
+ return props.onExportMethod(options)
435
+ }
436
+ return tableRef.value.openExport(options)
437
+ }
438
+ // 表格导入按钮
439
+ const handleTableImportBtn = () => {
440
+ importVisible.value = true
441
+ }
442
+ // 表格打印按鈕
443
+ const handleTablePrintBtn = options => {
444
+ if (typeof props.onPrintMethod === 'function') {
445
+ return props.onPrintMethod(options)
446
+ }
447
+ return tableRef.value.openPrint(options)
448
+ }
449
+
450
+ // 自定义操作列点击事件
451
+ const handleGoptionClick = async (btnObj, dataObj) => {
452
+ if (btnObj.code === 'delete' || btnObj.idConfirm) {
453
+ await proxy.msgconfirm({ content: btnObj.ConfirmContent || `确定${btnObj.content}吗?` })
454
+ }
455
+ emit('globaloption', btnObj, dataObj)
456
+ }
457
+ // 新增行按钮
458
+ const handleTableAddRow = async (rows, index = -1, isTool = false) => {
459
+ let addRows = rows ? $vUtils.clone(rows, true) : tableRowDefaultData.value
460
+ if (!isTool && typeof props.onToolbarBtnAddBefore === 'function') {
461
+ addRows = await props.onToolbarBtnAddBefore(addRows)
462
+ }
463
+ // 删除主键,以防排序冲突
464
+ let mainKeyField = props.rowConfig?.keyField || '_XID'
465
+ if (Array.isArray(addRows)) {
466
+ addRows.forEach(item => {
467
+ delete item[mainKeyField]
468
+ })
469
+ } else {
470
+ delete addRows[mainKeyField]
471
+ }
472
+ let { row: newRow } = await tableRef.value.insertAt(addRows, index)
473
+ await tableRef.value.setActiveRow(newRow)
474
+ if (!isTool) emit('toolbaroption', 'add', newRow, tableRef.value)
475
+ }
476
+ // 删除行按钮
477
+ const handleTableDeleteRow = async (rows, isTool = false) => {
478
+ let deleteRows = rows
479
+ if (isTool) {
480
+ let selectedRows = getSelectionData()
481
+ if (selectedRows.length < 1) {
482
+ proxy.msgwarning('请选择要删除的行!')
483
+ return
484
+ }
485
+ deleteRows = selectedRows
486
+ await proxy.msgconfirm({ content: `确定删除吗?` })
487
+ } else if (typeof props.onToolbarBtnDeleteBefore === 'function') {
488
+ let result = await props.onToolbarBtnDeleteBefore(deleteRows)
489
+ if (!result) return
490
+ }
491
+ await tableRef.value.remove(deleteRows)
492
+ if (selectionRows.value && selectionRows.value.length > 0) {
493
+ let keyField = props.rowConfig.keyField || proxy.$vTableSetup.table.rowConfig.keyField
494
+ selectionRows.value = selectionRows.value.filter(sr => !deleteRows.find(dr => dr[keyField] === sr[keyField]))
495
+ }
496
+ if (!isTool) emit('toolbaroption', 'delete', deleteRows, tableRef.value)
497
+ }
498
+
499
+ watch(
500
+ () => props.columns,
501
+ value => {
502
+ initTableColumns(value)
503
+ },
504
+ {
505
+ deep: true,
506
+ immediate: true
507
+ }
508
+ )
509
+ watch(
510
+ () => props.dataSourse,
511
+ value => {
512
+ initColsDefaultValue()
513
+ selectionRows.value = []
514
+ },
515
+ {
516
+ immediate: true
517
+ }
518
+ )
519
+ watch(
520
+ () => props.editRules,
521
+ value => {
522
+ initEditRules(value)
523
+ },
524
+ {
525
+ deep: true,
526
+ immediate: true
527
+ }
528
+ )
529
+
530
+ return {
531
+ slots,
532
+ tableRef,
533
+ renderKey,
534
+ wrapHeight,
535
+ tableGlobalConfig,
536
+ tableColumns,
537
+ tableColumnConfig,
538
+ tableColumnObjConfig,
539
+ tableCheckboxConfig,
540
+ tableTreeConfig,
541
+ tableSeqConfig,
542
+ tableEditConfig,
543
+ tableEditRules,
544
+ tablePagerConfig,
545
+ tableExportConfig,
546
+ tablePrintConfig,
547
+ tableQueryConfig,
548
+ tableFilterText,
549
+ tableFilterConfig,
550
+ tableFilterData,
551
+ tableViewData,
552
+ tableTools,
553
+ tableSlots,
554
+ selectionRows,
555
+ importVisible,
556
+ columnsConfigDefault,
557
+ tableFooterMethod,
558
+ tableFooterSpanMethod,
559
+ onCurrentChange,
560
+ onRadioChange,
561
+ onSelectionChange,
562
+ onCellClick,
563
+ onCellDblClick,
564
+ onHeaderCellClick,
565
+ onSortChange,
566
+ onFilterChange,
567
+ onToggleRowExpand,
568
+ onToggleTreeExpand,
569
+ onEditClosed,
570
+ onEditActived,
571
+ onScroll,
572
+ onCustom,
573
+ onPageChange,
574
+ onToolbarButtonClick,
575
+ onToolbarToolClick,
576
+ handleGoptionClick,
577
+ onFormSubmit,
578
+ onFormReset,
579
+ onFormCollapsed,
580
+ onFormEditClosed,
581
+ handleTableFilter,
582
+ handleTableTool,
583
+ setImportData,
584
+ refreshRender,
585
+ validate,
586
+ getSelectionData,
587
+ getFullData,
588
+ handleTableAddRow,
589
+ handleTableDeleteRow,
590
+ turnColumnItemFilters
591
+ }
592
+ }