albinasoft-ui-package 1.1.33 → 1.1.34
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.
@@ -318,69 +318,91 @@ var CustomFileUploader = function (props) {
|
|
318
318
|
};
|
319
319
|
// Dosyaları sunucuya yükleme işlemi
|
320
320
|
var handleUpload = function () { return __awaiter(void 0, void 0, void 0, function () {
|
321
|
-
var
|
321
|
+
var pendingItems, _loop_1, i;
|
322
322
|
return __generator(this, function (_a) {
|
323
323
|
switch (_a.label) {
|
324
324
|
case 0:
|
325
|
-
|
326
|
-
if (
|
325
|
+
pendingItems = previews.filter(function (item) { return !item.uploaded; });
|
326
|
+
if (pendingItems.length === 0) {
|
327
327
|
react_toastify_1.toast.warning(finalTranslations.noFileSelectedWarning);
|
328
328
|
return [2 /*return*/];
|
329
329
|
}
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
330
|
+
_loop_1 = function (i) {
|
331
|
+
var item, formData, response, data, uploadedFileName_1, error_1;
|
332
|
+
return __generator(this, function (_b) {
|
333
|
+
switch (_b.label) {
|
334
|
+
case 0:
|
335
|
+
item = pendingItems[i];
|
336
|
+
// isUploading = true olarak işaretle
|
337
|
+
setPreviews(function (prev) {
|
338
|
+
var updated = prev.map(function (p) {
|
339
|
+
return p.id === item.id ? __assign(__assign({}, p), { isUploading: true }) : p;
|
340
|
+
});
|
341
|
+
updatePendingStatus(updated);
|
342
|
+
return updated;
|
343
|
+
});
|
344
|
+
formData = new FormData();
|
345
|
+
formData.append("file", item.file);
|
346
|
+
_b.label = 1;
|
347
|
+
case 1:
|
348
|
+
_b.trys.push([1, 6, , 7]);
|
349
|
+
return [4 /*yield*/, fetch(url, {
|
350
|
+
method: "POST",
|
351
|
+
body: formData,
|
352
|
+
})];
|
353
|
+
case 2:
|
354
|
+
response = _b.sent();
|
355
|
+
if (!response.ok) return [3 /*break*/, 4];
|
356
|
+
return [4 /*yield*/, response.json()];
|
357
|
+
case 3:
|
358
|
+
data = _b.sent();
|
359
|
+
if (data.responseCode === 200 && data.content && data.content.fileList.length > 0) {
|
360
|
+
uploadedFileName_1 = data.content.fileList[0].fileName;
|
361
|
+
setPreviews(function (prev) {
|
362
|
+
var updated = prev.map(function (p) {
|
363
|
+
return p.id === item.id
|
364
|
+
? __assign(__assign({}, p), { uploaded: true, isUploading: false, serverFileName: uploadedFileName_1 }) : p;
|
365
|
+
});
|
366
|
+
updatePendingStatus(updated);
|
367
|
+
return updated;
|
368
|
+
});
|
369
|
+
}
|
370
|
+
else {
|
371
|
+
throw new Error("Sunucu hatası");
|
372
|
+
}
|
373
|
+
return [3 /*break*/, 5];
|
374
|
+
case 4: throw new Error("HTTP hatası");
|
375
|
+
case 5: return [3 /*break*/, 7];
|
376
|
+
case 6:
|
377
|
+
error_1 = _b.sent();
|
378
|
+
console.error("Yükleme hatası:", error_1);
|
379
|
+
react_toastify_1.toast.error("".concat(item.file.name, " y\u00FCklenemedi."));
|
380
|
+
setPreviews(function (prev) {
|
381
|
+
var updated = prev.map(function (p) {
|
382
|
+
return p.id === item.id ? __assign(__assign({}, p), { isUploading: false }) : p;
|
383
|
+
});
|
384
|
+
updatePendingStatus(updated);
|
385
|
+
return updated;
|
386
|
+
});
|
387
|
+
return [3 /*break*/, 7];
|
388
|
+
case 7: return [2 /*return*/];
|
389
|
+
}
|
390
|
+
});
|
391
|
+
};
|
392
|
+
i = 0;
|
334
393
|
_a.label = 1;
|
335
394
|
case 1:
|
336
|
-
|
337
|
-
return [
|
338
|
-
method: "POST",
|
339
|
-
body: formData,
|
340
|
-
})];
|
395
|
+
if (!(i < pendingItems.length)) return [3 /*break*/, 4];
|
396
|
+
return [5 /*yield**/, _loop_1(i)];
|
341
397
|
case 2:
|
342
|
-
|
343
|
-
|
344
|
-
return [4 /*yield*/, response.json()];
|
398
|
+
_a.sent();
|
399
|
+
_a.label = 3;
|
345
400
|
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*/];
|
401
|
+
i++;
|
402
|
+
return [3 /*break*/, 1];
|
403
|
+
case 4:
|
404
|
+
react_toastify_1.toast.success(finalTranslations.uploadSuccessToast);
|
405
|
+
return [2 /*return*/];
|
384
406
|
}
|
385
407
|
});
|
386
408
|
}); };
|
@@ -409,7 +431,21 @@ var CustomFileUploader = function (props) {
|
|
409
431
|
e.stopPropagation();
|
410
432
|
handleRemoveFile(item.id);
|
411
433
|
}, title: finalTranslations.removeButtonTitle }, "\u00D7"),
|
412
|
-
item.uploaded && react_1.default.createElement("div", { style: tickOverlayStyle }, "\u2713")
|
434
|
+
item.uploaded && react_1.default.createElement("div", { style: tickOverlayStyle }, "\u2713"),
|
435
|
+
item.isUploading && (react_1.default.createElement("div", { style: {
|
436
|
+
position: "absolute",
|
437
|
+
top: "0",
|
438
|
+
left: "0",
|
439
|
+
width: "100%",
|
440
|
+
height: "100%",
|
441
|
+
backgroundColor: "rgba(255,255,255,0.6)",
|
442
|
+
display: "flex",
|
443
|
+
justifyContent: "center",
|
444
|
+
alignItems: "center",
|
445
|
+
zIndex: 3,
|
446
|
+
} },
|
447
|
+
react_1.default.createElement("div", { className: "spinner-border text-primary", role: "status", style: { width: "24px", height: "24px" } },
|
448
|
+
react_1.default.createElement("span", { className: "visually-hidden" }, "Y\u00FCkleniyor..."))))),
|
413
449
|
react_1.default.createElement("div", { style: {
|
414
450
|
marginTop: "4px",
|
415
451
|
fontSize: "12px",
|
@@ -7,7 +7,6 @@ declare enum ElementType {
|
|
7
7
|
CHECKBOX = "checkbox",
|
8
8
|
RADIO = "radio",
|
9
9
|
SELECT = "select",
|
10
|
-
SIMPLESELECT = "simpleselect",
|
11
10
|
DATETIMEPICKER = "datetimepicker",
|
12
11
|
TEXT = "text",
|
13
12
|
DIVIDER = "divider",
|
@@ -84,23 +83,6 @@ interface SelectElement {
|
|
84
83
|
colClass?: string;
|
85
84
|
onChange: (value: string | string[]) => void;
|
86
85
|
}
|
87
|
-
interface SimpleSelectElement {
|
88
|
-
required: boolean;
|
89
|
-
id?: string;
|
90
|
-
type: ElementType;
|
91
|
-
label: string;
|
92
|
-
value: string[];
|
93
|
-
options: {
|
94
|
-
id: string;
|
95
|
-
label: string;
|
96
|
-
value: string;
|
97
|
-
}[];
|
98
|
-
rowId?: number;
|
99
|
-
colId?: number;
|
100
|
-
innerRowId?: number;
|
101
|
-
colClass?: string;
|
102
|
-
onChange: (value: string | string[]) => void;
|
103
|
-
}
|
104
86
|
interface DateTimePickerElement {
|
105
87
|
id?: string;
|
106
88
|
type: ElementType;
|
@@ -209,7 +191,7 @@ interface FileUploaderElement {
|
|
209
191
|
innerRowId?: number;
|
210
192
|
colClass?: string;
|
211
193
|
}
|
212
|
-
type FormElement = InputElement | TextareaElement | CheckboxElement | RadioButtonElement | SelectElement |
|
194
|
+
type FormElement = InputElement | TextareaElement | CheckboxElement | RadioButtonElement | SelectElement | DateTimePickerElement | TextElement | DividerElement | RichTextboxElement | TreeViewElement | ButtonElement | AutoCompleteInputElement | PhoneElement | FileUploaderElement;
|
213
195
|
interface CustomFormProps {
|
214
196
|
elements: FormElement[];
|
215
197
|
innerRowCustomClass?: string;
|
@@ -219,6 +201,7 @@ interface CustomFormProps {
|
|
219
201
|
handleCancel?: () => void;
|
220
202
|
showConfirmButton?: boolean;
|
221
203
|
showCancelButton?: boolean;
|
204
|
+
pendingFileCounts?: Record<string, number>;
|
222
205
|
}
|
223
206
|
declare const CustomForm: React.FC<CustomFormProps>;
|
224
207
|
export { CustomForm, ElementType };
|
@@ -82,7 +82,6 @@ var CustomTextarea_1 = __importDefault(require("./CustomTextarea"));
|
|
82
82
|
var CustomCheckbox_1 = __importDefault(require("./CustomCheckbox"));
|
83
83
|
var CustomRadioButton_1 = __importDefault(require("./CustomRadioButton"));
|
84
84
|
var CustomSelect_1 = __importDefault(require("./CustomSelect"));
|
85
|
-
var CustomSimpleSelect_1 = __importDefault(require("./CustomSimpleSelect"));
|
86
85
|
var CustomDateTimePicker_1 = __importDefault(require("./CustomDateTimePicker"));
|
87
86
|
var CustomText_1 = __importDefault(require("./CustomText"));
|
88
87
|
var CustomDivider_1 = __importDefault(require("./CustomDivider"));
|
@@ -98,7 +97,6 @@ var ElementType;
|
|
98
97
|
ElementType["CHECKBOX"] = "checkbox";
|
99
98
|
ElementType["RADIO"] = "radio";
|
100
99
|
ElementType["SELECT"] = "select";
|
101
|
-
ElementType["SIMPLESELECT"] = "simpleselect";
|
102
100
|
ElementType["DATETIMEPICKER"] = "datetimepicker";
|
103
101
|
ElementType["TEXT"] = "text";
|
104
102
|
ElementType["DIVIDER"] = "divider";
|
@@ -116,10 +114,13 @@ var CustomForm = function (_a) {
|
|
116
114
|
cancelLabel = _c === void 0 ? "Cancel" : _c, // Varsayılan değer
|
117
115
|
handleCancel = _a.handleCancel, _d = _a.showConfirmButton, showConfirmButton = _d === void 0 ? true : _d, // Varsayılan olarak görünür
|
118
116
|
_e = _a.showCancelButton, // Varsayılan olarak görünür
|
119
|
-
showCancelButton = _e === void 0 ? false : _e
|
117
|
+
showCancelButton = _e === void 0 ? false : _e, // Varsayılan olarak görünür
|
118
|
+
pendingFileCounts = _a.pendingFileCounts;
|
120
119
|
var formRef = (0, react_1.useRef)(null);
|
121
120
|
var _f = (0, react_1.useState)(false), isLoading = _f[0], setIsLoading = _f[1];
|
122
121
|
var _g = (0, react_1.useState)(false), submitted = _g[0], setSubmitted = _g[1];
|
122
|
+
var isUploadingAnyFile = Object.values(pendingFileCounts || {}).some(function (count) { return count > 0; });
|
123
|
+
var disableConfirmButton = isLoading || isUploadingAnyFile;
|
123
124
|
var handleConfirm = function (e) { return __awaiter(void 0, void 0, void 0, function () {
|
124
125
|
var form, customSelectValid, isValid, formValues_1, error_1;
|
125
126
|
return __generator(this, function (_a) {
|
@@ -225,7 +226,7 @@ var CustomForm = function (_a) {
|
|
225
226
|
var colId = _a[0], innerRows = _a[1];
|
226
227
|
return (react_1.default.createElement("div", { className: "col", key: "col-".concat(rowId, "-").concat(colId) }, Object.entries(innerRows).map(function (_a) {
|
227
228
|
var innerRowId = _a[0], elements = _a[1];
|
228
|
-
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.
|
229
|
+
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 ? (
|
229
230
|
// FILEUPLOADER elemanı için CustomFileUploader'ı render ediyoruz
|
230
231
|
react_1.default.createElement(react_1.default.Fragment, null,
|
231
232
|
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)); })));
|
@@ -235,7 +236,7 @@ var CustomForm = function (_a) {
|
|
235
236
|
(showConfirmButton || showCancelButton) && (react_1.default.createElement("div", { className: "card-footer mt-3" },
|
236
237
|
react_1.default.createElement("div", { className: "form-actions mt-3", style: { display: "flex", justifyContent: "flex-end", gap: "10px" } },
|
237
238
|
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 })))))));
|
239
|
+
showConfirmButton && (react_1.default.createElement(CustomButton_1.default, { label: confirmLabel, className: "btn btn-primary", onClick: handleConfirm, isLoading: isLoading, disabled: disableConfirmButton })))))));
|
239
240
|
};
|
240
241
|
exports.CustomForm = CustomForm;
|
241
242
|
exports.default = CustomForm;
|