albinasoft-ui-package 1.0.95 → 1.0.97
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.
@@ -7,6 +7,21 @@ export declare enum AllowedTypes {
|
|
7
7
|
VISUAL = "visual",
|
8
8
|
ALL = "all"
|
9
9
|
}
|
10
|
+
export interface FileUploaderTranslations {
|
11
|
+
dropAreaText: string;
|
12
|
+
fileLimitMultiText: string;
|
13
|
+
fileLimitSingleText: string;
|
14
|
+
uploadButtonText: string;
|
15
|
+
removeButtonTitle: string;
|
16
|
+
uploadSuccessToast: string;
|
17
|
+
uploadErrorToast: string;
|
18
|
+
uploadWarningLimit: string;
|
19
|
+
uploadWarningExceed: string;
|
20
|
+
fileSizeError: string;
|
21
|
+
fileTypeError: string;
|
22
|
+
noFileSelectedWarning: string;
|
23
|
+
}
|
24
|
+
export declare const defaultTranslations: FileUploaderTranslations;
|
10
25
|
export interface CustomFileUploaderProps {
|
11
26
|
/** Sunucuya dosyaların yükleneceği URL */
|
12
27
|
url: string;
|
@@ -32,6 +47,10 @@ export interface CustomFileUploaderProps {
|
|
32
47
|
* Opsiyonel: Pending (henüz yüklenmemiş) dosya sayısını parent'a iletecek callback.
|
33
48
|
*/
|
34
49
|
onPendingChange?: (pendingFileCount: number) => void;
|
50
|
+
/**
|
51
|
+
* Opsiyonel: Çoklu dil desteği için kullanılan çeviri metinleri.
|
52
|
+
*/
|
53
|
+
translations?: FileUploaderTranslations;
|
35
54
|
}
|
36
55
|
declare const CustomFileUploader: React.FC<CustomFileUploaderProps>;
|
37
56
|
export default CustomFileUploader;
|
@@ -79,7 +79,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
79
79
|
return to.concat(ar || Array.prototype.slice.call(from));
|
80
80
|
};
|
81
81
|
Object.defineProperty(exports, "__esModule", { value: true });
|
82
|
-
exports.AllowedTypes = void 0;
|
82
|
+
exports.defaultTranslations = exports.AllowedTypes = void 0;
|
83
83
|
// CustomFileUploader.tsx
|
84
84
|
var react_1 = __importStar(require("react"));
|
85
85
|
var react_toastify_1 = require("react-toastify");
|
@@ -96,6 +96,20 @@ var AllowedTypes;
|
|
96
96
|
AllowedTypes["VISUAL"] = "visual";
|
97
97
|
AllowedTypes["ALL"] = "all";
|
98
98
|
})(AllowedTypes = exports.AllowedTypes || (exports.AllowedTypes = {}));
|
99
|
+
exports.defaultTranslations = {
|
100
|
+
dropAreaText: "Dosyaları buraya sürükleyip bırakın veya tıklayarak dosya seçin.",
|
101
|
+
fileLimitMultiText: "Maksimum dosya limiti: ",
|
102
|
+
fileLimitSingleText: "Tek dosya seçilebilir",
|
103
|
+
uploadButtonText: "Yükle",
|
104
|
+
removeButtonTitle: "Kaldır",
|
105
|
+
uploadSuccessToast: "Dosyalar başarıyla yüklendi.",
|
106
|
+
uploadErrorToast: "Dosyalar yüklenirken bir hata oluştu.",
|
107
|
+
uploadWarningLimit: "Dosya yükleme limitini doldurdunuz. Yeni dosya ekleyebilmek için mevcut dosyaları kaldırın.",
|
108
|
+
uploadWarningExceed: "Seçilen dosya sayısı limiti aştı. Eklenebilecek dosya sayısı: ",
|
109
|
+
fileSizeError: "isimli dosya, boyut limitini aşıyor.",
|
110
|
+
fileTypeError: "isimli dosya, seçilen dosya türüne uygun değil.",
|
111
|
+
noFileSelectedWarning: "Önce en az bir dosya seçiniz."
|
112
|
+
};
|
99
113
|
// ====================
|
100
114
|
// Stil Ayarları
|
101
115
|
// ====================
|
@@ -191,9 +205,11 @@ var isAllowedFileType = function (file, allowedType) {
|
|
191
205
|
// ====================
|
192
206
|
// CustomFileUploader Bileşeni
|
193
207
|
// ====================
|
194
|
-
var CustomFileUploader = function (
|
195
|
-
var url =
|
196
|
-
|
208
|
+
var CustomFileUploader = function (props) {
|
209
|
+
var url = props.url, multi = props.multi, allowedTypes = props.allowedTypes, maxFile = props.maxFile, maxSize = props.maxSize, onUploadComplete = props.onUploadComplete, onRemoveUploaded = props.onRemoveUploaded, label = props.label, onPendingChange = props.onPendingChange, translations = props.translations;
|
210
|
+
// Varsayılan çeviri metinlerini, gelen prop ile birleştiriyoruz.
|
211
|
+
var finalTranslations = __assign(__assign({}, exports.defaultTranslations), translations);
|
212
|
+
var _a = (0, react_1.useState)([]), previews = _a[0], setPreviews = _a[1];
|
197
213
|
var fileInputRef = (0, react_1.useRef)(null);
|
198
214
|
// Pending dosya sayısını parent'a iletecek yardımcı fonksiyon
|
199
215
|
var updatePendingStatus = function (previewsArray) {
|
@@ -208,21 +224,22 @@ var CustomFileUploader = function (_a) {
|
|
208
224
|
var currentCount = multi ? previews.length : (previews.length > 0 ? 1 : 0);
|
209
225
|
var availableSlots = multi ? maxFile - currentCount : (currentCount === 0 ? 1 : 0);
|
210
226
|
if (availableSlots <= 0) {
|
211
|
-
react_toastify_1.toast.warning(
|
227
|
+
react_toastify_1.toast.warning(finalTranslations.uploadWarningLimit);
|
212
228
|
return;
|
213
229
|
}
|
214
230
|
var filesToAdd = filesArray.slice(0, availableSlots);
|
215
231
|
if (filesArray.length > availableSlots) {
|
216
|
-
react_toastify_1.toast.warning(
|
232
|
+
react_toastify_1.toast.warning(finalTranslations.uploadWarningExceed + availableSlots);
|
217
233
|
}
|
218
234
|
var newPreviews = [];
|
219
235
|
filesToAdd.forEach(function (file, index) {
|
220
236
|
if (file.size > maxSize) {
|
221
|
-
|
237
|
+
// Dosya adını eklemek için file.name'i dışarıda ekliyoruz.
|
238
|
+
react_toastify_1.toast.error(file.name + " " + finalTranslations.fileSizeError);
|
222
239
|
return;
|
223
240
|
}
|
224
241
|
if (!isAllowedFileType(file, allowedTypes)) {
|
225
|
-
react_toastify_1.toast.error(
|
242
|
+
react_toastify_1.toast.error(file.name + " " + finalTranslations.fileTypeError);
|
226
243
|
return;
|
227
244
|
}
|
228
245
|
var isImg = allowedTypes === AllowedTypes.IMAGE || (allowedTypes === AllowedTypes.VISUAL && isImageFile(file));
|
@@ -283,7 +300,7 @@ var CustomFileUploader = function (_a) {
|
|
283
300
|
case 0:
|
284
301
|
filesToUpload = previews.filter(function (item) { return !item.uploaded; }).map(function (item) { return item.file; });
|
285
302
|
if (filesToUpload.length === 0) {
|
286
|
-
react_toastify_1.toast.warning(
|
303
|
+
react_toastify_1.toast.warning(finalTranslations.noFileSelectedWarning);
|
287
304
|
return [2 /*return*/];
|
288
305
|
}
|
289
306
|
formData = new FormData();
|
@@ -321,36 +338,42 @@ var CustomFileUploader = function (_a) {
|
|
321
338
|
updatePendingStatus(updatedPreviews);
|
322
339
|
return updatedPreviews;
|
323
340
|
});
|
324
|
-
react_toastify_1.toast.success(
|
341
|
+
react_toastify_1.toast.success(finalTranslations.uploadSuccessToast);
|
325
342
|
}
|
326
343
|
else {
|
327
|
-
react_toastify_1.toast.error(
|
344
|
+
react_toastify_1.toast.error(finalTranslations.uploadErrorToast);
|
328
345
|
}
|
329
346
|
return [3 /*break*/, 6];
|
330
347
|
case 4: return [4 /*yield*/, response.json()];
|
331
348
|
case 5:
|
332
349
|
errorData = _a.sent();
|
333
350
|
console.error("API Hatası:", errorData);
|
334
|
-
react_toastify_1.toast.error(
|
351
|
+
react_toastify_1.toast.error(finalTranslations.uploadErrorToast);
|
335
352
|
_a.label = 6;
|
336
353
|
case 6: return [3 /*break*/, 8];
|
337
354
|
case 7:
|
338
355
|
error_1 = _a.sent();
|
339
356
|
console.error("API çağrısında hata:", error_1);
|
340
|
-
react_toastify_1.toast.error(
|
357
|
+
react_toastify_1.toast.error(finalTranslations.uploadErrorToast);
|
341
358
|
return [3 /*break*/, 8];
|
342
359
|
case 8: return [2 /*return*/];
|
343
360
|
}
|
344
361
|
});
|
345
362
|
}); };
|
363
|
+
// Dosya seçme alanı için drop area metni: dropAreaText + dosya limiti bilgisi
|
364
|
+
var dropAreaText = multi
|
365
|
+
? finalTranslations.dropAreaText + " " + (finalTranslations.fileLimitMultiText + maxFile)
|
366
|
+
: finalTranslations.dropAreaText + " " + (finalTranslations.fileLimitSingleText);
|
346
367
|
return (react_1.default.createElement("div", { style: { width: "100%", height: "100%" } },
|
347
368
|
label && (react_1.default.createElement("div", { style: { marginBottom: "10px" } },
|
348
369
|
react_1.default.createElement("label", { style: { fontWeight: "bold" } }, label))),
|
349
|
-
react_1.default.createElement("div", { style: dropAreaStyle, onDrop: handleDrop, onDragOver: handleDragOver, onClick: handleAreaClick }, previews.length === 0 ? (react_1.default.createElement("div", null,
|
350
|
-
"Dosyalar\u0131 buraya s\u00FCr\u00FCkleyip b\u0131rak\u0131n veya t\u0131klayarak dosya se\u00E7in.",
|
351
|
-
multi ? " (Maksimum ".concat(maxFile, " dosya se\u00E7ilebilir.)") : " (Tek dosya seçilebilir.)")) : (react_1.default.createElement("div", { style: previewContainerStyle }, previews.map(function (item) { return (react_1.default.createElement("div", { key: item.id, style: { display: "flex", flexDirection: "column", alignItems: "center" } },
|
370
|
+
react_1.default.createElement("div", { style: dropAreaStyle, onDrop: handleDrop, onDragOver: handleDragOver, onClick: handleAreaClick }, previews.length === 0 ? (react_1.default.createElement("div", null, dropAreaText)) : (react_1.default.createElement("div", { style: previewContainerStyle }, previews.map(function (item) { return (react_1.default.createElement("div", { key: item.id, style: { display: "flex", flexDirection: "column", alignItems: "center" } },
|
352
371
|
react_1.default.createElement("div", { style: previewItemStyle },
|
353
|
-
item.isImage ? (react_1.default.createElement("img", { src: item.previewContent, alt: "\u00D6nizleme ".concat(item.id), style: {
|
372
|
+
item.isImage ? (react_1.default.createElement("img", { src: item.previewContent, alt: "\u00D6nizleme ".concat(item.id), style: {
|
373
|
+
width: "100%",
|
374
|
+
height: "100%",
|
375
|
+
objectFit: "cover",
|
376
|
+
} })) : (react_1.default.createElement("div", { style: {
|
354
377
|
width: "100%",
|
355
378
|
height: "100%",
|
356
379
|
display: "flex",
|
@@ -361,7 +384,7 @@ var CustomFileUploader = function (_a) {
|
|
361
384
|
react_1.default.createElement("button", { type: "button", style: removeButtonStyle, onClick: function (e) {
|
362
385
|
e.stopPropagation();
|
363
386
|
handleRemoveFile(item.id);
|
364
|
-
}, title:
|
387
|
+
}, title: finalTranslations.removeButtonTitle }, "\u00D7"),
|
365
388
|
item.uploaded && react_1.default.createElement("div", { style: tickOverlayStyle }, "\u2713")),
|
366
389
|
react_1.default.createElement("div", { style: {
|
367
390
|
marginTop: "4px",
|
@@ -374,6 +397,6 @@ var CustomFileUploader = function (_a) {
|
|
374
397
|
}, title: item.file.name }, item.file.name))); })))),
|
375
398
|
react_1.default.createElement("input", { type: "file", multiple: multi, ref: fileInputRef, onChange: handleFileChange, style: { display: "none" } }),
|
376
399
|
previews.filter(function (item) { return !item.uploaded; }).length > 0 && (react_1.default.createElement("div", { style: { marginTop: "10px", textAlign: "center" } },
|
377
|
-
react_1.default.createElement("button", { type: "button", className: "btn btn-primary", onClick: handleUpload },
|
400
|
+
react_1.default.createElement("button", { type: "button", className: "btn btn-primary", onClick: handleUpload }, finalTranslations.uploadButtonText)))));
|
378
401
|
};
|
379
402
|
exports.default = CustomFileUploader;
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import React from "react";
|
2
2
|
import { TreeNode } from "./CustomTreeView";
|
3
|
-
import { AllowedTypes } from "./CustomFileUploader";
|
3
|
+
import { AllowedTypes, FileUploaderTranslations } from "./CustomFileUploader";
|
4
4
|
declare enum ElementType {
|
5
5
|
INPUT = "input",
|
6
6
|
TEXTAREA = "textarea",
|
@@ -172,6 +172,7 @@ interface FileUploaderElement {
|
|
172
172
|
onUploadComplete: (uploadedFileNames: string[]) => void;
|
173
173
|
onRemoveUploaded: (fileName: string) => void;
|
174
174
|
onPendingChange: (pendingFileCount: number) => void;
|
175
|
+
translations: FileUploaderTranslations;
|
175
176
|
rowId?: number;
|
176
177
|
colId?: number;
|
177
178
|
innerRowId?: number;
|
@@ -224,7 +224,7 @@ var CustomForm = function (_a) {
|
|
224
224
|
return (react_1.default.createElement("div", { className: "row ".concat(innerRowCustomClass), key: "inner-row-".concat(rowId, "-").concat(colId, "-").concat(innerRowId) }, elements.map(function (element) { return (react_1.default.createElement("div", { className: element.colClass || "col-12", key: element.id }, element.type === ElementType.TEXT ? (react_1.default.createElement(CustomText_1.default, __assign({}, element))) : element.type === ElementType.INPUT ? (react_1.default.createElement(CustomInput_1.default, __assign({}, element))) : element.type === ElementType.TEXTAREA ? (react_1.default.createElement(CustomTextarea_1.default, __assign({}, element))) : element.type === ElementType.CHECKBOX ? (react_1.default.createElement(CustomCheckbox_1.default, __assign({}, element))) : element.type === ElementType.RADIO ? (react_1.default.createElement(CustomRadioButton_1.default, __assign({}, element))) : element.type === ElementType.SELECT ? (react_1.default.createElement(CustomSelect_1.default, __assign({}, element, { submitted: submitted }))) : element.type === ElementType.DATETIMEPICKER ? (react_1.default.createElement(CustomDateTimePicker_1.default, __assign({}, element, { submitted: submitted }))) : element.type === ElementType.DIVIDER ? (react_1.default.createElement(CustomDivider_1.default, __assign({}, element))) : element.type === ElementType.RICHTEXTBOX ? (react_1.default.createElement(CustomRichTextbox_1.default, __assign({}, element))) : element.type === ElementType.TREEVIEW ? (react_1.default.createElement(CustomTreeView_1.default, __assign({}, element))) : element.type === ElementType.BUTTON ? (react_1.default.createElement(CustomButton_1.default, __assign({}, element, { isLoading: isLoading }))) : element.type === ElementType.AUTOCOMPLETEINPUT ? (react_1.default.createElement(CustomAutocompleteInput_1.default, __assign({}, element))) : element.type === ElementType.FILEUPLOADER ? (
|
225
225
|
// FILEUPLOADER elemanı için CustomFileUploader'ı render ediyoruz
|
226
226
|
react_1.default.createElement(react_1.default.Fragment, null,
|
227
|
-
react_1.default.createElement(CustomFileUploader_1.default, { url: element.url, multi: element.multi, allowedTypes: element.allowedTypes, maxFile: element.maxFile, maxSize: element.maxSize, onUploadComplete: element.onUploadComplete, onRemoveUploaded: element.onRemoveUploaded, onPendingChange: element.onPendingChange, label: element.label }))) : null)); })));
|
227
|
+
react_1.default.createElement(CustomFileUploader_1.default, { url: element.url, multi: element.multi, allowedTypes: element.allowedTypes, maxFile: element.maxFile, maxSize: element.maxSize, onUploadComplete: element.onUploadComplete, onRemoveUploaded: element.onRemoveUploaded, onPendingChange: element.onPendingChange, label: element.label, translations: element.translations }))) : null)); })));
|
228
228
|
})));
|
229
229
|
})));
|
230
230
|
}),
|