albinasoft-ui-package 1.0.20 → 1.0.21

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.
@@ -33,6 +33,15 @@ var __importStar = (this && this.__importStar) || function (mod) {
33
33
  __setModuleDefault(result, mod);
34
34
  return result;
35
35
  };
36
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
37
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
38
+ if (ar || !(i in from)) {
39
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
40
+ ar[i] = from[i];
41
+ }
42
+ }
43
+ return to.concat(ar || Array.prototype.slice.call(from));
44
+ };
36
45
  var __importDefault = (this && this.__importDefault) || function (mod) {
37
46
  return (mod && mod.__esModule) ? mod : { "default": mod };
38
47
  };
@@ -42,56 +51,112 @@ var react_checkbox_tree_1 = __importDefault(require("react-checkbox-tree"));
42
51
  require("react-checkbox-tree/lib/react-checkbox-tree.css");
43
52
  var fa_1 = require("react-icons/fa");
44
53
  var CustomInput_1 = __importStar(require("./CustomInput"));
54
+ var react_bootstrap_1 = require("react-bootstrap");
45
55
  var CustomTreeView = function (_a) {
46
56
  var id = _a.id, name = _a.name, 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.required, required = _c === void 0 ? false : _c, errorMessage = _a.errorMessage, _d = _a.conditionalErrorVisible, conditionalErrorVisible = _d === void 0 ? false : _d, conditionalErrorMessage = _a.conditionalErrorMessage, _e = _a.disabled, disabled = _e === void 0 ? false : _e, _f = _a.readOnly, readOnly = _f === void 0 ? false : _f, description = _a.description, tooltip = _a.tooltip, style = _a.style, className = _a.className, onChange = _a.onChange, _g = _a.hasTriedToSubmit, hasTriedToSubmit = _g === void 0 ? false : _g;
47
57
  var _h = (0, react_1.useState)(value ? [value] : []), checked = _h[0], setChecked = _h[1];
48
58
  var _j = (0, react_1.useState)([]), expanded = _j[0], setExpanded = _j[1];
49
59
  var _k = (0, react_1.useState)(''), filterTerm = _k[0], setFilterTerm = _k[1];
50
60
  var _l = (0, react_1.useState)(treeData), filteredTreeData = _l[0], setFilteredTreeData = _l[1];
51
- var _m = (0, react_1.useState)(false), isValid = _m[0], setIsValid = _m[1];
52
- // 🔥 Yalnızca Leaf checkbox'larını göster (node'larda checkbox olmasın)
61
+ var _m = (0, react_1.useState)([]), selectedPath = _m[0], setSelectedPath = _m[1];
62
+ var _o = (0, react_1.useState)(false), isReadOnly = _o[0], setReadOnly = _o[1];
63
+ var _p = (0, react_1.useState)(false), isValid = _p[0], setIsValid = _p[1];
53
64
  var markLeafCheckboxOnly = function (nodes) {
54
65
  return nodes.map(function (node) { return (__assign(__assign({}, node), { showCheckbox: !(Array.isArray(node.children) && node.children.length > 0), children: node.children ? markLeafCheckboxOnly(node.children) : undefined })); });
55
66
  };
56
- // 🚀 Filtreleme işlemi
67
+ var findParentPath = function (nodes, targetValue, path) {
68
+ if (path === void 0) { path = []; }
69
+ for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
70
+ var node = nodes_1[_i];
71
+ var currentPath = __spreadArray(__spreadArray([], path, true), [node.value], false);
72
+ if (node.value === targetValue) {
73
+ return currentPath;
74
+ }
75
+ if (node.children) {
76
+ var result = findParentPath(node.children, targetValue, currentPath);
77
+ if (result)
78
+ return result;
79
+ }
80
+ }
81
+ return null;
82
+ };
83
+ var findLeafLabelByValue = function (nodes, value) {
84
+ for (var _i = 0, nodes_2 = nodes; _i < nodes_2.length; _i++) {
85
+ var node = nodes_2[_i];
86
+ if (node.value === value)
87
+ return node.label;
88
+ if (node.children) {
89
+ var result = findLeafLabelByValue(node.children, value);
90
+ if (result)
91
+ return result;
92
+ }
93
+ }
94
+ return null;
95
+ };
96
+ // 🚀 Filtreleme fonksiyonu (path'leri de genişletiyoruz)
57
97
  var filterTreeData = function (nodes, searchTerm) {
58
- return nodes.map(function (node) {
98
+ var pathsToExpand = [];
99
+ var filteredNodes = nodes.map(function (node) {
59
100
  var nodeMatches = node.label.toLowerCase().includes(searchTerm.toLowerCase());
60
- var children = node.children ? filterTreeData(node.children, searchTerm) : [];
61
- var childMatches = children.length > 0;
101
+ var children = node.children ? filterTreeData(node.children, searchTerm) : { filteredNodes: [], pathsToExpand: [] };
102
+ var childMatches = children.filteredNodes.length > 0;
62
103
  if (nodeMatches || childMatches) {
63
- return __assign(__assign({}, node), { children: childMatches ? children : node.children });
104
+ pathsToExpand = __spreadArray(__spreadArray(__spreadArray([], pathsToExpand, true), [node.value], false), children.pathsToExpand, true);
105
+ return __assign(__assign({}, node), { children: childMatches ? children.filteredNodes : node.children });
64
106
  }
65
107
  return null;
66
108
  }).filter(Boolean);
109
+ return { filteredNodes: filteredNodes, pathsToExpand: pathsToExpand };
67
110
  };
68
- // 🔥 Filtre güncelleme, expanded artık değişmiyor
69
111
  (0, react_1.useEffect)(function () {
70
112
  if (filterTerm.trim() === '') {
71
113
  setFilteredTreeData(treeData);
114
+ setExpanded(__spreadArray([], selectedPath, true));
72
115
  }
73
116
  else {
74
- var filteredNodes = filterTreeData(treeData, filterTerm);
117
+ var _a = filterTreeData(treeData, filterTerm), filteredNodes = _a.filteredNodes, pathsToExpand = _a.pathsToExpand;
75
118
  setFilteredTreeData(filteredNodes);
119
+ setExpanded(Array.from(new Set(__spreadArray(__spreadArray([], pathsToExpand, true), selectedPath, true))));
76
120
  }
77
- }, [filterTerm, treeData]);
121
+ }, [filterTerm, treeData, selectedPath]);
78
122
  var handleCheck = function (checkedNodes) {
79
123
  var newlySelected = checkedNodes.find(function (node) { return !checked.includes(node); });
80
124
  var selectedLeaf = newlySelected || '';
81
125
  setChecked(selectedLeaf ? [selectedLeaf] : []);
126
+ if (selectedLeaf) {
127
+ var parentPath = findParentPath(treeData, selectedLeaf);
128
+ if (parentPath) {
129
+ setSelectedPath(parentPath);
130
+ setExpanded(parentPath);
131
+ }
132
+ var selectedLabel = findLeafLabelByValue(treeData, selectedLeaf);
133
+ if (selectedLabel) {
134
+ setFilterTerm(selectedLabel);
135
+ setReadOnly(true);
136
+ }
137
+ }
82
138
  onChange(selectedLeaf);
83
139
  };
84
140
  var handleReset = function () {
85
141
  setFilterTerm('');
86
142
  setChecked([]);
143
+ setExpanded([]);
144
+ setReadOnly(false);
87
145
  };
146
+ // 🚀 Sayfa yüklendiğinde handleReset'i bir kere çalıştır
147
+ (0, react_1.useEffect)(function () {
148
+ handleCheck(['leafCheck']);
149
+ handleReset();
150
+ }, []);
88
151
  // 🚀 Validasyon Kontrolü
89
152
  (0, react_1.useEffect)(function () {
153
+ // Kullanıcı bir leaf seçmiş VE input boş değilse valid = true
90
154
  setIsValid(checked.length > 0 && filterTerm.trim().length > 0);
91
155
  }, [checked, filterTerm]);
92
156
  return (react_1.default.createElement("div", { className: className },
93
157
  react_1.default.createElement("div", { className: "form-group" },
94
- react_1.default.createElement(CustomInput_1.default, { id: id && "input-".concat(id), name: name && "input-".concat(name), label: label, value: filterTerm, disabled: disabled, readOnly: readOnly, required: required, valid: hasTriedToSubmit ? isValid : undefined, buttonIcon: react_1.default.createElement(fa_1.FaTimes, null), buttonClass: 'btn btn-danger bg-soft-danger', buttonOnClick: handleReset, inputType: CustomInput_1.InputType.TEXT, placeholder: placeholder, style: style, onChange: function (e) { return setFilterTerm(e.target.value); } }),
158
+ tooltip ? (react_1.default.createElement(react_bootstrap_1.OverlayTrigger, { placement: "bottom", overlay: react_1.default.createElement(react_bootstrap_1.Tooltip, { id: "tooltip-".concat(tooltip) }, tooltip) },
159
+ react_1.default.createElement(CustomInput_1.default, { id: id && "input-".concat(id), name: name && "input-".concat(name), label: label && label, value: filterTerm, disabled: disabled, readOnly: isReadOnly, required: required, valid: hasTriedToSubmit ? isValid : undefined, buttonIcon: react_1.default.createElement(fa_1.FaTimes, null), buttonClass: 'btn btn-danger bg-soft-danger', buttonOnClick: handleReset, inputType: CustomInput_1.InputType.TEXT, placeholder: placeholder, style: style, onChange: function (e) { return setFilterTerm(e.target.value); } }))) : (react_1.default.createElement(CustomInput_1.default, { id: id && "input-".concat(id), name: name && "input-".concat(name), label: label && label, value: filterTerm, disabled: disabled, readOnly: isReadOnly, required: required, valid: hasTriedToSubmit ? isValid : undefined, buttonIcon: react_1.default.createElement(fa_1.FaTimes, null), buttonClass: 'btn btn-danger bg-soft-danger', buttonOnClick: handleReset, inputType: CustomInput_1.InputType.TEXT, placeholder: placeholder, style: style, onChange: function (e) { return setFilterTerm(e.target.value); } })),
95
160
  react_1.default.createElement(react_checkbox_tree_1.default, { id: id, name: name, disabled: disabled, nodes: markLeafCheckboxOnly(filteredTreeData), checked: checked, expanded: expanded, onCheck: handleCheck, onExpand: setExpanded, icons: {
96
161
  check: react_1.default.createElement(fa_1.FaCheckSquare, { color: "#4caf50" }),
97
162
  uncheck: react_1.default.createElement(fa_1.FaSquare, { color: "currentColor" }),
@@ -102,14 +167,20 @@ var CustomTreeView = function (_a) {
102
167
  parentOpen: react_1.default.createElement(fa_1.FaFolderOpen, { color: "#ff9800" }),
103
168
  leaf: react_1.default.createElement(fa_1.FaFile, { color: "#607d8b" }),
104
169
  } }),
105
- required && !isValid && (react_1.default.createElement("div", { className: "invalid-feedback text-danger" },
106
- react_1.default.createElement(fa_1.FaExclamationTriangle, null),
107
- errorMessage || 'Bu alan boş bırakılamaz.')),
170
+ required && (react_1.default.createElement("div", { className: "invalid-feedback text-danger" },
171
+ react_1.default.createElement("div", { className: "description-icon" },
172
+ react_1.default.createElement(fa_1.FaExclamationTriangle, null)),
173
+ react_1.default.createElement("div", { className: "description-text" },
174
+ react_1.default.createElement("span", null, errorMessage || 'Bu alan boş bırakılamaz.')))),
108
175
  conditionalErrorVisible && (react_1.default.createElement("div", { className: "conditional-error-message text-warning" },
109
- react_1.default.createElement(fa_1.FaExclamationTriangle, null),
110
- conditionalErrorMessage)),
176
+ react_1.default.createElement("div", { className: "description-icon" },
177
+ react_1.default.createElement(fa_1.FaExclamationTriangle, null)),
178
+ react_1.default.createElement("div", { className: "description-text" },
179
+ react_1.default.createElement("span", null, conditionalErrorMessage)))),
111
180
  description && (react_1.default.createElement("div", { className: "form-description text-secondary" },
112
- react_1.default.createElement(fa_1.FaInfoCircle, null),
113
- description)))));
181
+ react_1.default.createElement("div", { className: "description-icon" },
182
+ react_1.default.createElement(fa_1.FaInfoCircle, null)),
183
+ react_1.default.createElement("div", { className: "description-text" },
184
+ react_1.default.createElement("span", null, description)))))));
114
185
  };
115
186
  exports.default = CustomTreeView;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "albinasoft-ui-package",
3
- "version": "1.0.20",
3
+ "version": "1.0.21",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {