vxe-pc-ui 3.3.0 → 3.3.1

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 (97) hide show
  1. package/es/icon/style.css +1 -1
  2. package/es/language/en-US.js +1 -0
  3. package/es/language/es-ES.js +1 -0
  4. package/es/language/hu-HU.js +1 -0
  5. package/es/language/ja-JP.js +1 -0
  6. package/es/language/ko-KR.js +1 -0
  7. package/es/language/pt-BR.js +1 -0
  8. package/es/language/ru-RU.js +1 -0
  9. package/es/language/uk-UA.js +1 -0
  10. package/es/language/vi-VN.js +1 -0
  11. package/es/language/zh-CHT.js +1 -0
  12. package/es/language/zh-CN.js +1 -0
  13. package/es/style.css +1 -1
  14. package/es/style.min.css +1 -1
  15. package/es/ui/index.js +2 -1
  16. package/es/ui/src/log.js +1 -1
  17. package/es/upload/src/upload.js +117 -25
  18. package/es/upload/style.css +7 -0
  19. package/es/upload/style.min.css +1 -1
  20. package/es/vxe-upload/style.css +7 -0
  21. package/es/vxe-upload/style.min.css +1 -1
  22. package/lib/icon/style/style.css +1 -1
  23. package/lib/icon/style/style.min.css +1 -1
  24. package/lib/index.umd.js +128 -27
  25. package/lib/index.umd.min.js +1 -1
  26. package/lib/language/en-US.js +1 -0
  27. package/lib/language/en-US.min.js +1 -1
  28. package/lib/language/en-US.umd.js +1 -0
  29. package/lib/language/es-ES.js +1 -0
  30. package/lib/language/es-ES.min.js +1 -1
  31. package/lib/language/es-ES.umd.js +1 -0
  32. package/lib/language/hu-HU.js +1 -0
  33. package/lib/language/hu-HU.min.js +1 -1
  34. package/lib/language/hu-HU.umd.js +1 -0
  35. package/lib/language/ja-JP.js +1 -0
  36. package/lib/language/ja-JP.min.js +1 -1
  37. package/lib/language/ja-JP.umd.js +1 -0
  38. package/lib/language/ko-KR.js +1 -0
  39. package/lib/language/ko-KR.min.js +1 -1
  40. package/lib/language/ko-KR.umd.js +1 -0
  41. package/lib/language/pt-BR.js +1 -0
  42. package/lib/language/pt-BR.min.js +1 -1
  43. package/lib/language/pt-BR.umd.js +1 -0
  44. package/lib/language/ru-RU.js +1 -0
  45. package/lib/language/ru-RU.min.js +1 -1
  46. package/lib/language/ru-RU.umd.js +1 -0
  47. package/lib/language/uk-UA.js +1 -0
  48. package/lib/language/uk-UA.min.js +1 -1
  49. package/lib/language/uk-UA.umd.js +1 -0
  50. package/lib/language/vi-VN.js +1 -0
  51. package/lib/language/vi-VN.min.js +1 -1
  52. package/lib/language/zh-CHT.js +1 -0
  53. package/lib/language/zh-CHT.min.js +1 -1
  54. package/lib/language/zh-CHT.umd.js +1 -0
  55. package/lib/language/zh-CN.js +1 -0
  56. package/lib/language/zh-CN.min.js +1 -1
  57. package/lib/language/zh-CN.umd.js +1 -0
  58. package/lib/style.css +1 -1
  59. package/lib/style.min.css +1 -1
  60. package/lib/ui/index.js +2 -1
  61. package/lib/ui/index.min.js +1 -1
  62. package/lib/ui/src/log.js +1 -1
  63. package/lib/ui/src/log.min.js +1 -1
  64. package/lib/upload/src/upload.js +124 -24
  65. package/lib/upload/src/upload.min.js +1 -1
  66. package/lib/upload/style/style.css +7 -0
  67. package/lib/upload/style/style.min.css +1 -1
  68. package/lib/vxe-upload/style/style.css +7 -0
  69. package/lib/vxe-upload/style/style.min.css +1 -1
  70. package/package.json +2 -2
  71. package/packages/language/en-US.ts +1 -0
  72. package/packages/language/es-ES.ts +1 -0
  73. package/packages/language/hu-HU.ts +1 -0
  74. package/packages/language/ja-JP.ts +1 -0
  75. package/packages/language/ko-KR.ts +1 -0
  76. package/packages/language/pt-BR.ts +1 -0
  77. package/packages/language/ru-RU.ts +1 -0
  78. package/packages/language/uk-UA.ts +1 -0
  79. package/packages/language/vi-VN.ts +1 -0
  80. package/packages/language/zh-CHT.ts +1 -0
  81. package/packages/language/zh-CN.ts +1 -0
  82. package/packages/ui/index.ts +1 -0
  83. package/packages/upload/src/upload.ts +125 -24
  84. package/styles/components/upload.scss +11 -0
  85. package/types/components/upload.d.ts +6 -1
  86. /package/es/icon/{iconfont.1731889697627.ttf → iconfont.1731931996427.ttf} +0 -0
  87. /package/es/icon/{iconfont.1731889697627.woff → iconfont.1731931996427.woff} +0 -0
  88. /package/es/icon/{iconfont.1731889697627.woff2 → iconfont.1731931996427.woff2} +0 -0
  89. /package/es/{iconfont.1731889697627.ttf → iconfont.1731931996427.ttf} +0 -0
  90. /package/es/{iconfont.1731889697627.woff → iconfont.1731931996427.woff} +0 -0
  91. /package/es/{iconfont.1731889697627.woff2 → iconfont.1731931996427.woff2} +0 -0
  92. /package/lib/icon/style/{iconfont.1731889697627.ttf → iconfont.1731931996427.ttf} +0 -0
  93. /package/lib/icon/style/{iconfont.1731889697627.woff → iconfont.1731931996427.woff} +0 -0
  94. /package/lib/icon/style/{iconfont.1731889697627.woff2 → iconfont.1731931996427.woff2} +0 -0
  95. /package/lib/{iconfont.1731889697627.ttf → iconfont.1731931996427.ttf} +0 -0
  96. /package/lib/{iconfont.1731889697627.woff → iconfont.1731931996427.woff} +0 -0
  97. /package/lib/{iconfont.1731889697627.woff2 → iconfont.1731931996427.woff2} +0 -0
@@ -308,6 +308,7 @@ export default {
308
308
  fileTypeHint: '支持 {0} 文件类型',
309
309
  fileSizeHint: '单个文件大小不超过{0}',
310
310
  fileCountHint: '最多可上传{0}个文件',
311
+ uploadTypeErr: '文件类型不匹配!',
311
312
  overCountErr: '最多只能选择{0}个文件!',
312
313
  overCountExtraErr: '已超出最大数量{0}个,超出的{1}个文件将被忽略!',
313
314
  overSizeErr: '文件大小最大不能超过{0}!',
@@ -308,6 +308,7 @@ export default {
308
308
  fileTypeHint: 'Support {0} file types',
309
309
  fileSizeHint: 'Single file size does not exceed {0}',
310
310
  fileCountHint: 'Up to {0} file can be uploaded',
311
+ uploadTypeErr: '文件类型不匹配!',
311
312
  overCountErr: 'You can only choose {0} file!',
312
313
  overCountExtraErr: 'It has exceeded the maximum number {0}, and more than {0} file will be ignored!超出最大数量 1 个,超出的 1 个文件将被忽略!',
313
314
  overSizeErr: 'The size of the file is not more than {0}}!',
@@ -308,6 +308,7 @@ export default {
308
308
  fileTypeHint: 'Поддерживаемые типы файлов: {0}',
309
309
  fileSizeHint: 'Размер одного файла не превышает {0}',
310
310
  fileCountHint: 'Можно загрузить до {0} файлов.',
311
+ uploadTypeErr: '文件类型不匹配!',
311
312
  overCountErr: 'Можно выбрать только {0} файлов!',
312
313
  overCountExtraErr: 'Превышено максимальное количество файлов ({0}). Лишние файлы ({1}) будут проигнорированы!',
313
314
  overSizeErr: 'Максимальный размер файла не может превышать {0}!',
@@ -308,6 +308,7 @@ export default {
308
308
  fileTypeHint: '支持 {0} 文件类型',
309
309
  fileSizeHint: '单个文件大小不超过{0}',
310
310
  fileCountHint: '最多可上传{0}个文件',
311
+ uploadTypeErr: '文件类型不匹配!',
311
312
  overCountErr: '最多只能选择{0}个文件!',
312
313
  overCountExtraErr: '已超出最大数量{0}个,超出的{1}个文件将被忽略!',
313
314
  overSizeErr: '文件大小最大不能超过{0}!',
@@ -308,6 +308,7 @@ export default {
308
308
  fileTypeHint: '支持 {0} 文件类型',
309
309
  fileSizeHint: '单个文件大小不超过{0}',
310
310
  fileCountHint: '最多可上传{0}个文件',
311
+ uploadTypeErr: '文件类型不匹配!',
311
312
  overCountErr: '最多只能选择{0}个文件!',
312
313
  overCountExtraErr: '已超出最大数量{0}个,超出的{1}个文件将被忽略!',
313
314
  overSizeErr: '文件大小最大不能超过{0}!',
@@ -308,6 +308,7 @@ export default {
308
308
  fileTypeHint: '支援 {0} 文件類型',
309
309
  fileSizeHint: '單一檔案大小不超過{0}',
310
310
  fileCountHint: '最多可上傳{0}個文件',
311
+ uploadTypeErr: '文件类型不匹配!',
311
312
  overCountErr: '最多只能選擇{0}個檔案!',
312
313
  overCountExtraErr: '已超出最大數量{0}個,超出的{1}個檔案將被忽略!',
313
314
  overSizeErr: '檔案大小最大不能超過{0}!',
@@ -308,6 +308,7 @@ export default {
308
308
  fileTypeHint: '支持 {0} 文件类型',
309
309
  fileSizeHint: '单个文件大小不超过{0}',
310
310
  fileCountHint: '最多可上传{0}个文件',
311
+ uploadTypeErr: '文件类型不匹配!',
311
312
  overCountErr: '最多只能选择{0}个文件!',
312
313
  overCountExtraErr: '已超出最大数量{0}个,超出的{1}个文件将被忽略!',
313
314
  overSizeErr: '文件大小最大不能超过{0}!',
@@ -326,6 +326,7 @@ setConfig({
326
326
  showRemoveButton: true,
327
327
  showButtonIcon: true,
328
328
  showPreview: true,
329
+ dragToUpload: true,
329
330
  imageStyle: {}
330
331
  },
331
332
  watermark: {
@@ -1,19 +1,30 @@
1
1
  import { PropType, CreateElement, VNode } from 'vue'
2
2
  import { defineVxeComponent } from '../../ui/src/comp'
3
3
  import XEUtils from 'xe-utils'
4
- import { VxeUI, getConfig, getI18n, getIcon, globalMixins, createEvent, renderEmptyElement } from '../../ui'
4
+ import { VxeUI, getConfig, getI18n, getIcon, globalMixins, createEvent, globalEvents, renderEmptyElement } from '../../ui'
5
5
  import { getSlotVNs } from '../..//ui/src/vn'
6
6
  import { errLog } from '../../ui/src/log'
7
- import { toCssUnit } from '../../ui/src/dom'
7
+ import { getEventTargetNode, toCssUnit } from '../../ui/src/dom'
8
8
  import { readLocalFile } from './util'
9
9
  import VxeButtonComponent from '../../button/src/button'
10
10
 
11
11
  import type { VxeUploadDefines, VxeUploadPropTypes, UploadReactData, UploadInternalData, VxeUploadEmits, VxeComponentSizeType, VxeFormDefines, VxeFormConstructor, VxeFormPrivateMethods, ValueOf } from '../../../types'
12
12
 
13
- const getUniqueKey = () => {
13
+ function getUniqueKey () {
14
14
  return XEUtils.uniqueId()
15
15
  }
16
16
 
17
+ function handleTransferFiles (items: DataTransferItemList) {
18
+ const files: File[] = []
19
+ XEUtils.arrayEach(items, item => {
20
+ const file = item.getAsFile()
21
+ if (file) {
22
+ files.push(file)
23
+ }
24
+ })
25
+ return files
26
+ }
27
+
17
28
  export default defineVxeComponent({
18
29
  name: 'VxeUpload',
19
30
  model: {
@@ -54,6 +65,14 @@ export default defineVxeComponent({
54
65
  type: Array as PropType<VxeUploadPropTypes.FileTypes>,
55
66
  default: () => XEUtils.clone(getConfig().upload.fileTypes, true)
56
67
  },
68
+ dragToUpload: {
69
+ type: Boolean as PropType<VxeUploadPropTypes.DragToUpload>,
70
+ default: () => XEUtils.clone(getConfig().upload.dragToUpload, true)
71
+ },
72
+ pasteToUpload: {
73
+ type: Boolean as PropType<VxeUploadPropTypes.PasteToUpload>,
74
+ default: () => XEUtils.clone(getConfig().upload.pasteToUpload, true)
75
+ },
57
76
  keyField: String as PropType<VxeUploadPropTypes.KeyField>,
58
77
  singleMode: Boolean as PropType<VxeUploadPropTypes.SingleMode>,
59
78
  urlMode: Boolean as PropType<VxeUploadPropTypes.UrlMode>,
@@ -159,6 +178,7 @@ export default defineVxeComponent({
159
178
  const reactData: UploadReactData = {
160
179
  isDrag: false,
161
180
  showMorePopup: false,
181
+ isActivated: false,
162
182
  fileList: [],
163
183
  fileCacheMaps: {}
164
184
  }
@@ -863,6 +883,37 @@ export default defineVxeComponent({
863
883
  }
864
884
  }
865
885
  },
886
+ uploadTransferFileEvent (evnt: Event, files: File[]) {
887
+ const $xeUpload = this
888
+ const props = $xeUpload
889
+ const internalData = $xeUpload.internalData
890
+
891
+ const { imageTypes } = props
892
+ const { imagePreviewTypes } = internalData
893
+ const isImage = $xeUpload.computeIsImage
894
+ if (isImage) {
895
+ const pasteImgTypes = imagePreviewTypes.concat(imageTypes && imageTypes.length ? imageTypes : [])
896
+ files = files.filter(file => {
897
+ const fileType = `${file.type.split('/')[1] || ''}`.toLowerCase()
898
+ if (pasteImgTypes.some(type => `${type}`.toLowerCase() === fileType)) {
899
+ return true
900
+ }
901
+ return false
902
+ })
903
+ }
904
+ // 如果全部不满足条件
905
+ if (!files.length) {
906
+ if (VxeUI.modal) {
907
+ VxeUI.modal.notification({
908
+ title: getI18n('vxe.modal.errTitle'),
909
+ status: 'error',
910
+ content: getI18n('vxe.upload.uploadTypeErr')
911
+ })
912
+ }
913
+ return
914
+ }
915
+ $xeUpload.uploadFile(files, evnt)
916
+ },
866
917
  handleDropEvent (evnt: DragEvent) {
867
918
  const $xeUpload = this
868
919
  const reactData = $xeUpload.reactData
@@ -871,15 +922,11 @@ export default defineVxeComponent({
871
922
  if (dataTransfer) {
872
923
  const { items } = dataTransfer
873
924
  if (items && items.length) {
874
- const files: File[] = []
875
- Array.from(items).forEach(item => {
876
- const file = item.getAsFile()
877
- if (file) {
878
- files.push(file)
879
- }
880
- })
881
- $xeUpload.uploadFile(files, evnt)
882
925
  evnt.preventDefault()
926
+ const files = handleTransferFiles(items)
927
+ if (files.length) {
928
+ $xeUpload.uploadTransferFileEvent(evnt, files)
929
+ }
883
930
  }
884
931
  }
885
932
  reactData.isDrag = false
@@ -903,11 +950,18 @@ export default defineVxeComponent({
903
950
  maskClosable: true,
904
951
  slots: {
905
952
  default (params, h) {
906
- const { showErrorStatus } = props
953
+ const { showErrorStatus, dragToUpload } = props
907
954
  const { isDrag } = reactData
908
955
  const isDisabled = $xeUpload.computeIsDisabled
909
956
  const { fileList } = reactData
910
957
 
958
+ const ons: Record<string, any> = {}
959
+ if (dragToUpload) {
960
+ ons.dragover = $xeUpload.handleDragoverEvent
961
+ ons.dragleave = $xeUpload.handleDragleaveEvent
962
+ ons.drop = $xeUpload.handleDropEvent
963
+ }
964
+
911
965
  return h('div', {
912
966
  class: ['vxe-upload--more-popup', {
913
967
  'is--readonly': formReadonly,
@@ -915,11 +969,7 @@ export default defineVxeComponent({
915
969
  'show--error': showErrorStatus,
916
970
  'is--drag': isDrag
917
971
  }],
918
- on: {
919
- dragover: $xeUpload.handleDragoverEvent,
920
- dragleave: $xeUpload.handleDragleaveEvent,
921
- drop: $xeUpload.handleDropEvent
922
- }
972
+ on: ons
923
973
  }, [
924
974
  isImage
925
975
  ? h('div', {
@@ -950,6 +1000,45 @@ export default defineVxeComponent({
950
1000
  })
951
1001
  }
952
1002
  },
1003
+ handleGlobalPasteEvent (evnt: ClipboardEvent) {
1004
+ const $xeUpload = this
1005
+ const props = $xeUpload
1006
+ const reactData = $xeUpload.reactData
1007
+
1008
+ const { pasteToUpload } = props
1009
+ const { isActivated } = reactData
1010
+ if (!isActivated || !pasteToUpload) {
1011
+ return
1012
+ }
1013
+ const clipboardData: DataTransfer = evnt.clipboardData || (evnt as any).originalEvent.clipboardData
1014
+ if (!clipboardData) {
1015
+ return
1016
+ }
1017
+ const { items } = clipboardData
1018
+ if (!items) {
1019
+ return
1020
+ }
1021
+ const files = handleTransferFiles(items)
1022
+ if (files.length) {
1023
+ evnt.preventDefault()
1024
+ $xeUpload.uploadTransferFileEvent(evnt, files)
1025
+ }
1026
+ },
1027
+ handleGlobalMousedownEvent (evnt: MouseEvent) {
1028
+ const $xeUpload = this
1029
+ const reactData = $xeUpload.reactData
1030
+
1031
+ const el = $xeUpload.$refs.refElem
1032
+ const isActivated = getEventTargetNode(evnt, el).flag
1033
+ reactData.isActivated = isActivated
1034
+ },
1035
+ handleGlobalBlurEvent () {
1036
+ const $xeUpload = this
1037
+ const reactData = $xeUpload.reactData
1038
+
1039
+ reactData.isActivated = false
1040
+ },
1041
+
953
1042
  //
954
1043
  // Render
955
1044
  //
@@ -1396,26 +1485,32 @@ export default defineVxeComponent({
1396
1485
  const props = $xeUpload
1397
1486
  const reactData = $xeUpload.reactData
1398
1487
 
1399
- const { showErrorStatus } = props
1400
- const { isDrag, showMorePopup } = reactData
1488
+ const { showErrorStatus, dragToUpload, pasteToUpload } = props
1489
+ const { isDrag, showMorePopup, isActivated } = reactData
1401
1490
  const vSize = $xeUpload.computeSize
1402
1491
  const isDisabled = $xeUpload.computeIsDisabled
1403
1492
  const formReadonly = $xeUpload.computeFormReadonly
1404
1493
  const isImage = $xeUpload.computeIsImage
1494
+
1495
+ const ons: Record<string, any> = {}
1496
+ if (dragToUpload) {
1497
+ ons.dragover = $xeUpload.handleDragoverEvent
1498
+ ons.dragleave = $xeUpload.handleDragleaveEvent
1499
+ ons.drop = $xeUpload.handleDropEvent
1500
+ }
1501
+
1405
1502
  return h('div', {
1406
1503
  ref: 'refElem',
1407
1504
  class: ['vxe-upload', {
1408
1505
  [`size--${vSize}`]: vSize,
1506
+ 'is--active': isActivated,
1409
1507
  'is--readonly': formReadonly,
1410
1508
  'is--disabled': isDisabled,
1509
+ 'is--paste': pasteToUpload,
1411
1510
  'show--error': showErrorStatus,
1412
1511
  'is--drag': isDrag
1413
1512
  }],
1414
- on: {
1415
- dragover: $xeUpload.handleDragoverEvent,
1416
- dragleave: $xeUpload.handleDragleaveEvent,
1417
- drop: $xeUpload.handleDropEvent
1418
- }
1513
+ on: ons
1419
1514
  }, [
1420
1515
  isImage ? $xeUpload.renderImageMode(h) : $xeUpload.renderAllMode(h),
1421
1516
  isDrag && !showMorePopup
@@ -1440,12 +1535,18 @@ export default defineVxeComponent({
1440
1535
  errLog('vxe.error.errConflicts', ['multiple', 'single-mode'])
1441
1536
  }
1442
1537
  }
1538
+ globalEvents.on($xeUpload, 'paste', $xeUpload.handleGlobalPasteEvent)
1539
+ globalEvents.on($xeUpload, 'mousedown', $xeUpload.handleGlobalMousedownEvent)
1540
+ globalEvents.on($xeUpload, 'blur', $xeUpload.handleGlobalBlurEvent)
1443
1541
  },
1444
1542
  beforeDestroy () {
1445
1543
  const $xeUpload = this
1446
1544
  const reactData = $xeUpload.reactData
1447
1545
 
1448
1546
  reactData.isDrag = false
1547
+ globalEvents.off($xeUpload, 'paste')
1548
+ globalEvents.off($xeUpload, 'mousedown')
1549
+ globalEvents.off($xeUpload, 'blur')
1449
1550
  },
1450
1551
  render (this: any, h) {
1451
1552
  return this.renderVN(h)
@@ -2,6 +2,17 @@
2
2
  position: relative;
3
3
  color: var(--vxe-ui-font-color);
4
4
  font-family: var(--vxe-ui-font-family);
5
+ &.is--active {
6
+ .vxe-upload--image-action-box {
7
+ border-color: var(--vxe-ui-font-primary-color);
8
+ }
9
+ .vxe-upload--file-action-btn {
10
+ & > .vxe-button {
11
+ border-color: var(--vxe-ui-font-primary-color);
12
+ border-style: var(--vxe-ui-upload-file-button-border-style);
13
+ }
14
+ }
15
+ }
5
16
  &.show--error {
6
17
  .vxe-upload--file-item {
7
18
  &.is--error {
@@ -34,6 +34,8 @@ export namespace VxeUploadPropTypes {
34
34
  }
35
35
  export type FileTypes = string[]
36
36
  export type SingleMode = boolean
37
+ export type DragToUpload = boolean
38
+ export type PasteToUpload = boolean
37
39
  export type KeyField = string
38
40
  export type UrlMode = boolean
39
41
  export type Multiple = boolean
@@ -111,6 +113,8 @@ export interface VxeUploadProps {
111
113
  fileTypes?: VxeUploadPropTypes.FileTypes
112
114
  multiple?: VxeUploadPropTypes.Multiple
113
115
  singleMode?: VxeUploadPropTypes.SingleMode
116
+ dragToUpload?: VxeUploadPropTypes.DragToUpload
117
+ pasteToUpload?: VxeUploadPropTypes.PasteToUpload
114
118
  keyField?: VxeUploadPropTypes.KeyField
115
119
  urlMode?: VxeUploadPropTypes.UrlMode
116
120
  /**
@@ -157,7 +161,8 @@ export interface VxeUploadPrivateComputed extends UploadPrivateComputed { }
157
161
 
158
162
  export interface UploadReactData {
159
163
  isDrag: boolean
160
- showMorePopup: boolean,
164
+ showMorePopup: boolean
165
+ isActivated: boolean
161
166
  fileList: VxeUploadDefines.FileObjItem[]
162
167
  fileCacheMaps: Record<string, VxeUploadDefines.FileCacheItem>
163
168
  }