norma-library 0.4.9 → 0.5.1

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 (246) hide show
  1. package/.babelrc.json +1 -1
  2. package/.husky/commit-msg +4 -0
  3. package/.prettierignore +11 -0
  4. package/.prettierrc.json +20 -0
  5. package/CHANGELOG.md +0 -0
  6. package/CONTRIBUTING.md +0 -0
  7. package/README.md +42 -0
  8. package/commitlint.config.js +1 -0
  9. package/dist/Button/index.d.ts +9 -0
  10. package/dist/Button/types.d.ts +18 -0
  11. package/dist/Card/Card.d.ts +3 -0
  12. package/dist/Card/CardHeader.d.ts +3 -0
  13. package/dist/Card/index.d.ts +4 -0
  14. package/dist/Card/styles.d.ts +546 -0
  15. package/dist/Card/types.d.ts +8 -0
  16. package/dist/esm/components/Accordion.d.ts +2 -2
  17. package/dist/esm/components/Accordion.js +8 -8
  18. package/dist/esm/components/Accordion.js.map +1 -1
  19. package/dist/esm/components/Avatar.d.ts +2 -2
  20. package/dist/esm/components/Avatar.js +7 -7
  21. package/dist/esm/components/Avatar.js.map +1 -1
  22. package/dist/esm/components/Badge.d.ts +2 -2
  23. package/dist/esm/components/Badge.js +5 -5
  24. package/dist/esm/components/Badge.js.map +1 -1
  25. package/dist/esm/components/Button.d.ts +2 -2
  26. package/dist/esm/components/Button.js +10 -10
  27. package/dist/esm/components/Button.js.map +1 -1
  28. package/dist/esm/components/Card.d.ts +3 -3
  29. package/dist/esm/components/Card.js +8 -8
  30. package/dist/esm/components/Card.js.map +1 -1
  31. package/dist/esm/components/ChatMessage.d.ts +2 -2
  32. package/dist/esm/components/ChatMessage.js +35 -35
  33. package/dist/esm/components/ChatMessage.js.map +1 -1
  34. package/dist/esm/components/CheckBox.d.ts +2 -2
  35. package/dist/esm/components/CheckBox.js +5 -5
  36. package/dist/esm/components/CheckBox.js.map +1 -1
  37. package/dist/esm/components/DataGrid/base/dropdown.d.ts +2 -2
  38. package/dist/esm/components/DataGrid/base/dropdown.js +32 -32
  39. package/dist/esm/components/DataGrid/base/dropdown.js.map +1 -1
  40. package/dist/esm/components/DataGrid/base/number-filter.d.ts +2 -2
  41. package/dist/esm/components/DataGrid/base/number-filter.js +21 -21
  42. package/dist/esm/components/DataGrid/base/sorting.d.ts +2 -2
  43. package/dist/esm/components/DataGrid/base/sorting.js +1 -1
  44. package/dist/esm/components/DataGrid/base/sorting.js.map +1 -1
  45. package/dist/esm/components/DataGrid/icons.d.ts +1 -1
  46. package/dist/esm/components/DataGrid/icons.js +1 -1
  47. package/dist/esm/components/DataGrid/icons.js.map +1 -1
  48. package/dist/esm/components/DataGrid/index.d.ts +2 -2
  49. package/dist/esm/components/DataGrid/index.js +35 -44
  50. package/dist/esm/components/DataGrid/index.js.map +1 -1
  51. package/dist/esm/components/DataGrid/shared.d.ts +1 -1
  52. package/dist/esm/components/DataGrid/shared.js +19 -32
  53. package/dist/esm/components/DataGrid/shared.js.map +1 -1
  54. package/dist/esm/components/DataGrid/styled.d.ts +2 -2
  55. package/dist/esm/components/DataGrid/styled.js +35 -35
  56. package/dist/esm/components/DataGrid/styled.js.map +1 -1
  57. package/dist/esm/components/DatePicker.d.ts +5 -5
  58. package/dist/esm/components/DatePicker.js +37 -37
  59. package/dist/esm/components/DatePicker.js.map +1 -1
  60. package/dist/esm/components/DropDown.d.ts +2 -2
  61. package/dist/esm/components/DropDown.js +6 -6
  62. package/dist/esm/components/DropDown.js.map +1 -1
  63. package/dist/esm/components/IconButton.d.ts +2 -2
  64. package/dist/esm/components/IconButton.js +7 -7
  65. package/dist/esm/components/IconButton.js.map +1 -1
  66. package/dist/esm/components/Icons.d.ts +2 -2
  67. package/dist/esm/components/Icons.js +10 -10
  68. package/dist/esm/components/Icons.js.map +1 -1
  69. package/dist/esm/components/Modal.d.ts +2 -2
  70. package/dist/esm/components/Modal.js +8 -8
  71. package/dist/esm/components/Modal.js.map +1 -1
  72. package/dist/esm/components/Paper.d.ts +2 -2
  73. package/dist/esm/components/Paper.js +5 -5
  74. package/dist/esm/components/Paper.js.map +1 -1
  75. package/dist/esm/components/ProgressBar.d.ts +2 -2
  76. package/dist/esm/components/ProgressBar.js +11 -11
  77. package/dist/esm/components/ProgressBar.js.map +1 -1
  78. package/dist/esm/components/RadioGroup.d.ts +2 -2
  79. package/dist/esm/components/RadioGroup.js +7 -7
  80. package/dist/esm/components/RadioGroup.js.map +1 -1
  81. package/dist/esm/components/RangerSlider.d.ts +2 -2
  82. package/dist/esm/components/RangerSlider.js +31 -31
  83. package/dist/esm/components/RangerSlider.js.map +1 -1
  84. package/dist/esm/components/Select.d.ts +2 -2
  85. package/dist/esm/components/Select.js +14 -14
  86. package/dist/esm/components/Select.js.map +1 -1
  87. package/dist/esm/components/Svgs.d.ts +1 -1
  88. package/dist/esm/components/Svgs.js +1 -1
  89. package/dist/esm/components/Svgs.js.map +1 -1
  90. package/dist/esm/components/Tabs.d.ts +2 -2
  91. package/dist/esm/components/Tabs.js +25 -26
  92. package/dist/esm/components/Tabs.js.map +1 -1
  93. package/dist/esm/components/Tag.d.ts +2 -2
  94. package/dist/esm/components/Tag.js +8 -8
  95. package/dist/esm/components/Tag.js.map +1 -1
  96. package/dist/esm/components/TextField.d.ts +2 -2
  97. package/dist/esm/components/TextField.js +8 -8
  98. package/dist/esm/components/TextField.js.map +1 -1
  99. package/dist/esm/components/TimeLine.d.ts +2 -2
  100. package/dist/esm/components/TimeLine.js +20 -20
  101. package/dist/esm/components/TimeLine.js.map +1 -1
  102. package/dist/esm/components/TimePicker.d.ts +8 -8
  103. package/dist/esm/components/TimePicker.js +43 -43
  104. package/dist/esm/components/TimePicker.js.map +1 -1
  105. package/dist/esm/components/index.d.ts +23 -23
  106. package/dist/esm/components/index.js +23 -23
  107. package/dist/esm/helpers/alignments.js +7 -7
  108. package/dist/esm/helpers/borders.js +11 -11
  109. package/dist/esm/helpers/colors.js +41 -41
  110. package/dist/esm/helpers/index.d.ts +5 -5
  111. package/dist/esm/helpers/index.js +5 -5
  112. package/dist/esm/helpers/sizes.d.ts +1 -1
  113. package/dist/esm/helpers/sizes.js +39 -39
  114. package/dist/esm/helpers/sizes.js.map +1 -1
  115. package/dist/esm/index.d.ts +17 -17
  116. package/dist/esm/index.js +17 -17
  117. package/dist/esm/interfaces/Accordion.d.ts +3 -3
  118. package/dist/esm/interfaces/Avatar.d.ts +6 -6
  119. package/dist/esm/interfaces/Badge.d.ts +7 -7
  120. package/dist/esm/interfaces/Button.d.ts +5 -5
  121. package/dist/esm/interfaces/Card.d.ts +3 -3
  122. package/dist/esm/interfaces/ChatMessage.d.ts +1 -1
  123. package/dist/esm/interfaces/CheckBox.d.ts +10 -10
  124. package/dist/esm/interfaces/DataGrid.d.ts +4 -4
  125. package/dist/esm/interfaces/DatePicker.d.ts +3 -3
  126. package/dist/esm/interfaces/DropDown.d.ts +4 -4
  127. package/dist/esm/interfaces/IconButton.d.ts +5 -5
  128. package/dist/esm/interfaces/Icons.d.ts +3 -3
  129. package/dist/esm/interfaces/Modal.d.ts +3 -3
  130. package/dist/esm/interfaces/Paper.d.ts +4 -4
  131. package/dist/esm/interfaces/ProgressBar.d.ts +5 -5
  132. package/dist/esm/interfaces/RadioGroup.d.ts +4 -4
  133. package/dist/esm/interfaces/RangerSlider.d.ts +8 -8
  134. package/dist/esm/interfaces/Select.d.ts +3 -3
  135. package/dist/esm/interfaces/Tabs.d.ts +3 -3
  136. package/dist/esm/interfaces/Tag.d.ts +5 -5
  137. package/dist/esm/interfaces/TextField.d.ts +12 -12
  138. package/dist/esm/interfaces/TimeLine.d.ts +3 -3
  139. package/dist/esm/interfaces/TimePicker.d.ts +3 -3
  140. package/dist/esm/interfaces/index.d.ts +23 -23
  141. package/dist/esm/interfaces/index.js +23 -23
  142. package/dist/esm/types/index.d.ts +41 -41
  143. package/dist/esm/types/index.js +2 -2
  144. package/dist/esm/types/index.js.map +1 -1
  145. package/dist/index.d.ts +2 -0
  146. package/dist/index.es.js +6992 -0
  147. package/dist/index.es.js.map +1 -0
  148. package/dist/index.umd.js +266 -0
  149. package/dist/index.umd.js.map +1 -0
  150. package/dist/vite.svg +1 -0
  151. package/docs/index.md +118 -0
  152. package/package.json +65 -8
  153. package/src/components/Accordion.tsx +47 -64
  154. package/src/components/Avatar.tsx +22 -29
  155. package/src/components/Badge.tsx +19 -22
  156. package/src/components/Button.tsx +12 -19
  157. package/src/components/Card.tsx +44 -47
  158. package/src/components/ChatMessage.tsx +87 -89
  159. package/src/components/CheckBox.tsx +8 -19
  160. package/src/components/DataGrid/allData.json +2918 -2918
  161. package/src/components/DataGrid/base/dropdown.tsx +212 -235
  162. package/src/components/DataGrid/base/number-filter.tsx +43 -43
  163. package/src/components/DataGrid/base/sorting.tsx +29 -35
  164. package/src/components/DataGrid/icons.tsx +53 -61
  165. package/src/components/DataGrid/index.tsx +254 -319
  166. package/src/components/DataGrid/shared.ts +154 -179
  167. package/src/components/DataGrid/styled.ts +96 -102
  168. package/src/components/DataGrid/styles/dropdown.module.css +86 -86
  169. package/src/components/DataGrid/styles/number-filter.module.css +16 -16
  170. package/src/components/DataGrid/styles/styles.module.css +107 -107
  171. package/src/components/DatePicker.tsx +73 -84
  172. package/src/components/DropDown.tsx +31 -38
  173. package/src/components/IconButton.tsx +12 -29
  174. package/src/components/Icons.tsx +82 -87
  175. package/src/components/Modal.tsx +114 -123
  176. package/src/components/Paper.tsx +19 -22
  177. package/src/components/ProgressBar.tsx +54 -63
  178. package/src/components/RadioGroup.tsx +47 -55
  179. package/src/components/RangerSlider.tsx +70 -81
  180. package/src/components/Select.tsx +82 -98
  181. package/src/components/Svgs.tsx +498 -522
  182. package/src/components/Tabs.tsx +111 -140
  183. package/src/components/Tag.tsx +37 -45
  184. package/src/components/TextField.tsx +11 -22
  185. package/src/components/TimeLine.tsx +93 -103
  186. package/src/components/TimePicker.tsx +84 -95
  187. package/src/components/index.ts +23 -23
  188. package/src/helpers/alignments.ts +7 -7
  189. package/src/helpers/borders.ts +11 -11
  190. package/src/helpers/colors.ts +42 -42
  191. package/src/helpers/index.ts +5 -5
  192. package/src/helpers/sizes.ts +39 -46
  193. package/src/index.ts +17 -17
  194. package/src/interfaces/Accordion.ts +12 -12
  195. package/src/interfaces/Avatar.tsx +15 -18
  196. package/src/interfaces/Badge.ts +19 -32
  197. package/src/interfaces/Button.ts +5 -10
  198. package/src/interfaces/Card.ts +11 -11
  199. package/src/interfaces/ChatMessage.ts +12 -12
  200. package/src/interfaces/CheckBox.ts +12 -18
  201. package/src/interfaces/DataGrid.ts +46 -51
  202. package/src/interfaces/DatePicker.ts +13 -13
  203. package/src/interfaces/DropDown.ts +14 -14
  204. package/src/interfaces/IconButton.ts +5 -10
  205. package/src/interfaces/Icons.ts +17 -17
  206. package/src/interfaces/Modal.ts +15 -15
  207. package/src/interfaces/Paper.ts +12 -12
  208. package/src/interfaces/ProgressBar.ts +18 -25
  209. package/src/interfaces/RadioGroup.ts +22 -28
  210. package/src/interfaces/RangerSlider.ts +21 -32
  211. package/src/interfaces/Select.ts +17 -17
  212. package/src/interfaces/Tabs.ts +19 -24
  213. package/src/interfaces/Tag.ts +17 -17
  214. package/src/interfaces/TextField.ts +14 -34
  215. package/src/interfaces/TimeLine.ts +11 -16
  216. package/src/interfaces/TimePicker.ts +13 -13
  217. package/src/interfaces/index.ts +23 -23
  218. package/src/sample-data.json +178 -178
  219. package/src/stories/Accordion.stories.tsx +65 -65
  220. package/src/stories/Avatar.stories.tsx +123 -139
  221. package/src/stories/Badge.stories.tsx +39 -47
  222. package/src/stories/Button.stories.tsx +18 -26
  223. package/src/stories/Card.stories.tsx +40 -55
  224. package/src/stories/ChatMessage.stories.tsx +84 -85
  225. package/src/stories/CheckBox.stories.tsx +17 -23
  226. package/src/stories/DataGrid.stories.tsx +28 -28
  227. package/src/stories/DatePicker.stories.tsx +50 -77
  228. package/src/stories/DropDown.stories.tsx +57 -57
  229. package/src/stories/IconButton.stories.tsx +78 -114
  230. package/src/stories/Modal.stories.tsx +190 -190
  231. package/src/stories/Paper.stories.tsx +53 -53
  232. package/src/stories/ProgressBar.stories.tsx +95 -139
  233. package/src/stories/RadioGroup.stories.tsx +21 -28
  234. package/src/stories/RangerSlider.stories.tsx +58 -68
  235. package/src/stories/Select.stories.tsx +100 -128
  236. package/src/stories/Tabs.stories.tsx +62 -62
  237. package/src/stories/Tag.stories.tsx +56 -74
  238. package/src/stories/TextField.stories.tsx +54 -189
  239. package/src/stories/TimeLine.stories.tsx +35 -43
  240. package/src/stories/TimePicker.stories.tsx +87 -113
  241. package/src/types/index.ts +90 -155
  242. package/tsconfig.json +1 -1
  243. package/buildcache/front-end +0 -1
  244. package/norma-library.tar +0 -0
  245. package/postcss.config.js +0 -6
  246. package/tailwind.config.js +0 -58
@@ -1,319 +1,254 @@
1
- import React, { useEffect, useMemo, useState, useRef } from "react";
2
-
3
- import { Box, Stack, ThemeProvider, useMediaQuery, Paper } from "@mui/material";
4
-
5
- import Table from "@mui/material/Table";
6
- import TableBody from "@mui/material/TableBody";
7
- import TableCell from "@mui/material/TableCell";
8
- import TableContainer from "@mui/material/TableContainer";
9
- import TableHead from "@mui/material/TableHead";
10
- import TableRow from "@mui/material/TableRow";
11
-
12
- import ArrowDropUpIcon from "@mui/icons-material/ArrowDropUp";
13
- import ArrowDropDownIcon from "@mui/icons-material/ArrowDropDown";
14
-
15
- import { DataGridBaseProps, DataSourceItem } from "../../interfaces";
16
-
17
- import { themes } from "../../helpers";
18
-
19
- import DropdownFilter from "./base/dropdown";
20
- import { Pagination as MuiPagination } from "@mui/material";
21
-
22
- import {
23
- filterDataSource,
24
- generateRandomDataSource,
25
- groupByDataSource,
26
- sortDataSourceByColumn,
27
- } from "./shared";
28
-
29
- import {
30
- ButtonStyled,
31
- DataGridHeaderStyled,
32
- HeaderCogStyled,
33
- TableCellStyled,
34
- TableRowStyled,
35
- TotalRecordsStyled,
36
- } from "./styled";
37
-
38
- export function ArrowSmallUpIcon(props: any) {
39
- return (
40
- <svg
41
- fill="currentColor"
42
- viewBox="0 0 24 24"
43
- xmlns="http://www.w3.org/2000/svg"
44
- aria-hidden="true"
45
- {...props}
46
- >
47
- <path
48
- clipRule="evenodd"
49
- fillRule="evenodd"
50
- d="M12 20.25a.75.75 0 01-.75-.75V6.31l-5.47 5.47a.75.75 0 01-1.06-1.06l6.75-6.75a.75.75 0 011.06 0l6.75 6.75a.75.75 0 11-1.06 1.06l-5.47-5.47V19.5a.75.75 0 01-.75.75z"
51
- />
52
- </svg>
53
- );
54
- }
55
-
56
- export function Cog6ToothIcon(props: any) {
57
- return (
58
- <svg
59
- fill="none"
60
- stroke="currentColor"
61
- strokeWidth={1.5}
62
- viewBox="0 0 24 24"
63
- xmlns="http://www.w3.org/2000/svg"
64
- aria-hidden="true"
65
- {...props}
66
- >
67
- <path
68
- strokeLinecap="round"
69
- strokeLinejoin="round"
70
- d="M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z"
71
- />
72
- <path
73
- strokeLinecap="round"
74
- strokeLinejoin="round"
75
- d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"
76
- />
77
- </svg>
78
- );
79
- }
80
-
81
- const dataSource = generateRandomDataSource(30);
82
-
83
- export const DataGrid: React.FC<DataGridBaseProps> = ({ data = [] }) => {
84
- const prefersDarkMode = useMediaQuery("(prefers-color-scheme: dark)");
85
- const theme = useMemo(
86
- () => (prefersDarkMode ? themes.light : themes.light),
87
- [prefersDarkMode]
88
- );
89
-
90
- const pageSize = 10;
91
- const columns = data[0].columns;
92
-
93
- const [selectedItems, setSelectedItems] = useState<(string | number)[]>([]);
94
-
95
- const [sorting, setSorting] = useState("down");
96
- const [selectAll, setSelectAll] = useState<boolean>(false);
97
-
98
- const [currentActiveSorting, setCurrentActiveSorting] =
99
- useState<string>("id");
100
-
101
- const [currentDropDownActive, setCurrentDropDownActive] = useState<
102
- string | null
103
- >(null);
104
-
105
- const [originalDataSource, setOriginalDataSource] =
106
- useState<DataSourceItem[]>(dataSource);
107
- const [newDataSource, setDataSource] = useState<DataSourceItem[]>(dataSource);
108
- const [totalRecords, setTotalRecords] = useState(dataSource.length);
109
- const [totalPages, setTotalPages] = useState(
110
- Math.ceil(dataSource.length / pageSize)
111
- );
112
-
113
- const [currentPage, setCurrentPage] = useState(1);
114
- const startIndex = (currentPage - 1) * pageSize;
115
- const endIndex = Math.min(startIndex + pageSize, totalRecords);
116
-
117
- const sortRefs = useRef<(React.RefObject<HTMLTableCellElement> | null)[]>(
118
- new Array(columns.length).fill(null)
119
- );
120
-
121
- const handleItemSelected = (items: (string | number)[]) => {
122
- setSelectedItems(items);
123
- };
124
-
125
- const handleDropDown = (item: any) => {
126
- setCurrentDropDownActive(item === currentDropDownActive ? null : item);
127
- if (item !== currentDropDownActive) {
128
- setCurrentActiveSorting(item);
129
- setSorting("down");
130
- }
131
- };
132
-
133
- const handleSorting = (sort: string) => {
134
- setSorting(sort === "up" ? "up" : "down");
135
- currentDropDownActive && setCurrentActiveSorting(currentDropDownActive);
136
- handleDropDown(currentDropDownActive);
137
- };
138
-
139
- const handleFilter = (filter: string) => {
140
- const dataSourceFiltered = filterDataSource(
141
- originalDataSource,
142
- currentActiveSorting,
143
- filter
144
- );
145
- setOriginalDataSource(dataSourceFiltered);
146
- setCurrentPage(1);
147
- };
148
-
149
- const handleFilterSelected = () => {
150
- if (selectedItems.length > 0) {
151
- const filteredData = originalDataSource.filter((item: DataSourceItem) => {
152
- const columnValue = currentActiveSorting
153
- ? item[currentActiveSorting]
154
- : undefined;
155
-
156
- if (typeof columnValue === "string") {
157
- return selectedItems.includes(columnValue);
158
- } else if (typeof columnValue === "number") {
159
- return selectedItems.includes(columnValue.toString());
160
- }
161
- return false;
162
- });
163
-
164
- const sortedData = sortDataSourceByColumn(
165
- filteredData,
166
- currentActiveSorting,
167
- sorting
168
- );
169
- setTotalRecords(sortedData.length);
170
- setTotalPages(Math.ceil(sortedData.length / pageSize));
171
- setCurrentPage(1);
172
- setDataSource(sortedData.slice(startIndex, endIndex));
173
- } else {
174
- const sortedData = sortDataSourceByColumn(
175
- dataSource,
176
- currentActiveSorting,
177
- sorting
178
- );
179
- setTotalRecords(sortedData.length);
180
- setTotalPages(Math.ceil(sortedData.length / pageSize));
181
- setCurrentPage(1);
182
- setDataSource(sortedData.slice(startIndex, endIndex));
183
- }
184
- handleDropDown(currentDropDownActive);
185
- };
186
-
187
- const handleChangePage = (page: number) => {
188
- setCurrentPage(page);
189
- const startIndex = (page - 1) * pageSize;
190
- const endIndex = Math.min(startIndex + pageSize, totalRecords);
191
- setDataSource(originalDataSource.slice(startIndex, endIndex));
192
- };
193
-
194
- useEffect(() => {
195
- if (selectedItems.length <= 0) {
196
- const sortedData = sortDataSourceByColumn(
197
- dataSource,
198
- currentActiveSorting,
199
- sorting
200
- );
201
- setDataSource(sortedData.slice(startIndex, endIndex));
202
- setTotalRecords(sortedData.length);
203
- setTotalPages(Math.ceil(sortedData.length / pageSize));
204
- setCurrentPage(1);
205
- }
206
- }, [selectedItems]);
207
-
208
- return (
209
- <ThemeProvider theme={theme}>
210
- <Box sx={{ width: "100%", minHeight: 480 }}>
211
- <DataGridHeaderStyled>
212
- <TotalRecordsStyled>
213
- {totalRecords} results found for this search
214
- </TotalRecordsStyled>
215
- <HeaderCogStyled type="button">
216
- <Cog6ToothIcon width={24} height={24} />
217
- </HeaderCogStyled>
218
- </DataGridHeaderStyled>
219
- <TableContainer component={Paper} sx={{ overflowX: "inherit" }}>
220
- <Table
221
- sx={{ minWidth: 650, width: "100%" }}
222
- aria-label="a dense table"
223
- >
224
- <TableHead>
225
- <TableRow>
226
- {columns &&
227
- columns.map((item: any, key: any) => (
228
- <TableCellStyled
229
- key={key}
230
- ref={(ref) =>
231
- (sortRefs.current[key] =
232
- ref as React.RefObject<HTMLTableCellElement> | null)
233
- }
234
- >
235
- <Stack
236
- direction="row"
237
- spacing={2}
238
- sx={{ position: "relative" }}
239
- >
240
- <ButtonStyled
241
- variant="text"
242
- size="small"
243
- color={
244
- currentActiveSorting === item.field
245
- ? "primary"
246
- : "inherit"
247
- }
248
- endIcon={
249
- currentActiveSorting === item.field &&
250
- sorting === "up" ? (
251
- <ArrowDropUpIcon />
252
- ) : (
253
- <ArrowDropDownIcon />
254
- )
255
- }
256
- onClick={() => {
257
- handleDropDown(item.field);
258
- }}
259
- >
260
- {item.headerText}
261
- </ButtonStyled>
262
- {currentDropDownActive &&
263
- currentDropDownActive === item.field && (
264
- <DropdownFilter
265
- format={item.format}
266
- onOrder={handleSorting}
267
- onFilter={handleFilter}
268
- onSelected={handleItemSelected}
269
- itemsSelected={selectedItems}
270
- onFilterSelected={handleFilterSelected}
271
- onChecketAll={setSelectAll}
272
- onSelectAll={selectAll}
273
- data={groupByDataSource(dataSource, item.field)}
274
- />
275
- )}
276
- </Stack>
277
- </TableCellStyled>
278
- ))}
279
- </TableRow>
280
- </TableHead>
281
- <TableBody>
282
- {newDataSource &&
283
- newDataSource.map((item: DataSourceItem, key: number) => (
284
- <TableRowStyled
285
- key={key}
286
- sx={{ "&:last-child td, &:last-child th": { border: 0 } }}
287
- >
288
- {Object.keys(item).map((columnKey) => (
289
- <TableCell component="th" scope="row" key={columnKey}>
290
- {item[columnKey]}
291
- </TableCell>
292
- ))}
293
- </TableRowStyled>
294
- ))}
295
- </TableBody>
296
- </Table>
297
- <Stack
298
- spacing={2}
299
- sx={{
300
- display: "flex",
301
- justifyContent: "center",
302
- alignItems: "center",
303
- borderTop: "1px solid #ccc",
304
- padding: 2,
305
- }}
306
- >
307
- <MuiPagination
308
- variant="outlined"
309
- shape="rounded"
310
- count={totalPages}
311
- page={currentPage}
312
- onChange={(_event, page) => handleChangePage(page)}
313
- />
314
- </Stack>
315
- </TableContainer>
316
- </Box>
317
- </ThemeProvider>
318
- );
319
- };
1
+ import React, { useEffect, useMemo, useState, useRef } from 'react';
2
+
3
+ import { Box, Stack, ThemeProvider, useMediaQuery, Paper } from '@mui/material';
4
+
5
+ import Table from '@mui/material/Table';
6
+ import TableBody from '@mui/material/TableBody';
7
+ import TableCell from '@mui/material/TableCell';
8
+ import TableContainer from '@mui/material/TableContainer';
9
+ import TableHead from '@mui/material/TableHead';
10
+ import TableRow from '@mui/material/TableRow';
11
+
12
+ import ArrowDropUpIcon from '@mui/icons-material/ArrowDropUp';
13
+ import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown';
14
+
15
+ import { DataGridBaseProps, DataSourceItem } from '../../interfaces';
16
+
17
+ import { themes } from '../../helpers';
18
+
19
+ import DropdownFilter from './base/dropdown';
20
+ import { Pagination as MuiPagination } from '@mui/material';
21
+
22
+ import { filterDataSource, generateRandomDataSource, groupByDataSource, sortDataSourceByColumn } from './shared';
23
+
24
+ import {
25
+ ButtonStyled,
26
+ DataGridHeaderStyled,
27
+ HeaderCogStyled,
28
+ TableCellStyled,
29
+ TableRowStyled,
30
+ TotalRecordsStyled,
31
+ } from './styled';
32
+
33
+ export function ArrowSmallUpIcon(props: any) {
34
+ return (
35
+ <svg fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" {...props}>
36
+ <path
37
+ clipRule="evenodd"
38
+ fillRule="evenodd"
39
+ d="M12 20.25a.75.75 0 01-.75-.75V6.31l-5.47 5.47a.75.75 0 01-1.06-1.06l6.75-6.75a.75.75 0 011.06 0l6.75 6.75a.75.75 0 11-1.06 1.06l-5.47-5.47V19.5a.75.75 0 01-.75.75z"
40
+ />
41
+ </svg>
42
+ );
43
+ }
44
+
45
+ export function Cog6ToothIcon(props: any) {
46
+ return (
47
+ <svg
48
+ fill="none"
49
+ stroke="currentColor"
50
+ strokeWidth={1.5}
51
+ viewBox="0 0 24 24"
52
+ xmlns="http://www.w3.org/2000/svg"
53
+ aria-hidden="true"
54
+ {...props}
55
+ >
56
+ <path
57
+ strokeLinecap="round"
58
+ strokeLinejoin="round"
59
+ d="M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z"
60
+ />
61
+ <path strokeLinecap="round" strokeLinejoin="round" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
62
+ </svg>
63
+ );
64
+ }
65
+
66
+ const dataSource = generateRandomDataSource(30);
67
+
68
+ export const DataGrid: React.FC<DataGridBaseProps> = ({ data = [] }) => {
69
+ const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)');
70
+ const theme = useMemo(() => (prefersDarkMode ? themes.light : themes.light), [prefersDarkMode]);
71
+
72
+ const pageSize = 10;
73
+ const columns = data[0].columns;
74
+
75
+ const [selectedItems, setSelectedItems] = useState<(string | number)[]>([]);
76
+
77
+ const [sorting, setSorting] = useState('down');
78
+ const [selectAll, setSelectAll] = useState<boolean>(false);
79
+
80
+ const [currentActiveSorting, setCurrentActiveSorting] = useState<string>('id');
81
+
82
+ const [currentDropDownActive, setCurrentDropDownActive] = useState<string | null>(null);
83
+
84
+ const [originalDataSource, setOriginalDataSource] = useState<DataSourceItem[]>(dataSource);
85
+ const [newDataSource, setDataSource] = useState<DataSourceItem[]>(dataSource);
86
+ const [totalRecords, setTotalRecords] = useState(dataSource.length);
87
+ const [totalPages, setTotalPages] = useState(Math.ceil(dataSource.length / pageSize));
88
+
89
+ const [currentPage, setCurrentPage] = useState(1);
90
+ const startIndex = (currentPage - 1) * pageSize;
91
+ const endIndex = Math.min(startIndex + pageSize, totalRecords);
92
+
93
+ const sortRefs = useRef<(React.RefObject<HTMLTableCellElement> | null)[]>(new Array(columns.length).fill(null));
94
+
95
+ const handleItemSelected = (items: (string | number)[]) => {
96
+ setSelectedItems(items);
97
+ };
98
+
99
+ const handleDropDown = (item: any) => {
100
+ setCurrentDropDownActive(item === currentDropDownActive ? null : item);
101
+ if (item !== currentDropDownActive) {
102
+ setCurrentActiveSorting(item);
103
+ setSorting('down');
104
+ }
105
+ };
106
+
107
+ const handleSorting = (sort: string) => {
108
+ setSorting(sort === 'up' ? 'up' : 'down');
109
+ currentDropDownActive && setCurrentActiveSorting(currentDropDownActive);
110
+ handleDropDown(currentDropDownActive);
111
+ };
112
+
113
+ const handleFilter = (filter: string) => {
114
+ const dataSourceFiltered = filterDataSource(originalDataSource, currentActiveSorting, filter);
115
+ setOriginalDataSource(dataSourceFiltered);
116
+ setCurrentPage(1);
117
+ };
118
+
119
+ const handleFilterSelected = () => {
120
+ if (selectedItems.length > 0) {
121
+ const filteredData = originalDataSource.filter((item: DataSourceItem) => {
122
+ const columnValue = currentActiveSorting ? item[currentActiveSorting] : undefined;
123
+
124
+ if (typeof columnValue === 'string') {
125
+ return selectedItems.includes(columnValue);
126
+ } else if (typeof columnValue === 'number') {
127
+ return selectedItems.includes(columnValue.toString());
128
+ }
129
+ return false;
130
+ });
131
+
132
+ const sortedData = sortDataSourceByColumn(filteredData, currentActiveSorting, sorting);
133
+ setTotalRecords(sortedData.length);
134
+ setTotalPages(Math.ceil(sortedData.length / pageSize));
135
+ setCurrentPage(1);
136
+ setDataSource(sortedData.slice(startIndex, endIndex));
137
+ } else {
138
+ const sortedData = sortDataSourceByColumn(dataSource, currentActiveSorting, sorting);
139
+ setTotalRecords(sortedData.length);
140
+ setTotalPages(Math.ceil(sortedData.length / pageSize));
141
+ setCurrentPage(1);
142
+ setDataSource(sortedData.slice(startIndex, endIndex));
143
+ }
144
+ handleDropDown(currentDropDownActive);
145
+ };
146
+
147
+ const handleChangePage = (page: number) => {
148
+ setCurrentPage(page);
149
+ const startIndex = (page - 1) * pageSize;
150
+ const endIndex = Math.min(startIndex + pageSize, totalRecords);
151
+ setDataSource(originalDataSource.slice(startIndex, endIndex));
152
+ };
153
+
154
+ useEffect(() => {
155
+ if (selectedItems.length <= 0) {
156
+ const sortedData = sortDataSourceByColumn(dataSource, currentActiveSorting, sorting);
157
+ setDataSource(sortedData.slice(startIndex, endIndex));
158
+ setTotalRecords(sortedData.length);
159
+ setTotalPages(Math.ceil(sortedData.length / pageSize));
160
+ setCurrentPage(1);
161
+ }
162
+ }, [selectedItems]);
163
+
164
+ return (
165
+ <ThemeProvider theme={theme}>
166
+ <Box sx={{ width: '100%', minHeight: 480 }}>
167
+ <DataGridHeaderStyled>
168
+ <TotalRecordsStyled>{totalRecords} results found for this search</TotalRecordsStyled>
169
+ <HeaderCogStyled type="button">
170
+ <Cog6ToothIcon width={24} height={24} />
171
+ </HeaderCogStyled>
172
+ </DataGridHeaderStyled>
173
+ <TableContainer component={Paper} sx={{ overflowX: 'inherit' }}>
174
+ <Table sx={{ minWidth: 650, width: '100%' }} aria-label="a dense table">
175
+ <TableHead>
176
+ <TableRow>
177
+ {columns &&
178
+ columns.map((item: any, key: any) => (
179
+ <TableCellStyled
180
+ key={key}
181
+ ref={ref => (sortRefs.current[key] = ref as React.RefObject<HTMLTableCellElement> | null)}
182
+ >
183
+ <Stack direction="row" spacing={2} sx={{ position: 'relative' }}>
184
+ <ButtonStyled
185
+ variant="text"
186
+ size="small"
187
+ color={currentActiveSorting === item.field ? 'primary' : 'inherit'}
188
+ endIcon={
189
+ currentActiveSorting === item.field && sorting === 'up' ? (
190
+ <ArrowDropUpIcon />
191
+ ) : (
192
+ <ArrowDropDownIcon />
193
+ )
194
+ }
195
+ onClick={() => {
196
+ handleDropDown(item.field);
197
+ }}
198
+ >
199
+ {item.headerText}
200
+ </ButtonStyled>
201
+ {currentDropDownActive && currentDropDownActive === item.field && (
202
+ <DropdownFilter
203
+ format={item.format}
204
+ onOrder={handleSorting}
205
+ onFilter={handleFilter}
206
+ onSelected={handleItemSelected}
207
+ itemsSelected={selectedItems}
208
+ onFilterSelected={handleFilterSelected}
209
+ onChecketAll={setSelectAll}
210
+ onSelectAll={selectAll}
211
+ data={groupByDataSource(dataSource, item.field)}
212
+ />
213
+ )}
214
+ </Stack>
215
+ </TableCellStyled>
216
+ ))}
217
+ </TableRow>
218
+ </TableHead>
219
+ <TableBody>
220
+ {newDataSource &&
221
+ newDataSource.map((item: DataSourceItem, key: number) => (
222
+ <TableRowStyled key={key} sx={{ '&:last-child td, &:last-child th': { border: 0 } }}>
223
+ {Object.keys(item).map(columnKey => (
224
+ <TableCell component="th" scope="row" key={columnKey}>
225
+ {item[columnKey]}
226
+ </TableCell>
227
+ ))}
228
+ </TableRowStyled>
229
+ ))}
230
+ </TableBody>
231
+ </Table>
232
+ <Stack
233
+ spacing={2}
234
+ sx={{
235
+ display: 'flex',
236
+ justifyContent: 'center',
237
+ alignItems: 'center',
238
+ borderTop: '1px solid #ccc',
239
+ padding: 2,
240
+ }}
241
+ >
242
+ <MuiPagination
243
+ variant="outlined"
244
+ shape="rounded"
245
+ count={totalPages}
246
+ page={currentPage}
247
+ onChange={(_event, page) => handleChangePage(page)}
248
+ />
249
+ </Stack>
250
+ </TableContainer>
251
+ </Box>
252
+ </ThemeProvider>
253
+ );
254
+ };