ar-design 0.3.4 → 0.3.6
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/assets/css/components/form/upload/dropzone.css +1 -0
- package/dist/components/data-display/table/Editable.js +2 -2
- package/dist/components/data-display/table/index.js +2 -2
- package/dist/components/form/upload/Dropzone.js +2 -3
- package/dist/components/form/upload/Props.d.ts +3 -46
- package/dist/components/form/upload/index.js +48 -99
- package/dist/libs/types/index.d.ts +1 -0
- package/package.json +1 -1
|
@@ -103,6 +103,7 @@
|
|
|
103
103
|
background-color: rgba(var(--black-rgb), 0.75);
|
|
104
104
|
padding: 0.5rem;
|
|
105
105
|
transition: visibility 250ms, opacity 250ms ease-in-out;
|
|
106
|
+
font-family: var(--system);
|
|
106
107
|
}
|
|
107
108
|
.ar-upload-button > .button.dropzone > .preview > .informations > .file-name {
|
|
108
109
|
color: var(--white);
|
|
@@ -28,12 +28,12 @@ const Editable = function ({ c, item, onEditable }) {
|
|
|
28
28
|
onEditable({ ...item, [key]: value });
|
|
29
29
|
} }));
|
|
30
30
|
case "single-select":
|
|
31
|
-
return (React.createElement(Select, { variant: "borderless", value: selectionItem, options: c.editable.options, onChange: (option) => {
|
|
31
|
+
return (React.createElement(Select, { variant: "borderless", value: selectionItem, options: c.editable.options, onClick: async () => await c.editable?.method?.(), onChange: (option) => {
|
|
32
32
|
setSelectionItem(option);
|
|
33
33
|
onEditable({ ...item, [key]: option?.value });
|
|
34
34
|
} }));
|
|
35
35
|
case "multiple-select":
|
|
36
|
-
return (React.createElement(Select, { variant: "borderless", value: selectionItems, options: c.editable.options, onChange: (options) => {
|
|
36
|
+
return (React.createElement(Select, { variant: "borderless", value: selectionItems, options: c.editable.options, onClick: async () => await c.editable?.method?.(), onChange: (options) => {
|
|
37
37
|
setSelectionItems(options);
|
|
38
38
|
onEditable({ ...item, [key]: options.map((option) => option.value) });
|
|
39
39
|
}, multiple: true }));
|
|
@@ -500,10 +500,10 @@ const Table = forwardRef(({ children, title, description, data, columns, actions
|
|
|
500
500
|
React.createElement("div", { className: "actions" }, actions && (React.createElement(React.Fragment, null,
|
|
501
501
|
actions.import && (React.createElement(Popover, { title: "\u0130\u00E7eri Aktar", message: "Se\u00E7ti\u011Finiz dosyalar\u0131 uygulamaya y\u00FCkleyebilirsiniz. Bu i\u015Flem, dosyalardaki verileri sistemimize aktar\u0131r ve verilerle i\u015Flem yapman\u0131za olanak tan\u0131r.", content: React.createElement(React.Fragment, null,
|
|
502
502
|
actions.import.prefixItem,
|
|
503
|
-
React.createElement(Upload, { text: "Belge Y\u00FCkleyin", allowedTypes: actions.import.allowedTypes,
|
|
503
|
+
React.createElement(Upload, { text: "Belge Y\u00FCkleyin", allowedTypes: actions.import.allowedTypes, files: files, onChange: (formData, files) => {
|
|
504
504
|
setFormData(formData);
|
|
505
505
|
setFiles(files);
|
|
506
|
-
}
|
|
506
|
+
} }),
|
|
507
507
|
actions.import.suffixItem), onConfirm: (confirm) => {
|
|
508
508
|
if (!confirm) {
|
|
509
509
|
setFiles([]);
|
|
@@ -28,8 +28,6 @@ const Dropzone = ({ selectedFiles, validationErrors = [], handleFileToBase64, ha
|
|
|
28
28
|
};
|
|
29
29
|
// useEffects
|
|
30
30
|
useEffect(() => {
|
|
31
|
-
if (selectedFiles.length === 0)
|
|
32
|
-
return;
|
|
33
31
|
(async () => {
|
|
34
32
|
const newMap = {};
|
|
35
33
|
for (const file of selectedFiles) {
|
|
@@ -38,12 +36,13 @@ const Dropzone = ({ selectedFiles, validationErrors = [], handleFileToBase64, ha
|
|
|
38
36
|
}
|
|
39
37
|
setFileBase64Map(newMap);
|
|
40
38
|
setSelectedFile(selectedFiles[0]);
|
|
41
|
-
setSelectedFileBase64(newMap[selectedFiles[0]
|
|
39
|
+
setSelectedFileBase64(newMap[selectedFiles[0]?.name]);
|
|
42
40
|
})();
|
|
43
41
|
}, [selectedFiles]);
|
|
44
42
|
return selectedFile ? (React.createElement(React.Fragment, null,
|
|
45
43
|
React.createElement("div", { className: "preview" },
|
|
46
44
|
selectedFile.type.includes("image") ? (React.createElement("img", { src: selectedFileBase64, className: "selected-image" })) : ("Önizleme Yok."),
|
|
45
|
+
React.createElement(Buttons, { selectedFile: selectedFile, handleFileToBase64: handleFileToBase64, handleFileRemove: handleFileRemove }),
|
|
47
46
|
React.createElement("div", { className: "informations" },
|
|
48
47
|
React.createElement("span", { className: "file-name" }, selectedFile.name),
|
|
49
48
|
React.createElement("div", null,
|
|
@@ -14,7 +14,7 @@ interface IMultiple {
|
|
|
14
14
|
* />
|
|
15
15
|
* ```
|
|
16
16
|
*/
|
|
17
|
-
|
|
17
|
+
files: File[];
|
|
18
18
|
/**
|
|
19
19
|
* Dosya seçimi veya değişikliğinde tetiklenen fonksiyon.
|
|
20
20
|
*
|
|
@@ -33,50 +33,6 @@ interface IMultiple {
|
|
|
33
33
|
* ```
|
|
34
34
|
*/
|
|
35
35
|
onChange: (formData: FormData, files: File[], base64: string[], isInvalidFileExist: boolean) => void;
|
|
36
|
-
/**
|
|
37
|
-
* Çoklu dosya seçiminin aktif olduğunu belirtir.
|
|
38
|
-
*
|
|
39
|
-
* Örneğin;
|
|
40
|
-
* ```jsx
|
|
41
|
-
* <Upload multiple={true} />
|
|
42
|
-
* ```
|
|
43
|
-
*/
|
|
44
|
-
multiple: true;
|
|
45
|
-
}
|
|
46
|
-
interface ISingle {
|
|
47
|
-
/**
|
|
48
|
-
* Yüklenen tek dosya veya undefined.
|
|
49
|
-
*
|
|
50
|
-
* Örneğin;
|
|
51
|
-
*
|
|
52
|
-
* ```jsx
|
|
53
|
-
* <Upload file={selectedFile} />
|
|
54
|
-
* ```
|
|
55
|
-
*/
|
|
56
|
-
file: File | undefined;
|
|
57
|
-
/**
|
|
58
|
-
* Dosya seçimi veya değişikliğinde tetiklenen fonksiyon.
|
|
59
|
-
*
|
|
60
|
-
* @param formData - Dosyayla oluşturulmuş FormData nesnesi veya undefined.
|
|
61
|
-
* @param files - Seçilen dosya veya null.
|
|
62
|
-
*
|
|
63
|
-
* Örneğin;
|
|
64
|
-
*
|
|
65
|
-
* ```jsx
|
|
66
|
-
* <Upload onChange={(formData, file) => console.log(file)} />
|
|
67
|
-
* ```
|
|
68
|
-
*/
|
|
69
|
-
onChange: (formData: FormData | undefined, files: File | null, base64: string) => void;
|
|
70
|
-
/**
|
|
71
|
-
* Çoklu dosya seçiminin devre dışı olduğunu belirtir.
|
|
72
|
-
*
|
|
73
|
-
* Örneğin;
|
|
74
|
-
*
|
|
75
|
-
* ```jsx
|
|
76
|
-
* <Upload multiple={false} />
|
|
77
|
-
* ```
|
|
78
|
-
*/
|
|
79
|
-
multiple?: false;
|
|
80
36
|
}
|
|
81
37
|
type Props = {
|
|
82
38
|
/**
|
|
@@ -109,5 +65,6 @@ type Props = {
|
|
|
109
65
|
*/
|
|
110
66
|
maxSize?: number;
|
|
111
67
|
type?: "list" | "dropzone";
|
|
112
|
-
|
|
68
|
+
multiple?: boolean;
|
|
69
|
+
} & IMultiple & IValidation & IDisabled;
|
|
113
70
|
export default Props;
|
|
@@ -5,7 +5,7 @@ import { ARIcon } from "../../icons";
|
|
|
5
5
|
import Dropzone from "./Dropzone";
|
|
6
6
|
import Button from "../button";
|
|
7
7
|
import List from "./List";
|
|
8
|
-
const Upload = ({ text,
|
|
8
|
+
const Upload = ({ text, files, onChange, allowedTypes, maxSize, type = "list", multiple }) => {
|
|
9
9
|
// refs
|
|
10
10
|
const _firstLoad = useRef(false);
|
|
11
11
|
const _input = useRef(null);
|
|
@@ -15,45 +15,28 @@ const Upload = ({ text, file, onChange, allowedTypes, maxSize, type = "list", mu
|
|
|
15
15
|
// variables
|
|
16
16
|
const [className, setClassName] = useState(["button"]);
|
|
17
17
|
// states
|
|
18
|
-
const [selectedFile, setSelectedFile] = useState(undefined);
|
|
19
18
|
const [selectedFiles, setSelectedFiles] = useState([]);
|
|
20
19
|
const [validationErrors, setValidationErrors] = useState([]);
|
|
21
20
|
// methods
|
|
22
21
|
const handleFileChange = useCallback((files) => {
|
|
23
22
|
const _files = Array.from(files ?? []);
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
return [...prev, ...newFiles];
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
setSelectedFile(_files[0]);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
multiple ? setSelectedFiles(file) : setSelectedFile(file);
|
|
38
|
-
}
|
|
23
|
+
setSelectedFiles((prev) => {
|
|
24
|
+
const previousFileNames = prev.map((f) => f.name);
|
|
25
|
+
const newFiles = _files.filter((f) => !previousFileNames.includes(f.name)) ?? [];
|
|
26
|
+
return [...prev, ...newFiles];
|
|
27
|
+
});
|
|
39
28
|
}, []);
|
|
40
29
|
const handleFileRemove = useCallback((fileToRemove) => {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
setSelectedFile(undefined);
|
|
55
|
-
setClassName((prev) => prev.filter((c) => c !== "has-file"));
|
|
56
|
-
}
|
|
30
|
+
const dataTransfer = new DataTransfer();
|
|
31
|
+
setSelectedFiles((prev) => {
|
|
32
|
+
const newList = prev.filter((x) => x.name !== fileToRemove.name);
|
|
33
|
+
newList.forEach((file) => dataTransfer.items.add(file));
|
|
34
|
+
if (_input.current)
|
|
35
|
+
_input.current.files = dataTransfer.files;
|
|
36
|
+
if (newList.length === 0)
|
|
37
|
+
setClassName((prev) => prev.filter((c) => c !== "has-file"));
|
|
38
|
+
return newList;
|
|
39
|
+
});
|
|
57
40
|
}, []);
|
|
58
41
|
const handleValidationFile = useCallback((file) => {
|
|
59
42
|
const newErrors = [];
|
|
@@ -106,15 +89,8 @@ const Upload = ({ text, file, onChange, allowedTypes, maxSize, type = "list", mu
|
|
|
106
89
|
e.preventDefault();
|
|
107
90
|
e.stopPropagation();
|
|
108
91
|
const files = e.dataTransfer.files;
|
|
109
|
-
if (files && files.length > 0)
|
|
110
|
-
|
|
111
|
-
setSelectedFiles(Array.from(files));
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
setSelectedFile(files[files.length - 1]);
|
|
115
|
-
_firstLoad.current = true;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
92
|
+
if (files && files.length > 0)
|
|
93
|
+
setSelectedFiles(Array.from(files));
|
|
118
94
|
setClassName((prev) => prev.filter((c) => c !== "dragging"));
|
|
119
95
|
}, []);
|
|
120
96
|
const renderUploadFile = (params) => {
|
|
@@ -130,65 +106,38 @@ const Upload = ({ text, file, onChange, allowedTypes, maxSize, type = "list", mu
|
|
|
130
106
|
setValidationErrors([]);
|
|
131
107
|
_validationErrors.current = [];
|
|
132
108
|
if (_input.current) {
|
|
133
|
-
if (
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
// Seçilmiş olan dosyalar validasyona gönderiliyor.
|
|
139
|
-
selectedFiles.forEach((f) => handleValidationFile(f));
|
|
140
|
-
const inValidFiles = Array.from(new Set(_validationErrors.current));
|
|
141
|
-
// Input içerisine dosyalar aktarılıyor.
|
|
142
|
-
selectedFiles.forEach((f) => dataTransfer.items.add(f));
|
|
143
|
-
_input.current.files = dataTransfer.files;
|
|
144
|
-
// Geçerli olan dosyalar alındı...
|
|
145
|
-
const validFiles = [...selectedFiles.filter((x) => !inValidFiles.includes(x.name))];
|
|
146
|
-
validFiles.forEach((f) => fileFormData.append("file", f));
|
|
147
|
-
// Geçerli olan dosyalar base64'e dönüştürülüyor...
|
|
148
|
-
const base64Array = await Promise.all(validFiles.map((validFile) => handleFileToBase64(validFile)));
|
|
149
|
-
onChange(fileFormData, validFiles, base64Array, _validationErrors.current.length === 0);
|
|
150
|
-
// Eğer dosya varsa.
|
|
151
|
-
setClassName((prev) => {
|
|
152
|
-
const index = prev.findIndex((c) => c === "has-file");
|
|
153
|
-
if (index === -1)
|
|
154
|
-
return [...prev, "has-file"];
|
|
155
|
-
return prev;
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
if (selectedFile) {
|
|
160
|
-
handleValidationFile(selectedFile);
|
|
161
|
-
fileFormData.append("file", selectedFile);
|
|
162
|
-
onChange(fileFormData, selectedFile, await handleFileToBase64(selectedFile));
|
|
163
|
-
// Input içerisine dosyalar aktarılıyor.
|
|
164
|
-
dataTransfer.items.add(selectedFile);
|
|
165
|
-
_input.current.files = dataTransfer.files;
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
onChange(undefined, null, "");
|
|
169
|
-
}
|
|
109
|
+
if (selectedFiles.length === 0) {
|
|
110
|
+
onChange(fileFormData, [], [], false);
|
|
111
|
+
return;
|
|
170
112
|
}
|
|
113
|
+
// Seçilmiş olan dosyalar validasyona gönderiliyor.
|
|
114
|
+
selectedFiles.forEach((f) => handleValidationFile(f));
|
|
115
|
+
const inValidFiles = Array.from(new Set(_validationErrors.current));
|
|
116
|
+
// Input içerisine dosyalar aktarılıyor.
|
|
117
|
+
selectedFiles.forEach((f) => dataTransfer.items.add(f));
|
|
118
|
+
_input.current.files = dataTransfer.files;
|
|
119
|
+
// Geçerli olan dosyalar alındı...
|
|
120
|
+
const validFiles = [...selectedFiles.filter((x) => !inValidFiles.includes(x.name))];
|
|
121
|
+
validFiles.forEach((f) => fileFormData.append("file", f));
|
|
122
|
+
// Geçerli olan dosyalar base64'e dönüştürülüyor...
|
|
123
|
+
const base64Array = await Promise.all(validFiles.map((validFile) => handleFileToBase64(validFile)));
|
|
124
|
+
onChange(fileFormData, validFiles, base64Array, _validationErrors.current.length === 0);
|
|
125
|
+
// Eğer dosya varsa.
|
|
126
|
+
setClassName((prev) => {
|
|
127
|
+
const index = prev.findIndex((c) => c === "has-file");
|
|
128
|
+
if (index === -1)
|
|
129
|
+
return [...prev, "has-file"];
|
|
130
|
+
return prev;
|
|
131
|
+
});
|
|
171
132
|
}
|
|
172
133
|
})();
|
|
173
|
-
}, [selectedFiles
|
|
134
|
+
}, [selectedFiles]);
|
|
174
135
|
useEffect(() => {
|
|
175
|
-
if (_firstLoad.current)
|
|
176
|
-
// if (multiple && file.length === 0) {
|
|
177
|
-
// setSelectedFiles([]);
|
|
178
|
-
// } else {
|
|
179
|
-
// if (!file) setSelectedFile(undefined);
|
|
180
|
-
// }
|
|
136
|
+
if (_firstLoad.current)
|
|
181
137
|
return;
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
_firstLoad.current = true;
|
|
186
|
-
}
|
|
187
|
-
else {
|
|
188
|
-
setSelectedFile(file);
|
|
189
|
-
_firstLoad.current = true;
|
|
190
|
-
}
|
|
191
|
-
}, [file]);
|
|
138
|
+
setSelectedFiles(files);
|
|
139
|
+
_firstLoad.current = true;
|
|
140
|
+
}, [files]);
|
|
192
141
|
useEffect(() => {
|
|
193
142
|
if (type === "dropzone")
|
|
194
143
|
setClassName((prev) => [...prev, "dropzone"]);
|
|
@@ -201,7 +150,7 @@ const Upload = ({ text, file, onChange, allowedTypes, maxSize, type = "list", mu
|
|
|
201
150
|
if (_input.current)
|
|
202
151
|
_input.current.click();
|
|
203
152
|
} }, text && React.createElement("span", null, text)),
|
|
204
|
-
React.createElement(List, { selectedFiles: selectedFiles
|
|
153
|
+
React.createElement(List, { selectedFiles: selectedFiles ?? [], validationErrors: validationErrors, handleFileToBase64: handleFileToBase64, handleFileRemove: handleFileRemove }))),
|
|
205
154
|
});
|
|
206
155
|
case "dropzone":
|
|
207
156
|
return renderUploadFile({
|
|
@@ -210,8 +159,8 @@ const Upload = ({ text, file, onChange, allowedTypes, maxSize, type = "list", mu
|
|
|
210
159
|
if (_input.current)
|
|
211
160
|
_input.current.click();
|
|
212
161
|
} },
|
|
213
|
-
React.createElement(Dropzone, { selectedFiles: selectedFiles
|
|
214
|
-
|
|
162
|
+
React.createElement(Dropzone, { selectedFiles: selectedFiles ?? [], validationErrors: validationErrors, handleFileToBase64: handleFileToBase64, handleFileRemove: handleFileRemove }),
|
|
163
|
+
selectedFiles && selectedFiles.length === 0 && (React.createElement(React.Fragment, null,
|
|
215
164
|
React.createElement("div", { className: "upload" },
|
|
216
165
|
React.createElement(ARIcon, { icon: "CloudUpload-Fill", size: 32 }),
|
|
217
166
|
React.createElement("div", { className: "properies" },
|