sh-view 2.10.9 → 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-form/js/props.js +2 -2
- package/packages/components/sh-icon/css/index.scss +4 -5
- package/packages/components/sh-input/index.vue +3 -0
- package/packages/components/sh-table/js/props.js +2 -4
- package/packages/components/sh-table/js/useTable.js +5 -8
- package/packages/components/sh-tree/components/table-tree.vue +6 -21
- package/packages/components/sh-tree/index.vue +5 -10
- package/packages/vxeTable/index.js +4 -4
- 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()
|
|
@@ -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
|
+
}
|
|
@@ -28,12 +28,10 @@ export default {
|
|
|
28
28
|
type: [Number, String]
|
|
29
29
|
},
|
|
30
30
|
autoResize: {
|
|
31
|
-
type: Boolean
|
|
32
|
-
default: false
|
|
31
|
+
type: Boolean
|
|
33
32
|
},
|
|
34
33
|
syncResize: {
|
|
35
|
-
type: [Boolean, String, Number]
|
|
36
|
-
default: true
|
|
34
|
+
type: [Boolean, String, Number]
|
|
37
35
|
},
|
|
38
36
|
stripe: {
|
|
39
37
|
type: Boolean,
|
|
@@ -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)
|
|
@@ -704,8 +700,8 @@ export default function (props, context, proxy, isGrid) {
|
|
|
704
700
|
updateSelection()
|
|
705
701
|
return newRow
|
|
706
702
|
}
|
|
707
|
-
// 复制行按钮
|
|
708
|
-
const handleToolCopy = async (rows,
|
|
703
|
+
// 复制行按钮 isNext复制到目标行的 上面还是下面,默认到下面
|
|
704
|
+
const handleToolCopy = async (rows, isNext = true) => {
|
|
709
705
|
let selectedRows = getSelectionData()
|
|
710
706
|
let copyRows = $vUtils.clone(rows || selectedRows, true)
|
|
711
707
|
if (copyRows.length < 1) {
|
|
@@ -715,7 +711,8 @@ export default function (props, context, proxy, isGrid) {
|
|
|
715
711
|
if (typeof props.onToolbarCopyBefore === 'function') {
|
|
716
712
|
copyRows = await props.onToolbarCopyBefore(copyRows)
|
|
717
713
|
}
|
|
718
|
-
let
|
|
714
|
+
let insertType = isNext ? 'insertNextAt' : 'insertAt'
|
|
715
|
+
let insertList = copyRows.map(row => tableRef.value[insertType](Object.assign({}, row, { [keyField.value]: undefined }), row))
|
|
719
716
|
let insertRes = await Promise.all(insertList)
|
|
720
717
|
let insertRows = insertRes.map(item => item.row)
|
|
721
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
|
|
@@ -150,7 +148,7 @@ export default defineComponent({
|
|
|
150
148
|
searchData = $vUtils.searchTree(
|
|
151
149
|
tableTreeData,
|
|
152
150
|
row => {
|
|
153
|
-
let cellText =
|
|
151
|
+
let cellText = treeNodeContent({ row, column: tableTreeColumn })
|
|
154
152
|
return $vUtils.trim(cellText).indexOf(filterText) > -1
|
|
155
153
|
},
|
|
156
154
|
{ isEvery: true, children: treeChildKey.value }
|
|
@@ -165,32 +163,21 @@ export default defineComponent({
|
|
|
165
163
|
filterData.value = searchData
|
|
166
164
|
tableRef.value.setAllTreeExpand(true)
|
|
167
165
|
}
|
|
168
|
-
// 获取选中的数据
|
|
169
|
-
const getSelectionData = () => {
|
|
170
|
-
return tableRef.value.getCheckboxRecords()
|
|
171
|
-
}
|
|
172
166
|
const tableCheckMethods = ({ row, $table }) => {
|
|
173
167
|
if (props.isLeaf && !props.multiple) {
|
|
174
168
|
return (row[treeChildKey.value] || []).length < 1
|
|
175
169
|
}
|
|
176
170
|
return true
|
|
177
171
|
}
|
|
178
|
-
const
|
|
172
|
+
const treeNodeContent = ({ row, column }) => {
|
|
179
173
|
if (props.labelFormat) {
|
|
180
174
|
return $vUtils.format(props.labelFormat, row)
|
|
181
175
|
}
|
|
182
176
|
return $vUtils.get(row, column.property)
|
|
183
177
|
}
|
|
184
|
-
const handleOffsetChange = () => {
|
|
185
|
-
syncResize.value = true
|
|
186
|
-
setTimeout(() => {
|
|
187
|
-
syncResize.value = false
|
|
188
|
-
})
|
|
189
|
-
}
|
|
190
178
|
|
|
191
179
|
const initChangeDebounce = $vUtils.debounce(initSelection, 200)
|
|
192
180
|
const filterChangeDebounce = $vUtils.debounce(handleMyTableFilter, 500)
|
|
193
|
-
const offetChangeDebounce = $vUtils.debounce(handleOffsetChange, tableConfigIn.value.resizeConfig?.refreshDelay || 300)
|
|
194
181
|
|
|
195
182
|
onMounted(() => {
|
|
196
183
|
initChangeDebounce()
|
|
@@ -217,10 +204,8 @@ export default defineComponent({
|
|
|
217
204
|
tableConfigIn,
|
|
218
205
|
onRadioChange,
|
|
219
206
|
onSelectionChange,
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
initSelection,
|
|
223
|
-
offetChangeDebounce
|
|
207
|
+
treeNodeContent,
|
|
208
|
+
initSelection
|
|
224
209
|
}
|
|
225
210
|
}
|
|
226
211
|
})
|
|
@@ -108,11 +108,7 @@ export default defineComponent({
|
|
|
108
108
|
return Object.assign({ transfer: true }, propsConfig.value.globalConfig?.selectConfig, checkConfig.value)
|
|
109
109
|
})
|
|
110
110
|
const selectInputConfigIn = computed(() => {
|
|
111
|
-
return Object.assign(
|
|
112
|
-
{ clearable: true, controls: false, transfer: false, editable: false, suffixIcon: 'vxe-icon-caret-down', placeholder: props.placeholder },
|
|
113
|
-
propsConfig.value.globalConfig?.inputConfig,
|
|
114
|
-
checkConfig.value
|
|
115
|
-
)
|
|
111
|
+
return Object.assign({ clearable: true, readonly: true, suffixIcon: 'vxe-icon-caret-down', placeholder: props.placeholder }, propsConfig.value.globalConfig?.inputConfig, checkConfig.value)
|
|
116
112
|
})
|
|
117
113
|
const filterInputConfigIn = computed(() => {
|
|
118
114
|
return Object.assign({ prefixIcon: 'vxe-icon-search', placeholder: '搜索', clearable: true }, propsConfig.value.globalConfig?.filterInputConfig)
|
|
@@ -205,15 +201,14 @@ export default defineComponent({
|
|
|
205
201
|
// 树节点获取焦点事件
|
|
206
202
|
const onFocus = async obj => {
|
|
207
203
|
emitFocus()
|
|
208
|
-
treeSelectInputRef.value.blur()
|
|
209
204
|
await treeSelectRef.value.togglePanel()
|
|
210
205
|
pulldownDrop.value = true
|
|
211
|
-
if (filterInputRef.value)
|
|
206
|
+
if (filterInputRef.value) {
|
|
207
|
+
filterInputRef.value.focus()
|
|
208
|
+
}
|
|
212
209
|
// 初始化获取服务配置数据
|
|
213
210
|
await getServerConfigDataSourse()
|
|
214
|
-
|
|
215
|
-
tableTreeRef.value.initSelection(true)
|
|
216
|
-
}
|
|
211
|
+
tableTreeRef.value && tableTreeRef.value.initSelection(true)
|
|
217
212
|
}
|
|
218
213
|
// 树节点选择变换事件
|
|
219
214
|
const onChange = async (keys, rows, obj) => {
|
|
@@ -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)
|
|
@@ -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,7 +159,8 @@ let tableOptions = {
|
|
|
160
159
|
stripe: false,
|
|
161
160
|
border: 'full',
|
|
162
161
|
round: false,
|
|
163
|
-
autoResize:
|
|
162
|
+
autoResize: true,
|
|
163
|
+
syncResize: true,
|
|
164
164
|
keepSource: false,
|
|
165
165
|
minHeight: 30,
|
|
166
166
|
rowConfig: {
|
|
@@ -267,7 +267,7 @@ let tableOptions = {
|
|
|
267
267
|
startIndex: 1
|
|
268
268
|
},
|
|
269
269
|
resizeConfig: {
|
|
270
|
-
refreshDelay:
|
|
270
|
+
refreshDelay: 100
|
|
271
271
|
},
|
|
272
272
|
exportConfig: {
|
|
273
273
|
mode: 'current',
|
|
@@ -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
|