@bit.rhplus/ui2.upload-files-modal 0.0.26 → 0.0.28
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/dist/index.js +108 -32
- package/dist/index.js.map +1 -1
- package/index.jsx +201 -94
- package/package.json +3 -3
- /package/dist/{preview-1768405724660.js → preview-1769717239459.js} +0 -0
package/dist/index.js
CHANGED
|
@@ -1,24 +1,102 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
/* eslint-disable */
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import DraggableModal from '@bit.rhplus/draggable-modal';
|
|
5
|
-
import {
|
|
6
|
-
import { CheckCircleOutlined, CloseCircleOutlined, SyncOutlined, FileTextOutlined, InboxOutlined, } from '@ant-design/icons';
|
|
5
|
+
import { Progress, List, Tag, Button, Empty, Space } from 'antd';
|
|
6
|
+
import { CheckCircleOutlined, CloseCircleOutlined, SyncOutlined, FileTextOutlined, InboxOutlined, EyeOutlined, DeleteOutlined, PlusOutlined, } from '@ant-design/icons';
|
|
7
7
|
import prettyBytes from 'pretty-bytes';
|
|
8
8
|
import useUploadFiles from './useUploadFiles';
|
|
9
|
-
//zmeny
|
|
10
|
-
const { Text } = Typography;
|
|
11
9
|
const UploadFilesModal = React.forwardRef((props, ref) => {
|
|
12
10
|
const { api, accessToken, folderPath = null, getContainer = () => document.body, } = props;
|
|
13
11
|
const { uploadFiles, getUploadedFiles } = useUploadFiles(api, accessToken, folderPath);
|
|
14
12
|
const [opened, setOpened] = React.useState(false);
|
|
15
13
|
const [progressFiles, setProgressFiles] = React.useState({});
|
|
16
|
-
const
|
|
14
|
+
const [isUploading, setIsUploading] = React.useState(false);
|
|
15
|
+
const fileInputRef = React.useRef(null);
|
|
16
|
+
const { files: uploadedFiles = [] } = progressFiles || {};
|
|
17
17
|
const onProgress = (progress) => setProgressFiles(progress);
|
|
18
|
-
const handleFilesSelected = (
|
|
18
|
+
const handleFilesSelected = (selectedFilesOrEvent) => {
|
|
19
|
+
let selectedFiles = selectedFilesOrEvent;
|
|
20
|
+
// Handle both File objects and event objects
|
|
21
|
+
if (selectedFilesOrEvent?.target?.files) {
|
|
22
|
+
selectedFiles = selectedFilesOrEvent.target.files;
|
|
23
|
+
}
|
|
24
|
+
if (!selectedFiles) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Convert to array if needed
|
|
28
|
+
const newFiles = Array.isArray(selectedFiles)
|
|
29
|
+
? selectedFiles
|
|
30
|
+
: Array.from(selectedFiles);
|
|
31
|
+
if (newFiles.length === 0) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
19
34
|
setOpened(true);
|
|
20
|
-
|
|
35
|
+
// Add files to list with 'waiting' state - don't start upload yet
|
|
36
|
+
const filesToAdd = newFiles.map(f => ({
|
|
37
|
+
name: f.name,
|
|
38
|
+
size: f.size,
|
|
39
|
+
type: f.type,
|
|
40
|
+
state: 'waiting',
|
|
41
|
+
error: null,
|
|
42
|
+
fileObject: f,
|
|
43
|
+
}));
|
|
44
|
+
setProgressFiles(prev => ({
|
|
45
|
+
current: 0,
|
|
46
|
+
total: (prev.total || 0) + filesToAdd.length,
|
|
47
|
+
files: [...(prev.files || []), ...filesToAdd],
|
|
48
|
+
}));
|
|
49
|
+
};
|
|
50
|
+
const handleRemoveFile = (index) => {
|
|
51
|
+
setProgressFiles(prev => ({
|
|
52
|
+
...prev,
|
|
53
|
+
files: prev.files.filter((_, i) => i !== index),
|
|
54
|
+
}));
|
|
55
|
+
};
|
|
56
|
+
const handleAddMoreFiles = () => {
|
|
57
|
+
fileInputRef.current?.click();
|
|
58
|
+
};
|
|
59
|
+
const handleFileInputChange = (e) => {
|
|
60
|
+
const files = e.target.files;
|
|
61
|
+
if (files && files.length > 0) {
|
|
62
|
+
handleFilesSelected(files);
|
|
63
|
+
}
|
|
64
|
+
// Reset input value so same file can be selected again
|
|
65
|
+
e.target.value = '';
|
|
66
|
+
};
|
|
67
|
+
const handleViewFile = (file) => {
|
|
68
|
+
if (file.state === 'success' && file.fileKey) {
|
|
69
|
+
// Open uploaded file from server
|
|
70
|
+
const baseUrl = window.location.origin;
|
|
71
|
+
const url = `${baseUrl}/api/files/${file.fileKey}`;
|
|
72
|
+
window.open(url, '_blank');
|
|
73
|
+
}
|
|
74
|
+
else if (file.fileObject) {
|
|
75
|
+
// Preview local file before upload
|
|
76
|
+
const url = URL.createObjectURL(file.fileObject);
|
|
77
|
+
window.open(url, '_blank');
|
|
78
|
+
// Cleanup after 60 seconds
|
|
79
|
+
setTimeout(() => URL.revokeObjectURL(url), 60000);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
const handleStartUpload = async () => {
|
|
83
|
+
const filesToUpload = uploadedFiles
|
|
84
|
+
.filter(f => f.state === 'waiting')
|
|
85
|
+
.map(f => f.fileObject);
|
|
86
|
+
if (filesToUpload.length === 0)
|
|
87
|
+
return;
|
|
88
|
+
setIsUploading(true);
|
|
89
|
+
try {
|
|
90
|
+
await uploadFiles(filesToUpload, onProgress);
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
setIsUploading(false);
|
|
94
|
+
}
|
|
21
95
|
};
|
|
96
|
+
// Determine if upload button should be disabled
|
|
97
|
+
const canUpload = uploadedFiles.length > 0
|
|
98
|
+
&& uploadedFiles.some(f => f.state === 'waiting')
|
|
99
|
+
&& !isUploading;
|
|
22
100
|
React.useImperativeHandle(ref, () => ({
|
|
23
101
|
handleFilesSelected,
|
|
24
102
|
getUploadedFiles,
|
|
@@ -68,30 +146,28 @@ const UploadFilesModal = React.forwardRef((props, ref) => {
|
|
|
68
146
|
return null;
|
|
69
147
|
}
|
|
70
148
|
};
|
|
71
|
-
return (_jsx(DraggableModal, { open: opened, onCancel: () => setOpened(false), getContainer: getContainer, width: "700px", title: _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 8 }, children: [_jsx(InboxOutlined, { style: { fontSize: 20, color: '#1890ff' } }), _jsx("span", { children: "Nahr\u00E1v\u00E1n\u00ED soubor\u016F" }), stats.total > 0 && (_jsxs("span", { style: { fontSize: 12, fontWeight: 'normal', color: '#999' }, children: ["(", stats.success + stats.error, "/", stats.total, ")"] }))] }), footer: () => (
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
color: file.state === 'error' ? '#ff4d4f' : '#262626',
|
|
94
|
-
}, children: file.name }), getStatusTag(file.state)] }), description: _jsxs("div", { style: { display: 'flex', gap: 16, fontSize: 12, flexWrap: 'wrap' }, children: [_jsxs("span", { children: ["Velikost: ", prettyBytes(file.size)] }), _jsxs("span", { children: ["Typ: ", file.type || 'neznámý'] }), file.error && (_jsxs("span", { style: { color: '#ff4d4f', fontWeight: 500 }, children: ["Chyba: ", file.error] }))] }) }) })) })) : (_jsx(Empty, { image: Empty.PRESENTED_IMAGE_SIMPLE, description: "\u017D\u00E1dn\u00E9 soubory k nahr\u00E1n\u00ED" }))] }) }));
|
|
149
|
+
return (_jsx(DraggableModal, { open: opened, onCancel: () => setOpened(false), getContainer: getContainer, width: "700px", title: _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 8 }, children: [_jsx(InboxOutlined, { style: { fontSize: 20, color: '#1890ff' } }), _jsx("span", { children: "Nahr\u00E1v\u00E1n\u00ED soubor\u016F" }), stats.total > 0 && (_jsxs("span", { style: { fontSize: 12, fontWeight: 'normal', color: '#999' }, children: ["(", stats.success + stats.error, "/", stats.total, ")"] }))] }), footer: () => (_jsxs("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' }, children: [_jsx("div", {}), _jsxs(Space, { children: [_jsx(Button, { type: "primary", onClick: handleStartUpload, disabled: !canUpload, loading: isUploading, children: "Nahr\u00E1t soubory" }), _jsx(Button, { onClick: () => setOpened(false), children: "Zav\u0159\u00EDt" })] })] })), maskClosable: false, children: _jsxs("div", { style: { padding: '16px 0' }, children: [uploadedFiles.length > 0 && (_jsx("div", { style: { marginBottom: 16 }, children: _jsx(Progress, { percent: overallProgress, strokeColor: {
|
|
150
|
+
'0%': '#108ee9',
|
|
151
|
+
'100%': '#87d068',
|
|
152
|
+
}, status: stats.error > 0 && stats.success === 0 ? 'exception' : undefined }) })), uploadedFiles.length > 0 ? (_jsxs(_Fragment, { children: [_jsx(List, { dataSource: uploadedFiles, renderItem: (file, index) => (_jsx(List.Item, { style: {
|
|
153
|
+
padding: '12px 16px',
|
|
154
|
+
background: file.state === 'error' ? '#fff2f0' : '#fafafa',
|
|
155
|
+
borderRadius: 4,
|
|
156
|
+
marginBottom: 8,
|
|
157
|
+
border: '1px solid',
|
|
158
|
+
borderColor: file.state === 'error' ? '#ffccc7' : '#d9d9d9',
|
|
159
|
+
}, children: _jsx(List.Item.Meta, { avatar: getStatusIcon(file.state), title: _jsxs("div", { style: {
|
|
160
|
+
display: 'flex',
|
|
161
|
+
justifyContent: 'space-between',
|
|
162
|
+
alignItems: 'center',
|
|
163
|
+
gap: 8,
|
|
164
|
+
}, children: [_jsx("span", { style: {
|
|
165
|
+
fontWeight: 500,
|
|
166
|
+
color: file.state === 'error' ? '#ff4d4f' : '#262626',
|
|
167
|
+
flex: 1,
|
|
168
|
+
overflow: 'hidden',
|
|
169
|
+
textOverflow: 'ellipsis',
|
|
170
|
+
}, children: file.name }), _jsxs(Space, { size: "small", children: [getStatusTag(file.state), _jsx(Button, { type: "text", size: "small", icon: _jsx(EyeOutlined, {}), onClick: () => handleViewFile(file), title: "Zobrazit soubor" }), _jsx(Button, { type: "text", size: "small", danger: true, icon: _jsx(DeleteOutlined, {}), onClick: () => handleRemoveFile(index), title: "Odstranit soubor" })] })] }), description: _jsxs("div", { style: { display: 'flex', gap: 16, fontSize: 12, flexWrap: 'wrap' }, children: [_jsxs("span", { children: ["Velikost: ", prettyBytes(file.size)] }), _jsxs("span", { children: ["Typ: ", file.type || 'neznámý'] }), file.error && (_jsxs("span", { style: { color: '#ff4d4f', fontWeight: 500 }, children: ["Chyba: ", file.error] }))] }) }) })) }), _jsx(Button, { type: "dashed", block: true, icon: _jsx(PlusOutlined, {}), onClick: handleAddMoreFiles, style: { marginTop: 12 }, children: "P\u0159idat dal\u0161\u00ED soubor" }), _jsx("input", { ref: fileInputRef, type: "file", multiple: true, onChange: handleFileInputChange, style: { display: 'none' } })] })) : (_jsx(Empty, { image: Empty.PRESENTED_IMAGE_SIMPLE, description: "\u017D\u00E1dn\u00E9 soubory k nahr\u00E1n\u00ED" }))] }) }));
|
|
95
171
|
});
|
|
96
172
|
UploadFilesModal.displayName = 'UploadFilesModal';
|
|
97
173
|
export default UploadFilesModal;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.jsx"],"names":[],"mappings":";AAAA,oBAAoB;AACpB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,cAAc,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.jsx"],"names":[],"mappings":"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"}
|
package/index.jsx
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
/* eslint-disable */
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import DraggableModal from '@bit.rhplus/draggable-modal';
|
|
4
|
-
import {
|
|
4
|
+
import { Progress, List, Tag, Button, Empty, Space } from 'antd';
|
|
5
5
|
import {
|
|
6
6
|
CheckCircleOutlined,
|
|
7
7
|
CloseCircleOutlined,
|
|
8
8
|
SyncOutlined,
|
|
9
9
|
FileTextOutlined,
|
|
10
10
|
InboxOutlined,
|
|
11
|
+
EyeOutlined,
|
|
12
|
+
DeleteOutlined,
|
|
13
|
+
PlusOutlined,
|
|
11
14
|
} from '@ant-design/icons';
|
|
12
15
|
import prettyBytes from 'pretty-bytes';
|
|
13
16
|
import useUploadFiles from './useUploadFiles';
|
|
14
17
|
|
|
15
|
-
//zmeny
|
|
16
|
-
const { Text } = Typography;
|
|
17
|
-
|
|
18
18
|
const UploadFilesModal = React.forwardRef((props, ref) => {
|
|
19
19
|
const {
|
|
20
20
|
api,
|
|
@@ -26,16 +26,107 @@ const UploadFilesModal = React.forwardRef((props, ref) => {
|
|
|
26
26
|
const { uploadFiles, getUploadedFiles } = useUploadFiles(api, accessToken, folderPath);
|
|
27
27
|
const [opened, setOpened] = React.useState(false);
|
|
28
28
|
const [progressFiles, setProgressFiles] = React.useState({});
|
|
29
|
+
const [isUploading, setIsUploading] = React.useState(false);
|
|
30
|
+
const fileInputRef = React.useRef(null);
|
|
29
31
|
|
|
30
|
-
const { files: uploadedFiles = []
|
|
32
|
+
const { files: uploadedFiles = [] } = progressFiles || {};
|
|
31
33
|
|
|
32
34
|
const onProgress = (progress) => setProgressFiles(progress);
|
|
33
35
|
|
|
34
|
-
const handleFilesSelected = (
|
|
36
|
+
const handleFilesSelected = (selectedFilesOrEvent) => {
|
|
37
|
+
let selectedFiles = selectedFilesOrEvent;
|
|
38
|
+
|
|
39
|
+
// Handle both File objects and event objects
|
|
40
|
+
if (selectedFilesOrEvent?.target?.files) {
|
|
41
|
+
selectedFiles = selectedFilesOrEvent.target.files;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (!selectedFiles) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Convert to array if needed
|
|
49
|
+
const newFiles = Array.isArray(selectedFiles)
|
|
50
|
+
? selectedFiles
|
|
51
|
+
: Array.from(selectedFiles);
|
|
52
|
+
|
|
53
|
+
if (newFiles.length === 0) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
35
57
|
setOpened(true);
|
|
36
|
-
|
|
58
|
+
// Add files to list with 'waiting' state - don't start upload yet
|
|
59
|
+
const filesToAdd = newFiles.map(f => ({
|
|
60
|
+
name: f.name,
|
|
61
|
+
size: f.size,
|
|
62
|
+
type: f.type,
|
|
63
|
+
state: 'waiting',
|
|
64
|
+
error: null,
|
|
65
|
+
fileObject: f,
|
|
66
|
+
}));
|
|
67
|
+
|
|
68
|
+
setProgressFiles(prev => ({
|
|
69
|
+
current: 0,
|
|
70
|
+
total: (prev.total || 0) + filesToAdd.length,
|
|
71
|
+
files: [...(prev.files || []), ...filesToAdd],
|
|
72
|
+
}));
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const handleRemoveFile = (index) => {
|
|
76
|
+
setProgressFiles(prev => ({
|
|
77
|
+
...prev,
|
|
78
|
+
files: prev.files.filter((_, i) => i !== index),
|
|
79
|
+
}));
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const handleAddMoreFiles = () => {
|
|
83
|
+
fileInputRef.current?.click();
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const handleFileInputChange = (e) => {
|
|
87
|
+
const files = e.target.files;
|
|
88
|
+
if (files && files.length > 0) {
|
|
89
|
+
handleFilesSelected(files);
|
|
90
|
+
}
|
|
91
|
+
// Reset input value so same file can be selected again
|
|
92
|
+
e.target.value = '';
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const handleViewFile = (file) => {
|
|
96
|
+
if (file.state === 'success' && file.fileKey) {
|
|
97
|
+
// Open uploaded file from server
|
|
98
|
+
const baseUrl = window.location.origin;
|
|
99
|
+
const url = `${baseUrl}/api/files/${file.fileKey}`;
|
|
100
|
+
window.open(url, '_blank');
|
|
101
|
+
} else if (file.fileObject) {
|
|
102
|
+
// Preview local file before upload
|
|
103
|
+
const url = URL.createObjectURL(file.fileObject);
|
|
104
|
+
window.open(url, '_blank');
|
|
105
|
+
// Cleanup after 60 seconds
|
|
106
|
+
setTimeout(() => URL.revokeObjectURL(url), 60000);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const handleStartUpload = async () => {
|
|
111
|
+
const filesToUpload = uploadedFiles
|
|
112
|
+
.filter(f => f.state === 'waiting')
|
|
113
|
+
.map(f => f.fileObject);
|
|
114
|
+
|
|
115
|
+
if (filesToUpload.length === 0) return;
|
|
116
|
+
|
|
117
|
+
setIsUploading(true);
|
|
118
|
+
try {
|
|
119
|
+
await uploadFiles(filesToUpload, onProgress);
|
|
120
|
+
} finally {
|
|
121
|
+
setIsUploading(false);
|
|
122
|
+
}
|
|
37
123
|
};
|
|
38
124
|
|
|
125
|
+
// Determine if upload button should be disabled
|
|
126
|
+
const canUpload = uploadedFiles.length > 0
|
|
127
|
+
&& uploadedFiles.some(f => f.state === 'waiting')
|
|
128
|
+
&& !isUploading;
|
|
129
|
+
|
|
39
130
|
React.useImperativeHandle(ref, () => ({
|
|
40
131
|
handleFilesSelected,
|
|
41
132
|
getUploadedFiles,
|
|
@@ -127,21 +218,29 @@ const UploadFilesModal = React.forwardRef((props, ref) => {
|
|
|
127
218
|
</div>
|
|
128
219
|
}
|
|
129
220
|
footer={() => (
|
|
130
|
-
<div style={{ display: 'flex', justifyContent: '
|
|
131
|
-
<
|
|
132
|
-
|
|
133
|
-
|
|
221
|
+
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
|
|
222
|
+
<div />
|
|
223
|
+
<Space>
|
|
224
|
+
<Button
|
|
225
|
+
type="primary"
|
|
226
|
+
onClick={handleStartUpload}
|
|
227
|
+
disabled={!canUpload}
|
|
228
|
+
loading={isUploading}
|
|
229
|
+
>
|
|
230
|
+
Nahrát soubory
|
|
231
|
+
</Button>
|
|
232
|
+
<Button onClick={() => setOpened(false)}>
|
|
233
|
+
Zavřít
|
|
234
|
+
</Button>
|
|
235
|
+
</Space>
|
|
134
236
|
</div>
|
|
135
237
|
)}
|
|
136
238
|
maskClosable={false}
|
|
137
239
|
>
|
|
138
240
|
<div style={{ padding: '16px 0' }}>
|
|
139
|
-
{/* Overall Progress */}
|
|
241
|
+
{/* Overall Progress - Minimized */}
|
|
140
242
|
{uploadedFiles.length > 0 && (
|
|
141
|
-
<
|
|
142
|
-
<div style={{ marginBottom: 8 }}>
|
|
143
|
-
<Text strong>Celkový průběh</Text>
|
|
144
|
-
</div>
|
|
243
|
+
<div style={{ marginBottom: 16 }}>
|
|
145
244
|
<Progress
|
|
146
245
|
percent={overallProgress}
|
|
147
246
|
strokeColor={{
|
|
@@ -150,92 +249,100 @@ const UploadFilesModal = React.forwardRef((props, ref) => {
|
|
|
150
249
|
}}
|
|
151
250
|
status={stats.error > 0 && stats.success === 0 ? 'exception' : undefined}
|
|
152
251
|
/>
|
|
153
|
-
|
|
154
|
-
style={{
|
|
155
|
-
marginTop: 12,
|
|
156
|
-
display: 'grid',
|
|
157
|
-
gridTemplateColumns: 'repeat(4, 1fr)',
|
|
158
|
-
gap: 8,
|
|
159
|
-
fontSize: 12,
|
|
160
|
-
}}
|
|
161
|
-
>
|
|
162
|
-
<div>
|
|
163
|
-
<div style={{ color: '#999' }}>Celkem</div>
|
|
164
|
-
<div style={{ fontWeight: 'bold', fontSize: 16 }}>{stats.total}</div>
|
|
165
|
-
</div>
|
|
166
|
-
<div>
|
|
167
|
-
<div style={{ color: '#52c41a' }}>Úspěšné</div>
|
|
168
|
-
<div style={{ fontWeight: 'bold', fontSize: 16, color: '#52c41a' }}>
|
|
169
|
-
{stats.success}
|
|
170
|
-
</div>
|
|
171
|
-
</div>
|
|
172
|
-
<div>
|
|
173
|
-
<div style={{ color: '#ff4d4f' }}>Chyby</div>
|
|
174
|
-
<div style={{ fontWeight: 'bold', fontSize: 16, color: '#ff4d4f' }}>
|
|
175
|
-
{stats.error}
|
|
176
|
-
</div>
|
|
177
|
-
</div>
|
|
178
|
-
<div>
|
|
179
|
-
<div style={{ color: '#1890ff' }}>Probíhá</div>
|
|
180
|
-
<div style={{ fontWeight: 'bold', fontSize: 16, color: '#1890ff' }}>
|
|
181
|
-
{stats.loading}
|
|
182
|
-
</div>
|
|
183
|
-
</div>
|
|
184
|
-
</div>
|
|
185
|
-
</Card>
|
|
252
|
+
</div>
|
|
186
253
|
)}
|
|
187
254
|
|
|
188
255
|
{/* File List */}
|
|
189
256
|
{uploadedFiles.length > 0 ? (
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
display: 'flex',
|
|
209
|
-
justifyContent: 'space-between',
|
|
210
|
-
alignItems: 'center',
|
|
211
|
-
}}
|
|
212
|
-
>
|
|
213
|
-
<span
|
|
257
|
+
<>
|
|
258
|
+
<List
|
|
259
|
+
dataSource={uploadedFiles}
|
|
260
|
+
renderItem={(file, index) => (
|
|
261
|
+
<List.Item
|
|
262
|
+
style={{
|
|
263
|
+
padding: '12px 16px',
|
|
264
|
+
background: file.state === 'error' ? '#fff2f0' : '#fafafa',
|
|
265
|
+
borderRadius: 4,
|
|
266
|
+
marginBottom: 8,
|
|
267
|
+
border: '1px solid',
|
|
268
|
+
borderColor: file.state === 'error' ? '#ffccc7' : '#d9d9d9',
|
|
269
|
+
}}
|
|
270
|
+
>
|
|
271
|
+
<List.Item.Meta
|
|
272
|
+
avatar={getStatusIcon(file.state)}
|
|
273
|
+
title={
|
|
274
|
+
<div
|
|
214
275
|
style={{
|
|
215
|
-
|
|
216
|
-
|
|
276
|
+
display: 'flex',
|
|
277
|
+
justifyContent: 'space-between',
|
|
278
|
+
alignItems: 'center',
|
|
279
|
+
gap: 8,
|
|
217
280
|
}}
|
|
218
281
|
>
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
<span style={{ color: '#ff4d4f', fontWeight: 500 }}>
|
|
230
|
-
Chyba: {file.error}
|
|
282
|
+
<span
|
|
283
|
+
style={{
|
|
284
|
+
fontWeight: 500,
|
|
285
|
+
color: file.state === 'error' ? '#ff4d4f' : '#262626',
|
|
286
|
+
flex: 1,
|
|
287
|
+
overflow: 'hidden',
|
|
288
|
+
textOverflow: 'ellipsis',
|
|
289
|
+
}}
|
|
290
|
+
>
|
|
291
|
+
{file.name}
|
|
231
292
|
</span>
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
293
|
+
<Space size="small">
|
|
294
|
+
{getStatusTag(file.state)}
|
|
295
|
+
<Button
|
|
296
|
+
type="text"
|
|
297
|
+
size="small"
|
|
298
|
+
icon={<EyeOutlined />}
|
|
299
|
+
onClick={() => handleViewFile(file)}
|
|
300
|
+
title="Zobrazit soubor"
|
|
301
|
+
/>
|
|
302
|
+
<Button
|
|
303
|
+
type="text"
|
|
304
|
+
size="small"
|
|
305
|
+
danger
|
|
306
|
+
icon={<DeleteOutlined />}
|
|
307
|
+
onClick={() => handleRemoveFile(index)}
|
|
308
|
+
title="Odstranit soubor"
|
|
309
|
+
/>
|
|
310
|
+
</Space>
|
|
311
|
+
</div>
|
|
312
|
+
}
|
|
313
|
+
description={
|
|
314
|
+
<div style={{ display: 'flex', gap: 16, fontSize: 12, flexWrap: 'wrap' }}>
|
|
315
|
+
<span>Velikost: {prettyBytes(file.size)}</span>
|
|
316
|
+
<span>Typ: {file.type || 'neznámý'}</span>
|
|
317
|
+
{file.error && (
|
|
318
|
+
<span style={{ color: '#ff4d4f', fontWeight: 500 }}>
|
|
319
|
+
Chyba: {file.error}
|
|
320
|
+
</span>
|
|
321
|
+
)}
|
|
322
|
+
</div>
|
|
323
|
+
}
|
|
324
|
+
/>
|
|
325
|
+
</List.Item>
|
|
326
|
+
)}
|
|
327
|
+
/>
|
|
328
|
+
{/* Add more files button */}
|
|
329
|
+
<Button
|
|
330
|
+
type="dashed"
|
|
331
|
+
block
|
|
332
|
+
icon={<PlusOutlined />}
|
|
333
|
+
onClick={handleAddMoreFiles}
|
|
334
|
+
style={{ marginTop: 12 }}
|
|
335
|
+
>
|
|
336
|
+
Přidat další soubor
|
|
337
|
+
</Button>
|
|
338
|
+
<input
|
|
339
|
+
ref={fileInputRef}
|
|
340
|
+
type="file"
|
|
341
|
+
multiple
|
|
342
|
+
onChange={handleFileInputChange}
|
|
343
|
+
style={{ display: 'none' }}
|
|
344
|
+
/>
|
|
345
|
+
</>
|
|
239
346
|
) : (
|
|
240
347
|
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description="Žádné soubory k nahrání" />
|
|
241
348
|
)}
|
package/package.json
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bit.rhplus/ui2.upload-files-modal",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.28",
|
|
4
4
|
"homepage": "https://bit.cloud/remote-scope/ui2/upload-files-modal",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"componentId": {
|
|
7
7
|
"scope": "remote-scope",
|
|
8
8
|
"name": "ui2/upload-files-modal",
|
|
9
|
-
"version": "0.0.
|
|
9
|
+
"version": "0.0.28"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@ant-design/icons": "^5.4.0",
|
|
13
13
|
"antd": "^5.20.6",
|
|
14
14
|
"pretty-bytes": "^6.1.1",
|
|
15
15
|
"@bit.rhplus/draggable-modal": "0.0.12",
|
|
16
|
-
"@bit.rhplus/data": "0.0.
|
|
16
|
+
"@bit.rhplus/data": "0.0.78"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@teambit/react.react-env": "1.0.132"
|
|
File without changes
|