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.
@@ -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 isimleri (server tarafından belirlenen) bilgisini almak için callback.
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
- // Seçilen dosyaları işleme
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) { return __spreadArray(__spreadArray([], prev, true), newPreviews, true); });
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 tıklanınca
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 (!itemToRemove)
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 yükle
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
- return prev.map(function (item, index) {
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" // Burada type="button" ekleyerek form submit'ini engelliyoruz.
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
  }),
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React from "react";
2
2
  declare enum TextType {
3
3
  BOLDHEAD = "boldhead",
4
4
  HEADING = "heading",
@@ -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 ? '' : _c, _d = _a.style, style = _d === void 0 ? {} : _d, _e = _a.textType, textType = _e === void 0 ? TextType.PARAGRAPH : _e, // Varsayılan olarak 'paragraph'
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 ? 'underline' : '',
132
- overline ? 'overline' : '',
133
- linethrough ? 'line-through' : '',
127
+ underline ? "underline" : "",
128
+ overline ? "overline" : "",
129
+ linethrough ? "line-through" : "",
134
130
  ]
135
131
  .filter(Boolean)
136
- .join(' ');
137
- // Varsayılan stil ile kullanıcı stilini birleştir
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
- // URL'leri tıklanabilir hale getirme
141
- var renderWithLinks = function (text, linkText) {
142
- var urlRegex = /(https?:\/\/[^\s]+|www\.[^\s]+)/g; // URL'leri algılayan RegEx
143
- var parts = text.split(urlRegex);
144
- return parts.map(function (part, index) {
145
- 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-all' } },
146
- linkText || part.replace(/https?:\/\/|www\.|\/$/g, ''),
147
- " ")) : (part);
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "albinasoft-ui-package",
3
- "version": "1.0.61",
3
+ "version": "1.0.63",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {