@rowsncolumns/grid 9.0.3 → 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.
- 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 -980
- 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 -1437
- 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
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
var react_1 = require("react");
|
|
5
|
+
// Global cache to share images across all component instances
|
|
6
|
+
var imageCache = new Map();
|
|
7
|
+
var loadImage = function (url, crossOrigin) {
|
|
8
|
+
var existing = imageCache.get(url);
|
|
9
|
+
if (existing) {
|
|
10
|
+
return existing;
|
|
11
|
+
}
|
|
12
|
+
var img = new Image();
|
|
13
|
+
img.crossOrigin = crossOrigin || "anonymous";
|
|
14
|
+
var entry = {
|
|
15
|
+
image: img,
|
|
16
|
+
status: "loading",
|
|
17
|
+
width: 0,
|
|
18
|
+
height: 0,
|
|
19
|
+
subscribers: new Set(),
|
|
20
|
+
};
|
|
21
|
+
imageCache.set(url, entry);
|
|
22
|
+
var onload = function () {
|
|
23
|
+
entry.status = "loaded";
|
|
24
|
+
entry.width = img.width;
|
|
25
|
+
entry.height = img.height;
|
|
26
|
+
entry.subscribers.forEach(function (callback) { return callback(entry); });
|
|
27
|
+
};
|
|
28
|
+
var onerror = function () {
|
|
29
|
+
entry.status = "failed";
|
|
30
|
+
entry.subscribers.forEach(function (callback) { return callback(entry); });
|
|
31
|
+
};
|
|
32
|
+
img.addEventListener("load", onload);
|
|
33
|
+
img.addEventListener("error", onerror);
|
|
34
|
+
img.src = url;
|
|
35
|
+
return entry;
|
|
36
|
+
};
|
|
37
|
+
var useImage = function (_a) {
|
|
38
|
+
var url = _a.url, crossOrigin = _a.crossOrigin;
|
|
39
|
+
var _b = tslib_1.__read((0, react_1.useState)(function () {
|
|
40
|
+
if (!url) {
|
|
41
|
+
return {
|
|
42
|
+
image: undefined,
|
|
43
|
+
status: "loading",
|
|
44
|
+
width: 0,
|
|
45
|
+
height: 0,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
var entry = loadImage(url, crossOrigin);
|
|
49
|
+
return {
|
|
50
|
+
image: entry.status === "loaded" ? entry.image : undefined,
|
|
51
|
+
status: entry.status,
|
|
52
|
+
width: entry.width,
|
|
53
|
+
height: entry.height,
|
|
54
|
+
};
|
|
55
|
+
}), 2), state = _b[0], setState = _b[1];
|
|
56
|
+
(0, react_1.useEffect)(function () {
|
|
57
|
+
if (!url)
|
|
58
|
+
return;
|
|
59
|
+
var entry = loadImage(url, crossOrigin);
|
|
60
|
+
var updateState = function (entry) {
|
|
61
|
+
setState({
|
|
62
|
+
image: entry.status === "loaded" ? entry.image : undefined,
|
|
63
|
+
status: entry.status,
|
|
64
|
+
width: entry.width,
|
|
65
|
+
height: entry.height,
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
// Subscribe to updates
|
|
69
|
+
entry.subscribers.add(updateState);
|
|
70
|
+
// If already loaded, update immediately
|
|
71
|
+
if (entry.status !== "loading") {
|
|
72
|
+
updateState(entry);
|
|
73
|
+
}
|
|
74
|
+
return function () {
|
|
75
|
+
entry.subscribers.delete(updateState);
|
|
76
|
+
};
|
|
77
|
+
}, [url, crossOrigin]);
|
|
78
|
+
return state;
|
|
79
|
+
};
|
|
80
|
+
exports.default = useImage;
|
|
@@ -5,9 +5,9 @@ export interface PaginationProps {
|
|
|
5
5
|
*/
|
|
6
6
|
pageSize: number;
|
|
7
7
|
/**
|
|
8
|
-
* Initial page index. Start from 1
|
|
8
|
+
* Initial current page index. Start from 1
|
|
9
9
|
*/
|
|
10
|
-
|
|
10
|
+
initialCurrentPage?: number;
|
|
11
11
|
/**
|
|
12
12
|
* Total number of rows
|
|
13
13
|
*/
|
|
@@ -66,3 +66,4 @@ export interface PaginationResults {
|
|
|
66
66
|
*/
|
|
67
67
|
declare const usePagination: (props: PaginationProps) => PaginationResults;
|
|
68
68
|
export default usePagination;
|
|
69
|
+
//# sourceMappingURL=usePagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePagination.d.ts","sourceRoot":"","sources":["../../../hooks/usePagination.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC;;OAEG;IACH,SAAS,CAAC,EACN,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAAC,GAClC,KAAK,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAC;CACpD;AAED,MAAM,MAAM,wBAAwB,GAAG,IAAI,CACzC,iBAAiB,EACjB,qBAAqB,CACtB,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,mBAAmB,EAAE,KAAK,CAAC,SAAS,CAAC;IACrC;;OAEG;IACH,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB;;OAEG;IACH,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB;;OAEG;IACH,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB;;OAEG;IACH,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB;;OAEG;IACH,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED;;;GAGG;AACH,QAAA,MAAM,aAAa,GAAI,OAAO,eAAe,KAAG,iBAsC/C,CAAC;AAuCF,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
var react_1 = tslib_1.__importStar(require("react"));
|
|
5
|
+
/**
|
|
6
|
+
* Pagination hook
|
|
7
|
+
* @param props
|
|
8
|
+
*/
|
|
9
|
+
var usePagination = function (props) {
|
|
10
|
+
var _a = props.initialCurrentPage, initialCurrentPage = _a === void 0 ? 1 : _a, _b = props.pageSize, pageSize = _b === void 0 ? 10 : _b, _c = props.total, total = _c === void 0 ? 0 : _c, onChange = props.onChange, _d = props.component, component = _d === void 0 ? PaginationComponent : _d;
|
|
11
|
+
var _e = tslib_1.__read((0, react_1.useState)(initialCurrentPage), 2), currentPage = _e[0], setCurrentPage = _e[1];
|
|
12
|
+
var totalPages = Math.ceil(total / pageSize);
|
|
13
|
+
var nextPage = function () {
|
|
14
|
+
return setCurrentPage(function (prev) { return Math.min(prev + 1, totalPages); });
|
|
15
|
+
};
|
|
16
|
+
var prevPage = function () { return setCurrentPage(function (prev) { return Math.max(prev - 1, 1); }); };
|
|
17
|
+
var goToFirst = function () { return setCurrentPage(1); };
|
|
18
|
+
var goToLast = function () { return setCurrentPage(totalPages); };
|
|
19
|
+
var goToPage = function (page) { return setCurrentPage(page); };
|
|
20
|
+
(0, react_1.useEffect)(function () {
|
|
21
|
+
onChange && onChange(currentPage);
|
|
22
|
+
}, [currentPage]);
|
|
23
|
+
var pageProps = {
|
|
24
|
+
currentPage: currentPage,
|
|
25
|
+
totalPages: totalPages,
|
|
26
|
+
nextPage: nextPage,
|
|
27
|
+
prevPage: prevPage,
|
|
28
|
+
goToFirst: goToFirst,
|
|
29
|
+
goToLast: goToLast,
|
|
30
|
+
goToPage: goToPage,
|
|
31
|
+
pageSize: pageSize,
|
|
32
|
+
};
|
|
33
|
+
var paginationComponent = react_1.default.createElement(component, pageProps);
|
|
34
|
+
return tslib_1.__assign({ paginationComponent: paginationComponent }, pageProps);
|
|
35
|
+
};
|
|
36
|
+
var PaginationComponent = function (_a) {
|
|
37
|
+
var currentPage = _a.currentPage, goToFirst = _a.goToFirst, goToLast = _a.goToLast, goToPage = _a.goToPage, totalPages = _a.totalPages, nextPage = _a.nextPage, prevPage = _a.prevPage;
|
|
38
|
+
var pages = [];
|
|
39
|
+
var _loop_1 = function (i) {
|
|
40
|
+
var isActive = currentPage === i;
|
|
41
|
+
pages.push(react_1.default.createElement("button", { onClick: function () { return goToPage(i); } }, isActive ? react_1.default.createElement("strong", null, i) : i));
|
|
42
|
+
};
|
|
43
|
+
for (var i = 1; i <= totalPages; i++) {
|
|
44
|
+
_loop_1(i);
|
|
45
|
+
}
|
|
46
|
+
return (react_1.default.createElement("div", null,
|
|
47
|
+
react_1.default.createElement("button", { onClick: goToFirst, disabled: currentPage === 1 }, "First page"),
|
|
48
|
+
react_1.default.createElement("button", { onClick: prevPage, disabled: currentPage === 1 }, "Prev page"),
|
|
49
|
+
pages,
|
|
50
|
+
react_1.default.createElement("button", { onClick: nextPage, disabled: currentPage === totalPages }, "Next page"),
|
|
51
|
+
react_1.default.createElement("button", { onClick: goToLast, disabled: currentPage === totalPages }, "Last page")));
|
|
52
|
+
};
|
|
53
|
+
exports.default = usePagination;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import {
|
|
3
|
-
import { HiddenType } from "./../helpers";
|
|
1
|
+
import type React from "react";
|
|
2
|
+
import type { GridRef, ViewPortProps } from "./../Grid";
|
|
3
|
+
import type { HiddenType } from "./../helpers";
|
|
4
4
|
export interface IProps {
|
|
5
5
|
/**
|
|
6
6
|
* Used to access grid functions
|
|
@@ -9,15 +9,17 @@ export interface IProps {
|
|
|
9
9
|
/**
|
|
10
10
|
* Value getter for a cell
|
|
11
11
|
*/
|
|
12
|
-
|
|
12
|
+
getTextFormat?: (rowIndex: number, columnIndex: number) => any;
|
|
13
13
|
/**
|
|
14
14
|
* Visible rows when the grid is first visible, Since we do not know how many rows can fit
|
|
15
15
|
*/
|
|
16
16
|
initialVisibleRows?: number;
|
|
17
|
+
initialVisibleColumns?: number;
|
|
17
18
|
/**
|
|
18
19
|
* Restrict column width by this number
|
|
19
20
|
*/
|
|
20
|
-
|
|
21
|
+
minColumnDimension?: number;
|
|
22
|
+
minRowDimension?: number;
|
|
21
23
|
/**
|
|
22
24
|
* Cell padding, used for width calculation
|
|
23
25
|
*/
|
|
@@ -49,14 +51,11 @@ export interface IProps {
|
|
|
49
51
|
* No of rows in teh grid
|
|
50
52
|
*/
|
|
51
53
|
rowCount?: number;
|
|
54
|
+
columnCount?: number;
|
|
52
55
|
/**
|
|
53
56
|
* Enable autoresize
|
|
54
57
|
*/
|
|
55
58
|
autoResize?: boolean;
|
|
56
|
-
/**
|
|
57
|
-
* Map of index to size
|
|
58
|
-
*/
|
|
59
|
-
columnSizes?: SizeType;
|
|
60
59
|
/**
|
|
61
60
|
* Hidden rows
|
|
62
61
|
*/
|
|
@@ -69,6 +68,7 @@ export interface IProps {
|
|
|
69
68
|
* Number of frozen rows
|
|
70
69
|
*/
|
|
71
70
|
frozenRows?: number;
|
|
71
|
+
frozenColumns?: number;
|
|
72
72
|
/**
|
|
73
73
|
* Current scaling factor
|
|
74
74
|
*/
|
|
@@ -76,27 +76,9 @@ export interface IProps {
|
|
|
76
76
|
/**
|
|
77
77
|
* Get text value
|
|
78
78
|
*/
|
|
79
|
-
|
|
79
|
+
getTextValue?: (rowIndex: number, columnIndex: number) => string | undefined;
|
|
80
80
|
}
|
|
81
81
|
export type ResizeStrategy = "lazy" | "full";
|
|
82
|
-
export interface AutoResizerResults {
|
|
83
|
-
/**
|
|
84
|
-
* Column width function consumed by the grid
|
|
85
|
-
*/
|
|
86
|
-
columnWidth?: ItemSizer;
|
|
87
|
-
/**
|
|
88
|
-
* Callback when viewport is changed
|
|
89
|
-
*/
|
|
90
|
-
onViewChange: (cells: ViewPortProps) => void;
|
|
91
|
-
/**
|
|
92
|
-
* Get column width based on resize strategy
|
|
93
|
-
*/
|
|
94
|
-
getColumnWidth: (columnIndex: number, scale?: number) => number;
|
|
95
|
-
/**
|
|
96
|
-
* Text size getter
|
|
97
|
-
*/
|
|
98
|
-
getTextMetrics: (text: string | number) => TextDimensions;
|
|
99
|
-
}
|
|
100
82
|
export interface TextDimensions {
|
|
101
83
|
width: number;
|
|
102
84
|
height: number;
|
|
@@ -104,6 +86,13 @@ export interface TextDimensions {
|
|
|
104
86
|
export type SizeType = {
|
|
105
87
|
[key: number]: number;
|
|
106
88
|
};
|
|
89
|
+
export interface TextFormat {
|
|
90
|
+
bold?: boolean;
|
|
91
|
+
spacing?: number;
|
|
92
|
+
fontSize?: number;
|
|
93
|
+
fontFamily?: string;
|
|
94
|
+
italic?: boolean;
|
|
95
|
+
}
|
|
107
96
|
/**
|
|
108
97
|
* Auto sizer hook
|
|
109
98
|
* @param param
|
|
@@ -111,5 +100,15 @@ export type SizeType = {
|
|
|
111
100
|
* TODO
|
|
112
101
|
* Dynamically resize columns after user has scrolled down/view port changed ?
|
|
113
102
|
*/
|
|
114
|
-
declare const useAutoSizer: ({ gridRef,
|
|
103
|
+
declare const useAutoSizer: ({ gridRef, getTextFormat, initialVisibleRows, initialVisibleColumns, cellSpacing, minColumnDimension, minRowDimension, timeout, resizeStrategy, rowCount, columnCount, resizeOnScroll, fontFamily, fontSize, fontWeight, fontStyle, autoResize, frozenRows, frozenColumns, scale, isHiddenRow, isHiddenColumn, getTextValue, }: IProps) => {
|
|
104
|
+
getColumnWidth: (columnIndex: number) => number;
|
|
105
|
+
getRowHeight: (rowIndex: number) => number;
|
|
106
|
+
onViewChange: (cells: ViewPortProps) => void;
|
|
107
|
+
getCellDimensions: (rowIndex: number, columnIndex: number, textOverride?: string) => {
|
|
108
|
+
width: number;
|
|
109
|
+
height: number;
|
|
110
|
+
};
|
|
111
|
+
columnWidth?: ((columnIndex: number) => number) | undefined;
|
|
112
|
+
};
|
|
115
113
|
export default useAutoSizer;
|
|
114
|
+
//# sourceMappingURL=useSizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSizer.d.ts","sourceRoot":"","sources":["../../../hooks/useSizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EAAiB,OAAO,EAAC,aAAa,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,KAAK,EACV,UAAU,EAAC,MAAM,cAAc,CAAC;AAOlC,MAAM,WAAW,MAAM;IACrB;;OAEG;IACH,OAAO,EAAE,KAAK,CAAC,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAChD;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,GAAG,CAAC;IAC/D;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,WAAW,EAAE,UAAU,CAAC;IACxB;;OAEG;IACH,cAAc,EAAE,UAAU,CAAC;IAC3B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAC9E;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAID;;;;;;GAMG;AACH,QAAA,MAAM,YAAY,GAAI,gUAwBnB,MAAM;kCAgFS,MAAM;6BA8CT,MAAM;0BA0CT,aAAa;kCA/HV,MAAM,eAAe,MAAM,iBAAiB,MAAM;;;;iCAuC/C,MAAM;CAuHvB,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
var react_1 = require("react");
|
|
5
|
+
var tiny_invariant_1 = tslib_1.__importDefault(require("tiny-invariant"));
|
|
6
|
+
var helpers_1 = require("./../helpers");
|
|
7
|
+
var defaultGetText = function (text) { return text; };
|
|
8
|
+
/**
|
|
9
|
+
* Auto sizer hook
|
|
10
|
+
* @param param
|
|
11
|
+
*
|
|
12
|
+
* TODO
|
|
13
|
+
* Dynamically resize columns after user has scrolled down/view port changed ?
|
|
14
|
+
*/
|
|
15
|
+
var useAutoSizer = function (_a) {
|
|
16
|
+
var gridRef = _a.gridRef, getTextFormat = _a.getTextFormat, _b = _a.initialVisibleRows, initialVisibleRows = _b === void 0 ? 20 : _b, _c = _a.initialVisibleColumns, initialVisibleColumns = _c === void 0 ? 20 : _c, _d = _a.cellSpacing, cellSpacing = _d === void 0 ? 10 : _d, _e = _a.minColumnDimension, minColumnDimension = _e === void 0 ? 60 : _e, _f = _a.minRowDimension, minRowDimension = _f === void 0 ? 60 : _f, _g = _a.timeout, timeout = _g === void 0 ? 300 : _g, _h = _a.resizeStrategy, resizeStrategy = _h === void 0 ? "lazy" : _h, rowCount = _a.rowCount, columnCount = _a.columnCount, _j = _a.resizeOnScroll, resizeOnScroll = _j === void 0 ? true : _j, _k = _a.fontFamily, fontFamily = _k === void 0 ? "Arial" : _k, _l = _a.fontSize, fontSize = _l === void 0 ? 12 : _l, _m = _a.fontWeight, fontWeight = _m === void 0 ? "" : _m, _o = _a.fontStyle, fontStyle = _o === void 0 ? "" : _o, _p = _a.autoResize, autoResize = _p === void 0 ? true : _p, _q = _a.frozenRows, frozenRows = _q === void 0 ? 0 : _q, _r = _a.frozenColumns, frozenColumns = _r === void 0 ? 0 : _r, _s = _a.scale, scale = _s === void 0 ? 1 : _s, isHiddenRow = _a.isHiddenRow, isHiddenColumn = _a.isHiddenColumn, _t = _a.getTextValue, getTextValue = _t === void 0 ? defaultGetText : _t;
|
|
17
|
+
(0, tiny_invariant_1.default)(!(resizeStrategy === "full" && rowCount === void 0), "Row count should be specified if resize stragtegy is full");
|
|
18
|
+
var autoSizer = (0, react_1.useRef)(helpers_1.autoSizerCanvas);
|
|
19
|
+
var _u = tslib_1.__read((0, react_1.useState)({
|
|
20
|
+
rowStartIndex: 0,
|
|
21
|
+
rowStopIndex: 0,
|
|
22
|
+
columnStartIndex: 0,
|
|
23
|
+
columnStopIndex: 0,
|
|
24
|
+
visibleRowStartIndex: 0,
|
|
25
|
+
visibleRowStopIndex: 0,
|
|
26
|
+
visibleColumnStartIndex: 0,
|
|
27
|
+
visibleColumnStopIndex: 0,
|
|
28
|
+
}), 2), viewport = _u[0], setViewport = _u[1];
|
|
29
|
+
var isMounted = (0, react_1.useRef)(false);
|
|
30
|
+
var handleResize = (0, react_1.useCallback)(function (_a) {
|
|
31
|
+
var rowIndex = _a.rowIndex, columnIndex = _a.columnIndex;
|
|
32
|
+
gridRef.current &&
|
|
33
|
+
gridRef.current.resetAfterIndices({ rowIndex: rowIndex, columnIndex: columnIndex });
|
|
34
|
+
}, []);
|
|
35
|
+
var debounceResizer = (0, react_1.useRef)(null);
|
|
36
|
+
(0, react_1.useEffect)(function () {
|
|
37
|
+
isMounted.current = true;
|
|
38
|
+
debounceResizer.current = (0, helpers_1.debounce)(handleResize, timeout);
|
|
39
|
+
}, []);
|
|
40
|
+
/* Update any styles, fonts if necessary */
|
|
41
|
+
(0, react_1.useEffect)(function () {
|
|
42
|
+
autoSizer.current.setFont({ fontFamily: fontFamily, fontSize: fontSize, fontWeight: fontWeight, fontStyle: fontStyle });
|
|
43
|
+
}, [fontFamily, fontSize, fontWeight, fontStyle]);
|
|
44
|
+
/**
|
|
45
|
+
* Get width of a single cell
|
|
46
|
+
*/
|
|
47
|
+
var getCellDimensions = (0, react_1.useCallback)(function (rowIndex, columnIndex, textOverride) {
|
|
48
|
+
var _a, _b, _c, _d;
|
|
49
|
+
var cell = { rowIndex: rowIndex, columnIndex: columnIndex };
|
|
50
|
+
var textFormat = getTextFormat === null || getTextFormat === void 0 ? void 0 : getTextFormat(cell.rowIndex, cell.columnIndex);
|
|
51
|
+
var text = textOverride !== null && textOverride !== void 0 ? textOverride : getTextValue(cell.rowIndex, cell.columnIndex);
|
|
52
|
+
var width = (_a = textFormat === null || textFormat === void 0 ? void 0 : textFormat.spacing) !== null && _a !== void 0 ? _a : 0;
|
|
53
|
+
var height = (_b = textFormat === null || textFormat === void 0 ? void 0 : textFormat.spacing) !== null && _b !== void 0 ? _b : 0;
|
|
54
|
+
/* Check if its null */
|
|
55
|
+
if (!(0, helpers_1.isNull)(text) && text !== void 0) {
|
|
56
|
+
/* Reset fonts */
|
|
57
|
+
autoSizer.current.reset();
|
|
58
|
+
if (textFormat) {
|
|
59
|
+
var isBold = textFormat.bold;
|
|
60
|
+
autoSizer.current.setFont({
|
|
61
|
+
fontWeight: isBold ? "bold" : "",
|
|
62
|
+
fontSize: ((_c = textFormat.fontSize) !== null && _c !== void 0 ? _c : fontSize) * scale,
|
|
63
|
+
fontFamily: (_d = textFormat.fontFamily) !== null && _d !== void 0 ? _d : fontFamily,
|
|
64
|
+
fontStyle: textFormat.italic ? "italic" : "",
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
var metrics = autoSizer.current.measureText(text);
|
|
68
|
+
if (metrics) {
|
|
69
|
+
width += Math.ceil(metrics.width) + cellSpacing;
|
|
70
|
+
height += Math.ceil(metrics.height) + cellSpacing;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return { width: width, height: height };
|
|
74
|
+
}, [scale, getTextFormat, cellSpacing, getTextValue]);
|
|
75
|
+
/**
|
|
76
|
+
* Calculate column width
|
|
77
|
+
*/
|
|
78
|
+
var getColumnWidth = (0, react_1.useCallback)(function (columnIndex) {
|
|
79
|
+
var _a = viewport !== null && viewport !== void 0 ? viewport : {}, _b = _a.rowStartIndex, rowStartIndex = _b === void 0 ? 0 : _b, _c = _a.rowStopIndex, rowStopIndex = _c === void 0 ? 0 : _c;
|
|
80
|
+
var visibleRows = resizeStrategy === "full"
|
|
81
|
+
? rowCount
|
|
82
|
+
: rowStopIndex || initialVisibleRows;
|
|
83
|
+
var start = resizeStrategy === "full" ? 0 : rowStartIndex;
|
|
84
|
+
var maxWidth = minColumnDimension;
|
|
85
|
+
/* Calculate for frozen rows */
|
|
86
|
+
for (var i = 0; i < frozenRows; i++) {
|
|
87
|
+
if (isHiddenRow(i)) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
var width = getCellDimensions(i, columnIndex).width;
|
|
91
|
+
if (width > maxWidth)
|
|
92
|
+
maxWidth = width;
|
|
93
|
+
}
|
|
94
|
+
/* Loop through all visible rows */
|
|
95
|
+
while (start < visibleRows) {
|
|
96
|
+
if (isHiddenRow(start)) {
|
|
97
|
+
start++;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
var width = getCellDimensions(start, columnIndex).width;
|
|
101
|
+
if (width > maxWidth)
|
|
102
|
+
maxWidth = width;
|
|
103
|
+
start++;
|
|
104
|
+
}
|
|
105
|
+
return maxWidth / scale;
|
|
106
|
+
}, [
|
|
107
|
+
viewport,
|
|
108
|
+
initialVisibleRows,
|
|
109
|
+
minColumnDimension,
|
|
110
|
+
frozenRows,
|
|
111
|
+
scale,
|
|
112
|
+
getCellDimensions,
|
|
113
|
+
isHiddenRow,
|
|
114
|
+
]);
|
|
115
|
+
/**
|
|
116
|
+
* Calculate Row height
|
|
117
|
+
*/
|
|
118
|
+
var getRowHeight = (0, react_1.useCallback)(function (rowIndex) {
|
|
119
|
+
var _a = viewport !== null && viewport !== void 0 ? viewport : {}, _b = _a.columnStartIndex, columnStartIndex = _b === void 0 ? 0 : _b, _c = _a.columnStopIndex, columnStopIndex = _c === void 0 ? 0 : _c;
|
|
120
|
+
var visibleColumns = resizeStrategy === "full"
|
|
121
|
+
? columnCount
|
|
122
|
+
: columnStopIndex || initialVisibleColumns;
|
|
123
|
+
var start = resizeStrategy === "full" ? 0 : columnStartIndex;
|
|
124
|
+
var maxHeight = minRowDimension;
|
|
125
|
+
/* Calculate for frozen rows */
|
|
126
|
+
for (var i = 0; i < frozenColumns; i++) {
|
|
127
|
+
if (isHiddenColumn(i)) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
var height = getCellDimensions(i, rowIndex).height;
|
|
131
|
+
if (height > maxHeight)
|
|
132
|
+
maxHeight = height;
|
|
133
|
+
}
|
|
134
|
+
/* Loop through all visible rows */
|
|
135
|
+
while (start < visibleColumns) {
|
|
136
|
+
if (isHiddenRow(start)) {
|
|
137
|
+
start++;
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
var height = getCellDimensions(rowIndex, start).height;
|
|
141
|
+
if (height > maxHeight)
|
|
142
|
+
maxHeight = height;
|
|
143
|
+
start++;
|
|
144
|
+
}
|
|
145
|
+
return maxHeight / scale;
|
|
146
|
+
}, [
|
|
147
|
+
viewport,
|
|
148
|
+
initialVisibleColumns,
|
|
149
|
+
minRowDimension,
|
|
150
|
+
isHiddenColumn,
|
|
151
|
+
frozenColumns,
|
|
152
|
+
scale,
|
|
153
|
+
getCellDimensions,
|
|
154
|
+
]);
|
|
155
|
+
var handleViewChange = (0, react_1.useCallback)(function (cells) {
|
|
156
|
+
/* Update viewport cells */
|
|
157
|
+
setViewport(cells);
|
|
158
|
+
/* Check if viewport has changed */
|
|
159
|
+
if (resizeStrategy === "full" ||
|
|
160
|
+
!resizeOnScroll ||
|
|
161
|
+
(cells.rowStartIndex === viewport.rowStartIndex &&
|
|
162
|
+
cells.columnStartIndex === viewport.columnStartIndex))
|
|
163
|
+
return;
|
|
164
|
+
if (gridRef.current) {
|
|
165
|
+
/* During first mount, column width is calculated. Do not re-calculate */
|
|
166
|
+
if (!isMounted.current)
|
|
167
|
+
return;
|
|
168
|
+
debounceResizer.current({
|
|
169
|
+
rowIndex: cells.rowStartIndex,
|
|
170
|
+
columnIndex: cells.columnStartIndex,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}, [resizeOnScroll, viewport, resizeStrategy]);
|
|
174
|
+
return tslib_1.__assign(tslib_1.__assign({}, (autoResize ? { columnWidth: getColumnWidth } : undefined)), { getColumnWidth: getColumnWidth, getRowHeight: getRowHeight, onViewChange: handleViewChange, getCellDimensions: getCellDimensions });
|
|
175
|
+
};
|
|
176
|
+
exports.default = useAutoSizer;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { CellInterface, GridRef } from "../Grid";
|
|
2
|
+
import type { CellInterface, GridRef } from "../Grid";
|
|
3
3
|
export interface TooltipOptions {
|
|
4
4
|
/**
|
|
5
5
|
* Tooltip component
|
|
@@ -40,3 +40,4 @@ export interface DefaultTooltipProps {
|
|
|
40
40
|
}
|
|
41
41
|
declare const useTooltip: ({ gridRef, getTooltip, }: TooltipOptions) => TooltipResults;
|
|
42
42
|
export default useTooltip;
|
|
43
|
+
//# sourceMappingURL=useTooltip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTooltip.d.ts","sourceRoot":"","sources":["../../../hooks/useTooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGtD,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,KAAK,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;IACtE;;OAEG;IACH,OAAO,EAAE,KAAK,CAAC,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,gBAAgB,EAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;IAC5C;;OAEG;IACH,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACtE;;OAEG;IACH,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACxE;AAED,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,CAAC,CAAC,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmCD,QAAA,MAAM,UAAU,GAAI,0BAGjB,cAAc,KAAG,cAmFnB,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
var react_1 = tslib_1.__importStar(require("react"));
|
|
5
|
+
var helpers_1 = require("../helpers");
|
|
6
|
+
var DefaultTooltipComponent = function (_a) {
|
|
7
|
+
var _b = _a.x, x = _b === void 0 ? 0 : _b, _c = _a.y, y = _c === void 0 ? 0 : _c, _d = _a.scrollLeft, scrollLeft = _d === void 0 ? 0 : _d, _e = _a.scrollTop, scrollTop = _e === void 0 ? 0 : _e, _f = _a.width, width = _f === void 0 ? 0 : _f, _g = _a.height, height = _g === void 0 ? 0 : _g;
|
|
8
|
+
var posX = x + width - scrollLeft;
|
|
9
|
+
var posY = y - scrollTop;
|
|
10
|
+
return (react_1.default.createElement("div", { style: {
|
|
11
|
+
position: "absolute",
|
|
12
|
+
left: 0,
|
|
13
|
+
top: 0,
|
|
14
|
+
transform: "translate(".concat(posX, "px, ").concat(posY, "px)"),
|
|
15
|
+
maxWidth: 200,
|
|
16
|
+
minWidth: 160,
|
|
17
|
+
background: "white",
|
|
18
|
+
boxShadow: "0 4px 8px 3px rgba(60,64,67,.15)",
|
|
19
|
+
padding: 12,
|
|
20
|
+
borderRadius: 4,
|
|
21
|
+
fontSize: 13,
|
|
22
|
+
} }, x));
|
|
23
|
+
};
|
|
24
|
+
var getDefaultTooltip = function () { return DefaultTooltipComponent; };
|
|
25
|
+
var useTooltip = function (_a) {
|
|
26
|
+
var gridRef = _a.gridRef, _b = _a.getTooltip, getTooltip = _b === void 0 ? getDefaultTooltip : _b;
|
|
27
|
+
var _c = tslib_1.__read((0, react_1.useState)(null), 2), activeCell = _c[0], setActiveCell = _c[1];
|
|
28
|
+
var isTooltipActive = (0, react_1.useRef)(false);
|
|
29
|
+
var activeCellRef = (0, react_1.useRef)(activeCell);
|
|
30
|
+
var _d = tslib_1.__read((0, react_1.useState)({}), 2), tooltipPosition = _d[0], setTooltipPosition = _d[1];
|
|
31
|
+
var showTooltip = !!activeCell;
|
|
32
|
+
var TooltipComponent = (0, react_1.useMemo)(function () {
|
|
33
|
+
return getTooltip(activeCell);
|
|
34
|
+
}, [activeCell, getTooltip]);
|
|
35
|
+
var handleTooltipMouseEnter = (0, react_1.useCallback)(function () {
|
|
36
|
+
isTooltipActive.current = true;
|
|
37
|
+
}, []);
|
|
38
|
+
var handleTooltipMouseLeave = (0, react_1.useCallback)(function () {
|
|
39
|
+
isTooltipActive.current = false;
|
|
40
|
+
setActiveCell(null);
|
|
41
|
+
}, []);
|
|
42
|
+
var tooltipComponent = showTooltip && TooltipComponent ? (react_1.default.createElement(TooltipComponent, tslib_1.__assign({}, tooltipPosition, { onMouseEnter: handleTooltipMouseEnter, onMouseLeave: handleTooltipMouseLeave }))) : null;
|
|
43
|
+
var handleMouseMove = (0, react_1.useCallback)(function (e) {
|
|
44
|
+
if (!gridRef.current)
|
|
45
|
+
return;
|
|
46
|
+
var coords = gridRef.current.getCellCoordsFromOffset(e.clientX, e.clientY);
|
|
47
|
+
if (!coords)
|
|
48
|
+
return;
|
|
49
|
+
var rowIndex = coords.rowIndex, columnIndex = coords.columnIndex;
|
|
50
|
+
/* Exit if its the same cell */
|
|
51
|
+
if (activeCellRef.current &&
|
|
52
|
+
activeCellRef.current.rowIndex === rowIndex &&
|
|
53
|
+
activeCellRef.current.columnIndex === columnIndex)
|
|
54
|
+
return;
|
|
55
|
+
var pos = gridRef.current.getCellOffsetFromCoords(coords);
|
|
56
|
+
var scrollPosition = gridRef.current.getScrollPosition();
|
|
57
|
+
setTooltipPosition(tslib_1.__assign(tslib_1.__assign({}, pos), scrollPosition));
|
|
58
|
+
setActiveCell({ rowIndex: rowIndex, columnIndex: columnIndex });
|
|
59
|
+
}, []);
|
|
60
|
+
var handleMouseLeave = (0, react_1.useCallback)(function () {
|
|
61
|
+
if (isTooltipActive.current)
|
|
62
|
+
return;
|
|
63
|
+
setActiveCell(null);
|
|
64
|
+
}, []);
|
|
65
|
+
/* Raf throttler */
|
|
66
|
+
var mouseMoveThrottler = (0, react_1.useRef)(undefined);
|
|
67
|
+
var mouseLeaveThrottler = (0, react_1.useRef)(undefined);
|
|
68
|
+
(0, react_1.useEffect)(function () {
|
|
69
|
+
mouseMoveThrottler.current = (0, helpers_1.throttle)(handleMouseMove, 100);
|
|
70
|
+
mouseLeaveThrottler.current = (0, helpers_1.debounce)(handleMouseLeave, 2000);
|
|
71
|
+
}, []);
|
|
72
|
+
/* Update activecell ref */
|
|
73
|
+
(0, react_1.useEffect)(function () {
|
|
74
|
+
activeCellRef.current = activeCell;
|
|
75
|
+
}, [activeCell]);
|
|
76
|
+
return {
|
|
77
|
+
tooltipComponent: tooltipComponent,
|
|
78
|
+
onMouseMove: mouseMoveThrottler.current,
|
|
79
|
+
onMouseLeave: mouseLeaveThrottler.current,
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
exports.default = useTooltip;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from "react";
|
|
1
|
+
import type React from "react";
|
|
2
2
|
/**
|
|
3
3
|
* Spec: https://tools.ietf.org/html/rfc6902
|
|
4
4
|
*
|
|
@@ -33,3 +33,4 @@ export interface PatchInterface<T> {
|
|
|
33
33
|
*/
|
|
34
34
|
declare const useUndo: <T>(props?: UndoProps) => UndoManager;
|
|
35
35
|
export default useUndo;
|
|
36
|
+
//# sourceMappingURL=useUndo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUndo.d.ts","sourceRoot":"","sources":["../../../hooks/useUndo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;GAQG;AAEH,MAAM,WAAW,SAAS;IACxB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IAC5B,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,KAAK,IAAI,CAAC;IACrD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;CAC9D;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,cAAc,EAAE,CAAC,EAAE,CAAC;CACrB;AAED;;;GAGG;AACH,QAAA,MAAM,OAAO,GAAI,CAAC,EAAE,QAAO,SAAc,KAAG,WAsF3C,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
var react_1 = require("react");
|
|
5
|
+
var types_1 = require("../types");
|
|
6
|
+
/**
|
|
7
|
+
* Undo/Redo hook
|
|
8
|
+
* @param
|
|
9
|
+
*/
|
|
10
|
+
var useUndo = function (props) {
|
|
11
|
+
if (props === void 0) { props = {}; }
|
|
12
|
+
var enableGlobalKeyHandlers = props.enableGlobalKeyHandlers, onRedo = props.onRedo, onUndo = props.onUndo, identifier = props.identifier;
|
|
13
|
+
var undoStack = (0, react_1.useRef)([]);
|
|
14
|
+
var undoStackPointer = (0, react_1.useRef)(-1);
|
|
15
|
+
var _a = tslib_1.__read((0, react_1.useReducer)(function (s) { return s + 1; }, 0), 2), _ = _a[0], forceRender = _a[1];
|
|
16
|
+
(0, react_1.useEffect)(function () {
|
|
17
|
+
if (enableGlobalKeyHandlers)
|
|
18
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
19
|
+
return function () { return document.removeEventListener("keydown", handleKeyDown); };
|
|
20
|
+
}, [enableGlobalKeyHandlers]);
|
|
21
|
+
var handleKeyDown = (0, react_1.useCallback)(function (e) {
|
|
22
|
+
/* Is user focused on an input, textarea or select element */
|
|
23
|
+
var isMeta = e.metaKey || e.ctrlKey;
|
|
24
|
+
var isUndo = isMeta && e.which === types_1.KeyCodes.Z;
|
|
25
|
+
var isRedo = (e.shiftKey && isUndo) || e.which === types_1.KeyCodes.KEY_Y;
|
|
26
|
+
if (!isRedo && !isUndo)
|
|
27
|
+
return;
|
|
28
|
+
if (isRedo) {
|
|
29
|
+
handleRedo();
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
handleUndo();
|
|
33
|
+
}
|
|
34
|
+
}, []);
|
|
35
|
+
var handleUndo = (0, react_1.useCallback)(function () {
|
|
36
|
+
if (undoStackPointer.current < 0)
|
|
37
|
+
return;
|
|
38
|
+
var patches = undoStack.current[undoStackPointer.current].inversePatches;
|
|
39
|
+
undoStackPointer.current--;
|
|
40
|
+
onUndo && onUndo(patches);
|
|
41
|
+
forceRender();
|
|
42
|
+
}, []);
|
|
43
|
+
var handleRedo = (0, react_1.useCallback)(function () {
|
|
44
|
+
if (undoStackPointer.current === undoStack.current.length - 1)
|
|
45
|
+
return;
|
|
46
|
+
undoStackPointer.current++;
|
|
47
|
+
var patches = undoStack.current[undoStackPointer.current].patches;
|
|
48
|
+
onRedo && onRedo(patches);
|
|
49
|
+
forceRender();
|
|
50
|
+
}, []);
|
|
51
|
+
var addUndoable = (0, react_1.useCallback)(function (history) {
|
|
52
|
+
var patches = history.patches, inversePatches = history.inversePatches;
|
|
53
|
+
var pointer = ++undoStackPointer.current;
|
|
54
|
+
undoStack.current.length = pointer;
|
|
55
|
+
undoStack.current[pointer] = { patches: patches, inversePatches: inversePatches };
|
|
56
|
+
forceRender();
|
|
57
|
+
}, []);
|
|
58
|
+
/**
|
|
59
|
+
* Use for async update where you want to replace the last patch
|
|
60
|
+
*/
|
|
61
|
+
var replaceLastPatch = (0, react_1.useCallback)(function (patches, inversePatches) {
|
|
62
|
+
var _a, _b;
|
|
63
|
+
if (patches === void 0) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
var currentStack = undoStack.current;
|
|
67
|
+
var pointer = undoStackPointer.current;
|
|
68
|
+
var curPatches = currentStack[pointer];
|
|
69
|
+
if ((curPatches === null || curPatches === void 0 ? void 0 : curPatches.patches) === void 0) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
(_a = curPatches.patches).push.apply(_a, tslib_1.__spreadArray([], tslib_1.__read(patches), false));
|
|
73
|
+
if (inversePatches && (curPatches === null || curPatches === void 0 ? void 0 : curPatches.inversePatches)) {
|
|
74
|
+
(_b = curPatches.inversePatches).unshift.apply(_b, tslib_1.__spreadArray([], tslib_1.__read(inversePatches), false));
|
|
75
|
+
}
|
|
76
|
+
}, []);
|
|
77
|
+
return {
|
|
78
|
+
undo: handleUndo,
|
|
79
|
+
redo: handleRedo,
|
|
80
|
+
add: addUndoable,
|
|
81
|
+
replace: replaceLastPatch,
|
|
82
|
+
onKeyDown: enableGlobalKeyHandlers ? undefined : handleKeyDown,
|
|
83
|
+
canUndo: !(undoStackPointer.current < 0),
|
|
84
|
+
canRedo: !(undoStackPointer.current === undoStack.current.length - 1),
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
exports.default = useUndo;
|