albinasoft-ui-package 1.1.33 → 1.1.35

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.
@@ -55,6 +55,7 @@ export interface CustomFileUploaderProps {
55
55
  * Eğer bu prop’un değeri değişirse uploader içini temizle
56
56
  */
57
57
  clearTrigger?: any;
58
+ onUploadedListChange?: (uploadedFileNames: string[]) => void;
58
59
  }
59
60
  declare const CustomFileUploader: React.FC<CustomFileUploaderProps>;
60
61
  export default CustomFileUploader;
@@ -308,7 +308,12 @@ var CustomFileUploader = function (props) {
308
308
  };
309
309
  // Dosya kaldırma işlemi
310
310
  var handleRemoveFile = function (previewId) {
311
+ var _a;
311
312
  var updatedPreviews = previews.filter(function (item) { return item.id !== previewId; });
313
+ var uploadedList = updatedPreviews
314
+ .filter(function (p) { return p.uploaded && p.serverFileName; })
315
+ .map(function (p) { return p.serverFileName; });
316
+ (_a = props.onUploadedListChange) === null || _a === void 0 ? void 0 : _a.call(props, uploadedList);
312
317
  setPreviews(updatedPreviews);
313
318
  updatePendingStatus(updatedPreviews);
314
319
  var itemToRemove = previews.find(function (item) { return item.id === previewId; });
@@ -318,69 +323,96 @@ var CustomFileUploader = function (props) {
318
323
  };
319
324
  // Dosyaları sunucuya yükleme işlemi
320
325
  var handleUpload = function () { return __awaiter(void 0, void 0, void 0, function () {
321
- var filesToUpload, formData, response, data, uploadedFileNames_1, errorData, error_1;
326
+ var pendingItems, _loop_1, i;
322
327
  return __generator(this, function (_a) {
323
328
  switch (_a.label) {
324
329
  case 0:
325
- filesToUpload = previews.filter(function (item) { return !item.uploaded; }).map(function (item) { return item.file; });
326
- if (filesToUpload.length === 0) {
330
+ pendingItems = previews.filter(function (item) { return !item.uploaded; });
331
+ if (pendingItems.length === 0) {
327
332
  react_toastify_1.toast.warning(finalTranslations.noFileSelectedWarning);
328
333
  return [2 /*return*/];
329
334
  }
330
- formData = new FormData();
331
- filesToUpload.forEach(function (file) {
332
- formData.append("file", file);
333
- });
335
+ _loop_1 = function (i) {
336
+ var item, formData, response, data, uploadedFileName_1, error_1;
337
+ return __generator(this, function (_b) {
338
+ switch (_b.label) {
339
+ case 0:
340
+ item = pendingItems[i];
341
+ // isUploading = true olarak işaretle
342
+ setPreviews(function (prev) {
343
+ var updated = prev.map(function (p) {
344
+ return p.id === item.id ? __assign(__assign({}, p), { isUploading: true }) : p;
345
+ });
346
+ updatePendingStatus(updated);
347
+ return updated;
348
+ });
349
+ formData = new FormData();
350
+ formData.append("file", item.file);
351
+ _b.label = 1;
352
+ case 1:
353
+ _b.trys.push([1, 6, , 7]);
354
+ return [4 /*yield*/, fetch(url, {
355
+ method: "POST",
356
+ body: formData,
357
+ })];
358
+ case 2:
359
+ response = _b.sent();
360
+ if (!response.ok) return [3 /*break*/, 4];
361
+ return [4 /*yield*/, response.json()];
362
+ case 3:
363
+ data = _b.sent();
364
+ if (data.responseCode === 200 && data.content && data.content.fileList.length > 0) {
365
+ uploadedFileName_1 = data.content.fileList[0].fileName;
366
+ setPreviews(function (prev) {
367
+ var _a;
368
+ var updated = prev.map(function (p) {
369
+ return p.id === item.id
370
+ ? __assign(__assign({}, p), { uploaded: true, isUploading: false, serverFileName: uploadedFileName_1 }) : p;
371
+ });
372
+ updatePendingStatus(updated);
373
+ var uploadedList = updated
374
+ .filter(function (p) { return p.uploaded && p.serverFileName; })
375
+ .map(function (p) { return p.serverFileName; });
376
+ (_a = props.onUploadedListChange) === null || _a === void 0 ? void 0 : _a.call(props, uploadedList);
377
+ return updated;
378
+ });
379
+ }
380
+ else {
381
+ throw new Error("Sunucu hatası");
382
+ }
383
+ return [3 /*break*/, 5];
384
+ case 4: throw new Error("HTTP hatası");
385
+ case 5: return [3 /*break*/, 7];
386
+ case 6:
387
+ error_1 = _b.sent();
388
+ console.error("Yükleme hatası:", error_1);
389
+ react_toastify_1.toast.error("".concat(item.file.name, " y\u00FCklenemedi."));
390
+ setPreviews(function (prev) {
391
+ var updated = prev.map(function (p) {
392
+ return p.id === item.id ? __assign(__assign({}, p), { isUploading: false }) : p;
393
+ });
394
+ updatePendingStatus(updated);
395
+ return updated;
396
+ });
397
+ return [3 /*break*/, 7];
398
+ case 7: return [2 /*return*/];
399
+ }
400
+ });
401
+ };
402
+ i = 0;
334
403
  _a.label = 1;
335
404
  case 1:
336
- _a.trys.push([1, 7, , 8]);
337
- return [4 /*yield*/, fetch(url, {
338
- method: "POST",
339
- body: formData,
340
- })];
405
+ if (!(i < pendingItems.length)) return [3 /*break*/, 4];
406
+ return [5 /*yield**/, _loop_1(i)];
341
407
  case 2:
342
- response = _a.sent();
343
- if (!response.ok) return [3 /*break*/, 4];
344
- return [4 /*yield*/, response.json()];
408
+ _a.sent();
409
+ _a.label = 3;
345
410
  case 3:
346
- data = _a.sent();
347
- if (data.responseCode === 200 &&
348
- data.content &&
349
- data.content.fileList &&
350
- data.content.fileList.length > 0) {
351
- uploadedFileNames_1 = data.content.fileList.map(function (item) { return item.fileName; });
352
- if (onUploadComplete) {
353
- onUploadComplete(uploadedFileNames_1);
354
- }
355
- setPreviews(function (prev) {
356
- var updatedPreviews = prev.map(function (item, index) {
357
- if (!item.uploaded) {
358
- return __assign(__assign({}, item), { uploaded: true, serverFileName: uploadedFileNames_1[index] || item.file.name });
359
- }
360
- return item;
361
- });
362
- updatePendingStatus(updatedPreviews);
363
- return updatedPreviews;
364
- });
365
- react_toastify_1.toast.success(finalTranslations.uploadSuccessToast);
366
- }
367
- else {
368
- react_toastify_1.toast.error(finalTranslations.uploadErrorToast);
369
- }
370
- return [3 /*break*/, 6];
371
- case 4: return [4 /*yield*/, response.json()];
372
- case 5:
373
- errorData = _a.sent();
374
- console.error("API Hatası:", errorData);
375
- react_toastify_1.toast.error(finalTranslations.uploadErrorToast);
376
- _a.label = 6;
377
- case 6: return [3 /*break*/, 8];
378
- case 7:
379
- error_1 = _a.sent();
380
- console.error("API çağrısında hata:", error_1);
381
- react_toastify_1.toast.error(finalTranslations.uploadErrorToast);
382
- return [3 /*break*/, 8];
383
- case 8: return [2 /*return*/];
411
+ i++;
412
+ return [3 /*break*/, 1];
413
+ case 4:
414
+ react_toastify_1.toast.success(finalTranslations.uploadSuccessToast);
415
+ return [2 /*return*/];
384
416
  }
385
417
  });
386
418
  }); };
@@ -409,7 +441,21 @@ var CustomFileUploader = function (props) {
409
441
  e.stopPropagation();
410
442
  handleRemoveFile(item.id);
411
443
  }, title: finalTranslations.removeButtonTitle }, "\u00D7"),
412
- item.uploaded && react_1.default.createElement("div", { style: tickOverlayStyle }, "\u2713")),
444
+ item.uploaded && react_1.default.createElement("div", { style: tickOverlayStyle }, "\u2713"),
445
+ item.isUploading && (react_1.default.createElement("div", { style: {
446
+ position: "absolute",
447
+ top: "0",
448
+ left: "0",
449
+ width: "100%",
450
+ height: "100%",
451
+ backgroundColor: "rgba(255,255,255,0.6)",
452
+ display: "flex",
453
+ justifyContent: "center",
454
+ alignItems: "center",
455
+ zIndex: 3,
456
+ } },
457
+ react_1.default.createElement("div", { className: "spinner-border text-primary", role: "status", style: { width: "24px", height: "24px" } },
458
+ react_1.default.createElement("span", { className: "visually-hidden" }, "Y\u00FCkleniyor..."))))),
413
459
  react_1.default.createElement("div", { style: {
414
460
  marginTop: "4px",
415
461
  fontSize: "12px",
@@ -219,6 +219,7 @@ interface CustomFormProps {
219
219
  handleCancel?: () => void;
220
220
  showConfirmButton?: boolean;
221
221
  showCancelButton?: boolean;
222
+ pendingFileCounts?: Record<string, number>;
222
223
  }
223
224
  declare const CustomForm: React.FC<CustomFormProps>;
224
225
  export { CustomForm, ElementType };
@@ -69,6 +69,15 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
69
69
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
70
70
  }
71
71
  };
72
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
73
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
74
+ if (ar || !(i in from)) {
75
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
76
+ ar[i] = from[i];
77
+ }
78
+ }
79
+ return to.concat(ar || Array.prototype.slice.call(from));
80
+ };
72
81
  var __importDefault = (this && this.__importDefault) || function (mod) {
73
82
  return (mod && mod.__esModule) ? mod : { "default": mod };
74
83
  };
@@ -116,10 +125,15 @@ var CustomForm = function (_a) {
116
125
  cancelLabel = _c === void 0 ? "Cancel" : _c, // Varsayılan değer
117
126
  handleCancel = _a.handleCancel, _d = _a.showConfirmButton, showConfirmButton = _d === void 0 ? true : _d, // Varsayılan olarak görünür
118
127
  _e = _a.showCancelButton, // Varsayılan olarak görünür
119
- showCancelButton = _e === void 0 ? false : _e;
128
+ showCancelButton = _e === void 0 ? false : _e, // Varsayılan olarak görünür
129
+ pendingFileCounts = _a.pendingFileCounts;
120
130
  var formRef = (0, react_1.useRef)(null);
121
131
  var _f = (0, react_1.useState)(false), isLoading = _f[0], setIsLoading = _f[1];
122
132
  var _g = (0, react_1.useState)(false), submitted = _g[0], setSubmitted = _g[1];
133
+ var _h = (0, react_1.useState)([]), uploadedFiles = _h[0], setUploadedFiles = _h[1];
134
+ var _j = (0, react_1.useState)([]), uploadedFileNames = _j[0], setUploadedFileNames = _j[1];
135
+ var isUploadingAnyFile = Object.values(pendingFileCounts || {}).some(function (count) { return count > 0; });
136
+ var disableConfirmButton = isLoading || isUploadingAnyFile;
123
137
  var handleConfirm = function (e) { return __awaiter(void 0, void 0, void 0, function () {
124
138
  var form, customSelectValid, isValid, formValues_1, error_1;
125
139
  return __generator(this, function (_a) {
@@ -184,6 +198,9 @@ var CustomForm = function (_a) {
184
198
  formValues_1[element.id] = element.value;
185
199
  }
186
200
  });
201
+ formValues_1.uploadedFiles = uploadedFiles;
202
+ formValues_1["__uploadedFileNames"] = uploadedFileNames;
203
+ formValues_1["fileNames"] = uploadedFileNames;
187
204
  return [4 /*yield*/, onSubmit(formValues_1)];
188
205
  case 2:
189
206
  _a.sent();
@@ -228,14 +245,18 @@ var CustomForm = function (_a) {
228
245
  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.SIMPLESELECT ? (react_1.default.createElement(CustomSimpleSelect_1.default, __assign({}, element, { value: Array.isArray(element.value) ? element.value[0] || "" : "", onChange: function (val) { return element.onChange(val); } }))) : 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 ? (
229
246
  // FILEUPLOADER elemanı için CustomFileUploader'ı render ediyoruz
230
247
  react_1.default.createElement(react_1.default.Fragment, null,
231
- 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)); })));
248
+ react_1.default.createElement(CustomFileUploader_1.default, { url: element.url, multi: element.multi, allowedTypes: element.allowedTypes, maxFile: element.maxFile, maxSize: element.maxSize, onUploadComplete: function (fileNames) {
249
+ var _a, _b;
250
+ setUploadedFileNames(function (prev) { return __spreadArray(__spreadArray([], prev, true), fileNames, true); });
251
+ (_b = (_a = element).onUploadComplete) === null || _b === void 0 ? void 0 : _b.call(_a, fileNames); // Orijinal fonksiyonu da tetikle
252
+ }, onRemoveUploaded: element.onRemoveUploaded, onPendingChange: element.onPendingChange, clearTrigger: element.clearTrigger, label: element.label, translations: element.translations, onUploadedListChange: setUploadedFiles }))) : null)); })));
232
253
  })));
233
254
  })));
234
255
  }),
235
256
  (showConfirmButton || showCancelButton) && (react_1.default.createElement("div", { className: "card-footer mt-3" },
236
257
  react_1.default.createElement("div", { className: "form-actions mt-3", style: { display: "flex", justifyContent: "flex-end", gap: "10px" } },
237
258
  showCancelButton && (react_1.default.createElement(CustomButton_1.default, { label: cancelLabel, className: "btn btn-secondary", onClick: handleCancel || (function () { }), isLoading: isLoading })),
238
- showConfirmButton && (react_1.default.createElement(CustomButton_1.default, { label: confirmLabel, className: "btn btn-primary", onClick: handleConfirm, isLoading: isLoading })))))));
259
+ showConfirmButton && (react_1.default.createElement(CustomButton_1.default, { label: confirmLabel, className: "btn btn-primary", onClick: handleConfirm, isLoading: isLoading, disabled: disableConfirmButton })))))));
239
260
  };
240
261
  exports.CustomForm = CustomForm;
241
262
  exports.default = CustomForm;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "albinasoft-ui-package",
3
- "version": "1.1.33",
3
+ "version": "1.1.35",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {