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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sh-view",
3
- "version": "2.10.9",
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.31",
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()
@@ -84,9 +84,9 @@ export default {
84
84
  return {}
85
85
  }
86
86
  },
87
- preventsubmit: {
87
+ preventSubmit: {
88
88
  type: Boolean,
89
- default: null
89
+ default: false
90
90
  },
91
91
  validConfig: {
92
92
  type: Object,
@@ -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
+ }
@@ -159,6 +159,9 @@ export default defineComponent({
159
159
  triggerEvent(evnt)
160
160
  }
161
161
  const compositionEnd = evnt => {
162
+ if (!reactData.isComposed) {
163
+ return
164
+ }
162
165
  reactData.isComposed = false
163
166
  const inputElem = evnt.target
164
167
  const value = inputElem.value
@@ -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
- 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)
@@ -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, index) => {
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 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))
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>{{ 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
@@ -150,7 +148,7 @@ export default defineComponent({
150
148
  searchData = $vUtils.searchTree(
151
149
  tableTreeData,
152
150
  row => {
153
- let cellText = getTreeNodeCellContent({ row, column: tableTreeColumn })
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 getTreeNodeCellContent = ({ row, column }) => {
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
- getTreeNodeCellContent,
221
- getSelectionData,
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) filterInputRef.value.focus()
206
+ if (filterInputRef.value) {
207
+ filterInputRef.value.focus()
208
+ }
212
209
  // 初始化获取服务配置数据
213
210
  await getServerConfigDataSourse()
214
- if (tableTreeRef.value) {
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.jsx'
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: false,
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: 200
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="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
  // 输入框前缀点击事件