sh-view 1.7.6 → 2.0.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 (200) hide show
  1. package/.eslintrc.js +20 -21
  2. package/package.json +10 -10
  3. package/packages/assets/css/animated.scss +167 -2
  4. package/packages/assets/css/loader.scss +42 -42
  5. package/packages/assets/css/main.scss +41 -21
  6. package/packages/assets/css/theme.scss +83 -44
  7. package/packages/components/global-components/sh-alert/index.vue +173 -0
  8. package/packages/components/global-components/sh-badge/index.vue +227 -0
  9. package/packages/components/global-components/sh-card/index.vue +140 -122
  10. package/packages/components/global-components/sh-code-editor/index.vue +260 -260
  11. package/packages/components/global-components/sh-col/css/index.scss +76 -0
  12. package/packages/components/global-components/sh-col/index.vue +83 -0
  13. package/packages/components/global-components/sh-corner/index.vue +1 -9
  14. package/packages/components/global-components/sh-count-to/index.vue +102 -46
  15. package/packages/components/global-components/sh-date/index.vue +40 -0
  16. package/packages/components/global-components/sh-drawer/index.vue +518 -0
  17. package/packages/components/global-components/sh-drawer/scrollbar.js +76 -0
  18. package/packages/components/global-components/sh-empty/index.vue +43 -43
  19. package/packages/components/global-components/{sh-vxe-form → sh-form}/css/index.scss +6 -6
  20. package/packages/components/global-components/{sh-vxe-form → sh-form}/index.vue +114 -115
  21. package/packages/components/global-components/{sh-vxe-form → sh-form}/js/methods.js +146 -157
  22. package/packages/components/global-components/{sh-vxe-form → sh-form}/mixin/defaultData.js +32 -33
  23. package/packages/components/global-components/sh-header/index.vue +293 -269
  24. package/packages/components/global-components/sh-icon/css/default/fonts/ionicons.svg +870 -0
  25. package/packages/components/global-components/sh-icon/css/default/fonts/ionicons.ttf +0 -0
  26. package/packages/components/global-components/sh-icon/css/default/fonts/ionicons.woff +0 -0
  27. package/packages/components/global-components/sh-icon/css/default/fonts/ionicons.woff2 +0 -0
  28. package/packages/components/global-components/sh-icon/css/default/icons.scss +2583 -0
  29. package/packages/components/global-components/sh-icon/css/default/index.scss +27 -0
  30. package/packages/components/global-components/sh-icon/css/font/fonts/iconfont.js +1 -0
  31. package/packages/components/global-components/sh-icon/css/font/fonts/iconfont.json +247 -0
  32. package/packages/components/global-components/sh-icon/css/font/fonts/iconfont.ttf +0 -0
  33. package/packages/components/global-components/sh-icon/css/font/fonts/iconfont.woff +0 -0
  34. package/packages/components/global-components/sh-icon/css/font/fonts/iconfont.woff2 +0 -0
  35. package/packages/components/global-components/sh-icon/css/font/icons.scss +135 -0
  36. package/packages/components/global-components/sh-icon/css/font/index.scss +16 -0
  37. package/packages/components/global-components/sh-icon/icon-default.vue +32 -0
  38. package/packages/components/global-components/sh-icon/{icons.vue → icon-font.vue} +32 -32
  39. package/packages/components/global-components/sh-icon/index.vue +28 -27
  40. package/packages/components/global-components/sh-image/index.vue +123 -0
  41. package/packages/components/global-components/sh-list/index.vue +141 -0
  42. package/packages/components/global-components/sh-loading/index.vue +49 -42
  43. package/packages/components/global-components/{sh-vxe-modal → sh-modal}/index.vue +209 -209
  44. package/packages/components/global-components/sh-noticebar/index.vue +201 -201
  45. package/packages/components/global-components/sh-poptip/index.vue +479 -0
  46. package/packages/components/global-components/sh-poptip/popper.js +115 -0
  47. package/packages/components/global-components/sh-progress/index.vue +290 -0
  48. package/packages/components/global-components/sh-pull-refresh/index.vue +290 -290
  49. package/packages/components/global-components/{sh-vxe-query → sh-query}/index.vue +317 -310
  50. package/packages/components/global-components/sh-result/index.vue +110 -88
  51. package/packages/components/global-components/sh-row/css/index.scss +21 -0
  52. package/packages/components/global-components/sh-row/index.vue +63 -0
  53. package/packages/components/global-components/sh-split/components/trigger.vue +33 -0
  54. package/packages/components/global-components/sh-split/index.vue +334 -142
  55. package/packages/components/global-components/sh-table/components/importModal.vue +351 -0
  56. package/packages/components/global-components/{sh-vxe-table → sh-table}/css/index.scss +4 -22
  57. package/packages/components/global-components/{sh-vxe-table → sh-table}/index.vue +329 -351
  58. package/packages/components/global-components/{sh-vxe-table → sh-table}/js/methods.js +33 -88
  59. package/packages/components/global-components/{sh-vxe-table → sh-table}/js/props.js +304 -313
  60. package/packages/components/global-components/{sh-vxe-table → sh-table}/mixin/defaultData.js +94 -116
  61. package/packages/components/global-components/sh-tabs/index.vue +315 -0
  62. package/packages/components/global-components/sh-tag/index.vue +163 -0
  63. package/packages/components/global-components/{sh-vxe-toolbar → sh-toolbar}/index.vue +177 -172
  64. package/packages/components/global-components/sh-tree/components/table-tree.vue +280 -0
  65. package/packages/components/global-components/sh-tree/css/index.scss +54 -0
  66. package/packages/components/global-components/sh-tree/index.vue +195 -0
  67. package/packages/components/global-components/sh-tree/mixin/treeProps.js +124 -0
  68. package/packages/components/global-components/sh-upload/index.vue +278 -275
  69. package/packages/components/global-components/sh-water-fall/index.vue +87 -87
  70. package/packages/components/index.js +85 -59
  71. package/packages/components/other-components/sh-cron-modal/css/index.scss +2 -2
  72. package/packages/components/other-components/sh-menu-card/index.vue +224 -224
  73. package/packages/css/index.js +4 -6
  74. package/packages/directive/index.js +19 -19
  75. package/packages/directive/module/click-out.js +14 -0
  76. package/packages/directive/module/draggable.js +42 -42
  77. package/packages/directive/module/line-clamp.js +22 -0
  78. package/packages/directive/module/prevent-click.js +18 -0
  79. package/packages/directive/module/resize.js +19 -0
  80. package/packages/directive/module/ripple.js +166 -0
  81. package/packages/index.js +39 -40
  82. package/packages/utils/transfer-queue.js +12 -0
  83. package/packages/vxeTable/css/index.scss +12 -98
  84. package/packages/vxeTable/css/variable.scss +7 -265
  85. package/packages/vxeTable/index.js +184 -183
  86. package/packages/vxeTable/plugins/export.js +450 -0
  87. package/packages/vxeTable/render/cell/vxe-render-checkgroup.vue +36 -36
  88. package/packages/vxeTable/render/cell/vxe-render-goption.vue +94 -93
  89. package/packages/vxeTable/render/cell/vxe-render-img.vue +21 -28
  90. package/packages/vxeTable/render/cell/vxe-render-input.vue +51 -51
  91. package/packages/vxeTable/render/cell/vxe-render-progress.vue +19 -19
  92. package/packages/vxeTable/render/cell/vxe-render-radiogroup.vue +36 -36
  93. package/packages/vxeTable/render/cell/vxe-render-select.vue +36 -36
  94. package/packages/vxeTable/render/cell/vxe-render-tree.vue +59 -59
  95. package/packages/vxeTable/render/globalRenders.jsx +498 -491
  96. package/packages/assets/icons/demo.css +0 -539
  97. package/packages/assets/icons/iconfont.css +0 -415
  98. package/packages/assets/icons/iconfont.js +0 -1
  99. package/packages/assets/icons/iconfont.json +0 -709
  100. package/packages/assets/icons/iconfont.ttf +0 -0
  101. package/packages/assets/icons/iconfont.woff +0 -0
  102. package/packages/assets/icons/iconfont.woff2 +0 -0
  103. package/packages/assets/img/image-error.png +0 -0
  104. package/packages/assets/img/square-image.png +0 -0
  105. package/packages/components/global-components/sh-iv-form/components/iv-group-item.vue +0 -57
  106. package/packages/components/global-components/sh-iv-form/components/iv-single-item.vue +0 -76
  107. package/packages/components/global-components/sh-iv-form/index.vue +0 -255
  108. package/packages/components/global-components/sh-vxe-list/index.vue +0 -149
  109. package/packages/components/global-components/sh-vxe-table/components/importModal.vue +0 -377
  110. package/packages/components/global-components/sh-vxe-tree/components/table-tree.vue +0 -233
  111. package/packages/components/global-components/sh-vxe-tree/css/index.scss +0 -20
  112. package/packages/components/global-components/sh-vxe-tree/index.vue +0 -85
  113. package/packages/components/global-components/sh-vxe-tree/js/props.js +0 -120
  114. package/packages/components/global-components/sh-vxe-tree/js/treeMethods.js +0 -169
  115. package/packages/components/global-components/sh-vxe-tree/mixin/defaultData.js +0 -54
  116. package/packages/components/global-components/sh-vxe-tree/vxe-direct-tree.vue +0 -203
  117. package/packages/components/global-components/sh-vxe-tree/vxe-select-tree.vue +0 -291
  118. package/packages/components/other-components/sh-markdown/tinymce/langs/ar.js +0 -7
  119. package/packages/components/other-components/sh-markdown/tinymce/langs/az.js +0 -7
  120. package/packages/components/other-components/sh-markdown/tinymce/langs/bg_BG.js +0 -7
  121. package/packages/components/other-components/sh-markdown/tinymce/langs/bn_BD.js +0 -7
  122. package/packages/components/other-components/sh-markdown/tinymce/langs/ca.js +0 -7
  123. package/packages/components/other-components/sh-markdown/tinymce/langs/cs.js +0 -7
  124. package/packages/components/other-components/sh-markdown/tinymce/langs/cy.js +0 -7
  125. package/packages/components/other-components/sh-markdown/tinymce/langs/da.js +0 -7
  126. package/packages/components/other-components/sh-markdown/tinymce/langs/de.js +0 -7
  127. package/packages/components/other-components/sh-markdown/tinymce/langs/dv.js +0 -7
  128. package/packages/components/other-components/sh-markdown/tinymce/langs/el.js +0 -7
  129. package/packages/components/other-components/sh-markdown/tinymce/langs/eo.js +0 -7
  130. package/packages/components/other-components/sh-markdown/tinymce/langs/es.js +0 -7
  131. package/packages/components/other-components/sh-markdown/tinymce/langs/es_MX.js +0 -7
  132. package/packages/components/other-components/sh-markdown/tinymce/langs/et.js +0 -7
  133. package/packages/components/other-components/sh-markdown/tinymce/langs/eu.js +0 -7
  134. package/packages/components/other-components/sh-markdown/tinymce/langs/fa.js +0 -7
  135. package/packages/components/other-components/sh-markdown/tinymce/langs/fi.js +0 -7
  136. package/packages/components/other-components/sh-markdown/tinymce/langs/fr_FR.js +0 -7
  137. package/packages/components/other-components/sh-markdown/tinymce/langs/ga.js +0 -7
  138. package/packages/components/other-components/sh-markdown/tinymce/langs/gl.js +0 -7
  139. package/packages/components/other-components/sh-markdown/tinymce/langs/he_IL.js +0 -7
  140. package/packages/components/other-components/sh-markdown/tinymce/langs/hi.js +0 -7
  141. package/packages/components/other-components/sh-markdown/tinymce/langs/hr.js +0 -7
  142. package/packages/components/other-components/sh-markdown/tinymce/langs/hu_HU.js +0 -7
  143. package/packages/components/other-components/sh-markdown/tinymce/langs/hy.js +0 -7
  144. package/packages/components/other-components/sh-markdown/tinymce/langs/id.js +0 -7
  145. package/packages/components/other-components/sh-markdown/tinymce/langs/is_IS.js +0 -7
  146. package/packages/components/other-components/sh-markdown/tinymce/langs/it.js +0 -7
  147. package/packages/components/other-components/sh-markdown/tinymce/langs/ja.js +0 -7
  148. package/packages/components/other-components/sh-markdown/tinymce/langs/kab.js +0 -7
  149. package/packages/components/other-components/sh-markdown/tinymce/langs/kk.js +0 -7
  150. package/packages/components/other-components/sh-markdown/tinymce/langs/ko_KR.js +0 -7
  151. package/packages/components/other-components/sh-markdown/tinymce/langs/ku.js +0 -7
  152. package/packages/components/other-components/sh-markdown/tinymce/langs/lt.js +0 -7
  153. package/packages/components/other-components/sh-markdown/tinymce/langs/lv.js +0 -7
  154. package/packages/components/other-components/sh-markdown/tinymce/langs/nb_NO.js +0 -7
  155. package/packages/components/other-components/sh-markdown/tinymce/langs/ne.js +0 -7
  156. package/packages/components/other-components/sh-markdown/tinymce/langs/nl.js +0 -7
  157. package/packages/components/other-components/sh-markdown/tinymce/langs/nl_BE.js +0 -7
  158. package/packages/components/other-components/sh-markdown/tinymce/langs/oc.js +0 -7
  159. package/packages/components/other-components/sh-markdown/tinymce/langs/pl.js +0 -7
  160. package/packages/components/other-components/sh-markdown/tinymce/langs/pt_BR.js +0 -7
  161. package/packages/components/other-components/sh-markdown/tinymce/langs/ro.js +0 -7
  162. package/packages/components/other-components/sh-markdown/tinymce/langs/ru.js +0 -7
  163. package/packages/components/other-components/sh-markdown/tinymce/langs/sk.js +0 -7
  164. package/packages/components/other-components/sh-markdown/tinymce/langs/sl_SI.js +0 -7
  165. package/packages/components/other-components/sh-markdown/tinymce/langs/sq.js +0 -7
  166. package/packages/components/other-components/sh-markdown/tinymce/langs/sr.js +0 -7
  167. package/packages/components/other-components/sh-markdown/tinymce/langs/sv_SE.js +0 -7
  168. package/packages/components/other-components/sh-markdown/tinymce/langs/ta.js +0 -7
  169. package/packages/components/other-components/sh-markdown/tinymce/langs/tg.js +0 -7
  170. package/packages/components/other-components/sh-markdown/tinymce/langs/th_TH.js +0 -7
  171. package/packages/components/other-components/sh-markdown/tinymce/langs/tr.js +0 -7
  172. package/packages/components/other-components/sh-markdown/tinymce/langs/ug.js +0 -7
  173. package/packages/components/other-components/sh-markdown/tinymce/langs/uk.js +0 -7
  174. package/packages/components/other-components/sh-markdown/tinymce/langs/vi.js +0 -7
  175. package/packages/components/other-components/sh-markdown/tinymce/skins/content/dark/content.css +0 -72
  176. package/packages/components/other-components/sh-markdown/tinymce/skins/content/dark/content.min.css +0 -7
  177. package/packages/components/other-components/sh-markdown/tinymce/skins/content/default/content.min.css +0 -7
  178. package/packages/components/other-components/sh-markdown/tinymce/skins/content/document/content.css +0 -72
  179. package/packages/components/other-components/sh-markdown/tinymce/skins/content/document/content.min.css +0 -7
  180. package/packages/components/other-components/sh-markdown/tinymce/skins/content/writer/content.css +0 -68
  181. package/packages/components/other-components/sh-markdown/tinymce/skins/content/writer/content.min.css +0 -7
  182. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.css +0 -714
  183. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.inline.css +0 -726
  184. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.inline.min.css +0 -7
  185. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.min.css +0 -7
  186. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.mobile.css +0 -29
  187. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/content.mobile.min.css +0 -7
  188. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff +0 -0
  189. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.css +0 -3047
  190. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.min.css +0 -7
  191. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.mobile.css +0 -673
  192. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.mobile.min.css +0 -7
  193. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.shadowdom.css +0 -37
  194. package/packages/components/other-components/sh-markdown/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css +0 -7
  195. package/packages/directive/directives.js +0 -27
  196. package/packages/iview/css/index.scss +0 -32
  197. package/packages/iview/index.js +0 -25
  198. /package/packages/components/global-components/{sh-vxe-form → sh-form}/components/form-item.vue +0 -0
  199. /package/packages/components/global-components/{sh-vxe-form → sh-form}/js/props.js +0 -0
  200. /package/packages/components/global-components/{sh-vxe-table → sh-table}/js/excel_to_json.js +0 -0
@@ -1,275 +1,278 @@
1
- <template>
2
- <div class="sh-upload" :class="{ list: !card }">
3
- <slot name="head"></slot>
4
- <div
5
- v-if="!disabled"
6
- v-show="fileList.length < limit"
7
- class="upload-component"
8
- :class="upClass"
9
- :style="upStyles"
10
- @click="handleClick"
11
- @drop.prevent="onDrop"
12
- @paste="handlePaste"
13
- @dragover.prevent="dragOver = true"
14
- @dragleave.prevent="dragOver = false">
15
- <input ref="input" type="file" class="sh-upload-input" :multiple="multiple" :webkitdirectory="webkitdirectory" :accept="accept" @change="handleChange" />
16
- <slot>
17
- <div class="upload-box" :class="{ drag, card }" :style="upStyles">
18
- <sh-icon v-if="icon" class="upload-box-icon" :type="icon"></sh-icon>
19
- <span class="upload-box-text">上传附件</span>
20
- </div>
21
- </slot>
22
- </div>
23
- <ul v-if="fileList.length" class="upload-list">
24
- <li v-for="(file, index) in fileList" :key="index" class="upload-list-item">
25
- <slot name="fileItem" v-bind="file">
26
- <div class="upload-list-title" :title="file.name">{{ file.name }}</div>
27
- <div v-if="file.status !== 'success'" class="upload-list-progress">
28
- <Progress v-if="file.showProgress" v-bind="progressConfig(file)"></Progress>
29
- </div>
30
- <div v-else class="upload-list-action">
31
- <template v-for="listAct in listActions" :key="listAct.code">
32
- <span class="action-item" @click="onActionClick(listAct, file)"><sh-icon :type="listAct.icon" :title="listAct.title" size="18" /></span>
33
- </template>
34
- </div>
35
- </slot>
36
- </li>
37
- </ul>
38
- <slot name="foot"></slot>
39
- </div>
40
- </template>
41
-
42
- <script>
43
- import mixin from './js/mixin'
44
- export default {
45
- name: 'ShUpload',
46
- mixins: [mixin],
47
- props: {
48
- baseUrl: {
49
- type: String,
50
- default: ''
51
- },
52
- width: {
53
- type: [String, Number],
54
- default: 80
55
- },
56
- height: {
57
- type: [String, Number],
58
- default: 80
59
- },
60
- limit: {
61
- type: Number,
62
- default: 1
63
- },
64
- card: {
65
- type: Boolean
66
- },
67
- drag: {
68
- type: Boolean
69
- },
70
- icon: {
71
- type: String,
72
- default: 'ios-folder'
73
- },
74
- params: {
75
- type: Object,
76
- default() {
77
- return {}
78
- }
79
- },
80
- actionList: {
81
- type: Array,
82
- default() {
83
- return ['detail', 'download', 'delete']
84
- }
85
- },
86
- resKey: {
87
- type: String,
88
- default: 'data'
89
- }
90
- },
91
- emits: ['update:modelValue', 'action'],
92
- data() {
93
- return {}
94
- },
95
- computed: {
96
- multiple() {
97
- return this.limit > 1
98
- },
99
- upStyles() {
100
- return this.card ? { width: `${this.width}px`, height: `${this.height}px` } : {}
101
- },
102
- upClass() {
103
- return {
104
- 'sh-upload-list': !this.card,
105
- 'sh-upload-select': !this.drag,
106
- 'sh-upload-drag': this.drag,
107
- 'sh-upload-dragOver': this.drag && this.dragOver
108
- }
109
- },
110
- fileFormat() {
111
- return this.format.length ? this.format : this.accept.split(',').map(_ => String(_).replace('.', ''))
112
- },
113
- listActions() {
114
- let list = [
115
- { title: '查看文件', icon: 'ios-eye-outline', code: 'detail' },
116
- { title: '下载文件', icon: 'ios-download', code: 'download' }
117
- ]
118
- if (!this.disabled) {
119
- list.push({ title: '删除文件', icon: 'ios-trash-outline', code: 'delete' })
120
- }
121
- return list.filter(item => this.actionList.includes(item.code))
122
- }
123
- },
124
- methods: {
125
- // 上传校验
126
- validateFile(file) {
127
- let { fileList, action, fileFormat, maxSize } = this
128
- // check format
129
- if (fileFormat.length) {
130
- const _file_format = file.name.split('.').pop().toLocaleLowerCase()
131
- const checked = fileFormat.some(item => item.toLocaleLowerCase() === _file_format)
132
- if (!checked) {
133
- let errorMsg = `格式不正确,请上传 ${fileFormat.join(' ')} 格式文件`
134
- this.onFormatError ? this.onFormatError(file, errorMsg, fileList) : this.msginfo(errorMsg)
135
- return
136
- }
137
- }
138
- // check maxSize
139
- if (maxSize && file.size > maxSize * 1024) {
140
- let errorMsg = `文件大小不能超过 ${maxSize / 1024} M`
141
- this.onExceededSize ? this.onExceededSize(file, errorMsg, fileList) : this.msginfo(errorMsg)
142
- return
143
- }
144
- if (!action) {
145
- this.msginfo('上传地址不能为空')
146
- return
147
- }
148
- return true
149
- },
150
- // 附件操作点击事件
151
- onActionClick(obj, file) {
152
- if (obj.code === 'delete') {
153
- this.handleRemove(file)
154
- } else if (obj.code === 'detail') {
155
- this.handlePreview(file)
156
- } else if (obj.code === 'download') {
157
- this.handleDownload(file)
158
- }
159
- this.$emit('action', obj)
160
- },
161
- // 获取双向绑定值
162
- getModelValue() {
163
- return this.fileList.map(item => {
164
- let url = this.$vUtils.get(item, `response.${this.resKey}`)
165
- return {
166
- name: item.name,
167
- url: url
168
- }
169
- })
170
- }
171
- }
172
- }
173
- </script>
174
-
175
- <style scoped lang="scss">
176
- .sh-upload {
177
- display: inline-block;
178
- vertical-align: top;
179
- &.list {
180
- display: block;
181
- width: 100%;
182
- }
183
- .upload-component {
184
- border: 1px solid var(--border-color);
185
- background-color: var(--body-background);
186
- border-radius: var(--border-radius);
187
- cursor: pointer;
188
- input[type='file'] {
189
- display: none;
190
- }
191
- .upload-box {
192
- display: inline-block;
193
- padding: 6px 10px;
194
- box-sizing: border-box;
195
- .upload-box-icon {
196
- margin-right: 5px;
197
- }
198
- &.card,
199
- &.drag {
200
- display: inline-flex;
201
- flex-direction: column;
202
- align-items: center;
203
- justify-content: center;
204
- .upload-box-icon {
205
- margin-bottom: 8px;
206
- }
207
- }
208
- &.drag {
209
- min-height: 100px;
210
- }
211
- }
212
- &:hover {
213
- border: 1px solid var(--theme-color);
214
- }
215
- &.sh-upload-select {
216
- display: inline-block;
217
- vertical-align: top;
218
- }
219
- &.sh-upload-drag {
220
- text-align: center;
221
- cursor: pointer;
222
- position: relative;
223
- overflow: hidden;
224
- &:hover {
225
- border: 1px dashed var(--theme-color);
226
- }
227
- }
228
- &.sh-upload-dragOver {
229
- border: 2px dashed var(--theme-color);
230
- }
231
- }
232
- .upload-list {
233
- display: block;
234
- .upload-list-item {
235
- display: flex;
236
- align-items: stretch;
237
- border: 1px solid var(--border-color);
238
- background-color: var(--body-background);
239
- position: relative;
240
- .upload-list-title {
241
- padding: 6px 10px;
242
- flex: 1;
243
- display: block;
244
- text-overflow: ellipsis;
245
- white-space: nowrap;
246
- overflow: hidden;
247
- }
248
- .upload-list-action {
249
- display: inline-flex;
250
- align-items: center;
251
- color: var(--theme-color);
252
- .action-item {
253
- display: inline-flex;
254
- align-items: center;
255
- padding: 0 5px;
256
- height: 100%;
257
- cursor: pointer;
258
- &:hover {
259
- background-color: var(--theme-active-color);
260
- }
261
- }
262
- }
263
- .upload-list-progress {
264
- position: absolute;
265
- left: 0;
266
- right: 0;
267
- top: 0;
268
- bottom: 0;
269
- display: flex;
270
- align-items: center;
271
- }
272
- }
273
- }
274
- }
275
- </style>
1
+ <template>
2
+ <div class="sh-upload" :class="{ list: !card }">
3
+ <slot name="head"></slot>
4
+ <div
5
+ v-if="!disabled"
6
+ v-show="fileList.length < limit"
7
+ class="upload-component"
8
+ :class="upClass"
9
+ :style="upStyles"
10
+ @click="handleClick"
11
+ @drop.prevent="onDrop"
12
+ @paste="handlePaste"
13
+ @dragover.prevent="dragOver = true"
14
+ @dragleave.prevent="dragOver = false">
15
+ <input ref="input" type="file" class="sh-upload-input" :multiple="multiple" :webkitdirectory="webkitdirectory" :accept="accept" @change="handleChange" />
16
+ <slot>
17
+ <div class="upload-box" :class="{ drag, card }" :style="upStyles">
18
+ <sh-icon v-if="icon" class="upload-box-icon" :type="icon" :size="iconSize"></sh-icon>
19
+ <span class="upload-box-text">上传附件</span>
20
+ </div>
21
+ </slot>
22
+ </div>
23
+ <ul v-if="fileList.length" class="upload-list">
24
+ <li v-for="(file, index) in fileList" :key="index" class="upload-list-item">
25
+ <slot name="fileItem" v-bind="file">
26
+ <div class="upload-list-title" :title="file.name">{{ file.name }}</div>
27
+ <div v-if="file.status !== 'success'" class="upload-list-progress">
28
+ <sh-progress v-if="file.showProgress" v-bind="progressConfig(file)"></sh-progress>
29
+ </div>
30
+ <div v-else class="upload-list-action">
31
+ <template v-for="listAct in listActions" :key="listAct.code">
32
+ <span class="action-item" @click="onActionClick(listAct, file)"><sh-icon :type="listAct.icon" :title="listAct.title" size="18" /></span>
33
+ </template>
34
+ </div>
35
+ </slot>
36
+ </li>
37
+ </ul>
38
+ <slot name="foot"></slot>
39
+ </div>
40
+ </template>
41
+
42
+ <script>
43
+ import mixin from './js/mixin'
44
+ export default {
45
+ name: 'ShUpload',
46
+ mixins: [mixin],
47
+ props: {
48
+ baseUrl: {
49
+ type: String,
50
+ default: ''
51
+ },
52
+ width: {
53
+ type: [String, Number],
54
+ default: 80
55
+ },
56
+ height: {
57
+ type: [String, Number],
58
+ default: 80
59
+ },
60
+ limit: {
61
+ type: Number,
62
+ default: 1
63
+ },
64
+ card: {
65
+ type: Boolean
66
+ },
67
+ drag: {
68
+ type: Boolean
69
+ },
70
+ icon: {
71
+ type: String,
72
+ default: 'ios-folder'
73
+ },
74
+ iconSize: {
75
+ type: [Number, String]
76
+ },
77
+ params: {
78
+ type: Object,
79
+ default() {
80
+ return {}
81
+ }
82
+ },
83
+ actionList: {
84
+ type: Array,
85
+ default() {
86
+ return ['detail', 'download', 'delete']
87
+ }
88
+ },
89
+ resKey: {
90
+ type: String,
91
+ default: 'data'
92
+ }
93
+ },
94
+ emits: ['update:modelValue', 'action'],
95
+ data() {
96
+ return {}
97
+ },
98
+ computed: {
99
+ multiple() {
100
+ return this.limit > 1
101
+ },
102
+ upStyles() {
103
+ return this.card ? { width: `${this.width}px`, height: `${this.height}px` } : {}
104
+ },
105
+ upClass() {
106
+ return {
107
+ 'sh-upload-list': !this.card,
108
+ 'sh-upload-select': !this.drag,
109
+ 'sh-upload-drag': this.drag,
110
+ 'sh-upload-dragOver': this.drag && this.dragOver
111
+ }
112
+ },
113
+ fileFormat() {
114
+ return this.format.length ? this.format : this.accept.split(',').map(_ => String(_).replace('.', ''))
115
+ },
116
+ listActions() {
117
+ let list = [
118
+ { title: '查看文件', icon: 'ios-eye-outline', code: 'detail' },
119
+ { title: '下载文件', icon: 'ios-download', code: 'download' }
120
+ ]
121
+ if (!this.disabled) {
122
+ list.push({ title: '删除文件', icon: 'ios-trash-outline', code: 'delete' })
123
+ }
124
+ return list.filter(item => this.actionList.includes(item.code))
125
+ }
126
+ },
127
+ methods: {
128
+ // 上传校验
129
+ validateFile(file) {
130
+ let { fileList, action, fileFormat, maxSize } = this
131
+ // check format
132
+ if (fileFormat.length) {
133
+ const _file_format = file.name.split('.').pop().toLocaleLowerCase()
134
+ const checked = fileFormat.some(item => item.toLocaleLowerCase() === _file_format)
135
+ if (!checked) {
136
+ let errorMsg = `格式不正确,请上传 ${fileFormat.join(' ')} 格式文件`
137
+ this.onFormatError ? this.onFormatError(file, errorMsg, fileList) : this.msginfo(errorMsg)
138
+ return
139
+ }
140
+ }
141
+ // check maxSize
142
+ if (maxSize && file.size > maxSize * 1024) {
143
+ let errorMsg = `文件大小不能超过 ${maxSize / 1024} M`
144
+ this.onExceededSize ? this.onExceededSize(file, errorMsg, fileList) : this.msginfo(errorMsg)
145
+ return
146
+ }
147
+ if (!action) {
148
+ this.msginfo('上传地址不能为空')
149
+ return
150
+ }
151
+ return true
152
+ },
153
+ // 附件操作点击事件
154
+ onActionClick(obj, file) {
155
+ if (obj.code === 'delete') {
156
+ this.handleRemove(file)
157
+ } else if (obj.code === 'detail') {
158
+ this.handlePreview(file)
159
+ } else if (obj.code === 'download') {
160
+ this.handleDownload(file)
161
+ }
162
+ this.$emit('action', obj)
163
+ },
164
+ // 获取双向绑定值
165
+ getModelValue() {
166
+ return this.fileList.map(item => {
167
+ let url = this.$vUtils.get(item, `response.${this.resKey}`)
168
+ return {
169
+ name: item.name,
170
+ url: url
171
+ }
172
+ })
173
+ }
174
+ }
175
+ }
176
+ </script>
177
+
178
+ <style scoped lang="scss">
179
+ .sh-upload {
180
+ display: inline-block;
181
+ vertical-align: top;
182
+ &.list {
183
+ display: block;
184
+ width: 100%;
185
+ }
186
+ .upload-component {
187
+ border: 1px solid var(--vxe-table-border-color);
188
+ background-color: var(--vxe-table-body-background-color);
189
+ border-radius: var(--vxe-border-radius);
190
+ cursor: pointer;
191
+ input[type='file'] {
192
+ display: none;
193
+ }
194
+ .upload-box {
195
+ display: inline-block;
196
+ padding: 6px 10px;
197
+ box-sizing: border-box;
198
+ .upload-box-icon {
199
+ margin-right: 5px;
200
+ }
201
+ &.card,
202
+ &.drag {
203
+ display: inline-flex;
204
+ flex-direction: column;
205
+ align-items: center;
206
+ justify-content: center;
207
+ .upload-box-icon {
208
+ margin-bottom: 8px;
209
+ }
210
+ }
211
+ &.drag {
212
+ min-height: 100px;
213
+ }
214
+ }
215
+ &:hover {
216
+ border: 1px solid var(--vxe-primary-color);
217
+ }
218
+ &.sh-upload-select {
219
+ display: inline-block;
220
+ vertical-align: top;
221
+ }
222
+ &.sh-upload-drag {
223
+ text-align: center;
224
+ cursor: pointer;
225
+ position: relative;
226
+ overflow: hidden;
227
+ &:hover {
228
+ border: 1px dashed var(--vxe-primary-color);
229
+ }
230
+ }
231
+ &.sh-upload-dragOver {
232
+ border: 2px dashed var(--vxe-primary-color);
233
+ }
234
+ }
235
+ .upload-list {
236
+ display: block;
237
+ .upload-list-item {
238
+ display: flex;
239
+ align-items: stretch;
240
+ border: 1px solid var(--vxe-table-border-color);
241
+ background-color: var(--vxe-table-body-background-color);
242
+ position: relative;
243
+ .upload-list-title {
244
+ padding: 6px 10px;
245
+ flex: 1;
246
+ display: block;
247
+ text-overflow: ellipsis;
248
+ white-space: nowrap;
249
+ overflow: hidden;
250
+ }
251
+ .upload-list-action {
252
+ display: inline-flex;
253
+ align-items: center;
254
+ color: var(--vxe-primary-color);
255
+ .action-item {
256
+ display: inline-flex;
257
+ align-items: center;
258
+ padding: 0 5px;
259
+ height: 100%;
260
+ cursor: pointer;
261
+ &:hover {
262
+ background-color: var(--vxe-primary-darken-color);
263
+ }
264
+ }
265
+ }
266
+ .upload-list-progress {
267
+ position: absolute;
268
+ left: 0;
269
+ right: 0;
270
+ top: 0;
271
+ bottom: 0;
272
+ display: flex;
273
+ align-items: center;
274
+ }
275
+ }
276
+ }
277
+ }
278
+ </style>