albinasoft-ui-package 1.0.61 → 1.0.63
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.
- package/dist/components/CustomFileUploader.d.ts +5 -1
- package/dist/components/CustomFileUploader.js +25 -18
- package/dist/components/CustomForm.d.ts +1 -0
- package/dist/components/CustomForm.js +1 -1
- package/dist/components/CustomText.d.ts +1 -1
- package/dist/components/CustomText.js +24 -22
- package/package.json +1 -1
@@ -16,7 +16,7 @@ export interface CustomFileUploaderProps {
|
|
16
16
|
/** Her bir dosya için maksimum boyut (byte cinsinden) */
|
17
17
|
maxSize: number;
|
18
18
|
/**
|
19
|
-
* Opsiyonel: Yükleme tamamlandığında dönen dosya
|
19
|
+
* Opsiyonel: Yükleme tamamlandığında dönen dosya isimlerini almak için callback.
|
20
20
|
*/
|
21
21
|
onUploadComplete?: (uploadedFileNames: string[]) => void;
|
22
22
|
/**
|
@@ -25,6 +25,10 @@ export interface CustomFileUploaderProps {
|
|
25
25
|
onRemoveUploaded?: (fileName: string) => void;
|
26
26
|
/** Opsiyonel: Yükleyici için gösterilecek label */
|
27
27
|
label?: string;
|
28
|
+
/**
|
29
|
+
* Opsiyonel: Pending (henüz yüklenmemiş) dosya sayısını parent'a iletecek callback.
|
30
|
+
*/
|
31
|
+
onPendingChange?: (pendingFileCount: number) => void;
|
28
32
|
}
|
29
33
|
declare const CustomFileUploader: React.FC<CustomFileUploaderProps>;
|
30
34
|
export default CustomFileUploader;
|
@@ -177,13 +177,19 @@ var isAllowedFileType = function (file, allowedTypes) {
|
|
177
177
|
// CustomFileUploader Bileşeni
|
178
178
|
// ====================
|
179
179
|
var CustomFileUploader = function (_a) {
|
180
|
-
var url = _a.url, multi = _a.multi, allowedTypes = _a.allowedTypes, maxFile = _a.maxFile, maxSize = _a.maxSize, onUploadComplete = _a.onUploadComplete, onRemoveUploaded = _a.onRemoveUploaded, label = _a.label;
|
180
|
+
var url = _a.url, multi = _a.multi, allowedTypes = _a.allowedTypes, maxFile = _a.maxFile, maxSize = _a.maxSize, onUploadComplete = _a.onUploadComplete, onRemoveUploaded = _a.onRemoveUploaded, label = _a.label, onPendingChange = _a.onPendingChange;
|
181
181
|
var _b = (0, react_1.useState)([]), previews = _b[0], setPreviews = _b[1];
|
182
182
|
var fileInputRef = (0, react_1.useRef)(null);
|
183
|
-
//
|
183
|
+
// Pending dosya sayısını parent'a iletecek yardımcı fonksiyon
|
184
|
+
var updatePendingStatus = function (previewsArray) {
|
185
|
+
if (onPendingChange) {
|
186
|
+
var pendingFileCount = previewsArray.filter(function (item) { return !item.uploaded; }).length;
|
187
|
+
onPendingChange(pendingFileCount);
|
188
|
+
}
|
189
|
+
};
|
190
|
+
// Dosyaları ekleme işlemi
|
184
191
|
var handleFiles = function (files) {
|
185
192
|
var filesArray = Array.from(files);
|
186
|
-
// Eğer multi false ise sadece bir dosya seçilebilir
|
187
193
|
var currentCount = multi ? previews.length : (previews.length > 0 ? 1 : 0);
|
188
194
|
var availableSlots = multi ? maxFile - currentCount : (currentCount === 0 ? 1 : 0);
|
189
195
|
if (availableSlots <= 0) {
|
@@ -196,12 +202,10 @@ var CustomFileUploader = function (_a) {
|
|
196
202
|
}
|
197
203
|
var newPreviews = [];
|
198
204
|
filesToAdd.forEach(function (file, index) {
|
199
|
-
// Boyut kontrolü
|
200
205
|
if (file.size > maxSize) {
|
201
206
|
react_toastify_1.toast.error("\"".concat(file.name, "\" dosyas\u0131 boyut limiti (").concat(maxSize, " byte) a\u015F\u0131yor."));
|
202
207
|
return;
|
203
208
|
}
|
204
|
-
// Tür kontrolü
|
205
209
|
if (!isAllowedFileType(file, allowedTypes)) {
|
206
210
|
react_toastify_1.toast.error("\"".concat(file.name, "\" dosyas\u0131 se\u00E7ilen dosya t\u00FCr\u00FCne uygun de\u011Fil."));
|
207
211
|
return;
|
@@ -218,7 +222,11 @@ var CustomFileUploader = function (_a) {
|
|
218
222
|
uploaded: false,
|
219
223
|
});
|
220
224
|
});
|
221
|
-
setPreviews(function (prev) {
|
225
|
+
setPreviews(function (prev) {
|
226
|
+
var updatedPreviews = __spreadArray(__spreadArray([], prev, true), newPreviews, true);
|
227
|
+
updatePendingStatus(updatedPreviews);
|
228
|
+
return updatedPreviews;
|
229
|
+
});
|
222
230
|
};
|
223
231
|
// Dosya input değişiminde
|
224
232
|
var handleFileChange = function (e) {
|
@@ -237,23 +245,22 @@ var CustomFileUploader = function (_a) {
|
|
237
245
|
var handleDragOver = function (e) {
|
238
246
|
e.preventDefault();
|
239
247
|
};
|
240
|
-
// Dosya seçim alanına
|
248
|
+
// Dosya seçim alanına tıklayınca input'u tetikleyin
|
241
249
|
var handleAreaClick = function () {
|
242
250
|
var _a;
|
243
251
|
(_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click();
|
244
252
|
};
|
245
|
-
// Dosya kaldırma
|
253
|
+
// Dosya kaldırma işlemi
|
246
254
|
var handleRemoveFile = function (previewId) {
|
255
|
+
var updatedPreviews = previews.filter(function (item) { return item.id !== previewId; });
|
256
|
+
setPreviews(updatedPreviews);
|
257
|
+
updatePendingStatus(updatedPreviews);
|
247
258
|
var itemToRemove = previews.find(function (item) { return item.id === previewId; });
|
248
|
-
if (
|
249
|
-
return;
|
250
|
-
setPreviews(function (prev) { return prev.filter(function (item) { return item.id !== previewId; }); });
|
251
|
-
// Eğer dosya sunucuya yüklenmişse, onRemoveUploaded callback'ini tetikleyin.
|
252
|
-
if (itemToRemove.uploaded && itemToRemove.serverFileName && onRemoveUploaded) {
|
259
|
+
if (itemToRemove && itemToRemove.uploaded && itemToRemove.serverFileName && onRemoveUploaded) {
|
253
260
|
onRemoveUploaded(itemToRemove.serverFileName);
|
254
261
|
}
|
255
262
|
};
|
256
|
-
// Dosyaları sunucuya
|
263
|
+
// Dosyaları sunucuya yükleme işlemi
|
257
264
|
var handleUpload = function () { return __awaiter(void 0, void 0, void 0, function () {
|
258
265
|
var filesToUpload, formData, response, data, uploadedFileNames_1, errorData, error_1;
|
259
266
|
return __generator(this, function (_a) {
|
@@ -286,18 +293,18 @@ var CustomFileUploader = function (_a) {
|
|
286
293
|
data.content.fileList &&
|
287
294
|
data.content.fileList.length > 0) {
|
288
295
|
uploadedFileNames_1 = data.content.fileList.map(function (item) { return item.fileName; });
|
289
|
-
// Opsiyonel callback çağrısı
|
290
296
|
if (onUploadComplete) {
|
291
297
|
onUploadComplete(uploadedFileNames_1);
|
292
298
|
}
|
293
|
-
// Yüklenen dosyaların durumunu güncelle
|
294
299
|
setPreviews(function (prev) {
|
295
|
-
|
300
|
+
var updatedPreviews = prev.map(function (item, index) {
|
296
301
|
if (!item.uploaded) {
|
297
302
|
return __assign(__assign({}, item), { uploaded: true, serverFileName: uploadedFileNames_1[index] || item.file.name });
|
298
303
|
}
|
299
304
|
return item;
|
300
305
|
});
|
306
|
+
updatePendingStatus(updatedPreviews);
|
307
|
+
return updatedPreviews;
|
301
308
|
});
|
302
309
|
react_toastify_1.toast.success("Dosyalar başarıyla yüklendi.");
|
303
310
|
}
|
@@ -338,7 +345,7 @@ var CustomFileUploader = function (_a) {
|
|
338
345
|
alignItems: "center",
|
339
346
|
fontSize: "48px",
|
340
347
|
} }, item.previewContent)),
|
341
|
-
react_1.default.createElement("button", { type: "button" //
|
348
|
+
react_1.default.createElement("button", { type: "button" // Form submit'ini tetiklememek için
|
342
349
|
, style: removeButtonStyle, onClick: function (e) {
|
343
350
|
e.stopPropagation();
|
344
351
|
handleRemoveFile(item.id);
|
@@ -170,6 +170,7 @@ interface FileUploaderElement {
|
|
170
170
|
maxSize: number;
|
171
171
|
onUploadComplete: (uploadedFileNames: string[]) => void;
|
172
172
|
onRemoveUploaded: (fileName: string) => void;
|
173
|
+
onPendingChange: (pendingFileCount: number) => void;
|
173
174
|
rowId?: number;
|
174
175
|
colId?: number;
|
175
176
|
innerRowId?: number;
|
@@ -212,7 +212,7 @@ var CustomForm = function (_a) {
|
|
212
212
|
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))) : element.type === ElementType.DATETIMEPICKER ? (react_1.default.createElement(CustomDateTimePicker_1.default, __assign({}, element))) : 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.FILEUPLOADER ? (
|
213
213
|
// FILEUPLOADER elemanı için CustomFileUploader'ı render ediyoruz
|
214
214
|
react_1.default.createElement(react_1.default.Fragment, null,
|
215
|
-
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, label: element.label }))) : null)); })));
|
215
|
+
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, label: element.label }))) : null)); })));
|
216
216
|
})));
|
217
217
|
})));
|
218
218
|
}),
|
@@ -79,9 +79,7 @@ var Color;
|
|
79
79
|
exports.Color = Color;
|
80
80
|
var CustomText = function (_a) {
|
81
81
|
var _b;
|
82
|
-
var id = _a.id, value = _a.value, _c = _a.className, className = _c === void 0 ?
|
83
|
-
color = _a.color, textAlign = _a.textAlign, fontSize = _a.fontSize, lineHeight = _a.lineHeight, fontWeight = _a.fontWeight, _f = _a.underline, underline = _f === void 0 ? false : _f, _g = _a.overline, overline = _g === void 0 ? false : _g, _h = _a.linethrough, linethrough = _h === void 0 ? false : _h, _j = _a.italic, italic = _j === void 0 ? false : _j, textAlignClass = _a.textAlignClass, linkText = _a.linkText;
|
84
|
-
// Varsayılan stiller
|
82
|
+
var id = _a.id, value = _a.value, _c = _a.className, className = _c === void 0 ? "" : _c, _d = _a.style, style = _d === void 0 ? {} : _d, _e = _a.textType, textType = _e === void 0 ? TextType.PARAGRAPH : _e, color = _a.color, textAlign = _a.textAlign, fontSize = _a.fontSize, lineHeight = _a.lineHeight, fontWeight = _a.fontWeight, _f = _a.underline, underline = _f === void 0 ? false : _f, _g = _a.overline, overline = _g === void 0 ? false : _g, _h = _a.linethrough, linethrough = _h === void 0 ? false : _h, _j = _a.italic, italic = _j === void 0 ? false : _j, textAlignClass = _a.textAlignClass, linkText = _a.linkText;
|
85
83
|
var defaultStyles = (_b = {},
|
86
84
|
_b[TextType.BOLDHEAD] = {
|
87
85
|
fontSize: FontSize.XL,
|
@@ -104,7 +102,6 @@ var CustomText = function (_a) {
|
|
104
102
|
fontWeight: FontWeight.THIN,
|
105
103
|
},
|
106
104
|
_b);
|
107
|
-
// Dinamik sınıf ekleme
|
108
105
|
if (textType == TextType.BOLDHEAD && !color) {
|
109
106
|
color = Color.DARK;
|
110
107
|
}
|
@@ -126,31 +123,36 @@ var CustomText = function (_a) {
|
|
126
123
|
else if (textAlign == TextAlign.END) {
|
127
124
|
textAlignClass = "text-end";
|
128
125
|
}
|
129
|
-
// Text decoration birleştirme
|
130
126
|
var textDecoration = [
|
131
|
-
underline ?
|
132
|
-
overline ?
|
133
|
-
linethrough ?
|
127
|
+
underline ? "underline" : "",
|
128
|
+
overline ? "overline" : "",
|
129
|
+
linethrough ? "line-through" : "",
|
134
130
|
]
|
135
131
|
.filter(Boolean)
|
136
|
-
.join(
|
137
|
-
|
138
|
-
var combinedStyle = __assign(__assign(__assign({}, defaultStyles[textType]), { textAlign: textAlign !== null && textAlign !== void 0 ? textAlign : defaultStyles[textType].textAlign, fontSize: fontSize !== null && fontSize !== void 0 ? fontSize : defaultStyles[textType].fontSize, lineHeight: lineHeight !== null && lineHeight !== void 0 ? lineHeight : defaultStyles[textType].lineHeight, fontWeight: fontWeight !== null && fontWeight !== void 0 ? fontWeight : defaultStyles[textType].fontWeight, textDecoration: textDecoration || undefined, fontStyle: italic ? 'italic' : undefined }), style);
|
132
|
+
.join(" ");
|
133
|
+
var combinedStyle = __assign(__assign(__assign({}, defaultStyles[textType]), { textAlign: textAlign !== null && textAlign !== void 0 ? textAlign : defaultStyles[textType].textAlign, fontSize: fontSize !== null && fontSize !== void 0 ? fontSize : defaultStyles[textType].fontSize, lineHeight: lineHeight !== null && lineHeight !== void 0 ? lineHeight : defaultStyles[textType].lineHeight, fontWeight: fontWeight !== null && fontWeight !== void 0 ? fontWeight : defaultStyles[textType].fontWeight, textDecoration: textDecoration || undefined, fontStyle: italic ? "italic" : undefined }), style);
|
139
134
|
var combinedClassName = "".concat(color, " ").concat(className).trim();
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
return
|
146
|
-
|
147
|
-
|
135
|
+
/**
|
136
|
+
* Metindeki düz linkleri `<a>` etiketi ile sarmalar ve HTML olarak render eder.
|
137
|
+
*/
|
138
|
+
var processTextWithLinks = function (text, linkText) {
|
139
|
+
if (typeof text !== "string")
|
140
|
+
return text;
|
141
|
+
// URL regex
|
142
|
+
var urlRegex = /(https?:\/\/[^\s]+|www\.[^\s]+)/g;
|
143
|
+
// Önce tüm satırları parçala (HTML olarak yazıldıysa çalışsın)
|
144
|
+
return text
|
145
|
+
.split("\n")
|
146
|
+
.map(function (line, lineIndex) {
|
147
|
+
// Metin içinde link var mı kontrol et
|
148
|
+
var parts = line.split(urlRegex);
|
149
|
+
return (react_1.default.createElement("p", { key: lineIndex, style: { margin: "0" } }, parts.map(function (part, index) {
|
150
|
+
return urlRegex.test(part) ? (react_1.default.createElement("a", { key: index, href: part.startsWith("http") ? part : "https://".concat(part), target: "_blank", rel: "noopener noreferrer", style: { wordBreak: "break-word", color: "#007bff" } }, linkText || part.replace(/https?:\/\/|www\.|\/$/g, ""))) : (react_1.default.createElement("span", { dangerouslySetInnerHTML: { __html: part }, key: index }));
|
151
|
+
})));
|
148
152
|
});
|
149
153
|
};
|
150
154
|
return (react_1.default.createElement("div", { className: "".concat(textAlignClass) },
|
151
|
-
react_1.default.createElement("span", { id: id || "custom-text-".concat(Date.now()), className: "custom-text ".concat(combinedClassName), style: combinedStyle },
|
152
|
-
renderWithLinks(value, linkText),
|
153
|
-
" ")));
|
155
|
+
react_1.default.createElement("span", { id: id || "custom-text-".concat(Date.now()), className: "custom-text ".concat(combinedClassName), style: combinedStyle }, processTextWithLinks(value, linkText))));
|
154
156
|
};
|
155
157
|
exports.CustomText = CustomText;
|
156
158
|
exports.default = CustomText;
|