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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sh-view",
3
- "version": "2.10.8",
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.20",
41
+ "vue": "^3.5.29",
42
42
  "vue-masonry": "^0.16.0",
43
43
  "vue-router": "^4.6.4",
44
- "vxe-pc-ui": "^4.12.30",
45
- "vxe-table": "^4.17.48"
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: editExtensions
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 focusListener = (state, focusing) => {
300
- const valueStr = state.doc.toString()
301
- if (focusing) {
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
- } else {
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()
@@ -75,7 +75,7 @@ export default defineComponent({
75
75
  prefixIcon: String,
76
76
  suffixIcon: String,
77
77
  placement: String,
78
- transfer: Boolean,
78
+ transfer: { type: Boolean, default: true },
79
79
  // 个性化参数
80
80
  range: Boolean,
81
81
  autoBlur: { type: Boolean, default: true },
@@ -5,7 +5,10 @@ export default {
5
5
  return {}
6
6
  }
7
7
  },
8
- loading: Boolean,
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: Boolean,
24
+ border: {
25
+ type: Boolean,
26
+ default: null
27
+ },
22
28
  size: String,
23
- titleBackground: Boolean,
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: true
43
+ default: null
35
44
  },
36
45
  titleAsterisk: {
37
46
  type: Boolean,
38
- default: true
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: true
55
+ default: null
47
56
  },
48
57
  readonly: {
49
58
  type: Boolean,
50
- default: false
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: Boolean,
56
- collapseLayout: Boolean,
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
- preventsubmit: {
87
+ preventSubmit: {
70
88
  type: Boolean,
71
- default: true
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: !props.editable,
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: false
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: false
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: false
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: false
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
- if (isGrid) {
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(props.dataSourse, row => {
576
- return searchFields.some(item => {
577
- let cellValue = $vUtils.get(row, item.rkey)
578
- let { rtext } = $vUtils.formatRender(cellValue, item.rkey, row, item.rname, item.rprops, proxy)
579
- return $vUtils.trim(rtext).toLowerCase().indexOf(filterText) > -1
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, index) => {
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 insertList = copyRows.map(row => tableRef.value.insertAt(Object.assign(row, { [keyField.value]: undefined }), index ? index : row))
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>{{ getTreeNodeCellContent(scoped) }}</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(tableTreeData, row => {
151
- let cellText = getTreeNodeCellContent({ row, column: tableTreeColumn })
152
- return $vUtils.trim(cellText).indexOf(filterText) > -1
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 getTreeNodeCellContent = ({ row, column }) => {
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
- getTreeNodeCellContent,
217
- getSelectionData,
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
- nodeKey: props.nodeKey || treeSetupConfig.nodeKey,
78
- valueKeys: props.valueKeys || treeSetupConfig.valueKeys,
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: Object.assign({ treeConfig: $vTableSetup.table.treeConfig }, $vUiSetup.shtree.tableConfig, props.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) filterInputRef.value.focus()
206
+ if (filterInputRef.value) {
207
+ filterInputRef.value.focus()
208
+ }
213
209
  // 初始化获取服务配置数据
214
210
  await getServerConfigDataSourse()
215
- if (tableTreeRef.value) {
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: false
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 && parent) {
89
- parentNames = parent.map(pat => pat.name)
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 = setActiveNames
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.jsx'
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: false,
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: 200
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, filter: true, transfer: true, split: ',', nodeKey: 'id', labelField: 'label' },
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="onToolbaroption"></sh-table>
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 onToolbaroption = (code, data, $table) => {
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
- onToolbaroption
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(keyValue)
68
+ let formatFuncMethod = proxy.formatValueFun || formatValueFun
69
+ formatFuncMethod(keyValue)
69
70
  }
70
71
 
71
72
  // 输入框前缀点击事件