albinasoft-ui-package 1.0.61 → 1.0.62

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.
@@ -16,7 +16,7 @@ export interface CustomFileUploaderProps {
16
16
  /** Her bir dosya için maksimum boyut (byte cinsinden) */
17
17
  maxSize: number;
18
18
  /**
19
- * Opsiyonel: Yükleme tamamlandığında dönen dosya isimleri (server tarafından belirlenen) bilgisini almak için callback.
19
+ * Opsiyonel: Yükleme tamamlandığında dönen dosya isimlerini almak için callback.
20
20
  */
21
21
  onUploadComplete?: (uploadedFileNames: string[]) => void;
22
22
  /**
@@ -25,6 +25,10 @@ export interface CustomFileUploaderProps {
25
25
  onRemoveUploaded?: (fileName: string) => void;
26
26
  /** Opsiyonel: Yükleyici için gösterilecek label */
27
27
  label?: string;
28
+ /**
29
+ * Opsiyonel: Pending (henüz yüklenmemiş) dosya sayısını parent'a iletecek callback.
30
+ */
31
+ onPendingChange?: (pendingFileCount: number) => void;
28
32
  }
29
33
  declare const CustomFileUploader: React.FC<CustomFileUploaderProps>;
30
34
  export default CustomFileUploader;
@@ -177,13 +177,19 @@ var isAllowedFileType = function (file, allowedTypes) {
177
177
  // CustomFileUploader Bileşeni
178
178
  // ====================
179
179
  var CustomFileUploader = function (_a) {
180
- 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;
180
+ 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;
181
181
  var _b = (0, react_1.useState)([]), previews = _b[0], setPreviews = _b[1];
182
182
  var fileInputRef = (0, react_1.useRef)(null);
183
- // Seçilen dosyaları işleme
183
+ // Pending dosya sayısını parent'a iletecek yardımcı fonksiyon
184
+ var updatePendingStatus = function (previewsArray) {
185
+ if (onPendingChange) {
186
+ var pendingFileCount = previewsArray.filter(function (item) { return !item.uploaded; }).length;
187
+ onPendingChange(pendingFileCount);
188
+ }
189
+ };
190
+ // Dosyaları ekleme işlemi
184
191
  var handleFiles = function (files) {
185
192
  var filesArray = Array.from(files);
186
- // Eğer multi false ise sadece bir dosya seçilebilir
187
193
  var currentCount = multi ? previews.length : (previews.length > 0 ? 1 : 0);
188
194
  var availableSlots = multi ? maxFile - currentCount : (currentCount === 0 ? 1 : 0);
189
195
  if (availableSlots <= 0) {
@@ -196,12 +202,10 @@ var CustomFileUploader = function (_a) {
196
202
  }
197
203
  var newPreviews = [];
198
204
  filesToAdd.forEach(function (file, index) {
199
- // Boyut kontrolü
200
205
  if (file.size > maxSize) {
201
206
  react_toastify_1.toast.error("\"".concat(file.name, "\" dosyas\u0131 boyut limiti (").concat(maxSize, " byte) a\u015F\u0131yor."));
202
207
  return;
203
208
  }
204
- // Tür kontrolü
205
209
  if (!isAllowedFileType(file, allowedTypes)) {
206
210
  react_toastify_1.toast.error("\"".concat(file.name, "\" dosyas\u0131 se\u00E7ilen dosya t\u00FCr\u00FCne uygun de\u011Fil."));
207
211
  return;
@@ -218,7 +222,11 @@ var CustomFileUploader = function (_a) {
218
222
  uploaded: false,
219
223
  });
220
224
  });
221
- setPreviews(function (prev) { return __spreadArray(__spreadArray([], prev, true), newPreviews, true); });
225
+ setPreviews(function (prev) {
226
+ var updatedPreviews = __spreadArray(__spreadArray([], prev, true), newPreviews, true);
227
+ updatePendingStatus(updatedPreviews);
228
+ return updatedPreviews;
229
+ });
222
230
  };
223
231
  // Dosya input değişiminde
224
232
  var handleFileChange = function (e) {
@@ -237,23 +245,22 @@ var CustomFileUploader = function (_a) {
237
245
  var handleDragOver = function (e) {
238
246
  e.preventDefault();
239
247
  };
240
- // Dosya seçim alanına tıklanınca
248
+ // Dosya seçim alanına tıklayınca input'u tetikleyin
241
249
  var handleAreaClick = function () {
242
250
  var _a;
243
251
  (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click();
244
252
  };
245
- // Dosya kaldırma
253
+ // Dosya kaldırma işlemi
246
254
  var handleRemoveFile = function (previewId) {
255
+ var updatedPreviews = previews.filter(function (item) { return item.id !== previewId; });
256
+ setPreviews(updatedPreviews);
257
+ updatePendingStatus(updatedPreviews);
247
258
  var itemToRemove = previews.find(function (item) { return item.id === previewId; });
248
- if (!itemToRemove)
249
- return;
250
- setPreviews(function (prev) { return prev.filter(function (item) { return item.id !== previewId; }); });
251
- // Eğer dosya sunucuya yüklenmişse, onRemoveUploaded callback'ini tetikleyin.
252
- if (itemToRemove.uploaded && itemToRemove.serverFileName && onRemoveUploaded) {
259
+ if (itemToRemove && itemToRemove.uploaded && itemToRemove.serverFileName && onRemoveUploaded) {
253
260
  onRemoveUploaded(itemToRemove.serverFileName);
254
261
  }
255
262
  };
256
- // Dosyaları sunucuya yükle
263
+ // Dosyaları sunucuya yükleme işlemi
257
264
  var handleUpload = function () { return __awaiter(void 0, void 0, void 0, function () {
258
265
  var filesToUpload, formData, response, data, uploadedFileNames_1, errorData, error_1;
259
266
  return __generator(this, function (_a) {
@@ -286,18 +293,18 @@ var CustomFileUploader = function (_a) {
286
293
  data.content.fileList &&
287
294
  data.content.fileList.length > 0) {
288
295
  uploadedFileNames_1 = data.content.fileList.map(function (item) { return item.fileName; });
289
- // Opsiyonel callback çağrısı
290
296
  if (onUploadComplete) {
291
297
  onUploadComplete(uploadedFileNames_1);
292
298
  }
293
- // Yüklenen dosyaların durumunu güncelle
294
299
  setPreviews(function (prev) {
295
- return prev.map(function (item, index) {
300
+ var updatedPreviews = prev.map(function (item, index) {
296
301
  if (!item.uploaded) {
297
302
  return __assign(__assign({}, item), { uploaded: true, serverFileName: uploadedFileNames_1[index] || item.file.name });
298
303
  }
299
304
  return item;
300
305
  });
306
+ updatePendingStatus(updatedPreviews);
307
+ return updatedPreviews;
301
308
  });
302
309
  react_toastify_1.toast.success("Dosyalar başarıyla yüklendi.");
303
310
  }
@@ -338,7 +345,7 @@ var CustomFileUploader = function (_a) {
338
345
  alignItems: "center",
339
346
  fontSize: "48px",
340
347
  } }, item.previewContent)),
341
- react_1.default.createElement("button", { type: "button" // Burada type="button" ekleyerek form submit'ini engelliyoruz.
348
+ react_1.default.createElement("button", { type: "button" // Form submit'ini tetiklememek için
342
349
  , style: removeButtonStyle, onClick: function (e) {
343
350
  e.stopPropagation();
344
351
  handleRemoveFile(item.id);
@@ -170,6 +170,7 @@ interface FileUploaderElement {
170
170
  maxSize: number;
171
171
  onUploadComplete: (uploadedFileNames: string[]) => void;
172
172
  onRemoveUploaded: (fileName: string) => void;
173
+ onPendingChange: (pendingFileCount: number) => void;
173
174
  rowId?: number;
174
175
  colId?: number;
175
176
  innerRowId?: number;
@@ -212,7 +212,7 @@ var CustomForm = function (_a) {
212
212
  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))) : element.type === ElementType.DATETIMEPICKER ? (react_1.default.createElement(CustomDateTimePicker_1.default, __assign({}, element))) : 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 ? (
213
213
  // FILEUPLOADER elemanı için CustomFileUploader'ı render ediyoruz
214
214
  react_1.default.createElement(react_1.default.Fragment, null,
215
- 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, label: element.label }))) : null)); })));
215
+ 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)); })));
216
216
  })));
217
217
  })));
218
218
  }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "albinasoft-ui-package",
3
- "version": "1.0.61",
3
+ "version": "1.0.62",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {