sh-view 2.7.8 → 2.8.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 (121) hide show
  1. package/other.js +8 -0
  2. package/package.json +4 -3
  3. package/packages/components/index.js +35 -35
  4. package/packages/components/{global-components/sh-alert → sh-alert}/index.vue +8 -15
  5. package/packages/components/{global-components/sh-badge → sh-badge}/index.vue +6 -5
  6. package/packages/components/{global-components/sh-calendar → sh-calendar}/index.vue +167 -36
  7. package/packages/components/{global-components/sh-date → sh-date}/index.vue +37 -9
  8. package/packages/components/{global-components/sh-drawer → sh-drawer}/index.vue +49 -27
  9. package/packages/components/{global-components/sh-form → sh-form}/js/useForm.js +2 -2
  10. package/packages/components/sh-header/index.vue +260 -0
  11. package/packages/components/sh-icon/css/font/icons.scss +135 -0
  12. package/packages/components/{global-components/sh-image → sh-image}/index.vue +2 -1
  13. package/packages/components/{global-components/sh-poptip → sh-poptip}/index.vue +1 -1
  14. package/packages/components/{global-components/sh-progress → sh-progress}/index.vue +2 -18
  15. package/packages/components/{global-components/sh-table → sh-table}/css/index.scss +18 -0
  16. package/packages/components/{global-components/sh-table → sh-table}/js/tableMethods.js +12 -20
  17. package/packages/components/{global-components/sh-table → sh-table}/js/useTable.js +4 -6
  18. package/packages/components/{global-components/sh-table → sh-table}/table.vue +217 -218
  19. package/packages/components/{global-components/sh-tabs → sh-tabs}/index.vue +97 -34
  20. package/packages/components/{global-components/sh-tree → sh-tree}/components/table-tree.vue +1 -2
  21. package/packages/components/{global-components/sh-tree → sh-tree}/css/index.scss +1 -0
  22. package/packages/components/{global-components/sh-tree → sh-tree}/index.vue +228 -217
  23. package/packages/components/{global-components/sh-tree → sh-tree}/mixin/treeProps.js +1 -1
  24. package/packages/index.js +39 -39
  25. package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-week-box.vue +126 -126
  26. package/packages/{components/other-components → other}/sh-menu/index.vue +3 -0
  27. package/packages/{components/other-components → other}/sh-menu/menu-item-content.vue +3 -3
  28. package/packages/other/sh-preview/components/sh-excel.vue +163 -0
  29. package/packages/{components/other-components → other}/sh-preview/index.vue +92 -89
  30. package/packages/vxeTable/css/index.scss +31 -8
  31. package/packages/vxeTable/render/cell/vxe-render-tree.vue +70 -63
  32. package/packages/vxeTable/render/filters/vxe-filter-input.vue +26 -25
  33. package/packages/vxeTable/render/filters/vxe-filter-time.vue +26 -0
  34. package/packages/vxeTable/render/globalRenders.jsx +26 -7
  35. package/packages/vxeTable/render/mixin/filter-hooks.js +31 -13
  36. package/packages/components/global-components/sh-header/index.vue +0 -278
  37. package/packages/components/global-components/sh-icon/css/font/icons.scss +0 -135
  38. package/packages/components/other-components/sh-preview/components/sh-excel.vue +0 -929
  39. /package/packages/components/{global-components/sh-card → sh-card}/index.vue +0 -0
  40. /package/packages/components/{global-components/sh-code-editor → sh-code-editor}/index.vue +0 -0
  41. /package/packages/components/{global-components/sh-code-editor → sh-code-editor}/themes/dark.js +0 -0
  42. /package/packages/components/{global-components/sh-code-editor → sh-code-editor}/themes/dracula.js +0 -0
  43. /package/packages/components/{global-components/sh-code-editor → sh-code-editor}/themes/index.js +0 -0
  44. /package/packages/components/{global-components/sh-col → sh-col}/css/index.scss +0 -0
  45. /package/packages/components/{global-components/sh-col → sh-col}/index.vue +0 -0
  46. /package/packages/components/{global-components/sh-corner → sh-corner}/index.vue +0 -0
  47. /package/packages/components/{global-components/sh-count-to → sh-count-to}/index.vue +0 -0
  48. /package/packages/components/{global-components/sh-drawer → sh-drawer}/scrollbar.js +0 -0
  49. /package/packages/components/{global-components/sh-empty → sh-empty}/index.vue +0 -0
  50. /package/packages/components/{global-components/sh-form → sh-form}/form.vue +0 -0
  51. /package/packages/components/{global-components/sh-form → sh-form}/js/props.js +0 -0
  52. /package/packages/components/{global-components/sh-form → sh-form}/query.vue +0 -0
  53. /package/packages/components/{global-components/sh-icon → sh-icon}/css/default/icons.scss +0 -0
  54. /package/packages/components/{global-components/sh-icon → sh-icon}/css/default/ionicons.svg +0 -0
  55. /package/packages/components/{global-components/sh-icon → sh-icon}/css/default/ionicons.ttf +0 -0
  56. /package/packages/components/{global-components/sh-icon → sh-icon}/css/default/ionicons.woff +0 -0
  57. /package/packages/components/{global-components/sh-icon → sh-icon}/css/default/ionicons.woff2 +0 -0
  58. /package/packages/components/{global-components/sh-icon → sh-icon}/css/font/iconfont.js +0 -0
  59. /package/packages/components/{global-components/sh-icon → sh-icon}/css/font/iconfont.json +0 -0
  60. /package/packages/components/{global-components/sh-icon → sh-icon}/css/font/iconfont.ttf +0 -0
  61. /package/packages/components/{global-components/sh-icon → sh-icon}/css/font/iconfont.woff +0 -0
  62. /package/packages/components/{global-components/sh-icon → sh-icon}/css/font/iconfont.woff2 +0 -0
  63. /package/packages/components/{global-components/sh-icon → sh-icon}/css/index.scss +0 -0
  64. /package/packages/components/{global-components/sh-icon → sh-icon}/index.vue +0 -0
  65. /package/packages/components/{global-components/sh-list → sh-list}/index.vue +0 -0
  66. /package/packages/components/{global-components/sh-loading → sh-loading}/index.vue +0 -0
  67. /package/packages/components/{global-components/sh-modal → sh-modal}/index.vue +0 -0
  68. /package/packages/components/{global-components/sh-noticebar → sh-noticebar}/index.vue +0 -0
  69. /package/packages/components/{global-components/sh-pull-refresh → sh-pull-refresh}/index.vue +0 -0
  70. /package/packages/components/{global-components/sh-result → sh-result}/index.vue +0 -0
  71. /package/packages/components/{global-components/sh-row → sh-row}/css/index.scss +0 -0
  72. /package/packages/components/{global-components/sh-row → sh-row}/index.vue +0 -0
  73. /package/packages/components/{global-components/sh-split → sh-split}/components/trigger.vue +0 -0
  74. /package/packages/components/{global-components/sh-split → sh-split}/index.vue +0 -0
  75. /package/packages/components/{global-components/sh-table → sh-table}/components/importModal.vue +0 -0
  76. /package/packages/components/{global-components/sh-table → sh-table}/components/sh-column.vue +0 -0
  77. /package/packages/components/{global-components/sh-table → sh-table}/grid.vue +0 -0
  78. /package/packages/components/{global-components/sh-table → sh-table}/js/excel_to_json.js +0 -0
  79. /package/packages/components/{global-components/sh-table → sh-table}/js/props.js +0 -0
  80. /package/packages/components/{global-components/sh-tag → sh-tag}/index.vue +0 -0
  81. /package/packages/components/{global-components/sh-toolbar → sh-toolbar}/index.vue +0 -0
  82. /package/packages/components/{global-components/sh-upload → sh-upload}/index.vue +0 -0
  83. /package/packages/components/{global-components/sh-upload → sh-upload}/js/ajax.js +0 -0
  84. /package/packages/components/{global-components/sh-water-fall → sh-water-fall}/index.vue +0 -0
  85. /package/packages/components/{global-components/sh-water-mark → sh-water-mark}/index.vue +0 -0
  86. /package/packages/{components/other-components → other}/sh-cron-modal/components/cron-content.vue +0 -0
  87. /package/packages/{components/other-components → other}/sh-cron-modal/css/index.scss +0 -0
  88. /package/packages/{components/other-components → other}/sh-cron-modal/index.vue +0 -0
  89. /package/packages/{components/other-components → other}/sh-cron-modal/mixin/cron-emits.js +0 -0
  90. /package/packages/{components/other-components → other}/sh-cron-modal/mixin/cron-hooks.js +0 -0
  91. /package/packages/{components/other-components → other}/sh-cron-modal/mixin/cron-props.js +0 -0
  92. /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-day-box.vue +0 -0
  93. /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-hour-box.vue +0 -0
  94. /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-minute-box.vue +0 -0
  95. /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-month-box.vue +0 -0
  96. /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-second-box.vue +0 -0
  97. /package/packages/{components/other-components → other}/sh-cron-modal/tabs/cron-year-box.vue +0 -0
  98. /package/packages/{components/other-components → other}/sh-cron-modal/utils/index.js +0 -0
  99. /package/packages/{components/other-components → other}/sh-markdown/index.vue +0 -0
  100. /package/packages/{components/other-components → other}/sh-markdown/tinymce/langs/zh-Hans.js +0 -0
  101. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/content/default/content.css +0 -0
  102. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.css +0 -0
  103. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.inline.css +0 -0
  104. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.inline.min.css +0 -0
  105. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.min.css +0 -0
  106. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.mobile.css +0 -0
  107. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/content.mobile.min.css +0 -0
  108. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff +0 -0
  109. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.css +0 -0
  110. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.min.css +0 -0
  111. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.mobile.css +0 -0
  112. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.mobile.min.css +0 -0
  113. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.shadowdom.css +0 -0
  114. /package/packages/{components/other-components → other}/sh-markdown/tinymce/skins/ui/oxide/skin.shadowdom.min.css +0 -0
  115. /package/packages/{components/other-components → other}/sh-menu/menu-group-content.vue +0 -0
  116. /package/packages/{components/other-components → other}/sh-menu-card/index.vue +0 -0
  117. /package/packages/{components/other-components → other}/sh-menu-card/menu-box.vue +0 -0
  118. /package/packages/{components/other-components → other}/sh-preview/components/sh-word.vue +0 -0
  119. /package/packages/{components/other-components → other}/sh-preview/js/data-hook.js +0 -0
  120. /package/packages/{components/other-components → other}/sh-preview/js/data-props.js +0 -0
  121. /package/packages/{components/other-components → other}/sh-system-tip/index.vue +0 -0
@@ -1,217 +1,228 @@
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>
17
- </template>
18
- </vxe-pulldown>
19
- </template>
20
- <template v-else>
21
- <div v-if="filter" class="sh-tree-filter">
22
- <vxe-input ref="filterInputRef" v-model="filterTextIn" class="sh-tree-filter-input" v-bind="filterInputConfigIn"></vxe-input>
23
- </div>
24
- <div class="sh-tree-content" :class="{ 'has-filter': filter }">
25
- <table-tree v-bind="tableTreeProps" @datacall="onDataCall" @select="onChange"></table-tree>
26
- </div>
27
- </template>
28
- </div>
29
- </template>
30
-
31
- <script>
32
- import { defineComponent, computed, onBeforeMount, getCurrentInstance, ref, watch } from 'vue'
33
- import './css/index.scss'
34
- import mixinProps from './mixin/treeProps'
35
- import tableTree from './components/table-tree.vue'
36
- export default defineComponent({
37
- name: 'ShTree',
38
- components: {
39
- tableTree
40
- },
41
- props: {
42
- ...mixinProps
43
- },
44
- emits: ['update:modelValue', 'change', 'focus', 'blur'],
45
- setup(props, context) {
46
- const { proxy } = getCurrentInstance()
47
- const { $vUtils } = proxy
48
- const { emit, slots } = context
49
-
50
- const treeSelectRef = ref()
51
- const treeSelectInputRef = ref()
52
- const filterInputRef = ref()
53
- // 公共属性
54
- const filterTextIn = ref(props.filterText)
55
- const selectedKeys = ref(props.modelValue)
56
- const selectedData = ref([])
57
- const treeData = ref(props.options)
58
- // 下拉专属属性
59
- const pulldownDrop = ref(false) // 由于hidePanel延迟350ms关闭,体验不好,这里使用自定义开关
60
-
61
- const wrapHeight = computed(() => ([100, '100%', 'auto'].includes(props.height) ? '100%' : 'auto'))
62
- const checkConfig = computed(() => ({ disabled: props.disabled, size: props.size }))
63
- const selectLabels = computed(() => {
64
- let { valueData, multiple, format, field, split, labelField } = props
65
- if (selectedKeys.value && Array.isArray(selectedKeys.value) && selectedKeys.value.length > 0 && treeData.value && treeData.value.length > 0) {
66
- let selectRows = getSelectRowsByValue(selectedKeys.value)
67
- let labelFieldList = selectRows.map(item => $vUtils.get(item, labelField))
68
- if (format) {
69
- let prefixKey = field.endsWith('Id') ? String(field).replace('Id', '') : field
70
- let dataformat = format.replace(/@/gi, prefixKey)
71
- if (multiple) {
72
- let formatKeys = $vUtils.getFormatKeys(dataformat)
73
- // 首先构建回显数据源,防止formayKeys值不全导致索引错乱
74
- let formatSourceList = Array.from(new Array(selectedKeys.value.length), (item, itemIndex) => {
75
- let result = { [field]: selectedKeys.value[itemIndex] }
76
- formatKeys.forEach(key => {
77
- result[key] = $vUtils.get(valueData, `${key}[${itemIndex}]`)
78
- })
79
- return result
80
- })
81
- labelFieldList = formatSourceList.map(item => $vUtils.format(dataformat, item))
82
- } else {
83
- labelFieldList = [$vUtils.format(dataformat, valueData)]
84
- }
85
- }
86
- return labelFieldList.join(split)
87
- }
88
- return ''
89
- })
90
- const selectConfigIn = computed(() => {
91
- return Object.assign({ transfer: true, popupClassName: 'sh-tree-select-dropdown' }, props.globalConfig?.selectConfig, checkConfig.value)
92
- })
93
- const selectInputConfigIn = computed(() => {
94
- return Object.assign({ clearable: true, controls: false, transfer: false, suffixIcon: 'vxe-icon-caret-down', placeholder: props.placeholder }, props.globalConfig?.inputConfig)
95
- })
96
- const filterInputConfigIn = computed(() => {
97
- return Object.assign({ prefixIcon: 'vxe-icon-search', placeholder: '搜索', clearable: true, controls: false, transfer: true }, props.globalConfig?.filterInputConfig)
98
- })
99
- const tableTreeProps = computed(() => {
100
- return Object.assign({}, props, { filterText: filterTextIn.value, modelValue: selectedKeys.value })
101
- })
102
-
103
- // 根据选中值返回选中节点信息
104
- const getSelectRowsByValue = keys => {
105
- const { nodeKey, globalConfig } = props
106
- let childKey = (globalConfig.treeConfig && globalConfig.treeConfig.childrenField) || proxy.$vTableSetup?.table?.treeConfig?.childrenField || 'children'
107
- let selectRows = []
108
- $vUtils.eachTree(
109
- treeData.value,
110
- node => {
111
- if (node[nodeKey] && keys.includes(node[nodeKey])) {
112
- selectRows.push(node)
113
- }
114
- },
115
- { children: childKey }
116
- )
117
- return selectRows
118
- }
119
- // 获取选中数据
120
- const getSelectionData = () => {
121
- return selectedData.value
122
- }
123
- // 树节点获取焦点事件
124
- const onFocus = async obj => {
125
- emitFocus()
126
- treeSelectInputRef.value.blur()
127
- await treeSelectRef.value.togglePanel()
128
- pulldownDrop.value = true
129
- if (filterInputRef.value) filterInputRef.value.focus()
130
- }
131
- // 树节点选择变换事件
132
- const onChange = async (keys, rows, obj) => {
133
- if (props.isSelect) {
134
- if (!props.multiple) {
135
- pulldownDrop.value = false
136
- selectedKeys.value = keys
137
- selectedData.value = rows
138
- await treeSelectRef.value.hidePanel()
139
- onHidePanel()
140
- } else {
141
- selectedKeys.value = keys
142
- selectedData.value = rows
143
- }
144
- return
145
- }
146
- selectedKeys.value = keys
147
- selectedData.value = rows
148
- emitChange()
149
- }
150
- // 树收起下拉回调方法
151
- const onHidePanel = () => {
152
- pulldownDrop.value = false
153
- filterTextIn.value = ''
154
- emitChange()
155
- emitBlur()
156
- }
157
- // 下拉数清除事件
158
- const onClear = () => {
159
- onHidePanel()
160
- }
161
- // 表格数据回调
162
- const onDataCall = datas => {
163
- treeData.value = datas
164
- }
165
- // 回调focus事件
166
- const emitFocus = obj => {
167
- emit('focus', obj)
168
- }
169
- // 回调change事件
170
- const emitChange = () => {
171
- emitValue()
172
- emit('change', selectedKeys.value, selectedData.value)
173
- }
174
- // 回调blur事件
175
- const emitBlur = () => {
176
- emit('blur', selectedKeys.value, selectedData.value)
177
- }
178
- // 回调双向绑定
179
- const emitValue = () => {
180
- emit('update:modelValue', selectedKeys.value)
181
- }
182
-
183
- watch(
184
- () => props.modelValue,
185
- value => {
186
- if (pulldownDrop.value) return
187
- selectedKeys.value = value
188
- },
189
- {
190
- immediate: true
191
- }
192
- )
193
-
194
- return {
195
- treeSelectRef,
196
- treeSelectInputRef,
197
- filterInputRef,
198
- wrapHeight,
199
- selectConfigIn,
200
- selectInputConfigIn,
201
- filterTextIn,
202
- filterInputConfigIn,
203
- pulldownDrop,
204
- tableTreeProps,
205
- selectLabels,
206
- getSelectionData,
207
- onFocus,
208
- onClear,
209
- onHidePanel,
210
- onDataCall,
211
- onChange
212
- }
213
- }
214
- })
215
- </script>
216
-
217
- <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">
15
+ <table-tree v-if="pulldownDrop" v-bind="tableTreeProps" @datacall="onDataCall" @select="onChange"></table-tree>
16
+ </div>
17
+ </template>
18
+ </vxe-pulldown>
19
+ </template>
20
+ <template v-else>
21
+ <div v-if="filter" class="sh-tree-filter">
22
+ <vxe-input ref="filterInputRef" v-model="filterTextIn" class="sh-tree-filter-input" v-bind="filterInputConfigIn"></vxe-input>
23
+ </div>
24
+ <div class="sh-tree-content" :class="{ 'has-filter': filter }">
25
+ <table-tree v-bind="tableTreeProps" @datacall="onDataCall" @select="onChange"></table-tree>
26
+ </div>
27
+ </template>
28
+ </div>
29
+ </template>
30
+
31
+ <script>
32
+ import { defineComponent, computed, onBeforeMount, getCurrentInstance, ref, watch } from 'vue'
33
+ import './css/index.scss'
34
+ import mixinProps from './mixin/treeProps'
35
+ import tableTree from './components/table-tree.vue'
36
+ export default defineComponent({
37
+ name: 'ShTree',
38
+ components: {
39
+ tableTree
40
+ },
41
+ props: {
42
+ ...mixinProps
43
+ },
44
+ emits: ['update:modelValue', 'change', 'focus', 'blur'],
45
+ setup(props, context) {
46
+ const { proxy } = getCurrentInstance()
47
+ const { $vUtils } = proxy
48
+ const { emit, slots } = context
49
+
50
+ const treeSelectRef = ref()
51
+ const treeSelectInputRef = ref()
52
+ const filterInputRef = ref()
53
+ // 公共属性
54
+ const filterTextIn = ref(props.filterText)
55
+ const selectedKeys = ref([])
56
+ const selectedData = ref([])
57
+ const treeData = ref(props.options)
58
+ // 下拉专属属性
59
+ const pulldownDrop = ref(false) // 由于hidePanel延迟350ms关闭,体验不好,这里使用自定义开关
60
+
61
+ const wrapHeight = computed(() => ([100, '100%', 'auto'].includes(props.height) ? '100%' : 'auto'))
62
+ const checkConfig = computed(() => ({ disabled: props.disabled, size: props.size }))
63
+ const selectLabels = computed(() => {
64
+ let { valueData, multiple, format, field, split, labelField } = props
65
+ if (selectedKeys.value && Array.isArray(selectedKeys.value) && selectedKeys.value.length > 0 && treeData.value && treeData.value.length > 0) {
66
+ let selectRows = getSelectRowsByValue(selectedKeys.value)
67
+ let labelFieldList = selectRows.map(item => $vUtils.get(item, labelField))
68
+ if (format) {
69
+ let prefixKey = field
70
+ let endStrs = ['Id', '_id']
71
+ endStrs.forEach(end => {
72
+ if (field.endsWith(end)) {
73
+ prefixKey = field.replace(end, '')
74
+ }
75
+ })
76
+ let dataformat = format.replace(/@/gi, prefixKey)
77
+ if (multiple) {
78
+ let formatKeys = $vUtils.getFormatKeys(dataformat)
79
+ // 首先构建回显数据源,防止formayKeys值不全导致索引错乱
80
+ let formatSourceList = Array.from(new Array(selectedKeys.value.length), (item, itemIndex) => {
81
+ let result = { [field]: selectedKeys.value[itemIndex] }
82
+ formatKeys.forEach(key => {
83
+ result[key] = $vUtils.get(valueData, `${key}[${itemIndex}]`)
84
+ })
85
+ return result
86
+ })
87
+ labelFieldList = formatSourceList.map(item => $vUtils.format(dataformat, item))
88
+ } else {
89
+ labelFieldList = [$vUtils.format(dataformat, valueData)]
90
+ }
91
+ }
92
+ return labelFieldList.join(split)
93
+ }
94
+ return ''
95
+ })
96
+ const selectConfigIn = computed(() => {
97
+ return Object.assign({ transfer: true, popupClassName: 'sh-tree-select-dropdown' }, props.globalConfig?.selectConfig, checkConfig.value)
98
+ })
99
+ const selectInputConfigIn = computed(() => {
100
+ return Object.assign({ clearable: true, controls: false, transfer: false, suffixIcon: 'vxe-icon-caret-down', placeholder: props.placeholder }, props.globalConfig?.inputConfig)
101
+ })
102
+ const filterInputConfigIn = computed(() => {
103
+ return Object.assign({ prefixIcon: 'vxe-icon-search', placeholder: '搜索', clearable: true, controls: false, transfer: true }, props.globalConfig?.filterInputConfig)
104
+ })
105
+ const tableTreeProps = computed(() => {
106
+ return Object.assign({}, props, { filterText: filterTextIn.value, modelValue: selectedKeys.value })
107
+ })
108
+
109
+ // 根据选中值返回选中节点信息
110
+ const getSelectRowsByValue = keys => {
111
+ const { nodeKey, globalConfig } = props
112
+ let childKey = (globalConfig.treeConfig && globalConfig.treeConfig.childrenField) || proxy.$vTableSetup?.table?.treeConfig?.childrenField || 'children'
113
+ let selectRows = []
114
+ $vUtils.eachTree(
115
+ treeData.value,
116
+ node => {
117
+ if (node[nodeKey] && keys.includes(node[nodeKey]) && !selectRows.find(row => row[nodeKey] === node[nodeKey])) {
118
+ selectRows.push(node)
119
+ }
120
+ },
121
+ { children: childKey }
122
+ )
123
+ return selectRows
124
+ }
125
+ // 获取选中数据
126
+ const getSelectionData = () => {
127
+ return selectedData.value
128
+ }
129
+ // 树节点获取焦点事件
130
+ const onFocus = async obj => {
131
+ emitFocus()
132
+ treeSelectInputRef.value.blur()
133
+ await treeSelectRef.value.togglePanel()
134
+ pulldownDrop.value = true
135
+ if (filterInputRef.value) filterInputRef.value.focus()
136
+ }
137
+ // 树节点选择变换事件
138
+ const onChange = async (keys, rows, obj) => {
139
+ if (props.isSelect) {
140
+ if (!props.multiple) {
141
+ pulldownDrop.value = false
142
+ selectedKeys.value = keys
143
+ selectedData.value = rows
144
+ await treeSelectRef.value.hidePanel()
145
+ onHidePanel()
146
+ } else {
147
+ selectedKeys.value = keys
148
+ selectedData.value = rows
149
+ }
150
+ return
151
+ }
152
+ selectedKeys.value = keys
153
+ selectedData.value = rows
154
+ emitChange()
155
+ }
156
+ // 树收起下拉回调方法
157
+ const onHidePanel = () => {
158
+ pulldownDrop.value = false
159
+ filterTextIn.value = ''
160
+ emitChange()
161
+ emitBlur()
162
+ }
163
+ // 下拉数清除事件
164
+ const onClear = () => {
165
+ onHidePanel()
166
+ }
167
+ // 表格数据回调
168
+ const onDataCall = datas => {
169
+ treeData.value = datas
170
+ }
171
+ // 回调focus事件
172
+ const emitFocus = obj => {
173
+ emit('focus', obj)
174
+ }
175
+ // 回调change事件
176
+ const emitChange = () => {
177
+ emitValue()
178
+ emit('change', selectedKeys.value, selectedData.value)
179
+ }
180
+ // 回调blur事件
181
+ const emitBlur = () => {
182
+ emit('blur', selectedKeys.value, selectedData.value)
183
+ }
184
+ // 回调双向绑定
185
+ const emitValue = () => {
186
+ emit('update:modelValue', selectedKeys.value)
187
+ }
188
+
189
+ watch(
190
+ () => props.modelValue,
191
+ value => {
192
+ if (pulldownDrop.value) return
193
+ if ($vUtils.isNone(value)) {
194
+ selectedKeys.value = []
195
+ } else {
196
+ selectedKeys.value = Array.isArray(value) ? value : [value]
197
+ }
198
+ },
199
+ {
200
+ immediate: true,
201
+ deep: true
202
+ }
203
+ )
204
+
205
+ return {
206
+ treeSelectRef,
207
+ treeSelectInputRef,
208
+ filterInputRef,
209
+ wrapHeight,
210
+ selectConfigIn,
211
+ selectInputConfigIn,
212
+ filterTextIn,
213
+ filterInputConfigIn,
214
+ pulldownDrop,
215
+ tableTreeProps,
216
+ selectLabels,
217
+ getSelectionData,
218
+ onFocus,
219
+ onClear,
220
+ onHidePanel,
221
+ onDataCall,
222
+ onChange
223
+ }
224
+ }
225
+ })
226
+ </script>
227
+
228
+ <style lang="scss" scoped></style>
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  modelValue: {
3
- type: Array,
3
+ type: [Array, String],
4
4
  default() {
5
5
  return []
6
6
  }
package/packages/index.js CHANGED
@@ -1,39 +1,39 @@
1
- import packageConfig from '../package.json'
2
- import { utils, notice } from 'sh-tools'
3
- import { VueMasonryPlugin } from 'vue-masonry'
4
- import directive from './directive/index'
5
- import vxeTable from './vxeTable/index'
6
- import globalComponents from './components/index'
7
- import mixin from './mixin/index'
8
- import './css/index'
9
-
10
- // 全局公共封装组件
11
- const install = function (root, option = {}) {
12
- if (install.installed) return
13
- root.config.globalProperties.$vUtils = utils
14
- root.config.globalProperties.$Notice = notice
15
- root.mixin(mixin)
16
- root.use(VueMasonryPlugin, option)
17
- root.use(directive)
18
- root.use(vxeTable, option)
19
- root.use(globalComponents, option)
20
- }
21
-
22
- const ShUI = {
23
- name: packageConfig.name,
24
- version: packageConfig.version,
25
- install
26
- }
27
-
28
- let consInfo = ''
29
- let defaultBg = 'padding: 5px; color: #111; background: #f5f7f9; font-weight: bold;'
30
- let tagBg1 = 'padding: 5px; color: #fff; background: #8e2eff; font-weight: bold;'
31
- let tagBg2 = 'padding: 5px; color: #333; background: #ffee2e; font-weight: bold;'
32
- if ((window.navigator.language || window.navigator.browserLanguage).toLowerCase() === 'zh-cn') {
33
- consInfo = `%c由%c${ShUI.name}%c提供技术支持,版本%c${ShUI.version}%c`
34
- } else {
35
- consInfo = `%cPowered by%c${ShUI.name}%c,version%c${ShUI.version}%c`
36
- }
37
- console.info(consInfo, defaultBg, tagBg1, defaultBg, tagBg2, defaultBg)
38
-
39
- export default ShUI
1
+ import packageConfig from '../package.json'
2
+ import { utils, notice } from 'sh-tools'
3
+ import { VueMasonryPlugin } from 'vue-masonry'
4
+ import directive from './directive/index'
5
+ import vxeTable from './vxeTable/index'
6
+ import components from './components/index'
7
+ import mixin from './mixin/index'
8
+ import './css/index'
9
+
10
+ // 全局公共封装组件
11
+ const install = function (root, option = {}) {
12
+ if (install.installed) return
13
+ root.config.globalProperties.$vUtils = utils
14
+ root.config.globalProperties.$Notice = notice
15
+ root.mixin(mixin)
16
+ root.use(VueMasonryPlugin, option)
17
+ root.use(directive)
18
+ root.use(vxeTable, option)
19
+ root.use(components, option)
20
+ }
21
+
22
+ const ShUI = {
23
+ name: packageConfig.name,
24
+ version: packageConfig.version,
25
+ install
26
+ }
27
+
28
+ let consInfo = ''
29
+ let defaultBg = 'padding: 5px; color: #111; background: #f5f7f9; font-weight: bold;'
30
+ let tagBg1 = 'padding: 5px; color: #fff; background: #8e2eff; font-weight: bold;'
31
+ let tagBg2 = 'padding: 5px; color: #333; background: #ffee2e; font-weight: bold;'
32
+ if ((window.navigator.language || window.navigator.browserLanguage).toLowerCase() === 'zh-cn') {
33
+ consInfo = `%c由%c${ShUI.name}%c提供技术支持,版本%c${ShUI.version}%c`
34
+ } else {
35
+ consInfo = `%cPowered by%c${ShUI.name}%c,version%c${ShUI.version}%c`
36
+ }
37
+ console.info(consInfo, defaultBg, tagBg1, defaultBg, tagBg2, defaultBg)
38
+
39
+ export default ShUI