albinasoft-ui-package 1.1.5 → 1.1.7
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.
@@ -4,12 +4,18 @@ export interface TreeNode {
|
|
4
4
|
value: string;
|
5
5
|
children?: TreeNode[];
|
6
6
|
}
|
7
|
-
interface CustomTreeViewProps {
|
7
|
+
export interface CustomTreeViewProps {
|
8
|
+
/** Eğer başlık göstermek isterseniz */
|
8
9
|
label?: string;
|
10
|
+
/** Seçili değerin (veya çokluysa dizi halinde) prop’u */
|
9
11
|
value: string | string[] | null;
|
12
|
+
/** Gösterilecek ağaç verisi */
|
10
13
|
treeData: TreeNode[];
|
14
|
+
/** Input placeholder’ı */
|
11
15
|
placeholder?: string;
|
16
|
+
/** Çoklu seçim modu */
|
12
17
|
multi?: boolean;
|
18
|
+
/** Seçim değiştiğinde çağrılır */
|
13
19
|
onChange: (selected: string | string[] | null) => void;
|
14
20
|
}
|
15
21
|
declare const CustomTreeView: React.FC<CustomTreeViewProps>;
|
@@ -1,4 +1,5 @@
|
|
1
1
|
"use strict";
|
2
|
+
// src/components/CustomTreeView.tsx
|
2
3
|
var __assign = (this && this.__assign) || function () {
|
3
4
|
__assign = Object.assign || function(t) {
|
4
5
|
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
@@ -51,10 +52,9 @@ var CustomInput_1 = __importStar(require("./CustomInput"));
|
|
51
52
|
var CustomTreeView = function (_a) {
|
52
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;
|
53
54
|
var _d = (0, react_1.useState)(''), filterTerm = _d[0], setFilterTerm = _d[1];
|
54
|
-
var
|
55
|
-
var
|
56
|
-
|
57
|
-
var _h = (0, react_1.useState)(false), isInputDisabled = _h[0], setIsInputDisabled = _h[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];
|
57
|
+
// Ağacın tüm node ID’lerini toplar
|
58
58
|
var getAllNodeIds = function (nodes) {
|
59
59
|
return nodes.reduce(function (acc, node) {
|
60
60
|
acc.push(node.value);
|
@@ -63,6 +63,7 @@ var CustomTreeView = function (_a) {
|
|
63
63
|
return acc;
|
64
64
|
}, []);
|
65
65
|
};
|
66
|
+
// Value’dan başlık bulmak için yardımcı
|
66
67
|
var findNodeByValue = function (nodes, val) {
|
67
68
|
for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
|
68
69
|
var node = nodes_1[_i];
|
@@ -78,114 +79,96 @@ var CustomTreeView = function (_a) {
|
|
78
79
|
};
|
79
80
|
var findLabelByValue = function (nodes, val) {
|
80
81
|
var node = findNodeByValue(nodes, val);
|
81
|
-
return node ? node.label :
|
82
|
+
return node ? node.label : val;
|
82
83
|
};
|
84
|
+
// Props value’dan selectedItems’e yansıt
|
83
85
|
(0, react_1.useEffect)(function () {
|
84
|
-
var
|
86
|
+
var initial = Array.isArray(value)
|
85
87
|
? value
|
86
88
|
: value
|
87
89
|
? [value]
|
88
90
|
: [];
|
89
|
-
setSelectedItems(
|
90
|
-
|
91
|
-
|
92
|
-
setInputValue(labels.join(', '));
|
93
|
-
setIsInputDisabled(true);
|
94
|
-
setExpandedItems(getAllNodeIds(treeData));
|
95
|
-
}
|
96
|
-
else {
|
97
|
-
setExpandedItems(getAllNodeIds(treeData));
|
98
|
-
setInputValue('');
|
99
|
-
setIsInputDisabled(false);
|
100
|
-
}
|
101
|
-
}, [value, treeData]);
|
91
|
+
setSelectedItems(initial);
|
92
|
+
}, [value]);
|
93
|
+
// Filtre ve expand mantığı
|
102
94
|
var filterTree = function (nodes, term) {
|
103
|
-
var
|
104
|
-
var
|
105
|
-
var
|
95
|
+
var norm = term.toLocaleLowerCase('tr-TR');
|
96
|
+
var paths = [];
|
97
|
+
var filtered = nodes
|
106
98
|
.map(function (node) {
|
107
|
-
var
|
108
|
-
var
|
109
|
-
var childrenResult = node.children
|
99
|
+
var labelNorm = node.label.toLocaleLowerCase('tr-TR');
|
100
|
+
var childResult = node.children
|
110
101
|
? filterTree(node.children, term)
|
111
102
|
: { filteredNodes: [], pathsToExpand: [] };
|
112
|
-
if (
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
return __assign(__assign({}, node), { children: childrenResult.filteredNodes.length > 0
|
117
|
-
? childrenResult.filteredNodes
|
103
|
+
if (labelNorm.includes(norm) || childResult.filteredNodes.length) {
|
104
|
+
paths.push.apply(paths, __spreadArray([node.value], childResult.pathsToExpand, false));
|
105
|
+
return __assign(__assign({}, node), { children: childResult.filteredNodes.length > 0
|
106
|
+
? childResult.filteredNodes
|
118
107
|
: undefined });
|
119
108
|
}
|
120
109
|
return null;
|
121
110
|
})
|
122
111
|
.filter(Boolean);
|
123
|
-
return { filteredNodes:
|
112
|
+
return { filteredNodes: filtered, pathsToExpand: Array.from(new Set(paths)) };
|
124
113
|
};
|
125
|
-
var
|
114
|
+
var _h = filterTerm
|
126
115
|
? filterTree(treeData, filterTerm)
|
127
|
-
: { filteredNodes: treeData, pathsToExpand: [] }, filteredNodes =
|
116
|
+
: { filteredNodes: treeData, pathsToExpand: [] }, filteredNodes = _h.filteredNodes, pathsToExpand = _h.pathsToExpand;
|
117
|
+
// Yalnızca filtre yaptığımızda aç
|
128
118
|
(0, react_1.useEffect)(function () {
|
129
119
|
if (filterTerm) {
|
130
120
|
setExpandedItems(pathsToExpand);
|
131
121
|
}
|
132
122
|
}, [filterTerm, pathsToExpand]);
|
133
|
-
|
134
|
-
|
123
|
+
// Seçim değiştiğinde hem iç state’e hem de parent’a bildir
|
124
|
+
var handleSelectionChange = function (_evt, itemIds) {
|
125
|
+
var newSel = Array.isArray(itemIds)
|
135
126
|
? itemIds
|
136
127
|
: itemIds
|
137
128
|
? [itemIds]
|
138
129
|
: [];
|
139
|
-
setSelectedItems(
|
130
|
+
setSelectedItems(newSel);
|
140
131
|
if (multi) {
|
141
|
-
onChange(
|
142
|
-
var labels = newSelected.map(function (val) { return findLabelByValue(treeData, val); });
|
143
|
-
setInputValue(labels.join(', '));
|
144
|
-
setIsInputDisabled(!!labels.length);
|
132
|
+
onChange(newSel);
|
145
133
|
}
|
146
134
|
else {
|
147
|
-
|
148
|
-
onChange(single);
|
149
|
-
if (single) {
|
150
|
-
setInputValue(findLabelByValue(treeData, single));
|
151
|
-
setIsInputDisabled(true);
|
152
|
-
}
|
153
|
-
else {
|
154
|
-
setInputValue('');
|
155
|
-
setIsInputDisabled(false);
|
156
|
-
}
|
135
|
+
onChange(newSel[0] || null);
|
157
136
|
}
|
158
137
|
};
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
: __spreadArray(__spreadArray([], selectedItems, true), [val], false);
|
165
|
-
}
|
166
|
-
else {
|
167
|
-
newSelected = [val];
|
168
|
-
}
|
169
|
-
// simulate SyntheticEvent
|
170
|
-
handleSelectionChange({}, newSelected);
|
138
|
+
// Badge’e tıklayıp seçimi kaldır
|
139
|
+
var handleBadgeRemove = function (val) {
|
140
|
+
var filtered = selectedItems.filter(function (v) { return v !== val; });
|
141
|
+
setSelectedItems(filtered);
|
142
|
+
onChange(multi ? filtered : filtered[0] || null);
|
171
143
|
};
|
144
|
+
// Filtreyi sıfırla
|
172
145
|
var handleReset = function () {
|
173
146
|
setFilterTerm('');
|
174
147
|
setSelectedItems([]);
|
175
148
|
onChange(multi ? [] : null);
|
176
|
-
|
177
|
-
setIsInputDisabled(false);
|
178
|
-
setExpandedItems(getAllNodeIds(treeData));
|
149
|
+
setExpandedItems([]);
|
179
150
|
};
|
151
|
+
// Ağaç elemanlarını render et
|
180
152
|
var renderTree = function (nodes) {
|
181
|
-
return nodes.map(function (node) { return (react_1.default.createElement(TreeItem_1.TreeItem, { key: node.value, itemId: node.value, label: react_1.default.createElement("span", { onClick: function () {
|
153
|
+
return nodes.map(function (node) { return (react_1.default.createElement(TreeItem_1.TreeItem, { key: node.value, itemId: node.value, label: react_1.default.createElement("span", { onClick: function () {
|
154
|
+
// TreeItem label’ına tıklayınca da seçilsin
|
155
|
+
var next = multi
|
156
|
+
? selectedItems.includes(node.value)
|
157
|
+
? selectedItems.filter(function (v) { return v !== node.value; })
|
158
|
+
: __spreadArray(__spreadArray([], selectedItems, true), [node.value], false)
|
159
|
+
: [node.value];
|
160
|
+
handleSelectionChange({}, next);
|
161
|
+
}, style: { cursor: 'pointer' } }, node.label || 'Kök') }, node.children ? renderTree(node.children) : null)); });
|
182
162
|
};
|
183
163
|
return (react_1.default.createElement("div", null,
|
184
164
|
label && react_1.default.createElement("label", null, label),
|
185
|
-
react_1.default.createElement(CustomInput_1.default, { id: "tree-search", value:
|
186
|
-
react_1.default.createElement(
|
187
|
-
|
188
|
-
|
165
|
+
react_1.default.createElement(CustomInput_1.default, { id: "tree-search", 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); } }),
|
166
|
+
selectedItems.length > 0 && (react_1.default.createElement("div", { className: "mt-1" }, 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); } },
|
167
|
+
findLabelByValue(treeData, val),
|
168
|
+
" \u00D7")); }))),
|
169
|
+
react_1.default.createElement(SimpleTreeView_1.SimpleTreeView, { checkboxSelection: true, multiSelect: multi, selectedItems: selectedItems, expandedItems: expandedItems, onSelectedItemsChange: handleSelectionChange, onExpandedItemsChange: function (_e, ids) {
|
170
|
+
var arr = Array.isArray(ids) ? ids : ids ? [ids] : [];
|
171
|
+
setExpandedItems(arr);
|
189
172
|
} }, renderTree(filteredNodes))));
|
190
173
|
};
|
191
174
|
exports.default = CustomTreeView;
|