sh-view 2.1.0 → 2.2.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 +54 -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 +269 -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
@@ -1,195 +1,218 @@
1
- <template>
2
- <div class="sh-tree" :class="[isSelect ? 'direct' : 'select']" :style="{ height: wrapHeight }">
3
- <template v-if="isSelect">
4
- <vxe-pulldown ref="treeSelect" class="sh-tree-select" v-bind="selectConfigIn" @hide-panel="onHidePanel">
5
- <template #default>
6
- <div class="sh-tree-select-input">
7
- <vxe-input ref="treeSelectInput" :model-value="getTreeInputValue()" v-bind="selectInputConfigIn" readonly @focus="onFocus" @clear="onClear"></vxe-input>
8
- </div>
9
- </template>
10
- <template #dropdown>
11
- <div v-if="filter" class="sh-tree-filter">
12
- <vxe-input ref="filterInput" v-model="filterTextIn" class="sh-tree-filter-input" v-bind="filterInputConfigIn"></vxe-input>
13
- </div>
14
- <div class="sh-tree-select-dropdown-content">
15
- <table-tree v-if="pulldownDrop" v-bind="tableTreeProps" @datacall="onDataCall" @select="onChange"></table-tree>
16
- <div v-else class="tree-skeleton"></div>
17
- </div>
18
- </template>
19
- </vxe-pulldown>
20
- </template>
21
- <template v-else>
22
- <div v-if="filter" class="sh-tree-filter">
23
- <vxe-input ref="filterInput" v-model="filterTextIn" class="sh-tree-filter-input" v-bind="filterInputConfigIn"></vxe-input>
24
- </div>
25
- <div class="sh-tree-content" :class="{ 'has-filter': filter }">
26
- <table-tree v-bind="tableTreeProps" @datacall="onDataCall" @select="onChange"></table-tree>
27
- </div>
28
- </template>
29
- </div>
30
- </template>
31
-
32
- <script>
33
- import './css/index.scss'
34
- import mixinProps from './mixin/treeProps'
35
- import tableTree from './components/table-tree.vue'
36
- export default {
37
- name: 'ShTree',
38
- components: {
39
- tableTree
40
- },
41
- mixins: [mixinProps],
42
- emits: ['update:modelValue', 'change', 'focus', 'blur'],
43
- data() {
44
- return {
45
- // 公共属性
46
- filterTextIn: this.filterText,
47
- selectedKeys: this.modelValue,
48
- selectedData: [],
49
- treeData: this.options,
50
- // 下拉专属属性
51
- pulldownDrop: false // 由于hidePanel延迟350ms关闭,体验不好,这里使用自定义开关
52
- }
53
- },
54
- computed: {
55
- wrapHeight() {
56
- return [100, '100%', 'auto'].includes(this.height) ? '100%' : 'auto'
57
- },
58
- checkConfig() {
59
- return { disabled: this.disabled, size: this.size }
60
- },
61
- selectConfigIn() {
62
- return Object.assign({ transfer: true, popupClassName: 'sh-tree-select-dropdown' }, this.globalConfig.selectConfig, this.checkConfig)
63
- },
64
- selectInputConfigIn() {
65
- return Object.assign({ clearable: true, controls: false, transfer: false, suffixIcon: 'vxe-icon-caret-down', placeholder: this.placeholder }, this.globalConfig.inputConfig)
66
- },
67
- filterInputConfigIn() {
68
- return Object.assign({ prefixIcon: 'vxe-icon-search', placeholder: '搜索', clearable: true, controls: false, transfer: true }, this.globalConfig.filterInputConfig)
69
- },
70
- tableTreeProps() {
71
- return Object.assign({}, this.$props, { filterText: this.filterTextIn, modelValue: this.selectedKeys })
72
- }
73
- },
74
- watch: {
75
- modelValue: {
76
- handler(newvalue, oldValue) {
77
- if (this.pulldownDrop) return
78
- this.selectedKeys = newvalue
79
- },
80
- immediate: true
81
- }
82
- },
83
- methods: {
84
- // 下拉树值回显
85
- getTreeInputValue() {
86
- let { selectedKeys, valueData, multiple, format, field, split, labelField, treeData, $vUtils } = this
87
- if (selectedKeys && Array.isArray(selectedKeys) && selectedKeys.length > 0 && treeData && treeData.length > 0) {
88
- let selectRows = this.getSelectRowsByValue(selectedKeys)
89
- let labelFieldList = selectRows.map(item => $vUtils.get(item, labelField))
90
- if (format) {
91
- let prefixKey = field.endsWith('Id') ? String(field).replace('Id', '') : field
92
- let dataformat = format.replace(/@/gi, prefixKey)
93
- if (multiple) {
94
- let formatKeys = $vUtils.getFormatKeys(dataformat)
95
- // 首先构建回显数据源,防止formayKeys值不全导致索引错乱
96
- let formatSourceList = Array.from(new Array(selectedKeys.length), (item, itemIndex) => {
97
- let result = { [field]: selectedKeys[itemIndex] }
98
- formatKeys.forEach(key => {
99
- result[key] = $vUtils.get(valueData, `${key}[${itemIndex}]`)
100
- })
101
- return result
102
- })
103
- labelFieldList = formatSourceList.map(item => $vUtils.format(dataformat, item))
104
- } else {
105
- labelFieldList = [$vUtils.format(dataformat, valueData)]
106
- }
107
- }
108
- return labelFieldList.join(split)
109
- }
110
- return ''
111
- },
112
- // 根据选中值返回选中节点信息
113
- getSelectRowsByValue(value) {
114
- const { treeData, nodeKey, globalConfig, $vTableSetup, $vUtils } = this
115
- let childKey = (globalConfig.treeConfig && globalConfig.treeConfig.childrenField) || $vTableSetup?.table?.treeConfig?.childrenField || 'children'
116
- let selectRows = []
117
- $vUtils.eachTree(
118
- treeData,
119
- node => {
120
- if (node[nodeKey] && value.includes(node[nodeKey])) {
121
- selectRows.push(node)
122
- }
123
- },
124
- { children: childKey }
125
- )
126
- return selectRows
127
- },
128
- // 获取选中数据
129
- getSelectionData() {
130
- return this.selectedData
131
- },
132
- // 树节点获取焦点事件
133
- async onFocus(obj) {
134
- this.emitFocus()
135
- this.$refs.treeSelectInput.blur()
136
- await this.$refs.treeSelect.togglePanel()
137
- this.pulldownDrop = true
138
- if (this.$refs.filterInput) this.$refs.filterInput.focus()
139
- },
140
- // 树节点选择变换事件
141
- async onChange(selectedKeys, selectedRows, obj) {
142
- if (this.isSelect) {
143
- if (!this.multiple) {
144
- this.pulldownDrop = false
145
- this.selectedKeys = selectedKeys
146
- this.selectionData = selectedRows
147
- await this.$refs.treeSelect.hidePanel()
148
- this.onHidePanel()
149
- } else {
150
- this.selectedKeys = selectedKeys
151
- this.selectionData = selectedRows
152
- }
153
- return
154
- }
155
- this.selectedKeys = selectedKeys
156
- this.selectionData = selectedRows
157
- this.emitChange()
158
- },
159
- // 树收起下拉回调方法
160
- onHidePanel() {
161
- this.pulldownDrop = false
162
- this.filterTextIn = ''
163
- this.emitChange()
164
- this.emitBlur()
165
- },
166
- // 下拉数清除事件
167
- onClear() {
168
- this.onHidePanel()
169
- },
170
- // 表格数据回调
171
- onDataCall(datas) {
172
- this.treeData = datas
173
- },
174
- // 回调fouces事件
175
- emitFocus(obj) {
176
- this.$emit('focus', obj)
177
- },
178
- // 回调change事件
179
- emitChange() {
180
- this.emitValue()
181
- this.$emit('change', this.selectedKeys, this.selectionData)
182
- },
183
- // 回调fouces事件
184
- emitBlur() {
185
- this.$emit('blur', this.selectedKeys, this.selectionData)
186
- },
187
- // 回调双向绑定
188
- emitValue() {
189
- this.$emit('update:modelValue', this.selectedKeys)
190
- }
191
- }
192
- }
193
- </script>
194
-
195
- <style lang="scss" scoped></style>
1
+ <template>
2
+ <div class="sh-tree" :class="[isSelect ? 'direct' : 'select']" :style="{ height: wrapHeight }">
3
+ <template v-if="isSelect">
4
+ <vxe-pulldown ref="treeSelectRef" class="sh-tree-select" v-bind="selectConfigIn" @hide-panel="onHidePanel">
5
+ <template #default>
6
+ <div class="sh-tree-select-input">
7
+ <vxe-input ref="treeSelectInputRef" :model-value="selectLabels" v-bind="selectInputConfigIn" readonly @focus="onFocus" @clear="onClear"></vxe-input>
8
+ </div>
9
+ </template>
10
+ <template #dropdown>
11
+ <div v-if="filter" class="sh-tree-filter">
12
+ <vxe-input ref="filterInputRef" v-model="filterTextIn" class="sh-tree-filter-input" v-bind="filterInputConfigIn"></vxe-input>
13
+ </div>
14
+ <div class="sh-tree-select-dropdown-content">
15
+ <table-tree v-if="pulldownDrop" v-bind="tableTreeProps" @datacall="onDataCall" @select="onChange"></table-tree>
16
+ <div v-else class="tree-skeleton"></div>
17
+ </div>
18
+ </template>
19
+ </vxe-pulldown>
20
+ </template>
21
+ <template v-else>
22
+ <div v-if="filter" class="sh-tree-filter">
23
+ <vxe-input ref="filterInputRef" v-model="filterTextIn" class="sh-tree-filter-input" v-bind="filterInputConfigIn"></vxe-input>
24
+ </div>
25
+ <div class="sh-tree-content" :class="{ 'has-filter': filter }">
26
+ <table-tree v-bind="tableTreeProps" @datacall="onDataCall" @select="onChange"></table-tree>
27
+ </div>
28
+ </template>
29
+ </div>
30
+ </template>
31
+
32
+ <script>
33
+ import { defineComponent, computed, onBeforeMount, getCurrentInstance, ref, watch } from 'vue'
34
+ import './css/index.scss'
35
+ import mixinProps from './mixin/treeProps'
36
+ import tableTree from './components/table-tree.vue'
37
+ export default defineComponent({
38
+ name: 'ShTree',
39
+ components: {
40
+ tableTree
41
+ },
42
+ props: {
43
+ ...mixinProps
44
+ },
45
+ emits: ['update:modelValue', 'change', 'focus', 'blur'],
46
+ setup(props, context) {
47
+ const { proxy } = getCurrentInstance()
48
+ const { $vUtils } = proxy
49
+ const { emit, slots } = context
50
+
51
+ const treeSelectRef = ref()
52
+ const treeSelectInputRef = ref()
53
+ const filterInputRef = ref()
54
+ // 公共属性
55
+ const filterTextIn = ref(props.filterText)
56
+ const selectedKeys = ref(props.modelValue)
57
+ const selectedData = ref([])
58
+ const treeData = ref(props.options)
59
+ // 下拉专属属性
60
+ const pulldownDrop = ref(false) // 由于hidePanel延迟350ms关闭,体验不好,这里使用自定义开关
61
+
62
+ const wrapHeight = computed(() => ([100, '100%', 'auto'].includes(props.height) ? '100%' : 'auto'))
63
+ const checkConfig = computed(() => ({ disabled: props.disabled, size: props.size }))
64
+ const selectLabels = computed(() => {
65
+ let { valueData, multiple, format, field, split, labelField } = props
66
+ if (selectedKeys.value && Array.isArray(selectedKeys.value) && selectedKeys.value.length > 0 && treeData.value && treeData.value.length > 0) {
67
+ let selectRows = getSelectRowsByValue(selectedKeys.value)
68
+ let labelFieldList = selectRows.map(item => $vUtils.get(item, labelField))
69
+ if (format) {
70
+ let prefixKey = field.endsWith('Id') ? String(field).replace('Id', '') : field
71
+ let dataformat = format.replace(/@/gi, prefixKey)
72
+ if (multiple) {
73
+ let formatKeys = $vUtils.getFormatKeys(dataformat)
74
+ // 首先构建回显数据源,防止formayKeys值不全导致索引错乱
75
+ let formatSourceList = Array.from(new Array(selectedKeys.value.length), (item, itemIndex) => {
76
+ let result = { [field]: selectedKeys.value[itemIndex] }
77
+ formatKeys.forEach(key => {
78
+ result[key] = $vUtils.get(valueData, `${key}[${itemIndex}]`)
79
+ })
80
+ return result
81
+ })
82
+ labelFieldList = formatSourceList.map(item => $vUtils.format(dataformat, item))
83
+ } else {
84
+ labelFieldList = [$vUtils.format(dataformat, valueData)]
85
+ }
86
+ }
87
+ return labelFieldList.join(split)
88
+ }
89
+ return ''
90
+ })
91
+ const selectConfigIn = computed(() => {
92
+ return Object.assign({ transfer: true, popupClassName: 'sh-tree-select-dropdown' }, props.globalConfig?.selectConfig, checkConfig.value)
93
+ })
94
+ const selectInputConfigIn = computed(() => {
95
+ return Object.assign({ clearable: true, controls: false, transfer: false, suffixIcon: 'vxe-icon-caret-down', placeholder: props.placeholder }, props.globalConfig?.inputConfig)
96
+ })
97
+ const filterInputConfigIn = computed(() => {
98
+ return Object.assign({ prefixIcon: 'vxe-icon-search', placeholder: '搜索', clearable: true, controls: false, transfer: true }, props.globalConfig?.filterInputConfig)
99
+ })
100
+ const tableTreeProps = computed(() => {
101
+ return Object.assign({}, props, { filterText: filterTextIn.value, modelValue: selectedKeys.value })
102
+ })
103
+
104
+ // 根据选中值返回选中节点信息
105
+ const getSelectRowsByValue = keys => {
106
+ const { nodeKey, globalConfig } = props
107
+ let childKey = (globalConfig.treeConfig && globalConfig.treeConfig.childrenField) || proxy.$vTableSetup?.table?.treeConfig?.childrenField || 'children'
108
+ let selectRows = []
109
+ $vUtils.eachTree(
110
+ treeData.value,
111
+ node => {
112
+ if (node[nodeKey] && keys.includes(node[nodeKey])) {
113
+ selectRows.push(node)
114
+ }
115
+ },
116
+ { children: childKey }
117
+ )
118
+ return selectRows
119
+ }
120
+ // 获取选中数据
121
+ const getSelectionData = () => {
122
+ return selectedData.value
123
+ }
124
+ // 树节点获取焦点事件
125
+ const onFocus = async obj => {
126
+ emitFocus()
127
+ treeSelectInputRef.value.blur()
128
+ await treeSelectRef.value.togglePanel()
129
+ pulldownDrop.value = true
130
+ if (filterInputRef.value) filterInputRef.value.focus()
131
+ }
132
+ // 树节点选择变换事件
133
+ const onChange = async (keys, rows, obj) => {
134
+ if (props.isSelect) {
135
+ if (!props.multiple) {
136
+ pulldownDrop.value = false
137
+ selectedKeys.value = keys
138
+ selectedData.value = rows
139
+ await treeSelectRef.value.hidePanel()
140
+ onHidePanel()
141
+ } else {
142
+ selectedKeys.value = keys
143
+ selectedData.value = rows
144
+ }
145
+ return
146
+ }
147
+ selectedKeys.value = keys
148
+ selectedData.value = rows
149
+ emitChange()
150
+ }
151
+ // 树收起下拉回调方法
152
+ const onHidePanel = () => {
153
+ pulldownDrop.value = false
154
+ filterTextIn.value = ''
155
+ emitChange()
156
+ emitBlur()
157
+ }
158
+ // 下拉数清除事件
159
+ const onClear = () => {
160
+ onHidePanel()
161
+ }
162
+ // 表格数据回调
163
+ const onDataCall = datas => {
164
+ treeData.value = datas
165
+ }
166
+ // 回调fouces事件
167
+ const emitFocus = obj => {
168
+ emit('focus', obj)
169
+ }
170
+ // 回调change事件
171
+ const emitChange = () => {
172
+ emitValue()
173
+ emit('change', selectedKeys.value, selectedData.value)
174
+ }
175
+ // 回调fouces事件
176
+ const emitBlur = () => {
177
+ emit('blur', selectedKeys.value, selectedData.value)
178
+ }
179
+ // 回调双向绑定
180
+ const emitValue = () => {
181
+ emit('update:modelValue', selectedKeys.value)
182
+ }
183
+
184
+ watch(
185
+ () => props.modelValue,
186
+ value => {
187
+ if (pulldownDrop.value) return
188
+ selectedKeys.value = value
189
+ },
190
+ {
191
+ immediate: true
192
+ }
193
+ )
194
+
195
+ return {
196
+ treeSelectRef,
197
+ treeSelectInputRef,
198
+ filterInputRef,
199
+ wrapHeight,
200
+ selectConfigIn,
201
+ selectInputConfigIn,
202
+ filterTextIn,
203
+ filterInputConfigIn,
204
+ pulldownDrop,
205
+ tableTreeProps,
206
+ selectLabels,
207
+ getSelectionData,
208
+ onFocus,
209
+ onClear,
210
+ onHidePanel,
211
+ onDataCall,
212
+ onChange
213
+ }
214
+ }
215
+ })
216
+ </script>
217
+
218
+ <style lang="scss" scoped></style>
@@ -1,124 +1,122 @@
1
1
  export default {
2
- props: {
3
- modelValue: {
4
- type: Array,
5
- default() {
6
- return []
7
- }
8
- },
9
- isSelect: {
10
- type: Boolean
11
- },
12
- nodeKey: {
13
- type: String,
14
- default: 'id' // 主键不支持多级(a.b类型,都主键了还点鸡毛)
15
- },
16
- valueKeys: {
17
- type: Array
18
- },
19
- valueData: {
20
- type: Object,
21
- default() {
22
- return {}
23
- }
24
- },
25
- format: {
26
- type: String
27
- },
28
- field: {
29
- type: String
30
- },
31
- isLeaf: {
32
- type: Boolean
33
- },
34
- disabled: {
35
- type: Boolean
36
- },
37
- level: {
38
- type: Number,
39
- default: -1
40
- },
41
- size: {
42
- type: String,
43
- default: 'medium' // medium / small / mini
44
- },
45
- height: {
46
- type: [Number, String],
47
- default: 'auto'
48
- },
49
- split: {
50
- type: String,
51
- default: ','
52
- },
53
- placeholder: {
54
- type: String,
55
- default: '请选择'
56
- },
57
- labelField: {
58
- type: String,
59
- default: 'label'
60
- },
61
- labelFormat: {
62
- type: String,
63
- default: ''
64
- },
65
- labelTitle: {
66
- type: String
67
- },
68
- loading: {
69
- type: Boolean,
70
- default: false
71
- },
72
- filter: {
73
- type: Boolean,
74
- default: true // 是否内部搜索
75
- },
76
- filterText: {
77
- type: String
78
- },
79
- multiple: {
80
- type: Boolean
81
- },
82
- globalConfig: {
83
- type: Object,
84
- default() {
85
- return {}
86
- }
87
- },
88
- options: {
89
- type: Array,
90
- default() {
91
- return []
92
- }
93
- },
94
- serverCache: {
95
- // 请求数据是否缓存,不缓存则每次下拉重新加载
96
- type: Boolean,
97
- default: true
98
- },
99
- serverConfig: {
100
- type: Object,
101
- default() {
102
- return {}
103
- }
104
- },
105
- serverParams: {
106
- type: Object,
107
- default() {
108
- return {}
109
- }
110
- },
111
- parseParams: {
112
- type: Function,
113
- default() {
114
- return {}
115
- }
116
- },
117
- emptyIcon: {
118
- type: String
119
- },
120
- emptyText: {
121
- type: String
2
+ modelValue: {
3
+ type: Array,
4
+ default() {
5
+ return []
122
6
  }
7
+ },
8
+ isSelect: {
9
+ type: Boolean
10
+ },
11
+ nodeKey: {
12
+ type: String,
13
+ default: 'id' // 主键不支持多级(a.b类型,都主键了还点鸡毛)
14
+ },
15
+ valueKeys: {
16
+ type: Array
17
+ },
18
+ valueData: {
19
+ type: Object,
20
+ default() {
21
+ return {}
22
+ }
23
+ },
24
+ format: {
25
+ type: String
26
+ },
27
+ field: {
28
+ type: String
29
+ },
30
+ isLeaf: {
31
+ type: Boolean
32
+ },
33
+ disabled: {
34
+ type: Boolean
35
+ },
36
+ level: {
37
+ type: Number,
38
+ default: -1
39
+ },
40
+ size: {
41
+ type: String,
42
+ default: 'medium' // medium / small / mini
43
+ },
44
+ height: {
45
+ type: [Number, String],
46
+ default: 'auto'
47
+ },
48
+ split: {
49
+ type: String,
50
+ default: ','
51
+ },
52
+ placeholder: {
53
+ type: String,
54
+ default: '请选择'
55
+ },
56
+ labelField: {
57
+ type: String,
58
+ default: 'label'
59
+ },
60
+ labelFormat: {
61
+ type: String,
62
+ default: ''
63
+ },
64
+ labelTitle: {
65
+ type: String
66
+ },
67
+ loading: {
68
+ type: Boolean,
69
+ default: false
70
+ },
71
+ filter: {
72
+ type: Boolean,
73
+ default: true // 是否内部搜索
74
+ },
75
+ filterText: {
76
+ type: String
77
+ },
78
+ multiple: {
79
+ type: Boolean
80
+ },
81
+ globalConfig: {
82
+ type: Object,
83
+ default() {
84
+ return {}
85
+ }
86
+ },
87
+ options: {
88
+ type: Array,
89
+ default() {
90
+ return []
91
+ }
92
+ },
93
+ serverCache: {
94
+ // 请求数据是否缓存,不缓存则每次下拉重新加载
95
+ type: Boolean,
96
+ default: true
97
+ },
98
+ serverConfig: {
99
+ type: Object,
100
+ default() {
101
+ return {}
102
+ }
103
+ },
104
+ serverParams: {
105
+ type: Object,
106
+ default() {
107
+ return {}
108
+ }
109
+ },
110
+ parseParams: {
111
+ type: Function,
112
+ default() {
113
+ return {}
114
+ }
115
+ },
116
+ emptyIcon: {
117
+ type: String
118
+ },
119
+ emptyText: {
120
+ type: String
123
121
  }
124
122
  }