@true-engineering/true-react-common-ui-kit 2.5.0 → 2.7.0

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 (233) hide show
  1. package/README.md +26 -0
  2. package/dist/components/Icon/icons-list.d.ts +1 -1
  3. package/dist/components/Input/Input.d.ts +2 -2
  4. package/dist/components/List/List.d.ts +1 -1
  5. package/dist/components/List/List.styles.d.ts +0 -28
  6. package/dist/components/List/index.d.ts +0 -1
  7. package/dist/components/ListItem/ListItem.d.ts +6 -0
  8. package/dist/components/ListItem/ListItem.styles.d.ts +35 -0
  9. package/dist/components/ListItem/constants.d.ts +1 -0
  10. package/dist/components/ListItem/index.d.ts +3 -0
  11. package/dist/components/{List → ListItem}/types.d.ts +5 -0
  12. package/dist/components/MoreMenu/MoreMenu.d.ts +2 -2
  13. package/dist/components/index.d.ts +1 -0
  14. package/dist/helpers/index.d.ts +1 -0
  15. package/dist/true-react-common-ui-kit.js +175 -75
  16. package/dist/true-react-common-ui-kit.js.map +1 -1
  17. package/dist/true-react-common-ui-kit.umd.cjs +176 -76
  18. package/dist/true-react-common-ui-kit.umd.cjs.map +1 -1
  19. package/dist/types.d.ts +1 -1
  20. package/package.json +93 -93
  21. package/src/components/AccountInfo/AccountInfo.stories.tsx +32 -32
  22. package/src/components/AccountInfo/AccountInfo.tsx +76 -76
  23. package/src/components/AccountInfo/constants.ts +1 -1
  24. package/src/components/AddButton/AddButton.tsx +48 -48
  25. package/src/components/Button/Button.stories.tsx +56 -56
  26. package/src/components/Button/Button.tsx +153 -154
  27. package/src/components/Button/constants.ts +9 -9
  28. package/src/components/Button/index.ts +3 -3
  29. package/src/components/Button/types.ts +5 -5
  30. package/src/components/Checkbox/Checkbox.stories.tsx +32 -32
  31. package/src/components/Checkbox/Checkbox.tsx +105 -105
  32. package/src/components/CloseButton/CloseButton.styles.ts +34 -34
  33. package/src/components/CloseButton/CloseButton.tsx +35 -35
  34. package/src/components/Colors/Colors.tsx +26 -26
  35. package/src/components/CssBaseline/CssBaseline.tsx +15 -15
  36. package/src/components/DateInput/DateInput.stories.tsx +61 -61
  37. package/src/components/DateInput/DateInput.tsx +82 -82
  38. package/src/components/DatePicker/DatePicker.stories.tsx +87 -87
  39. package/src/components/DatePicker/DatePicker.styles.ts +44 -44
  40. package/src/components/DatePicker/DatePicker.tsx +309 -309
  41. package/src/components/DatePicker/components/DatePickerHeader/DatePickerHeader.styles.ts +84 -84
  42. package/src/components/DatePicker/components/DatePickerHeader/DatePickerHeader.tsx +79 -79
  43. package/src/components/DatePicker/components/DatePickerHeader/index.ts +2 -2
  44. package/src/components/DatePicker/components/PopperContainer/PopperContainer.tsx +6 -6
  45. package/src/components/DatePicker/components/PopperContainer/index.ts +1 -1
  46. package/src/components/DatePicker/components/index.ts +2 -2
  47. package/src/components/DatePicker/constants.ts +6 -6
  48. package/src/components/DatePicker/helpers.ts +23 -23
  49. package/src/components/DatePicker/index.ts +4 -4
  50. package/src/components/DatePicker/types.ts +45 -45
  51. package/src/components/Description/Description.stories.tsx +27 -27
  52. package/src/components/Description/Description.tsx +59 -59
  53. package/src/components/Description/constants.ts +1 -1
  54. package/src/components/FiltersPane/FiltersPane.stories.tsx +295 -295
  55. package/src/components/FiltersPane/FiltersPane.tsx +150 -150
  56. package/src/components/FiltersPane/components/Filter/Filter.tsx +203 -203
  57. package/src/components/FiltersPane/components/Filter/index.ts +1 -1
  58. package/src/components/FiltersPane/components/FilterInterval/FilterInterval.styles.ts +64 -64
  59. package/src/components/FiltersPane/components/FilterInterval/FilterInterval.tsx +141 -141
  60. package/src/components/FiltersPane/components/FilterInterval/index.ts +2 -2
  61. package/src/components/FiltersPane/components/FilterMultiSelect/FilterMultiSelect.tsx +10 -10
  62. package/src/components/FiltersPane/components/FilterMultiSelect/index.ts +1 -1
  63. package/src/components/FiltersPane/components/FilterSelect/FilterSelect.styles.ts +143 -143
  64. package/src/components/FiltersPane/components/FilterSelect/FilterSelect.tsx +346 -346
  65. package/src/components/FiltersPane/components/FilterSelect/index.ts +2 -2
  66. package/src/components/FiltersPane/components/FilterValueView/FilterValueView.styles.tsx +15 -15
  67. package/src/components/FiltersPane/components/FilterValueView/FilterValueView.tsx +163 -163
  68. package/src/components/FiltersPane/components/FilterValueView/index.tsx +2 -2
  69. package/src/components/FiltersPane/components/FilterWithDates/FilterWithDates.styles.ts +60 -60
  70. package/src/components/FiltersPane/components/FilterWithDates/FilterWithDates.tsx +181 -181
  71. package/src/components/FiltersPane/components/FilterWithDates/index.ts +2 -2
  72. package/src/components/FiltersPane/components/FilterWithPeriod/FilterWithPeriod.styles.ts +17 -17
  73. package/src/components/FiltersPane/components/FilterWithPeriod/FilterWithPeriod.tsx +174 -174
  74. package/src/components/FiltersPane/components/FilterWithPeriod/index.ts +2 -2
  75. package/src/components/FiltersPane/components/FilterWrapper/FilterWrapper.styles.ts +110 -110
  76. package/src/components/FiltersPane/components/FilterWrapper/FilterWrapper.tsx +149 -149
  77. package/src/components/FiltersPane/components/FilterWrapper/index.ts +2 -2
  78. package/src/components/FiltersPane/components/FiltersPaneSearch/FiltersPaneSearch.styles.ts +109 -109
  79. package/src/components/FiltersPane/components/FiltersPaneSearch/FiltersPaneSearch.tsx +155 -155
  80. package/src/components/FiltersPane/components/FiltersPaneSearch/index.ts +2 -2
  81. package/src/components/FiltersPane/components/index.ts +9 -9
  82. package/src/components/FiltersPane/constants.ts +137 -137
  83. package/src/components/FiltersPane/helpers.ts +26 -26
  84. package/src/components/FiltersPane/index.ts +5 -5
  85. package/src/components/FiltersPane/types.ts +156 -156
  86. package/src/components/Flag/Flag.stories.tsx +29 -29
  87. package/src/components/Flag/Flag.tsx +27 -27
  88. package/src/components/FlexibleTable/FlexibleTable.stories.tsx +338 -338
  89. package/src/components/FlexibleTable/FlexibleTable.styles.ts +131 -131
  90. package/src/components/FlexibleTable/FlexibleTable.tsx +205 -205
  91. package/src/components/FlexibleTable/components/TableRow/TableRow.tsx +152 -152
  92. package/src/components/FlexibleTable/components/TableRow/index.ts +1 -1
  93. package/src/components/FlexibleTable/components/TableValue/TableValue.tsx +74 -74
  94. package/src/components/FlexibleTable/components/TableValue/index.ts +1 -1
  95. package/src/components/FlexibleTable/components/index.ts +2 -2
  96. package/src/components/FlexibleTable/constants.ts +1 -1
  97. package/src/components/FlexibleTable/types.ts +52 -52
  98. package/src/components/Icon/Icon.stories.tsx +86 -86
  99. package/src/components/Icon/Icon.tsx +27 -27
  100. package/src/components/Icon/complexIcons/icons.ts +5 -5
  101. package/src/components/Icon/components/ComplexIconBoilerplate/ComplexIconBoilerplate.tsx +16 -16
  102. package/src/components/Icon/components/ComplexIconBoilerplate/index.ts +1 -1
  103. package/src/components/Icon/components/IconBolerplate/IconBoilerplate.tsx +43 -43
  104. package/src/components/Icon/components/IconBolerplate/index.ts +1 -1
  105. package/src/components/Icon/components/index.ts +2 -2
  106. package/src/components/Icon/helpers.ts +9 -9
  107. package/src/components/Icon/icons-list.ts +856 -826
  108. package/src/components/Icon/index.ts +4 -4
  109. package/src/components/Icon/types.ts +16 -16
  110. package/src/components/IncrementInput/IncrementInput.stories.tsx +31 -31
  111. package/src/components/IncrementInput/IncrementInput.tsx +80 -80
  112. package/src/components/IncrementInput/components/ChangeButton/ChangeButton.tsx +33 -33
  113. package/src/components/IncrementInput/components/ChangeButton/index.ts +1 -1
  114. package/src/components/IncrementInput/components/index.ts +1 -1
  115. package/src/components/Input/Input.stories.tsx +86 -86
  116. package/src/components/Input/Input.tsx +308 -308
  117. package/src/components/Input/constants.ts +1 -1
  118. package/src/components/Input/index.ts +3 -3
  119. package/src/components/Input/types.ts +6 -6
  120. package/src/components/List/List.stories.tsx +63 -63
  121. package/src/components/List/List.styles.ts +0 -38
  122. package/src/components/List/List.tsx +36 -54
  123. package/src/components/List/index.ts +2 -3
  124. package/src/components/ListItem/ListItem.stories.tsx +67 -0
  125. package/src/components/ListItem/ListItem.styles.ts +48 -0
  126. package/src/components/ListItem/ListItem.tsx +44 -0
  127. package/src/components/ListItem/constants.ts +5 -0
  128. package/src/components/ListItem/index.ts +3 -0
  129. package/src/components/{List → ListItem}/types.ts +19 -13
  130. package/src/components/Modal/Modal.stories.tsx +105 -105
  131. package/src/components/Modal/Modal.styles.ts +305 -305
  132. package/src/components/Modal/Modal.tsx +184 -184
  133. package/src/components/Modal/index.ts +3 -3
  134. package/src/components/Modal/types.ts +17 -17
  135. package/src/components/MoreMenu/MoreMenu.styles.ts +70 -70
  136. package/src/components/MoreMenu/MoreMenu.tsx +90 -90
  137. package/src/components/MultiSelect/MultiSelect.stories.tsx +46 -46
  138. package/src/components/MultiSelect/MultiSelect.tsx +92 -92
  139. package/src/components/MultiSelect/components/MultiSelectInput/MultiSelectInput.styles.ts +73 -73
  140. package/src/components/MultiSelect/components/MultiSelectInput/MultiSelectInput.tsx +51 -51
  141. package/src/components/MultiSelect/components/MultiSelectInput/index.ts +2 -2
  142. package/src/components/MultiSelect/components/index.ts +1 -1
  143. package/src/components/MultiSelect/index.ts +4 -4
  144. package/src/components/MultiSelect/types.ts +1 -1
  145. package/src/components/MultiSelectList/MultiSelectList.styles.ts +124 -124
  146. package/src/components/MultiSelectList/MultiSelectList.tsx +441 -441
  147. package/src/components/MultiSelectList/constants.ts +21 -21
  148. package/src/components/MultiSelectList/helpers.ts +11 -11
  149. package/src/components/MultiSelectList/index.ts +3 -3
  150. package/src/components/MultiSelectList/types.ts +15 -15
  151. package/src/components/Notification/Notification.stories.tsx +46 -46
  152. package/src/components/Notification/Notification.styles.ts +50 -50
  153. package/src/components/Notification/Notification.tsx +78 -78
  154. package/src/components/Notification/index.ts +3 -3
  155. package/src/components/Notification/types.ts +1 -1
  156. package/src/components/NumberInput/NumberInput.stories.tsx +35 -35
  157. package/src/components/NumberInput/NumberInput.tsx +133 -133
  158. package/src/components/NumberInput/helpers.ts +86 -86
  159. package/src/components/PhoneInput/PhoneInput.stories.tsx +70 -70
  160. package/src/components/PhoneInput/PhoneInput.tsx +193 -193
  161. package/src/components/PhoneInput/components/PhoneInputCountryList/PhoneInputCountryList.stories.tsx +21 -21
  162. package/src/components/PhoneInput/components/PhoneInputCountryList/PhoneInputCountryList.styles.ts +100 -100
  163. package/src/components/PhoneInput/components/PhoneInputCountryList/PhoneInputCountryList.tsx +145 -145
  164. package/src/components/PhoneInput/components/PhoneInputCountryList/index.ts +2 -2
  165. package/src/components/PhoneInput/components/index.ts +1 -1
  166. package/src/components/PhoneInput/constants.ts +3 -3
  167. package/src/components/PhoneInput/index.ts +5 -5
  168. package/src/components/PhoneInput/phone-info.ts +2147 -2147
  169. package/src/components/RadioButton/RadioButton.stories.tsx +46 -46
  170. package/src/components/RadioButton/RadioButton.tsx +55 -55
  171. package/src/components/ScrollIntoViewIfNeeded/ScrollIntoViewIfNeeded.ts +54 -54
  172. package/src/components/ScrollIntoViewIfNeeded/constants.ts +12 -12
  173. package/src/components/SearchInput/SearchInput.stories.tsx +23 -23
  174. package/src/components/SearchInput/SearchInput.styles.ts +50 -50
  175. package/src/components/SearchInput/SearchInput.tsx +51 -51
  176. package/src/components/Select/MultiSelect.stories.tsx +240 -240
  177. package/src/components/Select/Select.stories.tsx +235 -235
  178. package/src/components/Select/Select.tsx +574 -575
  179. package/src/components/Select/components/SelectList/SelectList.styles.ts +72 -72
  180. package/src/components/Select/components/SelectList/SelectList.tsx +158 -158
  181. package/src/components/Select/components/SelectList/index.ts +2 -2
  182. package/src/components/Select/components/SelectListItem/SelectListItem.styles.ts +14 -14
  183. package/src/components/Select/components/SelectListItem/SelectListItem.tsx +68 -68
  184. package/src/components/Select/components/SelectListItem/index.ts +1 -1
  185. package/src/components/Select/components/index.ts +2 -2
  186. package/src/components/Select/helpers.ts +26 -26
  187. package/src/components/Select/index.ts +4 -4
  188. package/src/components/SmartInput/SmartInput.stories.tsx +51 -51
  189. package/src/components/SmartInput/SmartInput.tsx +124 -124
  190. package/src/components/SmartInput/constants.ts +84 -84
  191. package/src/components/SmartInput/helpers.ts +13 -13
  192. package/src/components/SmartInput/index.ts +2 -2
  193. package/src/components/SmartInput/types.ts +11 -11
  194. package/src/components/Switch/Switch.stories.tsx +40 -40
  195. package/src/components/Switch/Switch.tsx +79 -79
  196. package/src/components/Switch/index.ts +3 -3
  197. package/src/components/Switch/types.ts +4 -4
  198. package/src/components/TextArea/TextArea.stories.tsx +35 -35
  199. package/src/components/TextArea/TextArea.tsx +174 -174
  200. package/src/components/TextWithInfo/TextWithInfo.stories.tsx +53 -53
  201. package/src/components/TextWithInfo/TextWithInfo.tsx +60 -60
  202. package/src/components/TextWithTooltip/TextWithTooltip.tsx +143 -143
  203. package/src/components/ThemedPreloader/ThemedPreloader.stories.tsx +41 -41
  204. package/src/components/ThemedPreloader/ThemedPreloader.tsx +47 -47
  205. package/src/components/ThemedPreloader/components/DefaultPreloader/DefaultPreloader.tsx +29 -29
  206. package/src/components/ThemedPreloader/components/DotsPreloader/DotsPreloader.tsx +18 -18
  207. package/src/components/ThemedPreloader/components/SvgPreloader/SvgPreloader.tsx +25 -25
  208. package/src/components/ThemedPreloader/components/index.ts +3 -3
  209. package/src/components/ThemedPreloader/constants.ts +1 -1
  210. package/src/components/ThemedPreloader/index.ts +4 -4
  211. package/src/components/ThemedPreloader/types.ts +3 -3
  212. package/src/components/Toaster/Toaster.stories.tsx +30 -30
  213. package/src/components/Toaster/Toaster.tsx +108 -108
  214. package/src/components/Toaster/constants.ts +1 -1
  215. package/src/components/Toaster/index.ts +3 -3
  216. package/src/components/Toaster/types.ts +1 -1
  217. package/src/components/Tooltip/Tooltip.stories.tsx +19 -19
  218. package/src/components/Tooltip/Tooltip.styles.ts +45 -45
  219. package/src/components/Tooltip/Tooltip.tsx +35 -35
  220. package/src/components/Tooltip/index.ts +3 -3
  221. package/src/components/index.ts +1 -0
  222. package/src/helpers/deprecated.ts +23 -23
  223. package/src/helpers/index.ts +5 -4
  224. package/src/helpers/misc.ts +158 -158
  225. package/src/helpers/phone.ts +87 -87
  226. package/src/helpers/snippets.tsx +6 -6
  227. package/src/hooks/use-did-mount-effect.ts +18 -18
  228. package/src/hooks/use-dropdown.ts +82 -82
  229. package/src/hooks/use-on-click-outside.ts +77 -77
  230. package/src/hooks/use-theme.ts +32 -32
  231. package/src/hooks/use-tweak-styles.ts +13 -13
  232. package/src/theme.ts +149 -149
  233. package/src/types.ts +109 -108
@@ -1,152 +1,152 @@
1
- import { ReactNode, useState, memo } from 'react';
2
- import clsx from 'clsx';
3
- import { addDataAttributes } from '../../../../helpers';
4
- import { ICommonProps, IDataAttributes } from '../../../../types';
5
- import { FlexibleTableConfigType, INestedComponent } from '../../types';
6
- import TableValue from '../TableValue/TableValue';
7
-
8
- // TODO: Заменить Record<string, any> на Record<string, unknown>
9
- export interface ITableRowProps<Values extends Record<string, any>> extends ICommonProps {
10
- item: Values;
11
- uniqueField?: keyof Values;
12
- isFirstColumnSticky?: boolean;
13
- isActive: boolean;
14
- config?: FlexibleTableConfigType<Values>;
15
- enabledColumns?: Array<keyof Values>;
16
- rowAttributes?: Array<keyof Values>;
17
- expandableRowComponent?: (item: Values, isOpen: boolean, close: () => void) => ReactNode;
18
- // TODO: Заменить string на Generic Values[uniqueField]
19
- onRowHover?: (id?: string) => void;
20
- onRowClick?: (id: string) => void;
21
- // чтобы не перерендеривать стили для каждой строчки / ячейки
22
- // TODO: Можно лучше через Classes
23
- classes: {
24
- root: string;
25
- active: string;
26
- editable: string;
27
- cell: {
28
- root: string;
29
- sticky: string;
30
- second: string;
31
- };
32
- };
33
- }
34
-
35
- function TableRowInner<Values extends Record<string, any>>({
36
- item,
37
- uniqueField,
38
- isFirstColumnSticky,
39
- isActive,
40
- config,
41
- enabledColumns,
42
- onRowHover,
43
- onRowClick,
44
- rowAttributes,
45
- expandableRowComponent,
46
- classes,
47
- }: ITableRowProps<Values>): JSX.Element {
48
- const [isFocused, setFocused] = useState(false);
49
- const [nestedComponent, setNestedComponent] = useState<INestedComponent>({
50
- isOpen: false,
51
- });
52
-
53
- // уникальная разработка, позволяющая прокидывать data-атрибуты в <tr>
54
- // например: rowAttributes={['id']} => <tr data-id="x" />
55
- const rowData = rowAttributes?.reduce((acc: IDataAttributes, cur) => {
56
- const val = item[cur];
57
- if (val !== undefined) {
58
- acc[cur as string] = String(item[cur]);
59
- }
60
- return acc;
61
- }, {});
62
-
63
- const handleMouseLeave = () => {
64
- if (onRowHover) {
65
- onRowHover(undefined);
66
- }
67
- setFocused(false);
68
- };
69
-
70
- const updateNestedComponent = (component?: ReactNode, cellKey?: string) => {
71
- setNestedComponent(
72
- component === undefined ? { isOpen: false } : { isOpen: true, component, cellKey },
73
- );
74
- };
75
-
76
- const closeNestedComponent = () => {
77
- setNestedComponent({ isOpen: false });
78
- };
79
-
80
- const handleRowClick = () => {
81
- if (uniqueField !== undefined) {
82
- onRowClick?.(item[uniqueField]);
83
- }
84
-
85
- if (expandableRowComponent !== undefined) {
86
- const newNestedComponent = expandableRowComponent(item, true, closeNestedComponent);
87
-
88
- if (!nestedComponent.isOpen && newNestedComponent !== null) {
89
- updateNestedComponent(newNestedComponent);
90
- return;
91
- }
92
-
93
- if (nestedComponent.isOpen && nestedComponent.cellKey === undefined) {
94
- closeNestedComponent();
95
- return;
96
- }
97
- }
98
- };
99
-
100
- const items = enabledColumns ?? Object.keys(item);
101
-
102
- return (
103
- <>
104
- <tr
105
- className={clsx(
106
- classes.root,
107
- isActive && classes.active,
108
- (onRowClick !== undefined || onRowHover !== undefined) && classes.editable,
109
- )}
110
- onMouseEnter={(e) => {
111
- if (uniqueField !== undefined && onRowHover !== undefined) {
112
- e.stopPropagation();
113
- onRowHover(item[uniqueField]);
114
- setFocused(true);
115
- }
116
- }}
117
- onMouseLeave={handleMouseLeave}
118
- onClick={handleRowClick}
119
- {...addDataAttributes({
120
- ...rowData,
121
- isExpandableComponentActive: nestedComponent.isOpen ? true : undefined,
122
- })}
123
- >
124
- {items.map((key, idx) => (
125
- <TableValue
126
- columnName={key}
127
- isSticky={isFirstColumnSticky && idx === 0}
128
- isSecond={isFirstColumnSticky && idx === 1}
129
- key={key as string}
130
- item={item}
131
- config={config}
132
- classes={classes.cell}
133
- isFocusedRow={isFocused}
134
- isNestedComponentExpanded={nestedComponent.isOpen && nestedComponent.cellKey === key}
135
- isRowNestedComponentExpanded={
136
- nestedComponent.isOpen && nestedComponent.cellKey === undefined
137
- }
138
- onSetNestedComponent={(component) => updateNestedComponent(component, key as string)}
139
- />
140
- ))}
141
- </tr>
142
-
143
- {nestedComponent.isOpen && (
144
- <tr className={classes.root}>
145
- <td colSpan={items.length}>{nestedComponent.component}</td>
146
- </tr>
147
- )}
148
- </>
149
- );
150
- }
151
-
152
- export const TableRow = memo(TableRowInner) as typeof TableRowInner;
1
+ import { ReactNode, useState, memo } from 'react';
2
+ import clsx from 'clsx';
3
+ import { addDataAttributes } from '../../../../helpers';
4
+ import { ICommonProps, IDataAttributes } from '../../../../types';
5
+ import { FlexibleTableConfigType, INestedComponent } from '../../types';
6
+ import TableValue from '../TableValue/TableValue';
7
+
8
+ // TODO: Заменить Record<string, any> на Record<string, unknown>
9
+ export interface ITableRowProps<Values extends Record<string, any>> extends ICommonProps {
10
+ item: Values;
11
+ uniqueField?: keyof Values;
12
+ isFirstColumnSticky?: boolean;
13
+ isActive: boolean;
14
+ config?: FlexibleTableConfigType<Values>;
15
+ enabledColumns?: Array<keyof Values>;
16
+ rowAttributes?: Array<keyof Values>;
17
+ expandableRowComponent?: (item: Values, isOpen: boolean, close: () => void) => ReactNode;
18
+ // TODO: Заменить string на Generic Values[uniqueField]
19
+ onRowHover?: (id?: string) => void;
20
+ onRowClick?: (id: string) => void;
21
+ // чтобы не перерендеривать стили для каждой строчки / ячейки
22
+ // TODO: Можно лучше через Classes
23
+ classes: {
24
+ root: string;
25
+ active: string;
26
+ editable: string;
27
+ cell: {
28
+ root: string;
29
+ sticky: string;
30
+ second: string;
31
+ };
32
+ };
33
+ }
34
+
35
+ function TableRowInner<Values extends Record<string, any>>({
36
+ item,
37
+ uniqueField,
38
+ isFirstColumnSticky,
39
+ isActive,
40
+ config,
41
+ enabledColumns,
42
+ onRowHover,
43
+ onRowClick,
44
+ rowAttributes,
45
+ expandableRowComponent,
46
+ classes,
47
+ }: ITableRowProps<Values>): JSX.Element {
48
+ const [isFocused, setFocused] = useState(false);
49
+ const [nestedComponent, setNestedComponent] = useState<INestedComponent>({
50
+ isOpen: false,
51
+ });
52
+
53
+ // уникальная разработка, позволяющая прокидывать data-атрибуты в <tr>
54
+ // например: rowAttributes={['id']} => <tr data-id="x" />
55
+ const rowData = rowAttributes?.reduce((acc: IDataAttributes, cur) => {
56
+ const val = item[cur];
57
+ if (val !== undefined) {
58
+ acc[cur as string] = String(item[cur]);
59
+ }
60
+ return acc;
61
+ }, {});
62
+
63
+ const handleMouseLeave = () => {
64
+ if (onRowHover) {
65
+ onRowHover(undefined);
66
+ }
67
+ setFocused(false);
68
+ };
69
+
70
+ const updateNestedComponent = (component?: ReactNode, cellKey?: string) => {
71
+ setNestedComponent(
72
+ component === undefined ? { isOpen: false } : { isOpen: true, component, cellKey },
73
+ );
74
+ };
75
+
76
+ const closeNestedComponent = () => {
77
+ setNestedComponent({ isOpen: false });
78
+ };
79
+
80
+ const handleRowClick = () => {
81
+ if (uniqueField !== undefined) {
82
+ onRowClick?.(item[uniqueField]);
83
+ }
84
+
85
+ if (expandableRowComponent !== undefined) {
86
+ const newNestedComponent = expandableRowComponent(item, true, closeNestedComponent);
87
+
88
+ if (!nestedComponent.isOpen && newNestedComponent !== null) {
89
+ updateNestedComponent(newNestedComponent);
90
+ return;
91
+ }
92
+
93
+ if (nestedComponent.isOpen && nestedComponent.cellKey === undefined) {
94
+ closeNestedComponent();
95
+ return;
96
+ }
97
+ }
98
+ };
99
+
100
+ const items = enabledColumns ?? Object.keys(item);
101
+
102
+ return (
103
+ <>
104
+ <tr
105
+ className={clsx(
106
+ classes.root,
107
+ isActive && classes.active,
108
+ (onRowClick !== undefined || onRowHover !== undefined) && classes.editable,
109
+ )}
110
+ onMouseEnter={(e) => {
111
+ if (uniqueField !== undefined && onRowHover !== undefined) {
112
+ e.stopPropagation();
113
+ onRowHover(item[uniqueField]);
114
+ setFocused(true);
115
+ }
116
+ }}
117
+ onMouseLeave={handleMouseLeave}
118
+ onClick={handleRowClick}
119
+ {...addDataAttributes({
120
+ ...rowData,
121
+ isExpandableComponentActive: nestedComponent.isOpen ? true : undefined,
122
+ })}
123
+ >
124
+ {items.map((key, idx) => (
125
+ <TableValue
126
+ columnName={key}
127
+ isSticky={isFirstColumnSticky && idx === 0}
128
+ isSecond={isFirstColumnSticky && idx === 1}
129
+ key={key as string}
130
+ item={item}
131
+ config={config}
132
+ classes={classes.cell}
133
+ isFocusedRow={isFocused}
134
+ isNestedComponentExpanded={nestedComponent.isOpen && nestedComponent.cellKey === key}
135
+ isRowNestedComponentExpanded={
136
+ nestedComponent.isOpen && nestedComponent.cellKey === undefined
137
+ }
138
+ onSetNestedComponent={(component) => updateNestedComponent(component, key as string)}
139
+ />
140
+ ))}
141
+ </tr>
142
+
143
+ {nestedComponent.isOpen && (
144
+ <tr className={classes.root}>
145
+ <td colSpan={items.length}>{nestedComponent.component}</td>
146
+ </tr>
147
+ )}
148
+ </>
149
+ );
150
+ }
151
+
152
+ export const TableRow = memo(TableRowInner) as typeof TableRowInner;
@@ -1 +1 @@
1
- export * from './TableRow';
1
+ export * from './TableRow';
@@ -1,74 +1,74 @@
1
- import { ReactNode } from 'react';
2
- import clsx from 'clsx';
3
- import { format } from 'date-fns';
4
- import type { ICommonProps } from '../../../../types';
5
- import { DEFAULT_DATE_FORMAT } from '../../constants';
6
- import type { FlexibleTableConfigType } from '../../types';
7
-
8
- export interface ITableValueProps<Values extends Record<string, any>> extends ICommonProps {
9
- item: Values;
10
- columnName: keyof Values;
11
- config?: FlexibleTableConfigType<Values>;
12
- classes: {
13
- root: string;
14
- sticky: string;
15
- second: string;
16
- };
17
- isFocusedRow?: boolean;
18
- isSecond?: boolean;
19
- isSticky?: boolean;
20
- isNestedComponentExpanded: boolean;
21
- isRowNestedComponentExpanded: boolean;
22
- onSetNestedComponent: (component?: ReactNode) => void;
23
- }
24
-
25
- function TableValue<Values extends Record<string, any>>({
26
- item,
27
- columnName,
28
- config,
29
- classes,
30
- isFocusedRow,
31
- isSecond,
32
- isSticky,
33
- isNestedComponentExpanded,
34
- isRowNestedComponentExpanded,
35
- onSetNestedComponent,
36
- }: ITableValueProps<Values>): JSX.Element {
37
- const itemConfig = config?.[columnName];
38
- const value = item[columnName];
39
- let content = null;
40
-
41
- if (itemConfig?.component) {
42
- const ValueComponent = itemConfig?.component;
43
- content = ValueComponent({
44
- value,
45
- row: item,
46
- isFocusedRow,
47
- isNestedComponentExpanded,
48
- isRowNestedComponentExpanded,
49
- onSetNestedComponent,
50
- });
51
- } else if (typeof value === 'string' || typeof value === 'number') {
52
- content = value;
53
- } else if ((value as any) instanceof Date) {
54
- content = format(value, itemConfig?.dateFormat || DEFAULT_DATE_FORMAT);
55
- }
56
-
57
- return (
58
- <td
59
- key={columnName as string}
60
- className={clsx(classes.root, isSticky && classes.sticky, isSecond && classes.second)}
61
- style={{
62
- textAlign: itemConfig?.cellAlign,
63
- position: isSticky ? 'sticky' : itemConfig?.position,
64
- right: itemConfig?.right,
65
- left: isSticky ? 0 : itemConfig?.left,
66
- verticalAlign: itemConfig?.cellVerticalAlign,
67
- }}
68
- >
69
- {content}
70
- </td>
71
- );
72
- }
73
-
74
- export default TableValue;
1
+ import { ReactNode } from 'react';
2
+ import clsx from 'clsx';
3
+ import { format } from 'date-fns';
4
+ import type { ICommonProps } from '../../../../types';
5
+ import { DEFAULT_DATE_FORMAT } from '../../constants';
6
+ import type { FlexibleTableConfigType } from '../../types';
7
+
8
+ export interface ITableValueProps<Values extends Record<string, any>> extends ICommonProps {
9
+ item: Values;
10
+ columnName: keyof Values;
11
+ config?: FlexibleTableConfigType<Values>;
12
+ classes: {
13
+ root: string;
14
+ sticky: string;
15
+ second: string;
16
+ };
17
+ isFocusedRow?: boolean;
18
+ isSecond?: boolean;
19
+ isSticky?: boolean;
20
+ isNestedComponentExpanded: boolean;
21
+ isRowNestedComponentExpanded: boolean;
22
+ onSetNestedComponent: (component?: ReactNode) => void;
23
+ }
24
+
25
+ function TableValue<Values extends Record<string, any>>({
26
+ item,
27
+ columnName,
28
+ config,
29
+ classes,
30
+ isFocusedRow,
31
+ isSecond,
32
+ isSticky,
33
+ isNestedComponentExpanded,
34
+ isRowNestedComponentExpanded,
35
+ onSetNestedComponent,
36
+ }: ITableValueProps<Values>): JSX.Element {
37
+ const itemConfig = config?.[columnName];
38
+ const value = item[columnName];
39
+ let content = null;
40
+
41
+ if (itemConfig?.component) {
42
+ const ValueComponent = itemConfig?.component;
43
+ content = ValueComponent({
44
+ value,
45
+ row: item,
46
+ isFocusedRow,
47
+ isNestedComponentExpanded,
48
+ isRowNestedComponentExpanded,
49
+ onSetNestedComponent,
50
+ });
51
+ } else if (typeof value === 'string' || typeof value === 'number') {
52
+ content = value;
53
+ } else if ((value as any) instanceof Date) {
54
+ content = format(value, itemConfig?.dateFormat || DEFAULT_DATE_FORMAT);
55
+ }
56
+
57
+ return (
58
+ <td
59
+ key={columnName as string}
60
+ className={clsx(classes.root, isSticky && classes.sticky, isSecond && classes.second)}
61
+ style={{
62
+ textAlign: itemConfig?.cellAlign,
63
+ position: isSticky ? 'sticky' : itemConfig?.position,
64
+ right: itemConfig?.right,
65
+ left: isSticky ? 0 : itemConfig?.left,
66
+ verticalAlign: itemConfig?.cellVerticalAlign,
67
+ }}
68
+ >
69
+ {content}
70
+ </td>
71
+ );
72
+ }
73
+
74
+ export default TableValue;
@@ -1 +1 @@
1
- export * from './TableValue';
1
+ export * from './TableValue';
@@ -1,2 +1,2 @@
1
- export * from './TableRow';
2
- export * from './TableValue';
1
+ export * from './TableRow';
2
+ export * from './TableValue';
@@ -1 +1 @@
1
- export const DEFAULT_DATE_FORMAT = 'dd.MM.yyyy';
1
+ export const DEFAULT_DATE_FORMAT = 'dd.MM.yyyy';
@@ -1,52 +1,52 @@
1
- import { FC, ReactNode } from 'react';
2
-
3
- export type ITextAlignment = 'left' | 'center' | 'right';
4
-
5
- export type IVerticalAlignment = 'middle' | 'top' | 'bottom' | 'baseline' | 'sub' | string;
6
-
7
- export type IPosition = 'sticky' | 'absolute' | 'relative' | 'static';
8
-
9
- export type ITitleComponent<Value> = FC<{
10
- value?: Value;
11
- }>;
12
-
13
- export type IValueComponent<Values, Value> = (props: {
14
- value: Value;
15
- row: Values;
16
- isFocusedRow?: boolean;
17
- isNestedComponentExpanded: boolean;
18
- isRowNestedComponentExpanded: boolean;
19
- onSetNestedComponent: (component?: ReactNode) => void;
20
- }) => JSX.Element | ReactNode;
21
-
22
- export type FlexibleTableConfigType<Values> = {
23
- [Key in keyof Values]?: {
24
- title?: ReactNode;
25
- titleComponent?: ITitleComponent<unknown>;
26
- component?: IValueComponent<Values, Values[Key]>;
27
- dateFormat?: string;
28
- minWidth?: string | number;
29
- width?: string | number;
30
- maxWidth?: string | number;
31
- titleAlign?: ITextAlignment;
32
- cellAlign?: ITextAlignment;
33
- cellVerticalAlign?: IVerticalAlignment;
34
- position?: IPosition;
35
- right?: number;
36
- left?: number;
37
- };
38
- };
39
-
40
- export interface IInfinityScrollConfig {
41
- activePage: number;
42
- totalPages: number;
43
- isLoading: boolean;
44
- isLastPage: boolean;
45
- onInfinityScroll: (skip: number) => void;
46
- }
47
-
48
- export interface INestedComponent {
49
- isOpen: boolean;
50
- component?: ReactNode;
51
- cellKey?: string;
52
- }
1
+ import { FC, ReactNode } from 'react';
2
+
3
+ export type ITextAlignment = 'left' | 'center' | 'right';
4
+
5
+ export type IVerticalAlignment = 'middle' | 'top' | 'bottom' | 'baseline' | 'sub' | string;
6
+
7
+ export type IPosition = 'sticky' | 'absolute' | 'relative' | 'static';
8
+
9
+ export type ITitleComponent<Value> = FC<{
10
+ value?: Value;
11
+ }>;
12
+
13
+ export type IValueComponent<Values, Value> = (props: {
14
+ value: Value;
15
+ row: Values;
16
+ isFocusedRow?: boolean;
17
+ isNestedComponentExpanded: boolean;
18
+ isRowNestedComponentExpanded: boolean;
19
+ onSetNestedComponent: (component?: ReactNode) => void;
20
+ }) => JSX.Element | ReactNode;
21
+
22
+ export type FlexibleTableConfigType<Values> = {
23
+ [Key in keyof Values]?: {
24
+ title?: ReactNode;
25
+ titleComponent?: ITitleComponent<unknown>;
26
+ component?: IValueComponent<Values, Values[Key]>;
27
+ dateFormat?: string;
28
+ minWidth?: string | number;
29
+ width?: string | number;
30
+ maxWidth?: string | number;
31
+ titleAlign?: ITextAlignment;
32
+ cellAlign?: ITextAlignment;
33
+ cellVerticalAlign?: IVerticalAlignment;
34
+ position?: IPosition;
35
+ right?: number;
36
+ left?: number;
37
+ };
38
+ };
39
+
40
+ export interface IInfinityScrollConfig {
41
+ activePage: number;
42
+ totalPages: number;
43
+ isLoading: boolean;
44
+ isLastPage: boolean;
45
+ onInfinityScroll: (skip: number) => void;
46
+ }
47
+
48
+ export interface INestedComponent {
49
+ isOpen: boolean;
50
+ component?: ReactNode;
51
+ cellKey?: string;
52
+ }