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 filesToUpload, formData, response, data, uploadedFileNames_1, errorData, error_1;
321
+ var pendingItems, _loop_1, i;
322
322
  return __generator(this, function (_a) {
323
323
  switch (_a.label) {
324
324
  case 0:
325
- filesToUpload = previews.filter(function (item) { return !item.uploaded; }).map(function (item) { return item.file; });
326
- if (filesToUpload.length === 0) {
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
- formData = new FormData();
331
- filesToUpload.forEach(function (file) {
332
- formData.append("file", file);
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
- _a.trys.push([1, 7, , 8]);
337
- return [4 /*yield*/, fetch(url, {
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
- response = _a.sent();
343
- if (!response.ok) return [3 /*break*/, 4];
344
- return [4 /*yield*/, response.json()];
398
+ _a.sent();
399
+ _a.label = 3;
345
400
  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*/];
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 | SimpleSelectElement | DateTimePickerElement | TextElement | DividerElement | RichTextboxElement | TreeViewElement | ButtonElement | AutoCompleteInputElement | PhoneElement | FileUploaderElement;
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.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
+ 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;
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.34",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {