sh-view 2.1.0 → 2.2.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 (128) hide show
  1. package/package.json +9 -13
  2. package/packages/components/global-components/sh-alert/index.vue +175 -173
  3. package/packages/components/global-components/sh-badge/index.vue +57 -43
  4. package/packages/components/global-components/sh-card/index.vue +24 -16
  5. package/packages/components/global-components/sh-code-editor/index.vue +250 -260
  6. package/packages/components/global-components/sh-col/index.vue +44 -36
  7. package/packages/components/global-components/sh-corner/index.vue +230 -228
  8. package/packages/components/global-components/sh-count-to/index.vue +60 -51
  9. package/packages/components/global-components/sh-drawer/index.vue +209 -182
  10. package/packages/components/global-components/sh-drawer/scrollbar.js +44 -42
  11. package/packages/components/global-components/sh-empty/index.vue +0 -1
  12. package/packages/components/global-components/sh-form/form.vue +110 -0
  13. package/packages/components/global-components/sh-form/js/props.js +76 -63
  14. package/packages/components/global-components/sh-form/js/useForm.js +236 -0
  15. package/packages/components/global-components/sh-form/query.vue +70 -0
  16. package/packages/components/global-components/sh-header/index.vue +35 -50
  17. package/packages/components/global-components/sh-icon/css/index.scss +44 -0
  18. package/packages/components/global-components/sh-icon/index.vue +24 -11
  19. package/packages/components/global-components/sh-image/index.vue +47 -38
  20. package/packages/components/global-components/sh-list/index.vue +42 -37
  21. package/packages/components/global-components/sh-loading/index.vue +12 -8
  22. package/packages/components/global-components/sh-modal/index.vue +49 -40
  23. package/packages/components/global-components/sh-noticebar/index.vue +68 -54
  24. package/packages/components/global-components/sh-poptip/index.vue +247 -130
  25. package/packages/components/global-components/sh-progress/index.vue +71 -69
  26. package/packages/components/global-components/sh-pull-refresh/index.vue +156 -157
  27. package/packages/components/global-components/sh-result/index.vue +37 -28
  28. package/packages/components/global-components/sh-row/index.vue +21 -18
  29. package/packages/components/global-components/sh-split/index.vue +115 -109
  30. package/packages/components/global-components/sh-table/components/importModal.vue +95 -86
  31. package/packages/components/global-components/sh-table/components/sh-column.vue +54 -0
  32. package/packages/components/global-components/sh-table/{index.vue → grid.vue} +34 -145
  33. package/packages/components/global-components/sh-table/js/tableMethods.js +175 -0
  34. package/packages/components/global-components/sh-table/js/useTable.js +592 -0
  35. package/packages/components/global-components/sh-table/table.vue +269 -0
  36. package/packages/components/global-components/sh-tabs/index.vue +118 -93
  37. package/packages/components/global-components/sh-tag/index.vue +52 -51
  38. package/packages/components/global-components/sh-toolbar/index.vue +53 -47
  39. package/packages/components/global-components/sh-tree/components/table-tree.vue +152 -139
  40. package/packages/components/global-components/sh-tree/index.vue +218 -195
  41. package/packages/components/global-components/sh-tree/mixin/treeProps.js +118 -120
  42. package/packages/components/global-components/sh-upload/index.vue +308 -51
  43. package/packages/components/global-components/sh-water-fall/index.vue +4 -11
  44. package/packages/components/index.js +5 -3
  45. package/packages/components/other-components/sh-cron-modal/components/cron-content.vue +140 -129
  46. package/packages/components/other-components/sh-cron-modal/css/index.scss +0 -5
  47. package/packages/components/other-components/sh-cron-modal/index.vue +81 -67
  48. package/packages/components/other-components/sh-cron-modal/mixin/cron-emits.js +1 -0
  49. package/packages/components/other-components/sh-cron-modal/mixin/cron-hooks.js +179 -0
  50. package/packages/components/other-components/sh-cron-modal/mixin/cron-props.js +9 -0
  51. package/packages/components/other-components/sh-cron-modal/tabs/cron-day-box.vue +101 -92
  52. package/packages/components/other-components/sh-cron-modal/tabs/cron-hour-box.vue +68 -56
  53. package/packages/components/other-components/sh-cron-modal/tabs/cron-minute-box.vue +68 -56
  54. package/packages/components/other-components/sh-cron-modal/tabs/cron-month-box.vue +68 -56
  55. package/packages/components/other-components/sh-cron-modal/tabs/cron-second-box.vue +68 -56
  56. package/packages/components/other-components/sh-cron-modal/tabs/cron-week-box.vue +126 -115
  57. package/packages/components/other-components/sh-cron-modal/tabs/cron-year-box.vue +59 -46
  58. package/packages/components/other-components/sh-menu/index.vue +73 -60
  59. package/packages/components/other-components/sh-menu/menu-group-content.vue +71 -59
  60. package/packages/components/other-components/sh-menu/menu-item-content.vue +40 -30
  61. package/packages/components/other-components/sh-menu-card/index.vue +70 -64
  62. package/packages/components/other-components/sh-menu-card/menu-box.vue +50 -44
  63. package/packages/components/other-components/sh-preview/components/sh-excel.vue +182 -0
  64. package/packages/components/other-components/sh-preview/components/sh-word.vue +73 -0
  65. package/packages/components/other-components/sh-preview/index.vue +86 -85
  66. package/packages/components/other-components/sh-preview/js/data-hook.js +37 -0
  67. package/packages/components/other-components/sh-preview/js/data-props.js +11 -0
  68. package/packages/components/other-components/sh-system-tip/index.vue +28 -24
  69. package/packages/css/index.js +4 -4
  70. package/packages/directive/module/prevent-click.js +1 -1
  71. package/packages/directive/module/resize.js +11 -154
  72. package/packages/index.js +39 -39
  73. package/packages/mixin/index.js +86 -87
  74. package/packages/vxeTable/render/cell/vxe-render-checkbox.vue +14 -5
  75. package/packages/vxeTable/render/cell/vxe-render-checkgroup.vue +43 -36
  76. package/packages/vxeTable/render/cell/vxe-render-code.vue +14 -5
  77. package/packages/vxeTable/render/cell/vxe-render-goption.vue +34 -24
  78. package/packages/vxeTable/render/cell/vxe-render-href.vue +21 -11
  79. package/packages/vxeTable/render/cell/vxe-render-img.vue +16 -10
  80. package/packages/vxeTable/render/cell/vxe-render-input.vue +83 -79
  81. package/packages/vxeTable/render/cell/vxe-render-money.vue +14 -6
  82. package/packages/vxeTable/render/cell/vxe-render-progress.vue +28 -19
  83. package/packages/vxeTable/render/cell/vxe-render-radio.vue +14 -5
  84. package/packages/vxeTable/render/cell/vxe-render-radiogroup.vue +43 -36
  85. package/packages/vxeTable/render/cell/vxe-render-select.vue +44 -36
  86. package/packages/vxeTable/render/cell/vxe-render-switch.vue +14 -5
  87. package/packages/vxeTable/render/cell/vxe-render-table.vue +51 -78
  88. package/packages/vxeTable/render/cell/vxe-render-textarea.vue +14 -5
  89. package/packages/vxeTable/render/cell/vxe-render-time.vue +23 -13
  90. package/packages/vxeTable/render/cell/vxe-render-tree.vue +23 -27
  91. package/packages/vxeTable/render/cell/vxe-render-upload.vue +11 -7
  92. package/packages/vxeTable/render/filters/vxe-filter-input.vue +25 -43
  93. package/packages/vxeTable/render/footer/vxe-footer-input.vue +23 -13
  94. package/packages/vxeTable/render/footer/vxe-footer-money.vue +30 -20
  95. package/packages/vxeTable/render/globalRenders.jsx +1 -1
  96. package/packages/vxeTable/render/header/vxe-header-money.vue +31 -21
  97. package/packages/vxeTable/render/mixin/cell-hooks.js +162 -0
  98. package/packages/vxeTable/render/mixin/cell-props.js +23 -0
  99. package/packages/vxeTable/render/mixin/filter-hooks.js +28 -0
  100. package/packages/components/global-components/sh-form/components/form-item.vue +0 -25
  101. package/packages/components/global-components/sh-form/css/index.scss +0 -55
  102. package/packages/components/global-components/sh-form/index.vue +0 -114
  103. package/packages/components/global-components/sh-form/js/methods.js +0 -146
  104. package/packages/components/global-components/sh-form/mixin/defaultData.js +0 -32
  105. package/packages/components/global-components/sh-icon/css/default/index.scss +0 -27
  106. package/packages/components/global-components/sh-icon/css/font/index.scss +0 -16
  107. package/packages/components/global-components/sh-icon/icon-default.vue +0 -32
  108. package/packages/components/global-components/sh-icon/icon-font.vue +0 -32
  109. package/packages/components/global-components/sh-poptip/popper.js +0 -115
  110. package/packages/components/global-components/sh-query/index.vue +0 -317
  111. package/packages/components/global-components/sh-table/js/methods.js +0 -549
  112. package/packages/components/global-components/sh-table/mixin/defaultData.js +0 -94
  113. package/packages/components/global-components/sh-upload/js/mixin.js +0 -257
  114. package/packages/components/other-components/sh-cron-modal/mixin/cron-box.js +0 -169
  115. package/packages/vxeTable/render/mixin/cell-mixin.js +0 -195
  116. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.svg → ionicons.svg} +0 -0
  117. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.ttf → ionicons.ttf} +0 -0
  118. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.woff → ionicons.woff} +0 -0
  119. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.woff2 → ionicons.woff2} +0 -0
  120. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.js → iconfont.js} +0 -0
  121. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.json → iconfont.json} +0 -0
  122. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.ttf → iconfont.ttf} +0 -0
  123. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.woff → iconfont.woff} +0 -0
  124. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.woff2 → iconfont.woff2} +0 -0
  125. /package/packages/{assets/css → css}/animated.scss +0 -0
  126. /package/packages/{assets/css → css}/loader.scss +0 -0
  127. /package/packages/{assets/css → css}/main.scss +0 -0
  128. /package/packages/{assets/css → css}/theme.scss +0 -0
@@ -2,12 +2,12 @@
2
2
  <teleport to="body" :disabled="!transfer">
3
3
  <div class="sh-drawer-box">
4
4
  <transition name="fade">
5
- <div v-show="visible" v-if="mask" class="sh-drawer-mask" :class="maskClasses" :style="maskStyle" @click="handleMask"></div>
5
+ <div v-show="visible" v-if="mask" class="sh-drawer-mask" :class="{ 'sh-drawer-mask-inner': inner }" :style="maskStyle" @click="handleMask"></div>
6
6
  </transition>
7
7
  <div class="sh-drawer-wrap" :class="wrapClasses" @click="handleWrapClick">
8
8
  <transition :name="transitionName">
9
- <div v-show="visible" ref="drawer" class="sh-drawer" :class="classes" :style="mainStyles">
10
- <div ref="content" class="sh-drawer-content" :class="contentClasses">
9
+ <div v-show="visible" ref="drawerRef" class="sh-drawer" :class="classes" :style="mainStyles">
10
+ <div ref="drawerContent" class="sh-drawer-content" :class="{ 'sh-drawer-content-no-mask': !mask }">
11
11
  <a v-if="closable" class="sh-drawer-close" @click="close">
12
12
  <slot name="close">
13
13
  <sh-icon type="ios-close"></sh-icon>
@@ -37,10 +37,10 @@
37
37
  </template>
38
38
 
39
39
  <script>
40
- import ScrollbarMixins from './scrollbar'
41
- export default {
40
+ import { defineComponent, ref, watch, onMounted, onBeforeUnmount, getCurrentInstance, computed } from 'vue'
41
+ import useScrollbar from './scrollbar'
42
+ export default defineComponent({
42
43
  name: 'ShDrawer',
43
- mixins: [ScrollbarMixins],
44
44
  props: {
45
45
  modelValue: {
46
46
  type: Boolean,
@@ -108,223 +108,250 @@ export default {
108
108
  beforeClose: Function
109
109
  },
110
110
  emits: ['update:modelValue', 'close', 'resize-width', 'visible-change', 'drag'],
111
- data() {
112
- return {
113
- visible: this.modelValue,
114
- wrapShow: false,
115
- showHead: true,
116
- canMove: false,
117
- dragWidth: this.width,
118
- dragHeight: this.height,
119
- wrapperWidth: this.width,
120
- wrapperHeight: this.height,
121
- wrapperLeft: 0,
122
- minWidth: 256,
123
- minHeight: 256,
124
- id: this.$vUtils.randomStr(6),
125
- tableList: [],
126
- sliderList: []
127
- }
128
- },
129
- computed: {
130
- wrapClasses() {
111
+ setup(props, context) {
112
+ const vm = getCurrentInstance()
113
+ const { $vUtils } = vm.proxy
114
+ const { emit, slots } = context
115
+ const drawerRef = ref()
116
+ const drawerContent = ref()
117
+
118
+ const visible = ref(props.modelValue)
119
+ const wrapShow = ref(false)
120
+ const showHead = ref(true)
121
+ const canMove = ref(false)
122
+ const dragWidth = ref(props.width)
123
+ const dragHeight = ref(props.height)
124
+ const wrapperWidth = ref(props.width)
125
+ const wrapperHeight = ref(props.height)
126
+ const wrapperLeft = ref(0)
127
+ const minWidth = ref(256)
128
+ const minHeight = ref(256)
129
+ const id = ref($vUtils.randomStr(6))
130
+ const tableList = ref([])
131
+ const sliderList = ref([])
132
+ let timer = null
133
+
134
+ const wrapClasses = computed(() => {
131
135
  return {
132
- 'sh-drawer-hidden': !this.wrapShow,
133
- 'sh-drawer-no-mask': !this.mask,
134
- 'sh-drawer-wrap-inner': this.inner,
135
- 'sh-drawer-wrap-dragging': this.canMove,
136
- [`${this.className}`]: !!this.className
136
+ 'sh-drawer-hidden': !wrapShow.value,
137
+ 'sh-drawer-no-mask': !props.mask,
138
+ 'sh-drawer-wrap-inner': props.inner,
139
+ 'sh-drawer-wrap-dragging': canMove.value,
140
+ [`${props.className}`]: !!props.className
137
141
  }
138
- },
139
- mainStyles() {
142
+ })
143
+ const mainStyles = computed(() => {
140
144
  let style = {}
141
- if (this.placement === 'left' || this.placement === 'right') {
142
- const width = parseInt(this.dragWidth)
145
+ if (props.placement === 'left' || props.placement === 'right') {
146
+ const width = parseInt(dragWidth.value)
143
147
  const styleWidth = {
144
148
  width: width <= 100 ? `${width}%` : `${width}px`
145
149
  }
146
150
  Object.assign(style, styleWidth)
147
151
  } else {
148
- const height = parseInt(this.dragHeight)
152
+ const height = parseInt(dragHeight.value)
149
153
  const styleHeight = {
150
154
  height: height <= 100 ? `${height}%` : `${height}px`
151
155
  }
152
156
  Object.assign(style, styleHeight)
153
157
  }
154
158
  return style
155
- },
156
- contentClasses() {
157
- return {
158
- 'sh-drawer-content-no-mask': !this.mask
159
- }
160
- },
161
- classes() {
159
+ })
160
+ const classes = computed(() => {
162
161
  return {
163
- [`sh-drawer-${this.placement}`]: true,
164
- 'sh-drawer-no-header': !this.showHead,
165
- 'sh-drawer-inner': this.inner
162
+ [`sh-drawer-${props.placement}`]: true,
163
+ 'sh-drawer-no-header': !showHead.value,
164
+ 'sh-drawer-inner': props.inner
166
165
  }
167
- },
168
- maskClasses() {
169
- return {
170
- 'sh-drawer-mask-inner': this.inner
171
- }
172
- },
173
- transitionName() {
174
- if (this.placement === 'left' || this.placement === 'right') return `move-${this.placement}`
175
- else if (this.placement === 'top') return 'move-up'
166
+ })
167
+ const transitionName = computed(() => {
168
+ if (props.placement === 'left' || props.placement === 'right') return `move-${props.placement}`
169
+ else if (props.placement === 'top') return 'move-up'
176
170
  else return 'move-down'
177
- }
178
- },
179
- watch: {
180
- modelValue(val) {
181
- this.visible = val
182
- },
183
- visible(val) {
184
- if (val === false) {
185
- this.timer = setTimeout(() => {
186
- this.wrapShow = false
187
- const drawers = this.$root.drawerList.map(item => item.drawer)
188
- const otherDrawers = drawers.filter(item => item.id !== this.id)
189
- const isScrollDrawer = otherDrawers.some(item => item.visible && !item.scrollable)
190
- if (!isScrollDrawer) {
191
- this.removeScrollEffect()
192
- }
193
- }, 300)
194
- } else {
195
- if (this.timer) clearTimeout(this.timer)
196
- this.wrapShow = true
197
- if (!this.scrollable) {
198
- this.addScrollEffect()
199
- }
200
- }
201
- this.tableList.forEach(item => {
202
- item.table.handleOnVisibleChange(val)
203
- })
204
- this.sliderList.forEach(item => {
205
- item.slider.handleOnVisibleChange(val)
206
- })
207
- this.$emit('visible-change', val)
208
- },
209
- scrollable(val) {
210
- if (!val) {
211
- this.addScrollEffect()
212
- } else {
213
- this.removeScrollEffect()
214
- }
215
- },
216
- title(val) {
217
- if (this.$slots.header === undefined) {
218
- this.showHead = !!val
219
- }
220
- },
221
- width(val) {
222
- this.dragWidth = val
223
- },
224
- height(val) {
225
- this.dragHeight = val
226
- }
227
- },
228
- mounted() {
229
- if (this.visible) {
230
- this.wrapShow = true
231
- }
232
- let showHead = true
233
- if (this.$slots.header === undefined && !this.title) {
234
- showHead = false
235
- }
236
- this.showHead = showHead
237
- this.addDrawer()
238
- this.$vUtils.onListener(document, 'mousemove', this.handleMousemove)
239
- this.$vUtils.onListener(document, 'mouseup', this.handleMouseup)
240
- this.handleSetWrapperWidth()
241
- },
242
- beforeUnmount() {
243
- this.removeDrawer()
244
- this.$vUtils.offListener(document, 'mousemove', this.handleMousemove)
245
- this.$vUtils.offListener(document, 'mouseup', this.handleMouseup)
246
- this.removeScrollEffect()
247
- },
248
- methods: {
249
- close() {
250
- if (!this.beforeClose) {
251
- return this.handleClose()
171
+ })
172
+
173
+ const { addScrollEffect, removeScrollEffect } = useScrollbar(props)
174
+
175
+ const close = () => {
176
+ if (!props.beforeClose) {
177
+ return handleClose()
252
178
  }
253
- const before = this.beforeClose()
179
+ const before = props.beforeClose()
254
180
  if (before && before.then) {
255
181
  before.then(() => {
256
- this.handleClose()
182
+ handleClose()
257
183
  })
258
184
  } else {
259
- this.handleClose()
185
+ handleClose()
260
186
  }
261
- },
262
- handleClose() {
263
- this.visible = false
264
- this.$emit('update:modelValue', false)
265
- this.$emit('close')
266
- },
267
- handleMask() {
268
- if (this.canMove) return
269
- if (this.maskClosable && this.mask) {
270
- this.close()
187
+ }
188
+ const handleClose = () => {
189
+ visible.value = false
190
+ emit('update:modelValue', false)
191
+ emit('close')
192
+ }
193
+ const handleMask = () => {
194
+ if (canMove.value) return
195
+ if (props.maskClosable && props.mask) {
196
+ close()
271
197
  }
272
- },
273
- handleWrapClick(event) {
198
+ }
199
+ const handleWrapClick = event => {
274
200
  const className = event.target.getAttribute('class')
275
- if (className && className.indexOf('sh-drawer-wrap') > -1) this.handleMask()
276
- },
277
- handleMousemove(event) {
278
- if (!this.canMove || !this.draggable || !this.visible) return
201
+ if (className && className.indexOf('sh-drawer-wrap') > -1) handleMask()
202
+ }
203
+ const handleMousemove = event => {
204
+ if (!canMove.value || !props.draggable || !visible.value) return
279
205
  // 更新容器宽度和距离左侧页面距离,如果是window则距左侧距离为0
280
- this.handleSetWrapperWidth()
281
- const left = event.pageX - this.wrapperLeft
206
+ handleSetWrapperWidth()
207
+ const left = event.pageX - wrapperLeft.value
282
208
  // 如果抽屉方向为右边,宽度计算需用容器宽度减去left
283
- let width = this.placement === 'right' ? this.wrapperWidth - left : left
209
+ let width = props.placement === 'right' ? wrapperWidth.value - left : left
284
210
  // 限定最小宽度
285
- width = Math.max(width, parseFloat(this.minWidth))
286
- event.atMin = width === parseFloat(this.minWidth)
211
+ width = Math.max(width, parseFloat(minWidth.value))
212
+ event.atMin = width === parseFloat(minWidth.value)
287
213
  // 如果当前width不大于100,视为百分比
288
- if (width <= 100) width = (width / this.wrapperWidth) * 100
214
+ if (width <= 100) width = (width / wrapperWidth.value) * 100
289
215
  if (width >= window.innerWidth) width = window.innerWidth
290
- this.dragWidth = width
291
- this.$emit('resize-width', parseInt(this.dragWidth))
292
- this.$emit('drag', 'dragging', parseInt(this.dragWidth))
293
- },
294
- handleSetWrapperWidth() {
295
- const { width, left } = this.$refs.drawer.getBoundingClientRect()
296
- this.wrapperWidth = width
297
- this.wrapperLeft = left
298
- },
299
- handleMouseup() {
300
- if (!this.draggable || !this.visible) return
216
+ dragWidth.value = width
217
+ emit('resize-width', parseInt(dragWidth.value))
218
+ emit('drag', 'dragging', parseInt(dragWidth.value))
219
+ }
220
+ const handleSetWrapperWidth = () => {
221
+ const { width, left } = drawerRef.value.getBoundingClientRect()
222
+ wrapperWidth.value = width
223
+ wrapperLeft.value = left
224
+ }
225
+ const handleMouseup = () => {
226
+ if (!props.draggable || !visible.value) return
301
227
  setTimeout(() => {
302
- this.canMove = false
228
+ canMove.value = false
303
229
  })
304
- this.$emit('drag', 'end')
305
- },
306
- handleTriggerMousedown() {
307
- this.canMove = true
230
+ emit('drag', 'end')
231
+ }
232
+ const handleTriggerMousedown = () => {
233
+ canMove.value = true
308
234
  // 防止鼠标选中抽屉中文字,造成拖动trigger触发浏览器原生拖动行为
309
235
  window.getSelection().removeAllRanges()
310
- this.$emit('drag', 'start')
311
- },
312
- addDrawer() {
313
- const root = this.$root
236
+ emit('drag', 'start')
237
+ }
238
+ const addDrawer = () => {
239
+ const root = vm.root
314
240
  if (!root.drawerList) root.drawerList = []
315
241
  root.drawerList.push({
316
- id: this.id,
317
- drawer: this
242
+ id: id.value,
243
+ drawer: vm
318
244
  })
319
- },
320
- removeDrawer() {
321
- const root = this.$root
245
+ }
246
+ const removeDrawer = () => {
247
+ const root = vm.root
322
248
  if (!root.drawerList) return
323
- const index = root.drawerList.findIndex(item => item.id === this.id)
249
+ const index = root.drawerList.findIndex(item => item.id === id.value)
324
250
  root.drawerList.splice(index, 1)
325
251
  }
252
+
253
+ watch(
254
+ () => props.modelValue,
255
+ value => {
256
+ visible.value = value
257
+ }
258
+ )
259
+ watch(
260
+ () => visible.value,
261
+ val => {
262
+ if (val === false) {
263
+ timer = setTimeout(() => {
264
+ wrapShow.value = false
265
+ const drawers = vm.root.drawerList.map(item => item.drawer)
266
+ const otherDrawers = drawers.filter(item => item.id !== id.value)
267
+ const isScrollDrawer = otherDrawers.some(item => item.visible && !item.scrollable)
268
+ if (!isScrollDrawer) {
269
+ removeScrollEffect()
270
+ }
271
+ }, 300)
272
+ } else {
273
+ if (timer) clearTimeout(timer)
274
+ wrapShow.value = true
275
+ if (!props.scrollable) {
276
+ addScrollEffect()
277
+ }
278
+ }
279
+ tableList.value.forEach(item => {
280
+ item.table.handleOnVisibleChange(val)
281
+ })
282
+ sliderList.value.forEach(item => {
283
+ item.slider.handleOnVisibleChange(val)
284
+ })
285
+ emit('visible-change', val)
286
+ }
287
+ )
288
+ watch(
289
+ () => props.scrollable,
290
+ val => {
291
+ if (!val) {
292
+ addScrollEffect()
293
+ } else {
294
+ removeScrollEffect()
295
+ }
296
+ }
297
+ )
298
+ watch(
299
+ () => props.title,
300
+ val => {
301
+ if (slots.header === undefined) {
302
+ showHead.value = !!val
303
+ }
304
+ }
305
+ )
306
+ watch(
307
+ () => props.width,
308
+ val => {
309
+ dragWidth.value = val
310
+ }
311
+ )
312
+ watch(
313
+ () => props.height,
314
+ val => {
315
+ dragHeight.value = val
316
+ }
317
+ )
318
+ onMounted(() => {
319
+ if (visible.value) {
320
+ wrapShow.value = true
321
+ }
322
+ let isShowHead = true
323
+ if (slots.header === undefined && !props.title) {
324
+ isShowHead = false
325
+ }
326
+ showHead.value = isShowHead
327
+ addDrawer()
328
+ $vUtils.onListener(document, 'mousemove', handleMousemove)
329
+ $vUtils.onListener(document, 'mouseup', handleMouseup)
330
+ handleSetWrapperWidth()
331
+ })
332
+ onBeforeUnmount(() => {
333
+ removeDrawer()
334
+ $vUtils.offListener(document, 'mousemove', handleMousemove)
335
+ $vUtils.offListener(document, 'mouseup', handleMouseup)
336
+ removeScrollEffect()
337
+ })
338
+
339
+ return {
340
+ visible,
341
+ handleMask,
342
+ wrapClasses,
343
+ handleWrapClick,
344
+ transitionName,
345
+ classes,
346
+ mainStyles,
347
+ close,
348
+ showHead,
349
+ handleTriggerMousedown,
350
+ drawerRef,
351
+ drawerContent
352
+ }
326
353
  }
327
- }
354
+ })
328
355
  </script>
329
356
 
330
357
  <style scoped lang="scss">
@@ -28,49 +28,51 @@ export function getScrollBarSize(fresh) {
28
28
  return cached
29
29
  }
30
30
 
31
- export default {
32
- props: {
33
- lockScroll: {
34
- type: Boolean,
35
- default: true
31
+ export default function (props, state = {}) {
32
+ const { lockScroll = true } = props
33
+ const checkScrollBar = () => {
34
+ let fullWindowWidth = window.innerWidth
35
+ if (!fullWindowWidth) {
36
+ const documentElementRect = document.documentElement.getBoundingClientRect()
37
+ fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
36
38
  }
37
- },
38
- methods: {
39
- checkScrollBar() {
40
- let fullWindowWidth = window.innerWidth
41
- if (!fullWindowWidth) {
42
- const documentElementRect = document.documentElement.getBoundingClientRect()
43
- fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
44
- }
45
- this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
46
- if (this.bodyIsOverflowing) {
47
- this.scrollBarWidth = getScrollBarSize()
48
- }
49
- },
50
- checkMaskInVisible() {
51
- let masks = document.getElementsByClassName('ivu-modal-mask') || []
52
- return Array.from(masks).every(m => m.style.display === 'none' || m.classList.contains('fade-leave-to'))
53
- },
54
- setScrollBar() {
55
- if (this.bodyIsOverflowing && this.scrollBarWidth !== undefined) {
56
- document.body.style.paddingRight = `${this.scrollBarWidth}px`
57
- }
58
- },
59
- resetScrollBar() {
60
- document.body.style.paddingRight = ''
61
- },
62
- addScrollEffect() {
63
- if (!this.lockScroll) return
64
- this.checkScrollBar()
65
- this.setScrollBar()
66
- document.body.style.overflow = 'hidden'
67
- },
68
- removeScrollEffect() {
69
- if (!this.lockScroll) return
70
- if (this.checkMaskInVisible()) {
71
- document.body.style.overflow = ''
72
- this.resetScrollBar()
73
- }
39
+ state.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
40
+ if (state.bodyIsOverflowing) {
41
+ state.scrollBarWidth = getScrollBarSize()
74
42
  }
75
43
  }
44
+
45
+ const checkMaskInVisible = () => {
46
+ let masks = document.getElementsByClassName('sh-drawer-mask') || []
47
+ return Array.from(masks).every(m => m.style.display === 'none' || m.classList.contains('fade-leave-to'))
48
+ }
49
+
50
+ const setScrollBar = () => {
51
+ if (state.bodyIsOverflowing && state.scrollBarWidth !== undefined) {
52
+ document.body.style.paddingRight = `${state.scrollBarWidth}px`
53
+ }
54
+ }
55
+
56
+ const resetScrollBar = () => {
57
+ document.body.style.paddingRight = ''
58
+ }
59
+
60
+ const addScrollEffect = () => {
61
+ if (!lockScroll) return
62
+ checkScrollBar()
63
+ setScrollBar()
64
+ document.body.style.overflow = 'hidden'
65
+ }
66
+
67
+ const removeScrollEffect = () => {
68
+ if (!lockScroll) return
69
+ if (checkMaskInVisible()) {
70
+ document.body.style.overflow = ''
71
+ resetScrollBar()
72
+ }
73
+ }
74
+ return {
75
+ addScrollEffect,
76
+ removeScrollEffect
77
+ }
76
78
  }
@@ -8,7 +8,6 @@
8
8
  <script>
9
9
  export default {
10
10
  name: 'ShEmpty',
11
- components: {},
12
11
  props: {
13
12
  icon: {
14
13
  type: String,
@@ -0,0 +1,110 @@
1
+ <template>
2
+ <div class="sh-vxe-form" :class="{ readonly: readonly, disabled: disabled }">
3
+ <vxe-form
4
+ ref="formRef"
5
+ :key="renderKey"
6
+ v-bind="formBindConfig"
7
+ @submit="onFormSubmit"
8
+ @submit-invalid="onFormSubmitInvalid"
9
+ @reset="onFormReset"
10
+ @collapse="onFormCollapse"
11
+ @edit-closed="onFormEditClosed"
12
+ @prefix-click="onPrefixClick"
13
+ @suffix-click="onSuffixClick">
14
+ <div v-if="footer" class="sh-common-footer">
15
+ <div class="sh-common-footer-left">
16
+ <slot name="formLeft"></slot>
17
+ </div>
18
+ <div class="sh-common-footer-right">
19
+ <slot name="formRight"></slot>
20
+ <vxe-button v-ripple type="submit" status="primary" :size="size" :disabled="disabled || loading">
21
+ {{ globalConfig?.submitBtnText || '确认' }}
22
+ </vxe-button>
23
+ <vxe-button v-ripple type="reset" :size="size">{{ globalConfig?.resetBtnText || '重置' }}</vxe-button>
24
+ </div>
25
+ </div>
26
+ <template v-for="slot in Object.keys(slots)" #[slot]="scope">
27
+ <!-- 以之前的名字命名插槽,同时把数据原样绑定 -->
28
+ <slot :name="slot" v-bind="scope"></slot>
29
+ </template>
30
+ </vxe-form>
31
+ </div>
32
+ </template>
33
+
34
+ <script>
35
+ import { defineComponent, getCurrentInstance } from 'vue'
36
+ import props from './js/props'
37
+ import useForm from './js/useForm'
38
+ export default defineComponent({
39
+ name: 'ShForm',
40
+ props: props,
41
+ emits: ['submit', 'reset', 'edit-closed', 'submit-invalid', 'collapse', 'prefix-click', 'suffix-click'],
42
+ setup(props, context) {
43
+ const { proxy } = getCurrentInstance()
44
+ const useFormHooks = useForm(props, context, proxy, true)
45
+
46
+ return {
47
+ ...useFormHooks
48
+ }
49
+ }
50
+ })
51
+ </script>
52
+
53
+ <style lang="scss">
54
+ .sh-vxe-form {
55
+ position: relative;
56
+ &.readonly {
57
+ .vxe-form {
58
+ .vxe-input--inner[disabled],
59
+ .vxe-textarea--inner[disabled] {
60
+ cursor: auto;
61
+ color: #333;
62
+ background-color: var(--vxe-table-body-background-color);
63
+ border-color: var(--vxe-primary-lighten-color);
64
+ }
65
+ .vxe-checkbox.is--disabled {
66
+ cursor: auto;
67
+ color: #333;
68
+ & > input + .vxe-checkbox--icon {
69
+ background-color: var(--vxe-table-body-background-color);
70
+ border-color: var(--vxe-primary-lighten-color);
71
+ }
72
+ & > input + .vxe-checkbox--icon:before {
73
+ border-color: var(--vxe-primary-color);
74
+ }
75
+ & > input + .vxe-checkbox--icon + .vxe-checkbox--label {
76
+ color: #333;
77
+ }
78
+ }
79
+ .vxe-input.is--disabled .vxe-input--date-picker-suffix,
80
+ .vxe-input.is--disabled .vxe-input--number-suffix,
81
+ .vxe-input.is--disabled .vxe-input--password-suffix,
82
+ .vxe-input.is--disabled .vxe-input--search-suffix,
83
+ .vxe-input.is--disabled .vxe-input--suffix {
84
+ cursor: auto;
85
+ }
86
+ }
87
+ }
88
+ .vxe-form {
89
+ .vxe-form--gather.shFormTitleItem {
90
+ border: 1px solid var(--vxe-table-border-color);
91
+ }
92
+ .vxe-form--item {
93
+ &.shFormTitleItem {
94
+ padding: 0.2em 0.8em;
95
+ border-left: 5px solid var(--vxe-primary-color);
96
+ margin-bottom: 0.5em;
97
+ .vxe-form--item-inner {
98
+ min-height: auto;
99
+ .vxe-form--item-title {
100
+ max-width: 100%;
101
+ .vxe-form--item-title-postfix {
102
+ display: none;
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
109
+ }
110
+ </style>