albinasoft-ui-package 1.1.35 → 1.1.37
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,7 +55,6 @@ 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;
|
59
58
|
}
|
60
59
|
declare const CustomFileUploader: React.FC<CustomFileUploaderProps>;
|
61
60
|
export default CustomFileUploader;
|
@@ -117,6 +117,18 @@ exports.defaultTranslations = {
|
|
117
117
|
// ====================
|
118
118
|
// Stil Ayarları
|
119
119
|
// ====================
|
120
|
+
var spinnerStyle = {
|
121
|
+
position: "absolute",
|
122
|
+
top: "40%",
|
123
|
+
left: "40%",
|
124
|
+
width: "20px",
|
125
|
+
height: "20px",
|
126
|
+
border: "2px solid #007bff",
|
127
|
+
borderTop: "2px solid transparent",
|
128
|
+
borderRadius: "50%",
|
129
|
+
animation: "spin 1s linear infinite",
|
130
|
+
zIndex: 3,
|
131
|
+
};
|
120
132
|
var dropAreaStyle = {
|
121
133
|
border: "2px dashed #007bff",
|
122
134
|
borderRadius: "5px",
|
@@ -235,6 +247,14 @@ var CustomFileUploader = function (props) {
|
|
235
247
|
handleClearAll();
|
236
248
|
}
|
237
249
|
}, [clearTrigger]);
|
250
|
+
(0, react_1.useEffect)(function () {
|
251
|
+
var style = document.createElement("style");
|
252
|
+
style.innerHTML = "\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n ";
|
253
|
+
document.head.appendChild(style);
|
254
|
+
return function () {
|
255
|
+
document.head.removeChild(style);
|
256
|
+
};
|
257
|
+
}, []);
|
238
258
|
// Pending dosya sayısını parent'a iletecek yardımcı fonksiyon
|
239
259
|
var updatePendingStatus = function (previewsArray) {
|
240
260
|
if (onPendingChange) {
|
@@ -308,12 +328,7 @@ var CustomFileUploader = function (props) {
|
|
308
328
|
};
|
309
329
|
// Dosya kaldırma işlemi
|
310
330
|
var handleRemoveFile = function (previewId) {
|
311
|
-
var _a;
|
312
331
|
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);
|
317
332
|
setPreviews(updatedPreviews);
|
318
333
|
updatePendingStatus(updatedPreviews);
|
319
334
|
var itemToRemove = previews.find(function (item) { return item.id === previewId; });
|
@@ -323,96 +338,75 @@ var CustomFileUploader = function (props) {
|
|
323
338
|
};
|
324
339
|
// Dosyaları sunucuya yükleme işlemi
|
325
340
|
var handleUpload = function () { return __awaiter(void 0, void 0, void 0, function () {
|
326
|
-
var
|
341
|
+
var filesToUpload, formData, response, data, uploadedFileNames_1, errorData, error_1;
|
327
342
|
return __generator(this, function (_a) {
|
328
343
|
switch (_a.label) {
|
329
344
|
case 0:
|
330
|
-
|
331
|
-
if (
|
345
|
+
filesToUpload = previews.filter(function (item) { return !item.uploaded; }).map(function (item) { return item.file; });
|
346
|
+
if (filesToUpload.length === 0) {
|
332
347
|
react_toastify_1.toast.warning(finalTranslations.noFileSelectedWarning);
|
333
348
|
return [2 /*return*/];
|
334
349
|
}
|
335
|
-
|
336
|
-
|
337
|
-
return
|
338
|
-
|
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
|
-
}
|
350
|
+
// Yüklenmeye başlayan dosyaları işaretle
|
351
|
+
setPreviews(function (prev) {
|
352
|
+
return prev.map(function (item) {
|
353
|
+
return !item.uploaded ? __assign(__assign({}, item), { isUploading: true }) : item;
|
400
354
|
});
|
401
|
-
};
|
402
|
-
|
355
|
+
});
|
356
|
+
formData = new FormData();
|
357
|
+
filesToUpload.forEach(function (file) {
|
358
|
+
formData.append("file", file);
|
359
|
+
});
|
403
360
|
_a.label = 1;
|
404
361
|
case 1:
|
405
|
-
|
406
|
-
return [
|
362
|
+
_a.trys.push([1, 7, , 8]);
|
363
|
+
return [4 /*yield*/, fetch(url, {
|
364
|
+
method: "POST",
|
365
|
+
body: formData,
|
366
|
+
})];
|
407
367
|
case 2:
|
408
|
-
_a.sent();
|
409
|
-
|
368
|
+
response = _a.sent();
|
369
|
+
if (!response.ok) return [3 /*break*/, 4];
|
370
|
+
return [4 /*yield*/, response.json()];
|
410
371
|
case 3:
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
372
|
+
data = _a.sent();
|
373
|
+
if (data.responseCode === 200 &&
|
374
|
+
data.content &&
|
375
|
+
data.content.fileList &&
|
376
|
+
data.content.fileList.length > 0) {
|
377
|
+
uploadedFileNames_1 = data.content.fileList.map(function (item) { return item.fileName; });
|
378
|
+
if (onUploadComplete) {
|
379
|
+
onUploadComplete(uploadedFileNames_1);
|
380
|
+
}
|
381
|
+
setPreviews(function (prev) {
|
382
|
+
var updatedPreviews = prev.map(function (item, index) {
|
383
|
+
if (!item.uploaded) {
|
384
|
+
return __assign(__assign({}, item), { uploaded: true, isUploading: false, serverFileName: uploadedFileNames_1[index] || item.file.name });
|
385
|
+
}
|
386
|
+
return item;
|
387
|
+
});
|
388
|
+
updatePendingStatus(updatedPreviews);
|
389
|
+
return updatedPreviews;
|
390
|
+
});
|
391
|
+
react_toastify_1.toast.success(finalTranslations.uploadSuccessToast);
|
392
|
+
}
|
393
|
+
else {
|
394
|
+
react_toastify_1.toast.error(finalTranslations.uploadErrorToast);
|
395
|
+
}
|
396
|
+
return [3 /*break*/, 6];
|
397
|
+
case 4: return [4 /*yield*/, response.json()];
|
398
|
+
case 5:
|
399
|
+
errorData = _a.sent();
|
400
|
+
console.error("API Hatası:", errorData);
|
401
|
+
react_toastify_1.toast.error(finalTranslations.uploadErrorToast);
|
402
|
+
_a.label = 6;
|
403
|
+
case 6: return [3 /*break*/, 8];
|
404
|
+
case 7:
|
405
|
+
error_1 = _a.sent();
|
406
|
+
console.error("API çağrısında hata:", error_1);
|
407
|
+
react_toastify_1.toast.error(finalTranslations.uploadErrorToast);
|
408
|
+
return [3 /*break*/, 8];
|
409
|
+
case 8: return [2 /*return*/];
|
416
410
|
}
|
417
411
|
});
|
418
412
|
}); };
|
@@ -425,10 +419,12 @@ var CustomFileUploader = function (props) {
|
|
425
419
|
react_1.default.createElement("label", { style: { fontWeight: "bold" } }, label))),
|
426
420
|
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" } },
|
427
421
|
react_1.default.createElement("div", { style: previewItemStyle },
|
422
|
+
item.isUploading && react_1.default.createElement("div", { style: spinnerStyle }),
|
428
423
|
item.isImage ? (react_1.default.createElement("img", { src: item.previewContent, alt: "\u00D6nizleme ".concat(item.id), style: {
|
429
424
|
width: "100%",
|
430
425
|
height: "100%",
|
431
426
|
objectFit: "cover",
|
427
|
+
opacity: item.isUploading ? 0.5 : 1,
|
432
428
|
} })) : (react_1.default.createElement("div", { style: {
|
433
429
|
width: "100%",
|
434
430
|
height: "100%",
|
@@ -436,26 +432,13 @@ var CustomFileUploader = function (props) {
|
|
436
432
|
justifyContent: "center",
|
437
433
|
alignItems: "center",
|
438
434
|
fontSize: "48px",
|
435
|
+
opacity: item.isUploading ? 0.5 : 1,
|
439
436
|
} }, item.previewContent)),
|
440
437
|
react_1.default.createElement("button", { type: "button", style: removeButtonStyle, onClick: function (e) {
|
441
438
|
e.stopPropagation();
|
442
439
|
handleRemoveFile(item.id);
|
443
|
-
}, title: finalTranslations.removeButtonTitle }, "\u00D7"),
|
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..."))))),
|
440
|
+
}, title: finalTranslations.removeButtonTitle, disabled: item.isUploading }, "\u00D7"),
|
441
|
+
item.uploaded && react_1.default.createElement("div", { style: tickOverlayStyle }, "\u2713")),
|
459
442
|
react_1.default.createElement("div", { style: {
|
460
443
|
marginTop: "4px",
|
461
444
|
fontSize: "12px",
|
@@ -219,7 +219,6 @@ interface CustomFormProps {
|
|
219
219
|
handleCancel?: () => void;
|
220
220
|
showConfirmButton?: boolean;
|
221
221
|
showCancelButton?: boolean;
|
222
|
-
pendingFileCounts?: Record<string, number>;
|
223
222
|
}
|
224
223
|
declare const CustomForm: React.FC<CustomFormProps>;
|
225
224
|
export { CustomForm, ElementType };
|
@@ -69,20 +69,12 @@ 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
|
-
};
|
81
72
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
82
73
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
83
74
|
};
|
84
75
|
Object.defineProperty(exports, "__esModule", { value: true });
|
85
76
|
exports.ElementType = exports.CustomForm = void 0;
|
77
|
+
//CustomForm.tsx
|
86
78
|
var react_1 = __importStar(require("react"));
|
87
79
|
var react_toastify_1 = require("react-toastify");
|
88
80
|
var CustomButton_1 = __importDefault(require("./CustomButton"));
|
@@ -125,15 +117,10 @@ var CustomForm = function (_a) {
|
|
125
117
|
cancelLabel = _c === void 0 ? "Cancel" : _c, // Varsayılan değer
|
126
118
|
handleCancel = _a.handleCancel, _d = _a.showConfirmButton, showConfirmButton = _d === void 0 ? true : _d, // Varsayılan olarak görünür
|
127
119
|
_e = _a.showCancelButton, // Varsayılan olarak görünür
|
128
|
-
showCancelButton = _e === void 0 ? false : _e
|
129
|
-
pendingFileCounts = _a.pendingFileCounts;
|
120
|
+
showCancelButton = _e === void 0 ? false : _e;
|
130
121
|
var formRef = (0, react_1.useRef)(null);
|
131
122
|
var _f = (0, react_1.useState)(false), isLoading = _f[0], setIsLoading = _f[1];
|
132
123
|
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;
|
137
124
|
var handleConfirm = function (e) { return __awaiter(void 0, void 0, void 0, function () {
|
138
125
|
var form, customSelectValid, isValid, formValues_1, error_1;
|
139
126
|
return __generator(this, function (_a) {
|
@@ -198,9 +185,6 @@ var CustomForm = function (_a) {
|
|
198
185
|
formValues_1[element.id] = element.value;
|
199
186
|
}
|
200
187
|
});
|
201
|
-
formValues_1.uploadedFiles = uploadedFiles;
|
202
|
-
formValues_1["__uploadedFileNames"] = uploadedFileNames;
|
203
|
-
formValues_1["fileNames"] = uploadedFileNames;
|
204
188
|
return [4 /*yield*/, onSubmit(formValues_1)];
|
205
189
|
case 2:
|
206
190
|
_a.sent();
|
@@ -245,18 +229,14 @@ var CustomForm = function (_a) {
|
|
245
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.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 ? (
|
246
230
|
// FILEUPLOADER elemanı için CustomFileUploader'ı render ediyoruz
|
247
231
|
react_1.default.createElement(react_1.default.Fragment, 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:
|
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
|
+
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)); })));
|
253
233
|
})));
|
254
234
|
})));
|
255
235
|
}),
|
256
236
|
(showConfirmButton || showCancelButton) && (react_1.default.createElement("div", { className: "card-footer mt-3" },
|
257
237
|
react_1.default.createElement("div", { className: "form-actions mt-3", style: { display: "flex", justifyContent: "flex-end", gap: "10px" } },
|
258
238
|
showCancelButton && (react_1.default.createElement(CustomButton_1.default, { label: cancelLabel, className: "btn btn-secondary", onClick: handleCancel || (function () { }), isLoading: isLoading })),
|
259
|
-
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 })))))));
|
260
240
|
};
|
261
241
|
exports.CustomForm = CustomForm;
|
262
242
|
exports.default = CustomForm;
|