sh-view 2.0.8 → 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 (129) 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 +216 -183
  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 +294 -287
  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 +75 -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 +71 -61
  61. package/packages/components/other-components/sh-menu-card/index.vue +81 -59
  62. package/packages/components/other-components/sh-menu-card/menu-box.vue +87 -68
  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 +115 -113
  69. package/packages/css/index.js +4 -4
  70. package/packages/{assets/css → css}/main.scss +2 -50
  71. package/packages/{assets/css → css}/theme.scss +35 -16
  72. package/packages/directive/module/prevent-click.js +1 -1
  73. package/packages/directive/module/resize.js +11 -154
  74. package/packages/index.js +39 -39
  75. package/packages/mixin/index.js +86 -87
  76. package/packages/vxeTable/css/index.scss +3 -0
  77. package/packages/vxeTable/render/cell/vxe-render-checkbox.vue +14 -5
  78. package/packages/vxeTable/render/cell/vxe-render-checkgroup.vue +43 -36
  79. package/packages/vxeTable/render/cell/vxe-render-code.vue +14 -5
  80. package/packages/vxeTable/render/cell/vxe-render-goption.vue +34 -24
  81. package/packages/vxeTable/render/cell/vxe-render-href.vue +21 -11
  82. package/packages/vxeTable/render/cell/vxe-render-img.vue +16 -10
  83. package/packages/vxeTable/render/cell/vxe-render-input.vue +83 -67
  84. package/packages/vxeTable/render/cell/vxe-render-money.vue +14 -6
  85. package/packages/vxeTable/render/cell/vxe-render-progress.vue +28 -19
  86. package/packages/vxeTable/render/cell/vxe-render-radio.vue +14 -5
  87. package/packages/vxeTable/render/cell/vxe-render-radiogroup.vue +43 -36
  88. package/packages/vxeTable/render/cell/vxe-render-select.vue +44 -36
  89. package/packages/vxeTable/render/cell/vxe-render-switch.vue +14 -5
  90. package/packages/vxeTable/render/cell/vxe-render-table.vue +51 -78
  91. package/packages/vxeTable/render/cell/vxe-render-textarea.vue +14 -5
  92. package/packages/vxeTable/render/cell/vxe-render-time.vue +23 -13
  93. package/packages/vxeTable/render/cell/vxe-render-tree.vue +23 -27
  94. package/packages/vxeTable/render/cell/vxe-render-upload.vue +11 -7
  95. package/packages/vxeTable/render/filters/vxe-filter-input.vue +25 -43
  96. package/packages/vxeTable/render/footer/vxe-footer-input.vue +23 -13
  97. package/packages/vxeTable/render/footer/vxe-footer-money.vue +30 -20
  98. package/packages/vxeTable/render/globalRenders.jsx +1 -1
  99. package/packages/vxeTable/render/header/vxe-header-money.vue +31 -21
  100. package/packages/vxeTable/render/mixin/cell-hooks.js +162 -0
  101. package/packages/vxeTable/render/mixin/cell-props.js +23 -0
  102. package/packages/vxeTable/render/mixin/filter-hooks.js +28 -0
  103. package/packages/components/global-components/sh-form/components/form-item.vue +0 -25
  104. package/packages/components/global-components/sh-form/css/index.scss +0 -55
  105. package/packages/components/global-components/sh-form/index.vue +0 -114
  106. package/packages/components/global-components/sh-form/js/methods.js +0 -146
  107. package/packages/components/global-components/sh-form/mixin/defaultData.js +0 -32
  108. package/packages/components/global-components/sh-icon/css/default/index.scss +0 -27
  109. package/packages/components/global-components/sh-icon/css/font/index.scss +0 -16
  110. package/packages/components/global-components/sh-icon/icon-default.vue +0 -32
  111. package/packages/components/global-components/sh-icon/icon-font.vue +0 -32
  112. package/packages/components/global-components/sh-poptip/popper.js +0 -115
  113. package/packages/components/global-components/sh-query/index.vue +0 -317
  114. package/packages/components/global-components/sh-table/js/methods.js +0 -549
  115. package/packages/components/global-components/sh-table/mixin/defaultData.js +0 -94
  116. package/packages/components/global-components/sh-upload/js/mixin.js +0 -257
  117. package/packages/components/other-components/sh-cron-modal/mixin/cron-box.js +0 -169
  118. package/packages/vxeTable/render/mixin/cell-mixin.js +0 -206
  119. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.svg → ionicons.svg} +0 -0
  120. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.ttf → ionicons.ttf} +0 -0
  121. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.woff → ionicons.woff} +0 -0
  122. /package/packages/components/global-components/sh-icon/css/default/{fonts/ionicons.woff2 → ionicons.woff2} +0 -0
  123. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.js → iconfont.js} +0 -0
  124. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.json → iconfont.json} +0 -0
  125. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.ttf → iconfont.ttf} +0 -0
  126. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.woff → iconfont.woff} +0 -0
  127. /package/packages/components/global-components/sh-icon/css/font/{fonts/iconfont.woff2 → iconfont.woff2} +0 -0
  128. /package/packages/{assets/css → css}/animated.scss +0 -0
  129. /package/packages/{assets/css → css}/loader.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>
@@ -18,7 +18,9 @@
18
18
  <div class="sh-drawer-header-inner">{{ title }}</div>
19
19
  </slot>
20
20
  </div>
21
- <div class="sh-drawer-body" :style="styles"><slot></slot></div>
21
+ <div class="sh-drawer-body" :style="styles">
22
+ <slot v-if="modelValue || !destroyOnClose"></slot>
23
+ </div>
22
24
  </div>
23
25
  <div v-if="draggable && (placement === 'left' || placement === 'right')" class="sh-drawer-drag" :class="'sh-drawer-drag-' + placement" @mousedown="handleTriggerMousedown">
24
26
  <slot name="trigger">
@@ -35,10 +37,10 @@
35
37
  </template>
36
38
 
37
39
  <script>
38
- import ScrollbarMixins from './scrollbar'
39
- export default {
40
+ import { defineComponent, ref, watch, onMounted, onBeforeUnmount, getCurrentInstance, computed } from 'vue'
41
+ import useScrollbar from './scrollbar'
42
+ export default defineComponent({
40
43
  name: 'ShDrawer',
41
- mixins: [ScrollbarMixins],
42
44
  props: {
43
45
  modelValue: {
44
46
  type: Boolean,
@@ -99,226 +101,257 @@ export default {
99
101
  type: Boolean,
100
102
  default: false
101
103
  },
104
+ destroyOnClose: {
105
+ type: Boolean,
106
+ default: false
107
+ },
102
108
  beforeClose: Function
103
109
  },
104
110
  emits: ['update:modelValue', 'close', 'resize-width', 'visible-change', 'drag'],
105
- data() {
106
- return {
107
- visible: this.modelValue,
108
- wrapShow: false,
109
- showHead: true,
110
- canMove: false,
111
- dragWidth: this.width,
112
- dragHeight: this.height,
113
- wrapperWidth: this.width,
114
- wrapperHeight: this.height,
115
- wrapperLeft: 0,
116
- minWidth: 256,
117
- minHeight: 256,
118
- id: this.$vUtils.randomStr(6),
119
- tableList: [],
120
- sliderList: []
121
- }
122
- },
123
- computed: {
124
- 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(() => {
125
135
  return {
126
- 'sh-drawer-hidden': !this.wrapShow,
127
- 'sh-drawer-no-mask': !this.mask,
128
- 'sh-drawer-wrap-inner': this.inner,
129
- 'sh-drawer-wrap-dragging': this.canMove,
130
- [`${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
131
141
  }
132
- },
133
- mainStyles() {
142
+ })
143
+ const mainStyles = computed(() => {
134
144
  let style = {}
135
- if (this.placement === 'left' || this.placement === 'right') {
136
- const width = parseInt(this.dragWidth)
145
+ if (props.placement === 'left' || props.placement === 'right') {
146
+ const width = parseInt(dragWidth.value)
137
147
  const styleWidth = {
138
148
  width: width <= 100 ? `${width}%` : `${width}px`
139
149
  }
140
150
  Object.assign(style, styleWidth)
141
151
  } else {
142
- const height = parseInt(this.dragHeight)
152
+ const height = parseInt(dragHeight.value)
143
153
  const styleHeight = {
144
154
  height: height <= 100 ? `${height}%` : `${height}px`
145
155
  }
146
156
  Object.assign(style, styleHeight)
147
157
  }
148
158
  return style
149
- },
150
- contentClasses() {
151
- return {
152
- 'sh-drawer-content-no-mask': !this.mask
153
- }
154
- },
155
- classes() {
156
- return {
157
- [`sh-drawer-${this.placement}`]: true,
158
- 'sh-drawer-no-header': !this.showHead,
159
- 'sh-drawer-inner': this.inner
160
- }
161
- },
162
- maskClasses() {
159
+ })
160
+ const classes = computed(() => {
163
161
  return {
164
- 'sh-drawer-mask-inner': this.inner
162
+ [`sh-drawer-${props.placement}`]: true,
163
+ 'sh-drawer-no-header': !showHead.value,
164
+ 'sh-drawer-inner': props.inner
165
165
  }
166
- },
167
- transitionName() {
168
- if (this.placement === 'left' || this.placement === 'right') return `move-${this.placement}`
169
- 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'
170
170
  else return 'move-down'
171
- }
172
- },
173
- watch: {
174
- modelValue(val) {
175
- this.visible = val
176
- },
177
- visible(val) {
178
- if (val === false) {
179
- this.timer = setTimeout(() => {
180
- this.wrapShow = false
181
- const drawers = this.$root.drawerList.map(item => item.drawer)
182
- const otherDrawers = drawers.filter(item => item.id !== this.id)
183
- const isScrollDrawer = otherDrawers.some(item => item.visible && !item.scrollable)
184
- if (!isScrollDrawer) {
185
- this.removeScrollEffect()
186
- }
187
- }, 300)
188
- } else {
189
- if (this.timer) clearTimeout(this.timer)
190
- this.wrapShow = true
191
- if (!this.scrollable) {
192
- this.addScrollEffect()
193
- }
194
- }
195
- this.tableList.forEach(item => {
196
- item.table.handleOnVisibleChange(val)
197
- })
198
- this.sliderList.forEach(item => {
199
- item.slider.handleOnVisibleChange(val)
200
- })
201
- this.$emit('visible-change', val)
202
- },
203
- scrollable(val) {
204
- if (!val) {
205
- this.addScrollEffect()
206
- } else {
207
- this.removeScrollEffect()
208
- }
209
- },
210
- title(val) {
211
- if (this.$slots.header === undefined) {
212
- this.showHead = !!val
213
- }
214
- },
215
- width(val) {
216
- this.dragWidth = val
217
- },
218
- height(val) {
219
- this.dragHeight = val
220
- }
221
- },
222
- mounted() {
223
- if (this.visible) {
224
- this.wrapShow = true
225
- }
226
- let showHead = true
227
- if (this.$slots.header === undefined && !this.title) {
228
- showHead = false
229
- }
230
- this.showHead = showHead
231
- this.addDrawer()
232
- this.$vUtils.onListener(document, 'mousemove', this.handleMousemove)
233
- this.$vUtils.onListener(document, 'mouseup', this.handleMouseup)
234
- this.handleSetWrapperWidth()
235
- },
236
- beforeUnmount() {
237
- this.removeDrawer()
238
- this.$vUtils.offListener(document, 'mousemove', this.handleMousemove)
239
- this.$vUtils.offListener(document, 'mouseup', this.handleMouseup)
240
- this.removeScrollEffect()
241
- },
242
- methods: {
243
- close() {
244
- if (!this.beforeClose) {
245
- return this.handleClose()
171
+ })
172
+
173
+ const { addScrollEffect, removeScrollEffect } = useScrollbar(props)
174
+
175
+ const close = () => {
176
+ if (!props.beforeClose) {
177
+ return handleClose()
246
178
  }
247
- const before = this.beforeClose()
179
+ const before = props.beforeClose()
248
180
  if (before && before.then) {
249
181
  before.then(() => {
250
- this.handleClose()
182
+ handleClose()
251
183
  })
252
184
  } else {
253
- this.handleClose()
185
+ handleClose()
254
186
  }
255
- },
256
- handleClose() {
257
- this.visible = false
258
- this.$emit('update:modelValue', false)
259
- this.$emit('close')
260
- },
261
- handleMask() {
262
- if (this.canMove) return
263
- if (this.maskClosable && this.mask) {
264
- 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()
265
197
  }
266
- },
267
- handleWrapClick(event) {
198
+ }
199
+ const handleWrapClick = event => {
268
200
  const className = event.target.getAttribute('class')
269
- if (className && className.indexOf('sh-drawer-wrap') > -1) this.handleMask()
270
- },
271
- handleMousemove(event) {
272
- 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
273
205
  // 更新容器宽度和距离左侧页面距离,如果是window则距左侧距离为0
274
- this.handleSetWrapperWidth()
275
- const left = event.pageX - this.wrapperLeft
206
+ handleSetWrapperWidth()
207
+ const left = event.pageX - wrapperLeft.value
276
208
  // 如果抽屉方向为右边,宽度计算需用容器宽度减去left
277
- let width = this.placement === 'right' ? this.wrapperWidth - left : left
209
+ let width = props.placement === 'right' ? wrapperWidth.value - left : left
278
210
  // 限定最小宽度
279
- width = Math.max(width, parseFloat(this.minWidth))
280
- event.atMin = width === parseFloat(this.minWidth)
211
+ width = Math.max(width, parseFloat(minWidth.value))
212
+ event.atMin = width === parseFloat(minWidth.value)
281
213
  // 如果当前width不大于100,视为百分比
282
- if (width <= 100) width = (width / this.wrapperWidth) * 100
214
+ if (width <= 100) width = (width / wrapperWidth.value) * 100
283
215
  if (width >= window.innerWidth) width = window.innerWidth
284
- this.dragWidth = width
285
- this.$emit('resize-width', parseInt(this.dragWidth))
286
- this.$emit('drag', 'dragging', parseInt(this.dragWidth))
287
- },
288
- handleSetWrapperWidth() {
289
- const { width, left } = this.$refs.drawer.getBoundingClientRect()
290
- this.wrapperWidth = width
291
- this.wrapperLeft = left
292
- },
293
- handleMouseup() {
294
- 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
295
227
  setTimeout(() => {
296
- this.canMove = false
228
+ canMove.value = false
297
229
  })
298
- this.$emit('drag', 'end')
299
- },
300
- handleTriggerMousedown() {
301
- this.canMove = true
230
+ emit('drag', 'end')
231
+ }
232
+ const handleTriggerMousedown = () => {
233
+ canMove.value = true
302
234
  // 防止鼠标选中抽屉中文字,造成拖动trigger触发浏览器原生拖动行为
303
235
  window.getSelection().removeAllRanges()
304
- this.$emit('drag', 'start')
305
- },
306
- addDrawer() {
307
- const root = this.$root
236
+ emit('drag', 'start')
237
+ }
238
+ const addDrawer = () => {
239
+ const root = vm.root
308
240
  if (!root.drawerList) root.drawerList = []
309
241
  root.drawerList.push({
310
- id: this.id,
311
- drawer: this
242
+ id: id.value,
243
+ drawer: vm
312
244
  })
313
- },
314
- removeDrawer() {
315
- const root = this.$root
245
+ }
246
+ const removeDrawer = () => {
247
+ const root = vm.root
316
248
  if (!root.drawerList) return
317
- const index = root.drawerList.findIndex(item => item.id === this.id)
249
+ const index = root.drawerList.findIndex(item => item.id === id.value)
318
250
  root.drawerList.splice(index, 1)
319
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
+ }
320
353
  }
321
- }
354
+ })
322
355
  </script>
323
356
 
324
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>