@rainbow-oh/yee-c 0.9.2 → 0.11.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 (162) hide show
  1. package/dist/cjs/Button/demo/icon.js +1 -1
  2. package/dist/cjs/Input/style/index.less +1 -0
  3. package/dist/cjs/Table/demo/resizable.d.ts +3 -0
  4. package/dist/cjs/Table/demo/resizable.js +143 -0
  5. package/dist/cjs/Table/hooks/useColumnResize.d.ts +30 -0
  6. package/dist/cjs/Table/hooks/useColumnResize.js +217 -0
  7. package/dist/cjs/Table/hooks/useColumns.d.ts +3 -1
  8. package/dist/cjs/Table/hooks/useColumns.js +14 -3
  9. package/dist/cjs/Table/interface.d.ts +49 -0
  10. package/dist/cjs/Table/style/index.less +42 -0
  11. package/dist/cjs/Table/table.js +62 -9
  12. package/dist/cjs/Table/theader/cell.js +46 -4
  13. package/dist/cjs/Table/util/index.d.ts +19 -1
  14. package/dist/cjs/Table/util/index.js +22 -0
  15. package/dist/cjs/Tabs/demo/overflow-center.d.ts +3 -0
  16. package/dist/cjs/Tabs/demo/overflow-center.js +54 -0
  17. package/dist/cjs/Tabs/hooks/useNavListMove.d.ts +2 -1
  18. package/dist/cjs/Tabs/hooks/useNavListMove.js +51 -16
  19. package/dist/cjs/Tabs/hooks/useTabScroll.d.ts +1 -0
  20. package/dist/cjs/Tabs/hooks/useTabScroll.js +5 -1
  21. package/dist/cjs/Tabs/interface.d.ts +10 -1
  22. package/dist/cjs/Tabs/style/index.less +5 -0
  23. package/dist/cjs/Tabs/tab-header/index.d.ts +1 -0
  24. package/dist/cjs/Tabs/tab-header/index.js +11 -3
  25. package/dist/cjs/Tabs/tabs.js +4 -1
  26. package/dist/cjs/Upload/demo/auto-upload.d.ts +3 -0
  27. package/dist/cjs/Upload/demo/auto-upload.js +65 -0
  28. package/dist/cjs/Upload/demo/basic.js +5 -10
  29. package/dist/cjs/Upload/demo/controlled.js +4 -4
  30. package/dist/cjs/Upload/demo/pictureWall.js +14 -13
  31. package/dist/cjs/Upload/dragger.d.ts +2 -1
  32. package/dist/cjs/Upload/dragger.js +32 -21
  33. package/dist/cjs/Upload/index.d.ts +1 -1
  34. package/dist/cjs/Upload/interface.d.ts +67 -120
  35. package/dist/cjs/Upload/style/index.less +40 -13
  36. package/dist/cjs/Upload/upload.d.ts +2 -2
  37. package/dist/cjs/Upload/upload.js +435 -185
  38. package/dist/cjs/Upload/uploaded-list/index.d.ts +2 -1
  39. package/dist/cjs/Upload/uploaded-list/index.js +6 -3
  40. package/dist/cjs/Upload/uploaded-list/uploaded-item.d.ts +6 -3
  41. package/dist/cjs/Upload/uploaded-list/uploaded-item.js +127 -138
  42. package/dist/cjs/locale/interface.d.ts +1 -0
  43. package/dist/cjs/locale/lang/en_US.js +2 -1
  44. package/dist/cjs/locale/lang/ja_JP.js +2 -1
  45. package/dist/cjs/locale/lang/zh_CN.js +2 -1
  46. package/dist/cjs/locale/lang/zh_TW.js +2 -1
  47. package/dist/cjs/style/size.css +2 -1
  48. package/dist/cjs/style/themes.css +1 -1
  49. package/dist/cjs/style/variables.css +3 -2
  50. package/dist/cjs/utils/ax/core.d.ts +3 -1
  51. package/dist/cjs/utils/ax/core.js +24 -37
  52. package/dist/cjs/utils/ax/index.d.ts +3 -1
  53. package/dist/cjs/utils/folder-scanner.d.ts +1 -1
  54. package/dist/cjs/utils/folder-scanner.js +43 -34
  55. package/dist/cjs/version.d.ts +1 -1
  56. package/dist/cjs/version.js +1 -1
  57. package/dist/esm/Button/demo/icon.js +7 -4
  58. package/dist/esm/Input/style/index.less +1 -0
  59. package/dist/esm/Table/demo/resizable.d.ts +3 -0
  60. package/dist/esm/Table/demo/resizable.js +110 -0
  61. package/dist/esm/Table/hooks/useColumnResize.d.ts +30 -0
  62. package/dist/esm/Table/hooks/useColumnResize.js +206 -0
  63. package/dist/esm/Table/hooks/useColumns.d.ts +3 -1
  64. package/dist/esm/Table/hooks/useColumns.js +9 -4
  65. package/dist/esm/Table/interface.d.ts +49 -0
  66. package/dist/esm/Table/style/index.less +42 -0
  67. package/dist/esm/Table/table.js +83 -13
  68. package/dist/esm/Table/theader/cell.js +38 -3
  69. package/dist/esm/Table/util/index.d.ts +19 -1
  70. package/dist/esm/Table/util/index.js +37 -0
  71. package/dist/esm/Tabs/demo/overflow-center.d.ts +3 -0
  72. package/dist/esm/Tabs/demo/overflow-center.js +61 -0
  73. package/dist/esm/Tabs/hooks/useNavListMove.d.ts +2 -1
  74. package/dist/esm/Tabs/hooks/useNavListMove.js +62 -25
  75. package/dist/esm/Tabs/hooks/useTabScroll.d.ts +1 -0
  76. package/dist/esm/Tabs/hooks/useTabScroll.js +9 -0
  77. package/dist/esm/Tabs/interface.d.ts +10 -1
  78. package/dist/esm/Tabs/style/index.less +5 -0
  79. package/dist/esm/Tabs/tab-header/index.d.ts +1 -0
  80. package/dist/esm/Tabs/tab-header/index.js +15 -3
  81. package/dist/esm/Tabs/tabs.js +4 -2
  82. package/dist/esm/Upload/demo/auto-upload.d.ts +3 -0
  83. package/dist/esm/Upload/demo/auto-upload.js +42 -0
  84. package/dist/esm/Upload/demo/basic.js +5 -11
  85. package/dist/esm/Upload/demo/controlled.js +8 -6
  86. package/dist/esm/Upload/demo/pictureWall.js +17 -14
  87. package/dist/esm/Upload/dragger.d.ts +2 -1
  88. package/dist/esm/Upload/dragger.js +10 -5
  89. package/dist/esm/Upload/index.d.ts +1 -1
  90. package/dist/esm/Upload/interface.d.ts +67 -120
  91. package/dist/esm/Upload/style/index.less +40 -13
  92. package/dist/esm/Upload/upload.d.ts +2 -2
  93. package/dist/esm/Upload/upload.js +573 -271
  94. package/dist/esm/Upload/uploaded-list/index.d.ts +2 -1
  95. package/dist/esm/Upload/uploaded-list/index.js +9 -4
  96. package/dist/esm/Upload/uploaded-list/uploaded-item.d.ts +6 -3
  97. package/dist/esm/Upload/uploaded-list/uploaded-item.js +145 -150
  98. package/dist/esm/locale/interface.d.ts +1 -0
  99. package/dist/esm/locale/lang/en_US.js +2 -1
  100. package/dist/esm/locale/lang/ja_JP.js +2 -1
  101. package/dist/esm/locale/lang/zh_CN.js +2 -1
  102. package/dist/esm/locale/lang/zh_TW.js +2 -1
  103. package/dist/esm/style/size.css +2 -1
  104. package/dist/esm/style/themes.css +1 -1
  105. package/dist/esm/style/variables.css +3 -2
  106. package/dist/esm/utils/ax/core.d.ts +3 -1
  107. package/dist/esm/utils/ax/core.js +32 -40
  108. package/dist/esm/utils/ax/index.d.ts +3 -1
  109. package/dist/esm/utils/folder-scanner.d.ts +1 -1
  110. package/dist/esm/utils/folder-scanner.js +76 -75
  111. package/dist/esm/version.d.ts +1 -1
  112. package/dist/esm/version.js +1 -1
  113. package/dist/umd/yee-c.min.css +2 -2
  114. package/dist/umd/yee-c.min.js +1 -1
  115. package/package.json +1 -1
  116. package/src/Button/demo/icon.tsx +5 -3
  117. package/src/Input/style/index.less +1 -0
  118. package/src/Table/demo/resizable.tsx +106 -0
  119. package/src/Table/hooks/useColumnResize.ts +224 -0
  120. package/src/Table/hooks/useColumns.ts +18 -3
  121. package/src/Table/index.en-US.md +7 -0
  122. package/src/Table/index.zh-CN.md +7 -0
  123. package/src/Table/interface.ts +52 -0
  124. package/src/Table/style/index.less +42 -0
  125. package/src/Table/table-resize.test.tsx +234 -0
  126. package/src/Table/table.tsx +90 -13
  127. package/src/Table/theader/cell.tsx +52 -2
  128. package/src/Table/util/index.ts +44 -1
  129. package/src/Tabs/demo/overflow-center.tsx +35 -0
  130. package/src/Tabs/hooks/useNavListMove.ts +60 -18
  131. package/src/Tabs/hooks/useTabScroll.ts +7 -1
  132. package/src/Tabs/index.en-US.md +33 -31
  133. package/src/Tabs/index.zh-CN.md +33 -31
  134. package/src/Tabs/interface.ts +10 -1
  135. package/src/Tabs/style/index.less +5 -0
  136. package/src/Tabs/tab-header/index.tsx +14 -3
  137. package/src/Tabs/tabs.tsx +2 -0
  138. package/src/Upload/demo/auto-upload.tsx +35 -0
  139. package/src/Upload/demo/basic.tsx +7 -11
  140. package/src/Upload/demo/controlled.tsx +12 -8
  141. package/src/Upload/demo/directory.tsx +3 -4
  142. package/src/Upload/demo/drag.tsx +5 -12
  143. package/src/Upload/demo/multiple.tsx +3 -4
  144. package/src/Upload/demo/pictureWall.tsx +22 -21
  145. package/src/Upload/dragger.tsx +47 -34
  146. package/src/Upload/index.en-US.md +63 -43
  147. package/src/Upload/index.ts +8 -1
  148. package/src/Upload/index.zh-CN.md +62 -42
  149. package/src/Upload/interface.ts +68 -120
  150. package/src/Upload/style/index.less +40 -13
  151. package/src/Upload/upload.tsx +546 -215
  152. package/src/Upload/uploaded-list/index.tsx +9 -5
  153. package/src/Upload/uploaded-list/uploaded-item.tsx +199 -228
  154. package/src/locale/interface.ts +1 -0
  155. package/src/locale/lang/en_US.ts +1 -0
  156. package/src/locale/lang/ja_JP.ts +1 -0
  157. package/src/locale/lang/zh_CN.ts +1 -0
  158. package/src/locale/lang/zh_TW.ts +1 -0
  159. package/src/style/size.css +2 -1
  160. package/src/utils/ax/core.ts +28 -41
  161. package/src/utils/folder-scanner.ts +51 -37
  162. package/src/version.ts +1 -1
@@ -1,38 +1,39 @@
1
- import { Upload } from '@rainbow-oh/yee-c';
1
+ import { Upload, type UploadFile, type UploadProps } from '@rainbow-oh/yee-c';
2
2
  import React, { useState } from 'react';
3
- import type { UploadFile } from '../interface';
3
+
4
+ const imageUrl =
5
+ 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png';
4
6
 
5
7
  export default () => {
6
8
  const [fileList, setFileList] = useState<UploadFile[]>([
7
9
  {
8
10
  uid: '-1',
9
- name: 'image.png',
10
- status: 'done',
11
- url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
12
- } as unknown as UploadFile,
11
+ name: 'image-1.png',
12
+ status: 'success',
13
+ type: 'image/png',
14
+ url: imageUrl,
15
+ },
13
16
  {
14
17
  uid: '-2',
15
- name: 'image.png',
16
- status: 'done',
17
- url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
18
- } as unknown as UploadFile,
18
+ name: 'image-2.png',
19
+ status: 'success',
20
+ type: 'image/png',
21
+ url: imageUrl,
22
+ },
19
23
  {
20
24
  uid: '-3',
21
- name: 'image.png',
22
- status: 'done',
23
- url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
24
- } as unknown as UploadFile,
25
+ name: 'image-3.png',
26
+ status: 'success',
27
+ type: 'image/png',
28
+ url: imageUrl,
29
+ },
25
30
  ]);
26
31
 
27
- const handleChange = ({ fileList }: { fileList: UploadFile[] }) => {
28
- setFileList(fileList);
29
- };
30
-
31
- const props = {
32
+ const props: UploadProps = {
32
33
  action: 'https://www.mocky.io/v2/5cc8019d300000980a055e76',
33
- listType: 'picture-wall' as const,
34
+ listType: 'picture-wall',
34
35
  fileList,
35
- onChange: handleChange,
36
+ onChange: ({ fileList: nextFileList }) => setFileList(nextFileList),
36
37
  };
37
38
 
38
39
  return <Upload {...props} />;
@@ -2,45 +2,58 @@ import clsx from 'clsx';
2
2
  import { Upload as UploadIcon } from 'lucide-react';
3
3
  import React from 'react';
4
4
  import { useLocale } from '../locale';
5
+ import type { UploadDraggerProps, UploadInstance } from './interface';
5
6
  import Upload from './upload';
6
7
 
7
- const Dragger = React.forwardRef((props: any, ref) => {
8
- const { prefixCls = 'yee-upload-dragger', children, disabled, hint } = props;
9
- const { t } = useLocale();
8
+ const Dragger = React.forwardRef<UploadInstance, UploadDraggerProps>(
9
+ (props, ref) => {
10
+ const {
11
+ prefixCls = 'yee-upload-dragger',
12
+ children,
13
+ disabled,
14
+ hint,
15
+ } = props;
16
+ const { t } = useLocale();
17
+
18
+ const renderChildren = () => {
19
+ return (
20
+ children ?? (
21
+ <>
22
+ <span className={`${prefixCls}-icon`} aria-hidden="true">
23
+ <UploadIcon size={22} />
24
+ </span>
25
+ <span className={`${prefixCls}-hint`}>
26
+ {hint ?? t('upload.draggerHint')}
27
+ </span>
28
+ </>
29
+ )
30
+ );
31
+ };
10
32
 
11
- const renderChildren = () => {
12
33
  return (
13
- children ?? (
14
- <>
15
- <span className={`${prefixCls}-icon`}>
16
- <UploadIcon size={22} />
17
- </span>
18
- <span className={`${prefixCls}-hint`}>
19
- {hint ?? t('upload.draggerHint')}
20
- </span>
21
- </>
22
- )
34
+ <Upload {...props} type="drag" ref={ref}>
35
+ <div
36
+ className={clsx(prefixCls, {
37
+ [`${prefixCls}-disabled`]: disabled,
38
+ })}
39
+ role="button"
40
+ aria-disabled={disabled}
41
+ tabIndex={disabled ? -1 : 0}
42
+ onKeyDown={(event) => {
43
+ if (event.key === 'Enter' || event.key === ' ') {
44
+ event.preventDefault();
45
+ event.currentTarget.parentElement
46
+ ?.querySelector<HTMLInputElement>('input[type="file"]')
47
+ ?.click();
48
+ }
49
+ }}
50
+ >
51
+ {renderChildren()}
52
+ </div>
53
+ </Upload>
23
54
  );
24
- };
25
-
26
- return (
27
- <Upload {...props} type="drag" ref={ref}>
28
- <div
29
- className={clsx(`${prefixCls}`, {
30
- [`${prefixCls}-disabled`]: disabled,
31
- })}
32
- tabIndex={disabled ? -1 : 0}
33
- onKeyDown={function (e) {
34
- if (e.key === 'Enter') {
35
- (e.target as HTMLDivElement).click();
36
- }
37
- }}
38
- >
39
- {renderChildren()}
40
- </div>
41
- </Upload>
42
- );
43
- });
55
+ },
56
+ );
44
57
 
45
58
  Dragger.displayName = 'Dragger';
46
59
 
@@ -10,7 +10,7 @@ toc: 'content'
10
10
 
11
11
  # Upload <span class="yee-mobile-badge" />
12
12
 
13
- Upload file by selecting or dragging.
13
+ Upload files by selecting or dragging them.
14
14
 
15
15
  ## Code Demo
16
16
 
@@ -20,56 +20,76 @@ Upload file by selecting or dragging.
20
20
  <code src="./demo/directory.tsx" title="Directory" description="Upload directory"></code>
21
21
  <code src="./demo/multiple.tsx" title="Multiple" description="Multiple files upload"></code>
22
22
  <code src="./demo/controlled.tsx" title="Controlled" description="Controlled upload"></code>
23
+ <code src="./demo/auto-upload.tsx" title="Manual Upload" description="Collect files with autoUpload=false and trigger batch upload from an external button via the instance method upload()"></code>
23
24
 
24
25
  ## API
25
26
 
26
27
  ### UploadProps
27
28
 
28
- | Property | Type | Description | Default |
29
- | --- | --- | --- | --- |
30
- | name | `string` | File name passed to backend | `'file'` |
31
- | children | `React.ReactNode` | Children elements | - |
32
- | type | `'drag' \| 'select'` | Upload type | - |
33
- | prefixCls | `string` | Custom class name prefix | - |
34
- | className | `string` | Custom class name | - |
35
- | style | `React.CSSProperties` | Custom style | - |
36
- | progress | `boolean` | Show upload progress | `true` |
37
- | withCredentials | `boolean` | Whether to carry cookies when uploading | - |
38
- | accept | `string` | Accepted file types | - |
39
- | action | `string \| (() => string)` | Upload URL | - |
40
- | data | `Record<string, any> \| ((file: File) => Record<string, any>)` | Additional parameters for upload | - |
41
- | directory | `boolean` | Support uploading folders | - |
42
- | multiple | `boolean` | Support multiple file selection | - |
43
- | disabled | `boolean` | Disabled | - |
44
- | headers | `Record<string, any>` | Set request headers | - |
45
- | maxFileSize | `number` | Max file size limit | - |
46
- | maxCount | `number` | Max file count limit | - |
47
- | listType | `'text' \| 'picture-list' \| 'picture-wall'` | Upload list type | - |
48
- | showUploadList | `boolean \| { showTooltip?: boolean; showRemoveIcon?: boolean; showReload?: boolean; showPreviewIcon?: boolean; removeIcon?: React.ReactNode; reloadIcon?: React.ReactNode; previewIcon?: React.ReactNode; }` | Show upload file list | `true` |
49
- | itemRender | `(file: UploadFile, fileList: UploadFile[]) => React.ReactNode` | Custom upload list item | - |
50
- | defaultFileList | `Array<UploadFile>` | Default upload files | - |
51
- | fileList | `Array<UploadFile>` | Controlled upload files | - |
52
- | beforeUpload | `(file: File, fileList: Array<File>) => boolean \| Promise<File \| boolean>` | Callback before upload | - |
53
- | customRequest | `(options: UploadRequestOptions) => void` | Custom upload implementation | - |
54
- | onChange | `(params: { file: UploadFile; fileList: Array<UploadFile>; event?: any }) => void` | Callback when upload status changes | - |
55
- | onPreview | `(file: UploadFile) => void` | File preview callback | - |
56
- | onRemove | `(file: UploadFile) => boolean \| Promise<boolean>` | Callback when file is removed | - |
57
- | data-* | `string` | - | Supports all data-* attributes, forwarded to root DOM element |
29
+ | Property | Type | Description | Default |
30
+ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------- |
31
+ | name | `string` | File field name sent to the server | `'file'` |
32
+ | children | `React.ReactNode` | Child nodes | - |
33
+ | type | `'drag' \| 'select'` | Upload type | - |
34
+ | prefixCls | `string` | Custom class name prefix | - |
35
+ | className | `string` | Custom class name | - |
36
+ | style | `React.CSSProperties` | Custom inline style | - |
37
+ | progress | `boolean` | Show upload progress | `true` |
38
+ | withCredentials | `boolean` | Send cookies with the upload | - |
39
+ | accept | `string` | Accepted file types; enforced for selection and drop | - |
40
+ | action | `string \| (() => string)` | Upload URL; required without `customRequest` | - |
41
+ | data | `Record<string, any> \| ((file: File) => Record<string, any>)` | Additional upload parameters | - |
42
+ | directory | `boolean` | Support directory upload | - |
43
+ | multiple | `boolean` | Support multiple files | - |
44
+ | disabled | `boolean` | Disable upload | - |
45
+ | headers | `Record<string, any>` | Request headers | - |
46
+ | maxFileSize | `number` | Maximum file size in bytes | - |
47
+ | maxCount | `number` | Maximum file count | - |
48
+ | listType | `'text' \| 'picture-list' \| 'picture-wall'` | Upload list type | `'text'` |
49
+ | showUploadList | `boolean \| { showTooltip?: boolean; showRemoveIcon?: boolean; showReload?: boolean; showPreviewIcon?: boolean; removeIcon?: React.ReactNode; reloadIcon?: React.ReactNode; previewIcon?: React.ReactNode; }` | Show upload file list | `true` |
50
+ | itemRender | `(file: UploadFile, fileList: UploadFile[]) => React.ReactNode` | Custom action content for a list item | - |
51
+ | defaultFileList | `UploadFile[]` | Default uploaded files | - |
52
+ | fileList | `UploadFile[]` | Uploaded files in controlled mode | - |
53
+ | autoUpload | `boolean` | Whether to upload automatically after selection; when `false` files only join the list and are uploaded later via the instance method `upload()` | `true` |
54
+ | beforeUpload | `(file: File, fileList: File[]) => boolean \| File \| PromiseLike<File \| boolean>` | Callback before upload | - |
55
+ | customRequest | `(options: UploadRequestOptions) => void \| (() => void) \| { abort: () => void }` | Custom upload implementation; return an abort handle to cancel on remove, retry, and unmount | - |
56
+ | onChange | `(params: { file: UploadFile; fileList: UploadFile[]; event?: any }) => void` | Upload state callback; `fileList` is the updated list | - |
57
+ | onPreview | `(file: UploadFile) => void` | File preview callback | - |
58
+ | onRemove | `(file: UploadFile) => boolean \| PromiseLike<boolean>` | File removal callback | - |
59
+ | data-\* | `string` | - | Supports all data-\* attributes and forwards them to the root element |
58
60
 
59
61
  ### UploadFile
60
62
 
61
- | Property | Type | Description | Default |
62
- | --- | --- | --- | --- |
63
- | status | `'uploading' \| 'error' \| 'success' \| 'ready'` | File upload status | - |
64
- | uid | `string` | File unique id | - |
65
- | name | `string` | File name | - |
66
- | size | `number` | File size | - |
67
- | percent | `number` | Upload progress | - |
68
- | raw | `File` | Raw file | - |
69
- | type | `string` | File type | - |
70
- | response | `any` | Upload response data | - |
71
- | error | `Error` | Upload error info | - |
63
+ | Property | Type | Description | Default |
64
+ | -------- | ------------------------------------------------ | ----------------------------------------------------------- | ------- |
65
+ | status | `'uploading' \| 'error' \| 'success' \| 'ready'` | File upload status | - |
66
+ | uid | `string` | Unique file ID; generated for files selected through Upload | - |
67
+ | name | `string` | File name | - |
68
+ | size | `number` | File size; optional for remote files | - |
69
+ | percent | `number` | Upload progress | - |
70
+ | raw | `File` | Source file; optional for remote files | - |
71
+ | type | `string` | MIME type or file extension | - |
72
+ | url | `string` | Preview URL for a remote file | - |
73
+ | response | `any` | Upload response data | - |
74
+ | error | `Error` | Upload error | - |
75
+
76
+ ### UploadRequestOptions
77
+
78
+ | Property | Type | Description |
79
+ | ---------- | --------------------------- | ----------------------------- |
80
+ | file | `File` | Source file to upload |
81
+ | onProgress | `(percent: number) => void` | Update upload progress |
82
+ | onError | `(error: Error) => void` | Mark the upload as failed |
83
+ | onSuccess | `(response: any) => void` | Mark the upload as successful |
84
+
85
+ ### Instance Methods (Ref)
86
+
87
+ Access via `ref` as `UploadInstance` (root DOM element plus the methods below):
88
+
89
+ | Method | Type | Description |
90
+ | ------ | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
91
+ | upload | `(file?: UploadFile \| UploadFile[]) => void` | Upload files waiting in the list (`status` of `ready`); without arguments uploads all of them, or pass a single file or a list. Combine with `autoUpload={false}` to trigger uploads manually |
72
92
 
73
93
  ## Notes
74
94
 
75
- - Adapted for mobile (reduced Dragger padding, picture-wall actions always visible, list item touch targets 44px)
95
+ - Adapted for mobile with reduced Dragger padding, always-visible picture-wall actions, and 44px list-item touch targets.
@@ -9,6 +9,13 @@ const Upload = InternalUpload as UploadType;
9
9
 
10
10
  Upload.Dragger = Dragger;
11
11
 
12
- export type { UploadProps } from './interface';
12
+ export type {
13
+ UploadDraggerProps,
14
+ UploadFile,
15
+ UploadInstance,
16
+ UploadProps,
17
+ UploadRequestAbort,
18
+ UploadRequestOptions,
19
+ } from './interface';
13
20
 
14
21
  export default Upload;
@@ -20,56 +20,76 @@ toc: 'content'
20
20
  <code src="./demo/directory.tsx" title="文件夹上传" description="上传文件夹"></code>
21
21
  <code src="./demo/multiple.tsx" title="多文件上传" description="上传多个文件"></code>
22
22
  <code src="./demo/controlled.tsx" title="受控" description="受控的上传"></code>
23
+ <code src="./demo/auto-upload.tsx" title="手动上传" description="autoUpload=false 先收集文件,通过实例方法 upload() 在外部按钮触发批量上传"></code>
23
24
 
24
25
  ## API
25
26
 
26
27
  ### UploadProps
27
28
 
28
- | 属性名 | 类型 | 描述 | 默认值 |
29
- | --- | --- | --- | --- |
30
- | name | `string` | 传递到后台的文件名 | `'file'` |
31
- | children | `React.ReactNode` | 子节点 | - |
32
- | type | `'drag' \| 'select'` | 上传类型 | - |
33
- | prefixCls | `string` | 自定义类名前缀 | - |
34
- | className | `string` | 自定义类名 | - |
35
- | style | `React.CSSProperties` | 自定义行内样式 | - |
36
- | progress | `boolean` | 是否显示上传进度 | `true` |
37
- | withCredentials | `boolean` | 上传是否携带cookie | - |
38
- | accept | `string` | 接受上传的文件类型 | - |
39
- | action | `string \| (() => string)` | 上传的地址 | - |
40
- | data | `Record<string, any> \| ((file: File) => Record<string, any>)` | 上传额外需要的参数 | - |
41
- | directory | `boolean` | 是否支持上传文件夹 | - |
42
- | multiple | `boolean` | 是否支持多选文件 | - |
43
- | disabled | `boolean` | 是否被禁用 | - |
44
- | headers | `Record<string, any>` | 设置上传的请求头 | - |
45
- | maxFileSize | `number` | 文件最大大小限制 | - |
46
- | maxCount | `number` | 最大文件数量限制 | - |
47
- | listType | `'text' \| 'picture-list' \| 'picture-wall'` | 设置上传列表类型 | - |
48
- | showUploadList | `boolean \| { showTooltip?: boolean; showRemoveIcon?: boolean; showReload?: boolean; showPreviewIcon?: boolean; removeIcon?: React.ReactNode; reloadIcon?: React.ReactNode; previewIcon?: React.ReactNode; }` | 是否显示上传文件列表 | `true` |
49
- | itemRender | `(file: UploadFile, fileList: UploadFile[]) => React.ReactNode` | 自定义上传列表项 | - |
50
- | defaultFileList | `Array<UploadFile>` | 默认上传文件 | - |
51
- | fileList | `Array<UploadFile>` | 受控状态的上传文件 | - |
52
- | beforeUpload | `(file: File, fileList: Array<File>) => boolean \| Promise<File \| boolean>` | 上传文件之前的回调函数 | - |
53
- | customRequest | `(options: UploadRequestOptions) => void` | 自定义上传实现 | - |
54
- | onChange | `(params: { file: UploadFile; fileList: Array<UploadFile>; event?: any }) => void` | 上传状态变化的回调 | - |
55
- | onPreview | `(file: UploadFile) => void` | 文件预览回调 | - |
56
- | onRemove | `(file: UploadFile) => boolean \| Promise<boolean>` | 删除文件的回调 | - |
57
- | data-* | `string` | - | 支持所有 data-* 属性,透传到组件根 DOM 元素 |
29
+ | 属性名 | 类型 | 描述 | 默认值 |
30
+ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | -------------------------------------------- |
31
+ | name | `string` | 传递到后台的文件名 | `'file'` |
32
+ | children | `React.ReactNode` | 子节点 | - |
33
+ | type | `'drag' \| 'select'` | 上传类型 | - |
34
+ | prefixCls | `string` | 自定义类名前缀 | - |
35
+ | className | `string` | 自定义类名 | - |
36
+ | style | `React.CSSProperties` | 自定义行内样式 | - |
37
+ | progress | `boolean` | 是否显示上传进度 | `true` |
38
+ | withCredentials | `boolean` | 上传是否携带 cookie | - |
39
+ | accept | `string` | 接受上传的文件类型;选择和拖放均会校验 | - |
40
+ | action | `string \| (() => string)` | 上传地址;未设置 `customRequest` 时必填 | - |
41
+ | data | `Record<string, any> \| ((file: File) => Record<string, any>)` | 上传额外需要的参数 | - |
42
+ | directory | `boolean` | 是否支持上传文件夹 | - |
43
+ | multiple | `boolean` | 是否支持多选文件 | - |
44
+ | disabled | `boolean` | 是否被禁用 | - |
45
+ | headers | `Record<string, any>` | 设置上传请求头 | - |
46
+ | maxFileSize | `number` | 文件最大大小限制,单位字节 | - |
47
+ | maxCount | `number` | 最大文件数量限制 | - |
48
+ | listType | `'text' \| 'picture-list' \| 'picture-wall'` | 设置上传列表类型 | `'text'` |
49
+ | showUploadList | `boolean \| { showTooltip?: boolean; showRemoveIcon?: boolean; showReload?: boolean; showPreviewIcon?: boolean; removeIcon?: React.ReactNode; reloadIcon?: React.ReactNode; previewIcon?: React.ReactNode; }` | 是否显示上传文件列表 | `true` |
50
+ | itemRender | `(file: UploadFile, fileList: UploadFile[]) => React.ReactNode` | 自定义上传列表项操作内容 | - |
51
+ | defaultFileList | `UploadFile[]` | 默认上传文件 | - |
52
+ | fileList | `UploadFile[]` | 受控状态的上传文件 | - |
53
+ | autoUpload | `boolean` | 选择文件后是否自动上传;为 `false` 时文件仅进入列表,稍后通过实例方法 `upload()` 触发上传 | `true` |
54
+ | beforeUpload | `(file: File, fileList: File[]) => boolean \| File \| PromiseLike<File \| boolean>` | 上传文件之前的回调 | - |
55
+ | customRequest | `(options: UploadRequestOptions) => void \| (() => void) \| { abort: () => void }` | 自定义上传实现;返回取消句柄后,删除、重试和卸载会取消请求 | - |
56
+ | onChange | `(params: { file: UploadFile; fileList: UploadFile[]; event?: any }) => void` | 上传状态变化回调,`fileList` 为变化后的列表 | - |
57
+ | onPreview | `(file: UploadFile) => void` | 文件预览回调 | - |
58
+ | onRemove | `(file: UploadFile) => boolean \| PromiseLike<boolean>` | 删除文件的回调 | - |
59
+ | data-\* | `string` | - | 支持所有 data-\* 属性,透传到组件根 DOM 元素 |
58
60
 
59
61
  ### UploadFile
60
62
 
61
- | 属性名 | 类型 | 描述 | 默认值 |
62
- | --- | --- | --- | --- |
63
- | status | `'uploading' \| 'error' \| 'success' \| 'ready'` | 文件上传状态 | - |
64
- | uid | `string` | 文件唯一id,未设置会自动生成 | - |
65
- | name | `string` | 文件名 | - |
66
- | size | `number` | 文件大小 | - |
67
- | percent | `number` | 上传进度 | - |
68
- | raw | `File` | 源文件 | - |
69
- | type | `string` | 文件类型,根据文件后缀名判断 | - |
70
- | response | `any` | 上传响应数据 | - |
71
- | error | `Error` | 上传错误信息 | - |
63
+ | 属性名 | 类型 | 描述 | 默认值 |
64
+ | -------- | ------------------------------------------------ | ------------------------------------- | ------ |
65
+ | status | `'uploading' \| 'error' \| 'success' \| 'ready'` | 文件上传状态 | - |
66
+ | uid | `string` | 文件唯一 ID;组件选择的文件会自动生成 | - |
67
+ | name | `string` | 文件名 | - |
68
+ | size | `number` | 文件大小;服务端文件可省略 | - |
69
+ | percent | `number` | 上传进度 | - |
70
+ | raw | `File` | 源文件;服务端文件可省略 | - |
71
+ | type | `string` | MIME 类型或文件扩展名 | - |
72
+ | url | `string` | 服务端文件的预览地址 | - |
73
+ | response | `any` | 上传响应数据 | - |
74
+ | error | `Error` | 上传错误信息 | - |
75
+
76
+ ### UploadRequestOptions
77
+
78
+ | 属性名 | 类型 | 描述 |
79
+ | ---------- | --------------------------- | ------------ |
80
+ | file | `File` | 待上传源文件 |
81
+ | onProgress | `(percent: number) => void` | 更新上传进度 |
82
+ | onError | `(error: Error) => void` | 标记上传失败 |
83
+ | onSuccess | `(response: any) => void` | 标记上传成功 |
84
+
85
+ ### 实例方法(Ref)
86
+
87
+ 通过 `ref` 获取 `UploadInstance`(根 DOM 元素 + 以下方法):
88
+
89
+ | 方法 | 类型 | 描述 |
90
+ | ------ | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
91
+ | upload | `(file?: UploadFile \| UploadFile[]) => void` | 上传列表中等待的文件(`status` 为 `ready`);不传参数上传全部,也可指定单个或多个。配合 `autoUpload={false}` 手动触发上传 |
72
92
 
73
93
  ## 注意事项
74
94
 
75
- - 已适配移动端(减小 Dragger 内边距、图片墙操作按钮常显、列表项触控区域 44px)
95
+ - 已适配移动端(减小 Dragger 内边距、图片墙操作按钮常显、列表项触控区域 44px)