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
@@ -1,11 +1,11 @@
1
1
  <template>
2
- <div ref="splitWrap" v-resize="computeOffset" class="sh-split" :class="{ 'no-select': isMoving }">
2
+ <div ref="splitRef" v-resize="computeOffset" class="sh-split" :class="{ 'no-select': isMoving }">
3
3
  <sh-loading v-if="loading" loading :content="loadingText" class="layout-loader"></sh-loading>
4
- <div v-if="isHorizontal" :class="`${prefix}-horizontal`">
4
+ <div v-if="isHorizontal" class="sh-split-horizontal">
5
5
  <div :style="{ right: `${anotherOffset}%` }" class="left-pane" :class="paneClasses">
6
6
  <slot name="left" />
7
7
  </div>
8
- <div :class="`${prefix}-trigger-con`" :style="{ left: `${offset}%` }" @mousedown="handleMousedown">
8
+ <div class="sh-split-trigger-con" :style="{ left: `${offset}%` }" @mousedown="handleMousedown">
9
9
  <slot name="trigger">
10
10
  <trigger mode="vertical" />
11
11
  </slot>
@@ -14,11 +14,11 @@
14
14
  <slot name="right" />
15
15
  </div>
16
16
  </div>
17
- <div v-else :class="`${prefix}-vertical`">
17
+ <div v-else class="sh-split-vertical">
18
18
  <div :style="{ bottom: `${anotherOffset}%` }" class="top-pane" :class="paneClasses">
19
19
  <slot name="top" />
20
20
  </div>
21
- <div :class="`${prefix}-trigger-con`" :style="{ top: `${offset}%` }" @mousedown="handleMousedown">
21
+ <div class="sh-split-trigger-con" :style="{ top: `${offset}%` }" @mousedown="handleMousedown">
22
22
  <slot name="trigger">
23
23
  <trigger mode="horizontal" />
24
24
  </slot>
@@ -31,8 +31,9 @@
31
31
  </template>
32
32
 
33
33
  <script>
34
+ import { defineComponent, computed, getCurrentInstance, ref, watch, onMounted, nextTick } from 'vue'
34
35
  import trigger from './components/trigger.vue'
35
- export default {
36
+ export default defineComponent({
36
37
  name: 'ShSplit',
37
38
  components: {
38
39
  trigger
@@ -75,119 +76,124 @@ export default {
75
76
  }
76
77
  },
77
78
  emits: ['update:modelValue', 'move-start', 'moveing', 'move-end'],
78
- data() {
79
- return {
80
- offset: 0,
81
- oldOffset: 0,
82
- isMoving: false,
83
- computedMin: 0,
84
- computedMax: 0,
85
- currentValue: this.modelValue
86
- }
87
- },
88
- computed: {
89
- prefix() {
90
- return 'sh-split'
91
- },
92
- paneClasses() {
93
- return [
94
- `${this.prefix}-pane`,
95
- {
96
- [`${this.prefix}-pane-moving`]: this.isMoving
97
- }
98
- ]
99
- },
100
- isHorizontal() {
101
- return this.mode === 'horizontal'
102
- },
103
- anotherOffset() {
104
- return 100 - this.offset
105
- },
106
- valueIsPx() {
107
- return typeof this.modelValue === 'string'
108
- },
109
- offsetSize() {
110
- return this.isHorizontal ? 'offsetWidth' : 'offsetHeight'
79
+ setup(props, context) {
80
+ const vm = getCurrentInstance()
81
+ const { $vUtils } = vm.proxy
82
+ const { emit, slots } = context
83
+
84
+ const splitRef = ref()
85
+ const offset = ref(0)
86
+ const initOffset = ref(0)
87
+ const oldOffset = ref(0)
88
+ const isMoving = ref(false)
89
+ const computedMin = ref(0)
90
+ const computedMax = ref(0)
91
+ const currentValue = ref(props.modelValue)
92
+
93
+ const paneClasses = computed(() => {
94
+ return {
95
+ 'sh-split-pane': true,
96
+ 'sh-split-pane-moving': props.isMoving
97
+ }
98
+ })
99
+ const isHorizontal = computed(() => {
100
+ return props.mode === 'horizontal'
101
+ })
102
+ const anotherOffset = computed(() => {
103
+ return 100 - offset.value
104
+ })
105
+ const valueIsPx = computed(() => {
106
+ return typeof props.modelValue === 'string'
107
+ })
108
+ const offsetSize = computed(() => {
109
+ return isHorizontal.value ? 'offsetWidth' : 'offsetHeight'
110
+ })
111
+
112
+ const px2percent = (numerator, denominator) => {
113
+ return parseFloat(numerator) / parseFloat(denominator)
111
114
  }
112
- },
113
- watch: {
114
- modelValue(val) {
115
- this.resetOffset(val)
115
+ const getComputedThresholdValue = type => {
116
+ let size = splitRef.value[offsetSize.value]
117
+ if (valueIsPx.value) return typeof props[type] === 'string' ? props[type] : size * props[type]
118
+ else return typeof props[type] === 'string' ? px2percent(props[type], size) : props[type]
116
119
  }
117
- },
118
- created() {},
119
- mounted() {
120
- this.computeOffset()
121
- },
122
- beforeUnmount() {},
123
- methods: {
124
- px2percent(numerator, denominator) {
125
- return parseFloat(numerator) / parseFloat(denominator)
126
- },
127
- getComputedThresholdValue(type) {
128
- let size = this.$refs.splitWrap[this.offsetSize]
129
- if (this.valueIsPx) return typeof this[type] === 'string' ? this[type] : size * this[type]
130
- else return typeof this[type] === 'string' ? this.px2percent(this[type], size) : this[type]
131
- },
132
- getMin(value1, value2) {
133
- if (this.valueIsPx) return `${Math.min(parseFloat(value1), parseFloat(value2))}px`
120
+ const getMin = (value1, value2) => {
121
+ if (valueIsPx.value) return `${Math.min(parseFloat(value1), parseFloat(value2))}px`
134
122
  else return Math.min(value1, value2)
135
- },
136
- getMax(value1, value2) {
137
- if (this.valueIsPx) return `${Math.max(parseFloat(value1), parseFloat(value2))}px`
123
+ }
124
+ const getMax = (value1, value2) => {
125
+ if (valueIsPx.value) return `${Math.max(parseFloat(value1), parseFloat(value2))}px`
138
126
  else return Math.max(value1, value2)
139
- },
140
- getAnotherOffset(value) {
127
+ }
128
+ const getAnotherOffset = value => {
141
129
  let res = 0
142
- if (this.valueIsPx) res = `${this.$refs.splitWrap[this.offsetSize] - parseFloat(value)}px`
130
+ if (valueIsPx.value) res = `${splitRef.value[offsetSize.value] - parseFloat(value)}px`
143
131
  else res = 1 - value
144
132
  return res
145
- },
146
- handleMove(e) {
147
- let pageOffset = this.isHorizontal ? e.pageX : e.pageY
148
- let offset = pageOffset - this.initOffset
149
- let outerWidth = this.$refs.splitWrap[this.offsetSize]
150
- let value = this.valueIsPx ? `${parseFloat(this.oldOffset) + offset}px` : this.px2percent(outerWidth * this.oldOffset + offset, outerWidth)
151
- let anotherValue = this.getAnotherOffset(value)
152
- if (parseFloat(value) <= parseFloat(this.computedMin)) value = this.getMax(value, this.computedMin)
153
- if (parseFloat(anotherValue) <= parseFloat(this.computedMax)) value = this.getAnotherOffset(this.getMax(anotherValue, this.computedMax))
154
- e.atMin = this.currentValue === this.computedMin
155
- e.atMax = this.valueIsPx ? this.getAnotherOffset(this.currentValue) === this.computedMax : this.getAnotherOffset(this.currentValue).toFixed(5) === this.computedMax.toFixed(5)
156
- this.emitValue(value)
157
- this.$emit('moveing', e)
158
- },
159
- handleUp() {
160
- this.isMoving = false
161
- this.$vUtils.offListener(document, 'mousemove', this.handleMove)
162
- this.$vUtils.offListener(document, 'mouseup', this.handleUp)
163
- this.$emit('move-end')
164
- },
165
- handleMousedown(e) {
166
- this.initOffset = this.isHorizontal ? e.pageX : e.pageY
167
- this.oldOffset = this.currentValue
168
- this.isMoving = true
169
- this.$vUtils.onListener(document, 'mousemove', this.handleMove)
170
- this.$vUtils.onListener(document, 'mouseup', this.handleUp)
171
- this.$emit('move-start')
172
- },
173
- computeOffset() {
174
- this.computedMin = this.getComputedThresholdValue('min')
175
- this.computedMax = this.getComputedThresholdValue('max')
176
- this.offset = ((this.valueIsPx ? this.px2percent(this.currentValue, this.$refs.splitWrap[this.offsetSize]) : this.currentValue) * 10000) / 100
177
- return this.$nextTick()
178
- },
179
- resetOffset(val) {
180
- if (val !== this.currentValue) {
181
- this.currentValue = val
182
- this.computeOffset()
133
+ }
134
+ const handleMove = e => {
135
+ let pageOffset = isHorizontal.value ? e.pageX : e.pageY
136
+ let offset = pageOffset - initOffset.value
137
+ let outerWidth = splitRef.value[offsetSize.value]
138
+ let value = valueIsPx.value ? `${parseFloat(oldOffset.value) + offset}px` : px2percent(outerWidth * oldOffset.value + offset, outerWidth)
139
+ let anotherValue = getAnotherOffset(value)
140
+ if (parseFloat(value) <= parseFloat(computedMin.value)) value = getMax(value, computedMin.value)
141
+ if (parseFloat(anotherValue) <= parseFloat(computedMax.value)) value = getAnotherOffset(getMax(anotherValue, computedMax.value))
142
+ e.atMin = currentValue.value === computedMin.value
143
+ e.atMax = valueIsPx.value ? getAnotherOffset(currentValue.value) === computedMax.value : getAnotherOffset(currentValue.value).toFixed(5) === computedMax.value.toFixed(5)
144
+ emitValue(value)
145
+ emit('moveing', e)
146
+ }
147
+ const handleUp = () => {
148
+ isMoving.value = false
149
+ $vUtils.offListener(document, 'mousemove', handleMove)
150
+ $vUtils.offListener(document, 'mouseup', handleUp)
151
+ emit('move-end')
152
+ }
153
+ const handleMousedown = e => {
154
+ initOffset.value = isHorizontal.value ? e.pageX : e.pageY
155
+ oldOffset.value = currentValue.value
156
+ isMoving.value = true
157
+ $vUtils.onListener(document, 'mousemove', handleMove)
158
+ $vUtils.onListener(document, 'mouseup', handleUp)
159
+ emit('move-start')
160
+ }
161
+ const computeOffset = () => {
162
+ computedMin.value = getComputedThresholdValue('min')
163
+ computedMax.value = getComputedThresholdValue('max')
164
+ offset.value = ((valueIsPx.value ? px2percent(currentValue.value, splitRef.value[offsetSize.value]) : currentValue.value) * 10000) / 100
165
+ // return nextTick()
166
+ }
167
+ const resetOffset = val => {
168
+ if (val !== currentValue.value) {
169
+ currentValue.value = val
170
+ computeOffset()
183
171
  }
184
- },
185
- emitValue(value) {
186
- this.resetOffset(value)
187
- this.$emit('update:modelValue', value)
172
+ }
173
+ const emitValue = value => {
174
+ resetOffset(value)
175
+ emit('update:modelValue', value)
176
+ }
177
+
178
+ watch(
179
+ () => props.modelValue,
180
+ val => {
181
+ resetOffset(val)
182
+ }
183
+ )
184
+
185
+ return {
186
+ splitRef,
187
+ isMoving,
188
+ isHorizontal,
189
+ anotherOffset,
190
+ paneClasses,
191
+ offset,
192
+ computeOffset,
193
+ handleMousedown
188
194
  }
189
195
  }
190
- }
196
+ })
191
197
  </script>
192
198
 
193
199
  <style lang="scss">
@@ -49,9 +49,9 @@
49
49
  </template>
50
50
 
51
51
  <script>
52
- import excelToJson from '../js/excel_to_json'
52
+ import { defineComponent, computed, getCurrentInstance, ref, onBeforeMount } from 'vue'
53
53
  import ExcelJS from 'exceljs'
54
- export default {
54
+ export default defineComponent({
55
55
  name: 'TableImport',
56
56
  props: {
57
57
  visible: {
@@ -103,70 +103,61 @@ export default {
103
103
  }
104
104
  },
105
105
  emits: ['confirm', 'update:visible'],
106
- data() {
107
- return {
108
- importTableData: [],
109
- importErrorData: [],
110
- modalLoading: false,
111
- showProgress: false,
112
- progressPercent: 0
113
- }
114
- },
115
- computed: {
116
- tableGlobalConfig() {
117
- return Object.assign({ checkbox: false, seq: true, zoom: false, title: true, tableName: '导入预览' }, this.globalConfig)
118
- },
119
- tableColumns() {
120
- return this.columns.filter(item => !(['seq', 'checkbox', 'radio'].includes(item.type) || item.renderName === '$vGlobalOption'))
121
- }
122
- },
123
- watch: {},
124
- created() {
125
- this.initCreated()
126
- },
127
- mounted() {},
128
- beforeUnmount() {},
129
- methods: {
106
+ setup(props, context) {
107
+ const { proxy } = getCurrentInstance()
108
+ const { $vUtils } = proxy
109
+ const { emit, slots } = context
110
+ const shtable = ref()
111
+
112
+ const importTableData = ref([])
113
+ const importErrorData = ref([])
114
+ const modalLoading = ref(false)
115
+ const showProgress = ref(false)
116
+ const progressPercent = ref(0)
117
+
118
+ const tableGlobalConfig = computed(() => Object.assign({ checkbox: false, seq: true, zoom: false, title: true, tableName: '导入预览' }, props.globalConfig))
119
+ const tableColumns = computed(() => props.columns.filter(item => !(['seq', 'checkbox', 'radio'].includes(item.type) || item.renderName === '$vGlobalOption')))
120
+
130
121
  // 初始化
131
- initCreated() {
132
- this.showProgress = false
133
- this.progressPercent = 0
134
- this.importTableData = []
135
- },
122
+ const initCreated = () => {
123
+ showProgress.value = false
124
+ progressPercent.value = 0
125
+ importTableData.value = []
126
+ }
136
127
  // 弹窗关闭
137
- onModalClose() {
138
- this.$emit('update:visible', false)
139
- },
128
+ const onModalClose = () => {
129
+ emit('update:visible', false)
130
+ }
140
131
  // 确认导入数据按钮
141
- async handleImportDataBtn(type = 'all') {
142
- let importData = type === 'all' ? this.importTableData : this.$refs.shtable.getSelectionData()
132
+ const handleImportDataBtn = async (type = 'all') => {
133
+ let importData = type === 'all' ? importTableData.value : shtable.value.getSelectionData()
143
134
  if (!importData || !Array.isArray(importData) || importData.length < 1) {
144
- this.msginfo('未导入数据')
135
+ proxy.msginfo('未导入数据')
145
136
  return false
146
137
  }
147
- if (this.needValidate) {
148
- let validateErrMap = await this.handleImportDataValidate(importData)
138
+ if (props.needValidate) {
139
+ let validateErrMap = await handleImportDataValidate(importData)
149
140
  if (validateErrMap) {
150
- this.msgerror('导入校验失败,请检查数据')
141
+ proxy.msgerror('导入校验失败,请检查数据')
151
142
  return validateErrMap
152
143
  }
153
144
  }
154
- this.$emit('confirm', importData)
155
- this.onModalClose()
156
- },
145
+ emit('confirm', importData)
146
+ onModalClose()
147
+ }
157
148
  // 导入数据验证
158
- async handleImportDataValidate(rows) {
159
- return this.$refs.shtable.validate(rows)
160
- },
149
+ const handleImportDataValidate = async rows => {
150
+ return shtable.value.validate(rows)
151
+ }
161
152
  // 下载导入模板按钮
162
- handleDownloadTemplateBtn() {
163
- const parentTable = this.$refs.shtable.tableRef()
164
- if (typeof this.downloadTemplateCallback === 'function') {
165
- this.downloadTemplateCallback()
153
+ const handleDownloadTemplateBtn = () => {
154
+ const parentTable = shtable.value.tableRef.value
155
+ if (typeof props.downloadTemplateCallback === 'function') {
156
+ props.downloadTemplateCallback()
166
157
  }
167
158
  let defaultOption = {
168
159
  filename: '模板',
169
- sheetName: this.globalConfig.filename || '模板',
160
+ sheetName: props.globalConfig.filename || '模板',
170
161
  type: 'xlsx',
171
162
  original: false,
172
163
  download: true,
@@ -175,59 +166,59 @@ export default {
175
166
  columns: parentTable.getColumns().filter(item => item.type !== 'seq'),
176
167
  data: [],
177
168
  afterExportMethod: options => {
178
- this.handleDownloadTemplateFinished(options)
169
+ handleDownloadTemplateFinished(options)
179
170
  }
180
171
  }
181
- parentTable.exportData(Object.assign(defaultOption, this.importOption))
182
- },
172
+ parentTable.exportData(Object.assign(defaultOption, props.importConfig))
173
+ }
183
174
  // 下载导入模板成功回调
184
- handleDownloadTemplateFinished(options) {
185
- if (typeof this.downloadTemplateFinished === 'function') {
186
- this.downloadTemplateFinished(options)
175
+ const handleDownloadTemplateFinished = options => {
176
+ if (typeof props.downloadTemplateFinished === 'function') {
177
+ props.downloadTemplateFinished(options)
187
178
  }
188
- this.msgsuccess('下载模板完成!')
189
- },
179
+ proxy.msgsuccess('下载模板完成!')
180
+ }
190
181
  // 选择导入文件按钮
191
- async handleImportFileBtn() {
182
+ const handleImportFileBtn = async () => {
192
183
  try {
193
- const { file } = await this.$vTable.readFile({
184
+ const { file } = await proxy.$vTable.readFile({
194
185
  types: ['xlsx', 'xls']
195
186
  })
196
- if (typeof this.importFileCallback === 'function') {
197
- this.importFileCallback(file)
187
+ if (typeof props.importFileCallback === 'function') {
188
+ props.importFileCallback(file)
198
189
  }
199
- let fileRes = await this.readFile(file)
200
- let { results, errDatas } = this.dealImportTableData(this.tableColumns, fileRes)
201
- this.importTableData = results
202
- this.importErrorData = errDatas
190
+ let fileRes = await readFile(file)
191
+ let { results, errDatas } = dealImportTableData(tableColumns.value, fileRes)
192
+ importTableData.value = results
193
+ importErrorData.value = errDatas
203
194
  setTimeout(() => {
204
- this.showProgress = false
195
+ showProgress.value = false
205
196
  }, 2000)
206
- if (typeof this.importFileFinished === 'function') {
207
- this.importFileFinished(options)
197
+ if (typeof props.importFileFinished === 'function') {
198
+ props.importFileFinished(options)
208
199
  }
209
- this.msgsuccess('导入完成!')
200
+ proxy.msgsuccess('导入完成!')
210
201
  } catch (e) {
211
- this.msgerror(e.message || e)
202
+ proxy.msgerror(e.message || e)
212
203
  }
213
- },
204
+ }
214
205
  // 读取文件
215
- async readFile(file) {
206
+ const readFile = async file => {
216
207
  return new Promise((resolve, reject) => {
217
208
  const reader = new FileReader()
218
209
  reader.readAsArrayBuffer(file)
219
210
  reader.onloadstart = e => {
220
- this.modalLoading = true
221
- this.showProgress = true
211
+ modalLoading.value = true
212
+ showProgress.value = true
222
213
  }
223
214
  reader.onprogress = e => {
224
- this.progressPercent = Math.round((e.loaded / e.total) * 100)
215
+ progressPercent.value = Math.round((e.loaded / e.total) * 100)
225
216
  }
226
217
  reader.onerror = e => {
227
218
  reject(new Error('文件读取出错'))
228
219
  }
229
220
  reader.onload = e => {
230
- this.modalLoading = false
221
+ modalLoading.value = false
231
222
  const workbook = new ExcelJS.Workbook()
232
223
  const data = e.target.result
233
224
  workbook.xlsx.load(data).then(wb => {
@@ -246,11 +237,10 @@ export default {
246
237
  })
247
238
  }
248
239
  })
249
- },
240
+ }
250
241
  // 根据表格读取数据生成表格数据
251
- dealImportTableData(columns, records) {
252
- const { $vUtils } = this
253
- let fields = this.generateColumnsAll(columns)
242
+ const dealImportTableData = (columns, records) => {
243
+ let fields = generateColumnsAll(columns)
254
244
  let errDatas = []
255
245
  let results = records.map((row, rowIndex) => {
256
246
  const item = {}
@@ -295,12 +285,12 @@ export default {
295
285
  return item
296
286
  })
297
287
  return { results, errDatas }
298
- },
288
+ }
299
289
  // 生成全表头
300
- generateColumnsAll(columns, resultColumns = []) {
290
+ const generateColumnsAll = (columns, resultColumns = []) => {
301
291
  columns.forEach((column, index) => {
302
292
  if (column.children && Array.isArray(column.children) && column.children.length) {
303
- this.generateColumnsAll(column.children, resultColumns)
293
+ generateColumnsAll(column.children, resultColumns)
304
294
  } else {
305
295
  if (column.field) {
306
296
  resultColumns.push({
@@ -314,8 +304,27 @@ export default {
314
304
  })
315
305
  return resultColumns
316
306
  }
307
+
308
+ onBeforeMount(() => {
309
+ initCreated()
310
+ })
311
+
312
+ return {
313
+ shtable,
314
+ modalLoading,
315
+ showProgress,
316
+ progressPercent,
317
+ importErrorData,
318
+ tableColumns,
319
+ importTableData,
320
+ tableGlobalConfig,
321
+ onModalClose,
322
+ handleDownloadTemplateBtn,
323
+ handleImportFileBtn,
324
+ handleImportDataBtn
325
+ }
317
326
  }
318
- }
327
+ })
319
328
  </script>
320
329
 
321
330
  <style lang="scss" scoped>
@@ -0,0 +1,54 @@
1
+ <template>
2
+ <vxe-colgroup v-if="isGroup" v-bind="groupConfig">
3
+ <template v-for="(child, childIndex) in column.children" :key="childIndex">
4
+ <sh-column :column="child"></sh-column>
5
+ </template>
6
+ </vxe-colgroup>
7
+ <vxe-column v-else v-bind="columnConfig"></vxe-column>
8
+ </template>
9
+
10
+ <script>
11
+ import { computed, defineComponent, getCurrentInstance, inject, ref } from 'vue'
12
+ import { turnColumnItemFilters } from '../js/tableMethods'
13
+ export default defineComponent({
14
+ name: 'ShColumn',
15
+ props: {
16
+ column: {
17
+ type: Object
18
+ }
19
+ },
20
+ setup(props, context) {
21
+ const { proxy } = getCurrentInstance()
22
+ const { $vUtils } = proxy
23
+ const shTable = inject('ShTableInstance')
24
+
25
+ const isGroup = computed(() => {
26
+ return proxy.hasChildren(props.column)
27
+ })
28
+ const columnConfig = computed(() => {
29
+ let renderObj = { name: props.column.renderName, props: props.column.renderProps }
30
+ let config = Object.assign({}, shTable.columnObjConfig.value, props.column)
31
+ if (props.column.readonly) {
32
+ config.cellRender = config.cellRender || renderObj
33
+ } else {
34
+ config.editRender = config.editRender || renderObj
35
+ }
36
+ if (config.filter === true || Number(config.filter) === 1) {
37
+ shTable.turnColumnItemFilters(config, renderObj.props)
38
+ }
39
+ return $vUtils.omit(config, ['renderName', 'renderProps', 'renderRequire', 'requireProps'])
40
+ })
41
+ const groupConfig = computed(() => {
42
+ return $vUtils.omit(columnConfig.value, ['children', 'cellRender', 'editRender'])
43
+ })
44
+
45
+ return {
46
+ isGroup,
47
+ columnConfig,
48
+ groupConfig
49
+ }
50
+ }
51
+ })
52
+ </script>
53
+
54
+ <style scoped lang="scss"></style>