sh-view 2.8.1 → 2.8.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.
Files changed (91) hide show
  1. package/.eslintrc.js +25 -20
  2. package/other.js +8 -8
  3. package/package.json +9 -6
  4. package/packages/components/index.js +91 -91
  5. package/packages/components/sh-alert/alert.ts +30 -0
  6. package/packages/components/sh-alert/index.vue +143 -168
  7. package/packages/components/sh-badge/index.vue +242 -242
  8. package/packages/components/sh-calendar/index.vue +650 -650
  9. package/packages/components/sh-card/index.vue +148 -148
  10. package/packages/components/sh-code-editor/index.vue +19 -19
  11. package/packages/components/sh-col/index.vue +92 -92
  12. package/packages/components/sh-corner/index.vue +230 -230
  13. package/packages/components/sh-count-to/index.vue +131 -131
  14. package/packages/components/sh-date/index.vue +301 -301
  15. package/packages/components/sh-drawer/index.vue +579 -579
  16. package/packages/components/sh-drawer/scrollbar.js +78 -78
  17. package/packages/components/sh-empty/index.vue +42 -42
  18. package/packages/components/sh-form/js/props.js +76 -76
  19. package/packages/components/sh-form/js/useForm.js +229 -229
  20. package/packages/components/sh-header/index.vue +261 -260
  21. package/packages/components/sh-icon/css/default/ionicons.svg +869 -869
  22. package/packages/components/sh-icon/css/font/iconfont.json +247 -247
  23. package/packages/components/sh-icon/index.vue +41 -41
  24. package/packages/components/sh-image/index.vue +133 -133
  25. package/packages/components/sh-list/index.vue +146 -146
  26. package/packages/components/sh-loading/index.vue +53 -53
  27. package/packages/components/sh-modal/index.vue +188 -188
  28. package/packages/components/sh-noticebar/index.vue +215 -215
  29. package/packages/components/sh-poptip/index.vue +597 -597
  30. package/packages/components/sh-progress/index.vue +276 -276
  31. package/packages/components/sh-pull-refresh/index.vue +289 -289
  32. package/packages/components/sh-result/index.vue +114 -114
  33. package/packages/components/sh-row/index.vue +66 -66
  34. package/packages/components/sh-split/components/trigger.vue +33 -33
  35. package/packages/components/sh-split/index.vue +342 -342
  36. package/packages/components/sh-table/components/importModal.vue +363 -363
  37. package/packages/components/sh-table/components/sh-column.vue +68 -68
  38. package/packages/components/sh-table/js/excel_to_json.js +313 -313
  39. package/packages/components/sh-table/js/props.js +305 -305
  40. package/packages/components/sh-table/js/tableMethods.js +167 -167
  41. package/packages/components/sh-table/js/useTable.js +636 -636
  42. package/packages/components/sh-table/table.vue +217 -217
  43. package/packages/components/sh-tabs/index.vue +426 -426
  44. package/packages/components/sh-tag/index.vue +168 -168
  45. package/packages/components/sh-toolbar/index.vue +182 -182
  46. package/packages/components/sh-tree/components/table-tree.vue +289 -289
  47. package/packages/components/sh-tree/mixin/treeProps.js +122 -122
  48. package/packages/components/sh-upload/index.vue +535 -535
  49. package/packages/components/sh-water-fall/index.vue +80 -80
  50. package/packages/components/sh-water-mark/index.vue +96 -96
  51. package/packages/css/index.js +4 -4
  52. package/packages/directive/index.js +19 -19
  53. package/packages/directive/module/click-out.js +14 -14
  54. package/packages/directive/module/draggable.js +42 -42
  55. package/packages/directive/module/line-clamp.js +22 -22
  56. package/packages/directive/module/prevent-click.js +18 -18
  57. package/packages/directive/module/resize.js +14 -14
  58. package/packages/directive/module/ripple.js +166 -166
  59. package/packages/index.js +39 -39
  60. package/packages/mixin/index.js +86 -86
  61. package/packages/other/sh-cron-modal/components/cron-content.vue +294 -294
  62. package/packages/other/sh-cron-modal/index.vue +81 -81
  63. package/packages/other/sh-cron-modal/mixin/cron-emits.js +1 -1
  64. package/packages/other/sh-cron-modal/mixin/cron-props.js +9 -9
  65. package/packages/other/sh-cron-modal/tabs/cron-week-box.vue +126 -126
  66. package/packages/other/sh-menu/index.vue +326 -326
  67. package/packages/other/sh-menu/menu-group-content.vue +136 -136
  68. package/packages/other/sh-menu/menu-item-content.vue +71 -71
  69. package/packages/other/sh-menu-card/index.vue +250 -250
  70. package/packages/other/sh-menu-card/menu-box.vue +87 -87
  71. package/packages/other/sh-preview/components/sh-excel.vue +163 -163
  72. package/packages/other/sh-preview/js/data-hook.js +41 -41
  73. package/packages/other/sh-preview/js/data-props.js +15 -15
  74. package/packages/other/sh-system-tip/index.vue +115 -115
  75. package/packages/utils/resize.js +69 -70
  76. package/packages/utils/transfer-queue.js +12 -12
  77. package/packages/vxeTable/index.js +193 -184
  78. package/packages/vxeTable/plugins/export.js +450 -450
  79. package/packages/vxeTable/render/cell/vxe-render-img.vue +27 -27
  80. package/packages/vxeTable/render/cell/vxe-render-table.vue +51 -51
  81. package/packages/vxeTable/render/cell/vxe-render-time.vue +44 -44
  82. package/packages/vxeTable/render/cell/vxe-render-tree.vue +70 -70
  83. package/packages/vxeTable/render/filters/vxe-filter-input.vue +26 -26
  84. package/packages/vxeTable/render/filters/vxe-filter-time.vue +26 -26
  85. package/packages/vxeTable/render/globalRenders.jsx +514 -514
  86. package/packages/vxeTable/render/mixin/cell-hooks.js +198 -198
  87. package/packages/vxeTable/render/mixin/cell-props.js +23 -23
  88. package/packages/vxeTable/render/mixin/filter-hooks.js +46 -46
  89. package/tsconfig.json +25 -0
  90. package/types/component.d.ts +1 -0
  91. package/types/index.ts +0 -0
@@ -1,289 +1,289 @@
1
- <template>
2
- <sh-result v-if="queryErrorText" class="sh-tree-result" type="error" :title="false" :text="queryErrorText"></sh-result>
3
- <vxe-grid
4
- v-else
5
- ref="tableRef"
6
- :key="renderKey"
7
- :class="{ 'sh-vxe-tree-table': true, 'is--hidecheck': globalConfig.checkHide }"
8
- v-bind="tableConfigIn"
9
- @radio-change="onRadioChange"
10
- @checkbox-change="onSelectionChange"
11
- @checkbox-all="onSelectionChange">
12
- <template #treeNodeCell="scoped">
13
- <span>{{ getTreeNodeCellContent(scoped) }}</span>
14
- </template>
15
- <template #empty>
16
- <sh-empty :icon="emptyIcon" :content="emptyText"></sh-empty>
17
- </template>
18
- </vxe-grid>
19
- </template>
20
-
21
- <script>
22
- import { defineComponent, computed, getCurrentInstance, ref, watch, onMounted } from 'vue'
23
- // 树组件表格默认配置
24
- const tableConfigDefault = {
25
- autoResize: true,
26
- stripe: false,
27
- size: 'small', // medium / small / mini
28
- border: 'inner',
29
- showHeader: false,
30
- showFooter: false,
31
- showOverflow: true,
32
- resizeConfig: {
33
- refreshDelay: 100
34
- },
35
- columnConfig: {
36
- width: 120
37
- },
38
- scrollX: {
39
- enabled: true,
40
- gt: 20
41
- },
42
- scrollY: {
43
- enabled: true,
44
- gt: 20
45
- }
46
- }
47
- import mixinProps from '../mixin/treeProps'
48
- export default defineComponent({
49
- name: 'TableTree',
50
- props: {
51
- ...mixinProps
52
- },
53
- emits: ['select', 'datacall'],
54
- setup(props, context) {
55
- const { proxy } = getCurrentInstance()
56
- const { $vUtils, $http, $vxePluginNames } = proxy
57
- const { emit, slots } = context
58
-
59
- const tableRef = ref()
60
- const renderKey = ref(1)
61
- const filterData = ref(null)
62
- const treeServerComplate = ref(false)
63
- const treeLoading = ref(false)
64
- const treeData = ref(props.options)
65
- const treeValue = ref([])
66
- const queryCacheParams = ref(null)
67
- const queryErrorText = ref(null)
68
-
69
- const checkWidth = computed(() => {
70
- return props.globalConfig.columns ? props.globalConfig?.defaultWidth || 150 : '100%'
71
- })
72
- const checkColumnProps = computed(() => {
73
- let resultProps = { field: props.labelField, width: checkWidth.value, type: props.multiple ? 'checkbox' : 'radio', treeNode: true, slots: { default: 'treeNodeCell' } }
74
- resultProps.title = props.labelTitle || props.multiple ? '全部' : ''
75
- return resultProps
76
- })
77
- const tableProps = computed(() => {
78
- return {
79
- height: props.isSelect ? '100%' : props.height,
80
- size: props.size,
81
- loading: props.loading || treeLoading.value,
82
- data: filterData.value || treeData.value,
83
- columns: [checkColumnProps.value].concat(props.globalConfig?.columns || [])
84
- }
85
- })
86
- const tableConfigIn = computed(() => {
87
- let resultConfig = {
88
- rowConfig: { isCurrent: false, keyField: props.nodeKey },
89
- radioConfig: { checkRowKey: props.modelValue[0], labelField: props.labelField, checkMethod: tableCheckMethods },
90
- checkboxConfig: { checkRowKeys: props.modelValue, labelField: props.labelField, checkMethod: tableCheckMethods },
91
- treeConfig: { rowField: props.nodeKey },
92
- editConfig: { enabled: false }
93
- }
94
- resultConfig = $vUtils.merge(resultConfig, tableConfigDefault, props.globalConfig)
95
- if (props.multiple) {
96
- if (props.globalConfig.hasAll) resultConfig.showHeader = true
97
- resultConfig.radioConfig = null
98
- } else {
99
- resultConfig.checkboxConfig = null
100
- }
101
- return Object.assign(resultConfig, tableProps.value)
102
- })
103
-
104
- const initMounted = async () => {
105
- // 初始化获取服务配置数据
106
- await getServerConfigDataSourse()
107
- initSelection()
108
- }
109
- // 获取请求配置数据
110
- const getServerConfigDataSourse = async () => {
111
- const { serverConfig, serverParams, parseParams, serverCache, valueData, globalConfig, multiple, nodeKey, labelField } = props
112
- if (!serverConfig.url) {
113
- treeServerComplate.value = true
114
- return true
115
- }
116
- let params = $vUtils.clone(serverParams, true)
117
- if (parseParams && typeof parseParams === 'function') {
118
- params = parseParams(params)
119
- }
120
- Object.keys(params).forEach(key => {
121
- if ($vUtils.getFormatKeys(params[key]).length > 0) {
122
- params[key] = $vUtils.format(params[key], valueData)
123
- }
124
- })
125
- if (!$vUtils.isEqual(queryCacheParams.value, params)) {
126
- treeServerComplate.value = false
127
- }
128
- if (serverCache && treeServerComplate.value) {
129
- return true
130
- }
131
- queryErrorText.value = null
132
- queryCacheParams.value = params
133
- treeLoading.value = true
134
- let reqOptions = {
135
- baseURL: serverConfig.baseURL
136
- }
137
- try {
138
- let method = serverConfig?.type ? serverConfig.type.toLowerCase() : 'post'
139
- let treeRes = await $http[method](serverConfig.url, params, reqOptions)
140
- if (treeRes && [10000, 100000].includes(+treeRes.code)) {
141
- let treeAllNode = globalConfig?.hasAll && !multiple ? [{ [nodeKey]: 0, [labelField]: '全部', isleaf: 1, code: '' }] : []
142
- let treeResData = treeAllNode.concat(treeRes.data)
143
- if (globalConfig?.treeConfig?.transform) {
144
- treeResData = $vUtils.toTreeArray(treeResData, { clear: true })
145
- }
146
- treeData.value = treeResData
147
- } else {
148
- throw new Error(`树节点信息获取失败:${treeRes?.message}`)
149
- }
150
- } catch (e) {
151
- queryErrorText.value = e.message || e
152
- }
153
- treeLoading.value = false
154
- treeServerComplate.value = true
155
- }
156
- const initSelection = isWatch => {
157
- let { modelValue, isSelect } = props
158
- let nodeKey = props.nodeKey || 'id'
159
- setTimeout(() => {
160
- if (!tableRef.value || !modelValue?.length) return
161
- if (isWatch) {
162
- if (!$vUtils.isEqual(modelValue, treeValue.value)) renderKey.value++
163
- } else {
164
- tableRef.value.scrollToRow({ [nodeKey]: modelValue[0] })
165
- }
166
- })
167
- }
168
- // 单选框变化
169
- const onRadioChange = obj => {
170
- let nodeKey = props.nodeKey || 'id'
171
- let { newValue } = obj
172
- let selectedKeys = []
173
- if (newValue && (newValue[nodeKey] || newValue[nodeKey] === 0)) {
174
- selectedKeys.push(newValue[nodeKey])
175
- }
176
- treeSelectedChange(selectedKeys, newValue ? [newValue] : [], obj)
177
- }
178
- // 复选框变化
179
- const onSelectionChange = obj => {
180
- let nodeKey = props.nodeKey || 'id'
181
- let { records = [] } = obj
182
- let selectedKeys = []
183
- if (Array.isArray(records) && records.length > 0) {
184
- selectedKeys = records.map(item => item[nodeKey])
185
- }
186
- treeSelectedChange(selectedKeys, records, obj)
187
- }
188
- // 树变化提交
189
- const treeSelectedChange = (selectedKeys, selectedRows, obj) => {
190
- treeValue.value = selectedKeys
191
- emit('select', selectedKeys, selectedRows, obj)
192
- }
193
- // 全局搜索过滤事件
194
- const handleMyTableFilter = text => {
195
- const { labelField, labelFormat } = props
196
- let filterText = $vUtils.toValueString(text).trim().toLowerCase()
197
- let searchData = null
198
- if (filterText) {
199
- let noSearchArr = ['$vGlobalOption', '$vImg', '$vCheckbox', '$vRadio', '$vUpload', '$vCode', 'seq', 'checkbox', 'radio']
200
- const searchProps = [{ rkey: labelField, rname: '', rprops: {}, format: labelFormat }]
201
- let tableColumnsAll = tableRef.value.getColumns()
202
- tableColumnsAll.forEach(col => {
203
- let renderObj = col.cellRender || col.editRender || col.itemRender
204
- if (col.property && renderObj && renderObj.name && !noSearchArr.includes(renderObj.name) && !noSearchArr.includes(col.type)) {
205
- searchProps.push({ rkey: col.property, rname: renderObj.name, rprops: Object.assign({}, renderObj.props, col.rprops) })
206
- }
207
- })
208
- searchData = $vUtils.searchTree(treeData.value, row => {
209
- return searchProps.some(item => {
210
- let cellValue = $vUtils.get(row, item.rkey)
211
- let { rtext } = $vUtils.formatRender(cellValue, item.rkey, row, item.rname, item.rprops, proxy)
212
- return $vUtils.trim(rtext).toLowerCase().indexOf(filterText) > -1
213
- })
214
- })
215
- }
216
- if (filterData.value === null && !filterText) {
217
- return
218
- }
219
- filterData.value = searchData
220
- if (filterData.value && filterData.value.length > 0) {
221
- tableRef.value.setTreeExpand(filterData.value[0], true)
222
- }
223
- }
224
- // 获取选中的数据
225
- const getSelectionData = () => {
226
- return tableRef.value.getCheckboxRecords()
227
- }
228
- const tableCheckMethods = ({ row }) => {
229
- if (props.isLeaf && !props.multiple) {
230
- return +row.isleaf === 1 || +row.isLeaf === 1
231
- }
232
- return true
233
- }
234
- const getTreeNodeCellContent = ({ row, column }) => {
235
- if (props.labelFormat) {
236
- return $vUtils.format(props.labelFormat, row)
237
- }
238
- return $vUtils.get(row, column.property)
239
- }
240
-
241
- const filterChangeDebounce = $vUtils.debounce(handleMyTableFilter, 500)
242
-
243
- watch(
244
- () => props.modelValue,
245
- () => {
246
- initSelection(true)
247
- }
248
- )
249
- watch(
250
- () => props.filterText,
251
- nv => {
252
- filterChangeDebounce(nv)
253
- },
254
- { deep: true, immediate: true }
255
- )
256
- watch(
257
- () => props.options,
258
- nv => {
259
- treeData.value = nv
260
- },
261
- { immediate: true }
262
- )
263
- watch(
264
- () => treeData.value,
265
- nv => {
266
- emit('datacall', nv)
267
- },
268
- { immediate: true }
269
- )
270
-
271
- onMounted(() => {
272
- initMounted()
273
- })
274
-
275
- return {
276
- tableRef,
277
- renderKey,
278
- treeServerComplate,
279
- queryErrorText,
280
- tableConfigIn,
281
- onRadioChange,
282
- onSelectionChange,
283
- getTreeNodeCellContent
284
- }
285
- }
286
- })
287
- </script>
288
-
289
- <style lang="scss" scoped></style>
1
+ <template>
2
+ <sh-result v-if="queryErrorText" class="sh-tree-result" type="error" :title="false" :text="queryErrorText"></sh-result>
3
+ <vxe-grid
4
+ v-else
5
+ ref="tableRef"
6
+ :key="renderKey"
7
+ :class="{ 'sh-vxe-tree-table': true, 'is--hidecheck': globalConfig.checkHide }"
8
+ v-bind="tableConfigIn"
9
+ @radio-change="onRadioChange"
10
+ @checkbox-change="onSelectionChange"
11
+ @checkbox-all="onSelectionChange">
12
+ <template #treeNodeCell="scoped">
13
+ <span>{{ getTreeNodeCellContent(scoped) }}</span>
14
+ </template>
15
+ <template #empty>
16
+ <sh-empty :icon="emptyIcon" :content="emptyText"></sh-empty>
17
+ </template>
18
+ </vxe-grid>
19
+ </template>
20
+
21
+ <script>
22
+ import { defineComponent, computed, getCurrentInstance, ref, watch, onMounted } from 'vue'
23
+ // 树组件表格默认配置
24
+ const tableConfigDefault = {
25
+ autoResize: true,
26
+ stripe: false,
27
+ size: 'small', // medium / small / mini
28
+ border: 'inner',
29
+ showHeader: false,
30
+ showFooter: false,
31
+ showOverflow: true,
32
+ resizeConfig: {
33
+ refreshDelay: 100
34
+ },
35
+ columnConfig: {
36
+ width: 120
37
+ },
38
+ scrollX: {
39
+ enabled: true,
40
+ gt: 20
41
+ },
42
+ scrollY: {
43
+ enabled: true,
44
+ gt: 20
45
+ }
46
+ }
47
+ import mixinProps from '../mixin/treeProps'
48
+ export default defineComponent({
49
+ name: 'TableTree',
50
+ props: {
51
+ ...mixinProps
52
+ },
53
+ emits: ['select', 'datacall'],
54
+ setup(props, context) {
55
+ const { proxy } = getCurrentInstance()
56
+ const { $vUtils, $http, $vxePluginNames } = proxy
57
+ const { emit, slots } = context
58
+
59
+ const tableRef = ref()
60
+ const renderKey = ref(1)
61
+ const filterData = ref(null)
62
+ const treeServerComplate = ref(false)
63
+ const treeLoading = ref(false)
64
+ const treeData = ref(props.options)
65
+ const treeValue = ref([])
66
+ const queryCacheParams = ref(null)
67
+ const queryErrorText = ref(null)
68
+
69
+ const checkWidth = computed(() => {
70
+ return props.globalConfig.columns ? props.globalConfig?.defaultWidth || 150 : '100%'
71
+ })
72
+ const checkColumnProps = computed(() => {
73
+ let resultProps = { field: props.labelField, width: checkWidth.value, type: props.multiple ? 'checkbox' : 'radio', treeNode: true, slots: { default: 'treeNodeCell' } }
74
+ resultProps.title = props.labelTitle || props.multiple ? '全部' : ''
75
+ return resultProps
76
+ })
77
+ const tableProps = computed(() => {
78
+ return {
79
+ height: props.isSelect ? '100%' : props.height,
80
+ size: props.size,
81
+ loading: props.loading || treeLoading.value,
82
+ data: filterData.value || treeData.value,
83
+ columns: [checkColumnProps.value].concat(props.globalConfig?.columns || [])
84
+ }
85
+ })
86
+ const tableConfigIn = computed(() => {
87
+ let resultConfig = {
88
+ rowConfig: { isCurrent: false, keyField: props.nodeKey },
89
+ radioConfig: { checkRowKey: props.modelValue[0], labelField: props.labelField, checkMethod: tableCheckMethods },
90
+ checkboxConfig: { checkRowKeys: props.modelValue, labelField: props.labelField, checkMethod: tableCheckMethods },
91
+ treeConfig: { rowField: props.nodeKey },
92
+ editConfig: { enabled: false }
93
+ }
94
+ resultConfig = $vUtils.merge(resultConfig, tableConfigDefault, props.globalConfig)
95
+ if (props.multiple) {
96
+ if (props.globalConfig.hasAll) resultConfig.showHeader = true
97
+ resultConfig.radioConfig = null
98
+ } else {
99
+ resultConfig.checkboxConfig = null
100
+ }
101
+ return Object.assign(resultConfig, tableProps.value)
102
+ })
103
+
104
+ const initMounted = async () => {
105
+ // 初始化获取服务配置数据
106
+ await getServerConfigDataSourse()
107
+ initSelection()
108
+ }
109
+ // 获取请求配置数据
110
+ const getServerConfigDataSourse = async () => {
111
+ const { serverConfig, serverParams, parseParams, serverCache, valueData, globalConfig, multiple, nodeKey, labelField } = props
112
+ if (!serverConfig.url) {
113
+ treeServerComplate.value = true
114
+ return true
115
+ }
116
+ let params = $vUtils.clone(serverParams, true)
117
+ if (parseParams && typeof parseParams === 'function') {
118
+ params = parseParams(params)
119
+ }
120
+ Object.keys(params).forEach(key => {
121
+ if ($vUtils.getFormatKeys(params[key]).length > 0) {
122
+ params[key] = $vUtils.format(params[key], valueData)
123
+ }
124
+ })
125
+ if (!$vUtils.isEqual(queryCacheParams.value, params)) {
126
+ treeServerComplate.value = false
127
+ }
128
+ if (serverCache && treeServerComplate.value) {
129
+ return true
130
+ }
131
+ queryErrorText.value = null
132
+ queryCacheParams.value = params
133
+ treeLoading.value = true
134
+ let reqOptions = {
135
+ baseURL: serverConfig.baseURL
136
+ }
137
+ try {
138
+ let method = serverConfig?.type ? serverConfig.type.toLowerCase() : 'post'
139
+ let treeRes = await $http[method](serverConfig.url, params, reqOptions)
140
+ if (treeRes && [10000, 100000].includes(+treeRes.code)) {
141
+ let treeAllNode = globalConfig?.hasAll && !multiple ? [{ [nodeKey]: 0, [labelField]: '全部', isleaf: 1, code: '' }] : []
142
+ let treeResData = treeAllNode.concat(treeRes.data)
143
+ if (globalConfig?.treeConfig?.transform) {
144
+ treeResData = $vUtils.toTreeArray(treeResData, { clear: true })
145
+ }
146
+ treeData.value = treeResData
147
+ } else {
148
+ throw new Error(`树节点信息获取失败:${treeRes?.message}`)
149
+ }
150
+ } catch (e) {
151
+ queryErrorText.value = e.message || e
152
+ }
153
+ treeLoading.value = false
154
+ treeServerComplate.value = true
155
+ }
156
+ const initSelection = isWatch => {
157
+ let { modelValue, isSelect } = props
158
+ let nodeKey = props.nodeKey || 'id'
159
+ setTimeout(() => {
160
+ if (!tableRef.value || !modelValue?.length) return
161
+ if (isWatch) {
162
+ if (!$vUtils.isEqual(modelValue, treeValue.value)) renderKey.value++
163
+ } else {
164
+ tableRef.value.scrollToRow({ [nodeKey]: modelValue[0] })
165
+ }
166
+ })
167
+ }
168
+ // 单选框变化
169
+ const onRadioChange = obj => {
170
+ let nodeKey = props.nodeKey || 'id'
171
+ let { newValue } = obj
172
+ let selectedKeys = []
173
+ if (newValue && (newValue[nodeKey] || newValue[nodeKey] === 0)) {
174
+ selectedKeys.push(newValue[nodeKey])
175
+ }
176
+ treeSelectedChange(selectedKeys, newValue ? [newValue] : [], obj)
177
+ }
178
+ // 复选框变化
179
+ const onSelectionChange = obj => {
180
+ let nodeKey = props.nodeKey || 'id'
181
+ let { records = [] } = obj
182
+ let selectedKeys = []
183
+ if (Array.isArray(records) && records.length > 0) {
184
+ selectedKeys = records.map(item => item[nodeKey])
185
+ }
186
+ treeSelectedChange(selectedKeys, records, obj)
187
+ }
188
+ // 树变化提交
189
+ const treeSelectedChange = (selectedKeys, selectedRows, obj) => {
190
+ treeValue.value = selectedKeys
191
+ emit('select', selectedKeys, selectedRows, obj)
192
+ }
193
+ // 全局搜索过滤事件
194
+ const handleMyTableFilter = text => {
195
+ const { labelField, labelFormat } = props
196
+ let filterText = $vUtils.toValueString(text).trim().toLowerCase()
197
+ let searchData = null
198
+ if (filterText) {
199
+ let noSearchArr = ['$vGlobalOption', '$vImg', '$vCheckbox', '$vRadio', '$vUpload', '$vCode', 'seq', 'checkbox', 'radio']
200
+ const searchProps = [{ rkey: labelField, rname: '', rprops: {}, format: labelFormat }]
201
+ let tableColumnsAll = tableRef.value.getColumns()
202
+ tableColumnsAll.forEach(col => {
203
+ let renderObj = col.cellRender || col.editRender || col.itemRender
204
+ if (col.property && renderObj && renderObj.name && !noSearchArr.includes(renderObj.name) && !noSearchArr.includes(col.type)) {
205
+ searchProps.push({ rkey: col.property, rname: renderObj.name, rprops: Object.assign({}, renderObj.props, col.rprops) })
206
+ }
207
+ })
208
+ searchData = $vUtils.searchTree(treeData.value, row => {
209
+ return searchProps.some(item => {
210
+ let cellValue = $vUtils.get(row, item.rkey)
211
+ let { rtext } = $vUtils.formatRender(cellValue, item.rkey, row, item.rname, item.rprops, proxy)
212
+ return $vUtils.trim(rtext).toLowerCase().indexOf(filterText) > -1
213
+ })
214
+ })
215
+ }
216
+ if (filterData.value === null && !filterText) {
217
+ return
218
+ }
219
+ filterData.value = searchData
220
+ if (filterData.value && filterData.value.length > 0) {
221
+ tableRef.value.setTreeExpand(filterData.value[0], true)
222
+ }
223
+ }
224
+ // 获取选中的数据
225
+ const getSelectionData = () => {
226
+ return tableRef.value.getCheckboxRecords()
227
+ }
228
+ const tableCheckMethods = ({ row }) => {
229
+ if (props.isLeaf && !props.multiple) {
230
+ return +row.isleaf === 1 || +row.isLeaf === 1
231
+ }
232
+ return true
233
+ }
234
+ const getTreeNodeCellContent = ({ row, column }) => {
235
+ if (props.labelFormat) {
236
+ return $vUtils.format(props.labelFormat, row)
237
+ }
238
+ return $vUtils.get(row, column.property)
239
+ }
240
+
241
+ const filterChangeDebounce = $vUtils.debounce(handleMyTableFilter, 500)
242
+
243
+ watch(
244
+ () => props.modelValue,
245
+ () => {
246
+ initSelection(true)
247
+ }
248
+ )
249
+ watch(
250
+ () => props.filterText,
251
+ nv => {
252
+ filterChangeDebounce(nv)
253
+ },
254
+ { deep: true, immediate: true }
255
+ )
256
+ watch(
257
+ () => props.options,
258
+ nv => {
259
+ treeData.value = nv
260
+ },
261
+ { immediate: true }
262
+ )
263
+ watch(
264
+ () => treeData.value,
265
+ nv => {
266
+ emit('datacall', nv)
267
+ },
268
+ { immediate: true }
269
+ )
270
+
271
+ onMounted(() => {
272
+ initMounted()
273
+ })
274
+
275
+ return {
276
+ tableRef,
277
+ renderKey,
278
+ treeServerComplate,
279
+ queryErrorText,
280
+ tableConfigIn,
281
+ onRadioChange,
282
+ onSelectionChange,
283
+ getTreeNodeCellContent
284
+ }
285
+ }
286
+ })
287
+ </script>
288
+
289
+ <style lang="scss" scoped></style>