albinasoft-ui-package 1.1.28 → 1.1.29

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.
@@ -51,7 +51,10 @@ export interface CustomFileUploaderProps {
51
51
  * Opsiyonel: Çoklu dil desteği için kullanılan çeviri metinleri.
52
52
  */
53
53
  translations?: FileUploaderTranslations;
54
- resetTrigger?: boolean;
54
+ /**
55
+ * Eğer bu prop’un değeri değişirse uploader içini temizle
56
+ */
57
+ clearTrigger?: any;
55
58
  }
56
59
  declare const CustomFileUploader: React.FC<CustomFileUploaderProps>;
57
60
  export default CustomFileUploader;
@@ -112,7 +112,7 @@ exports.defaultTranslations = {
112
112
  uploadWarningExceed: "Seçilen dosya sayısı limiti aştı. Eklenebilecek dosya sayısı: ",
113
113
  fileSizeError: "isimli dosya, boyut limitini aşıyor.",
114
114
  fileTypeError: "isimli dosya, seçilen dosya türüne uygun değil.",
115
- noFileSelectedWarning: "Önce en az bir dosya seçiniz.",
115
+ noFileSelectedWarning: "Önce en az bir dosya seçiniz."
116
116
  };
117
117
  // ====================
118
118
  // Stil Ayarları
@@ -174,30 +174,9 @@ var fileTypeIcons = {
174
174
  };
175
175
  var defaultFileIcon = react_1.default.createElement(fa_1.FaFile, null);
176
176
  // İzin verilen dosya uzantıları
177
- var allowedFileExtensions = [
178
- ".pdf",
179
- ".doc",
180
- ".docx",
181
- ".xls",
182
- ".xlsx",
183
- ".txt",
184
- ];
185
- var allowedImageExtensions = [
186
- ".jpg",
187
- ".jpeg",
188
- ".png",
189
- ".gif",
190
- ".bmp",
191
- ".webp",
192
- ];
193
- var allowedVideoExtensions = [
194
- ".mp4",
195
- ".avi",
196
- ".mov",
197
- ".mkv",
198
- ".webm",
199
- ".flv",
200
- ];
177
+ var allowedFileExtensions = [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".txt"];
178
+ var allowedImageExtensions = [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp"];
179
+ var allowedVideoExtensions = [".mp4", ".avi", ".mov", ".mkv", ".webm", ".flv"];
201
180
  // ====================
202
181
  // Yardımcı Fonksiyonlar
203
182
  // ====================
@@ -222,8 +201,7 @@ var isAllowedFileType = function (file, allowedType) {
222
201
  case AllowedTypes.VIDEO:
223
202
  return allowedVideoExtensions.includes(ext);
224
203
  case AllowedTypes.VISUAL:
225
- return (allowedImageExtensions.includes(ext) ||
226
- allowedVideoExtensions.includes(ext));
204
+ return allowedImageExtensions.includes(ext) || allowedVideoExtensions.includes(ext);
227
205
  default:
228
206
  return false;
229
207
  }
@@ -232,17 +210,31 @@ var isAllowedFileType = function (file, allowedType) {
232
210
  // CustomFileUploader Bileşeni
233
211
  // ====================
234
212
  var CustomFileUploader = function (props) {
235
- 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, resetTrigger = props.resetTrigger;
213
+ 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, clearTrigger = props.clearTrigger;
236
214
  // Varsayılan çeviri metinlerini, gelen prop ile birleştiriyoruz.
237
215
  var finalTranslations = __assign(__assign({}, exports.defaultTranslations), translations);
238
216
  var _a = (0, react_1.useState)([]), previews = _a[0], setPreviews = _a[1];
239
217
  var fileInputRef = (0, react_1.useRef)(null);
218
+ // CustomFileUploader.tsx içinde component’in üst kısmına, diğer handler’ların yanına ekleyin:
219
+ var handleClearAll = function () {
220
+ previews.forEach(function (item) {
221
+ if (item.uploaded && item.serverFileName && onRemoveUploaded) {
222
+ onRemoveUploaded(item.serverFileName);
223
+ }
224
+ });
225
+ setPreviews([]);
226
+ updatePendingStatus([]);
227
+ if (fileInputRef.current) {
228
+ fileInputRef.current.value = "";
229
+ }
230
+ };
231
+ // form submit olduğunda temizlemeyi tetikleyecek listener
240
232
  (0, react_1.useEffect)(function () {
241
- if (props.resetTrigger) {
242
- setPreviews([]);
243
- updatePendingStatus([]);
233
+ // clearTrigger her değiştiğinde uploader’ı temizle
234
+ if (clearTrigger !== undefined) {
235
+ handleClearAll();
244
236
  }
245
- }, [props.resetTrigger]);
237
+ }, [clearTrigger]);
246
238
  // Pending dosya sayısını parent'a iletecek yardımcı fonksiyon
247
239
  var updatePendingStatus = function (previewsArray) {
248
240
  if (onPendingChange) {
@@ -253,12 +245,8 @@ var CustomFileUploader = function (props) {
253
245
  // Dosyaları ekleme işlemi
254
246
  var handleFiles = function (files) {
255
247
  var filesArray = Array.from(files);
256
- var currentCount = multi ? previews.length : previews.length > 0 ? 1 : 0;
257
- var availableSlots = multi
258
- ? maxFile - currentCount
259
- : currentCount === 0
260
- ? 1
261
- : 0;
248
+ var currentCount = multi ? previews.length : (previews.length > 0 ? 1 : 0);
249
+ var availableSlots = multi ? maxFile - currentCount : (currentCount === 0 ? 1 : 0);
262
250
  if (availableSlots <= 0) {
263
251
  react_toastify_1.toast.warning(finalTranslations.uploadWarningLimit);
264
252
  return;
@@ -278,8 +266,7 @@ var CustomFileUploader = function (props) {
278
266
  react_toastify_1.toast.error(file.name + " " + finalTranslations.fileTypeError);
279
267
  return;
280
268
  }
281
- var isImg = allowedTypes === AllowedTypes.IMAGE ||
282
- (allowedTypes === AllowedTypes.VISUAL && isImageFile(file));
269
+ var isImg = allowedTypes === AllowedTypes.IMAGE || (allowedTypes === AllowedTypes.VISUAL && isImageFile(file));
283
270
  var previewContent = isImg && isImageFile(file)
284
271
  ? URL.createObjectURL(file)
285
272
  : fileTypeIcons[getFileExtension(file)] || defaultFileIcon;
@@ -325,10 +312,7 @@ var CustomFileUploader = function (props) {
325
312
  setPreviews(updatedPreviews);
326
313
  updatePendingStatus(updatedPreviews);
327
314
  var itemToRemove = previews.find(function (item) { return item.id === previewId; });
328
- if (itemToRemove &&
329
- itemToRemove.uploaded &&
330
- itemToRemove.serverFileName &&
331
- onRemoveUploaded) {
315
+ if (itemToRemove && itemToRemove.uploaded && itemToRemove.serverFileName && onRemoveUploaded) {
332
316
  onRemoveUploaded(itemToRemove.serverFileName);
333
317
  }
334
318
  };
@@ -338,9 +322,7 @@ var CustomFileUploader = function (props) {
338
322
  return __generator(this, function (_a) {
339
323
  switch (_a.label) {
340
324
  case 0:
341
- filesToUpload = previews
342
- .filter(function (item) { return !item.uploaded; })
343
- .map(function (item) { return item.file; });
325
+ filesToUpload = previews.filter(function (item) { return !item.uploaded; }).map(function (item) { return item.file; });
344
326
  if (filesToUpload.length === 0) {
345
327
  react_toastify_1.toast.warning(finalTranslations.noFileSelectedWarning);
346
328
  return [2 /*return*/];
@@ -404,23 +386,12 @@ var CustomFileUploader = function (props) {
404
386
  }); };
405
387
  // Dosya seçme alanı için drop area metni: dropAreaText + dosya limiti bilgisi
406
388
  var dropAreaText = multi
407
- ? finalTranslations.dropAreaText +
408
- " (" +
409
- finalTranslations.fileLimitMultiText +
410
- ": " +
411
- maxFile +
412
- ") "
413
- : finalTranslations.dropAreaText +
414
- " " +
415
- finalTranslations.fileLimitSingleText;
389
+ ? finalTranslations.dropAreaText + " (" + finalTranslations.fileLimitMultiText + ": " + maxFile + ") "
390
+ : finalTranslations.dropAreaText + " " + (finalTranslations.fileLimitSingleText);
416
391
  return (react_1.default.createElement("div", { style: { width: "100%", height: "100%" } },
417
392
  label && (react_1.default.createElement("div", { style: { marginBottom: "10px" } },
418
393
  react_1.default.createElement("label", { style: { fontWeight: "bold" } }, label))),
419
- 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: {
420
- display: "flex",
421
- flexDirection: "column",
422
- alignItems: "center",
423
- } },
394
+ 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" } },
424
395
  react_1.default.createElement("div", { style: previewItemStyle },
425
396
  item.isImage ? (react_1.default.createElement("img", { src: item.previewContent, alt: "\u00D6nizleme ".concat(item.id), style: {
426
397
  width: "100%",
@@ -449,7 +420,8 @@ var CustomFileUploader = function (props) {
449
420
  whiteSpace: "nowrap",
450
421
  }, title: item.file.name }, item.file.name))); })))),
451
422
  react_1.default.createElement("input", { type: "file", multiple: multi, ref: fileInputRef, onChange: handleFileChange, style: { display: "none" } }),
452
- previews.filter(function (item) { return !item.uploaded; }).length > 0 && (react_1.default.createElement("div", { style: { marginTop: "10px", textAlign: "center" } },
453
- react_1.default.createElement(CustomButton_1.default, { label: finalTranslations.uploadButtonText, className: "btn btn-primary", onClick: handleUpload })))));
423
+ react_1.default.createElement("div", { className: "d-flex justify-content-center gap-2 mt-3" },
424
+ previews.length > 1 && (react_1.default.createElement(CustomButton_1.default, { label: "T\u00FCm\u00FCn\u00FC Sil", className: "btn btn-danger", onClick: handleClearAll })),
425
+ previews.filter(function (item) { return !item.uploaded; }).length > 0 && (react_1.default.createElement(CustomButton_1.default, { label: finalTranslations.uploadButtonText, className: "btn btn-primary", onClick: handleUpload })))));
454
426
  };
455
427
  exports.default = CustomFileUploader;
@@ -184,6 +184,7 @@ interface FileUploaderElement {
184
184
  onUploadComplete: (uploadedFileNames: string[]) => void;
185
185
  onRemoveUploaded: (fileName: string) => void;
186
186
  onPendingChange: (pendingFileCount: number) => void;
187
+ clearTrigger?: any;
187
188
  translations: FileUploaderTranslations;
188
189
  rowId?: number;
189
190
  colId?: number;
@@ -226,7 +226,7 @@ var CustomForm = function (_a) {
226
226
  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.PHONE ? (react_1.default.createElement(CustomPhoneInput_1.default, __assign({}, element))) : element.type === ElementType.FILEUPLOADER ? (
227
227
  // FILEUPLOADER elemanı için CustomFileUploader'ı render ediyoruz
228
228
  react_1.default.createElement(react_1.default.Fragment, null,
229
- 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)); })));
229
+ 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, clearTrigger: element.clearTrigger, label: element.label, translations: element.translations }))) : null)); })));
230
230
  })));
231
231
  })));
232
232
  }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "albinasoft-ui-package",
3
- "version": "1.1.28",
3
+ "version": "1.1.29",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {