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
|
326
|
+
var pendingItems, _loop_1, i;
|
322
327
|
return __generator(this, function (_a) {
|
323
328
|
switch (_a.label) {
|
324
329
|
case 0:
|
325
|
-
|
326
|
-
if (
|
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
|
-
|
331
|
-
|
332
|
-
|
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
|
-
|
337
|
-
return [
|
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
|
-
|
343
|
-
|
344
|
-
return [4 /*yield*/, response.json()];
|
408
|
+
_a.sent();
|
409
|
+
_a.label = 3;
|
345
410
|
case 3:
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
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:
|
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;
|