albinasoft-ui-package 1.0.21 → 1.0.22
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.
@@ -1,29 +1,15 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import 'react-checkbox-tree/lib/react-checkbox-tree.css';
|
3
|
-
export interface TreeNode {
|
4
|
-
label: string;
|
5
|
-
value: string;
|
6
|
-
children?: TreeNode[];
|
7
|
-
}
|
8
3
|
interface CustomTreeViewProps {
|
9
|
-
id?: string;
|
10
|
-
name?: string;
|
11
4
|
label?: string;
|
12
5
|
value: string;
|
13
6
|
treeData: TreeNode[];
|
14
|
-
placeholder?: string;
|
15
|
-
required?: boolean;
|
16
|
-
errorMessage?: string;
|
17
|
-
conditionalErrorVisible?: boolean;
|
18
|
-
conditionalErrorMessage?: string;
|
19
|
-
disabled?: boolean;
|
20
|
-
readOnly?: boolean;
|
21
|
-
description?: string | null;
|
22
|
-
tooltip?: string;
|
23
|
-
style?: React.CSSProperties;
|
24
|
-
className?: string;
|
25
7
|
onChange: (selected: string) => void;
|
26
|
-
|
8
|
+
}
|
9
|
+
export interface TreeNode {
|
10
|
+
label: string;
|
11
|
+
value: string;
|
12
|
+
children?: TreeNode[];
|
27
13
|
}
|
28
14
|
declare const CustomTreeView: React.FC<CustomTreeViewProps>;
|
29
15
|
export default CustomTreeView;
|
@@ -51,19 +51,18 @@ var react_checkbox_tree_1 = __importDefault(require("react-checkbox-tree"));
|
|
51
51
|
require("react-checkbox-tree/lib/react-checkbox-tree.css");
|
52
52
|
var fa_1 = require("react-icons/fa");
|
53
53
|
var CustomInput_1 = __importStar(require("./CustomInput"));
|
54
|
-
var react_bootstrap_1 = require("react-bootstrap");
|
55
54
|
var CustomTreeView = function (_a) {
|
56
|
-
var
|
57
|
-
var
|
58
|
-
var
|
59
|
-
var
|
60
|
-
var
|
61
|
-
var
|
62
|
-
|
63
|
-
var _p = (0, react_1.useState)(false), isValid = _p[0], setIsValid = _p[1];
|
55
|
+
var label = _a.label, value = _a.value, treeData = _a.treeData, onChange = _a.onChange;
|
56
|
+
var _b = (0, react_1.useState)(value ? [value] : []), checked = _b[0], setChecked = _b[1];
|
57
|
+
var _c = (0, react_1.useState)([]), expanded = _c[0], setExpanded = _c[1];
|
58
|
+
var _d = (0, react_1.useState)(''), filterTerm = _d[0], setFilterTerm = _d[1];
|
59
|
+
var _e = (0, react_1.useState)(treeData), filteredTreeData = _e[0], setFilteredTreeData = _e[1];
|
60
|
+
var _f = (0, react_1.useState)([]), selectedPath = _f[0], setSelectedPath = _f[1]; // 🔥 Seçilen path
|
61
|
+
// 🚀 Recursive function to add `showCheckbox` only for leaf nodes
|
64
62
|
var markLeafCheckboxOnly = function (nodes) {
|
65
63
|
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 })); });
|
66
64
|
};
|
65
|
+
// 🚀 Parent Path'i Bulma (recursive)
|
67
66
|
var findParentPath = function (nodes, targetValue, path) {
|
68
67
|
if (path === void 0) { path = []; }
|
69
68
|
for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
|
@@ -80,19 +79,6 @@ var CustomTreeView = function (_a) {
|
|
80
79
|
}
|
81
80
|
return null;
|
82
81
|
};
|
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
82
|
// 🚀 Filtreleme fonksiyonu (path'leri de genişletiyoruz)
|
97
83
|
var filterTreeData = function (nodes, searchTerm) {
|
98
84
|
var pathsToExpand = [];
|
@@ -108,17 +94,19 @@ var CustomTreeView = function (_a) {
|
|
108
94
|
}).filter(Boolean);
|
109
95
|
return { filteredNodes: filteredNodes, pathsToExpand: pathsToExpand };
|
110
96
|
};
|
97
|
+
// 🚀 Filtreleme işlemi
|
111
98
|
(0, react_1.useEffect)(function () {
|
112
99
|
if (filterTerm.trim() === '') {
|
113
100
|
setFilteredTreeData(treeData);
|
114
|
-
setExpanded(__spreadArray([], selectedPath, true));
|
101
|
+
setExpanded(__spreadArray([], selectedPath, true)); // 🔥 Seçim yapılmış path açık kalsın
|
115
102
|
}
|
116
103
|
else {
|
117
104
|
var _a = filterTreeData(treeData, filterTerm), filteredNodes = _a.filteredNodes, pathsToExpand = _a.pathsToExpand;
|
118
105
|
setFilteredTreeData(filteredNodes);
|
119
|
-
setExpanded(Array.from(new Set(__spreadArray(__spreadArray([], pathsToExpand, true), selectedPath, true))));
|
106
|
+
setExpanded(Array.from(new Set(__spreadArray(__spreadArray([], pathsToExpand, true), selectedPath, true)))); // 🔥 Genişletilecek tüm path'leri belirle
|
120
107
|
}
|
121
108
|
}, [filterTerm, treeData, selectedPath]);
|
109
|
+
// 🚀 Kullanıcı bir leaf seçtiğinde, o leaf'in parent'larını genişlet
|
122
110
|
var handleCheck = function (checkedNodes) {
|
123
111
|
var newlySelected = checkedNodes.find(function (node) { return !checked.includes(node); });
|
124
112
|
var selectedLeaf = newlySelected || '';
|
@@ -126,61 +114,25 @@ var CustomTreeView = function (_a) {
|
|
126
114
|
if (selectedLeaf) {
|
127
115
|
var parentPath = findParentPath(treeData, selectedLeaf);
|
128
116
|
if (parentPath) {
|
129
|
-
setSelectedPath(parentPath);
|
130
|
-
setExpanded(parentPath);
|
131
|
-
}
|
132
|
-
var selectedLabel = findLeafLabelByValue(treeData, selectedLeaf);
|
133
|
-
if (selectedLabel) {
|
134
|
-
setFilterTerm(selectedLabel);
|
135
|
-
setReadOnly(true);
|
117
|
+
setSelectedPath(parentPath); // 🔥 Kalıcı olarak bu path'i hatırla
|
118
|
+
setExpanded(parentPath); // 🔥 Yalnızca bu leaf'in parent path'i açık kalacak
|
136
119
|
}
|
137
120
|
}
|
121
|
+
setFilterTerm(''); // 🔥 Arama kutusunu temizle
|
138
122
|
onChange(selectedLeaf);
|
139
123
|
};
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
// Kullanıcı bir leaf seçmiş VE input boş değilse valid = true
|
154
|
-
setIsValid(checked.length > 0 && filterTerm.trim().length > 0);
|
155
|
-
}, [checked, filterTerm]);
|
156
|
-
return (react_1.default.createElement("div", { className: className },
|
157
|
-
react_1.default.createElement("div", { className: "form-group" },
|
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); } })),
|
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: {
|
161
|
-
check: react_1.default.createElement(fa_1.FaCheckSquare, { color: "#4caf50" }),
|
162
|
-
uncheck: react_1.default.createElement(fa_1.FaSquare, { color: "currentColor" }),
|
163
|
-
halfCheck: react_1.default.createElement(fa_1.FaMinusSquare, { color: "#ff9800" }),
|
164
|
-
expandClose: react_1.default.createElement(fa_1.FaChevronRight, { color: "#3f51b5" }),
|
165
|
-
expandOpen: react_1.default.createElement(fa_1.FaChevronDown, { color: "#3f51b5" }),
|
166
|
-
parentClose: react_1.default.createElement(fa_1.FaFolder, { color: "#ff9800" }),
|
167
|
-
parentOpen: react_1.default.createElement(fa_1.FaFolderOpen, { color: "#ff9800" }),
|
168
|
-
leaf: react_1.default.createElement(fa_1.FaFile, { color: "#607d8b" }),
|
169
|
-
} }),
|
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.')))),
|
175
|
-
conditionalErrorVisible && (react_1.default.createElement("div", { className: "conditional-error-message text-warning" },
|
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)))),
|
180
|
-
description && (react_1.default.createElement("div", { className: "form-description text-secondary" },
|
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)))))));
|
124
|
+
return (react_1.default.createElement("div", null,
|
125
|
+
label && react_1.default.createElement("label", null, label),
|
126
|
+
react_1.default.createElement(CustomInput_1.default, { id: "tree-search", value: filterTerm, inputType: CustomInput_1.InputType.TEXT, placeholder: "Ara...", onChange: function (e) { return setFilterTerm(e.target.value); } }),
|
127
|
+
react_1.default.createElement(react_checkbox_tree_1.default, { nodes: markLeafCheckboxOnly(filteredTreeData), checked: checked, expanded: expanded, onCheck: handleCheck, onExpand: setExpanded, icons: {
|
128
|
+
check: react_1.default.createElement(fa_1.FaCheckSquare, { color: "#4caf50" }),
|
129
|
+
uncheck: react_1.default.createElement(fa_1.FaSquare, { color: "currentColor" }),
|
130
|
+
halfCheck: react_1.default.createElement(fa_1.FaMinusSquare, { color: "#ff9800" }),
|
131
|
+
expandClose: react_1.default.createElement(fa_1.FaChevronRight, { color: "#3f51b5" }),
|
132
|
+
expandOpen: react_1.default.createElement(fa_1.FaChevronDown, { color: "#3f51b5" }),
|
133
|
+
parentClose: react_1.default.createElement(fa_1.FaFolder, { color: "#ff9800" }),
|
134
|
+
parentOpen: react_1.default.createElement(fa_1.FaFolderOpen, { color: "#ff9800" }),
|
135
|
+
leaf: react_1.default.createElement(fa_1.FaFile, { color: "#607d8b" }),
|
136
|
+
} })));
|
185
137
|
};
|
186
138
|
exports.default = CustomTreeView;
|