albinasoft-ui-package 1.1.32 → 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.
@@ -0,0 +1,94 @@
1
+ .dropdown-menu {
2
+ background: white;
3
+ max-height: 200px;
4
+ overflow-y: auto;
5
+ }
6
+
7
+ .dropdown-menu::-webkit-scrollbar-thumb {
8
+
9
+ background-color: #888;
10
+ }
11
+
12
+ .dropdown-menu::-webkit-scrollbar-thumb:hover {
13
+
14
+ background-color: #555;
15
+ }
16
+
17
+ .dropdown-menu::-webkit-scrollbar-track {
18
+
19
+ background: transparent;
20
+ }
21
+
22
+ /* WebKit-tabanlı tarayıcılar için */
23
+ .dark .dropdown-menu::-webkit-scrollbar {
24
+ width: 8px;
25
+ }
26
+
27
+ .dark .dropdown-menu::-webkit-scrollbar-thumb {
28
+ background-color: #444;
29
+ border-radius: 4px;
30
+ }
31
+
32
+ .dark .dropdown-menu::-webkit-scrollbar-thumb:hover {
33
+ background-color: #666;
34
+ }
35
+
36
+ .dark .dropdown-menu::-webkit-scrollbar-track {
37
+ background: #151824;
38
+ }
39
+
40
+ .dark .dropdown-menu {
41
+ scrollbar-color: #444 #151824;
42
+ }
43
+
44
+ .dropdown-item {
45
+ padding: 8px 12px;
46
+ cursor: pointer;
47
+ }
48
+
49
+ .dropdown-item:hover {
50
+ background: #f1f1f1;
51
+ }
52
+
53
+ .dark .dropdown-item:hover {
54
+ background: #151824;
55
+ }
56
+
57
+ .simple-select.form-control {
58
+ white-space: nowrap;
59
+ overflow: hidden;
60
+ cursor: pointer;
61
+
62
+ padding: 0.5rem;
63
+ margin-left : 3rem;
64
+ display: flex;
65
+ align-items: center;
66
+ border: 1px solid var(--bs-primary);
67
+ border-radius: 3rem;
68
+ width: 300px !important;
69
+
70
+ }
71
+
72
+ .simple-select .selected {
73
+ font-weight: 600;
74
+ /* color:var(--bs-primary) */
75
+ }
76
+
77
+ .simple-select .icon-left,
78
+ .simple-select .icon-right {
79
+ flex: none;
80
+ color: #6c757d;
81
+ }
82
+ .simple-select .icon-left {
83
+ margin-right: 0.5rem;
84
+ color:var(--bs-primary)
85
+ }
86
+
87
+ .search-input{
88
+ margin-left: 2rem;
89
+ width: 90% !important;
90
+ box-sizing: border-box;
91
+ border: none !important;
92
+ outline: none !important;
93
+ }
94
+
@@ -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",
@@ -201,6 +201,7 @@ interface CustomFormProps {
201
201
  handleCancel?: () => void;
202
202
  showConfirmButton?: boolean;
203
203
  showCancelButton?: boolean;
204
+ pendingFileCounts?: Record<string, number>;
204
205
  }
205
206
  declare const CustomForm: React.FC<CustomFormProps>;
206
207
  export { CustomForm, ElementType };
@@ -114,10 +114,13 @@ var CustomForm = function (_a) {
114
114
  cancelLabel = _c === void 0 ? "Cancel" : _c, // Varsayılan değer
115
115
  handleCancel = _a.handleCancel, _d = _a.showConfirmButton, showConfirmButton = _d === void 0 ? true : _d, // Varsayılan olarak görünür
116
116
  _e = _a.showCancelButton, // Varsayılan olarak görünür
117
- showCancelButton = _e === void 0 ? false : _e;
117
+ showCancelButton = _e === void 0 ? false : _e, // Varsayılan olarak görünür
118
+ pendingFileCounts = _a.pendingFileCounts;
118
119
  var formRef = (0, react_1.useRef)(null);
119
120
  var _f = (0, react_1.useState)(false), isLoading = _f[0], setIsLoading = _f[1];
120
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;
121
124
  var handleConfirm = function (e) { return __awaiter(void 0, void 0, void 0, function () {
122
125
  var form, customSelectValid, isValid, formValues_1, error_1;
123
126
  return __generator(this, function (_a) {
@@ -233,7 +236,7 @@ var CustomForm = function (_a) {
233
236
  (showConfirmButton || showCancelButton) && (react_1.default.createElement("div", { className: "card-footer mt-3" },
234
237
  react_1.default.createElement("div", { className: "form-actions mt-3", style: { display: "flex", justifyContent: "flex-end", gap: "10px" } },
235
238
  showCancelButton && (react_1.default.createElement(CustomButton_1.default, { label: cancelLabel, className: "btn btn-secondary", onClick: handleCancel || (function () { }), isLoading: isLoading })),
236
- 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 })))))));
237
240
  };
238
241
  exports.CustomForm = CustomForm;
239
242
  exports.default = CustomForm;
@@ -0,0 +1,21 @@
1
+ import React from "react";
2
+ import "../assets/css/custom-simple-select.css";
3
+ interface Option {
4
+ value: string;
5
+ label: string;
6
+ }
7
+ interface SimpleSelectProps {
8
+ id?: string;
9
+ name?: string;
10
+ label?: string;
11
+ options: Option[];
12
+ value: string;
13
+ placeholder?: string;
14
+ searchable?: boolean;
15
+ disabled?: boolean;
16
+ className?: string;
17
+ style?: React.CSSProperties;
18
+ onChange: (value: string) => void;
19
+ }
20
+ declare const CustomSimpleSelect: React.FC<SimpleSelectProps>;
21
+ export default CustomSimpleSelect;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ var react_1 = __importStar(require("react"));
27
+ require("../assets/css/custom-simple-select.css");
28
+ var fa_1 = require("react-icons/fa");
29
+ var CustomSimpleSelect = function (_a) {
30
+ var _b;
31
+ var id = _a.id, name = _a.name, label = _a.label, options = _a.options, value = _a.value, _c = _a.placeholder, placeholder = _c === void 0 ? "Seçiniz..." : _c, _d = _a.searchable, searchable = _d === void 0 ? true : _d, _e = _a.disabled, disabled = _e === void 0 ? false : _e, className = _a.className, style = _a.style, onChange = _a.onChange;
32
+ var _f = (0, react_1.useState)(false), isOpen = _f[0], setIsOpen = _f[1];
33
+ var _g = (0, react_1.useState)(""), filterText = _g[0], setFilterText = _g[1];
34
+ var containerRef = (0, react_1.useRef)(null);
35
+ (0, react_1.useEffect)(function () {
36
+ var handleClickOutside = function (event) {
37
+ if (containerRef.current &&
38
+ !containerRef.current.contains(event.target)) {
39
+ setIsOpen(false);
40
+ }
41
+ };
42
+ document.addEventListener("mousedown", handleClickOutside);
43
+ return function () { return document.removeEventListener("mousedown", handleClickOutside); };
44
+ }, []);
45
+ var handleSelect = function (val) {
46
+ onChange(val);
47
+ setIsOpen(false);
48
+ setFilterText("");
49
+ };
50
+ var displayedLabel = ((_b = options.find(function (o) { return o.value === value; })) === null || _b === void 0 ? void 0 : _b.label) || "";
51
+ return (react_1.default.createElement("div", { className: className, style: style, ref: containerRef },
52
+ label && (react_1.default.createElement("label", { htmlFor: id, className: "form-label" }, label)),
53
+ react_1.default.createElement("div", { className: "simple-select form-control ".concat(disabled ? "disabled" : ""), onClick: function () { return !disabled && setIsOpen(function (v) { return !v; }); } },
54
+ react_1.default.createElement(fa_1.FaSyncAlt, { className: "icon-left" }),
55
+ react_1.default.createElement("div", { className: "selected" }, displayedLabel || react_1.default.createElement("span", { className: "placeholder" }, placeholder))),
56
+ isOpen && (react_1.default.createElement("div", { className: "dropdown-menu show" },
57
+ searchable && (react_1.default.createElement("input", { type: "text", className: "form-control search-input", placeholder: "Ara...", value: filterText, onChange: function (e) { return setFilterText(e.target.value); } })),
58
+ react_1.default.createElement("ul", { className: "options-list" }, options
59
+ .filter(function (o) {
60
+ return o.label.toLowerCase().includes(filterText.toLowerCase());
61
+ })
62
+ .map(function (o) { return (react_1.default.createElement("li", { key: o.value, className: "dropdown-item ".concat(o.value === value ? "selected" : ""), onClick: function () { return handleSelect(o.value); } }, o.label)); }))))));
63
+ };
64
+ exports.default = CustomSimpleSelect;
package/dist/index.d.ts CHANGED
@@ -10,6 +10,7 @@ import CustomPhoneInput from './components/CustomPhoneInput';
10
10
  import CustomRadioButton from './components/CustomRadioButton';
11
11
  import CustomRichTextbox from './components/CustomRichTextbox';
12
12
  import CustomSelect from './components/CustomSelect';
13
+ import CustomSimpleSelect from './components/CustomSimpleSelect';
13
14
  import CustomTab from './components/CustomTab';
14
15
  import CustomText from './components/CustomText';
15
16
  import CustomTextarea from './components/CustomTextarea';
@@ -18,4 +19,4 @@ import CustomAutocompleteInput from './components/CustomAutocompleteInput';
18
19
  import CustomProgressBar from './components/CustomProgressBar';
19
20
  import CustomTimeline from './components/CustomTimeline';
20
21
  import CustomDatatable from './components/CustomDatatable';
21
- export { AlbinaForm, CustomButton, CustomCheckbox, CustomDateTimePicker, CustomDivider, CustomForm, CustomInput, CustomModal, CustomPhoneInput, CustomRadioButton, CustomRichTextbox, CustomSelect, CustomTab, CustomText, CustomTextarea, CustomTreeView, CustomAutocompleteInput, CustomProgressBar, CustomTimeline, CustomDatatable, };
22
+ export { AlbinaForm, CustomButton, CustomCheckbox, CustomDateTimePicker, CustomDivider, CustomForm, CustomInput, CustomModal, CustomPhoneInput, CustomRadioButton, CustomRichTextbox, CustomSelect, CustomSimpleSelect, CustomTab, CustomText, CustomTextarea, CustomTreeView, CustomAutocompleteInput, CustomProgressBar, CustomTimeline, CustomDatatable, };
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.CustomDatatable = exports.CustomTimeline = exports.CustomProgressBar = exports.CustomAutocompleteInput = exports.CustomTreeView = exports.CustomTextarea = exports.CustomText = exports.CustomTab = exports.CustomSelect = exports.CustomRichTextbox = exports.CustomRadioButton = exports.CustomPhoneInput = exports.CustomModal = exports.CustomInput = exports.CustomForm = exports.CustomDivider = exports.CustomDateTimePicker = exports.CustomCheckbox = exports.CustomButton = exports.AlbinaForm = void 0;
6
+ exports.CustomDatatable = exports.CustomTimeline = exports.CustomProgressBar = exports.CustomAutocompleteInput = exports.CustomTreeView = exports.CustomTextarea = exports.CustomText = exports.CustomTab = exports.CustomSimpleSelect = exports.CustomSelect = exports.CustomRichTextbox = exports.CustomRadioButton = exports.CustomPhoneInput = exports.CustomModal = exports.CustomInput = exports.CustomForm = exports.CustomDivider = exports.CustomDateTimePicker = exports.CustomCheckbox = exports.CustomButton = exports.AlbinaForm = void 0;
7
7
  var AlbinaForm_1 = __importDefault(require("./components/AlbinaForm"));
8
8
  exports.AlbinaForm = AlbinaForm_1.default;
9
9
  var CustomButton_1 = __importDefault(require("./components/CustomButton"));
@@ -28,6 +28,8 @@ var CustomRichTextbox_1 = __importDefault(require("./components/CustomRichTextbo
28
28
  exports.CustomRichTextbox = CustomRichTextbox_1.default;
29
29
  var CustomSelect_1 = __importDefault(require("./components/CustomSelect"));
30
30
  exports.CustomSelect = CustomSelect_1.default;
31
+ var CustomSimpleSelect_1 = __importDefault(require("./components/CustomSimpleSelect"));
32
+ exports.CustomSimpleSelect = CustomSimpleSelect_1.default;
31
33
  var CustomTab_1 = __importDefault(require("./components/CustomTab"));
32
34
  exports.CustomTab = CustomTab_1.default;
33
35
  var CustomText_1 = __importDefault(require("./components/CustomText"));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "albinasoft-ui-package",
3
- "version": "1.1.32",
3
+ "version": "1.1.34",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {