@transferwise/components 0.0.0-experimental-438bbba → 0.0.0-experimental-cf33ac7
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.
- package/build/card/Card.js.map +1 -1
- package/build/card/Card.mjs.map +1 -1
- package/build/circularButton/CircularButton.js.map +1 -1
- package/build/circularButton/CircularButton.mjs.map +1 -1
- package/build/common/locale/index.js.map +1 -1
- package/build/common/locale/index.mjs.map +1 -1
- package/build/dateLookup/tableLink/TableLink.js.map +1 -1
- package/build/dateLookup/tableLink/TableLink.mjs.map +1 -1
- package/build/instructionsList/InstructionsList.js.map +1 -1
- package/build/instructionsList/InstructionsList.mjs.map +1 -1
- package/build/main.css +210 -210
- package/build/styles/main.css +210 -210
- package/build/styles/uploadInput/UploadInput.css +13 -81
- package/build/styles/uploadInput/uploadButton/UploadButton.css +78 -31
- package/build/styles/uploadInput/uploadItem/UploadItem.css +130 -109
- package/build/types/card/Card.d.ts.map +1 -1
- package/build/types/circularButton/CircularButton.d.ts.map +1 -1
- package/build/types/instructionsList/InstructionsList.d.ts.map +1 -1
- package/build/types/uploadInput/UploadInput.d.ts.map +1 -1
- package/build/types/uploadInput/uploadButton/UploadButton.d.ts +6 -1
- package/build/types/uploadInput/uploadButton/UploadButton.d.ts.map +1 -1
- package/build/types/uploadInput/uploadItem/UploadItem.d.ts +1 -5
- package/build/types/uploadInput/uploadItem/UploadItem.d.ts.map +1 -1
- package/build/types/uploadInput/uploadItem/UploadItemLink.d.ts +5 -5
- package/build/types/uploadInput/uploadItem/UploadItemLink.d.ts.map +1 -1
- package/build/uploadInput/UploadInput.js +28 -38
- package/build/uploadInput/UploadInput.js.map +1 -1
- package/build/uploadInput/UploadInput.mjs +29 -39
- package/build/uploadInput/UploadInput.mjs.map +1 -1
- package/build/uploadInput/uploadButton/UploadButton.js +31 -38
- package/build/uploadInput/uploadButton/UploadButton.js.map +1 -1
- package/build/uploadInput/uploadButton/UploadButton.mjs +32 -39
- package/build/uploadInput/uploadButton/UploadButton.mjs.map +1 -1
- package/build/uploadInput/uploadItem/UploadItem.js +33 -56
- package/build/uploadInput/uploadItem/UploadItem.js.map +1 -1
- package/build/uploadInput/uploadItem/UploadItem.mjs +34 -57
- package/build/uploadInput/uploadItem/UploadItem.mjs.map +1 -1
- package/build/uploadInput/uploadItem/UploadItemLink.js +5 -7
- package/build/uploadInput/uploadItem/UploadItemLink.js.map +1 -1
- package/build/uploadInput/uploadItem/UploadItemLink.mjs +5 -7
- package/build/uploadInput/uploadItem/UploadItemLink.mjs.map +1 -1
- package/package.json +3 -3
- package/src/card/Card.spec.tsx +5 -4
- package/src/card/Card.story.tsx +6 -4
- package/src/card/Card.tsx +2 -3
- package/src/circularButton/CircularButton.tsx +1 -1
- package/src/common/locale/index.ts +1 -1
- package/src/dateLookup/tableLink/TableLink.tsx +15 -15
- package/src/instructionsList/InstructionsList.tsx +4 -1
- package/src/main.css +210 -210
- package/src/uploadInput/UploadInput.css +13 -81
- package/src/uploadInput/UploadInput.less +17 -79
- package/src/uploadInput/UploadInput.tests.story.tsx +8 -3
- package/src/uploadInput/UploadInput.tsx +41 -68
- package/src/uploadInput/uploadButton/UploadButton.css +78 -31
- package/src/uploadInput/uploadButton/UploadButton.less +78 -35
- package/src/uploadInput/uploadButton/UploadButton.tsx +153 -147
- package/src/uploadInput/uploadItem/UploadItem.css +130 -109
- package/src/uploadInput/uploadItem/UploadItem.less +129 -118
- package/src/uploadInput/uploadItem/UploadItem.tsx +123 -146
- package/src/uploadInput/uploadItem/UploadItemLink.tsx +25 -23
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Upload, PlusCircle } from '@transferwise/icons';
|
|
2
2
|
import { clsx } from 'clsx';
|
|
3
|
-
import {
|
|
3
|
+
import { useRef, useState } from 'react';
|
|
4
4
|
import { useIntl } from 'react-intl';
|
|
5
5
|
import Body from '../../body/Body.mjs';
|
|
6
6
|
import MESSAGES from './UploadButton.messages.mjs';
|
|
@@ -18,8 +18,9 @@ const onDragOver = event => {
|
|
|
18
18
|
event.preventDefault();
|
|
19
19
|
};
|
|
20
20
|
const DEFAULT_FILE_INPUT_ID = 'np-upload-button';
|
|
21
|
-
const UploadButton =
|
|
21
|
+
const UploadButton = ({
|
|
22
22
|
disabled,
|
|
23
|
+
withEntries,
|
|
23
24
|
multiple,
|
|
24
25
|
description,
|
|
25
26
|
fileTypes = imageFileTypes,
|
|
@@ -28,11 +29,11 @@ const UploadButton = /*#__PURE__*/forwardRef(({
|
|
|
28
29
|
onChange,
|
|
29
30
|
id = DEFAULT_FILE_INPUT_ID,
|
|
30
31
|
uploadButtonTitle
|
|
31
|
-
}
|
|
32
|
+
}) => {
|
|
32
33
|
const {
|
|
33
34
|
formatMessage
|
|
34
35
|
} = useIntl();
|
|
35
|
-
const
|
|
36
|
+
const inputReference = useRef(null);
|
|
36
37
|
const [isDropping, setIsDropping] = useState(false);
|
|
37
38
|
const dragCounter = useRef(0);
|
|
38
39
|
const reset = () => {
|
|
@@ -66,8 +67,8 @@ const UploadButton = /*#__PURE__*/forwardRef(({
|
|
|
66
67
|
} = event.target;
|
|
67
68
|
if (files) {
|
|
68
69
|
onChange(files);
|
|
69
|
-
if (
|
|
70
|
-
|
|
70
|
+
if (inputReference.current) {
|
|
71
|
+
inputReference.current.value = '';
|
|
71
72
|
}
|
|
72
73
|
}
|
|
73
74
|
};
|
|
@@ -104,9 +105,7 @@ const UploadButton = /*#__PURE__*/forwardRef(({
|
|
|
104
105
|
}
|
|
105
106
|
function renderDescription() {
|
|
106
107
|
return /*#__PURE__*/jsxs(Body, {
|
|
107
|
-
className:
|
|
108
|
-
'text-primary': !disabled
|
|
109
|
-
}),
|
|
108
|
+
className: "np-upload-input__text",
|
|
110
109
|
children: [getDescription(), maxFiles && /*#__PURE__*/jsxs(Fragment, {
|
|
111
110
|
children: [/*#__PURE__*/jsx("br", {}), `Maximum ${maxFiles} files.`]
|
|
112
111
|
})]
|
|
@@ -118,52 +117,46 @@ const UploadButton = /*#__PURE__*/forwardRef(({
|
|
|
118
117
|
}
|
|
119
118
|
return formatMessage(multiple ? MESSAGES.uploadFiles : MESSAGES.uploadFile);
|
|
120
119
|
}
|
|
121
|
-
return /*#__PURE__*/jsxs("
|
|
122
|
-
className: clsx('np-upload-button
|
|
123
|
-
'
|
|
120
|
+
return /*#__PURE__*/jsxs("label", {
|
|
121
|
+
className: clsx('np-upload-input__upload-button', `np-upload-input__upload-button--${disabled ? 'disabled' : 'enabled'}`, `np-upload-input__upload-button--${withEntries ? 'with' : 'without'}-entries`, {
|
|
122
|
+
'is-dropping': isDropping
|
|
124
123
|
}),
|
|
124
|
+
htmlFor: id,
|
|
125
125
|
...(!disabled && {
|
|
126
126
|
onDragEnter,
|
|
127
127
|
onDragLeave,
|
|
128
128
|
onDrop,
|
|
129
129
|
onDragOver
|
|
130
130
|
}),
|
|
131
|
-
children: [/*#__PURE__*/jsx("
|
|
132
|
-
|
|
133
|
-
|
|
131
|
+
children: [/*#__PURE__*/jsx("span", {
|
|
132
|
+
className: "np-upload-input__icon",
|
|
133
|
+
children: /*#__PURE__*/jsx(Upload, {
|
|
134
|
+
size: 24,
|
|
135
|
+
className: "text-link"
|
|
136
|
+
})
|
|
137
|
+
}), /*#__PURE__*/jsxs("div", {
|
|
138
|
+
className: "np-upload-input__item-content",
|
|
139
|
+
"data-testid": TEST_IDS.mediaBody,
|
|
140
|
+
children: [/*#__PURE__*/jsx(Body, {
|
|
141
|
+
type: Typography.BODY_LARGE_BOLD,
|
|
142
|
+
className: "np-upload-input__title",
|
|
143
|
+
children: renderButtonTitle()
|
|
144
|
+
}), renderDescription()]
|
|
145
|
+
}), /*#__PURE__*/jsx("input", {
|
|
146
|
+
ref: inputReference,
|
|
147
|
+
className: "np-upload-input__upload-button-input sr-only",
|
|
134
148
|
type: "file",
|
|
149
|
+
id: id,
|
|
135
150
|
...getAcceptedTypes(),
|
|
136
151
|
...(multiple && {
|
|
137
152
|
multiple: true
|
|
138
153
|
}),
|
|
139
|
-
className: "tw-droppable-input",
|
|
140
154
|
disabled: disabled,
|
|
141
155
|
name: "file-upload",
|
|
142
156
|
"data-testid": TEST_IDS.uploadInput,
|
|
143
157
|
onChange: filesSelected
|
|
144
|
-
}), /*#__PURE__*/jsx("label", {
|
|
145
|
-
htmlFor: id,
|
|
146
|
-
className: clsx('btn', 'np-upload-button'),
|
|
147
|
-
children: /*#__PURE__*/jsxs("div", {
|
|
148
|
-
className: "media",
|
|
149
|
-
children: [/*#__PURE__*/jsx("div", {
|
|
150
|
-
className: "np-upload-icon media-middle media-left",
|
|
151
|
-
children: /*#__PURE__*/jsx(Upload, {
|
|
152
|
-
size: 24,
|
|
153
|
-
className: "text-link"
|
|
154
|
-
})
|
|
155
|
-
}), /*#__PURE__*/jsxs("div", {
|
|
156
|
-
className: "media-body text-xs-left",
|
|
157
|
-
"data-testid": TEST_IDS.mediaBody,
|
|
158
|
-
children: [/*#__PURE__*/jsx(Body, {
|
|
159
|
-
type: Typography.BODY_LARGE_BOLD,
|
|
160
|
-
className: "d-block",
|
|
161
|
-
children: renderButtonTitle()
|
|
162
|
-
}), renderDescription()]
|
|
163
|
-
})]
|
|
164
|
-
})
|
|
165
158
|
}), isDropping && /*#__PURE__*/jsxs("div", {
|
|
166
|
-
className: clsx('droppable-card', 'droppable-dropping-card', 'droppable-card-content'),
|
|
159
|
+
className: clsx('np-upload-input__drop-file-overlay', 'droppable-card', 'droppable-dropping-card', 'droppable-card-content'),
|
|
167
160
|
children: [/*#__PURE__*/jsx(PlusCircle, {
|
|
168
161
|
className: "m-x-1",
|
|
169
162
|
size: 24
|
|
@@ -172,7 +165,7 @@ const UploadButton = /*#__PURE__*/forwardRef(({
|
|
|
172
165
|
})]
|
|
173
166
|
})]
|
|
174
167
|
});
|
|
175
|
-
}
|
|
168
|
+
};
|
|
176
169
|
|
|
177
170
|
export { TEST_IDS, UploadButton as default };
|
|
178
171
|
//# sourceMappingURL=UploadButton.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UploadButton.mjs","sources":["../../../src/uploadInput/uploadButton/UploadButton.tsx"],"sourcesContent":["import { PlusCircle as PlusIcon, Upload as UploadIcon } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport { ChangeEvent, DragEvent, useRef, useState, forwardRef, RefObject } from 'react';\nimport { useIntl } from 'react-intl';\n\nimport Body from '../../body';\nimport { FileType, Typography } from '../../common';\n\nimport MESSAGES from './UploadButton.messages';\nimport { DEFAULT_SIZE_LIMIT, imageFileTypes } from './defaults';\nimport getAllowedFileTypes from './getAllowedFileTypes';\n\ntype AllowedFileTypes = string | readonly string[] | readonly FileType[];\nexport type UploadButtonProps = {\n /**\n * Disable the upload button if your app is not yet ready to accept uploads\n */\n disabled?: boolean;\n\n /**\n * Allow multiple file uploads\n */\n multiple?: boolean;\n\n /**\n * List of allowed filetypes, eg. '*' | '.zip,application/zip' | ['.jpg,.jpeg,image/jpeg', '.png,image/png'] (default: image files + PDF)\n */\n fileTypes?: AllowedFileTypes;\n\n /**\n * Size limit in KBs 1000 KB = 1 MB (default: 5000 KB)\n */\n sizeLimit?: number;\n\n /**\n * Description for the upload button\n */\n description?: string | undefined;\n\n /**\n * Maximum number of files allowed, if provided, shows error below file item\n */\n maxFiles?: number;\n\n /**\n * Called when some files were successfully selected\n *\n * @param files\n */\n onChange: (files: FileList) => void;\n\n /**\n * Id for the upload input\n */\n id?: string;\n\n /**\n * Title for the upload button\n */\n uploadButtonTitle?: string;\n};\n\nexport enum TEST_IDS {\n uploadInput = 'uploadInput',\n mediaBody = 'mediaBody',\n}\n\nconst onDragOver = (event: DragEvent): void => {\n event.preventDefault();\n};\n\nconst DEFAULT_FILE_INPUT_ID = 'np-upload-button';\nconst UploadButton = forwardRef<HTMLInputElement, UploadButtonProps>(\n (\n {\n disabled,\n multiple,\n description,\n fileTypes = imageFileTypes,\n sizeLimit = DEFAULT_SIZE_LIMIT,\n maxFiles,\n onChange,\n id = DEFAULT_FILE_INPUT_ID,\n uploadButtonTitle,\n },\n ref,\n ) => {\n const { formatMessage } = useIntl();\n const inputRef = useRef<HTMLInputElement>(null);\n\n const [isDropping, setIsDropping] = useState(false);\n\n const dragCounter = useRef(0);\n\n const reset = (): void => {\n dragCounter.current = 0;\n setIsDropping(false);\n };\n\n const onDragLeave = (event: DragEvent): void => {\n event.preventDefault();\n dragCounter.current -= 1;\n if (dragCounter.current === 0) {\n setIsDropping(false);\n }\n };\n\n const onDragEnter = (event: DragEvent): void => {\n event.preventDefault();\n dragCounter.current += 1;\n if (dragCounter.current === 1) {\n setIsDropping(true);\n }\n };\n\n const onDrop = (event: DragEvent): void => {\n event.preventDefault();\n reset();\n if (event.dataTransfer && event.dataTransfer.files && event.dataTransfer.files[0]) {\n onChange(event.dataTransfer.files);\n }\n };\n\n const filesSelected = (event: ChangeEvent<HTMLInputElement>): void => {\n const { files } = event.target;\n\n if (files) {\n onChange(files);\n\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n }\n };\n\n const getFileTypesDescription = (): string => {\n if (fileTypes === '*') {\n return fileTypes;\n }\n\n return getAllowedFileTypes(Array.isArray(fileTypes) ? fileTypes : [fileTypes]).join(', ');\n };\n\n function getDescription() {\n if (description) {\n return description;\n }\n\n const fileTypesDescription = getFileTypesDescription();\n\n const derivedFileDescription =\n fileTypesDescription === '*' ? formatMessage(MESSAGES.allFileTypes) : fileTypesDescription;\n\n return formatMessage(MESSAGES.instructions, {\n fileTypes: derivedFileDescription,\n size: Math.round(sizeLimit / 1000),\n });\n }\n\n function getAcceptedTypes(): Pick<React.ComponentPropsWithoutRef<'input'>, 'accept'> {\n const areAllFilesAllowed = getFileTypesDescription() === '*';\n\n if (areAllFilesAllowed) {\n return {}; // file input by default allows all files\n }\n\n if (Array.isArray(fileTypes)) {\n return { accept: fileTypes.join(',') };\n }\n\n return { accept: fileTypes as string };\n }\n\n function renderDescription() {\n return (\n <Body className={clsx({ 'text-primary': !disabled })}>\n {getDescription()}\n {maxFiles && (\n <>\n <br />\n {`Maximum ${maxFiles} files.`}\n </>\n )}\n </Body>\n );\n }\n\n function renderButtonTitle() {\n if (uploadButtonTitle) {\n return uploadButtonTitle;\n }\n return formatMessage(multiple ? MESSAGES.uploadFiles : MESSAGES.uploadFile);\n }\n\n return (\n <div\n className={clsx('np-upload-button-container', 'droppable', {\n 'droppable-dropping': isDropping,\n })}\n {...(!disabled && { onDragEnter, onDragLeave, onDrop, onDragOver })}\n >\n <input\n ref={ref}\n id={id}\n type=\"file\"\n {...getAcceptedTypes()}\n {...(multiple && { multiple: true })}\n className=\"tw-droppable-input\"\n disabled={disabled}\n name=\"file-upload\"\n data-testid={TEST_IDS.uploadInput}\n onChange={filesSelected}\n />\n {/* eslint-disable-next-line jsx-a11y/label-has-associated-control */}\n <label htmlFor={id} className={clsx('btn', 'np-upload-button')}>\n <div className=\"media\">\n <div className=\"np-upload-icon media-middle media-left\">\n <UploadIcon size={24} className=\"text-link\" />\n </div>\n <div className=\"media-body text-xs-left\" data-testid={TEST_IDS.mediaBody}>\n <Body type={Typography.BODY_LARGE_BOLD} className=\"d-block\">\n {renderButtonTitle()}\n </Body>\n {renderDescription()}\n </div>\n </div>\n </label>\n\n {/* Drop area overlay */}\n {isDropping && (\n <div\n className={clsx('droppable-card', 'droppable-dropping-card', 'droppable-card-content')}\n >\n <PlusIcon className=\"m-x-1\" size={24} />\n <div>{formatMessage(MESSAGES.dropFile)}</div>\n </div>\n )}\n </div>\n );\n },\n);\n\nexport default UploadButton;\n"],"names":["TEST_IDS","onDragOver","event","preventDefault","DEFAULT_FILE_INPUT_ID","UploadButton","forwardRef","disabled","multiple","description","fileTypes","imageFileTypes","sizeLimit","DEFAULT_SIZE_LIMIT","maxFiles","onChange","id","uploadButtonTitle","ref","formatMessage","useIntl","inputRef","useRef","isDropping","setIsDropping","useState","dragCounter","reset","current","onDragLeave","onDragEnter","onDrop","dataTransfer","files","filesSelected","target","value","getFileTypesDescription","getAllowedFileTypes","Array","isArray","join","getDescription","fileTypesDescription","derivedFileDescription","MESSAGES","allFileTypes","instructions","size","Math","round","getAcceptedTypes","areAllFilesAllowed","accept","renderDescription","_jsxs","Body","className","clsx","children","_Fragment","_jsx","renderButtonTitle","uploadFiles","uploadFile","type","name","uploadInput","htmlFor","UploadIcon","mediaBody","Typography","BODY_LARGE_BOLD","PlusIcon","dropFile"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UploadButton.mjs","sources":["../../../src/uploadInput/uploadButton/UploadButton.tsx"],"sourcesContent":["import { PlusCircle as PlusIcon, Upload as UploadIcon } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport { ChangeEvent, DragEvent, useRef, useState } from 'react';\nimport { useIntl } from 'react-intl';\n\nimport Body from '../../body';\nimport { FileType, Typography } from '../../common';\n\nimport MESSAGES from './UploadButton.messages';\nimport { DEFAULT_SIZE_LIMIT, imageFileTypes } from './defaults';\nimport getAllowedFileTypes from './getAllowedFileTypes';\n\ntype AllowedFileTypes = string | readonly string[] | readonly FileType[];\nexport type UploadButtonProps = {\n /**\n * Disable the upload button if your app is not yet ready to accept uploads\n */\n disabled?: boolean;\n\n /**\n * Should be true, if the UploadInput has at least 1\n * file (valid or invalid) listed.\n */\n withEntries?: boolean;\n\n /**\n * Allow multiple file uploads\n */\n multiple?: boolean;\n\n /**\n * List of allowed filetypes, eg. '*' | '.zip,application/zip' | ['.jpg,.jpeg,image/jpeg', '.png,image/png'] (default: image files + PDF)\n */\n fileTypes?: AllowedFileTypes;\n\n /**\n * Size limit in KBs 1000 KB = 1 MB (default: 5000 KB)\n */\n sizeLimit?: number;\n\n /**\n * Description for the upload button\n */\n description?: string | undefined;\n\n /**\n * Maximum number of files allowed, if provided, shows error below file item\n */\n maxFiles?: number;\n\n /**\n * Called when some files were successfully selected\n *\n * @param files\n */\n onChange: (files: FileList) => void;\n\n /**\n * Id for the upload input\n */\n id?: string;\n\n /**\n * Title for the upload button\n */\n uploadButtonTitle?: string;\n};\n\nexport enum TEST_IDS {\n uploadInput = 'uploadInput',\n mediaBody = 'mediaBody',\n}\n\nconst onDragOver = (event: DragEvent): void => {\n event.preventDefault();\n};\n\nconst DEFAULT_FILE_INPUT_ID = 'np-upload-button';\nconst UploadButton = ({\n disabled,\n withEntries,\n multiple,\n description,\n fileTypes = imageFileTypes,\n sizeLimit = DEFAULT_SIZE_LIMIT,\n maxFiles,\n onChange,\n id = DEFAULT_FILE_INPUT_ID,\n uploadButtonTitle,\n}: UploadButtonProps) => {\n const { formatMessage } = useIntl();\n const inputReference = useRef<HTMLInputElement>(null);\n\n const [isDropping, setIsDropping] = useState(false);\n\n const dragCounter = useRef(0);\n\n const reset = (): void => {\n dragCounter.current = 0;\n setIsDropping(false);\n };\n\n const onDragLeave = (event: DragEvent): void => {\n event.preventDefault();\n dragCounter.current -= 1;\n if (dragCounter.current === 0) {\n setIsDropping(false);\n }\n };\n\n const onDragEnter = (event: DragEvent): void => {\n event.preventDefault();\n dragCounter.current += 1;\n if (dragCounter.current === 1) {\n setIsDropping(true);\n }\n };\n\n const onDrop = (event: DragEvent): void => {\n event.preventDefault();\n reset();\n if (event.dataTransfer && event.dataTransfer.files && event.dataTransfer.files[0]) {\n onChange(event.dataTransfer.files);\n }\n };\n\n const filesSelected = (event: ChangeEvent<HTMLInputElement>): void => {\n const { files } = event.target;\n\n if (files) {\n onChange(files);\n\n if (inputReference.current) {\n inputReference.current.value = '';\n }\n }\n };\n\n const getFileTypesDescription = (): string => {\n if (fileTypes === '*') {\n return fileTypes;\n }\n\n return getAllowedFileTypes(Array.isArray(fileTypes) ? fileTypes : [fileTypes]).join(', ');\n };\n\n function getDescription() {\n if (description) {\n return description;\n }\n\n const fileTypesDescription = getFileTypesDescription();\n\n const derivedFileDescription =\n fileTypesDescription === '*' ? formatMessage(MESSAGES.allFileTypes) : fileTypesDescription;\n\n return formatMessage(MESSAGES.instructions, {\n fileTypes: derivedFileDescription,\n size: Math.round(sizeLimit / 1000),\n });\n }\n\n function getAcceptedTypes(): Pick<React.ComponentPropsWithoutRef<'input'>, 'accept'> {\n const areAllFilesAllowed = getFileTypesDescription() === '*';\n\n if (areAllFilesAllowed) {\n return {}; // file input by default allows all files\n }\n\n if (Array.isArray(fileTypes)) {\n return { accept: fileTypes.join(',') };\n }\n\n return { accept: fileTypes as string };\n }\n\n function renderDescription() {\n return (\n <Body className=\"np-upload-input__text\">\n {getDescription()}\n {maxFiles && (\n <>\n <br />\n {`Maximum ${maxFiles} files.`}\n </>\n )}\n </Body>\n );\n }\n\n function renderButtonTitle() {\n if (uploadButtonTitle) {\n return uploadButtonTitle;\n }\n return formatMessage(multiple ? MESSAGES.uploadFiles : MESSAGES.uploadFile);\n }\n\n return (\n <label\n className={clsx(\n 'np-upload-input__upload-button',\n `np-upload-input__upload-button--${disabled ? 'disabled' : 'enabled'}`,\n `np-upload-input__upload-button--${withEntries ? 'with' : 'without'}-entries`,\n {\n 'is-dropping': isDropping,\n },\n )}\n htmlFor={id}\n {...(!disabled && { onDragEnter, onDragLeave, onDrop, onDragOver })}\n >\n <span className=\"np-upload-input__icon\">\n <UploadIcon size={24} className=\"text-link\" />\n </span>\n <div className=\"np-upload-input__item-content\" data-testid={TEST_IDS.mediaBody}>\n <Body type={Typography.BODY_LARGE_BOLD} className=\"np-upload-input__title\">\n {renderButtonTitle()}\n </Body>\n {renderDescription()}\n </div>\n <input\n ref={inputReference}\n className=\"np-upload-input__upload-button-input sr-only\"\n type=\"file\"\n id={id}\n {...getAcceptedTypes()}\n {...(multiple && { multiple: true })}\n disabled={disabled}\n name=\"file-upload\"\n data-testid={TEST_IDS.uploadInput}\n onChange={filesSelected}\n />\n {isDropping && (\n <div\n className={clsx(\n 'np-upload-input__drop-file-overlay',\n 'droppable-card',\n 'droppable-dropping-card',\n 'droppable-card-content',\n )}\n >\n <PlusIcon className=\"m-x-1\" size={24} />\n <div>{formatMessage(MESSAGES.dropFile)}</div>\n </div>\n )}\n </label>\n );\n};\n\nexport default UploadButton;\n"],"names":["TEST_IDS","onDragOver","event","preventDefault","DEFAULT_FILE_INPUT_ID","UploadButton","disabled","withEntries","multiple","description","fileTypes","imageFileTypes","sizeLimit","DEFAULT_SIZE_LIMIT","maxFiles","onChange","id","uploadButtonTitle","formatMessage","useIntl","inputReference","useRef","isDropping","setIsDropping","useState","dragCounter","reset","current","onDragLeave","onDragEnter","onDrop","dataTransfer","files","filesSelected","target","value","getFileTypesDescription","getAllowedFileTypes","Array","isArray","join","getDescription","fileTypesDescription","derivedFileDescription","MESSAGES","allFileTypes","instructions","size","Math","round","getAcceptedTypes","areAllFilesAllowed","accept","renderDescription","_jsxs","Body","className","children","_Fragment","_jsx","renderButtonTitle","uploadFiles","uploadFile","clsx","htmlFor","UploadIcon","mediaBody","type","Typography","BODY_LARGE_BOLD","ref","name","uploadInput","PlusIcon","dropFile"],"mappings":"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"}
|
|
@@ -4,7 +4,6 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var icons = require('@transferwise/icons');
|
|
6
6
|
var clsx = require('clsx');
|
|
7
|
-
var React = require('react');
|
|
8
7
|
var reactIntl = require('react-intl');
|
|
9
8
|
var Body = require('../../body/Body.js');
|
|
10
9
|
var ProcessIndicator = require('../../processIndicator/ProcessIndicator.js');
|
|
@@ -12,21 +11,21 @@ var UploadItem_messages = require('./UploadItem.messages.js');
|
|
|
12
11
|
var UploadItemLink = require('./UploadItemLink.js');
|
|
13
12
|
var jsxRuntime = require('react/jsx-runtime');
|
|
14
13
|
var status = require('../../common/propsValues/status.js');
|
|
15
|
-
var size = require('../../common/propsValues/size.js');
|
|
16
14
|
var typography = require('../../common/propsValues/typography.js');
|
|
15
|
+
var size = require('../../common/propsValues/size.js');
|
|
17
16
|
|
|
18
17
|
exports.TEST_IDS = void 0;
|
|
19
18
|
(function (TEST_IDS) {
|
|
20
19
|
TEST_IDS["uploadItem"] = "uploadItem";
|
|
21
20
|
TEST_IDS["mediaBody"] = "mediaBody";
|
|
22
21
|
})(exports.TEST_IDS || (exports.TEST_IDS = {}));
|
|
23
|
-
const UploadItem =
|
|
22
|
+
const UploadItem = ({
|
|
24
23
|
file,
|
|
25
24
|
canDelete,
|
|
26
25
|
onDelete,
|
|
27
26
|
onDownload,
|
|
28
27
|
singleFileUpload
|
|
29
|
-
}
|
|
28
|
+
}) => {
|
|
30
29
|
const {
|
|
31
30
|
formatMessage
|
|
32
31
|
} = reactIntl.useIntl();
|
|
@@ -37,17 +36,6 @@ const UploadItem = /*#__PURE__*/React.forwardRef(({
|
|
|
37
36
|
errors,
|
|
38
37
|
url
|
|
39
38
|
} = file;
|
|
40
|
-
const linkRef = React.useRef(null);
|
|
41
|
-
const buttonRef = React.useRef(null);
|
|
42
|
-
React.useImperativeHandle(ref, () => ({
|
|
43
|
-
focus: () => {
|
|
44
|
-
if (linkRef.current) {
|
|
45
|
-
linkRef.current.focus();
|
|
46
|
-
} else if (buttonRef.current) {
|
|
47
|
-
buttonRef.current.focus();
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}));
|
|
51
39
|
const isSucceeded = [status.Status.SUCCEEDED, undefined].includes(status$1) && !!url;
|
|
52
40
|
/**
|
|
53
41
|
* We're temporarily reverting to the regular icon components,
|
|
@@ -102,18 +90,20 @@ const UploadItem = /*#__PURE__*/React.forwardRef(({
|
|
|
102
90
|
if (error || errors?.length || status$1 === status.Status.FAILED) {
|
|
103
91
|
return /*#__PURE__*/jsxRuntime.jsx(Body, {
|
|
104
92
|
type: typography.Typography.BODY_DEFAULT_BOLD,
|
|
105
|
-
className: "text-negative",
|
|
93
|
+
className: "np-upload-input__text text-negative",
|
|
106
94
|
children: errors?.length ? getMultipleErrors(errors) : getErrorMessage(error)
|
|
107
95
|
});
|
|
108
96
|
}
|
|
109
97
|
switch (status$1) {
|
|
110
98
|
case status.Status.PENDING:
|
|
111
99
|
return /*#__PURE__*/jsxRuntime.jsx(Body, {
|
|
112
|
-
type: typography.Typography.
|
|
100
|
+
type: typography.Typography.BODY_DEFAULT,
|
|
101
|
+
className: "np-upload-input__text",
|
|
113
102
|
children: formatMessage(UploadItem_messages.uploading)
|
|
114
103
|
});
|
|
115
104
|
case status.Status.PROCESSING:
|
|
116
105
|
return /*#__PURE__*/jsxRuntime.jsx(Body, {
|
|
106
|
+
className: "np-upload-input__text",
|
|
117
107
|
children: formatMessage(UploadItem_messages.deleting)
|
|
118
108
|
});
|
|
119
109
|
case status.Status.SUCCEEDED:
|
|
@@ -121,7 +111,7 @@ const UploadItem = /*#__PURE__*/React.forwardRef(({
|
|
|
121
111
|
default:
|
|
122
112
|
return /*#__PURE__*/jsxRuntime.jsx(Body, {
|
|
123
113
|
type: typography.Typography.BODY_DEFAULT_BOLD,
|
|
124
|
-
className: "
|
|
114
|
+
className: "np-upload-input__text",
|
|
125
115
|
children: formatMessage(UploadItem_messages.uploaded)
|
|
126
116
|
});
|
|
127
117
|
}
|
|
@@ -135,55 +125,42 @@ const UploadItem = /*#__PURE__*/React.forwardRef(({
|
|
|
135
125
|
onDownload(file);
|
|
136
126
|
}
|
|
137
127
|
};
|
|
138
|
-
return /*#__PURE__*/jsxRuntime.
|
|
139
|
-
className: clsx.clsx('np-upload-
|
|
140
|
-
'
|
|
128
|
+
return /*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
129
|
+
className: clsx.clsx('np-upload-input__item', {
|
|
130
|
+
'is-interactive': isSucceeded && url
|
|
141
131
|
}),
|
|
142
132
|
"data-testid": exports.TEST_IDS.uploadItem,
|
|
143
|
-
children: /*#__PURE__*/jsxRuntime.jsxs(
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
children: [/*#__PURE__*/jsxRuntime.jsx(Body, {
|
|
162
|
-
className: "text-word-break d-block text-primary",
|
|
163
|
-
children: getTitle()
|
|
164
|
-
}), getDescription()]
|
|
165
|
-
})]
|
|
166
|
-
})
|
|
167
|
-
})
|
|
168
|
-
}), canDelete && /*#__PURE__*/jsxRuntime.jsx("button", {
|
|
169
|
-
ref: buttonRef,
|
|
133
|
+
children: [/*#__PURE__*/jsxRuntime.jsxs(UploadItemLink.UploadItemLink, {
|
|
134
|
+
url: isSucceeded ? url : undefined,
|
|
135
|
+
singleFileUpload: singleFileUpload,
|
|
136
|
+
onDownload: onDownloadFile,
|
|
137
|
+
children: [/*#__PURE__*/jsxRuntime.jsx("span", {
|
|
138
|
+
className: "np-upload-input__icon",
|
|
139
|
+
children: getIcon()
|
|
140
|
+
}), /*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
141
|
+
className: "np-upload-input__item-content",
|
|
142
|
+
children: [/*#__PURE__*/jsxRuntime.jsx(Body, {
|
|
143
|
+
type: typography.Typography.BODY_LARGE,
|
|
144
|
+
className: "np-upload-input__title text-word-break",
|
|
145
|
+
children: getTitle()
|
|
146
|
+
}), getDescription()]
|
|
147
|
+
})]
|
|
148
|
+
}), canDelete && /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
149
|
+
className: "np-upload-input__item-action",
|
|
150
|
+
children: /*#__PURE__*/jsxRuntime.jsx("button", {
|
|
170
151
|
"aria-label": formatMessage(UploadItem_messages.removeFile, {
|
|
171
152
|
filename
|
|
172
153
|
}),
|
|
173
|
-
className:
|
|
174
|
-
'np-upload-item--single-file': singleFileUpload
|
|
175
|
-
}),
|
|
154
|
+
className: "np-upload-input__item-button",
|
|
176
155
|
type: "button",
|
|
177
|
-
tabIndex: 0,
|
|
178
156
|
onClick: () => onDelete(),
|
|
179
157
|
children: /*#__PURE__*/jsxRuntime.jsx(icons.Bin, {
|
|
180
158
|
size: 16
|
|
181
159
|
})
|
|
182
|
-
})
|
|
183
|
-
})
|
|
160
|
+
})
|
|
161
|
+
})]
|
|
184
162
|
});
|
|
185
|
-
}
|
|
186
|
-
UploadItem.displayName = 'UploadItem';
|
|
163
|
+
};
|
|
187
164
|
|
|
188
165
|
exports.default = UploadItem;
|
|
189
166
|
//# sourceMappingURL=UploadItem.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UploadItem.js","sources":["../../../src/uploadInput/uploadItem/UploadItem.tsx"],"sourcesContent":["import { Bin, CheckCircleFill, CrossCircleFill } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport { forwardRef, useImperativeHandle, useRef } from 'react';\nimport { useIntl } from 'react-intl';\n\nimport Body from '../../body';\nimport { Size, Status, Typography, Sentiment } from '../../common';\nimport ProcessIndicator from '../../processIndicator/ProcessIndicator';\nimport StatusIcon from '../../statusIcon/StatusIcon';\nimport { UploadedFile, UploadError } from '../types';\n\nimport MESSAGES from './UploadItem.messages';\nimport { UploadItemLink } from './UploadItemLink';\n\nexport type UploadItemProps = React.JSX.IntrinsicAttributes & {\n file: UploadedFile;\n /**\n * Is this Item part of a multiple- or single-file UploadInput\n */\n singleFileUpload: boolean;\n canDelete: boolean;\n onDelete: () => void;\n\n /**\n * Callback to be called when the file link is clicked.\n * When provided, you need to manually trigger actions to load/download the file.\n *\n * @param file\n */\n onDownload?: (file: UploadedFile) => void;\n ref?: React.Ref<UploadItemRef>;\n};\n\ninterface UploadItemRef {\n focus: () => void;\n}\n\nexport enum TEST_IDS {\n uploadItem = 'uploadItem',\n mediaBody = 'mediaBody',\n}\n\nconst UploadItem = forwardRef<UploadItemRef, UploadItemProps>(\n ({ file, canDelete, onDelete, onDownload, singleFileUpload }, ref) => {\n const { formatMessage } = useIntl();\n const { status, filename, error, errors, url } = file;\n const linkRef = useRef<HTMLAnchorElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n useImperativeHandle<UploadItemRef, UploadItemRef>(ref, () => ({\n focus: () => {\n if (linkRef.current) {\n linkRef.current.focus();\n } else if (buttonRef.current) {\n buttonRef.current.focus();\n }\n },\n }));\n\n const isSucceeded = [Status.SUCCEEDED, undefined].includes(status) && !!url;\n\n /**\n * We're temporarily reverting to the regular icon components,\n * until the StatusIcon receives 24px sizing. Some misalignment\n * to be expected.\n */\n const getIcon = () => {\n if (error || errors?.length || status === Status.FAILED) {\n return <CrossCircleFill size={24} className=\"emphasis--negative\" />;\n }\n\n let processIndicator: React.ReactNode;\n\n switch (status) {\n case Status.PROCESSING:\n case Status.PENDING:\n processIndicator = (\n <ProcessIndicator size={Size.EXTRA_SMALL} status={Status.PROCESSING} />\n );\n break;\n case Status.SUCCEEDED:\n case Status.DONE:\n default:\n processIndicator = <CheckCircleFill size={24} className=\"emphasis--positive\" />;\n }\n\n return processIndicator;\n };\n\n const getErrorMessage = (error?: UploadError) =>\n typeof error === 'object' ? error.message : error || formatMessage(MESSAGES.uploadingFailed);\n\n const getMultipleErrors = (errors?: UploadError[]) => {\n if (!errors?.length) {\n return null;\n }\n\n if (errors?.length === 1) {\n return getErrorMessage(errors[0]);\n }\n\n return (\n <ul className=\"np-upload-input-errors m-b-0\">\n {errors.map((error, index) => {\n // eslint-disable-next-line react/no-array-index-key\n return <li key={index}>{getErrorMessage(error)}</li>;\n })}\n </ul>\n );\n };\n\n const getDescription = () => {\n if (error || errors?.length || status === Status.FAILED) {\n return (\n <Body type={Typography.BODY_DEFAULT_BOLD} className=\"text-negative\">\n {errors?.length ? getMultipleErrors(errors) : getErrorMessage(error)}\n </Body>\n );\n }\n\n switch (status) {\n case Status.PENDING:\n return (\n <Body type={Typography.BODY_DEFAULT_BOLD}>{formatMessage(MESSAGES.uploading)}</Body>\n );\n case Status.PROCESSING:\n return <Body>{formatMessage(MESSAGES.deleting)}</Body>;\n case Status.SUCCEEDED:\n case Status.DONE:\n default:\n return (\n <Body type={Typography.BODY_DEFAULT_BOLD} className=\"text-positive\">\n {formatMessage(MESSAGES.uploaded)}\n </Body>\n );\n }\n };\n\n const getTitle = () => {\n return filename || formatMessage(MESSAGES.uploadedFile);\n };\n\n const onDownloadFile = (event: React.MouseEvent): void => {\n if (onDownload) {\n event.preventDefault();\n onDownload(file);\n }\n };\n\n return (\n <div\n className={clsx('np-upload-item', { 'np-upload-item--link': isSucceeded })}\n data-testid={TEST_IDS.uploadItem}\n >\n <div className=\"np-upload-item__body\">\n <UploadItemLink\n ref={linkRef}\n url={isSucceeded ? url : undefined}\n singleFileUpload={singleFileUpload}\n onDownload={onDownloadFile}\n >\n <div className=\"np-upload-button\" aria-live=\"polite\">\n <div className=\"media\">\n <div className=\"np-upload-icon media-left\">{getIcon()}</div>\n <div className=\"media-body text-xs-left\" data-testid={TEST_IDS.mediaBody}>\n <Body className=\"text-word-break d-block text-primary\">{getTitle()}</Body>\n {getDescription()}\n </div>\n </div>\n </div>\n </UploadItemLink>\n {canDelete && (\n <button\n ref={buttonRef}\n aria-label={formatMessage(MESSAGES.removeFile, { filename })}\n className={clsx('btn', 'np-upload-item__remove-button', 'media-left', {\n 'np-upload-item--single-file': singleFileUpload,\n })}\n type=\"button\"\n tabIndex={0}\n onClick={() => onDelete()}\n >\n <Bin size={16} />\n </button>\n )}\n </div>\n </div>\n );\n },\n);\n\nUploadItem.displayName = 'UploadItem';\n\nexport default UploadItem;\n"],"names":["TEST_IDS","UploadItem","forwardRef","file","canDelete","onDelete","onDownload","singleFileUpload","ref","formatMessage","useIntl","status","filename","error","errors","url","linkRef","useRef","buttonRef","useImperativeHandle","focus","current","isSucceeded","Status","SUCCEEDED","undefined","includes","getIcon","length","FAILED","_jsx","CrossCircleFill","size","className","processIndicator","PROCESSING","PENDING","ProcessIndicator","Size","EXTRA_SMALL","DONE","CheckCircleFill","getErrorMessage","message","MESSAGES","uploadingFailed","getMultipleErrors","children","map","index","getDescription","Body","type","Typography","BODY_DEFAULT_BOLD","uploading","deleting","uploaded","getTitle","uploadedFile","onDownloadFile","event","preventDefault","clsx","uploadItem","_jsxs","UploadItemLink","mediaBody","removeFile","tabIndex","onClick","Bin","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UploadItem.js","sources":["../../../src/uploadInput/uploadItem/UploadItem.tsx"],"sourcesContent":["import { Bin, CheckCircleFill, CrossCircleFill } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport { useIntl } from 'react-intl';\n\nimport Body from '../../body';\nimport { Size, Status, Typography, Sentiment } from '../../common';\nimport ProcessIndicator from '../../processIndicator/ProcessIndicator';\nimport StatusIcon from '../../statusIcon/StatusIcon';\nimport { UploadedFile, UploadError } from '../types';\n\nimport MESSAGES from './UploadItem.messages';\nimport { UploadItemLink } from './UploadItemLink';\n\nexport type UploadItemProps = React.JSX.IntrinsicAttributes & {\n file: UploadedFile;\n /**\n * Is this Item part of a multiple- or single-file UploadInput\n */\n singleFileUpload: boolean;\n canDelete: boolean;\n onDelete: () => void;\n\n /**\n * Callback to be called when the file link is clicked.\n * When provided, you need to manually trigger actions to load/download the file.\n *\n * @param file\n */\n onDownload?: (file: UploadedFile) => void;\n};\n\nexport enum TEST_IDS {\n uploadItem = 'uploadItem',\n mediaBody = 'mediaBody',\n}\n\nconst UploadItem = ({\n file,\n canDelete,\n onDelete,\n onDownload,\n singleFileUpload,\n}: UploadItemProps) => {\n const { formatMessage } = useIntl();\n const { status, filename, error, errors, url } = file;\n\n const isSucceeded = [Status.SUCCEEDED, undefined].includes(status) && !!url;\n\n /**\n * We're temporarily reverting to the regular icon components,\n * until the StatusIcon receives 24px sizing. Some misalignment\n * to be expected.\n */\n const getIcon = () => {\n if (error || errors?.length || status === Status.FAILED) {\n return <CrossCircleFill size={24} className=\"emphasis--negative\" />;\n }\n\n let processIndicator: React.ReactNode;\n\n switch (status) {\n case Status.PROCESSING:\n case Status.PENDING:\n processIndicator = <ProcessIndicator size={Size.EXTRA_SMALL} status={Status.PROCESSING} />;\n break;\n case Status.SUCCEEDED:\n case Status.DONE:\n default:\n processIndicator = <CheckCircleFill size={24} className=\"emphasis--positive\" />;\n }\n\n return processIndicator;\n };\n\n const getErrorMessage = (error?: UploadError) =>\n typeof error === 'object' ? error.message : error || formatMessage(MESSAGES.uploadingFailed);\n\n const getMultipleErrors = (errors?: UploadError[]) => {\n if (!errors?.length) {\n return null;\n }\n\n if (errors?.length === 1) {\n return getErrorMessage(errors[0]);\n }\n\n return (\n <ul className=\"np-upload-input-errors m-b-0\">\n {errors.map((error, index) => {\n // eslint-disable-next-line react/no-array-index-key\n return <li key={index}>{getErrorMessage(error)}</li>;\n })}\n </ul>\n );\n };\n\n const getDescription = () => {\n if (error || errors?.length || status === Status.FAILED) {\n return (\n <Body type={Typography.BODY_DEFAULT_BOLD} className=\"np-upload-input__text text-negative\">\n {errors?.length ? getMultipleErrors(errors) : getErrorMessage(error)}\n </Body>\n );\n }\n\n switch (status) {\n case Status.PENDING:\n return (\n <Body type={Typography.BODY_DEFAULT} className=\"np-upload-input__text\">\n {formatMessage(MESSAGES.uploading)}\n </Body>\n );\n case Status.PROCESSING:\n return <Body className=\"np-upload-input__text\">{formatMessage(MESSAGES.deleting)}</Body>;\n case Status.SUCCEEDED:\n case Status.DONE:\n default:\n return (\n <Body type={Typography.BODY_DEFAULT_BOLD} className=\"np-upload-input__text\">\n {formatMessage(MESSAGES.uploaded)}\n </Body>\n );\n }\n };\n\n const getTitle = () => {\n return filename || formatMessage(MESSAGES.uploadedFile);\n };\n\n const onDownloadFile = (event: React.MouseEvent): void => {\n if (onDownload) {\n event.preventDefault();\n onDownload(file);\n }\n };\n\n return (\n <div\n className={clsx('np-upload-input__item', { 'is-interactive': isSucceeded && url })}\n data-testid={TEST_IDS.uploadItem}\n >\n <UploadItemLink\n url={isSucceeded ? url : undefined}\n singleFileUpload={singleFileUpload}\n onDownload={onDownloadFile}\n >\n <span className=\"np-upload-input__icon\">{getIcon()}</span>\n <div className=\"np-upload-input__item-content\">\n <Body type={Typography.BODY_LARGE} className=\"np-upload-input__title text-word-break\">\n {getTitle()}\n </Body>\n {getDescription()}\n </div>\n </UploadItemLink>\n {canDelete && (\n <div className=\"np-upload-input__item-action\">\n <button\n aria-label={formatMessage(MESSAGES.removeFile, { filename })}\n className=\"np-upload-input__item-button\"\n type=\"button\"\n onClick={() => onDelete()}\n >\n <Bin size={16} />\n </button>\n </div>\n )}\n </div>\n );\n};\n\nexport default UploadItem;\n"],"names":["TEST_IDS","UploadItem","file","canDelete","onDelete","onDownload","singleFileUpload","formatMessage","useIntl","status","filename","error","errors","url","isSucceeded","Status","SUCCEEDED","undefined","includes","getIcon","length","FAILED","_jsx","CrossCircleFill","size","className","processIndicator","PROCESSING","PENDING","ProcessIndicator","Size","EXTRA_SMALL","DONE","CheckCircleFill","getErrorMessage","message","MESSAGES","uploadingFailed","getMultipleErrors","children","map","index","getDescription","Body","type","Typography","BODY_DEFAULT_BOLD","BODY_DEFAULT","uploading","deleting","uploaded","getTitle","uploadedFile","onDownloadFile","event","preventDefault","_jsxs","clsx","uploadItem","UploadItemLink","BODY_LARGE","removeFile","onClick","Bin"],"mappings":"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"}
|
|
@@ -1,28 +1,27 @@
|
|
|
1
1
|
import { Bin, CrossCircleFill, CheckCircleFill } from '@transferwise/icons';
|
|
2
2
|
import { clsx } from 'clsx';
|
|
3
|
-
import { forwardRef, useRef, useImperativeHandle } from 'react';
|
|
4
3
|
import { useIntl } from 'react-intl';
|
|
5
4
|
import Body from '../../body/Body.mjs';
|
|
6
5
|
import ProcessIndicator from '../../processIndicator/ProcessIndicator.mjs';
|
|
7
6
|
import MESSAGES from './UploadItem.messages.mjs';
|
|
8
7
|
import { UploadItemLink } from './UploadItemLink.mjs';
|
|
9
|
-
import {
|
|
8
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
10
9
|
import { Status } from '../../common/propsValues/status.mjs';
|
|
11
|
-
import { Size } from '../../common/propsValues/size.mjs';
|
|
12
10
|
import { Typography } from '../../common/propsValues/typography.mjs';
|
|
11
|
+
import { Size } from '../../common/propsValues/size.mjs';
|
|
13
12
|
|
|
14
13
|
var TEST_IDS;
|
|
15
14
|
(function (TEST_IDS) {
|
|
16
15
|
TEST_IDS["uploadItem"] = "uploadItem";
|
|
17
16
|
TEST_IDS["mediaBody"] = "mediaBody";
|
|
18
17
|
})(TEST_IDS || (TEST_IDS = {}));
|
|
19
|
-
const UploadItem =
|
|
18
|
+
const UploadItem = ({
|
|
20
19
|
file,
|
|
21
20
|
canDelete,
|
|
22
21
|
onDelete,
|
|
23
22
|
onDownload,
|
|
24
23
|
singleFileUpload
|
|
25
|
-
}
|
|
24
|
+
}) => {
|
|
26
25
|
const {
|
|
27
26
|
formatMessage
|
|
28
27
|
} = useIntl();
|
|
@@ -33,17 +32,6 @@ const UploadItem = /*#__PURE__*/forwardRef(({
|
|
|
33
32
|
errors,
|
|
34
33
|
url
|
|
35
34
|
} = file;
|
|
36
|
-
const linkRef = useRef(null);
|
|
37
|
-
const buttonRef = useRef(null);
|
|
38
|
-
useImperativeHandle(ref, () => ({
|
|
39
|
-
focus: () => {
|
|
40
|
-
if (linkRef.current) {
|
|
41
|
-
linkRef.current.focus();
|
|
42
|
-
} else if (buttonRef.current) {
|
|
43
|
-
buttonRef.current.focus();
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}));
|
|
47
35
|
const isSucceeded = [Status.SUCCEEDED, undefined].includes(status) && !!url;
|
|
48
36
|
/**
|
|
49
37
|
* We're temporarily reverting to the regular icon components,
|
|
@@ -98,18 +86,20 @@ const UploadItem = /*#__PURE__*/forwardRef(({
|
|
|
98
86
|
if (error || errors?.length || status === Status.FAILED) {
|
|
99
87
|
return /*#__PURE__*/jsx(Body, {
|
|
100
88
|
type: Typography.BODY_DEFAULT_BOLD,
|
|
101
|
-
className: "text-negative",
|
|
89
|
+
className: "np-upload-input__text text-negative",
|
|
102
90
|
children: errors?.length ? getMultipleErrors(errors) : getErrorMessage(error)
|
|
103
91
|
});
|
|
104
92
|
}
|
|
105
93
|
switch (status) {
|
|
106
94
|
case Status.PENDING:
|
|
107
95
|
return /*#__PURE__*/jsx(Body, {
|
|
108
|
-
type: Typography.
|
|
96
|
+
type: Typography.BODY_DEFAULT,
|
|
97
|
+
className: "np-upload-input__text",
|
|
109
98
|
children: formatMessage(MESSAGES.uploading)
|
|
110
99
|
});
|
|
111
100
|
case Status.PROCESSING:
|
|
112
101
|
return /*#__PURE__*/jsx(Body, {
|
|
102
|
+
className: "np-upload-input__text",
|
|
113
103
|
children: formatMessage(MESSAGES.deleting)
|
|
114
104
|
});
|
|
115
105
|
case Status.SUCCEEDED:
|
|
@@ -117,7 +107,7 @@ const UploadItem = /*#__PURE__*/forwardRef(({
|
|
|
117
107
|
default:
|
|
118
108
|
return /*#__PURE__*/jsx(Body, {
|
|
119
109
|
type: Typography.BODY_DEFAULT_BOLD,
|
|
120
|
-
className: "
|
|
110
|
+
className: "np-upload-input__text",
|
|
121
111
|
children: formatMessage(MESSAGES.uploaded)
|
|
122
112
|
});
|
|
123
113
|
}
|
|
@@ -131,55 +121,42 @@ const UploadItem = /*#__PURE__*/forwardRef(({
|
|
|
131
121
|
onDownload(file);
|
|
132
122
|
}
|
|
133
123
|
};
|
|
134
|
-
return /*#__PURE__*/
|
|
135
|
-
className: clsx('np-upload-
|
|
136
|
-
'
|
|
124
|
+
return /*#__PURE__*/jsxs("div", {
|
|
125
|
+
className: clsx('np-upload-input__item', {
|
|
126
|
+
'is-interactive': isSucceeded && url
|
|
137
127
|
}),
|
|
138
128
|
"data-testid": TEST_IDS.uploadItem,
|
|
139
|
-
children: /*#__PURE__*/jsxs(
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
children: [/*#__PURE__*/jsx(Body, {
|
|
158
|
-
className: "text-word-break d-block text-primary",
|
|
159
|
-
children: getTitle()
|
|
160
|
-
}), getDescription()]
|
|
161
|
-
})]
|
|
162
|
-
})
|
|
163
|
-
})
|
|
164
|
-
}), canDelete && /*#__PURE__*/jsx("button", {
|
|
165
|
-
ref: buttonRef,
|
|
129
|
+
children: [/*#__PURE__*/jsxs(UploadItemLink, {
|
|
130
|
+
url: isSucceeded ? url : undefined,
|
|
131
|
+
singleFileUpload: singleFileUpload,
|
|
132
|
+
onDownload: onDownloadFile,
|
|
133
|
+
children: [/*#__PURE__*/jsx("span", {
|
|
134
|
+
className: "np-upload-input__icon",
|
|
135
|
+
children: getIcon()
|
|
136
|
+
}), /*#__PURE__*/jsxs("div", {
|
|
137
|
+
className: "np-upload-input__item-content",
|
|
138
|
+
children: [/*#__PURE__*/jsx(Body, {
|
|
139
|
+
type: Typography.BODY_LARGE,
|
|
140
|
+
className: "np-upload-input__title text-word-break",
|
|
141
|
+
children: getTitle()
|
|
142
|
+
}), getDescription()]
|
|
143
|
+
})]
|
|
144
|
+
}), canDelete && /*#__PURE__*/jsx("div", {
|
|
145
|
+
className: "np-upload-input__item-action",
|
|
146
|
+
children: /*#__PURE__*/jsx("button", {
|
|
166
147
|
"aria-label": formatMessage(MESSAGES.removeFile, {
|
|
167
148
|
filename
|
|
168
149
|
}),
|
|
169
|
-
className:
|
|
170
|
-
'np-upload-item--single-file': singleFileUpload
|
|
171
|
-
}),
|
|
150
|
+
className: "np-upload-input__item-button",
|
|
172
151
|
type: "button",
|
|
173
|
-
tabIndex: 0,
|
|
174
152
|
onClick: () => onDelete(),
|
|
175
153
|
children: /*#__PURE__*/jsx(Bin, {
|
|
176
154
|
size: 16
|
|
177
155
|
})
|
|
178
|
-
})
|
|
179
|
-
})
|
|
156
|
+
})
|
|
157
|
+
})]
|
|
180
158
|
});
|
|
181
|
-
}
|
|
182
|
-
UploadItem.displayName = 'UploadItem';
|
|
159
|
+
};
|
|
183
160
|
|
|
184
161
|
export { TEST_IDS, UploadItem as default };
|
|
185
162
|
//# sourceMappingURL=UploadItem.mjs.map
|