sh-view 2.10.8 → 2.10.10
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.
- package/package.json +4 -4
- package/packages/components/sh-code-editor/index.vue +40 -15
- package/packages/components/sh-date/index.vue +1 -1
- package/packages/components/sh-form/js/props.js +32 -13
- package/packages/components/sh-form/js/useForm.js +4 -3
- package/packages/components/sh-icon/css/index.scss +4 -5
- package/packages/components/sh-input/index.vue +12 -0
- package/packages/components/sh-table/js/props.js +7 -7
- package/packages/components/sh-table/js/useTable.js +16 -15
- package/packages/components/sh-tree/components/table-tree.vue +13 -24
- package/packages/components/sh-tree/index.vue +16 -22
- package/packages/components/sh-tree/mixin/treeProps.js +11 -6
- package/packages/other/sh-menu/index.vue +5 -3
- package/packages/vxeTable/index.js +8 -7
- package/packages/vxeTable/render/cell/vxe-render-table.vue +3 -3
- package/packages/vxeTable/render/mixin/cell-hooks.js +2 -1
- /package/packages/vxeTable/render/{globalRenders.jsx → globalRenders.js} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sh-view",
|
|
3
|
-
"version": "2.10.
|
|
3
|
+
"version": "2.10.10",
|
|
4
4
|
"description": "基于vxe-table二次封装,更包含Alert,Badge,Card,CodeEditor,Col,Corner,CountTo,Drawer,Empty,Form,Header,Icon,List,Loading,Modal,Noticebar,Poptip,Progress,PullRefresh,Query,Result,Row,Split,Grid,Table,Tabs,Tag,Toolbar,Tree,Upload,WaterFall,WaterMark等丰富组件库",
|
|
5
5
|
"main": "packages/index.js",
|
|
6
6
|
"typings": "types/index.d.ts",
|
|
@@ -38,11 +38,11 @@
|
|
|
38
38
|
"lunar-typescript": "^1.8.6",
|
|
39
39
|
"popper.js": "^1.16.1",
|
|
40
40
|
"sh-tools": "^2.3.12",
|
|
41
|
-
"vue": "^3.5.
|
|
41
|
+
"vue": "^3.5.29",
|
|
42
42
|
"vue-masonry": "^0.16.0",
|
|
43
43
|
"vue-router": "^4.6.4",
|
|
44
|
-
"vxe-pc-ui": "^4.
|
|
45
|
-
"vxe-table": "^4.17.
|
|
44
|
+
"vxe-pc-ui": "^4.13.0",
|
|
45
|
+
"vxe-table": "^4.17.49"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
</template>
|
|
7
7
|
|
|
8
8
|
<script>
|
|
9
|
-
import { defineComponent, ref, computed, watch, onMounted, onUnmounted, nextTick, getCurrentInstance } from 'vue'
|
|
9
|
+
import { defineComponent, ref, computed, watch, onMounted, onUnmounted, nextTick, getCurrentInstance, reactive } from 'vue'
|
|
10
10
|
import { basicSetup } from 'codemirror'
|
|
11
11
|
import { keymap, placeholder, EditorView } from '@codemirror/view'
|
|
12
12
|
import { Compartment, EditorState, StateEffect } from '@codemirror/state'
|
|
@@ -147,6 +147,10 @@ export default defineComponent({
|
|
|
147
147
|
const codeEditor = ref(null)
|
|
148
148
|
const codeError = ref(null)
|
|
149
149
|
const codeRef = ref()
|
|
150
|
+
const reactData = reactive({
|
|
151
|
+
isComposed: false,
|
|
152
|
+
isActivated: false
|
|
153
|
+
})
|
|
150
154
|
|
|
151
155
|
const styles = computed(() => {
|
|
152
156
|
return {
|
|
@@ -247,7 +251,8 @@ export default defineComponent({
|
|
|
247
251
|
tabSize.of(EditorState.tabSize.of(props.indent)),
|
|
248
252
|
EditorState.allowMultipleSelections.of(props.multipleSelection),
|
|
249
253
|
EditorView.editable.of(!disabled),
|
|
250
|
-
customKeymap()
|
|
254
|
+
customKeymap(),
|
|
255
|
+
domEventHandlers
|
|
251
256
|
]
|
|
252
257
|
// 括号自动补全
|
|
253
258
|
if (autoclose) innerExtensions.push(closeBrackets())
|
|
@@ -283,10 +288,9 @@ export default defineComponent({
|
|
|
283
288
|
|
|
284
289
|
const codeRender = async () => {
|
|
285
290
|
const docValue = getTransformValue(props.modelValue)
|
|
286
|
-
let editExtensions = [EditorView.focusChangeEffect.of(focusListener), EditorView.updateListener.of(updateListener)].concat(codeExtensions.value)
|
|
287
291
|
const codeState = EditorState.create({
|
|
288
292
|
doc: docValue,
|
|
289
|
-
extensions:
|
|
293
|
+
extensions: codeExtensions.value
|
|
290
294
|
})
|
|
291
295
|
codeEditor.value = new EditorView({
|
|
292
296
|
parent: codeRef.value,
|
|
@@ -296,21 +300,42 @@ export default defineComponent({
|
|
|
296
300
|
dispatchEvent('loaded', props.modelValue)
|
|
297
301
|
}
|
|
298
302
|
|
|
299
|
-
const
|
|
300
|
-
|
|
301
|
-
|
|
303
|
+
const domEventHandlers = EditorView.domEventHandlers({
|
|
304
|
+
focus: (event, view) => {
|
|
305
|
+
reactData.isActivated = true
|
|
306
|
+
const valueStr = view.state.doc.toString()
|
|
302
307
|
dispatchEvent('focus', valueStr)
|
|
303
|
-
|
|
308
|
+
return false
|
|
309
|
+
},
|
|
310
|
+
blur: (event, view) => {
|
|
311
|
+
reactData.isActivated = false
|
|
312
|
+
const valueStr = view.state.doc.toString()
|
|
304
313
|
dispatchValue(valueStr)
|
|
305
314
|
dispatchEvent('blur', valueStr)
|
|
315
|
+
return false
|
|
316
|
+
},
|
|
317
|
+
input: (event, view) => {
|
|
318
|
+
if (reactData.isComposed) {
|
|
319
|
+
return
|
|
320
|
+
}
|
|
321
|
+
const valueStr = view.state.doc.toString()
|
|
322
|
+
dispatchEvent('change', valueStr)
|
|
323
|
+
return false
|
|
324
|
+
},
|
|
325
|
+
compositionstart: (event, view) => {
|
|
326
|
+
reactData.isComposed = true
|
|
327
|
+
return false
|
|
328
|
+
},
|
|
329
|
+
compositionend: (event, view) => {
|
|
330
|
+
if (!reactData.isComposed) {
|
|
331
|
+
return
|
|
332
|
+
}
|
|
333
|
+
reactData.isComposed = false
|
|
334
|
+
const valueStr = view.state.doc.toString()
|
|
335
|
+
dispatchEvent('change', valueStr)
|
|
336
|
+
return false
|
|
306
337
|
}
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
const updateListener = ({ state, changes, docChanged }) => {
|
|
310
|
-
if (changes.empty || !docChanged) return
|
|
311
|
-
const valueStr = state.doc.toString()
|
|
312
|
-
dispatchEvent('change', valueStr)
|
|
313
|
-
}
|
|
338
|
+
})
|
|
314
339
|
|
|
315
340
|
const focus = () => {
|
|
316
341
|
codeEditor.value && codeEditor.value.focus()
|
|
@@ -5,7 +5,10 @@ export default {
|
|
|
5
5
|
return {}
|
|
6
6
|
}
|
|
7
7
|
},
|
|
8
|
-
loading:
|
|
8
|
+
loading: {
|
|
9
|
+
type: Boolean,
|
|
10
|
+
default: null
|
|
11
|
+
},
|
|
9
12
|
span: {
|
|
10
13
|
type: [Number, String],
|
|
11
14
|
default: 6
|
|
@@ -18,9 +21,15 @@ export default {
|
|
|
18
21
|
type: String,
|
|
19
22
|
default: 'center'
|
|
20
23
|
},
|
|
21
|
-
border:
|
|
24
|
+
border: {
|
|
25
|
+
type: Boolean,
|
|
26
|
+
default: null
|
|
27
|
+
},
|
|
22
28
|
size: String,
|
|
23
|
-
titleBackground:
|
|
29
|
+
titleBackground: {
|
|
30
|
+
type: Boolean,
|
|
31
|
+
default: null
|
|
32
|
+
},
|
|
24
33
|
titleAlign: {
|
|
25
34
|
type: String,
|
|
26
35
|
default: 'right'
|
|
@@ -31,11 +40,11 @@ export default {
|
|
|
31
40
|
},
|
|
32
41
|
titleColon: {
|
|
33
42
|
type: Boolean,
|
|
34
|
-
default:
|
|
43
|
+
default: null
|
|
35
44
|
},
|
|
36
45
|
titleAsterisk: {
|
|
37
46
|
type: Boolean,
|
|
38
|
-
default:
|
|
47
|
+
default: null
|
|
39
48
|
},
|
|
40
49
|
titleOverflow: {
|
|
41
50
|
type: String,
|
|
@@ -43,17 +52,26 @@ export default {
|
|
|
43
52
|
},
|
|
44
53
|
padding: {
|
|
45
54
|
type: Boolean,
|
|
46
|
-
default:
|
|
55
|
+
default: null
|
|
47
56
|
},
|
|
48
57
|
readonly: {
|
|
49
58
|
type: Boolean,
|
|
50
|
-
default:
|
|
59
|
+
default: null
|
|
60
|
+
},
|
|
61
|
+
vertical: {
|
|
62
|
+
type: Boolean,
|
|
63
|
+
default: null
|
|
51
64
|
},
|
|
52
|
-
vertical: Boolean,
|
|
53
65
|
className: String,
|
|
54
66
|
// disabled: Boolean, // 弃用
|
|
55
|
-
collapseStatus:
|
|
56
|
-
|
|
67
|
+
collapseStatus: {
|
|
68
|
+
type: Boolean,
|
|
69
|
+
default: null
|
|
70
|
+
},
|
|
71
|
+
collapseLayout: {
|
|
72
|
+
type: Boolean,
|
|
73
|
+
default: null
|
|
74
|
+
},
|
|
57
75
|
items: {
|
|
58
76
|
type: Array,
|
|
59
77
|
default() {
|
|
@@ -66,9 +84,9 @@ export default {
|
|
|
66
84
|
return {}
|
|
67
85
|
}
|
|
68
86
|
},
|
|
69
|
-
|
|
87
|
+
preventSubmit: {
|
|
70
88
|
type: Boolean,
|
|
71
|
-
default:
|
|
89
|
+
default: false
|
|
72
90
|
},
|
|
73
91
|
validConfig: {
|
|
74
92
|
type: Object,
|
|
@@ -88,7 +106,8 @@ export default {
|
|
|
88
106
|
|
|
89
107
|
// 扩展配置
|
|
90
108
|
editable: {
|
|
91
|
-
type: Boolean // 表格是否可编辑,默认不可编辑,弃用原表格的 disabled,为了统一自定义渲染器
|
|
109
|
+
type: Boolean, // 表格是否可编辑,默认不可编辑,弃用原表格的 disabled,为了统一自定义渲染器
|
|
110
|
+
default: null
|
|
92
111
|
},
|
|
93
112
|
caculateConfig: {
|
|
94
113
|
type: Object,
|
|
@@ -39,10 +39,11 @@ export default function (props, context, proxy, isForm) {
|
|
|
39
39
|
})
|
|
40
40
|
return formulaReplaceAll(formulaList)
|
|
41
41
|
})
|
|
42
|
+
const formEditable = computed(() => ($vUtils.isNone(props.editable) ? $vUiSetup.form.editable : props.editable))
|
|
42
43
|
const formBindConfig = computed(() => {
|
|
43
|
-
let formProps = $vUtils.omit(props, (val, key) => omitProps.includes(key))
|
|
44
|
+
let formProps = $vUtils.omit(props, (val, key) => omitProps.includes(key) || $vUtils.isNone(val))
|
|
44
45
|
let shProps = {
|
|
45
|
-
disabled: !
|
|
46
|
+
disabled: !formEditable.value,
|
|
46
47
|
items: formItems.value,
|
|
47
48
|
rules: props.valid ? formFullRules.value : {},
|
|
48
49
|
formulaList: formFormulaList.value,
|
|
@@ -145,7 +146,7 @@ export default function (props, context, proxy, isForm) {
|
|
|
145
146
|
const { isItemTitle } = props
|
|
146
147
|
// 表单不支持编辑渲染过滤
|
|
147
148
|
let notRenderName = ['seq', 'checkbox', 'radio', '$vImg', '$vHref', '$vOparate']
|
|
148
|
-
let renderItems = $vUtils.searchTree(items, item => !((item.renderName && notRenderName.includes(item.renderName)) || notRenderName.includes(item.type)))
|
|
149
|
+
let renderItems = $vUtils.searchTree(items, item => !((item.renderName && notRenderName.includes(item.renderName)) || notRenderName.includes(item.type)), { isEvery: true })
|
|
149
150
|
let flatItemsArr = []
|
|
150
151
|
let rules = {}
|
|
151
152
|
let renderDefaultProps = $vTableSetup.renderConfig || {}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
@use "./default/icons" as default-icons;
|
|
2
|
+
@use "./font/icons" as font-icons;
|
|
3
|
+
|
|
1
4
|
@font-face {
|
|
2
5
|
font-family: 'Ionicons';
|
|
3
6
|
src: url("./default/ionicons.woff2") format("woff2"),
|
|
@@ -24,8 +27,6 @@
|
|
|
24
27
|
text-align: center;
|
|
25
28
|
}
|
|
26
29
|
|
|
27
|
-
@import "./default/icons";
|
|
28
|
-
|
|
29
30
|
@font-face {
|
|
30
31
|
font-family: "iconfont";
|
|
31
32
|
src: url('./font/iconfont.woff2?t=1661513291946') format('woff2'),
|
|
@@ -39,6 +40,4 @@
|
|
|
39
40
|
font-style: normal;
|
|
40
41
|
-webkit-font-smoothing: antialiased;
|
|
41
42
|
-moz-osx-font-smoothing: grayscale;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
@import "./font/icons";
|
|
43
|
+
}
|
|
@@ -56,6 +56,7 @@ export default defineComponent({
|
|
|
56
56
|
const inputRef = ref()
|
|
57
57
|
|
|
58
58
|
const reactData = reactive({
|
|
59
|
+
isComposed: false,
|
|
59
60
|
isActivated: false,
|
|
60
61
|
inputValue: props.modelValue
|
|
61
62
|
})
|
|
@@ -131,6 +132,12 @@ export default defineComponent({
|
|
|
131
132
|
triggerEvent(evnt)
|
|
132
133
|
}
|
|
133
134
|
const inputEvent = evnt => {
|
|
135
|
+
if (reactData.isComposed) {
|
|
136
|
+
return
|
|
137
|
+
}
|
|
138
|
+
const inputElem = evnt.target
|
|
139
|
+
const value = inputElem.value
|
|
140
|
+
handleChange(value, evnt)
|
|
134
141
|
triggerEvent(evnt)
|
|
135
142
|
}
|
|
136
143
|
const changeEvent = evnt => {
|
|
@@ -148,9 +155,14 @@ export default defineComponent({
|
|
|
148
155
|
triggerEvent(evnt)
|
|
149
156
|
}
|
|
150
157
|
const compositionStart = evnt => {
|
|
158
|
+
reactData.isComposed = true
|
|
151
159
|
triggerEvent(evnt)
|
|
152
160
|
}
|
|
153
161
|
const compositionEnd = evnt => {
|
|
162
|
+
if (!reactData.isComposed) {
|
|
163
|
+
return
|
|
164
|
+
}
|
|
165
|
+
reactData.isComposed = false
|
|
154
166
|
const inputElem = evnt.target
|
|
155
167
|
const value = inputElem.value
|
|
156
168
|
handleChange(value, evnt)
|
|
@@ -31,11 +31,11 @@ export default {
|
|
|
31
31
|
type: Boolean
|
|
32
32
|
},
|
|
33
33
|
syncResize: {
|
|
34
|
-
type: [Boolean, String, Number]
|
|
35
|
-
default: true
|
|
34
|
+
type: [Boolean, String, Number]
|
|
36
35
|
},
|
|
37
36
|
stripe: {
|
|
38
|
-
type: Boolean
|
|
37
|
+
type: Boolean,
|
|
38
|
+
default: null
|
|
39
39
|
},
|
|
40
40
|
border: {
|
|
41
41
|
type: [Boolean, String],
|
|
@@ -43,7 +43,7 @@ export default {
|
|
|
43
43
|
},
|
|
44
44
|
round: {
|
|
45
45
|
type: Boolean,
|
|
46
|
-
default:
|
|
46
|
+
default: null
|
|
47
47
|
},
|
|
48
48
|
size: {
|
|
49
49
|
type: String,
|
|
@@ -51,7 +51,7 @@ export default {
|
|
|
51
51
|
},
|
|
52
52
|
loading: {
|
|
53
53
|
type: Boolean,
|
|
54
|
-
default:
|
|
54
|
+
default: null
|
|
55
55
|
},
|
|
56
56
|
align: {
|
|
57
57
|
type: String,
|
|
@@ -85,7 +85,7 @@ export default {
|
|
|
85
85
|
},
|
|
86
86
|
showFooter: {
|
|
87
87
|
type: Boolean,
|
|
88
|
-
default:
|
|
88
|
+
default: null
|
|
89
89
|
},
|
|
90
90
|
footerMethod: {
|
|
91
91
|
type: Function
|
|
@@ -106,7 +106,7 @@ export default {
|
|
|
106
106
|
},
|
|
107
107
|
showFooterOverflow: {
|
|
108
108
|
type: [Boolean, String],
|
|
109
|
-
default:
|
|
109
|
+
default: null
|
|
110
110
|
},
|
|
111
111
|
footerSpanMethod: {
|
|
112
112
|
type: [Function]
|
|
@@ -461,11 +461,7 @@ export default function (props, context, proxy, isGrid) {
|
|
|
461
461
|
// -------- 搜索
|
|
462
462
|
// 表单展开全部/收起切换事件
|
|
463
463
|
const onFormCollapsed = value => {
|
|
464
|
-
|
|
465
|
-
setTimeout(() => {
|
|
466
|
-
tableRef.value.recalculate(true)
|
|
467
|
-
})
|
|
468
|
-
}
|
|
464
|
+
tableRef.value.recalculate(true)
|
|
469
465
|
}
|
|
470
466
|
const onFormSubmit = () => {
|
|
471
467
|
emit('form-submit', props.queryData)
|
|
@@ -572,13 +568,17 @@ export default function (props, context, proxy, isGrid) {
|
|
|
572
568
|
searchFields.push({ rkey: col.property, rname: renderObj.name, rprops: Object.assign({}, renderObj.props, col.rprops) })
|
|
573
569
|
}
|
|
574
570
|
})
|
|
575
|
-
filterData = $vUtils.searchTree(
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
571
|
+
filterData = $vUtils.searchTree(
|
|
572
|
+
props.dataSourse,
|
|
573
|
+
row => {
|
|
574
|
+
return searchFields.some(item => {
|
|
575
|
+
let cellValue = $vUtils.get(row, item.rkey)
|
|
576
|
+
let { rtext } = $vUtils.formatRender(cellValue, item.rkey, row, item.rname, item.rprops, proxy)
|
|
577
|
+
return $vUtils.trim(rtext).toLowerCase().indexOf(filterText) > -1
|
|
578
|
+
})
|
|
579
|
+
},
|
|
580
|
+
{ isEvery: true, children: tableBindConfig.value.treeConfig?.childrenField }
|
|
581
|
+
)
|
|
582
582
|
}
|
|
583
583
|
if (tableFilterData.value === null && !filterText) {
|
|
584
584
|
return
|
|
@@ -700,8 +700,8 @@ export default function (props, context, proxy, isGrid) {
|
|
|
700
700
|
updateSelection()
|
|
701
701
|
return newRow
|
|
702
702
|
}
|
|
703
|
-
// 复制行按钮
|
|
704
|
-
const handleToolCopy = async (rows,
|
|
703
|
+
// 复制行按钮 isNext复制到目标行的 上面还是下面,默认到下面
|
|
704
|
+
const handleToolCopy = async (rows, isNext = true) => {
|
|
705
705
|
let selectedRows = getSelectionData()
|
|
706
706
|
let copyRows = $vUtils.clone(rows || selectedRows, true)
|
|
707
707
|
if (copyRows.length < 1) {
|
|
@@ -711,7 +711,8 @@ export default function (props, context, proxy, isGrid) {
|
|
|
711
711
|
if (typeof props.onToolbarCopyBefore === 'function') {
|
|
712
712
|
copyRows = await props.onToolbarCopyBefore(copyRows)
|
|
713
713
|
}
|
|
714
|
-
let
|
|
714
|
+
let insertType = isNext ? 'insertNextAt' : 'insertAt'
|
|
715
|
+
let insertList = copyRows.map(row => tableRef.value[insertType](Object.assign({}, row, { [keyField.value]: undefined }), row))
|
|
715
716
|
let insertRes = await Promise.all(insertList)
|
|
716
717
|
let insertRows = insertRes.map(item => item.row)
|
|
717
718
|
updateSelection()
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<vxe-table
|
|
3
3
|
ref="tableRef"
|
|
4
|
-
v-resize="offetChangeDebounce"
|
|
5
4
|
:class="{ 'sh-vxe-tree-table': true, 'is--hidecheck': globalConfig.checkHide }"
|
|
6
5
|
v-bind="tableConfigIn"
|
|
7
|
-
:syncResize="syncResize"
|
|
8
6
|
@radio-change="onRadioChange"
|
|
9
7
|
@checkbox-change="onSelectionChange"
|
|
10
8
|
@checkbox-all="onSelectionChange">
|
|
11
9
|
<vxe-column :field="labelField" :title="labelTitle || multiple ? '全部' : ''" :width="checkWidth" :type="multiple ? 'checkbox' : 'radio'" treeNode>
|
|
12
10
|
<template #default="scoped">
|
|
13
|
-
<span>{{
|
|
11
|
+
<span>{{ treeNodeContent(scoped) }}</span>
|
|
14
12
|
</template>
|
|
15
13
|
</vxe-column>
|
|
16
14
|
<template v-if="globalConfig.columns && globalConfig.columns.length > 0">
|
|
@@ -59,7 +57,7 @@ export default defineComponent({
|
|
|
59
57
|
rowConfig: { keyField: treeNodeKey.value },
|
|
60
58
|
radioConfig: { labelField: props.labelField, checkMethod: tableCheckMethods },
|
|
61
59
|
checkboxConfig: { labelField: props.labelField, checkMethod: tableCheckMethods },
|
|
62
|
-
treeConfig: { rowField: treeNodeKey.value },
|
|
60
|
+
treeConfig: { rowField: treeNodeKey.value, expandAll: props.globalConfig?.expandAll },
|
|
63
61
|
editConfig: { enabled: false }
|
|
64
62
|
}
|
|
65
63
|
if (props.multiple && props.globalConfig.hasAll) resultConfig.showHeader = true
|
|
@@ -147,10 +145,14 @@ export default defineComponent({
|
|
|
147
145
|
if (filterText) {
|
|
148
146
|
const tableTreeData = treeFullList.value
|
|
149
147
|
const tableTreeColumn = tableRef.value.getColumnByField(labelField)
|
|
150
|
-
searchData = $vUtils.searchTree(
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
148
|
+
searchData = $vUtils.searchTree(
|
|
149
|
+
tableTreeData,
|
|
150
|
+
row => {
|
|
151
|
+
let cellText = treeNodeContent({ row, column: tableTreeColumn })
|
|
152
|
+
return $vUtils.trim(cellText).indexOf(filterText) > -1
|
|
153
|
+
},
|
|
154
|
+
{ isEvery: true, children: treeChildKey.value }
|
|
155
|
+
)
|
|
154
156
|
if (treeIstransform.value) {
|
|
155
157
|
searchData = $vUtils.toTreeArray(searchData, transformOption.value)
|
|
156
158
|
}
|
|
@@ -161,32 +163,21 @@ export default defineComponent({
|
|
|
161
163
|
filterData.value = searchData
|
|
162
164
|
tableRef.value.setAllTreeExpand(true)
|
|
163
165
|
}
|
|
164
|
-
// 获取选中的数据
|
|
165
|
-
const getSelectionData = () => {
|
|
166
|
-
return tableRef.value.getCheckboxRecords()
|
|
167
|
-
}
|
|
168
166
|
const tableCheckMethods = ({ row, $table }) => {
|
|
169
167
|
if (props.isLeaf && !props.multiple) {
|
|
170
168
|
return (row[treeChildKey.value] || []).length < 1
|
|
171
169
|
}
|
|
172
170
|
return true
|
|
173
171
|
}
|
|
174
|
-
const
|
|
172
|
+
const treeNodeContent = ({ row, column }) => {
|
|
175
173
|
if (props.labelFormat) {
|
|
176
174
|
return $vUtils.format(props.labelFormat, row)
|
|
177
175
|
}
|
|
178
176
|
return $vUtils.get(row, column.property)
|
|
179
177
|
}
|
|
180
|
-
const handleOffsetChange = () => {
|
|
181
|
-
syncResize.value = true
|
|
182
|
-
setTimeout(() => {
|
|
183
|
-
syncResize.value = false
|
|
184
|
-
})
|
|
185
|
-
}
|
|
186
178
|
|
|
187
179
|
const initChangeDebounce = $vUtils.debounce(initSelection, 200)
|
|
188
180
|
const filterChangeDebounce = $vUtils.debounce(handleMyTableFilter, 500)
|
|
189
|
-
const offetChangeDebounce = $vUtils.debounce(handleOffsetChange, tableConfigIn.value.resizeConfig?.refreshDelay || 300)
|
|
190
181
|
|
|
191
182
|
onMounted(() => {
|
|
192
183
|
initChangeDebounce()
|
|
@@ -213,10 +204,8 @@ export default defineComponent({
|
|
|
213
204
|
tableConfigIn,
|
|
214
205
|
onRadioChange,
|
|
215
206
|
onSelectionChange,
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
initSelection,
|
|
219
|
-
offetChangeDebounce
|
|
207
|
+
treeNodeContent,
|
|
208
|
+
initSelection
|
|
220
209
|
}
|
|
221
210
|
}
|
|
222
211
|
})
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
</div>
|
|
9
9
|
</template>
|
|
10
10
|
<template #dropdown>
|
|
11
|
-
<div v-if="filter" class="sh-tree-filter">
|
|
11
|
+
<div v-if="propsConfig.filter" class="sh-tree-filter">
|
|
12
12
|
<sh-input ref="filterInputRef" v-model="filterTextIn" class="sh-tree-filter-input" v-bind="filterInputConfigIn"></sh-input>
|
|
13
13
|
</div>
|
|
14
14
|
<div class="sh-tree-select-dropdown">
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
</vxe-pulldown>
|
|
20
20
|
</template>
|
|
21
21
|
<template v-else>
|
|
22
|
-
<div v-if="filter" class="sh-tree-filter">
|
|
22
|
+
<div v-if="propsConfig.filter" class="sh-tree-filter">
|
|
23
23
|
<sh-input ref="filterInputRef" v-model="filterTextIn" class="sh-tree-filter-input" v-bind="filterInputConfigIn"></sh-input>
|
|
24
24
|
</div>
|
|
25
25
|
<div class="sh-tree-content" :class="{ 'has-filter': filter }">
|
|
@@ -35,6 +35,8 @@ import { defineComponent, computed, onMounted, getCurrentInstance, ref, watch }
|
|
|
35
35
|
import './css/index.scss'
|
|
36
36
|
import mixinProps from './mixin/treeProps'
|
|
37
37
|
import tableTree from './components/table-tree.vue'
|
|
38
|
+
|
|
39
|
+
let pickProps = ['nodeKey', 'valueKeys', 'filter', 'format', 'split', 'labelField', 'labelTitle', 'labelFormat', 'emptyIcon', 'emptyText']
|
|
38
40
|
export default defineComponent({
|
|
39
41
|
name: 'ShTree',
|
|
40
42
|
components: {
|
|
@@ -73,18 +75,15 @@ export default defineComponent({
|
|
|
73
75
|
const checkConfig = computed(() => ({ disabled: props.disabled, size: props.size }))
|
|
74
76
|
const selectValue = computed(() => (props.multiple ? selectedKeys.value : selectedKeys.value[0] || ''))
|
|
75
77
|
const propsConfig = computed(() => {
|
|
78
|
+
let treeProps = $vUtils.pick(props, (val, key) => pickProps.includes(key) && !$vUtils.isNone(val))
|
|
79
|
+
let setupProps = $vUtils.pick(treeSetupConfig, (val, key) => pickProps.includes(key) && !$vUtils.isNone(val))
|
|
80
|
+
let vxeSetupConfig = $vUtils.clone({ treeConfig: $vTableSetup.table.treeConfig }, true)
|
|
81
|
+
let shSetupConfig = $vUtils.clone($vUiSetup.shtree.tableConfig, true)
|
|
76
82
|
return {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
format: props.format || treeSetupConfig.format,
|
|
80
|
-
split: props.split || treeSetupConfig.split,
|
|
81
|
-
labelField: props.labelField || treeSetupConfig.labelField,
|
|
82
|
-
labelTitle: props.labelTitle || treeSetupConfig.labelTitle,
|
|
83
|
-
labelFormat: props.labelFormat || treeSetupConfig.labelFormat,
|
|
84
|
-
emptyIcon: props.emptyIcon || treeSetupConfig.emptyIcon,
|
|
85
|
-
emptyText: props.emptyText || treeSetupConfig.emptyText,
|
|
83
|
+
...setupProps,
|
|
84
|
+
...treeProps,
|
|
86
85
|
globalConfig: Object.assign({}, treeSetupConfig.globalConfig, props.globalConfig),
|
|
87
|
-
tableConfig:
|
|
86
|
+
tableConfig: $vUtils.merge(vxeSetupConfig, shSetupConfig, props.tableConfig)
|
|
88
87
|
}
|
|
89
88
|
})
|
|
90
89
|
|
|
@@ -109,11 +108,7 @@ export default defineComponent({
|
|
|
109
108
|
return Object.assign({ transfer: true }, propsConfig.value.globalConfig?.selectConfig, checkConfig.value)
|
|
110
109
|
})
|
|
111
110
|
const selectInputConfigIn = computed(() => {
|
|
112
|
-
return Object.assign(
|
|
113
|
-
{ clearable: true, controls: false, transfer: false, editable: false, suffixIcon: 'vxe-icon-caret-down', placeholder: props.placeholder },
|
|
114
|
-
propsConfig.value.globalConfig?.inputConfig,
|
|
115
|
-
checkConfig.value
|
|
116
|
-
)
|
|
111
|
+
return Object.assign({ clearable: true, readonly: true, suffixIcon: 'vxe-icon-caret-down', placeholder: props.placeholder }, propsConfig.value.globalConfig?.inputConfig, checkConfig.value)
|
|
117
112
|
})
|
|
118
113
|
const filterInputConfigIn = computed(() => {
|
|
119
114
|
return Object.assign({ prefixIcon: 'vxe-icon-search', placeholder: '搜索', clearable: true }, propsConfig.value.globalConfig?.filterInputConfig)
|
|
@@ -206,15 +201,14 @@ export default defineComponent({
|
|
|
206
201
|
// 树节点获取焦点事件
|
|
207
202
|
const onFocus = async obj => {
|
|
208
203
|
emitFocus()
|
|
209
|
-
treeSelectInputRef.value.blur()
|
|
210
204
|
await treeSelectRef.value.togglePanel()
|
|
211
205
|
pulldownDrop.value = true
|
|
212
|
-
if (filterInputRef.value)
|
|
206
|
+
if (filterInputRef.value) {
|
|
207
|
+
filterInputRef.value.focus()
|
|
208
|
+
}
|
|
213
209
|
// 初始化获取服务配置数据
|
|
214
210
|
await getServerConfigDataSourse()
|
|
215
|
-
|
|
216
|
-
tableTreeRef.value.initSelection(true)
|
|
217
|
-
}
|
|
211
|
+
tableTreeRef.value && tableTreeRef.value.initSelection(true)
|
|
218
212
|
}
|
|
219
213
|
// 树节点选择变换事件
|
|
220
214
|
const onChange = async (keys, rows, obj) => {
|
|
@@ -6,7 +6,8 @@ export default {
|
|
|
6
6
|
}
|
|
7
7
|
},
|
|
8
8
|
isSelect: {
|
|
9
|
-
type: Boolean
|
|
9
|
+
type: Boolean,
|
|
10
|
+
default: null
|
|
10
11
|
},
|
|
11
12
|
nodeKey: {
|
|
12
13
|
type: String,
|
|
@@ -28,10 +29,12 @@ export default {
|
|
|
28
29
|
type: String
|
|
29
30
|
},
|
|
30
31
|
isLeaf: {
|
|
31
|
-
type: Boolean
|
|
32
|
+
type: Boolean,
|
|
33
|
+
default: null
|
|
32
34
|
},
|
|
33
35
|
disabled: {
|
|
34
|
-
type: Boolean
|
|
36
|
+
type: Boolean,
|
|
37
|
+
default: null
|
|
35
38
|
},
|
|
36
39
|
level: {
|
|
37
40
|
type: Number,
|
|
@@ -66,16 +69,18 @@ export default {
|
|
|
66
69
|
},
|
|
67
70
|
loading: {
|
|
68
71
|
type: Boolean,
|
|
69
|
-
default:
|
|
72
|
+
default: null
|
|
70
73
|
},
|
|
71
74
|
filter: {
|
|
72
|
-
type: Boolean
|
|
75
|
+
type: Boolean,
|
|
76
|
+
default: null
|
|
73
77
|
},
|
|
74
78
|
filterText: {
|
|
75
79
|
type: String
|
|
76
80
|
},
|
|
77
81
|
multiple: {
|
|
78
|
-
type: Boolean
|
|
82
|
+
type: Boolean,
|
|
83
|
+
default: null
|
|
79
84
|
},
|
|
80
85
|
globalConfig: {
|
|
81
86
|
type: Object
|
|
@@ -83,14 +83,16 @@ export default defineComponent({
|
|
|
83
83
|
resetExpand(activeName.value, true)
|
|
84
84
|
}
|
|
85
85
|
const resetExpand = (menuName, mount) => {
|
|
86
|
+
let activeMenus = []
|
|
86
87
|
let parentNames = []
|
|
87
88
|
$vUtils.eachTree(props.options, (item, index, obj, paths, parent, nodes) => {
|
|
88
|
-
if (item.name === menuName
|
|
89
|
-
|
|
89
|
+
if (item.name === menuName) {
|
|
90
|
+
activeMenus = item.name
|
|
91
|
+
parentNames = nodes.map(n => n.name)
|
|
90
92
|
}
|
|
91
93
|
})
|
|
92
94
|
if (mount) {
|
|
93
|
-
activeNames.value =
|
|
95
|
+
activeNames.value = activeMenus
|
|
94
96
|
if (props.collapsed || props.mode !== 'vertical') return
|
|
95
97
|
}
|
|
96
98
|
if (!props.accordion) parentNames = Array.from(new Set(openedNames.value.concat(parentNames)))
|
|
@@ -18,7 +18,7 @@ import '@vxe-ui/plugin-menu/dist/style.css'
|
|
|
18
18
|
import VxeUIPluginRenderWangEditor from '@vxe-ui/plugin-render-wangeditor'
|
|
19
19
|
|
|
20
20
|
import { utils } from 'sh-tools'
|
|
21
|
-
import { publicRenders, extraRenders, filterRenders } from './render/globalRenders.
|
|
21
|
+
import { publicRenders, extraRenders, filterRenders } from './render/globalRenders.js'
|
|
22
22
|
import renderUtils from './render/utils'
|
|
23
23
|
|
|
24
24
|
utils.mixin(renderUtils)
|
|
@@ -61,9 +61,10 @@ let uiOptions = {
|
|
|
61
61
|
}
|
|
62
62
|
},
|
|
63
63
|
form: {
|
|
64
|
+
editable: true,
|
|
64
65
|
titleColon: true,
|
|
65
66
|
titleAsterisk: true,
|
|
66
|
-
padding:
|
|
67
|
+
padding: true,
|
|
67
68
|
customLayout: false
|
|
68
69
|
},
|
|
69
70
|
modal: {
|
|
@@ -82,13 +83,12 @@ let uiOptions = {
|
|
|
82
83
|
shtree: {
|
|
83
84
|
nodeKey: 'id',
|
|
84
85
|
valueKeys: null,
|
|
86
|
+
filter: true,
|
|
85
87
|
format: '',
|
|
86
88
|
split: ',',
|
|
87
89
|
labelField: 'label',
|
|
88
90
|
labelTitle: '',
|
|
89
91
|
labelFormat: '',
|
|
90
|
-
emptyIcon: '',
|
|
91
|
-
emptyText: '',
|
|
92
92
|
globalConfig: {},
|
|
93
93
|
tableConfig: {
|
|
94
94
|
autoResize: false,
|
|
@@ -99,7 +99,6 @@ let uiOptions = {
|
|
|
99
99
|
showHeader: false,
|
|
100
100
|
showFooter: false,
|
|
101
101
|
showOverflow: true,
|
|
102
|
-
resizeConfig: { refreshDelay: 300 },
|
|
103
102
|
cellConfig: { padding: false, height: 32, verticalAlign: 'center' },
|
|
104
103
|
columnConfig: { width: 120 },
|
|
105
104
|
virtualXConfig: { enabled: true, gt: 20 },
|
|
@@ -160,6 +159,8 @@ let tableOptions = {
|
|
|
160
159
|
stripe: false,
|
|
161
160
|
border: 'full',
|
|
162
161
|
round: false,
|
|
162
|
+
autoResize: true,
|
|
163
|
+
syncResize: true,
|
|
163
164
|
keepSource: false,
|
|
164
165
|
minHeight: 30,
|
|
165
166
|
rowConfig: {
|
|
@@ -266,7 +267,7 @@ let tableOptions = {
|
|
|
266
267
|
startIndex: 1
|
|
267
268
|
},
|
|
268
269
|
resizeConfig: {
|
|
269
|
-
refreshDelay:
|
|
270
|
+
refreshDelay: 100
|
|
270
271
|
},
|
|
271
272
|
exportConfig: {
|
|
272
273
|
mode: 'current',
|
|
@@ -360,7 +361,7 @@ let tableOptions = {
|
|
|
360
361
|
$vNumber: { type: 'number', placeholder: '请输入', transfer: true, digits: 2, prefixType: 'text', suffixType: 'text' },
|
|
361
362
|
$vTextArea: { placeholder: '请输入', rows: 2, transfer: true, resize: 'none', showWordCount: true },
|
|
362
363
|
$vSelect: { placeholder: '请选择', clearable: true, filterable: true, transfer: true, showType: 'text', tagColor: 'default', split: ',', options: [] },
|
|
363
|
-
$vTree: { placeholder: '请选择', isSelect: true,
|
|
364
|
+
$vTree: { placeholder: '请选择', isSelect: true, transfer: true, split: ',', nodeKey: 'id', labelField: 'label' },
|
|
364
365
|
$vTime: { type: 'date', placeholder: '请选择时间', transfer: true, editable: false, prefixType: 'text', suffixType: 'text', separator: '至' },
|
|
365
366
|
$vProgress: { strokeWidth: 20, strokeColor: ['#108ee9', '#87d068'], textInside: true, min: 0, max: 100, digits: 2 },
|
|
366
367
|
$vSwitch: { placeholder: '请选择', openLabel: '是', openValue: '1', closeLabel: '否', closeValue: '0' },
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
:size="rsize"
|
|
8
8
|
:data-sourse="renderValue"
|
|
9
9
|
@edit-closed="vxeTableCallback"
|
|
10
|
-
@toolbar-btn-click="
|
|
10
|
+
@toolbar-btn-click="onToolbarBtnClick"></sh-table>
|
|
11
11
|
</span>
|
|
12
12
|
</template>
|
|
13
13
|
|
|
@@ -27,7 +27,7 @@ export default defineComponent({
|
|
|
27
27
|
const vxeTableCallback = params => {}
|
|
28
28
|
|
|
29
29
|
// 新增、删除行回调
|
|
30
|
-
const
|
|
30
|
+
const onToolbarBtnClick = (code, data, $table) => {
|
|
31
31
|
driveBackData()
|
|
32
32
|
}
|
|
33
33
|
|
|
@@ -41,7 +41,7 @@ export default defineComponent({
|
|
|
41
41
|
...useCell,
|
|
42
42
|
shTableRef,
|
|
43
43
|
vxeTableCallback,
|
|
44
|
-
|
|
44
|
+
onToolbarBtnClick
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
})
|
|
@@ -65,7 +65,8 @@ export default function (props, context, proxy) {
|
|
|
65
65
|
// 初始化数据
|
|
66
66
|
const initData = () => {
|
|
67
67
|
let keyValue = $vUtils.get(rdata.value, rkey.value)
|
|
68
|
-
formatValueFun
|
|
68
|
+
let formatFuncMethod = proxy.formatValueFun || formatValueFun
|
|
69
|
+
formatFuncMethod(keyValue)
|
|
69
70
|
}
|
|
70
71
|
|
|
71
72
|
// 输入框前缀点击事件
|
|
File without changes
|