albinasoft-ui-package 1.1.43 → 1.1.44

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,84 @@
1
+ .form-control-unreq {
2
+ display: block;
3
+ width: 100%;
4
+ padding: .5rem 1rem;
5
+ font-size: 1rem;
6
+ font-weight: 400;
7
+ line-height: 1.5;
8
+
9
+ background-color: #fff;
10
+ -webkit-background-clip: padding-box;
11
+ background-clip: padding-box;
12
+ border: 1px solid #131313;
13
+ -webkit-appearance: none;
14
+ -moz-appearance: none;
15
+ appearance: none;
16
+ -webkit-border-radius: .25rem;
17
+ border-radius: .25rem;
18
+ -webkit-box-shadow: 0 0 0 0;
19
+ box-shadow: 0 0 0 0;
20
+ -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, -webkit-box-shadow .15s ease-in-out;
21
+ transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, -webkit-box-shadow .15s ease-in-out;
22
+ -o-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
23
+ transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
24
+ transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-box-shadow .15s ease-in-out;
25
+
26
+ all: unset;
27
+ width: 100%;
28
+ padding: 0.375rem 0.75rem;
29
+ border: 1px solid #ccc;
30
+ border-radius: 0.25rem;
31
+ }
32
+
33
+ @media(prefers-reduced-motion: reduce) {
34
+ .form-control-unreq {
35
+ -webkit-transition: none;
36
+ -o-transition: none;
37
+ transition: none
38
+ }
39
+ }
40
+
41
+ .dark .form-control-unreq {
42
+ color: #A2A4A9;
43
+ background-color: #222738;
44
+ border-color: #30384f;
45
+ border: 1px solid rgba(255, 255, 255, .1);
46
+ }
47
+
48
+ .dark .form-control-unreq::placeholder {
49
+ color: #6c757d; /* Lighter shade to make it visible */
50
+ opacity: 1; /* Ensure the placeholder color is solid */
51
+ }
52
+
53
+
54
+ .was-validated .form-control-unreq:valid:focus,
55
+ .form-control-unreq.is-valid:focus {
56
+ border-color: #1aa053;
57
+ -webkit-box-shadow: 0 0 0rem 0rem rgba(26, 160, 83, .15);
58
+ box-shadow: 0 0 0rem 0rem rgba(26, 160, 83, .15)
59
+ }
60
+
61
+ .was-validated textarea.form-control-unreq:valid,
62
+ textarea.form-control-unreq.is-valid {
63
+ padding-right: -webkit-calc(1.5em + 1rem);
64
+ padding-right: calc(1.5em + 1rem);
65
+ background-position: top -webkit-calc(0.375em + 0.25rem) right -webkit-calc(0.375em + 0.25rem);
66
+ background-position: top calc(0.375em + 0.25rem) right calc(0.375em + 0.25rem)
67
+ }
68
+
69
+
70
+ .treeview-input-group {
71
+ display: flex;
72
+ gap: 0.5rem;
73
+ align-items: center;
74
+ }
75
+
76
+ .treeview-input-group input {
77
+ flex-grow: 1;
78
+ min-width: 0; /* Overflow kontrolü */
79
+ }
80
+
81
+ .treeview-input-group button {
82
+ white-space: nowrap;
83
+ }
84
+
@@ -123,7 +123,7 @@ var CustomForm = function (_a) {
123
123
  var _g = (0, react_1.useState)(false), submitted = _g[0], setSubmitted = _g[1];
124
124
  var _h = (0, react_1.useState)(false), isUploading = _h[0], setIsUploading = _h[1];
125
125
  var handleConfirm = function (e) { return __awaiter(void 0, void 0, void 0, function () {
126
- var form, customSelectValid, isValid, formValues_1, error_1;
126
+ var form, customSelectValid, customTreeViewValid, isValid, formValues_1, error_1;
127
127
  return __generator(this, function (_a) {
128
128
  switch (_a.label) {
129
129
  case 0:
@@ -134,16 +134,28 @@ var CustomForm = function (_a) {
134
134
  return [2 /*return*/];
135
135
  customSelectValid = true;
136
136
  elements.forEach(function (element) {
137
- if (element.type === ElementType.SELECT && element.required) {
137
+ if (element.type === ElementType.SELECT &&
138
+ element.required) {
138
139
  var selectElement = element;
139
140
  // Eğer değer boş (string) veya boş array ise geçersiz kabul edin
140
- if ((Array.isArray(selectElement.value) && selectElement.value.length === 0) ||
141
+ if ((Array.isArray(selectElement.value) &&
142
+ selectElement.value.length === 0) ||
141
143
  (!Array.isArray(selectElement.value) && !selectElement.value)) {
142
144
  customSelectValid = false;
143
145
  }
144
146
  }
145
147
  });
146
- isValid = form.checkValidity() && customSelectValid;
148
+ customTreeViewValid = true;
149
+ elements.forEach(function (element) {
150
+ if (element.type === ElementType.TREEVIEW && element.required) {
151
+ var val = element.value;
152
+ var arr = Array.isArray(val) ? val : val ? [val] : [];
153
+ if (arr.length === 0) {
154
+ customTreeViewValid = false;
155
+ }
156
+ }
157
+ });
158
+ isValid = form.checkValidity() && customSelectValid && customTreeViewValid;
147
159
  if (!isValid) return [3 /*break*/, 6];
148
160
  setIsLoading(true);
149
161
  _a.label = 1;
@@ -227,7 +239,11 @@ var CustomForm = function (_a) {
227
239
  var colId = _a[0], innerRows = _a[1];
228
240
  return (react_1.default.createElement("div", { className: "col", key: "col-".concat(rowId, "-").concat(colId) }, Object.entries(innerRows).map(function (_a) {
229
241
  var innerRowId = _a[0], elements = _a[1];
230
- 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 ? (
242
+ 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)
243
+ ? element.value[0] || ""
244
+ : "", onChange: function (val) {
245
+ return element.onChange(val);
246
+ } }))) : 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, { submitted: submitted }))) : 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 ? (
231
247
  // FILEUPLOADER elemanı için CustomFileUploader'ı render ediyoruz
232
248
  react_1.default.createElement(react_1.default.Fragment, null,
233
249
  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, onUploadingChange: setIsUploading }))) : null)); })));
@@ -32,7 +32,6 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
32
32
  return to.concat(ar || Array.prototype.slice.call(from));
33
33
  };
34
34
  Object.defineProperty(exports, "__esModule", { value: true });
35
- //CustomSelect.tsx
36
35
  var react_1 = __importStar(require("react"));
37
36
  var fa_1 = require("react-icons/fa");
38
37
  require("../assets/css/custom-select.css");
@@ -1,21 +1,19 @@
1
- import React from 'react';
1
+ import React from "react";
2
+ import "../assets/css/custom-treeview.css";
2
3
  export interface TreeNode {
3
4
  label: string;
4
5
  value: string;
5
6
  children?: TreeNode[];
6
7
  }
7
8
  export interface CustomTreeViewProps {
8
- /** Eğer başlık göstermek isterseniz */
9
9
  label?: string;
10
- /** Seçili değerin (veya çokluysa dizi halinde) prop’u */
11
10
  value: string | string[] | null;
12
- /** Gösterilecek ağaç verisi */
13
11
  treeData: TreeNode[];
14
- /** Input placeholder’ı */
15
12
  placeholder?: string;
16
- /** Çoklu seçim modu */
17
13
  multi?: boolean;
18
- /** Seçim değiştiğinde çağrılır */
14
+ required?: boolean;
15
+ submitted?: boolean;
16
+ errorMessage?: string;
19
17
  onChange: (selected: string | string[] | null) => void;
20
18
  }
21
19
  declare const CustomTreeView: React.FC<CustomTreeViewProps>;
@@ -48,12 +48,12 @@ var react_1 = __importStar(require("react"));
48
48
  var SimpleTreeView_1 = require("@mui/x-tree-view/SimpleTreeView");
49
49
  var TreeItem_1 = require("@mui/x-tree-view/TreeItem");
50
50
  var fa_1 = require("react-icons/fa");
51
- var CustomInput_1 = __importStar(require("./CustomInput"));
51
+ require("../assets/css/custom-treeview.css");
52
52
  var CustomTreeView = function (_a) {
53
- var label = _a.label, value = _a.value, treeData = _a.treeData, _b = _a.placeholder, placeholder = _b === void 0 ? 'Ağaç Yapısını Filtrele...' : _b, _c = _a.multi, multi = _c === void 0 ? false : _c, onChange = _a.onChange;
54
- var _d = (0, react_1.useState)(''), filterTerm = _d[0], setFilterTerm = _d[1];
55
- var _f = (0, react_1.useState)([]), selectedItems = _f[0], setSelectedItems = _f[1];
56
- var _g = (0, react_1.useState)([]), expandedItems = _g[0], setExpandedItems = _g[1];
53
+ var label = _a.label, value = _a.value, treeData = _a.treeData, _b = _a.placeholder, placeholder = _b === void 0 ? "Ağaç Yapısını Filtrele..." : _b, _c = _a.multi, multi = _c === void 0 ? false : _c, _d = _a.required, required = _d === void 0 ? false : _d, submitted = _a.submitted, errorMessage = _a.errorMessage, onChange = _a.onChange;
54
+ var _f = (0, react_1.useState)(""), filterTerm = _f[0], setFilterTerm = _f[1];
55
+ var _g = (0, react_1.useState)([]), selectedItems = _g[0], setSelectedItems = _g[1];
56
+ var _h = (0, react_1.useState)([]), expandedItems = _h[0], setExpandedItems = _h[1];
57
57
  // Helper to find a node by value
58
58
  var findNodeByValue = function (nodes, val) {
59
59
  for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
@@ -79,11 +79,11 @@ var CustomTreeView = function (_a) {
79
79
  }, [value]);
80
80
  // Filter tree utility
81
81
  var filterTree = function (nodes, term) {
82
- var norm = term.toLocaleLowerCase('tr-TR');
82
+ var norm = term.toLocaleLowerCase("tr-TR");
83
83
  var paths = [];
84
84
  var filtered = nodes
85
85
  .map(function (node) {
86
- var labelNorm = node.label.toLocaleLowerCase('tr-TR');
86
+ var labelNorm = node.label.toLocaleLowerCase("tr-TR");
87
87
  var childResult = node.children
88
88
  ? filterTree(node.children, term)
89
89
  : { filteredNodes: [], pathsToExpand: [] };
@@ -96,12 +96,15 @@ var CustomTreeView = function (_a) {
96
96
  return null;
97
97
  })
98
98
  .filter(Boolean);
99
- return { filteredNodes: filtered, pathsToExpand: Array.from(new Set(paths)) };
99
+ return {
100
+ filteredNodes: filtered,
101
+ pathsToExpand: Array.from(new Set(paths)),
102
+ };
100
103
  };
101
104
  // Determine filtered nodes and which to expand
102
- var _h = filterTerm
105
+ var _j = filterTerm
103
106
  ? filterTree(treeData, filterTerm)
104
- : { filteredNodes: treeData, pathsToExpand: [] }, filteredNodes = _h.filteredNodes, pathsToExpand = _h.pathsToExpand;
107
+ : { filteredNodes: treeData, pathsToExpand: [] }, filteredNodes = _j.filteredNodes, pathsToExpand = _j.pathsToExpand;
105
108
  // Auto-expand when filtering
106
109
  (0, react_1.useEffect)(function () {
107
110
  if (filterTerm) {
@@ -122,7 +125,7 @@ var CustomTreeView = function (_a) {
122
125
  };
123
126
  // Clear filter only
124
127
  var handleReset = function () {
125
- setFilterTerm('');
128
+ setFilterTerm("");
126
129
  };
127
130
  // Clear all selections
128
131
  var handleClearAll = function () {
@@ -139,19 +142,27 @@ var CustomTreeView = function (_a) {
139
142
  : __spreadArray(__spreadArray([], selectedItems, true), [node.value], false)
140
143
  : [node.value];
141
144
  handleSelectionChange({}, next);
142
- }, style: { cursor: 'pointer' } }, node.label || 'Kök') }, node.children ? renderTree(node.children) : null)); });
145
+ }, style: { cursor: "pointer" } }, node.label || "Kök") }, node.children ? renderTree(node.children) : null)); });
143
146
  };
144
147
  return (react_1.default.createElement("div", null,
145
- react_1.default.createElement(CustomInput_1.default, { id: "tree-search", label: label, value: filterTerm, inputType: CustomInput_1.InputType.TEXT, placeholder: placeholder, buttonIcon: react_1.default.createElement(fa_1.FaTimes, null), buttonClass: "btn btn-danger bg-soft-danger", buttonOnClick: handleReset, onChange: function (e) { return setFilterTerm(e.target.value); } }),
148
+ react_1.default.createElement("div", { className: "form-group" },
149
+ label && react_1.default.createElement("label", { className: "form-label" }, label),
150
+ react_1.default.createElement("div", { className: "treeview-input-group" },
151
+ react_1.default.createElement("input", { type: "text", value: filterTerm, onChange: function (e) { return setFilterTerm(e.target.value); }, placeholder: placeholder, className: "form-control-unreq", autoComplete: "off", name: "tree-filter-".concat(label === null || label === void 0 ? void 0 : label.replace(/\s+/g, "-").toLowerCase()), required: false }),
152
+ react_1.default.createElement("button", { type: "button", onClick: handleReset, className: "btn btn-danger bg-soft-danger", title: "Temizle" },
153
+ react_1.default.createElement(fa_1.FaTimes, null)))),
146
154
  multi && selectedItems.length > 0 && (react_1.default.createElement("div", { className: "mb-2" },
147
- selectedItems.length > 1 && (react_1.default.createElement("span", { className: "btn btn-sm btn-danger rounded-pill me-1", style: { cursor: 'pointer' }, onClick: handleClearAll },
155
+ selectedItems.length > 1 && (react_1.default.createElement("span", { className: "btn btn-sm btn-danger rounded-pill me-1", style: { cursor: "pointer" }, onClick: handleClearAll },
148
156
  react_1.default.createElement(fa_1.FaTrash, null))),
149
- selectedItems.map(function (val) { return (react_1.default.createElement("span", { key: val, className: "badge bg-secondary me-1", style: { cursor: 'pointer' }, onClick: function () { return handleBadgeRemove(val); } },
157
+ selectedItems.map(function (val) { return (react_1.default.createElement("span", { key: val, className: "badge bg-secondary me-1", style: { cursor: "pointer" }, onClick: function () { return handleBadgeRemove(val); } },
150
158
  findLabelByValue(treeData, val),
151
159
  " \u00D7")); }))),
152
160
  react_1.default.createElement(SimpleTreeView_1.SimpleTreeView, { checkboxSelection: true, multiSelect: multi, selectedItems: selectedItems, expandedItems: expandedItems, onSelectedItemsChange: handleSelectionChange, onExpandedItemsChange: function (_e, ids) {
153
161
  var arr = Array.isArray(ids) ? ids : ids ? [ids] : [];
154
162
  setExpandedItems(arr);
155
- } }, renderTree(filteredNodes))));
163
+ } }, renderTree(filteredNodes)),
164
+ submitted && required && selectedItems.length === 0 && (react_1.default.createElement("div", { className: "invalid-feedback d-block mt-2 text-danger" },
165
+ react_1.default.createElement(fa_1.FaExclamationTriangle, { className: "me-2" }),
166
+ errorMessage || "Lütfen en az bir seçim yapınız."))));
156
167
  };
157
168
  exports.default = CustomTreeView;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "albinasoft-ui-package",
3
- "version": "1.1.43",
3
+ "version": "1.1.44",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {