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 (_a) {
195
- var url = _a.url, multi = _a.multi, allowedTypes = _a.allowedTypes, maxFile = _a.maxFile, maxSize = _a.maxSize, onUploadComplete = _a.onUploadComplete, onRemoveUploaded = _a.onRemoveUploaded, label = _a.label, onPendingChange = _a.onPendingChange;
196
- var _b = (0, react_1.useState)([]), previews = _b[0], setPreviews = _b[1];
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("Dosya yükleme limitini doldurdunuz. Yeni dosya ekleyebilmek için mevcut dosyaları kaldırın.");
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("Se\u00E7ilen dosya say\u0131s\u0131 limiti a\u015Ft\u0131. Sadece ilk ".concat(availableSlots, " dosya eklenecektir."));
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
- react_toastify_1.toast.error("\"".concat(file.name, "\" dosyas\u0131 boyut limiti (").concat(maxSize, " byte) a\u015F\u0131yor."));
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("\"".concat(file.name, "\" dosyas\u0131 se\u00E7ilen dosya t\u00FCr\u00FCne uygun de\u011Fil."));
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("Önce en az bir dosya seçiniz.");
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("Dosyalar başarıyla yüklendi.");
341
+ react_toastify_1.toast.success(finalTranslations.uploadSuccessToast);
325
342
  }
326
343
  else {
327
- react_toastify_1.toast.error("Dosyalar yüklenirken bir hata oluştu.");
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("Dosyalar yüklenirken bir hata oluştu.");
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("Dosyalar yüklenirken bir hata oluştu.");
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: { width: "100%", height: "100%", objectFit: "cover" } })) : (react_1.default.createElement("div", { 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: "Kald\u0131r" }, "\u00D7"),
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 }, "Y\u00FCkle")))));
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
  }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "albinasoft-ui-package",
3
- "version": "1.0.95",
3
+ "version": "1.0.97",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {