albinasoft-ui-package 1.0.17 → 1.0.19

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.
@@ -160,6 +160,7 @@ interface AutoCompleteInputElement {
160
160
  type FormElement = InputElement | TextareaElement | CheckboxElement | RadioButtonElement | SelectElement | DateTimePickerElement | TextElement | DividerElement | RichTextboxElement | TreeViewElement | ButtonElement | AutoCompleteInputElement;
161
161
  interface CustomFormProps {
162
162
  elements: FormElement[];
163
+ innerRowCustomClass?: string;
163
164
  onSubmit: (formValues: Record<string, any>) => void;
164
165
  confirmLabel?: string;
165
166
  cancelLabel?: string;
@@ -69,7 +69,7 @@ var ElementType;
69
69
  })(ElementType || (ElementType = {}));
70
70
  exports.ElementType = ElementType;
71
71
  var CustomForm = function (_a) {
72
- var elements = _a.elements, onSubmit = _a.onSubmit, _b = _a.confirmLabel, confirmLabel = _b === void 0 ? 'Confirm' : _b, // Varsayılan değer
72
+ var elements = _a.elements, innerRowCustomClass = _a.innerRowCustomClass, onSubmit = _a.onSubmit, _b = _a.confirmLabel, confirmLabel = _b === void 0 ? 'Confirm' : _b, // Varsayılan değer
73
73
  _c = _a.cancelLabel, // Varsayılan değer
74
74
  cancelLabel = _c === void 0 ? 'Cancel' : _c, // Varsayılan değer
75
75
  handleCancel = _a.handleCancel, _d = _a.showConfirmButton, showConfirmButton = _d === void 0 ? true : _d, // Varsayılan olarak görünür
@@ -145,7 +145,7 @@ var CustomForm = function (_a) {
145
145
  var colId = _a[0], innerRows = _a[1];
146
146
  return (react_1.default.createElement("div", { className: "col", key: "col-".concat(rowId, "-").concat(colId) }, Object.entries(innerRows).map(function (_a) {
147
147
  var innerRowId = _a[0], elements = _a[1];
148
- return (react_1.default.createElement("div", { className: "row", 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 ?
148
+ 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 ?
149
149
  (react_1.default.createElement(CustomText_1.default, __assign({}, element))) : element.type === ElementType.INPUT ?
150
150
  (react_1.default.createElement(CustomInput_1.default, __assign({}, element))) : element.type === ElementType.TEXTAREA ?
151
151
  (react_1.default.createElement(CustomTextarea_1.default, __assign({}, element))) : element.type === ElementType.CHECKBOX ?
@@ -21,11 +21,14 @@ interface CustomInputProps {
21
21
  disabled?: boolean;
22
22
  readOnly?: boolean;
23
23
  buttonIcon?: React.ReactNode;
24
+ buttonClass?: string;
24
25
  buttonTooltip?: string;
25
26
  description?: string | null;
26
27
  tooltip?: string;
27
28
  style?: React.CSSProperties;
29
+ inputClass?: string;
28
30
  className?: string;
31
+ valid?: boolean;
29
32
  buttonOnClick?: () => void;
30
33
  onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
31
34
  }
@@ -38,9 +38,10 @@ var InputType;
38
38
  })(InputType || (InputType = {}));
39
39
  exports.InputType = InputType;
40
40
  var CustomInput = function (_a) {
41
- var id = _a.id, name = _a.name, label = _a.label, _b = _a.inputType, inputType = _b === void 0 ? InputType.TEXT : _b, value = _a.value, placeholder = _a.placeholder, _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, buttonIcon = _a.buttonIcon, buttonTooltip = _a.buttonTooltip, description = _a.description, tooltip = _a.tooltip, style = _a.style, className = _a.className, buttonOnClick = _a.buttonOnClick, onChange = _a.onChange;
42
- var _g = (0, react_1.useState)(false), showPassword = _g[0], setShowPassword = _g[1];
41
+ var id = _a.id, name = _a.name, label = _a.label, _b = _a.inputType, inputType = _b === void 0 ? InputType.TEXT : _b, value = _a.value, placeholder = _a.placeholder, _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, buttonIcon = _a.buttonIcon, buttonClass = _a.buttonClass, buttonTooltip = _a.buttonTooltip, description = _a.description, tooltip = _a.tooltip, style = _a.style, className = _a.className, _g = _a.valid, valid = _g === void 0 ? undefined : _g, buttonOnClick = _a.buttonOnClick, onChange = _a.onChange;
42
+ var _h = (0, react_1.useState)(false), showPassword = _h[0], setShowPassword = _h[1];
43
43
  var handleType = inputType === InputType.PASSWORD && showPassword ? InputType.TEXT : inputType;
44
+ var inputClass = "form-control ".concat(valid === true ? 'is-valid' : '', " ").concat(valid === false ? 'is-invalid' : '');
44
45
  var togglePasswordVisibility = function () {
45
46
  setShowPassword(function (prev) { return !prev; });
46
47
  };
@@ -49,11 +50,11 @@ var CustomInput = function (_a) {
49
50
  react_1.default.createElement("label", { htmlFor: id, className: "form-label" }, label),
50
51
  react_1.default.createElement("div", { className: "input-group position-relative" },
51
52
  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) },
52
- react_1.default.createElement("input", { id: id, name: name, type: handleType, value: value, placeholder: placeholder, onChange: onChange, className: "form-control", style: style, required: required, disabled: disabled, autoComplete: "new-password" // Modern tarayıcılarda autocomplete autofill engellemek için
53
- }))) : (react_1.default.createElement("input", { id: id, name: name, type: handleType, value: value, placeholder: placeholder, onChange: onChange, className: "form-control", style: style, required: required, disabled: disabled, autoComplete: "new-password" // Modern tarayıcılarda autocomplete autofill engellemek için
53
+ react_1.default.createElement("input", { id: id, name: name, type: handleType, value: value, placeholder: placeholder, onChange: onChange, className: inputClass, style: style, required: required, disabled: disabled, readOnly: readOnly, autoComplete: "new-password" // Modern tarayıcılarda autocomplete autofill engellemek için
54
+ }))) : (react_1.default.createElement("input", { id: id, name: name, type: handleType, value: value, placeholder: placeholder, onChange: onChange, className: inputClass, style: style, required: required, disabled: disabled, readOnly: readOnly, autoComplete: "new-password" // Modern tarayıcılarda autocomplete autofill engellemek için
54
55
  })),
55
56
  inputType === InputType.PASSWORD && (react_1.default.createElement("button", { type: "button", onClick: togglePasswordVisibility, className: "btn btn-outline-secondary", title: showPassword ? "Parolayı Gizle" : "Parolayı Göster" }, showPassword ? react_1.default.createElement(fa_1.FaEyeSlash, null) : react_1.default.createElement(fa_1.FaEye, null))),
56
- buttonIcon && buttonOnClick && (react_1.default.createElement("button", { type: "button", onClick: buttonOnClick, className: "btn btn-outline-secondary", title: buttonTooltip || "" }, buttonIcon)),
57
+ buttonIcon && buttonOnClick && (react_1.default.createElement("button", { type: "button", onClick: buttonOnClick, className: buttonClass || "btn btn-outline-secondary", title: buttonTooltip || "" }, buttonIcon)),
57
58
  required && (react_1.default.createElement("div", { className: "invalid-feedback text-danger" },
58
59
  react_1.default.createElement("div", { className: "description-icon" },
59
60
  react_1.default.createElement(fa_1.FaExclamationTriangle, null)),
@@ -1,15 +1,29 @@
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
+ }
3
8
  interface CustomTreeViewProps {
9
+ id?: string;
10
+ name?: string;
4
11
  label?: string;
5
12
  value: string;
6
13
  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;
7
25
  onChange: (selected: string) => void;
8
- }
9
- export interface TreeNode {
10
- label: string;
11
- value: string;
12
- children?: TreeNode[];
26
+ hasTriedToSubmit?: boolean;
13
27
  }
14
28
  declare const CustomTreeView: React.FC<CustomTreeViewProps>;
15
29
  export default CustomTreeView;
@@ -51,18 +51,19 @@ 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");
54
55
  var CustomTreeView = function (_a) {
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
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];
62
64
  var markLeafCheckboxOnly = function (nodes) {
63
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 })); });
64
66
  };
65
- // 🚀 Parent Path'i Bulma (recursive)
66
67
  var findParentPath = function (nodes, targetValue, path) {
67
68
  if (path === void 0) { path = []; }
68
69
  for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
@@ -79,6 +80,19 @@ var CustomTreeView = function (_a) {
79
80
  }
80
81
  return null;
81
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
+ };
82
96
  // 🚀 Filtreleme fonksiyonu (path'leri de genişletiyoruz)
83
97
  var filterTreeData = function (nodes, searchTerm) {
84
98
  var pathsToExpand = [];
@@ -94,19 +108,17 @@ var CustomTreeView = function (_a) {
94
108
  }).filter(Boolean);
95
109
  return { filteredNodes: filteredNodes, pathsToExpand: pathsToExpand };
96
110
  };
97
- // 🚀 Filtreleme işlemi
98
111
  (0, react_1.useEffect)(function () {
99
112
  if (filterTerm.trim() === '') {
100
113
  setFilteredTreeData(treeData);
101
- setExpanded(__spreadArray([], selectedPath, true)); // 🔥 Seçim yapılmış path açık kalsın
114
+ setExpanded(__spreadArray([], selectedPath, true));
102
115
  }
103
116
  else {
104
117
  var _a = filterTreeData(treeData, filterTerm), filteredNodes = _a.filteredNodes, pathsToExpand = _a.pathsToExpand;
105
118
  setFilteredTreeData(filteredNodes);
106
- setExpanded(Array.from(new Set(__spreadArray(__spreadArray([], pathsToExpand, true), selectedPath, true)))); // 🔥 Genişletilecek tüm path'leri belirle
119
+ setExpanded(Array.from(new Set(__spreadArray(__spreadArray([], pathsToExpand, true), selectedPath, true))));
107
120
  }
108
121
  }, [filterTerm, treeData, selectedPath]);
109
- // 🚀 Kullanıcı bir leaf seçtiğinde, o leaf'in parent'larını genişlet
110
122
  var handleCheck = function (checkedNodes) {
111
123
  var newlySelected = checkedNodes.find(function (node) { return !checked.includes(node); });
112
124
  var selectedLeaf = newlySelected || '';
@@ -114,25 +126,61 @@ var CustomTreeView = function (_a) {
114
126
  if (selectedLeaf) {
115
127
  var parentPath = findParentPath(treeData, selectedLeaf);
116
128
  if (parentPath) {
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
129
+ setSelectedPath(parentPath);
130
+ setExpanded(parentPath);
131
+ }
132
+ var selectedLabel = findLeafLabelByValue(treeData, selectedLeaf);
133
+ if (selectedLabel) {
134
+ setFilterTerm(selectedLabel);
135
+ setReadOnly(true);
119
136
  }
120
137
  }
121
- setFilterTerm(''); // 🔥 Arama kutusunu temizle
122
138
  onChange(selectedLeaf);
123
139
  };
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
- } })));
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)))))));
137
185
  };
138
186
  exports.default = CustomTreeView;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "albinasoft-ui-package",
3
- "version": "1.0.17",
3
+ "version": "1.0.19",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {