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
- hasTriedToSubmit?: boolean;
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 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;
57
- var _h = (0, react_1.useState)(value ? [value] : []), checked = _h[0], setChecked = _h[1];
58
- var _j = (0, react_1.useState)([]), expanded = _j[0], setExpanded = _j[1];
59
- var _k = (0, react_1.useState)(''), filterTerm = _k[0], setFilterTerm = _k[1];
60
- var _l = (0, react_1.useState)(treeData), filteredTreeData = _l[0], setFilteredTreeData = _l[1];
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];
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
- var handleReset = function () {
141
- setFilterTerm('');
142
- setChecked([]);
143
- setExpanded([]);
144
- setReadOnly(false);
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
- }, []);
151
- // 🚀 Validasyon Kontrolü
152
- (0, react_1.useEffect)(function () {
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "albinasoft-ui-package",
3
- "version": "1.0.21",
3
+ "version": "1.0.22",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {