vxe-pc-ui 4.6.45 → 4.6.47

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 (171) hide show
  1. package/es/icon/style.css +1 -1
  2. package/es/index.esm.js +6 -0
  3. package/es/input/src/input.js +4 -2
  4. package/es/language/ar-EG.js +1 -0
  5. package/es/language/de-DE.js +1 -0
  6. package/es/language/en-US.js +1 -0
  7. package/es/language/es-ES.js +1 -0
  8. package/es/language/fr-FR.js +1 -0
  9. package/es/language/hu-HU.js +1 -0
  10. package/es/language/hy-AM.js +1 -0
  11. package/es/language/id-ID.js +1 -0
  12. package/es/language/it-IT.js +1 -0
  13. package/es/language/ja-JP.js +1 -0
  14. package/es/language/ko-KR.js +1 -0
  15. package/es/language/ms-MY.js +1 -0
  16. package/es/language/nb-NO.js +1 -0
  17. package/es/language/pt-BR.js +1 -0
  18. package/es/language/ru-RU.js +1 -0
  19. package/es/language/th-TH.js +1 -0
  20. package/es/language/ug-CN.js +1 -0
  21. package/es/language/uk-UA.js +1 -0
  22. package/es/language/uz-UZ.js +1 -0
  23. package/es/language/vi-VN.js +1 -0
  24. package/es/language/zh-CHT.js +1 -0
  25. package/es/language/zh-CN.js +1 -0
  26. package/es/select/src/select.js +14 -3
  27. package/es/style.css +1 -1
  28. package/es/style.min.css +1 -1
  29. package/es/ui/index.js +5 -2
  30. package/es/ui/src/log.js +1 -1
  31. package/es/upload/src/upload.js +103 -44
  32. package/es/upload/style.css +45 -10
  33. package/es/upload/style.min.css +1 -1
  34. package/es/vxe-upload/style.css +45 -10
  35. package/es/vxe-upload/style.min.css +1 -1
  36. package/lib/icon/style/style.css +1 -1
  37. package/lib/icon/style/style.min.css +1 -1
  38. package/lib/index.common.js +6 -0
  39. package/lib/index.umd.js +123 -37
  40. package/lib/index.umd.min.js +1 -1
  41. package/lib/input/src/input.js +4 -1
  42. package/lib/input/src/input.min.js +1 -1
  43. package/lib/language/ar-EG.js +1 -0
  44. package/lib/language/ar-EG.min.js +1 -1
  45. package/lib/language/ar-EG.umd.js +1 -0
  46. package/lib/language/de-DE.js +1 -0
  47. package/lib/language/de-DE.min.js +1 -1
  48. package/lib/language/de-DE.umd.js +1 -0
  49. package/lib/language/en-US.js +1 -0
  50. package/lib/language/en-US.min.js +1 -1
  51. package/lib/language/en-US.umd.js +1 -0
  52. package/lib/language/es-ES.js +1 -0
  53. package/lib/language/es-ES.min.js +1 -1
  54. package/lib/language/es-ES.umd.js +1 -0
  55. package/lib/language/fr-FR.js +1 -0
  56. package/lib/language/fr-FR.min.js +1 -1
  57. package/lib/language/fr-FR.umd.js +1 -0
  58. package/lib/language/hu-HU.js +1 -0
  59. package/lib/language/hu-HU.min.js +1 -1
  60. package/lib/language/hu-HU.umd.js +1 -0
  61. package/lib/language/hy-AM.js +1 -0
  62. package/lib/language/hy-AM.min.js +1 -1
  63. package/lib/language/hy-AM.umd.js +1 -0
  64. package/lib/language/id-ID.js +1 -0
  65. package/lib/language/id-ID.min.js +1 -1
  66. package/lib/language/id-ID.umd.js +1 -0
  67. package/lib/language/it-IT.js +1 -0
  68. package/lib/language/it-IT.min.js +1 -1
  69. package/lib/language/it-IT.umd.js +1 -0
  70. package/lib/language/ja-JP.js +1 -0
  71. package/lib/language/ja-JP.min.js +1 -1
  72. package/lib/language/ja-JP.umd.js +1 -0
  73. package/lib/language/ko-KR.js +1 -0
  74. package/lib/language/ko-KR.min.js +1 -1
  75. package/lib/language/ko-KR.umd.js +1 -0
  76. package/lib/language/ms-MY.js +1 -0
  77. package/lib/language/ms-MY.min.js +1 -1
  78. package/lib/language/ms-MY.umd.js +1 -0
  79. package/lib/language/nb-NO.js +1 -0
  80. package/lib/language/nb-NO.min.js +1 -1
  81. package/lib/language/nb-NO.umd.js +1 -0
  82. package/lib/language/pt-BR.js +1 -0
  83. package/lib/language/pt-BR.min.js +1 -1
  84. package/lib/language/pt-BR.umd.js +1 -0
  85. package/lib/language/ru-RU.js +1 -0
  86. package/lib/language/ru-RU.min.js +1 -1
  87. package/lib/language/ru-RU.umd.js +1 -0
  88. package/lib/language/th-TH.js +1 -0
  89. package/lib/language/th-TH.min.js +1 -1
  90. package/lib/language/th-TH.umd.js +1 -0
  91. package/lib/language/ug-CN.js +1 -0
  92. package/lib/language/ug-CN.min.js +1 -1
  93. package/lib/language/ug-CN.umd.js +1 -0
  94. package/lib/language/uk-UA.js +1 -0
  95. package/lib/language/uk-UA.min.js +1 -1
  96. package/lib/language/uk-UA.umd.js +1 -0
  97. package/lib/language/uz-UZ.js +1 -0
  98. package/lib/language/uz-UZ.min.js +1 -1
  99. package/lib/language/uz-UZ.umd.js +1 -0
  100. package/lib/language/vi-VN.js +1 -0
  101. package/lib/language/vi-VN.min.js +1 -1
  102. package/lib/language/vi-VN.umd.js +1 -0
  103. package/lib/language/zh-CHT.js +1 -0
  104. package/lib/language/zh-CHT.min.js +1 -1
  105. package/lib/language/zh-CHT.umd.js +1 -0
  106. package/lib/language/zh-CN.js +1 -0
  107. package/lib/language/zh-CN.min.js +1 -1
  108. package/lib/language/zh-CN.umd.js +1 -0
  109. package/lib/select/src/select.js +12 -3
  110. package/lib/select/src/select.min.js +1 -1
  111. package/lib/style.css +1 -1
  112. package/lib/style.min.css +1 -1
  113. package/lib/ui/index.js +5 -2
  114. package/lib/ui/index.min.js +1 -1
  115. package/lib/ui/src/log.js +1 -1
  116. package/lib/ui/src/log.min.js +1 -1
  117. package/lib/upload/src/upload.js +100 -30
  118. package/lib/upload/src/upload.min.js +1 -1
  119. package/lib/upload/style/style.css +45 -10
  120. package/lib/upload/style/style.min.css +1 -1
  121. package/lib/vxe-upload/style/style.css +45 -10
  122. package/lib/vxe-upload/style/style.min.css +1 -1
  123. package/package.json +1 -1
  124. package/packages/index.ts +21 -0
  125. package/packages/input/src/input.ts +4 -2
  126. package/packages/language/ar-EG.ts +1 -0
  127. package/packages/language/de-DE.ts +1 -0
  128. package/packages/language/en-US.ts +1 -0
  129. package/packages/language/es-ES.ts +1 -0
  130. package/packages/language/fr-FR.ts +1 -0
  131. package/packages/language/hu-HU.ts +1 -0
  132. package/packages/language/hy-AM.ts +1 -0
  133. package/packages/language/id-ID.ts +1 -0
  134. package/packages/language/it-IT.ts +1 -0
  135. package/packages/language/ja-JP.ts +1 -0
  136. package/packages/language/ko-KR.ts +1 -0
  137. package/packages/language/ms-MY.ts +1 -0
  138. package/packages/language/nb-NO.ts +1 -0
  139. package/packages/language/pt-BR.ts +1 -0
  140. package/packages/language/ru-RU.ts +1 -0
  141. package/packages/language/th-TH.ts +1 -0
  142. package/packages/language/ug-CN.ts +1 -0
  143. package/packages/language/uk-UA.ts +1 -0
  144. package/packages/language/uz-UZ.ts +1 -0
  145. package/packages/language/vi-VN.ts +1 -0
  146. package/packages/language/zh-CHT.ts +1 -0
  147. package/packages/language/zh-CN.ts +1 -0
  148. package/packages/select/src/select.ts +13 -3
  149. package/packages/ui/index.ts +4 -1
  150. package/packages/upload/src/upload.ts +106 -46
  151. package/styles/components/upload.scss +74 -25
  152. package/types/components/column.d.ts +6 -6
  153. package/types/components/input.d.ts +2 -0
  154. package/types/components/table-plugins/filters-combination.d.ts +15 -0
  155. package/types/components/table-plugins/filters-complex-input.d.ts +9 -0
  156. package/types/components/table-plugins/index.d.ts +2 -0
  157. package/types/components/upload.d.ts +14 -1
  158. package/types/ui/global-icon.d.ts +1 -0
  159. package/types/ui/renderer.d.ts +3 -0
  160. /package/es/icon/{iconfont.1751536878019.ttf → iconfont.1751618343421.ttf} +0 -0
  161. /package/es/icon/{iconfont.1751536878019.woff → iconfont.1751618343421.woff} +0 -0
  162. /package/es/icon/{iconfont.1751536878019.woff2 → iconfont.1751618343421.woff2} +0 -0
  163. /package/es/{iconfont.1751536878019.ttf → iconfont.1751618343421.ttf} +0 -0
  164. /package/es/{iconfont.1751536878019.woff → iconfont.1751618343421.woff} +0 -0
  165. /package/es/{iconfont.1751536878019.woff2 → iconfont.1751618343421.woff2} +0 -0
  166. /package/lib/icon/style/{iconfont.1751536878019.ttf → iconfont.1751618343421.ttf} +0 -0
  167. /package/lib/icon/style/{iconfont.1751536878019.woff → iconfont.1751618343421.woff} +0 -0
  168. /package/lib/icon/style/{iconfont.1751536878019.woff2 → iconfont.1751618343421.woff2} +0 -0
  169. /package/lib/{iconfont.1751536878019.ttf → iconfont.1751618343421.ttf} +0 -0
  170. /package/lib/{iconfont.1751536878019.woff → iconfont.1751618343421.woff} +0 -0
  171. /package/lib/{iconfont.1751536878019.woff2 → iconfont.1751618343421.woff2} +0 -0
@@ -1128,7 +1128,17 @@ export default defineVxeComponent({
1128
1128
  const isDisabled = !isAdd && checkOptionDisabled(isSelected, option, group)
1129
1129
  const defaultSlot = slots ? slots.default : null
1130
1130
  const optParams = { option, group: null, $select: $xeSelect }
1131
- const optVNs = optionSlot ? callSlot(optionSlot, optParams) : (defaultSlot ? callSlot(defaultSlot, optParams) : getFuncText(option[(isOptGroup ? groupLabelField : labelField) as 'label']))
1131
+ let optLabel = ''
1132
+ let optVNs: string | VxeComponentSlotType[] = []
1133
+ if (optionSlot) {
1134
+ optVNs = callSlot(optionSlot, optParams)
1135
+ } else if (defaultSlot) {
1136
+ optVNs = callSlot(defaultSlot, optParams)
1137
+ } else {
1138
+ optLabel = getFuncText(option[(isOptGroup ? groupLabelField : labelField) as 'label'])
1139
+ optVNs = optLabel
1140
+ }
1141
+
1132
1142
  return isVisible
1133
1143
  ? h('div', {
1134
1144
  key: useKey || optionKey ? optid : cIndex,
@@ -1139,9 +1149,8 @@ export default defineVxeComponent({
1139
1149
  'is--add': isAdd,
1140
1150
  'is--hover': currentOption && getOptId(currentOption) === optid
1141
1151
  }],
1142
- // attrs
1143
1152
  optid: optid,
1144
- // event
1153
+ title: optLabel || null,
1145
1154
  onMousedown: (evnt: MouseEvent) => {
1146
1155
  const isLeftBtn = evnt.button === 0
1147
1156
  if (isLeftBtn) {
@@ -1258,6 +1267,7 @@ export default defineVxeComponent({
1258
1267
  prefixIcon: props.prefixIcon,
1259
1268
  suffixIcon: loading ? getIcon().SELECT_LOADED : (visiblePanel ? getIcon().SELECT_OPEN : getIcon().SELECT_CLOSE),
1260
1269
  autoFocus: false,
1270
+ title: selectLabel,
1261
1271
  modelValue: selectLabel,
1262
1272
  onClear: clearEvent,
1263
1273
  onClick: clickEvent,
@@ -381,7 +381,9 @@ setConfig({
381
381
  dragToUpload: true,
382
382
  // imageConfig: {},
383
383
  showLimitSize: true,
384
- showLimitCount: true
384
+ showLimitCount: true,
385
+ autoSubmit: true,
386
+ maxSimultaneousUploads: 5
385
387
  },
386
388
  watermark: {
387
389
  rotate: -30,
@@ -504,6 +506,7 @@ setIcon({
504
506
  UPLOAD_FILE_ADD: iconPrefix + 'upload',
505
507
  UPLOAD_FILE_REMOVE: iconPrefix + 'delete',
506
508
  UPLOAD_FILE_DOWNLOAD: iconPrefix + 'download',
509
+ UPLOAD_IMAGE_UPLOAD: iconPrefix + 'upload',
507
510
  UPLOAD_IMAGE_RE_UPLOAD: iconPrefix + 'repeat',
508
511
  UPLOAD_IMAGE_ADD: iconPrefix + 'add',
509
512
  UPLOAD_IMAGE_REMOVE: iconPrefix + 'close',
@@ -28,6 +28,10 @@ export default defineVxeComponent({
28
28
  type: Boolean as PropType<VxeUploadPropTypes.Disabled>,
29
29
  default: null
30
30
  },
31
+ autoSubmit: {
32
+ type: Boolean as PropType<VxeUploadPropTypes.AutoSubmit>,
33
+ default: () => getConfig().upload.autoSubmit
34
+ },
31
35
  mode: {
32
36
  type: String as PropType<VxeUploadPropTypes.Mode>,
33
37
  default: () => getConfig().upload.mode
@@ -117,6 +121,7 @@ export default defineVxeComponent({
117
121
  type: [String, Number, Function] as PropType<VxeUploadPropTypes.ProgressText>,
118
122
  default: () => getConfig().upload.progressText
119
123
  },
124
+ showSubmitButton: Boolean as PropType<VxeUploadPropTypes.ShowSubmitButton>,
120
125
  autoHiddenButton: {
121
126
  type: Boolean as PropType<VxeUploadPropTypes.AutoHiddenButton>,
122
127
  default: () => getConfig().upload.autoHiddenButton
@@ -157,6 +162,10 @@ export default defineVxeComponent({
157
162
  type: Boolean as PropType<VxeUploadPropTypes.ShowTip>,
158
163
  default: () => null
159
164
  },
165
+ maxSimultaneousUploads: {
166
+ type: Number as PropType<VxeUploadPropTypes.MaxSimultaneousUploads>,
167
+ default: () => getConfig().upload.maxSimultaneousUploads
168
+ },
160
169
  tipText: [String, Number, Function] as PropType<VxeUploadPropTypes.TipText>,
161
170
  hintText: String as PropType<VxeUploadPropTypes.HintText>,
162
171
  previewMethod: Function as PropType<VxeUploadPropTypes.PreviewMethod>,
@@ -570,6 +579,7 @@ export default defineVxeComponent({
570
579
  const cacheItem = fileCacheMaps[fileKey]
571
580
  if (cacheItem) {
572
581
  cacheItem.percent = 100
582
+ cacheItem.status = 'success'
573
583
  }
574
584
  Object.assign(item, res)
575
585
  dispatchEvent('upload-success', { option: item, data: res }, null)
@@ -611,7 +621,7 @@ export default defineVxeComponent({
611
621
  if (uploadFn && cacheItem) {
612
622
  const file = cacheItem.file
613
623
  cacheItem.loading = true
614
- cacheItem.status = ''
624
+ cacheItem.status = 'pending'
615
625
  cacheItem.percent = 0
616
626
  handleUploadResult(item, file).then(() => {
617
627
  if (urlMode) {
@@ -620,8 +630,8 @@ export default defineVxeComponent({
620
630
  })
621
631
  }
622
632
  }
623
- const uploadFile = (files: File[], evnt: Event | null) => {
624
- const { multiple, urlMode, showLimitSize, limitSizeText, showLimitCount, limitCountText } = props
633
+ const handleUploadFile = (files: File[], evnt: Event | null) => {
634
+ const { multiple, urlMode, showLimitSize, limitSizeText, showLimitCount, limitCountText, autoSubmit } = props
625
635
  const { fileList } = reactData
626
636
  const uploadFn = props.uploadMethod || getConfig().upload.uploadMethod
627
637
  const keyField = computeKeyField.value
@@ -716,13 +726,13 @@ export default defineVxeComponent({
716
726
  if (uploadFn) {
717
727
  cacheMaps[fileKey] = {
718
728
  file: file,
719
- loading: true,
720
- status: '',
729
+ loading: !!autoSubmit,
730
+ status: 'pending',
721
731
  percent: 0
722
732
  }
723
733
  }
724
734
  const item = reactive(fileObj)
725
- if (uploadFn) {
735
+ if (uploadFn && autoSubmit) {
726
736
  uploadPromiseRests.push(
727
737
  handleUploadResult(item, file)
728
738
  )
@@ -756,7 +766,7 @@ export default defineVxeComponent({
756
766
  multiple,
757
767
  types: isImage ? imageTypes : fileTypes
758
768
  }).then((params) => {
759
- uploadFile(params.files, evnt)
769
+ handleUploadFile(params.files, evnt)
760
770
  return params
761
771
  })
762
772
  }
@@ -908,7 +918,7 @@ export default defineVxeComponent({
908
918
  }
909
919
  return
910
920
  }
911
- uploadFile(files, evnt)
921
+ handleUploadFile(files, evnt)
912
922
  }
913
923
 
914
924
  const handleUploadDropEvent = (evnt: DragEvent) => {
@@ -1183,6 +1193,43 @@ export default defineVxeComponent({
1183
1193
  dispatchEvent,
1184
1194
  choose () {
1185
1195
  return handleChoose(null)
1196
+ },
1197
+ submit (isFull) {
1198
+ const { maxSimultaneousUploads } = props
1199
+ const msNum = XEUtils.toNumber(maxSimultaneousUploads || 1) || 1
1200
+ const { fileList, fileCacheMaps } = reactData
1201
+ const allPendingList = fileList.filter(item => {
1202
+ const fileKey = getFieldKey(item)
1203
+ const cacheItem = fileCacheMaps[fileKey]
1204
+ return cacheItem && (cacheItem.status === 'pending' || (isFull && cacheItem.status === 'error'))
1205
+ })
1206
+
1207
+ const handleSubmit = (item: VxeUploadDefines.FileObjItem): Promise<void> => {
1208
+ const fileKey = getFieldKey(item)
1209
+ const cacheItem = fileCacheMaps[fileKey]
1210
+ if (cacheItem) {
1211
+ const file = cacheItem.file
1212
+ if (file && (cacheItem.status === 'pending' || (isFull && cacheItem.status === 'error'))) {
1213
+ cacheItem.loading = true
1214
+ cacheItem.percent = 0
1215
+ return handleUploadResult(item, file).then(handleNextSubmit)
1216
+ }
1217
+ }
1218
+ return handleNextSubmit()
1219
+ }
1220
+
1221
+ const handleNextSubmit = (): Promise<void> => {
1222
+ if (allPendingList.length) {
1223
+ const item = allPendingList[0]
1224
+ allPendingList.splice(0, 1)
1225
+ return handleSubmit(item).then(handleNextSubmit)
1226
+ }
1227
+ return Promise.resolve()
1228
+ }
1229
+
1230
+ return Promise.all(allPendingList.splice(0, msNum).map(handleSubmit)).then(() => {
1231
+ // 完成
1232
+ })
1186
1233
  }
1187
1234
  }
1188
1235
 
@@ -1192,7 +1239,7 @@ export default defineVxeComponent({
1192
1239
  Object.assign($xeUpload, uploadMethods, uploadPrivateMethods)
1193
1240
 
1194
1241
  const renderFileItemList = (currList: VxeUploadDefines.FileObjItem[], isMoreView: boolean) => {
1195
- const { showRemoveButton, showDownloadButton, showProgress, progressText, showPreview, showErrorStatus, dragSort } = props
1242
+ const { showRemoveButton, showDownloadButton, showProgress, progressText, showPreview, showErrorStatus, dragSort, autoSubmit, showSubmitButton } = props
1196
1243
  const { fileCacheMaps } = reactData
1197
1244
  const isDisabled = computeIsDisabled.value
1198
1245
  const formReadonly = computeFormReadonly.value
@@ -1210,13 +1257,21 @@ export default defineVxeComponent({
1210
1257
  return currList.map((item, index) => {
1211
1258
  const fileKey = getFieldKey(item)
1212
1259
  const cacheItem = fileCacheMaps[fileKey]
1213
- const isLoading = cacheItem && cacheItem.loading
1214
- const isError = cacheItem && cacheItem.status === 'error'
1260
+ let isLoading = false
1261
+ let isError = false
1262
+ let isPending = false
1263
+ const fileName = `${item[nameProp] || ''}`
1264
+ if (cacheItem) {
1265
+ isLoading = cacheItem.loading
1266
+ isError = cacheItem.status === 'error'
1267
+ isPending = cacheItem.status === 'pending'
1268
+ }
1215
1269
  return h('div', {
1216
1270
  key: dragSort ? fileKey : index,
1217
1271
  class: ['vxe-upload--file-item', {
1218
1272
  'is--preview': showPreview,
1219
1273
  'is--loading': isLoading,
1274
+ 'is--pending': isPending,
1220
1275
  'is--error': isError
1221
1276
  }],
1222
1277
  fileid: fileKey,
@@ -1232,12 +1287,13 @@ export default defineVxeComponent({
1232
1287
  ]),
1233
1288
  h('div', {
1234
1289
  class: 'vxe-upload--file-item-name',
1290
+ title: fileName,
1235
1291
  onClick (evnt) {
1236
1292
  if (!isLoading && !isError) {
1237
1293
  handlePreviewFileEvent(evnt, item)
1238
1294
  }
1239
1295
  }
1240
- }, `${item[nameProp] || ''}`),
1296
+ }, fileName),
1241
1297
  isLoading
1242
1298
  ? h('div', {
1243
1299
  class: 'vxe-upload--file-item-loading-icon'
@@ -1252,15 +1308,15 @@ export default defineVxeComponent({
1252
1308
  class: 'vxe-upload--file-item-loading-text'
1253
1309
  }, progressText ? XEUtils.toFormatString(`${XEUtils.isFunction(progressText) ? progressText({}) : progressText}`, { percent: cacheItem.percent }) : getI18n('vxe.upload.uploadProgress', [cacheItem.percent]))
1254
1310
  : renderEmptyElement($xeUpload),
1255
- showErrorStatus && isError
1311
+ !isLoading && ((isError && showErrorStatus) || (isPending && showSubmitButton && !autoSubmit))
1256
1312
  ? h('div', {
1257
- class: 'vxe-upload--image-item-error'
1313
+ class: 'vxe-upload--file-item-rebtn'
1258
1314
  }, [
1259
1315
  h(VxeButtonComponent, {
1260
- icon: getIcon().UPLOAD_IMAGE_RE_UPLOAD,
1316
+ icon: isError ? getIcon().UPLOAD_IMAGE_RE_UPLOAD : getIcon().UPLOAD_IMAGE_UPLOAD,
1261
1317
  mode: 'text',
1262
1318
  status: 'primary',
1263
- content: getI18n('vxe.upload.reUpload'),
1319
+ content: isError ? getI18n('vxe.upload.reUpload') : getI18n('vxe.upload.manualUpload'),
1264
1320
  onClick () {
1265
1321
  handleReUpload(item)
1266
1322
  }
@@ -1275,7 +1331,7 @@ export default defineVxeComponent({
1275
1331
  class: 'vxe-upload--file-item-corner'
1276
1332
  }, getSlotVNs(cornerSlot({ option: item, isMoreView, readonly: formReadonly })))
1277
1333
  : renderEmptyElement($xeUpload),
1278
- showDownloadButton && !isLoading
1334
+ showDownloadButton && !(isLoading || isPending)
1279
1335
  ? h('div', {
1280
1336
  class: 'vxe-upload--file-item-download-btn',
1281
1337
  onClick (evnt: MouseEvent) {
@@ -1411,7 +1467,7 @@ export default defineVxeComponent({
1411
1467
  }
1412
1468
 
1413
1469
  const renderImageItemList = (currList: VxeUploadDefines.FileObjItem[], isMoreView: boolean) => {
1414
- const { showRemoveButton, showProgress, progressText, showPreview, showErrorStatus, dragSort } = props
1470
+ const { showRemoveButton, showProgress, progressText, showPreview, showErrorStatus, dragSort, autoSubmit, showSubmitButton } = props
1415
1471
  const { fileCacheMaps } = reactData
1416
1472
  const isDisabled = computeIsDisabled.value
1417
1473
  const formReadonly = computeFormReadonly.value
@@ -1431,14 +1487,21 @@ export default defineVxeComponent({
1431
1487
  return currList.map((item, index) => {
1432
1488
  const fileKey = getFieldKey(item)
1433
1489
  const cacheItem = fileCacheMaps[fileKey]
1434
- const isLoading = cacheItem && cacheItem.loading
1435
- const isError = cacheItem && cacheItem.status === 'error'
1490
+ let isLoading = false
1491
+ let isError = false
1492
+ let isPending = false
1493
+ if (cacheItem) {
1494
+ isLoading = cacheItem.loading
1495
+ isError = cacheItem.status === 'error'
1496
+ isPending = cacheItem.status === 'pending'
1497
+ }
1436
1498
  return h('div', {
1437
1499
  key: dragSort ? fileKey : index,
1438
1500
  class: ['vxe-upload--image-item', {
1439
1501
  'is--preview': showPreview,
1440
1502
  'is--circle': imageOpts.circle,
1441
1503
  'is--loading': isLoading,
1504
+ 'is--pending': isPending,
1442
1505
  'is--error': isError
1443
1506
  }],
1444
1507
  fileid: fileKey,
@@ -1448,7 +1511,6 @@ export default defineVxeComponent({
1448
1511
  h('div', {
1449
1512
  class: 'vxe-upload--image-item-box',
1450
1513
  style: isMoreView ? null : imgStyle,
1451
- title: getI18n('vxe.upload.viewItemTitle'),
1452
1514
  onClick (evnt) {
1453
1515
  if (!isLoading && !isError) {
1454
1516
  handlePreviewImageEvent(evnt, item, index)
@@ -1473,31 +1535,29 @@ export default defineVxeComponent({
1473
1535
  : renderEmptyElement($xeUpload)
1474
1536
  ])
1475
1537
  : renderEmptyElement($xeUpload),
1476
- !isLoading
1477
- ? (
1478
- isError && showErrorStatus
1479
- ? h('div', {
1480
- class: 'vxe-upload--image-item-error'
1481
- }, [
1482
- h(VxeButtonComponent, {
1483
- icon: getIcon().UPLOAD_IMAGE_RE_UPLOAD,
1484
- mode: 'text',
1485
- status: 'primary',
1486
- content: getI18n('vxe.upload.reUpload'),
1487
- onClick () {
1488
- handleReUpload(item)
1489
- }
1490
- })
1491
- ])
1492
- : h('div', {
1493
- class: 'vxe-upload--image-item-img-wrapper'
1494
- }, [
1495
- h('img', {
1496
- class: 'vxe-upload--image-item-img',
1497
- src: getThumbnailFileUrl(item)
1498
- })
1499
- ])
1500
- )
1538
+ h('div', {
1539
+ class: 'vxe-upload--image-item-img-wrapper',
1540
+ title: getI18n('vxe.upload.viewItemTitle')
1541
+ }, [
1542
+ h('img', {
1543
+ class: 'vxe-upload--image-item-img',
1544
+ src: getThumbnailFileUrl(item)
1545
+ })
1546
+ ]),
1547
+ !isLoading && ((isError && showErrorStatus) || (isPending && showSubmitButton && !autoSubmit))
1548
+ ? h('div', {
1549
+ class: 'vxe-upload--image-item-rebtn'
1550
+ }, [
1551
+ h(VxeButtonComponent, {
1552
+ icon: isError ? getIcon().UPLOAD_IMAGE_RE_UPLOAD : getIcon().UPLOAD_IMAGE_UPLOAD,
1553
+ mode: 'text',
1554
+ status: 'primary',
1555
+ content: isError ? getI18n('vxe.upload.reUpload') : getI18n('vxe.upload.manualUpload'),
1556
+ onClick () {
1557
+ handleReUpload(item)
1558
+ }
1559
+ })
1560
+ ])
1501
1561
  : renderEmptyElement($xeUpload),
1502
1562
  h('div', {
1503
1563
  class: 'vxe-upload--image-item-btn-wrapper',
@@ -86,24 +86,30 @@
86
86
  padding: var(--vxe-ui-layout-padding-half);
87
87
  &:hover {
88
88
  background-color: var(--vxe-ui-base-hover-background-color);
89
- &:not(.is--loading) {
90
- .vxe-upload--file-item-name {
91
- color: var(--vxe-ui-font-primary-color);
92
- }
89
+ .vxe-upload--file-item-name {
90
+ color: var(--vxe-ui-font-primary-color);
93
91
  }
94
92
  }
95
93
  &:last-child {
96
94
  margin-bottom: 0;
97
95
  }
98
- &.is--loading {
99
- cursor: progress;
100
- color: var(--vxe-ui-input-placeholder-color);
101
- }
102
96
  &.is--preview {
103
97
  .vxe-upload--file-item-name {
104
98
  cursor: pointer;
105
99
  }
106
100
  }
101
+ &.is--loading {
102
+ cursor: progress;
103
+ color: var(--vxe-ui-input-placeholder-color);
104
+ &:hover {
105
+ .vxe-upload--file-item-name {
106
+ color: var(--vxe-ui-input-placeholder-color);
107
+ }
108
+ }
109
+ }
110
+ &.is--pending {
111
+ color: var(--vxe-ui-input-placeholder-color);
112
+ }
107
113
  }
108
114
  .vxe-upload--file-over-more {
109
115
  display: flex;
@@ -131,7 +137,7 @@
131
137
  padding: var(--vxe-ui-layout-padding-half);
132
138
  color: var(--vxe-ui-input-placeholder-color);
133
139
  }
134
- .vxe-upload--file-item-error {
140
+ .vxe-upload--file-item-rebtn {
135
141
  padding-right: 0.4em;
136
142
  color: var(--vxe-ui-status-error-color);
137
143
  text-decoration: none;
@@ -249,28 +255,48 @@
249
255
  }
250
256
  }
251
257
  .vxe-upload--image-item {
258
+ &.is--loading {
259
+ .vxe-upload--image-item-box {
260
+ cursor: progress;
261
+ }
262
+ }
263
+ &:hover,
264
+ &.is--error,
265
+ &.is--pending {
266
+ .vxe-upload--image-item-img-wrapper {
267
+ &::after {
268
+ content: "";
269
+ position: absolute;
270
+ top: 0;
271
+ left: 0;
272
+ width: 100%;
273
+ height: 100%;
274
+ pointer-events: none;
275
+ }
276
+ }
277
+ }
252
278
  &:hover {
253
- &:not(.is--loading) {
279
+ .vxe-upload--image-item-img-wrapper {
280
+ &::after {
281
+ background-color: rgba(0, 0, 0, 0.1);
282
+ }
283
+ }
284
+ }
285
+ &.is--error,
286
+ &.is--pending {
287
+ .vxe-upload--image-item-img-wrapper {
288
+ &::after {
289
+ background-color: rgba(0, 0, 0, 0.4);
290
+ }
291
+ }
292
+ &:hover {
254
293
  .vxe-upload--image-item-img-wrapper {
255
- border-color: var(--vxe-ui-font-primary-color);
256
294
  &::after {
257
- content: "";
258
- position: absolute;
259
- top: 0;
260
- left: 0;
261
- width: 100%;
262
- height: 100%;
263
- pointer-events: none;
264
- background-color: rgba(0, 0, 0, 0.1);;
295
+ background-color: rgba(0, 0, 0, 0.5);
265
296
  }
266
297
  }
267
298
  }
268
299
  }
269
- &.is--loading {
270
- .vxe-upload--image-item-box {
271
- cursor: progress;
272
- }
273
- }
274
300
  &.is--error {
275
301
  .vxe-upload--image-item-img-wrapper {
276
302
  border-color: var(--vxe-ui-status-error-color);
@@ -289,6 +315,10 @@
289
315
  border-radius: 50%;
290
316
  }
291
317
  }
318
+ .vxe-upload--image-item-loading,
319
+ .vxe-upload--image-item-rebtn {
320
+ border-radius: 50%;
321
+ }
292
322
  }
293
323
  }
294
324
  .vxe-upload--image-item-img-wrapper {
@@ -316,10 +346,22 @@
316
346
  width: 100%;
317
347
  height: 100%;
318
348
  color: var(--vxe-ui-loading-color);
319
- background-color: var(--vxe-ui-loading-background-color);
349
+ background-color: rgba(0, 0, 0, 0.6);
320
350
  z-index: 1;
321
351
  user-select: none;
322
352
  }
353
+ .vxe-upload--image-item-rebtn {
354
+ position: absolute;
355
+ display: flex;
356
+ flex-direction: row;
357
+ justify-content: center;
358
+ align-items: center;
359
+ top: 0;
360
+ left: 0;
361
+ width: 100%;
362
+ height: 100%;
363
+ background-color: rgba(0, 0, 0, 0.6);
364
+ }
323
365
  .vxe-upload--image-action-hint {
324
366
  font-size: 0.8em;
325
367
  word-break: break-all;
@@ -407,6 +449,13 @@
407
449
  .vxe-upload--file-list {
408
450
  max-height: none;
409
451
  }
452
+ .vxe-upload--file-action-btn {
453
+ width: 100%;
454
+ & > .vxe-button {
455
+ width: 100%;
456
+ max-width: 100%;
457
+ }
458
+ }
410
459
  }
411
460
  .vxe-upload,
412
461
  .vxe-upload--more-popup {
@@ -41,9 +41,9 @@ export namespace VxeColumnPropTypes {
41
41
  export type ShowOverflow = VxeTablePropTypes.ShowOverflow
42
42
  export type ShowHeaderOverflow = ShowOverflow
43
43
  export type ShowFooterOverflow = ShowOverflow
44
- export type ClassName<D = any> = string | ((params: VxeGlobalRendererHandles.RenderCellParams<D>) => string | any[] | { [key: string]: boolean })
45
- export type HeaderClassName<D = any> = string | ((params: VxeGlobalRendererHandles.RenderHeaderParams<D>) => string | any[] | { [key: string]: boolean })
46
- export type FooterClassName<D = any> = string | ((params: VxeGlobalRendererHandles.RenderFooterParams<D>) => string | any[] | { [key: string]: boolean })
44
+ export type ClassName<D = any> = string | ((params: VxeGlobalRendererHandles.RenderTableCellParams<D>) => string | any[] | { [key: string]: boolean })
45
+ export type HeaderClassName<D = any> = string | ((params: VxeGlobalRendererHandles.RenderTableHeaderParams<D>) => string | any[] | { [key: string]: boolean })
46
+ export type FooterClassName<D = any> = string | ((params: VxeGlobalRendererHandles.RenderTableFooterParams<D>) => string | any[] | { [key: string]: boolean })
47
47
  export type Padding = boolean
48
48
  export type VerticalAlign = '' | 'top' | 'center' | null
49
49
 
@@ -68,10 +68,10 @@ export namespace VxeColumnPropTypes {
68
68
  }) => string | number)
69
69
  export type SortType = 'auto' | 'string' | 'number' | null
70
70
 
71
- export interface FilterItem {
71
+ export interface FilterItem<OD = any> {
72
72
  label?: string | number
73
73
  value?: any
74
- data?: any
74
+ data?: OD
75
75
  resetValue?: any
76
76
  checked?: boolean
77
77
  }
@@ -80,7 +80,7 @@ export namespace VxeColumnPropTypes {
80
80
  * @deprecated
81
81
  */
82
82
  export interface Filter extends FilterItem {}
83
- export type Filters = FilterItem[]
83
+ export type Filters<OD = any> = FilterItem<OD>[]
84
84
 
85
85
  export type FilterMultiple = boolean
86
86
 
@@ -29,6 +29,7 @@ export namespace VxeInputPropTypes {
29
29
  export type ClassName = string
30
30
  export type Immediate = boolean
31
31
  export type Name = string
32
+ export type Title = string
32
33
  export type Type = 'text' | 'search' | 'number' | 'integer' | 'float' | 'password' | 'date' | 'time' | 'datetime' | 'week' | 'month' | 'quarter' | 'year'
33
34
  export type Clearable = boolean
34
35
  export type Editable = boolean
@@ -85,6 +86,7 @@ export interface VxeInputProps {
85
86
  className?: VxeInputPropTypes.ClassName
86
87
  immediate?: VxeInputPropTypes.Immediate
87
88
  name?: VxeInputPropTypes.Name
89
+ title?: VxeInputPropTypes.Title
88
90
  type?: VxeInputPropTypes.Type
89
91
  clearable?: VxeInputPropTypes.Clearable
90
92
  readonly?: VxeInputPropTypes.Readonly
@@ -0,0 +1,15 @@
1
+ export namespace VxeTableFilterCombinationDefines {
2
+ export interface SimpleData {
3
+ checks: string[]
4
+ sVal: string
5
+ }
6
+
7
+ export interface CombinationData extends SimpleData {
8
+ sMenu: string
9
+ fType1: 'equal' | 'unequal' | 'gt' | 'ge' | 'lt' | 'le' | 'begin' | 'notbegin' | 'endin' | 'notendin' | 'include' | 'exclude' | ''
10
+ fVal1: string
11
+ fMode: 'and' | 'or' | ''
12
+ fType2: string
13
+ fVal2: string
14
+ }
15
+ }
@@ -0,0 +1,9 @@
1
+ export namespace VxeTableFilterComplexInputDefines {
2
+ export interface SimpleData {
3
+ sType: 'include' | 'equal' | 'begin' | 'endin' | 'gt' | 'lt' | ''
4
+ isSensitive: boolean
5
+ sVal: string
6
+ }
7
+
8
+ export interface ComplexData extends SimpleData {}
9
+ }
@@ -1,2 +1,4 @@
1
1
  export * from './extend-cell-area'
2
2
  export * from './extend-pivot-table'
3
+ export * from './filters-combination'
4
+ export * from './filters-complex-input'
@@ -35,6 +35,7 @@ export namespace VxeUploadPropTypes {
35
35
  export type Mode = null | '' | 'all' | 'image'
36
36
  export type Readonly = boolean
37
37
  export type Disabled = boolean
38
+ export type AutoSubmit = boolean
38
39
  export type ImageTypes = string[]
39
40
  export interface ImageConfig {
40
41
  width?: VxeImagePropTypes.Width
@@ -72,6 +73,7 @@ export namespace VxeUploadPropTypes {
72
73
  export type UrlField = string
73
74
  export type SizeField = string
74
75
  export type ShowTip = boolean
76
+ export type MaxSimultaneousUploads = number | string
75
77
  export type TipText = number | string | ((params: {}) => number | string)
76
78
  export type ButtonText = number | string | ((params: {}) => number | string)
77
79
  export type ButtonIcon = string
@@ -83,6 +85,7 @@ export namespace VxeUploadPropTypes {
83
85
  export type ShowErrorStatus = boolean
84
86
  export type ShowProgress = boolean
85
87
  export type ProgressText = number | string | ((params: {}) => number | string)
88
+ export type ShowSubmitButton = boolean
86
89
  export type AutoHiddenButton = boolean
87
90
  export type ShowUploadButton = boolean
88
91
  export type PreviewMethod = undefined | ((params: {
@@ -135,6 +138,7 @@ export interface VxeUploadProps {
135
138
  mode?: VxeUploadPropTypes.Mode
136
139
  readonly?: VxeUploadPropTypes.Readonly
137
140
  disabled?: VxeUploadPropTypes.Disabled
141
+ autoSubmit?: VxeUploadPropTypes.AutoSubmit
138
142
  imageTypes?: VxeUploadPropTypes.ImageTypes
139
143
  imageConfig?: VxeUploadPropTypes.ImageConfig
140
144
  /**
@@ -174,9 +178,14 @@ export interface VxeUploadProps {
174
178
  showErrorStatus?: VxeUploadPropTypes.ShowErrorStatus
175
179
  showProgress?: VxeUploadPropTypes.ShowProgress
176
180
  progressText?: VxeUploadPropTypes.ProgressText
181
+ showSubmitButton?: VxeUploadPropTypes.ShowSubmitButton
177
182
  autoHiddenButton?: VxeUploadPropTypes.AutoHiddenButton
178
183
  showTip?: VxeUploadPropTypes.ShowTip
179
184
  tipText?: VxeUploadPropTypes.TipText
185
+ /**
186
+ * 用于 autoSubmit=false,最大同时上传数量
187
+ */
188
+ maxSimultaneousUploads?: VxeUploadPropTypes.MaxSimultaneousUploads
180
189
  previewMethod?: VxeUploadPropTypes.PreviewMethod
181
190
  uploadMethod?: VxeUploadPropTypes.UploadMethod
182
191
  beforeRemoveMethod?: VxeUploadPropTypes.BeforeRemoveMethod
@@ -224,6 +233,10 @@ export interface UploadMethods {
224
233
  files: File[]
225
234
  file: File | null
226
235
  }>
236
+ /**
237
+ * 用于 auto-upload 模式,手动调用上传附件;如果传 true,这包含未上传和上传失败的都会重新提交
238
+ */
239
+ submit(isFull?: boolean): Promise<void>
227
240
  }
228
241
  export interface VxeUploadMethods extends UploadMethods { }
229
242
 
@@ -270,7 +283,7 @@ export namespace VxeUploadDefines {
270
283
  export interface FileCacheItem {
271
284
  file: File
272
285
  loading: boolean
273
- status: string
286
+ status: 'error' | 'success' | 'pending'
274
287
  percent: number
275
288
  }
276
289
 
@@ -160,6 +160,7 @@ declare module '@vxe-ui/core' {
160
160
  UPLOAD_FILE_ADD?: string
161
161
  UPLOAD_FILE_REMOVE?: string
162
162
  UPLOAD_FILE_DOWNLOAD?: string
163
+ UPLOAD_IMAGE_UPLOAD?: string
163
164
  UPLOAD_IMAGE_RE_UPLOAD?: string
164
165
  UPLOAD_IMAGE_ADD?: string
165
166
  UPLOAD_IMAGE_REMOVE?: string