pixel-react-excel-sheet 1.0.10 → 1.0.12

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.
Files changed (202) hide show
  1. package/.yarn/install-state.gz +0 -0
  2. package/lib/1fb4472b34e4fe07.css +1 -0
  3. package/lib/components/Accordion/Accordion.d.ts +1 -1
  4. package/lib/components/Accordion/types.d.ts +12 -0
  5. package/lib/components/AddVariables/AddVariables.d.ts +5 -0
  6. package/lib/components/AddVariables/index.d.ts +1 -0
  7. package/lib/components/AddVariables/types.d.ts +35 -0
  8. package/lib/components/AppHeader/types.d.ts +2 -0
  9. package/lib/components/AttachImage/AttachImage.d.ts +1 -6
  10. package/lib/components/AttachImage/types.d.ts +8 -0
  11. package/lib/components/Avatar/types.d.ts +9 -1
  12. package/lib/components/Checkbox/types.d.ts +4 -0
  13. package/lib/components/Comment/Comments.d.ts +4 -0
  14. package/lib/components/Comment/comment/Comment.d.ts +11 -0
  15. package/lib/components/Comment/comment/useNode.d.ts +7 -0
  16. package/lib/components/Comment/index.d.ts +1 -0
  17. package/lib/components/Comment/type.d.ts +25 -0
  18. package/lib/components/CreateVariable/CreateVariableSlider.d.ts +5 -0
  19. package/lib/components/CreateVariable/index.d.ts +1 -0
  20. package/lib/components/CreateVariable/types.d.ts +56 -0
  21. package/lib/components/Drawer/Types.d.ts +13 -0
  22. package/lib/components/Editor/constants.d.ts +1 -1
  23. package/lib/components/Editor/types.d.ts +10 -2
  24. package/lib/components/Excel/ExcelFile/ExcelFileComponents/actions.d.ts +8 -1
  25. package/lib/components/Excel/ExcelFile/ExcelFileComponents/reducerFunctions.d.ts +2 -0
  26. package/lib/components/Excel/ExcelFile/ExcelFileComponents/types.d.ts +13 -6
  27. package/lib/components/IconButton/IconButton.d.ts +1 -2
  28. package/lib/components/IconButton/types.d.ts +1 -0
  29. package/lib/components/Input/Input.d.ts +1 -1
  30. package/lib/components/MiniModal/types.d.ts +7 -0
  31. package/lib/components/MultiSelect/MultiSelect.d.ts +1 -1
  32. package/lib/components/PhoneInput/PhoneInput.d.ts +6 -0
  33. package/lib/components/PhoneInput/index.d.ts +1 -0
  34. package/lib/components/PhoneInput/types.d.ts +10 -0
  35. package/lib/components/PopUpModal/types.d.ts +1 -0
  36. package/lib/components/Select/components/types.d.ts +1 -0
  37. package/lib/components/Select/types.d.ts +2 -0
  38. package/lib/components/TableTree/Components/TableBody.d.ts +4 -0
  39. package/lib/components/TableTree/Components/TableCell.d.ts +4 -0
  40. package/lib/components/TableTree/Components/TableHead.d.ts +4 -0
  41. package/lib/components/TableTree/Components/TableRow.d.ts +4 -0
  42. package/lib/components/TableTree/Utils/getAllChildIds.d.ts +1 -0
  43. package/lib/components/TableTree/types.d.ts +38 -5
  44. package/lib/components/TableWithAccordion/TableWithAccordion.d.ts +5 -0
  45. package/lib/components/TableWithAccordion/data.d.ts +8 -0
  46. package/lib/components/TableWithAccordion/index.d.ts +1 -0
  47. package/lib/components/TableWithAccordion/types.d.ts +67 -0
  48. package/lib/index.d.ts +303 -17
  49. package/lib/index.esm.js +3372 -747
  50. package/lib/index.esm.js.map +1 -1
  51. package/lib/index.js +3377 -746
  52. package/lib/index.js.map +1 -1
  53. package/lib/tsconfig.tsbuildinfo +1 -1
  54. package/lib/utils/checkDuplicates/checkDuplicates.d.ts +1 -0
  55. package/package.json +2 -1
  56. package/src/assets/Themes/BaseTheme.scss +14 -0
  57. package/src/assets/Themes/DarkTheme.scss +68 -41
  58. package/src/assets/icons/add_file.svg +4 -17
  59. package/src/assets/icons/add_variable.svg +11 -0
  60. package/src/assets/icons/authorization.svg +4 -0
  61. package/src/assets/icons/authorization_icon.svg +1 -0
  62. package/src/assets/icons/backward.svg +10 -0
  63. package/src/assets/icons/capture_icon.svg +3 -0
  64. package/src/assets/icons/depends_on_script.svg +7 -0
  65. package/src/assets/icons/download_file_icon.svg +2 -9
  66. package/src/assets/icons/email_group.svg +3 -0
  67. package/src/assets/icons/executions_icon.svg +3 -0
  68. package/src/assets/icons/forward.svg +3 -0
  69. package/src/assets/icons/labels.svg +8 -0
  70. package/src/assets/icons/machine_disable_icon.svg +18 -0
  71. package/src/assets/icons/machine_enable_icon.svg +10 -0
  72. package/src/assets/icons/parameters.svg +3 -0
  73. package/src/assets/icons/pre_post_condition.svg +8 -0
  74. package/src/assets/icons/program_element.svg +8 -0
  75. package/src/assets/icons/project_status_icon.svg +10 -0
  76. package/src/assets/icons/refresh_icon.svg +4 -0
  77. package/src/assets/icons/rotate_icon.svg +10 -0
  78. package/src/assets/icons/suites_icon.svg +3 -0
  79. package/src/assets/icons/swipe_icon.svg +9 -0
  80. package/src/assets/icons/tap_icon.svg +4 -0
  81. package/src/assets/icons/test_data.svg +5 -0
  82. package/src/assets/icons/test_data_set.svg +7 -0
  83. package/src/assets/icons/variable_set.svg +5 -0
  84. package/src/assets/styles/_colors.scss +0 -1
  85. package/src/components/Accordion/Accordion.stories.tsx +4 -0
  86. package/src/components/Accordion/Accordion.tsx +7 -1
  87. package/src/components/Accordion/types.ts +12 -0
  88. package/src/components/AddVariables/AddVariables.scss +14 -0
  89. package/src/components/AddVariables/AddVariables.stories.tsx +44 -0
  90. package/src/components/AddVariables/AddVariables.tsx +113 -0
  91. package/src/components/AddVariables/index.ts +1 -0
  92. package/src/components/AddVariables/types.ts +36 -0
  93. package/src/components/AllProjectsDropdown/AllProjectsDropdown.scss +1 -1
  94. package/src/components/AppHeader/AppHeader.scss +40 -1
  95. package/src/components/AppHeader/AppHeader.stories.tsx +133 -5
  96. package/src/components/AppHeader/AppHeader.tsx +111 -112
  97. package/src/components/AppHeader/types.ts +10 -9
  98. package/src/components/AttachImage/AttachImage.stories.tsx +2 -0
  99. package/src/components/AttachImage/AttachImage.tsx +5 -9
  100. package/src/components/AttachImage/types.ts +25 -18
  101. package/src/components/Avatar/Avatar.scss +4 -0
  102. package/src/components/Avatar/Avatar.stories.tsx +38 -18
  103. package/src/components/Avatar/Avatar.tsx +19 -3
  104. package/src/components/Avatar/types.ts +9 -1
  105. package/src/components/Charts/DonutChart/DonutChart.tsx +8 -3
  106. package/src/components/Charts/RadialChart/RadialChart.scss +4 -0
  107. package/src/components/Charts/RadialChart/RadialChart.tsx +51 -45
  108. package/src/components/Checkbox/Checkbox.scss +57 -0
  109. package/src/components/Checkbox/Checkbox.stories.tsx +91 -15
  110. package/src/components/Checkbox/Checkbox.tsx +4 -1
  111. package/src/components/Checkbox/types.ts +4 -0
  112. package/src/components/Comment/Comments.scss +166 -0
  113. package/src/components/Comment/Comments.stories.tsx +212 -0
  114. package/src/components/Comment/Comments.tsx +51 -0
  115. package/src/components/Comment/comment/Comment.tsx +206 -0
  116. package/src/components/Comment/comment/useNode.ts +51 -0
  117. package/src/components/Comment/index.ts +1 -0
  118. package/src/components/Comment/type.ts +36 -0
  119. package/src/components/CreateVariable/CreateVariableSlider.scss +18 -0
  120. package/src/components/CreateVariable/CreateVariableSlider.stories.tsx +66 -0
  121. package/src/components/CreateVariable/CreateVariableSlider.tsx +95 -0
  122. package/src/components/CreateVariable/index.ts +1 -0
  123. package/src/components/CreateVariable/types.ts +58 -0
  124. package/src/components/Drawer/Drawer.scss +3 -2
  125. package/src/components/Drawer/Drawer.stories.tsx +0 -1
  126. package/src/components/Drawer/Drawer.tsx +4 -1
  127. package/src/components/Drawer/Types.ts +13 -0
  128. package/src/components/Editor/Editor.stories.tsx +2 -2
  129. package/src/components/Editor/Editor.tsx +4 -2
  130. package/src/components/Editor/VariableDropdown.scss +8 -2
  131. package/src/components/Editor/VariableDropdown.tsx +15 -7
  132. package/src/components/Editor/constants.ts +1 -1
  133. package/src/components/Editor/types.ts +12 -2
  134. package/src/components/Excel/ExcelFile/ExcelFile.scss +3 -1
  135. package/src/components/Excel/ExcelFile/ExcelFile.tsx +37 -21
  136. package/src/components/Excel/ExcelFile/ExcelFileComponents/ActiveCell.tsx +12 -0
  137. package/src/components/Excel/ExcelFile/ExcelFileComponents/Cell.tsx +2 -34
  138. package/src/components/Excel/ExcelFile/ExcelFileComponents/FloatingRect.tsx +26 -1
  139. package/src/components/Excel/ExcelFile/ExcelFileComponents/RowIndicator.tsx +1 -1
  140. package/src/components/Excel/ExcelFile/ExcelFileComponents/Spreadsheet.scss +25 -21
  141. package/src/components/Excel/ExcelFile/ExcelFileComponents/Spreadsheet.tsx +1 -3
  142. package/src/components/Excel/ExcelFile/ExcelFileComponents/actions.ts +13 -0
  143. package/src/components/Excel/ExcelFile/ExcelFileComponents/reducer.ts +53 -26
  144. package/src/components/Excel/ExcelFile/ExcelFileComponents/reducerFunctions.ts +81 -14
  145. package/src/components/Excel/ExcelFile/ExcelFileComponents/types.ts +17 -6
  146. package/src/components/Excel/ExcelFile.stories.tsx +4 -4
  147. package/src/components/Excel/ExcelToolBar/ExcelToolBar.tsx +36 -19
  148. package/src/components/Excel/dataConversion.ts +43 -20
  149. package/src/components/FieldSet/FieldSet.scss +2 -1
  150. package/src/components/FieldSet/FieldSet.stories.tsx +2 -1
  151. package/src/components/FileDropzone/FileDropzone.scss +0 -1
  152. package/src/components/Icon/iconList.ts +45 -2
  153. package/src/components/IconButton/IconButton.scss +11 -11
  154. package/src/components/IconButton/IconButton.stories.tsx +1 -0
  155. package/src/components/IconButton/IconButton.tsx +6 -8
  156. package/src/components/IconButton/types.ts +2 -1
  157. package/src/components/IconRadioGroup/IconRadioGroup.scss +2 -1
  158. package/src/components/Input/Input.tsx +99 -88
  159. package/src/components/LabelEditTextField/LabelEditTextField.tsx +1 -1
  160. package/src/components/MiniModal/MiniModal.scss +0 -4
  161. package/src/components/MiniModal/MiniModal.stories.tsx +3 -2
  162. package/src/components/MiniModal/MiniModal.tsx +28 -10
  163. package/src/components/MiniModal/types.ts +7 -0
  164. package/src/components/Modal/Modal.stories.tsx +2 -1
  165. package/src/components/MultiSelect/MultiSelect.scss +29 -0
  166. package/src/components/MultiSelect/MultiSelect.stories.tsx +19 -5
  167. package/src/components/MultiSelect/MultiSelect.tsx +29 -19
  168. package/src/components/PhoneInput/PhoneInput.d.ts +3 -0
  169. package/src/components/PhoneInput/PhoneInput.stories.tsx +95 -0
  170. package/src/components/PhoneInput/PhoneInput.tsx +90 -0
  171. package/src/components/PhoneInput/index.ts +1 -0
  172. package/src/components/PhoneInput/phoneInput.scss +3 -0
  173. package/src/components/PhoneInput/types.ts +10 -0
  174. package/src/components/PopUpModal/PopUpModal.stories.tsx +14 -13
  175. package/src/components/PopUpModal/PopUpModal.tsx +2 -1
  176. package/src/components/PopUpModal/types.ts +14 -13
  177. package/src/components/Select/Select.scss +20 -0
  178. package/src/components/Select/Select.stories.tsx +50 -1
  179. package/src/components/Select/Select.tsx +34 -7
  180. package/src/components/Select/components/Dropdown.scss +9 -0
  181. package/src/components/Select/components/Dropdown.tsx +20 -6
  182. package/src/components/Select/components/types.ts +1 -0
  183. package/src/components/Select/types.ts +12 -2
  184. package/src/components/TableTree/Components/TableBody.tsx +35 -0
  185. package/src/components/TableTree/Components/TableCell.tsx +59 -0
  186. package/src/components/TableTree/Components/TableHead.tsx +39 -0
  187. package/src/components/TableTree/Components/TableRow.tsx +37 -0
  188. package/src/components/TableTree/TableTree.scss +8 -5
  189. package/src/components/TableTree/TableTree.tsx +16 -46
  190. package/src/components/TableTree/Utils/getAllChildIds.ts +12 -0
  191. package/src/components/TableTree/Utils/renderSpaces.ts +0 -0
  192. package/src/components/TableTree/types.ts +43 -5
  193. package/src/components/TableWithAccordion/TableWithAccordion.scss +54 -0
  194. package/src/components/TableWithAccordion/TableWithAccordion.stories.tsx +94 -0
  195. package/src/components/TableWithAccordion/TableWithAccordion.tsx +174 -0
  196. package/src/components/TableWithAccordion/data.ts +37 -0
  197. package/src/components/TableWithAccordion/index.ts +1 -0
  198. package/src/components/TableWithAccordion/types.ts +70 -0
  199. package/src/components/Tabs/Tabs.scss +0 -1
  200. package/src/index.ts +14 -1
  201. package/src/utils/checkDuplicates/CheckDuplicates.stories.tsx +40 -0
  202. package/src/utils/checkDuplicates/checkDuplicates.ts +13 -0
@@ -30,11 +30,16 @@ const Select: FC<SelectProps> = ({
30
30
  width = '100%',
31
31
  onBlur = () => {},
32
32
  disableInput = false,
33
+ showIcon = false,
33
34
  }) => {
34
35
  const selectWidth = typeof width === 'number' ? `${width}px` : width;
35
36
 
36
37
  const [showDropdownOptions, setShowDropdownOptions] = useState(false);
37
- const [searchedOption, setSearchedOption] = useState<any>('');
38
+ const [searchedOption, setSearchedOption] = useState<any>({
39
+ searchedText: '',
40
+ searchedIcon: '',
41
+ });
42
+ const { searchedText, searchedIcon } = searchedOption;
38
43
  const [selectOptionList, setSelectOptionList] = useState<Option[] | []>([]);
39
44
  const [dropdownPosition, setDropdownPosition] = useState<DrowdownPosition>({
40
45
  positionX: 0,
@@ -52,7 +57,10 @@ const Select: FC<SelectProps> = ({
52
57
 
53
58
  const handleIconClick = () => {
54
59
  setShowDropdownOptions(!showDropdownOptions);
55
- setSearchedOption(getValue(selectedOption, valueAccessor));
60
+ setSearchedOption({
61
+ ...searchedOption,
62
+ searchedText: getValue(selectedOption, valueAccessor),
63
+ });
56
64
  setSelectOptionList(optionsList);
57
65
  if (!showDropdownOptions && inputRef.current) {
58
66
  inputRef.current.focus();
@@ -71,7 +79,10 @@ const Select: FC<SelectProps> = ({
71
79
  });
72
80
 
73
81
  setSelectOptionList(filteredOptions);
74
- setSearchedOption(value);
82
+ setSearchedOption({
83
+ ...searchedOption,
84
+ searchedText: value,
85
+ });
75
86
  };
76
87
 
77
88
  const onSelectUpdatePosition = () => {
@@ -105,7 +116,10 @@ const Select: FC<SelectProps> = ({
105
116
  fromBottom: 0,
106
117
  width: 0,
107
118
  });
108
- setSearchedOption(getValue(selectedOption, valueAccessor));
119
+ setSearchedOption({
120
+ searchedText: getValue(selectedOption, valueAccessor),
121
+ searchedIcon: selectedOption.iconName,
122
+ });
109
123
  setSelectOptionList(optionsList);
110
124
  onBlur();
111
125
  };
@@ -113,7 +127,10 @@ const Select: FC<SelectProps> = ({
113
127
  const onSelectOptionSelector = (option: Option): void => {
114
128
  if (disabled) return;
115
129
  onSelectBlur();
116
- setSearchedOption(getValue(option, valueAccessor));
130
+ setSearchedOption({
131
+ searchedText: getValue(selectedOption, valueAccessor),
132
+ searchedIcon: selectedOption.iconName,
133
+ });
117
134
  if (onChange) {
118
135
  onChange(option);
119
136
  }
@@ -142,7 +159,10 @@ const Select: FC<SelectProps> = ({
142
159
  }, [showDropdownOptions]);
143
160
 
144
161
  useEffect(() => {
145
- setSearchedOption(getValue(selectedOption, valueAccessor));
162
+ setSearchedOption({
163
+ searchedText: getValue(selectedOption, valueAccessor),
164
+ searchedIcon: selectedOption.iconName,
165
+ });
146
166
  }, [selectedOption]);
147
167
 
148
168
  useEffect(() => {
@@ -165,15 +185,20 @@ const Select: FC<SelectProps> = ({
165
185
  'ff-select__no_border': !showBorder,
166
186
  })}
167
187
  >
188
+ {showIcon && (
189
+ <Icon name={searchedIcon} className="ff-select-input-icon" />
190
+ )}
168
191
  <input
169
192
  type="text"
170
193
  ref={inputRef}
171
194
  id="select-input-element"
172
195
  className={classNames('ff-select-inputField', {
173
196
  'ff-select-inputField__disabled': disabled,
197
+ 'ff-select-inputField__readonly': disableInput,
198
+ 'ff-select-inputField__icon': showIcon,
174
199
  })}
175
200
  onFocus={handleFocus}
176
- value={searchedOption}
201
+ value={searchedText}
177
202
  autoCorrect="off"
178
203
  autoComplete="off"
179
204
  spellCheck="false"
@@ -202,6 +227,7 @@ const Select: FC<SelectProps> = ({
202
227
  <Typography
203
228
  as="span"
204
229
  className={classNames('ff-select-labels', {
230
+ 'ff-select-labels__icon': showIcon,
205
231
  'ff-select-labels__active': searchedOption,
206
232
  })}
207
233
  fontSize={searchedOption || showDropdownOptions ? 8 : 12}
@@ -239,6 +265,7 @@ const Select: FC<SelectProps> = ({
239
265
  onSelectOptionSelector={onSelectOptionSelector}
240
266
  heightFromTop={height}
241
267
  selectedOption={searchedOption}
268
+ showIcon={showIcon}
242
269
  />,
243
270
  document.body
244
271
  )}
@@ -35,6 +35,15 @@
35
35
  text-overflow: ellipsis;
36
36
  overflow: hidden;
37
37
 
38
+ .ff-select-dropdown-icon-container {
39
+ display: flex;
40
+ align-items: center;
41
+
42
+ &__icon {
43
+ margin-right: 4px;
44
+ }
45
+ }
46
+
38
47
  &__selected,
39
48
  &:hover {
40
49
  background-color: var(--ff-select-option-hover-color);
@@ -11,6 +11,7 @@ import {
11
11
  getValue,
12
12
  } from '../../../utils/getSelectOptionValue/getSelectOptionValue';
13
13
  import useClickOutside from '../../../hooks/useClickOutside';
14
+ import Icon from '../../Icon';
14
15
 
15
16
  const Dropdown: FC<DropdownProps> = ({
16
17
  options = [],
@@ -24,6 +25,7 @@ const Dropdown: FC<DropdownProps> = ({
24
25
  heightFromTop,
25
26
  selectedOption,
26
27
  valueAccessor,
28
+ showIcon = false,
27
29
  }) => {
28
30
  const themeContext = useContext(ThemeContext);
29
31
  const currentTheme = themeContext?.currentTheme;
@@ -51,21 +53,21 @@ const Dropdown: FC<DropdownProps> = ({
51
53
  return {
52
54
  left: positionX,
53
55
  top: positionY + heightFromTop,
54
- width: width + 30,
56
+ width: showIcon ? width + 56 : width + 30,
55
57
  zIndex: optionZIndex,
56
- marginLeft: '-2px',
58
+ marginLeft: showIcon ? '-29px' : '-2px',
57
59
  };
58
60
  }
59
61
  return {
60
62
  zIndex: optionZIndex,
61
63
  left: positionX,
62
- width: width + 30,
64
+ width: showIcon ? width + 56 : width + 30,
63
65
  top: positionY - selectInputHeight - dropdownContainerHeight + 4 * margin,
64
- marginLeft: '-2px',
66
+ marginLeft: showIcon ? '-29px' : '-2px',
65
67
  };
66
68
  };
67
69
 
68
- const getOptionLabel = (label: any) => {
70
+ const getOptionLabel = (label: any, icon: string) => {
69
71
  if (React.isValidElement(label)) {
70
72
  return label;
71
73
  }
@@ -74,7 +76,16 @@ const Dropdown: FC<DropdownProps> = ({
74
76
  as="div"
75
77
  lineHeight="30px"
76
78
  color="var(--ff-select-text-color)"
79
+ className={classNames({
80
+ 'ff-select-dropdown-icon-container': showIcon,
81
+ })}
77
82
  >
83
+ {showIcon && (
84
+ <Icon
85
+ name={icon}
86
+ className="ff-select-dropdown-icon-container__icon"
87
+ />
88
+ )}
78
89
  {label}
79
90
  </Typography>
80
91
  );
@@ -104,7 +115,10 @@ const Dropdown: FC<DropdownProps> = ({
104
115
  onSelectOptionSelector(option);
105
116
  }}
106
117
  >
107
- {getOptionLabel(getLabel(option, labelAccessor))}
118
+ {getOptionLabel(
119
+ getLabel(option, labelAccessor),
120
+ 'iconName' in option && option['iconName']
121
+ )}
108
122
  </div>
109
123
  ))
110
124
  ) : (
@@ -13,6 +13,7 @@ export interface DropdownProps {
13
13
  selectArrowRef?: RefObject<HTMLDivElement>;
14
14
  heightFromTop: number;
15
15
  selectedOption?: Option;
16
+ showIcon?: boolean;
16
17
  }
17
18
 
18
19
  export const dropdownDefaultCSSData = {
@@ -95,9 +95,19 @@ export interface SelectProps {
95
95
  onBlur?: () => void;
96
96
 
97
97
  /*
98
- * Disable the select component input
99
- */
98
+ * Disable the select component input
99
+ */
100
100
  disableInput?: boolean;
101
+
102
+ /*
103
+ * Provide the icon for the select
104
+ */
105
+ showIcon?: boolean;
106
+
107
+ /*
108
+ * Provide the icon name for the select
109
+ */
110
+ iconName?: string;
101
111
  }
102
112
 
103
113
  export interface DrowdownPosition {
@@ -0,0 +1,35 @@
1
+ import React from 'react';
2
+ import { TableBodyProps } from '../types';
3
+ import TableRow from './TableRow';
4
+
5
+ const TableBody = React.memo(
6
+ ({
7
+ flattenedTreeData,
8
+ columnsData,
9
+ selected,
10
+ select,
11
+ onRowClick,
12
+ onToggleExpand,
13
+ onCheckBoxChange,
14
+ }: TableBodyProps) => (
15
+ <tbody>
16
+ {flattenedTreeData.map(({ node, level }) => {
17
+ return (
18
+ <TableRow
19
+ key={node.id}
20
+ node={node}
21
+ level={level}
22
+ columnsData={columnsData}
23
+ selected={selected}
24
+ select={select}
25
+ onRowClick={onRowClick}
26
+ onToggleExpand={onToggleExpand}
27
+ onCheckBoxChange={onCheckBoxChange}
28
+ />
29
+ );
30
+ })}
31
+ </tbody>
32
+ )
33
+ );
34
+
35
+ export default TableBody;
@@ -0,0 +1,59 @@
1
+ import { prepareData } from '../../../utils/TableCell/TableCell';
2
+ import Checkbox from '../../Checkbox';
3
+ import RadioButton from '../../RadioButton';
4
+ import { TableCellProps } from '../types';
5
+ import Arrow from '../../../assets/icons/arrows_down_icon.svg?react';
6
+ import React from 'react';
7
+
8
+ const renderSpaces = (level: number) =>
9
+ Array.from({ length: level }).map((_, i) => (
10
+ <span key={i} className="tree-table-space-block" />
11
+ ));
12
+
13
+ const TableCell = React.memo(
14
+ ({
15
+ col,
16
+ node,
17
+ level,
18
+ selected,
19
+ select,
20
+ onCheckBoxChange,
21
+ onToggleExpand,
22
+ }: TableCellProps) => (
23
+ <td>
24
+ {col.isTree && renderSpaces(level + 1)}
25
+ {col.isTree && (
26
+ <span
27
+ className={`tree-table-space-block last-block ${
28
+ node.isExpanded ? 'tree-row-expanded' : 'tree-row-collapsed'
29
+ } ${node.folder ? '' : 'no-folder'}`}
30
+ onClick={() => onToggleExpand(node)}
31
+ >
32
+ {node.folder && <Arrow />}
33
+ </span>
34
+ )}
35
+ <span className="tree-table-td-content">
36
+ {col.isTree && select === 'checkbox' && (
37
+ <Checkbox
38
+ checked={selected.includes(node.id)}
39
+ onChange={() => onCheckBoxChange('checkbox', node)}
40
+ />
41
+ )}
42
+ {col.isTree && select === 'radio' && (
43
+ <RadioButton
44
+ name={node.title}
45
+ checked={selected.includes(node.id)}
46
+ value={node.id}
47
+ onChange={() => onCheckBoxChange('radio', node)}
48
+ />
49
+ )}
50
+ {prepareData(node, col)}
51
+ </span>
52
+ {col.actions && (
53
+ <div className="table-tree-row-action">{col.actions(node)}</div>
54
+ )}
55
+ </td>
56
+ )
57
+ );
58
+
59
+ export default TableCell;
@@ -0,0 +1,39 @@
1
+ import React, { useMemo } from 'react';
2
+ import { TableHeadProps } from '../types';
3
+
4
+ const TableHead = React.memo(({ columnsData }: TableHeadProps) => {
5
+ const hasDefaultValues = useMemo(
6
+ () => columnsData.some(({ defaultValue }) => !!defaultValue),
7
+ [columnsData]
8
+ );
9
+
10
+ return (
11
+ <thead>
12
+ <tr>
13
+ {columnsData.map(({ name }) => (
14
+ <th key={name}>{name}</th>
15
+ ))}
16
+ </tr>
17
+ {hasDefaultValues && (
18
+ <tr>
19
+ {columnsData.map(({ defaultValue, defaultActions }, index) => (
20
+ <td key={index}>
21
+ {defaultValue && (
22
+ <span className="">
23
+ {defaultValue}
24
+ {defaultActions && (
25
+ <div className="table-tree-row-action">
26
+ {defaultActions()}
27
+ </div>
28
+ )}
29
+ </span>
30
+ )}
31
+ </td>
32
+ ))}
33
+ </tr>
34
+ )}
35
+ </thead>
36
+ );
37
+ });
38
+
39
+ export default TableHead;
@@ -0,0 +1,37 @@
1
+ import React from 'react';
2
+ import { TableRowProps } from '../types';
3
+ import TableCell from './TableCell';
4
+
5
+ const TableRow = React.memo(
6
+ ({
7
+ node,
8
+ level,
9
+ columnsData,
10
+ selected,
11
+ select,
12
+ onRowClick,
13
+ onToggleExpand,
14
+ onCheckBoxChange,
15
+ }: TableRowProps) => (
16
+ <tr
17
+ data-level={level}
18
+ className="show"
19
+ onClick={(e) => onRowClick(e, node)}
20
+ >
21
+ {columnsData.map((col) => (
22
+ <TableCell
23
+ key={col.name}
24
+ col={col}
25
+ node={node}
26
+ level={level}
27
+ selected={selected}
28
+ select={select}
29
+ onCheckBoxChange={onCheckBoxChange}
30
+ onToggleExpand={onToggleExpand}
31
+ />
32
+ ))}
33
+ </tr>
34
+ )
35
+ );
36
+
37
+ export default TableRow;
@@ -1,8 +1,3 @@
1
- html,
2
- * {
3
- font-family: 'Open Sans';
4
- }
5
-
6
1
  .tree-table-space-block {
7
2
  display: inline-block;
8
3
  width: 20px;
@@ -39,6 +34,14 @@ html,
39
34
  .tree-table-wrap {
40
35
  width: 100%;
41
36
  }
37
+ thead{
38
+ position: sticky;
39
+ top: 12px;
40
+ }
41
+
42
+ tbody{
43
+ overflow: scroll;
44
+ }
42
45
 
43
46
  .tree-table {
44
47
  border: 1px solid #f1f1f1;
@@ -4,7 +4,13 @@ import { prepareData } from '../../utils/TableCell/TableCell';
4
4
  import Arrow from '../../assets/icons/arrows_down_icon.svg?react';
5
5
  import Checkbox from '../Checkbox';
6
6
  import RadioButton from '../RadioButton';
7
- import { TreeTableProps } from './types';
7
+ import {
8
+ TableBodyProps,
9
+ TableCellProps,
10
+ TableHeadProps,
11
+ TableRowProps,
12
+ TreeTableProps,
13
+ } from './types';
8
14
 
9
15
  // Helper to render spaces for levels
10
16
  const renderSpaces = (level: number) =>
@@ -32,27 +38,17 @@ const TableCell = React.memo(
32
38
  col,
33
39
  node,
34
40
  level,
35
- isExpanded,
36
41
  selected,
37
42
  select,
38
43
  onCheckBoxChange,
39
44
  onToggleExpand,
40
- }: {
41
- col: any;
42
- node: any;
43
- level: number;
44
- isExpanded: boolean;
45
- selected: string[];
46
- select: string | null;
47
- onCheckBoxChange: (type: string, node: any) => void;
48
- onToggleExpand: (node: any) => void;
49
- }) => (
45
+ }: TableCellProps) => (
50
46
  <td>
51
47
  {col.isTree && renderSpaces(level + 1)}
52
48
  {col.isTree && (
53
49
  <span
54
50
  className={`tree-table-space-block last-block ${
55
- isExpanded ? 'tree-row-expanded' : 'tree-row-collapsed'
51
+ node.isExpanded ? 'tree-row-expanded' : 'tree-row-collapsed'
56
52
  } ${node.folder ? '' : 'no-folder'}`}
57
53
  onClick={() => onToggleExpand(node)}
58
54
  >
@@ -89,23 +85,12 @@ const TableRow = React.memo(
89
85
  node,
90
86
  level,
91
87
  columnsData,
92
- isExpanded,
93
88
  selected,
94
89
  select,
95
90
  onRowClick,
96
91
  onToggleExpand,
97
92
  onCheckBoxChange,
98
- }: {
99
- node: any;
100
- level: number;
101
- columnsData: any[];
102
- isExpanded: boolean;
103
- selected: string[];
104
- select: string | null;
105
- onRowClick: (e: any, node: any) => void;
106
- onToggleExpand: (node: any) => void;
107
- onCheckBoxChange: (type: string, node: any) => void;
108
- }) => (
93
+ }: TableRowProps) => (
109
94
  <tr
110
95
  data-level={level}
111
96
  className="show"
@@ -117,7 +102,6 @@ const TableRow = React.memo(
117
102
  col={col}
118
103
  node={node}
119
104
  level={level}
120
- isExpanded={isExpanded}
121
105
  selected={selected}
122
106
  select={select}
123
107
  onCheckBoxChange={onCheckBoxChange}
@@ -129,7 +113,7 @@ const TableRow = React.memo(
129
113
  );
130
114
 
131
115
  // Component: TableHead
132
- const TableHead = React.memo(({ columnsData }: { columnsData: any[] }) => {
116
+ const TableHead = React.memo(({ columnsData }: TableHeadProps) => {
133
117
  const hasDefaultValues = useMemo(
134
118
  () => columnsData.some(({ defaultValue }) => !!defaultValue),
135
119
  [columnsData]
@@ -169,32 +153,20 @@ const TableBody = React.memo(
169
153
  ({
170
154
  flattenedTreeData,
171
155
  columnsData,
172
- expandedNodes,
173
156
  selected,
174
157
  select,
175
158
  onRowClick,
176
159
  onToggleExpand,
177
160
  onCheckBoxChange,
178
- }: {
179
- flattenedTreeData: any[];
180
- columnsData: any[];
181
- expandedNodes: string[];
182
- selected: string[];
183
- select: string | null;
184
- onRowClick: (e: any, node: any) => void;
185
- onToggleExpand: (node: any) => void;
186
- onCheckBoxChange: (type: string, node: any) => void;
187
- }) => (
161
+ }: TableBodyProps) => (
188
162
  <tbody>
189
163
  {flattenedTreeData.map(({ node, level }) => {
190
- const isExpanded = expandedNodes.includes(node?.id);
191
164
  return (
192
165
  <TableRow
193
166
  key={node.id}
194
167
  node={node}
195
168
  level={level}
196
169
  columnsData={columnsData}
197
- isExpanded={isExpanded}
198
170
  selected={selected}
199
171
  select={select}
200
172
  onRowClick={onRowClick}
@@ -215,12 +187,11 @@ const TreeTable: React.FC<TreeTableProps> = ({
215
187
  select = null,
216
188
  onChange,
217
189
  onClick,
218
- expandedNodes = [],
219
190
  onExpand,
220
191
  }) => {
221
192
  const handleToggleExpand = useCallback(
222
- (node: any) => onExpand?.(!expandedNodes.includes(node?.id), node?.id),
223
- [expandedNodes, onExpand]
193
+ (node: any) => onExpand?.(true, node?.id),
194
+ [onExpand]
224
195
  );
225
196
 
226
197
  const handleCheckBoxChange = useCallback(
@@ -228,7 +199,7 @@ const TreeTable: React.FC<TreeTableProps> = ({
228
199
  const nodeId = node.id;
229
200
 
230
201
  if (type === 'radio') {
231
- onChange?.([nodeId]);
202
+ onChange?.('true', [nodeId]);
232
203
  } else {
233
204
  let updatedSelected = [...selected];
234
205
 
@@ -242,7 +213,7 @@ const TreeTable: React.FC<TreeTableProps> = ({
242
213
  );
243
214
  }
244
215
 
245
- onChange?.(updatedSelected);
216
+ onChange?.('true', updatedSelected);
246
217
  }
247
218
  },
248
219
  [selected, treeData, onChange]
@@ -260,7 +231,6 @@ const TreeTable: React.FC<TreeTableProps> = ({
260
231
  <TableBody
261
232
  flattenedTreeData={treeData}
262
233
  columnsData={columnsData}
263
- expandedNodes={expandedNodes}
264
234
  selected={selected}
265
235
  select={select}
266
236
  onRowClick={handleRowClick}
@@ -0,0 +1,12 @@
1
+ const getAllChildIds = (nodeId: string, data: any[]): string[] => {
2
+ let result = [nodeId];
3
+
4
+ // Traverse the tree and find children based on parentId
5
+ data.forEach(({ node }) => {
6
+ if (node.parentId === nodeId) {
7
+ result = result.concat(getAllChildIds(node.id, data)); // Add children recursively
8
+ }
9
+ });
10
+
11
+ return result;
12
+ };
File without changes
@@ -1,3 +1,5 @@
1
+ import { ReactNode } from 'react';
2
+
1
3
  export interface TreeNode {
2
4
  key: string;
3
5
  [key: string]: any;
@@ -5,16 +7,53 @@ export interface TreeNode {
5
7
  expanded?: boolean;
6
8
  }
7
9
 
10
+ declare type JSX = ReactNode | JSX.Element[] | string | null;
11
+
12
+ export interface TableCellProps {
13
+ col: any;
14
+ node: any;
15
+ level: number;
16
+ selected: string[];
17
+ select: string | null;
18
+ onCheckBoxChange: (type: string, node: any) => void;
19
+ onToggleExpand: (node: any) => void;
20
+ }
21
+
22
+ export interface TableHeadProps {
23
+ columnsData: any[];
24
+ }
25
+
26
+ export interface TableBodyProps {
27
+ flattenedTreeData: any[];
28
+ columnsData: any[];
29
+ selected: string[];
30
+ select: string | null;
31
+ onRowClick: (e: any, node: any) => void;
32
+ onToggleExpand: (node: any) => void;
33
+ onCheckBoxChange: (type: string, node: any) => void;
34
+ }
35
+
36
+ export interface TableRowProps {
37
+ node: any;
38
+ level: number;
39
+ columnsData: any[];
40
+ selected: string[];
41
+ select: string | null;
42
+ onRowClick: (e: any, node: any) => void;
43
+ onToggleExpand: (node: any) => void;
44
+ onCheckBoxChange: (type: string, node: any) => void;
45
+ }
46
+
8
47
  export interface Column {
9
48
  name: string;
10
49
  accessor: string;
11
50
  width: string;
12
51
  isClickable?: boolean;
13
- cell?: (row: any) => JSX.Element | string | null;
14
- actions?: (row: any) => JSX.Element[];
52
+ cell?: (row: any) => JSX
53
+ actions?: (row: any) => JSX
15
54
  isTree?: boolean;
16
55
  defaultValue?: string;
17
- defaultActions?: () => JSX.Element[];
56
+ defaultActions?: () => JSX
18
57
  }
19
58
 
20
59
  export interface TreeTableProps {
@@ -22,9 +61,8 @@ export interface TreeTableProps {
22
61
  columnsData: Column[];
23
62
  selected?: string[];
24
63
  select?: 'radio' | 'checkbox' | 'none';
25
- onChange?: (nodes: string[]) => void;
64
+ onChange?: (e: any, node: string[]) => void;
26
65
  onClick?: (e: React.MouseEvent<HTMLDivElement>, row: TreeNode) => void;
27
- expandedNodes: string[];
28
66
  onExpand?: (_isExpanded: boolean, node: string) => void;
29
67
  onPagination?: (_direction: string) => void;
30
68
  }