@rowsncolumns/grid 9.0.4 → 13.2.33
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.
- package/LICENSE.md +100 -0
- package/Readme.md +53 -59
- package/dist/cjs/Cell.d.ts +35 -0
- package/dist/cjs/Cell.d.ts.map +1 -0
- package/dist/cjs/Cell.js +29 -0
- package/dist/{CellOverlay.d.ts → cjs/CellOverlay.d.ts} +5 -5
- package/dist/cjs/CellOverlay.d.ts.map +1 -0
- package/dist/cjs/CellOverlay.js +126 -0
- package/dist/cjs/Context.d.ts +8 -0
- package/dist/cjs/Context.d.ts.map +1 -0
- package/dist/cjs/Context.js +13 -0
- package/dist/{FillHandle.d.ts → cjs/FillHandle.d.ts} +2 -1
- package/dist/cjs/FillHandle.d.ts.map +1 -0
- package/dist/cjs/FillHandle.js +26 -0
- package/dist/cjs/Grid.d.ts +558 -0
- package/dist/cjs/Grid.d.ts.map +1 -0
- package/dist/cjs/Grid.js +2446 -0
- package/dist/{GridLine.d.ts → cjs/GridLine.d.ts} +2 -1
- package/dist/cjs/GridLine.d.ts.map +1 -0
- package/dist/cjs/GridLine.js +10 -0
- package/dist/cjs/Image.d.ts +11 -0
- package/dist/cjs/Image.d.ts.map +1 -0
- package/dist/cjs/Image.js +57 -0
- package/dist/cjs/MemoizedGrid.d.ts +49 -0
- package/dist/cjs/MemoizedGrid.d.ts.map +1 -0
- package/dist/cjs/MemoizedGrid.js +105 -0
- package/dist/cjs/Selection.d.ts +5 -0
- package/dist/cjs/Selection.d.ts.map +1 -0
- package/dist/cjs/Selection.js +10 -0
- package/dist/{helpers.d.ts → cjs/helpers.d.ts} +59 -39
- package/dist/cjs/helpers.d.ts.map +1 -0
- package/dist/cjs/helpers.js +1409 -0
- package/dist/{hooks → cjs/hooks}/useCopyPaste.d.ts +3 -2
- package/dist/cjs/hooks/useCopyPaste.d.ts.map +1 -0
- package/dist/cjs/hooks/useCopyPaste.js +230 -0
- package/dist/{hooks → cjs/hooks}/useEditable.d.ts +21 -8
- package/dist/cjs/hooks/useEditable.d.ts.map +1 -0
- package/dist/cjs/hooks/useEditable.js +491 -0
- package/dist/{hooks → cjs/hooks}/useFilter.d.ts +3 -2
- package/dist/cjs/hooks/useFilter.d.ts.map +1 -0
- package/dist/cjs/hooks/useFilter.js +97 -0
- package/dist/{hooks → cjs/hooks}/useImage.d.ts +1 -0
- package/dist/cjs/hooks/useImage.d.ts.map +1 -0
- package/dist/cjs/hooks/useImage.js +80 -0
- package/dist/{hooks → cjs/hooks}/usePagination.d.ts +3 -2
- package/dist/cjs/hooks/usePagination.d.ts.map +1 -0
- package/dist/cjs/hooks/usePagination.js +53 -0
- package/dist/{hooks → cjs/hooks}/useSizer.d.ts +28 -29
- package/dist/cjs/hooks/useSizer.d.ts.map +1 -0
- package/dist/cjs/hooks/useSizer.js +176 -0
- package/dist/{hooks → cjs/hooks}/useTooltip.d.ts +2 -1
- package/dist/cjs/hooks/useTooltip.d.ts.map +1 -0
- package/dist/cjs/hooks/useTooltip.js +82 -0
- package/dist/{hooks → cjs/hooks}/useUndo.d.ts +2 -1
- package/dist/cjs/hooks/useUndo.d.ts.map +1 -0
- package/dist/cjs/hooks/useUndo.js +87 -0
- package/dist/cjs/index.d.ts +19 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +29 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/{types.d.ts → cjs/types.d.ts} +8 -3
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/{types.js → cjs/types.js} +7 -8
- package/dist/cjs/utils.d.ts +9 -0
- package/dist/cjs/utils.d.ts.map +1 -0
- package/dist/cjs/utils.js +58 -0
- package/dist/cjs/vitest.config.d.ts +3 -0
- package/dist/cjs/vitest.config.d.ts.map +1 -0
- package/dist/cjs/vitest.config.js +24 -0
- package/dist/esm/Cell.d.ts +35 -0
- package/dist/esm/Cell.d.ts.map +1 -0
- package/dist/esm/Cell.js +24 -0
- package/dist/esm/CellOverlay.d.ts +21 -0
- package/dist/esm/CellOverlay.d.ts.map +1 -0
- package/dist/esm/CellOverlay.js +120 -0
- package/dist/esm/Context.d.ts +8 -0
- package/dist/esm/Context.d.ts.map +1 -0
- package/dist/esm/Context.js +9 -0
- package/dist/esm/FillHandle.d.ts +8 -0
- package/dist/esm/FillHandle.d.ts.map +1 -0
- package/dist/{FillHandle.js → esm/FillHandle.js} +5 -11
- package/dist/esm/Grid.d.ts +558 -0
- package/dist/esm/Grid.d.ts.map +1 -0
- package/dist/esm/Grid.js +2451 -0
- package/dist/esm/GridLine.d.ts +5 -0
- package/dist/esm/GridLine.d.ts.map +1 -0
- package/dist/esm/GridLine.js +7 -0
- package/dist/esm/Image.d.ts +11 -0
- package/dist/esm/Image.d.ts.map +1 -0
- package/dist/esm/Image.js +53 -0
- package/dist/esm/MemoizedGrid.d.ts +49 -0
- package/dist/esm/MemoizedGrid.d.ts.map +1 -0
- package/dist/esm/MemoizedGrid.js +98 -0
- package/dist/esm/Selection.d.ts +5 -0
- package/dist/esm/Selection.d.ts.map +1 -0
- package/dist/esm/Selection.js +7 -0
- package/dist/esm/helpers.d.ts +281 -0
- package/dist/esm/helpers.d.ts.map +1 -0
- package/dist/esm/helpers.js +1260 -0
- package/dist/esm/hooks/useCopyPaste.d.ts +53 -0
- package/dist/esm/hooks/useCopyPaste.d.ts.map +1 -0
- package/dist/{hooks → esm/hooks}/useCopyPaste.js +40 -46
- package/dist/esm/hooks/useEditable.d.ts +253 -0
- package/dist/esm/hooks/useEditable.d.ts.map +1 -0
- package/dist/esm/hooks/useEditable.js +482 -0
- package/dist/esm/hooks/useFilter.d.ts +69 -0
- package/dist/esm/hooks/useFilter.d.ts.map +1 -0
- package/dist/{hooks → esm/hooks}/useFilter.js +22 -42
- package/dist/esm/hooks/useImage.d.ts +13 -0
- package/dist/esm/hooks/useImage.d.ts.map +1 -0
- package/dist/esm/hooks/useImage.js +76 -0
- package/dist/esm/hooks/usePagination.d.ts +69 -0
- package/dist/esm/hooks/usePagination.d.ts.map +1 -0
- package/dist/esm/hooks/usePagination.js +47 -0
- package/dist/esm/hooks/useSizer.d.ts +114 -0
- package/dist/esm/hooks/useSizer.d.ts.map +1 -0
- package/dist/esm/hooks/useSizer.js +176 -0
- package/dist/esm/hooks/useTooltip.d.ts +43 -0
- package/dist/esm/hooks/useTooltip.d.ts.map +1 -0
- package/dist/esm/hooks/useTooltip.js +80 -0
- package/dist/esm/hooks/useUndo.d.ts +36 -0
- package/dist/esm/hooks/useUndo.d.ts.map +1 -0
- package/dist/{hooks → esm/hooks}/useUndo.js +16 -25
- package/dist/esm/index.d.ts +19 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +17 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/esm/types.d.ts +70 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +68 -0
- package/dist/esm/utils.d.ts +9 -0
- package/dist/esm/utils.d.ts.map +1 -0
- package/dist/esm/utils.js +104 -0
- package/dist/esm/vitest.config.d.ts +3 -0
- package/dist/esm/vitest.config.d.ts.map +1 -0
- package/dist/esm/vitest.config.js +22 -0
- package/package.json +28 -29
- package/dist/Cell.d.ts +0 -23
- package/dist/Cell.js +0 -55
- package/dist/Cell.js.map +0 -1
- package/dist/CellOverlay.js +0 -116
- package/dist/CellOverlay.js.map +0 -1
- package/dist/FillHandle.js.map +0 -1
- package/dist/Grid.d.ts +0 -385
- package/dist/Grid.js +0 -1684
- package/dist/Grid.js.map +0 -1
- package/dist/GridLine.js +0 -13
- package/dist/GridLine.js.map +0 -1
- package/dist/Image.d.ts +0 -8
- package/dist/Image.js +0 -50
- package/dist/Image.js.map +0 -1
- package/dist/Selection.d.ts +0 -4
- package/dist/Selection.js +0 -9
- package/dist/Selection.js.map +0 -1
- package/dist/helpers.js +0 -1033
- package/dist/helpers.js.map +0 -1
- package/dist/hooks/useCopyPaste.js.map +0 -1
- package/dist/hooks/useEditable.js +0 -477
- package/dist/hooks/useEditable.js.map +0 -1
- package/dist/hooks/useFilter.js.map +0 -1
- package/dist/hooks/useImage.js +0 -42
- package/dist/hooks/useImage.js.map +0 -1
- package/dist/hooks/usePagination.js +0 -73
- package/dist/hooks/usePagination.js.map +0 -1
- package/dist/hooks/useSelection.d.ts +0 -175
- package/dist/hooks/useSelection.js +0 -982
- package/dist/hooks/useSelection.js.map +0 -1
- package/dist/hooks/useSizer.js +0 -150
- package/dist/hooks/useSizer.js.map +0 -1
- package/dist/hooks/useTooltip.js +0 -106
- package/dist/hooks/useTooltip.js.map +0 -1
- package/dist/hooks/useTouch.d.ts +0 -21
- package/dist/hooks/useTouch.js +0 -73
- package/dist/hooks/useTouch.js.map +0 -1
- package/dist/hooks/useUndo.js.map +0 -1
- package/dist/index.d.ts +0 -25
- package/dist/index.js +0 -61
- package/dist/index.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils.d.ts +0 -8
- package/dist/utils.js +0 -153
- package/dist/utils.js.map +0 -1
- package/src/Cell.tsx +0 -100
- package/src/CellOverlay.tsx +0 -191
- package/src/FillHandle.tsx +0 -37
- package/src/Grid.tsx +0 -2677
- package/src/GridLine.tsx +0 -23
- package/src/Image.tsx +0 -43
- package/src/Selection.tsx +0 -9
- package/src/helpers.ts +0 -1455
- package/src/hooks/useCopyPaste.ts +0 -265
- package/src/hooks/useEditable.tsx +0 -945
- package/src/hooks/useFilter.tsx +0 -233
- package/src/hooks/useImage.ts +0 -57
- package/src/hooks/usePagination.tsx +0 -153
- package/src/hooks/useSelection.ts +0 -1440
- package/src/hooks/useSizer.ts +0 -312
- package/src/hooks/useTooltip.tsx +0 -172
- package/src/hooks/useTouch.ts +0 -116
- package/src/hooks/useUndo.ts +0 -134
- package/src/index.tsx +0 -46
- package/src/tests/Grid.spec.tsx +0 -47
- package/src/tests/helpers.test.ts +0 -292
- package/src/tests/usePagination.test.ts +0 -28
- package/src/tests/useSelection.test.ts +0 -27
- package/src/tests/useUndo.test.ts +0 -73
- package/src/types.ts +0 -69
- package/src/utils.tsx +0 -287
package/src/hooks/useFilter.tsx
DELETED
|
@@ -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;
|
package/src/hooks/useImage.ts
DELETED
|
@@ -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;
|