@rowsncolumns/grid 9.0.4 → 13.2.32

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 (208) hide show
  1. package/LICENSE.md +100 -0
  2. package/Readme.md +53 -59
  3. package/dist/cjs/Cell.d.ts +35 -0
  4. package/dist/cjs/Cell.d.ts.map +1 -0
  5. package/dist/cjs/Cell.js +29 -0
  6. package/dist/{CellOverlay.d.ts → cjs/CellOverlay.d.ts} +5 -5
  7. package/dist/cjs/CellOverlay.d.ts.map +1 -0
  8. package/dist/cjs/CellOverlay.js +126 -0
  9. package/dist/cjs/Context.d.ts +8 -0
  10. package/dist/cjs/Context.d.ts.map +1 -0
  11. package/dist/cjs/Context.js +13 -0
  12. package/dist/{FillHandle.d.ts → cjs/FillHandle.d.ts} +2 -1
  13. package/dist/cjs/FillHandle.d.ts.map +1 -0
  14. package/dist/cjs/FillHandle.js +26 -0
  15. package/dist/cjs/Grid.d.ts +558 -0
  16. package/dist/cjs/Grid.d.ts.map +1 -0
  17. package/dist/cjs/Grid.js +2446 -0
  18. package/dist/{GridLine.d.ts → cjs/GridLine.d.ts} +2 -1
  19. package/dist/cjs/GridLine.d.ts.map +1 -0
  20. package/dist/cjs/GridLine.js +10 -0
  21. package/dist/cjs/Image.d.ts +11 -0
  22. package/dist/cjs/Image.d.ts.map +1 -0
  23. package/dist/cjs/Image.js +57 -0
  24. package/dist/cjs/MemoizedGrid.d.ts +49 -0
  25. package/dist/cjs/MemoizedGrid.d.ts.map +1 -0
  26. package/dist/cjs/MemoizedGrid.js +105 -0
  27. package/dist/cjs/Selection.d.ts +5 -0
  28. package/dist/cjs/Selection.d.ts.map +1 -0
  29. package/dist/cjs/Selection.js +10 -0
  30. package/dist/{helpers.d.ts → cjs/helpers.d.ts} +59 -39
  31. package/dist/cjs/helpers.d.ts.map +1 -0
  32. package/dist/cjs/helpers.js +1409 -0
  33. package/dist/{hooks → cjs/hooks}/useCopyPaste.d.ts +3 -2
  34. package/dist/cjs/hooks/useCopyPaste.d.ts.map +1 -0
  35. package/dist/cjs/hooks/useCopyPaste.js +230 -0
  36. package/dist/{hooks → cjs/hooks}/useEditable.d.ts +21 -8
  37. package/dist/cjs/hooks/useEditable.d.ts.map +1 -0
  38. package/dist/cjs/hooks/useEditable.js +491 -0
  39. package/dist/{hooks → cjs/hooks}/useFilter.d.ts +3 -2
  40. package/dist/cjs/hooks/useFilter.d.ts.map +1 -0
  41. package/dist/cjs/hooks/useFilter.js +97 -0
  42. package/dist/{hooks → cjs/hooks}/useImage.d.ts +1 -0
  43. package/dist/cjs/hooks/useImage.d.ts.map +1 -0
  44. package/dist/cjs/hooks/useImage.js +80 -0
  45. package/dist/{hooks → cjs/hooks}/usePagination.d.ts +3 -2
  46. package/dist/cjs/hooks/usePagination.d.ts.map +1 -0
  47. package/dist/cjs/hooks/usePagination.js +53 -0
  48. package/dist/{hooks → cjs/hooks}/useSizer.d.ts +28 -29
  49. package/dist/cjs/hooks/useSizer.d.ts.map +1 -0
  50. package/dist/cjs/hooks/useSizer.js +176 -0
  51. package/dist/{hooks → cjs/hooks}/useTooltip.d.ts +2 -1
  52. package/dist/cjs/hooks/useTooltip.d.ts.map +1 -0
  53. package/dist/cjs/hooks/useTooltip.js +82 -0
  54. package/dist/{hooks → cjs/hooks}/useUndo.d.ts +2 -1
  55. package/dist/cjs/hooks/useUndo.d.ts.map +1 -0
  56. package/dist/cjs/hooks/useUndo.js +87 -0
  57. package/dist/cjs/index.d.ts +19 -0
  58. package/dist/cjs/index.d.ts.map +1 -0
  59. package/dist/cjs/index.js +29 -0
  60. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  61. package/dist/{types.d.ts → cjs/types.d.ts} +8 -3
  62. package/dist/cjs/types.d.ts.map +1 -0
  63. package/dist/{types.js → cjs/types.js} +7 -8
  64. package/dist/cjs/utils.d.ts +9 -0
  65. package/dist/cjs/utils.d.ts.map +1 -0
  66. package/dist/cjs/utils.js +58 -0
  67. package/dist/cjs/vitest.config.d.ts +3 -0
  68. package/dist/cjs/vitest.config.d.ts.map +1 -0
  69. package/dist/cjs/vitest.config.js +24 -0
  70. package/dist/esm/Cell.d.ts +35 -0
  71. package/dist/esm/Cell.d.ts.map +1 -0
  72. package/dist/esm/Cell.js +24 -0
  73. package/dist/esm/CellOverlay.d.ts +21 -0
  74. package/dist/esm/CellOverlay.d.ts.map +1 -0
  75. package/dist/esm/CellOverlay.js +120 -0
  76. package/dist/esm/Context.d.ts +8 -0
  77. package/dist/esm/Context.d.ts.map +1 -0
  78. package/dist/esm/Context.js +9 -0
  79. package/dist/esm/FillHandle.d.ts +8 -0
  80. package/dist/esm/FillHandle.d.ts.map +1 -0
  81. package/dist/{FillHandle.js → esm/FillHandle.js} +5 -11
  82. package/dist/esm/Grid.d.ts +558 -0
  83. package/dist/esm/Grid.d.ts.map +1 -0
  84. package/dist/esm/Grid.js +2451 -0
  85. package/dist/esm/GridLine.d.ts +5 -0
  86. package/dist/esm/GridLine.d.ts.map +1 -0
  87. package/dist/esm/GridLine.js +7 -0
  88. package/dist/esm/Image.d.ts +11 -0
  89. package/dist/esm/Image.d.ts.map +1 -0
  90. package/dist/esm/Image.js +53 -0
  91. package/dist/esm/MemoizedGrid.d.ts +49 -0
  92. package/dist/esm/MemoizedGrid.d.ts.map +1 -0
  93. package/dist/esm/MemoizedGrid.js +98 -0
  94. package/dist/esm/Selection.d.ts +5 -0
  95. package/dist/esm/Selection.d.ts.map +1 -0
  96. package/dist/esm/Selection.js +7 -0
  97. package/dist/esm/helpers.d.ts +281 -0
  98. package/dist/esm/helpers.d.ts.map +1 -0
  99. package/dist/esm/helpers.js +1260 -0
  100. package/dist/esm/hooks/useCopyPaste.d.ts +53 -0
  101. package/dist/esm/hooks/useCopyPaste.d.ts.map +1 -0
  102. package/dist/{hooks → esm/hooks}/useCopyPaste.js +40 -46
  103. package/dist/esm/hooks/useEditable.d.ts +253 -0
  104. package/dist/esm/hooks/useEditable.d.ts.map +1 -0
  105. package/dist/esm/hooks/useEditable.js +482 -0
  106. package/dist/esm/hooks/useFilter.d.ts +69 -0
  107. package/dist/esm/hooks/useFilter.d.ts.map +1 -0
  108. package/dist/{hooks → esm/hooks}/useFilter.js +22 -42
  109. package/dist/esm/hooks/useImage.d.ts +13 -0
  110. package/dist/esm/hooks/useImage.d.ts.map +1 -0
  111. package/dist/esm/hooks/useImage.js +76 -0
  112. package/dist/esm/hooks/usePagination.d.ts +69 -0
  113. package/dist/esm/hooks/usePagination.d.ts.map +1 -0
  114. package/dist/esm/hooks/usePagination.js +47 -0
  115. package/dist/esm/hooks/useSizer.d.ts +114 -0
  116. package/dist/esm/hooks/useSizer.d.ts.map +1 -0
  117. package/dist/esm/hooks/useSizer.js +176 -0
  118. package/dist/esm/hooks/useTooltip.d.ts +43 -0
  119. package/dist/esm/hooks/useTooltip.d.ts.map +1 -0
  120. package/dist/esm/hooks/useTooltip.js +80 -0
  121. package/dist/esm/hooks/useUndo.d.ts +36 -0
  122. package/dist/esm/hooks/useUndo.d.ts.map +1 -0
  123. package/dist/{hooks → esm/hooks}/useUndo.js +16 -25
  124. package/dist/esm/index.d.ts +19 -0
  125. package/dist/esm/index.d.ts.map +1 -0
  126. package/dist/esm/index.js +17 -0
  127. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  128. package/dist/esm/types.d.ts +70 -0
  129. package/dist/esm/types.d.ts.map +1 -0
  130. package/dist/esm/types.js +68 -0
  131. package/dist/esm/utils.d.ts +9 -0
  132. package/dist/esm/utils.d.ts.map +1 -0
  133. package/dist/esm/utils.js +104 -0
  134. package/dist/esm/vitest.config.d.ts +3 -0
  135. package/dist/esm/vitest.config.d.ts.map +1 -0
  136. package/dist/esm/vitest.config.js +22 -0
  137. package/package.json +28 -29
  138. package/dist/Cell.d.ts +0 -23
  139. package/dist/Cell.js +0 -55
  140. package/dist/Cell.js.map +0 -1
  141. package/dist/CellOverlay.js +0 -116
  142. package/dist/CellOverlay.js.map +0 -1
  143. package/dist/FillHandle.js.map +0 -1
  144. package/dist/Grid.d.ts +0 -385
  145. package/dist/Grid.js +0 -1684
  146. package/dist/Grid.js.map +0 -1
  147. package/dist/GridLine.js +0 -13
  148. package/dist/GridLine.js.map +0 -1
  149. package/dist/Image.d.ts +0 -8
  150. package/dist/Image.js +0 -50
  151. package/dist/Image.js.map +0 -1
  152. package/dist/Selection.d.ts +0 -4
  153. package/dist/Selection.js +0 -9
  154. package/dist/Selection.js.map +0 -1
  155. package/dist/helpers.js +0 -1033
  156. package/dist/helpers.js.map +0 -1
  157. package/dist/hooks/useCopyPaste.js.map +0 -1
  158. package/dist/hooks/useEditable.js +0 -477
  159. package/dist/hooks/useEditable.js.map +0 -1
  160. package/dist/hooks/useFilter.js.map +0 -1
  161. package/dist/hooks/useImage.js +0 -42
  162. package/dist/hooks/useImage.js.map +0 -1
  163. package/dist/hooks/usePagination.js +0 -73
  164. package/dist/hooks/usePagination.js.map +0 -1
  165. package/dist/hooks/useSelection.d.ts +0 -175
  166. package/dist/hooks/useSelection.js +0 -982
  167. package/dist/hooks/useSelection.js.map +0 -1
  168. package/dist/hooks/useSizer.js +0 -150
  169. package/dist/hooks/useSizer.js.map +0 -1
  170. package/dist/hooks/useTooltip.js +0 -106
  171. package/dist/hooks/useTooltip.js.map +0 -1
  172. package/dist/hooks/useTouch.d.ts +0 -21
  173. package/dist/hooks/useTouch.js +0 -73
  174. package/dist/hooks/useTouch.js.map +0 -1
  175. package/dist/hooks/useUndo.js.map +0 -1
  176. package/dist/index.d.ts +0 -25
  177. package/dist/index.js +0 -61
  178. package/dist/index.js.map +0 -1
  179. package/dist/types.js.map +0 -1
  180. package/dist/utils.d.ts +0 -8
  181. package/dist/utils.js +0 -153
  182. package/dist/utils.js.map +0 -1
  183. package/src/Cell.tsx +0 -100
  184. package/src/CellOverlay.tsx +0 -191
  185. package/src/FillHandle.tsx +0 -37
  186. package/src/Grid.tsx +0 -2677
  187. package/src/GridLine.tsx +0 -23
  188. package/src/Image.tsx +0 -43
  189. package/src/Selection.tsx +0 -9
  190. package/src/helpers.ts +0 -1455
  191. package/src/hooks/useCopyPaste.ts +0 -265
  192. package/src/hooks/useEditable.tsx +0 -945
  193. package/src/hooks/useFilter.tsx +0 -233
  194. package/src/hooks/useImage.ts +0 -57
  195. package/src/hooks/usePagination.tsx +0 -153
  196. package/src/hooks/useSelection.ts +0 -1440
  197. package/src/hooks/useSizer.ts +0 -312
  198. package/src/hooks/useTooltip.tsx +0 -172
  199. package/src/hooks/useTouch.ts +0 -116
  200. package/src/hooks/useUndo.ts +0 -134
  201. package/src/index.tsx +0 -46
  202. package/src/tests/Grid.spec.tsx +0 -47
  203. package/src/tests/helpers.test.ts +0 -292
  204. package/src/tests/usePagination.test.ts +0 -28
  205. package/src/tests/useSelection.test.ts +0 -27
  206. package/src/tests/useUndo.test.ts +0 -73
  207. package/src/types.ts +0 -69
  208. package/src/utils.tsx +0 -287
@@ -1,233 +0,0 @@
1
- import React, { useMemo, useState, useCallback } from "react";
2
- import {
3
- CellInterface,
4
- GridRef,
5
- CellPosition,
6
- AreaProps,
7
- AreaStyle,
8
- } from "./../Grid";
9
- import { isNull } from "../helpers";
10
-
11
- export interface FilterView {
12
- bounds: AreaProps;
13
- filters?: Filter;
14
- style?: AreaStyle;
15
- title?: string;
16
- }
17
-
18
- export type Filter = Record<string, FilterDefinition>;
19
- export type FilterDefinition<T = string | number> = {
20
- condition?: FilterConditionDefinition<T>;
21
- equals?: T[];
22
- sort?: SortDirection;
23
- };
24
- export type FilterOperators = ContainsTextOperators | DataValidationOperator;
25
- export type FilterConditionDefinition<T = string | number> = {
26
- operator?: FilterOperators;
27
- values?: T[];
28
- };
29
- export type SortDirection = "asc" | "desc";
30
- export type DataValidationOperator =
31
- | "isEmpty"
32
- | "notIsEmpty"
33
- | "between"
34
- | "notBetween"
35
- | "equal"
36
- | "notEqual"
37
- | "greaterThan"
38
- | "lessThan"
39
- | "greaterThanOrEqual"
40
- | "lessThanOrEqual";
41
-
42
- export type ContainsTextOperators =
43
- | "containsText"
44
- | "notContainsText"
45
- | "containsBlanks"
46
- | "notContainsBlanks"
47
- | "containsErrors"
48
- | "notContainsErrors"
49
- | "startsWithText"
50
- | "endsWithText"
51
- | "equalText";
52
-
53
- export interface FilterProps {
54
- /**
55
- * Returns filter component
56
- */
57
- getFilterComponent?: (cell: CellInterface | null) => React.ElementType | null;
58
- /**
59
- * Access grid methods
60
- */
61
- gridRef: React.MutableRefObject<GridRef | null>;
62
- /**
63
- * Get value of a cell
64
- */
65
- getValue: (cell: CellInterface) => any;
66
- /**
67
- * Width of the filter panel
68
- */
69
- width?: number;
70
- offset?: number;
71
- frozenRows?: number;
72
- frozenColumns?: number;
73
- }
74
-
75
- export interface FilterResults {
76
- /**
77
- * Component to render filter
78
- */
79
- filterComponent: React.ReactNode;
80
- /**
81
- * Enable filter
82
- */
83
- showFilter: (
84
- cell: CellInterface,
85
- index: number,
86
- filterView: FilterView,
87
- filter?: FilterDefinition
88
- ) => void;
89
- /**
90
- * Hide filter component
91
- */
92
- hideFilter: () => void;
93
- }
94
-
95
- /* Default filter component */
96
- const getDefaultFilerComponent = (cell: CellInterface | null) => null;
97
-
98
- export interface FilterState {
99
- filterView: FilterView;
100
- filter?: FilterDefinition;
101
- index: number;
102
- }
103
-
104
- /**
105
- * Use filter hook
106
- * @param param0
107
- */
108
- const useFilter = ({
109
- getFilterComponent = getDefaultFilerComponent,
110
- gridRef,
111
- width = 220,
112
- offset = 20,
113
- getValue,
114
- frozenRows = 0,
115
- frozenColumns = 0,
116
- }: FilterProps): FilterResults => {
117
- const [filterCell, setFilterCell] = useState<CellInterface | null>(null);
118
- const [isFilterVisible, setIsFilterVisible] = useState(false);
119
- const [currentFilter, setCurrentFilter] = useState<FilterState | null>(null);
120
- const [position, setPosition] = useState<CellPosition>({
121
- x: 0,
122
- y: 0,
123
- });
124
- const FilterComponent = useMemo(() => {
125
- return getFilterComponent(filterCell);
126
- }, [filterCell]);
127
-
128
- /**
129
- * Show filter panel
130
- */
131
- const handleShowFilter = useCallback(
132
- (
133
- coords: CellInterface,
134
- index: number,
135
- filterView: FilterView,
136
- filter?: FilterDefinition
137
- ) => {
138
- if (!gridRef.current) return;
139
- /* Get actual coords for merged cells */
140
- coords = gridRef.current.getActualCellCoords(coords);
141
-
142
- /* Get scroll position */
143
- const scrollPosition = gridRef.current.getScrollPosition();
144
-
145
- /* Get cell position */
146
- const pos = gridRef.current.getCellOffsetFromCoords(coords);
147
-
148
- /* Check if its frozen */
149
- const isFrozenColumn = coords.columnIndex < frozenColumns;
150
- const isFrozenRow = coords.rowIndex < frozenRows;
151
-
152
- /* Set cell position */
153
- setPosition(() => {
154
- const left = pos.x as number;
155
- const top = pos.y as number;
156
- const cellWidth = pos.width as number;
157
- return {
158
- x:
159
- left +
160
- cellWidth -
161
- (isFrozenColumn ? 0 : scrollPosition.scrollLeft) <
162
- width
163
- ? left +
164
- cellWidth -
165
- offset -
166
- (isFrozenColumn ? 0 : scrollPosition.scrollLeft)
167
- : left +
168
- cellWidth -
169
- (isFrozenColumn ? 0 : scrollPosition.scrollLeft) -
170
- width,
171
- y: top - (isFrozenRow ? 0 : scrollPosition.scrollTop) + offset,
172
- };
173
- });
174
-
175
- /* Set filter cell */
176
- setFilterCell(coords);
177
-
178
- /* set current filter */
179
- setCurrentFilter({ filter, filterView, index });
180
-
181
- /* Show filter */
182
- showFilter();
183
- },
184
- [frozenRows, frozenColumns]
185
- );
186
-
187
- const hideFilter = useCallback(() => {
188
- setIsFilterVisible(false);
189
- }, []);
190
-
191
- const showFilter = useCallback(() => {
192
- setIsFilterVisible(true);
193
- }, []);
194
-
195
- const values = useMemo(() => {
196
- if (!filterCell || !currentFilter) return [];
197
- const { filterView } = currentFilter;
198
- const { columnIndex } = filterCell;
199
- const { bounds } = filterView;
200
- const filterValues = new Set();
201
- for (let i = bounds.top + 1; i <= bounds.bottom; i++) {
202
- const cell = { rowIndex: i, columnIndex };
203
- const text = getValue(cell);
204
- const value = isNull(text) ? "" : text;
205
- filterValues.add(value);
206
- }
207
- return Array.from(filterValues);
208
- }, [filterCell, currentFilter]);
209
-
210
- const filterComponent =
211
- isFilterVisible && FilterComponent ? (
212
- <FilterComponent
213
- position={position}
214
- width={width}
215
- values={values}
216
- index={currentFilter?.index}
217
- filterView={currentFilter?.filterView}
218
- filter={currentFilter?.filter}
219
- columnIndex={filterCell?.columnIndex}
220
- rowIndex={filterCell?.rowIndex}
221
- onRequestClose={hideFilter}
222
- onRequestShow={handleShowFilter}
223
- />
224
- ) : null;
225
-
226
- return {
227
- filterComponent,
228
- showFilter: handleShowFilter,
229
- hideFilter,
230
- };
231
- };
232
-
233
- export default useFilter;
@@ -1,57 +0,0 @@
1
- import { useState, useEffect } from "react";
2
-
3
- export interface UseImageProps {
4
- url: string;
5
- crossOrigin?: string;
6
- }
7
-
8
- export interface UseImageResults {
9
- image?: HTMLImageElement;
10
- width: number;
11
- height: number;
12
- status: string;
13
- }
14
-
15
- const useImage = ({ url, crossOrigin }: UseImageProps) => {
16
- const [state, setState] = useState<UseImageResults>(() => ({
17
- image: undefined,
18
- status: "loading",
19
- width: 0,
20
- height: 0,
21
- }));
22
-
23
- useEffect(() => {
24
- if (!url) return;
25
- var img = new Image();
26
-
27
- function onload() {
28
- setState({
29
- image: img,
30
- height: img.height,
31
- width: img.width,
32
- status: "loaded",
33
- });
34
- }
35
- function onerror() {
36
- setState((prev) => ({
37
- ...prev,
38
- image: undefined,
39
- status: "failed",
40
- }));
41
- }
42
- img.addEventListener("load", onload);
43
- img.addEventListener("error", onerror);
44
-
45
- crossOrigin && (img.crossOrigin = crossOrigin);
46
- img.src = url;
47
-
48
- return () => {
49
- img.removeEventListener("load", onload);
50
- img.removeEventListener("error", onerror);
51
- };
52
- }, [url, crossOrigin]);
53
-
54
- return state;
55
- };
56
-
57
- export default useImage;
@@ -1,153 +0,0 @@
1
- import React, { useState, useEffect } from "react";
2
-
3
- export interface PaginationProps {
4
- /**
5
- * No of items in each page
6
- */
7
- pageSize: number;
8
- /**
9
- * Initial page index. Start from 1
10
- */
11
- initialPage?: number;
12
- /**
13
- * Total number of rows
14
- */
15
- total: number;
16
- /**
17
- * Callback when page is changed
18
- */
19
- onChange?: (page: number) => void;
20
- /**
21
- * Pagination Component
22
- */
23
- component?:
24
- | React.FC<PaginationComponentProps>
25
- | React.ComponentClass<PaginationComponentProps>;
26
- }
27
-
28
- export type PaginationComponentProps = Omit<
29
- PaginationResults,
30
- "paginationComponent"
31
- >;
32
-
33
- export interface PaginationResults {
34
- /**
35
- * Current page number
36
- */
37
- currentPage: number;
38
- /**
39
- * Total pages
40
- */
41
- totalPages: number;
42
- /**
43
- * No of items in each page
44
- */
45
- pageSize: number;
46
- /**
47
- * Pagination component
48
- */
49
- paginationComponent: React.ReactNode;
50
- /**
51
- * Navigate to next page
52
- */
53
- nextPage: () => void;
54
- /**
55
- * Navigate to prev page
56
- */
57
- prevPage: () => void;
58
- /**
59
- * Navigate to first page
60
- */
61
- goToFirst: () => void;
62
- /**
63
- * Navigate to last page
64
- */
65
- goToLast: () => void;
66
- /**
67
- * Navigate to specific page
68
- */
69
- goToPage: (page: number) => void;
70
- }
71
-
72
- /**
73
- * Pagination hook
74
- * @param props
75
- */
76
- const usePagination = (props: PaginationProps): PaginationResults => {
77
- const {
78
- initialPage = 1,
79
- pageSize = 10,
80
- total = 0,
81
- onChange,
82
- component = PaginationComponent,
83
- } = props ?? {};
84
- const [currentPage, setCurrentPage] = useState<number>(initialPage);
85
- const totalPages = Math.ceil(total / pageSize);
86
- const nextPage = () =>
87
- setCurrentPage((prev) => Math.min(prev + 1, totalPages));
88
- const prevPage = () => setCurrentPage((prev) => Math.max(prev - 1, 1));
89
- const goToFirst = () => setCurrentPage(1);
90
- const goToLast = () => setCurrentPage(totalPages);
91
- const goToPage = (page: number) => setCurrentPage(page);
92
-
93
- useEffect(() => {
94
- onChange && onChange(currentPage);
95
- }, [currentPage]);
96
-
97
- const pageProps = {
98
- currentPage,
99
- totalPages,
100
- nextPage,
101
- prevPage,
102
- goToFirst,
103
- goToLast,
104
- goToPage,
105
- pageSize,
106
- };
107
-
108
- const paginationComponent = React.createElement(component, pageProps);
109
-
110
- return {
111
- paginationComponent,
112
- ...pageProps,
113
- };
114
- };
115
-
116
- const PaginationComponent: React.FC<PaginationComponentProps> = ({
117
- currentPage,
118
- goToFirst,
119
- goToLast,
120
- goToPage,
121
- totalPages,
122
- nextPage,
123
- prevPage,
124
- }) => {
125
- const pages = [];
126
- for (let i = 1; i <= totalPages; i++) {
127
- const isActive = currentPage === i;
128
- pages.push(
129
- <button onClick={() => goToPage(i)}>
130
- {isActive ? <strong>{i}</strong> : i}
131
- </button>
132
- );
133
- }
134
- return (
135
- <div>
136
- <button onClick={goToFirst} disabled={currentPage === 1}>
137
- First page
138
- </button>
139
- <button onClick={prevPage} disabled={currentPage === 1}>
140
- Prev page
141
- </button>
142
- {pages}
143
- <button onClick={nextPage} disabled={currentPage === totalPages}>
144
- Next page
145
- </button>
146
- <button onClick={goToLast} disabled={currentPage === totalPages}>
147
- Last page
148
- </button>
149
- </div>
150
- );
151
- };
152
-
153
- export default usePagination;