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.
@@ -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, file: files, onChange: (formData, files) => {
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
- }, multiple: true }),
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].name]);
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
- file: File[];
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
- } & (IMultiple | ISingle) & IValidation & IDisabled;
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, file, onChange, allowedTypes, maxSize, type = "list", multiple }) => {
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
- if (_files.length > 0) {
25
- if (multiple) {
26
- setSelectedFiles((prev) => {
27
- const previousFileNames = prev.map((f) => f.name);
28
- const newFiles = _files.filter((f) => !previousFileNames.includes(f.name)) ?? [];
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
- if (multiple) {
42
- const dataTransfer = new DataTransfer();
43
- setSelectedFiles((prev) => {
44
- const newList = prev.filter((x) => x.name !== fileToRemove.name);
45
- newList.forEach((file) => dataTransfer.items.add(file));
46
- if (_input.current)
47
- _input.current.files = dataTransfer.files;
48
- if (newList.length === 0)
49
- setClassName((prev) => prev.filter((c) => c !== "has-file"));
50
- return newList;
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
- if (multiple) {
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 (multiple) {
134
- if (selectedFiles.length === 0) {
135
- onChange(fileFormData, [], [], false);
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, selectedFile]);
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
- if (multiple) {
184
- setSelectedFiles(file);
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.length === 0 && selectedFile ? [selectedFile] : selectedFiles, validationErrors: validationErrors, handleFileToBase64: handleFileToBase64, handleFileRemove: handleFileRemove }))),
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.length === 0 && selectedFile ? [selectedFile] : selectedFiles, validationErrors: validationErrors, handleFileToBase64: handleFileToBase64, handleFileRemove: handleFileRemove }),
214
- !selectedFile && selectedFiles.length === 0 && (React.createElement(React.Fragment, null,
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" },
@@ -35,6 +35,7 @@ export type TableColumnType<T> = {
35
35
  editable?: {
36
36
  type: "string" | "number" | "date-picker" | "single-select" | "multiple-select";
37
37
  options?: Option[];
38
+ method?: () => void | Promise<void>;
38
39
  };
39
40
  config?: {
40
41
  width?: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ar-design",
3
- "version": "0.3.4",
3
+ "version": "0.3.6",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",