@elliemae/ds-pagination 2.3.1 → 3.0.0-alpha.3

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 (83) hide show
  1. package/dist/cjs/Pagination.js +61 -0
  2. package/dist/cjs/Pagination.js.map +7 -0
  3. package/dist/cjs/PaginationDataTestID.js +39 -0
  4. package/dist/cjs/PaginationDataTestID.js.map +7 -0
  5. package/dist/cjs/hooks/usePaginationSearch.js +60 -0
  6. package/dist/cjs/hooks/usePaginationSearch.js.map +7 -0
  7. package/dist/cjs/index.d.js +27 -0
  8. package/dist/cjs/index.d.js.map +7 -0
  9. package/dist/cjs/index.js +28 -0
  10. package/dist/cjs/index.js.map +7 -0
  11. package/dist/cjs/parts/PageNextButton.js +53 -0
  12. package/dist/cjs/parts/PageNextButton.js.map +7 -0
  13. package/dist/cjs/parts/PagePrevButton.js +49 -0
  14. package/dist/cjs/parts/PagePrevButton.js.map +7 -0
  15. package/dist/cjs/parts/PaginationContent.js +111 -0
  16. package/dist/cjs/parts/PaginationContent.js.map +7 -0
  17. package/dist/cjs/parts/Paginator.js +148 -0
  18. package/dist/cjs/parts/Paginator.js.map +7 -0
  19. package/dist/cjs/parts/PerPageSelector.js +106 -0
  20. package/dist/cjs/parts/PerPageSelector.js.map +7 -0
  21. package/dist/cjs/props.js +82 -0
  22. package/dist/cjs/props.js.map +7 -0
  23. package/dist/cjs/styled.js +130 -0
  24. package/dist/cjs/styled.js.map +7 -0
  25. package/dist/esm/Pagination.js +34 -0
  26. package/dist/esm/Pagination.js.map +7 -0
  27. package/dist/esm/PaginationDataTestID.js +10 -0
  28. package/dist/esm/PaginationDataTestID.js.map +7 -0
  29. package/{esm → dist/esm}/hooks/usePaginationSearch.js +16 -13
  30. package/dist/esm/hooks/usePaginationSearch.js.map +7 -0
  31. package/dist/esm/index.d.js +2 -0
  32. package/dist/esm/index.d.js.map +7 -0
  33. package/dist/esm/index.js +3 -0
  34. package/dist/esm/index.js.map +7 -0
  35. package/dist/esm/parts/PageNextButton.js +24 -0
  36. package/dist/esm/parts/PageNextButton.js.map +7 -0
  37. package/dist/esm/parts/PagePrevButton.js +20 -0
  38. package/dist/esm/parts/PagePrevButton.js.map +7 -0
  39. package/dist/esm/parts/PaginationContent.js +84 -0
  40. package/dist/esm/parts/PaginationContent.js.map +7 -0
  41. package/dist/esm/parts/Paginator.js +124 -0
  42. package/dist/esm/parts/Paginator.js.map +7 -0
  43. package/dist/esm/parts/PerPageSelector.js +77 -0
  44. package/dist/esm/parts/PerPageSelector.js.map +7 -0
  45. package/dist/esm/props.js +53 -0
  46. package/dist/esm/props.js.map +7 -0
  47. package/dist/esm/styled.js +106 -0
  48. package/dist/esm/styled.js.map +7 -0
  49. package/package.json +53 -45
  50. package/cjs/Pagination.js +0 -35
  51. package/cjs/PaginationDataTestID.js +0 -11
  52. package/cjs/hooks/usePaginationSearch.js +0 -32
  53. package/cjs/index.d.js +0 -2
  54. package/cjs/index.js +0 -10
  55. package/cjs/parts/PageNextButton.js +0 -33
  56. package/cjs/parts/PagePrevButton.js +0 -32
  57. package/cjs/parts/PaginationContent.js +0 -95
  58. package/cjs/parts/Paginator.js +0 -163
  59. package/cjs/parts/PerPageSelector.js +0 -110
  60. package/cjs/props.js +0 -53
  61. package/cjs/styled.js +0 -57
  62. package/esm/Pagination.js +0 -26
  63. package/esm/PaginationDataTestID.js +0 -7
  64. package/esm/index.d.js +0 -1
  65. package/esm/index.js +0 -1
  66. package/esm/parts/PageNextButton.js +0 -25
  67. package/esm/parts/PagePrevButton.js +0 -24
  68. package/esm/parts/PaginationContent.js +0 -85
  69. package/esm/parts/Paginator.js +0 -156
  70. package/esm/parts/PerPageSelector.js +0 -103
  71. package/esm/props.js +0 -48
  72. package/esm/styled.js +0 -40
  73. package/types/Pagination.d.ts +0 -5
  74. package/types/PaginationDataTestID.d.ts +0 -5
  75. package/types/hooks/usePaginationSearch.d.ts +0 -1
  76. package/types/index.d.ts +0 -1
  77. package/types/parts/PageNextButton.d.ts +0 -3
  78. package/types/parts/PagePrevButton.d.ts +0 -3
  79. package/types/parts/PaginationContent.d.ts +0 -3
  80. package/types/parts/Paginator.d.ts +0 -10
  81. package/types/parts/PerPageSelector.d.ts +0 -4
  82. package/types/props.d.ts +0 -20
  83. package/types/styled.d.ts +0 -10
@@ -1,28 +1,31 @@
1
- import 'core-js/modules/web.dom-collections.iterator.js';
2
- import { useState, useRef, useEffect, useCallback } from 'react';
3
-
1
+ import * as React from "react";
2
+ import { useCallback, useEffect, useRef, useState } from "react";
4
3
  const usePaginationSearch = (pageCount, actionRef) => {
5
- const [searchValue, setSearchValue] = useState('');
4
+ const [searchValue, setSearchValue] = useState("");
6
5
  const [shouldResetSearchValue, setShouldResetSearchValue] = useState(true);
7
6
  const timeoutRef = useRef(null);
8
7
  useEffect(() => {
9
- if (searchValue !== '' && Number.parseInt(searchValue, 10) <= pageCount) {
8
+ if (searchValue !== "" && Number.parseInt(searchValue, 10) <= pageCount) {
10
9
  actionRef.current.setActiveDescendant(searchValue);
11
10
  actionRef.current.scrollOptionIntoView(searchValue);
12
- } // eslint-disable-next-line react-hooks/exhaustive-deps
13
-
11
+ }
14
12
  }, [searchValue]);
15
- const onKeyDown = useCallback(e => {
16
- if (e.code.startsWith('Digit')) {
17
- if (shouldResetSearchValue) setSearchValue(e.key);else setSearchValue(prevValue => prevValue + e.key);
13
+ const onKeyDown = useCallback((e) => {
14
+ if (e.code.startsWith("Digit")) {
15
+ if (shouldResetSearchValue)
16
+ setSearchValue(e.key);
17
+ else
18
+ setSearchValue((prevValue) => prevValue + e.key);
18
19
  setShouldResetSearchValue(false);
19
20
  clearTimeout(timeoutRef.current);
20
21
  timeoutRef.current = setTimeout(() => {
21
22
  setShouldResetSearchValue(true);
22
- }, 1000);
23
+ }, 1e3);
23
24
  }
24
25
  }, [shouldResetSearchValue]);
25
26
  return onKeyDown;
26
27
  };
27
-
28
- export { usePaginationSearch };
28
+ export {
29
+ usePaginationSearch
30
+ };
31
+ //# sourceMappingURL=usePaginationSearch.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/hooks/usePaginationSearch.tsx"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport const usePaginationSearch = (\n pageCount: number,\n actionRef: React.MutableRefObject<any>,\n): React.KeyboardEventHandler => {\n const [searchValue, setSearchValue] = useState('');\n const [shouldResetSearchValue, setShouldResetSearchValue] = useState(true);\n\n const timeoutRef = useRef<NodeJS.Timeout>(null);\n\n useEffect(() => {\n if (searchValue !== '' && Number.parseInt(searchValue, 10) <= pageCount) {\n actionRef.current.setActiveDescendant(searchValue);\n actionRef.current.scrollOptionIntoView(searchValue);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchValue]);\n\n const onKeyDown = useCallback(\n (e) => {\n if (e.code.startsWith('Digit')) {\n if (shouldResetSearchValue) setSearchValue(e.key);\n else setSearchValue((prevValue) => prevValue + e.key);\n\n setShouldResetSearchValue(false);\n clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => {\n setShouldResetSearchValue(true);\n }, 1000);\n }\n },\n [shouldResetSearchValue],\n );\n\n return onKeyDown;\n};\n"],
5
+ "mappings": "AAAA;ACAA;AAEO,MAAM,sBAAsB,CACjC,WACA,cAC+B;AAC/B,QAAM,CAAC,aAAa,kBAAkB,SAAS;AAC/C,QAAM,CAAC,wBAAwB,6BAA6B,SAAS;AAErE,QAAM,aAAa,OAAuB;AAE1C,YAAU,MAAM;AACd,QAAI,gBAAgB,MAAM,OAAO,SAAS,aAAa,OAAO,WAAW;AACvE,gBAAU,QAAQ,oBAAoB;AACtC,gBAAU,QAAQ,qBAAqB;AAAA;AAAA,KAGxC,CAAC;AAEJ,QAAM,YAAY,YAChB,CAAC,MAAM;AACL,QAAI,EAAE,KAAK,WAAW,UAAU;AAC9B,UAAI;AAAwB,uBAAe,EAAE;AAAA;AACxC,uBAAe,CAAC,cAAc,YAAY,EAAE;AAEjD,gCAA0B;AAC1B,mBAAa,WAAW;AACxB,iBAAW,UAAU,WAAW,MAAM;AACpC,kCAA0B;AAAA,SACzB;AAAA;AAAA,KAGP,CAAC;AAGH,SAAO;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ import * as React from "react";
2
+ //# sourceMappingURL=index.d.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../scripts/build/transpile/react-shim.js"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n"],
5
+ "mappings": "AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ export * from "./Pagination";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../scripts/build/transpile/react-shim.js", "../../src/index.tsx"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "export * from './Pagination';\n"],
5
+ "mappings": "AAAA;ACAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,24 @@
1
+ import * as React from "react";
2
+ import React2 from "react";
3
+ import { ChevronRight } from "@elliemae/ds-icons";
4
+ import { PAGINATION_DATA_TESTID } from "../PaginationDataTestID";
5
+ import { PreviousNextPageButton } from "../styled";
6
+ const PageNextButton = ({
7
+ onNextPage,
8
+ canNextPage
9
+ }) => /* @__PURE__ */ React2.createElement(PreviousNextPageButton, {
10
+ onClick: () => {
11
+ if (canNextPage)
12
+ onNextPage();
13
+ },
14
+ disabled: !canNextPage,
15
+ buttonType: "raw",
16
+ "data-testid": PAGINATION_DATA_TESTID.NEXT_BUTTON,
17
+ HeaderComp: () => "Page"
18
+ }, /* @__PURE__ */ React2.createElement(ChevronRight, {
19
+ color: canNextPage ? ["brand-primary", "700"] : ["neutral", "500"]
20
+ }));
21
+ export {
22
+ PageNextButton
23
+ };
24
+ //# sourceMappingURL=PageNextButton.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/parts/PageNextButton.tsx"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable react/prop-types */\nimport React from 'react';\nimport { ChevronRight } from '@elliemae/ds-icons';\nimport { PAGINATION_DATA_TESTID } from '../PaginationDataTestID';\nimport { PreviousNextPageButton } from '../styled';\nimport { DSPaginationProps } from '../index.d';\n\nexport const PageNextButton: React.ComponentType<Required<Pick<DSPaginationProps, 'onNextPage' | 'canNextPage'>>> = ({\n onNextPage,\n canNextPage,\n}) => (\n <PreviousNextPageButton\n onClick={() => {\n if (canNextPage) onNextPage();\n }}\n disabled={!canNextPage}\n buttonType=\"raw\"\n data-testid={PAGINATION_DATA_TESTID.NEXT_BUTTON}\n HeaderComp={() => 'Page'}\n >\n <ChevronRight color={canNextPage ? ['brand-primary', '700'] : ['neutral', '500']} />\n </PreviousNextPageButton>\n);\n"],
5
+ "mappings": "AAAA;ACCA;AACA;AACA;AACA;AAGO,MAAM,iBAAuG,CAAC;AAAA,EACnH;AAAA,EACA;AAAA,MAEA,qCAAC,wBAAD;AAAA,EACE,SAAS,MAAM;AACb,QAAI;AAAa;AAAA;AAAA,EAEnB,UAAU,CAAC;AAAA,EACX,YAAW;AAAA,EACX,eAAa,uBAAuB;AAAA,EACpC,YAAY,MAAM;AAAA,GAElB,qCAAC,cAAD;AAAA,EAAc,OAAO,cAAc,CAAC,iBAAiB,SAAS,CAAC,WAAW;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ import React2 from "react";
3
+ import { ChevronLeft } from "@elliemae/ds-icons";
4
+ import { PAGINATION_DATA_TESTID } from "../PaginationDataTestID";
5
+ import { PreviousNextPageButton } from "../styled";
6
+ const PagePrevButton = ({ onPreviousPage, canPreviousPage }) => /* @__PURE__ */ React2.createElement(PreviousNextPageButton, {
7
+ onClick: () => {
8
+ if (canPreviousPage)
9
+ onPreviousPage();
10
+ },
11
+ disabled: !canPreviousPage,
12
+ buttonType: "raw",
13
+ "data-testid": PAGINATION_DATA_TESTID.PREVIOUS_BUTTON
14
+ }, /* @__PURE__ */ React2.createElement(ChevronLeft, {
15
+ color: canPreviousPage ? ["brand-primary", "700"] : ["neutral", "500"]
16
+ }));
17
+ export {
18
+ PagePrevButton
19
+ };
20
+ //# sourceMappingURL=PagePrevButton.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/parts/PagePrevButton.tsx"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable react/prop-types */\nimport React from 'react';\nimport { ChevronLeft } from '@elliemae/ds-icons';\nimport { PAGINATION_DATA_TESTID } from '../PaginationDataTestID';\nimport { PreviousNextPageButton } from '../styled';\nimport { DSPaginationProps } from '../index.d';\n\nexport const PagePrevButton: React.ComponentType<\n Required<Pick<DSPaginationProps, 'onPreviousPage' | 'canPreviousPage'>>\n> = ({ onPreviousPage, canPreviousPage }) => (\n <PreviousNextPageButton\n onClick={() => {\n if (canPreviousPage) onPreviousPage();\n }}\n disabled={!canPreviousPage}\n buttonType=\"raw\"\n data-testid={PAGINATION_DATA_TESTID.PREVIOUS_BUTTON}\n >\n <ChevronLeft color={canPreviousPage ? ['brand-primary', '700'] : ['neutral', '500']} />\n </PreviousNextPageButton>\n);\n"],
5
+ "mappings": "AAAA;ACCA;AACA;AACA;AACA;AAGO,MAAM,iBAET,CAAC,EAAE,gBAAgB,sBACrB,qCAAC,wBAAD;AAAA,EACE,SAAS,MAAM;AACb,QAAI;AAAiB;AAAA;AAAA,EAEvB,UAAU,CAAC;AAAA,EACX,YAAW;AAAA,EACX,eAAa,uBAAuB;AAAA,GAEpC,qCAAC,aAAD;AAAA,EAAa,OAAO,kBAAkB,CAAC,iBAAiB,SAAS,CAAC,WAAW;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,84 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __spreadValues = (a, b) => {
7
+ for (var prop in b || (b = {}))
8
+ if (__hasOwnProp.call(b, prop))
9
+ __defNormalProp(a, prop, b[prop]);
10
+ if (__getOwnPropSymbols)
11
+ for (var prop of __getOwnPropSymbols(b)) {
12
+ if (__propIsEnum.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ }
15
+ return a;
16
+ };
17
+ import * as React from "react";
18
+ import React2 from "react";
19
+ import { Grid } from "@elliemae/ds-grid";
20
+ import { useGetGlobalAttributes } from "@elliemae/ds-props-helpers";
21
+ import { PaginationContainer, PaginationSeparator, PaginationWrapper } from "../styled";
22
+ import PerPageSelector from "./PerPageSelector";
23
+ import Paginator from "./Paginator";
24
+ import { PAGINATION_DATA_TESTID } from "../PaginationDataTestID";
25
+ import { PagePrevButton } from "./PagePrevButton";
26
+ import { PageNextButton } from "./PageNextButton";
27
+ const PaginationContent = (props) => {
28
+ const {
29
+ pageIndex,
30
+ pageSize,
31
+ canPreviousPage,
32
+ canNextPage,
33
+ onPageSizeChange,
34
+ onNextPage,
35
+ onPreviousPage,
36
+ onPageChange,
37
+ pageCount,
38
+ showPerPageSelector,
39
+ pageDetails,
40
+ pageDetailsTitle,
41
+ perPageOptions,
42
+ maxPerPage,
43
+ perPageStep,
44
+ minPerPage,
45
+ width
46
+ } = props;
47
+ const globalAttributes = useGetGlobalAttributes(props);
48
+ return /* @__PURE__ */ React2.createElement(PaginationContainer, __spreadValues({
49
+ justifyContent: "center",
50
+ alignItems: "center",
51
+ width: width.toString(),
52
+ "data-testid": PAGINATION_DATA_TESTID.CONTAINER,
53
+ cols: ["minmax(auto, 80%)"]
54
+ }, globalAttributes), /* @__PURE__ */ React2.createElement(PaginationWrapper, null, showPerPageSelector && /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(PerPageSelector, {
55
+ pageSize,
56
+ onPageSizeChange,
57
+ perPageOptions,
58
+ maxPerPage,
59
+ perPageStep,
60
+ minPerPage
61
+ }), /* @__PURE__ */ React2.createElement(PaginationSeparator, {
62
+ mr: 24
63
+ })), /* @__PURE__ */ React2.createElement(Grid, {
64
+ mr: "32px",
65
+ alignItems: "center",
66
+ style: { gridAutoFlow: "column" }
67
+ }, /* @__PURE__ */ React2.createElement(PagePrevButton, {
68
+ canPreviousPage,
69
+ onPreviousPage
70
+ }), /* @__PURE__ */ React2.createElement(Paginator, {
71
+ pageCount,
72
+ pageIndex,
73
+ onPageChange,
74
+ pageDetails,
75
+ pageDetailsTitle
76
+ }), /* @__PURE__ */ React2.createElement(PageNextButton, {
77
+ canNextPage,
78
+ onNextPage
79
+ }))));
80
+ };
81
+ export {
82
+ PaginationContent
83
+ };
84
+ //# sourceMappingURL=PaginationContent.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/parts/PaginationContent.tsx"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable react/prop-types */\nimport React from 'react';\nimport { Grid } from '@elliemae/ds-grid';\nimport { useGetGlobalAttributes } from '@elliemae/ds-props-helpers';\nimport { PaginationContainer, PaginationSeparator, PaginationWrapper } from '../styled';\nimport PerPageSelector from './PerPageSelector';\nimport Paginator from './Paginator';\nimport { PAGINATION_DATA_TESTID } from '../PaginationDataTestID';\nimport { PagePrevButton } from './PagePrevButton';\nimport { PageNextButton } from './PageNextButton';\nimport { DSPaginationProps } from '../index.d';\n\nexport const PaginationContent: React.ComponentType<Required<DSPaginationProps>> = (props) => {\n const {\n pageIndex,\n pageSize,\n canPreviousPage,\n canNextPage,\n onPageSizeChange,\n onNextPage,\n onPreviousPage,\n onPageChange,\n pageCount,\n showPerPageSelector,\n pageDetails,\n pageDetailsTitle,\n perPageOptions,\n maxPerPage,\n perPageStep,\n minPerPage,\n width,\n } = props;\n\n const globalAttributes = useGetGlobalAttributes(props);\n\n return (\n <PaginationContainer\n justifyContent=\"center\"\n alignItems=\"center\"\n width={width.toString()}\n data-testid={PAGINATION_DATA_TESTID.CONTAINER}\n cols={['minmax(auto, 80%)']}\n {...globalAttributes}\n >\n <PaginationWrapper>\n {showPerPageSelector && (\n <>\n <PerPageSelector\n pageSize={pageSize}\n onPageSizeChange={onPageSizeChange}\n perPageOptions={perPageOptions}\n maxPerPage={maxPerPage}\n perPageStep={perPageStep}\n minPerPage={minPerPage}\n />\n <PaginationSeparator mr={24} />\n </>\n )}\n <Grid mr=\"32px\" alignItems=\"center\" style={{ gridAutoFlow: 'column' }}>\n <PagePrevButton canPreviousPage={canPreviousPage} onPreviousPage={onPreviousPage} />\n <Paginator\n pageCount={pageCount}\n pageIndex={pageIndex}\n onPageChange={onPageChange}\n pageDetails={pageDetails}\n pageDetailsTitle={pageDetailsTitle}\n />\n <PageNextButton canNextPage={canNextPage} onNextPage={onNextPage} />\n </Grid>\n </PaginationWrapper>\n </PaginationContainer>\n );\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;AAAA;ACCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGO,MAAM,oBAAsE,CAAC,UAAU;AAC5F,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAEJ,QAAM,mBAAmB,uBAAuB;AAEhD,SACE,qCAAC,qBAAD;AAAA,IACE,gBAAe;AAAA,IACf,YAAW;AAAA,IACX,OAAO,MAAM;AAAA,IACb,eAAa,uBAAuB;AAAA,IACpC,MAAM,CAAC;AAAA,KACH,mBAEJ,qCAAC,mBAAD,MACG,uBACC,4DACE,qCAAC,iBAAD;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MAEF,qCAAC,qBAAD;AAAA,IAAqB,IAAI;AAAA,OAG7B,qCAAC,MAAD;AAAA,IAAM,IAAG;AAAA,IAAO,YAAW;AAAA,IAAS,OAAO,EAAE,cAAc;AAAA,KACzD,qCAAC,gBAAD;AAAA,IAAgB;AAAA,IAAkC;AAAA,MAClD,qCAAC,WAAD;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MAEF,qCAAC,gBAAD;AAAA,IAAgB;AAAA,IAA0B;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,124 @@
1
+ import * as React from "react";
2
+ import React2, { useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
3
+ import { Checkmark, ChevronDown } from "@elliemae/ds-icons";
4
+ import { useOnElementResize } from "@elliemae/ds-utilities";
5
+ import { Grid } from "@elliemae/ds-grid";
6
+ import { DSDropdownMenuV2 } from "@elliemae/ds-dropdownmenu";
7
+ import { SimpleTruncatedTooltipText } from "@elliemae/ds-truncated-tooltip-text";
8
+ import {
9
+ InvisibleDetail,
10
+ PaginationBoldText,
11
+ PaginationDropdownButton,
12
+ PaginationSeparator
13
+ } from "../styled";
14
+ import { usePaginationSearch } from "../hooks/usePaginationSearch";
15
+ const Paginator = (props) => {
16
+ const { pageIndex, pageCount, onPageChange, pageDetails, pageDetailsTitle } = props;
17
+ const [isOpened, setIsOpened] = useState(false);
18
+ const btnRef = useRef(null);
19
+ const pageInfoRef = useRef(null);
20
+ const { width: btnWidth } = useOnElementResize(btnRef);
21
+ const { width: txtWidth } = useOnElementResize(pageInfoRef);
22
+ const options = useMemo(() => new Array(pageCount).fill(0).map((_, index) => {
23
+ const option = {
24
+ dsId: (index + 1).toString(),
25
+ label: (index + 1).toString(),
26
+ value: index + 1,
27
+ type: "single"
28
+ };
29
+ if (pageDetails?.length) {
30
+ option.render = () => /* @__PURE__ */ React2.createElement(Grid, {
31
+ cols: ["16px", `${txtWidth + 16}px`, "auto"],
32
+ gutter: "xxs",
33
+ alignItems: "center"
34
+ }, pageIndex === index ? /* @__PURE__ */ React2.createElement(Checkmark, {
35
+ size: "s",
36
+ color: ["brand-primary", "600"]
37
+ }) : /* @__PURE__ */ React2.createElement("div", null), /* @__PURE__ */ React2.createElement("span", null, index + 1), /* @__PURE__ */ React2.createElement("span", {
38
+ style: {
39
+ whiteSpace: "nowrap",
40
+ textOverflow: "ellipsis",
41
+ overflow: "hidden"
42
+ }
43
+ }, pageDetails[index]));
44
+ }
45
+ return option;
46
+ }), [pageCount, pageDetails, pageIndex, txtWidth]);
47
+ const actionRef = useRef({});
48
+ useEffect(() => {
49
+ if (isOpened) {
50
+ actionRef.current.setActiveDescendant((pageIndex + 1).toString());
51
+ actionRef.current.scrollOptionIntoView((pageIndex + 1).toString());
52
+ }
53
+ }, [isOpened]);
54
+ const [detailWidth, setDetailWidth] = useState(0);
55
+ useLayoutEffect(() => {
56
+ const invisibleDetails = [
57
+ ...document.body.querySelectorAll('[data-testid="ds-pagination-invisible-detail-for-width-calc"]')
58
+ ];
59
+ const maxWidth = invisibleDetails.reduce((acc, cur) => Math.max(acc, cur.getBoundingClientRect().width), 0);
60
+ setDetailWidth(maxWidth);
61
+ }, [pageDetails]);
62
+ const onKeyDown = usePaginationSearch(pageCount, actionRef);
63
+ return /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(PaginationSeparator, null), /* @__PURE__ */ React2.createElement(DSDropdownMenuV2, {
64
+ isOpened,
65
+ options,
66
+ selectedOptions: { [(pageIndex + 1).toString()]: true },
67
+ onOptionClick: (_, clickedOption) => {
68
+ onPageChange(clickedOption.value);
69
+ setIsOpened(false);
70
+ btnRef.current?.focus();
71
+ },
72
+ onClickOutside: () => {
73
+ setIsOpened(false);
74
+ btnRef.current?.focus();
75
+ },
76
+ customOffset: [-23, 2],
77
+ startPlacementPreference: "top-start",
78
+ actionRef,
79
+ onKeyDown,
80
+ minWidth: pageDetails.length !== 0 ? btnWidth + 23 : pageCount.toString().length * 6 + 90,
81
+ maxHeight: 300,
82
+ HeaderComp: () => pageDetailsTitle !== "" ? /* @__PURE__ */ React2.createElement(Grid, {
83
+ cols: [`${txtWidth + 50}px`, "8px", "auto"]
84
+ }, /* @__PURE__ */ React2.createElement("span", {
85
+ style: { marginLeft: "8px" }
86
+ }, "Page"), /* @__PURE__ */ React2.createElement(PaginationSeparator, {
87
+ height: "100%"
88
+ }), /* @__PURE__ */ React2.createElement("span", null, pageDetailsTitle)) : "Page"
89
+ }, /* @__PURE__ */ React2.createElement(PaginationDropdownButton, {
90
+ buttonType: "raw",
91
+ onClick: () => setIsOpened((prev) => !prev),
92
+ innerRef: btnRef
93
+ }, /* @__PURE__ */ React2.createElement(Grid, {
94
+ gutter: "xxs",
95
+ alignItems: "center",
96
+ cols: pageDetails.length !== 0 ? ["auto", "min-content", "minmax(0px, 70%)", "min-content"] : ["auto", "min-content"]
97
+ }, /* @__PURE__ */ React2.createElement(Grid, {
98
+ alignItems: "center",
99
+ gutter: "xxxs",
100
+ ref: pageInfoRef,
101
+ style: { gridAutoFlow: "column" }
102
+ }, /* @__PURE__ */ React2.createElement(PaginationBoldText, {
103
+ fontSize: "18px"
104
+ }, pageIndex + 1), " / ", pageCount), pageDetails.length !== 0 && /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(PaginationSeparator, {
105
+ height: "12px",
106
+ ml: "8px"
107
+ }), /* @__PURE__ */ React2.createElement(PaginationBoldText, {
108
+ fontSize: "13px",
109
+ w: detailWidth,
110
+ mr: "xxs",
111
+ display: "grid"
112
+ }, /* @__PURE__ */ React2.createElement(SimpleTruncatedTooltipText, {
113
+ value: pageDetails[pageIndex]
114
+ }, pageDetails[pageIndex]), pageDetails.map((pageDetail) => /* @__PURE__ */ React2.createElement(InvisibleDetail, {
115
+ "data-testid": "ds-pagination-invisible-detail-for-width-calc"
116
+ }, pageDetail)))), /* @__PURE__ */ React2.createElement(ChevronDown, {
117
+ color: ["brand-primary", "700"]
118
+ })))), /* @__PURE__ */ React2.createElement(PaginationSeparator, null));
119
+ };
120
+ var Paginator_default = Paginator;
121
+ export {
122
+ Paginator_default as default
123
+ };
124
+ //# sourceMappingURL=Paginator.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/parts/Paginator.tsx"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable react/prop-types */\nimport React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { Checkmark, ChevronDown } from '@elliemae/ds-icons';\nimport { useOnElementResize } from '@elliemae/ds-utilities';\nimport { Grid } from '@elliemae/ds-grid';\nimport { DSDropdownMenuV2 } from '@elliemae/ds-dropdownmenu';\nimport { SimpleTruncatedTooltipText } from '@elliemae/ds-truncated-tooltip-text';\nimport {\n InvisibleDetail,\n PaginationBoldText,\n PaginationDetail,\n PaginationDropdownButton,\n PaginationSeparator,\n} from '../styled';\nimport { usePaginationSearch } from '../hooks/usePaginationSearch';\n\ninterface PaginatorPropsT {\n pageIndex: number;\n pageCount: number;\n onPageChange: (page: number) => void;\n pageDetails: string[];\n pageDetailsTitle: string;\n}\n\nconst Paginator: React.ComponentType<PaginatorPropsT> = (props) => {\n const { pageIndex, pageCount, onPageChange, pageDetails, pageDetailsTitle } = props;\n\n const [isOpened, setIsOpened] = useState(false);\n\n const btnRef = useRef<HTMLButtonElement>(null);\n const pageInfoRef = useRef<HTMLDivElement>(null);\n\n const { width: btnWidth } = useOnElementResize(btnRef);\n const { width: txtWidth } = useOnElementResize(pageInfoRef);\n\n const options = useMemo(\n () =>\n new Array(pageCount).fill(0).map((_, index) => {\n const option: Record<string, unknown> = {\n dsId: (index + 1).toString(),\n label: (index + 1).toString(),\n value: index + 1,\n type: 'single',\n };\n if (pageDetails?.length) {\n option.render = () => (\n <Grid cols={['16px', `${txtWidth + 16}px`, 'auto']} gutter=\"xxs\" alignItems=\"center\">\n {pageIndex === index ? <Checkmark size=\"s\" color={['brand-primary', '600']} /> : <div />}\n <span>{index + 1}</span>\n <span\n style={{\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n }}\n >\n {pageDetails[index]}\n </span>\n </Grid>\n );\n }\n return option;\n }),\n [pageCount, pageDetails, pageIndex, txtWidth],\n );\n\n const actionRef = useRef<Record<string, (dsId: string) => void>>({});\n\n useEffect(() => {\n if (isOpened) {\n actionRef.current.setActiveDescendant((pageIndex + 1).toString());\n actionRef.current.scrollOptionIntoView((pageIndex + 1).toString());\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpened]);\n\n const [detailWidth, setDetailWidth] = useState(0);\n\n useLayoutEffect(() => {\n const invisibleDetails = [\n ...document.body.querySelectorAll('[data-testid=\"ds-pagination-invisible-detail-for-width-calc\"]'),\n ] as HTMLDivElement[];\n const maxWidth = invisibleDetails.reduce((acc, cur) => Math.max(acc, cur.getBoundingClientRect().width), 0);\n setDetailWidth(maxWidth);\n }, [pageDetails]);\n\n const onKeyDown = usePaginationSearch(pageCount, actionRef);\n\n return (\n <>\n <PaginationSeparator />\n <DSDropdownMenuV2\n isOpened={isOpened}\n options={options}\n selectedOptions={{ [(pageIndex + 1).toString()]: true }}\n onOptionClick={(_, clickedOption) => {\n onPageChange(clickedOption.value);\n setIsOpened(false);\n btnRef.current?.focus();\n }}\n onClickOutside={() => {\n setIsOpened(false);\n btnRef.current?.focus();\n }}\n customOffset={[-23, 2]}\n startPlacementPreference=\"top-start\"\n actionRef={actionRef}\n onKeyDown={onKeyDown}\n minWidth={pageDetails.length !== 0 ? btnWidth + 23 : pageCount.toString().length * 6 + 90}\n maxHeight={300}\n HeaderComp={() =>\n pageDetailsTitle !== '' ? (\n <Grid cols={[`${txtWidth + 50}px`, '8px', 'auto']}>\n <span style={{ marginLeft: '8px' }}>Page</span>\n <PaginationSeparator height=\"100%\" />\n <span>{pageDetailsTitle}</span>\n </Grid>\n ) : (\n 'Page'\n )\n }\n >\n <PaginationDropdownButton buttonType=\"raw\" onClick={() => setIsOpened((prev) => !prev)} innerRef={btnRef}>\n <Grid\n gutter=\"xxs\"\n alignItems=\"center\"\n cols={\n pageDetails.length !== 0\n ? ['auto', 'min-content', 'minmax(0px, 70%)', 'min-content']\n : ['auto', 'min-content']\n }\n >\n <Grid alignItems=\"center\" gutter=\"xxxs\" ref={pageInfoRef} style={{ gridAutoFlow: 'column' }}>\n <PaginationBoldText fontSize=\"18px\">{pageIndex + 1}</PaginationBoldText> / {pageCount}\n </Grid>\n {pageDetails.length !== 0 && (\n <>\n <PaginationSeparator height=\"12px\" ml=\"8px\" />\n <PaginationBoldText fontSize=\"13px\" w={detailWidth} mr=\"xxs\" display=\"grid\">\n <SimpleTruncatedTooltipText value={pageDetails[pageIndex]}>\n {pageDetails[pageIndex]}\n </SimpleTruncatedTooltipText>\n {pageDetails.map((pageDetail) => (\n <InvisibleDetail data-testid=\"ds-pagination-invisible-detail-for-width-calc\">\n {pageDetail}\n </InvisibleDetail>\n ))}\n </PaginationBoldText>\n </>\n )}\n <ChevronDown color={['brand-primary', '700']} />\n </Grid>\n </PaginationDropdownButton>\n </DSDropdownMenuV2>\n <PaginationSeparator />\n </>\n );\n};\n\nexport default Paginator;\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,77 @@
1
+ import * as React from "react";
2
+ import React2, { useEffect, useMemo, useRef, useState } from "react";
3
+ import memoize from "memoize-one";
4
+ import { range } from "@elliemae/ds-utilities";
5
+ import { DSDropdownMenuV2 } from "@elliemae/ds-dropdownmenu";
6
+ import { ChevronDown } from "@elliemae/ds-icons";
7
+ import { PaginationDropdownButton } from "../styled";
8
+ const generateOption = (value) => {
9
+ if (typeof value === "object") {
10
+ return value;
11
+ }
12
+ return {
13
+ dsId: value.toString(),
14
+ value,
15
+ label: value.toString(),
16
+ type: "single"
17
+ };
18
+ };
19
+ const getOptions = memoize((step, min, max) => {
20
+ const options = range(min, max + step, step).map(generateOption);
21
+ return min === 0 ? options.slice(1, options.length) : options;
22
+ });
23
+ const PerPageSelector = (props) => {
24
+ const [isOpened, setIsOpened] = useState(false);
25
+ const { pageSize, onPageSizeChange, perPageOptions, maxPerPage, perPageStep, minPerPage } = props;
26
+ const options = useMemo(() => {
27
+ if (perPageOptions)
28
+ return perPageOptions.map(generateOption);
29
+ return getOptions(perPageStep, minPerPage, maxPerPage);
30
+ }, [maxPerPage, minPerPage, perPageOptions, perPageStep]);
31
+ const actionRef = useRef({});
32
+ const btnRef = useRef(null);
33
+ useEffect(() => {
34
+ if (isOpened) {
35
+ actionRef.current.setActiveDescendant(pageSize.toString());
36
+ actionRef.current.scrollOptionIntoView(pageSize.toString());
37
+ }
38
+ }, [isOpened]);
39
+ const width = useMemo(() => {
40
+ const maxLength = options.reduce((acc, cur) => Math.max(acc, cur?.label?.length ?? 0), 0);
41
+ return maxLength * 6 + 90;
42
+ }, [options]);
43
+ return /* @__PURE__ */ React2.createElement(DSDropdownMenuV2, {
44
+ isOpened,
45
+ options,
46
+ selectedOptions: { [pageSize.toString()]: true },
47
+ onOptionClick: (_, clickedOption) => {
48
+ onPageSizeChange(clickedOption.value);
49
+ setIsOpened(false);
50
+ btnRef.current?.focus();
51
+ },
52
+ onClickOutside: () => {
53
+ setIsOpened(false);
54
+ btnRef.current?.focus();
55
+ },
56
+ customOffset: [10, 2],
57
+ startPlacementPreference: "top-start",
58
+ actionRef,
59
+ minWidth: width,
60
+ maxHeight: 300,
61
+ HeaderComp: () => "Per Page"
62
+ }, /* @__PURE__ */ React2.createElement("div", {
63
+ style: { marginLeft: "32px" }
64
+ }, /* @__PURE__ */ React2.createElement(PaginationDropdownButton, {
65
+ buttonType: "raw",
66
+ onClick: () => setIsOpened((prev) => !prev),
67
+ "aria-pressed": isOpened,
68
+ innerRef: btnRef
69
+ }, pageSize, " / page", /* @__PURE__ */ React2.createElement(ChevronDown, {
70
+ color: ["brand-primary", "700"]
71
+ }))));
72
+ };
73
+ var PerPageSelector_default = PerPageSelector;
74
+ export {
75
+ PerPageSelector_default as default
76
+ };
77
+ //# sourceMappingURL=PerPageSelector.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/parts/PerPageSelector.tsx"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable react/prop-types */\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport memoize from 'memoize-one';\nimport { range } from '@elliemae/ds-utilities';\nimport { DSDropdownMenuV2 } from '@elliemae/ds-dropdownmenu';\nimport { ChevronDown } from '@elliemae/ds-icons';\nimport { DSPaginationProps } from '../index.d';\nimport { PaginationDropdownButton } from '../styled';\n\nconst generateOption = (value: number | Record<string, unknown>) => {\n if (typeof value === 'object') {\n return value;\n }\n return {\n dsId: value.toString(),\n value,\n label: value.toString(),\n type: 'single',\n };\n};\n\nconst getOptions = memoize((step: number, min: number, max: number) => {\n const options = range(min, max + step, step).map(generateOption);\n return min === 0 ? options.slice(1, options.length) : options;\n});\n\nconst PerPageSelector: React.ComponentType<\n Required<\n Pick<\n DSPaginationProps,\n 'pageSize' | 'onPageSizeChange' | 'perPageOptions' | 'perPageStep' | 'minPerPage' | 'maxPerPage'\n >\n >\n> = (props) => {\n const [isOpened, setIsOpened] = useState(false);\n const { pageSize, onPageSizeChange, perPageOptions, maxPerPage, perPageStep, minPerPage } = props;\n\n const options = useMemo(() => {\n if (perPageOptions) return perPageOptions.map(generateOption);\n return getOptions(perPageStep, minPerPage, maxPerPage);\n }, [maxPerPage, minPerPage, perPageOptions, perPageStep]);\n\n const actionRef = useRef<Record<string, (dsId: string) => void>>({});\n const btnRef = useRef<HTMLButtonElement>(null);\n\n useEffect(() => {\n if (isOpened) {\n actionRef.current.setActiveDescendant(pageSize.toString());\n actionRef.current.scrollOptionIntoView(pageSize.toString());\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpened]);\n\n const width = useMemo(() => {\n const maxLength = options.reduce((acc, cur) => Math.max(acc, (cur?.label as string)?.length ?? 0), 0);\n return maxLength * 6 + 90;\n }, [options]);\n\n return (\n <DSDropdownMenuV2\n isOpened={isOpened}\n options={options}\n selectedOptions={{ [pageSize.toString()]: true }}\n onOptionClick={(_, clickedOption) => {\n onPageSizeChange(clickedOption.value);\n setIsOpened(false);\n btnRef.current?.focus();\n }}\n onClickOutside={() => {\n setIsOpened(false);\n btnRef.current?.focus();\n }}\n customOffset={[10, 2]}\n startPlacementPreference=\"top-start\"\n actionRef={actionRef}\n minWidth={width}\n maxHeight={300}\n HeaderComp={() => 'Per Page'}\n >\n <div style={{ marginLeft: '32px' }}>\n <PaginationDropdownButton\n buttonType=\"raw\"\n onClick={() => setIsOpened((prev) => !prev)}\n aria-pressed={isOpened}\n innerRef={btnRef}\n >\n {pageSize} / page\n <ChevronDown color={['brand-primary', '700']} />\n </PaginationDropdownButton>\n </div>\n </DSDropdownMenuV2>\n );\n};\n\nexport default PerPageSelector;\n"],
5
+ "mappings": "AAAA;ACCA;AACA;AACA;AACA;AACA;AAEA;AAEA,MAAM,iBAAiB,CAAC,UAA4C;AAClE,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA;AAET,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ;AAAA,IACA,OAAO,MAAM;AAAA,IACb,MAAM;AAAA;AAAA;AAIV,MAAM,aAAa,QAAQ,CAAC,MAAc,KAAa,QAAgB;AACrE,QAAM,UAAU,MAAM,KAAK,MAAM,MAAM,MAAM,IAAI;AACjD,SAAO,QAAQ,IAAI,QAAQ,MAAM,GAAG,QAAQ,UAAU;AAAA;AAGxD,MAAM,kBAOF,CAAC,UAAU;AACb,QAAM,CAAC,UAAU,eAAe,SAAS;AACzC,QAAM,EAAE,UAAU,kBAAkB,gBAAgB,YAAY,aAAa,eAAe;AAE5F,QAAM,UAAU,QAAQ,MAAM;AAC5B,QAAI;AAAgB,aAAO,eAAe,IAAI;AAC9C,WAAO,WAAW,aAAa,YAAY;AAAA,KAC1C,CAAC,YAAY,YAAY,gBAAgB;AAE5C,QAAM,YAAY,OAA+C;AACjE,QAAM,SAAS,OAA0B;AAEzC,YAAU,MAAM;AACd,QAAI,UAAU;AACZ,gBAAU,QAAQ,oBAAoB,SAAS;AAC/C,gBAAU,QAAQ,qBAAqB,SAAS;AAAA;AAAA,KAGjD,CAAC;AAEJ,QAAM,QAAQ,QAAQ,MAAM;AAC1B,UAAM,YAAY,QAAQ,OAAO,CAAC,KAAK,QAAQ,KAAK,IAAI,KAAM,KAAK,OAAkB,UAAU,IAAI;AACnG,WAAO,YAAY,IAAI;AAAA,KACtB,CAAC;AAEJ,SACE,qCAAC,kBAAD;AAAA,IACE;AAAA,IACA;AAAA,IACA,iBAAiB,GAAG,SAAS,aAAa;AAAA,IAC1C,eAAe,CAAC,GAAG,kBAAkB;AACnC,uBAAiB,cAAc;AAC/B,kBAAY;AACZ,aAAO,SAAS;AAAA;AAAA,IAElB,gBAAgB,MAAM;AACpB,kBAAY;AACZ,aAAO,SAAS;AAAA;AAAA,IAElB,cAAc,CAAC,IAAI;AAAA,IACnB,0BAAyB;AAAA,IACzB;AAAA,IACA,UAAU;AAAA,IACV,WAAW;AAAA,IACX,YAAY,MAAM;AAAA,KAElB,qCAAC,OAAD;AAAA,IAAK,OAAO,EAAE,YAAY;AAAA,KACxB,qCAAC,0BAAD;AAAA,IACE,YAAW;AAAA,IACX,SAAS,MAAM,YAAY,CAAC,SAAS,CAAC;AAAA,IACtC,gBAAc;AAAA,IACd,UAAU;AAAA,KAET,UAAS,WACV,qCAAC,aAAD;AAAA,IAAa,OAAO,CAAC,iBAAiB;AAAA;AAAA;AAOhD,IAAO,0BAAQ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,53 @@
1
+ import * as React from "react";
2
+ import { PropTypes } from "@elliemae/ds-props-helpers";
3
+ const emptyFunc = () => null;
4
+ const propTypes = {
5
+ pageCount: PropTypes.number.description("How many pages are there"),
6
+ pageIndex: PropTypes.number.description("Index of the current page, starting from 1").defaultValue(1),
7
+ canPreviousPage: PropTypes.bool.description("Whether the previous button is disabled or not").defaultValue(true),
8
+ canNextPage: PropTypes.bool.description("Whether the next button is disabled or not").defaultValue(true),
9
+ pageSize: PropTypes.number.description("The current page size").defaultValue(10),
10
+ showPerPageSelector: PropTypes.bool.description("Whether to show the page selector").defaultValue(true),
11
+ perPageOptions: PropTypes.arrayOf(PropTypes.oneOfType([
12
+ PropTypes.number,
13
+ PropTypes.shape({
14
+ dsId: PropTypes.string,
15
+ value: PropTypes.number,
16
+ label: PropTypes.string,
17
+ type: PropTypes.oneOf(["single"])
18
+ })
19
+ ])).description("The available options for page size").defaultValue([10]),
20
+ perPageStep: PropTypes.number.description("Step for the per page options").defaultValue(5),
21
+ minPerPage: PropTypes.number.description("Step for the per page options").defaultValue(0),
22
+ maxPerPage: PropTypes.number.description("Step for the per page options").defaultValue(100),
23
+ onPageSizeChange: PropTypes.func.description("Function invoked when the page size changes").defaultValue(() => null),
24
+ onPreviousPage: PropTypes.func.description("Function invoked when the previous button is pressed").defaultValue(() => null),
25
+ onPageChange: PropTypes.func.description("Function invoked when the page changes").defaultValue(() => null),
26
+ onNextPage: PropTypes.func.description("Function invoked when next button is pressed").defaultValue(() => null),
27
+ pageDetails: PropTypes.arrayOf(PropTypes.string).description("Details to provide for each page").defaultValue([]),
28
+ pageDetailsTitle: PropTypes.string.description("The title of the details (usually a column of your dataset)").defaultValue(""),
29
+ width: PropTypes.any.description("Width for the container of the pagination").defaultValue("100%")
30
+ };
31
+ const defaultProps = {
32
+ pageIndex: 1,
33
+ canPreviousPage: true,
34
+ canNextPage: true,
35
+ pageSize: 10,
36
+ showPerPageSelector: true,
37
+ perPageOptions: [10],
38
+ perPageStep: 5,
39
+ minPerPage: 0,
40
+ maxPerPage: 100,
41
+ onPageSizeChange: emptyFunc,
42
+ onPreviousPage: emptyFunc,
43
+ onNextPage: emptyFunc,
44
+ onPageChange: emptyFunc,
45
+ pageDetails: [],
46
+ pageDetailsTitle: "",
47
+ width: "100%"
48
+ };
49
+ export {
50
+ defaultProps,
51
+ propTypes
52
+ };
53
+ //# sourceMappingURL=props.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../scripts/build/transpile/react-shim.js", "../../src/props.tsx"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { PropTypes } from '@elliemae/ds-props-helpers';\nimport { WeakValidationMap } from 'react';\n\nconst emptyFunc = () => null;\n\nexport const propTypes = {\n pageCount: PropTypes.number.description('How many pages are there'),\n pageIndex: PropTypes.number.description('Index of the current page, starting from 1').defaultValue(1),\n canPreviousPage: PropTypes.bool.description('Whether the previous button is disabled or not').defaultValue(true),\n canNextPage: PropTypes.bool.description('Whether the next button is disabled or not').defaultValue(true),\n pageSize: PropTypes.number.description('The current page size').defaultValue(10),\n showPerPageSelector: PropTypes.bool.description('Whether to show the page selector').defaultValue(true),\n perPageOptions: PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.shape({\n dsId: PropTypes.string,\n value: PropTypes.number,\n label: PropTypes.string,\n type: PropTypes.oneOf(['single']),\n }),\n ]),\n )\n .description('The available options for page size')\n .defaultValue([10]),\n perPageStep: PropTypes.number.description('Step for the per page options').defaultValue(5),\n minPerPage: PropTypes.number.description('Step for the per page options').defaultValue(0),\n maxPerPage: PropTypes.number.description('Step for the per page options').defaultValue(100),\n onPageSizeChange: PropTypes.func.description('Function invoked when the page size changes').defaultValue(() => null),\n onPreviousPage: PropTypes.func\n .description('Function invoked when the previous button is pressed')\n .defaultValue(() => null),\n onPageChange: PropTypes.func.description('Function invoked when the page changes').defaultValue(() => null),\n onNextPage: PropTypes.func.description('Function invoked when next button is pressed').defaultValue(() => null),\n pageDetails: PropTypes.arrayOf(PropTypes.string).description('Details to provide for each page').defaultValue([]),\n pageDetailsTitle: PropTypes.string\n .description('The title of the details (usually a column of your dataset)')\n .defaultValue(''),\n width: PropTypes.any.description('Width for the container of the pagination').defaultValue('100%'),\n} as WeakValidationMap<unknown>;\n\nexport const defaultProps = {\n pageIndex: 1,\n canPreviousPage: true,\n canNextPage: true,\n pageSize: 10,\n showPerPageSelector: true,\n perPageOptions: [10],\n perPageStep: 5,\n minPerPage: 0,\n maxPerPage: 100,\n onPageSizeChange: emptyFunc,\n onPreviousPage: emptyFunc,\n onNextPage: emptyFunc,\n onPageChange: emptyFunc,\n pageDetails: [],\n pageDetailsTitle: '',\n width: '100%',\n};\n"],
5
+ "mappings": "AAAA;ACAA;AAGA,MAAM,YAAY,MAAM;AAEjB,MAAM,YAAY;AAAA,EACvB,WAAW,UAAU,OAAO,YAAY;AAAA,EACxC,WAAW,UAAU,OAAO,YAAY,8CAA8C,aAAa;AAAA,EACnG,iBAAiB,UAAU,KAAK,YAAY,kDAAkD,aAAa;AAAA,EAC3G,aAAa,UAAU,KAAK,YAAY,8CAA8C,aAAa;AAAA,EACnG,UAAU,UAAU,OAAO,YAAY,yBAAyB,aAAa;AAAA,EAC7E,qBAAqB,UAAU,KAAK,YAAY,qCAAqC,aAAa;AAAA,EAClG,gBAAgB,UAAU,QACxB,UAAU,UAAU;AAAA,IAClB,UAAU;AAAA,IACV,UAAU,MAAM;AAAA,MACd,MAAM,UAAU;AAAA,MAChB,OAAO,UAAU;AAAA,MACjB,OAAO,UAAU;AAAA,MACjB,MAAM,UAAU,MAAM,CAAC;AAAA;AAAA,MAI1B,YAAY,uCACZ,aAAa,CAAC;AAAA,EACjB,aAAa,UAAU,OAAO,YAAY,iCAAiC,aAAa;AAAA,EACxF,YAAY,UAAU,OAAO,YAAY,iCAAiC,aAAa;AAAA,EACvF,YAAY,UAAU,OAAO,YAAY,iCAAiC,aAAa;AAAA,EACvF,kBAAkB,UAAU,KAAK,YAAY,+CAA+C,aAAa,MAAM;AAAA,EAC/G,gBAAgB,UAAU,KACvB,YAAY,wDACZ,aAAa,MAAM;AAAA,EACtB,cAAc,UAAU,KAAK,YAAY,0CAA0C,aAAa,MAAM;AAAA,EACtG,YAAY,UAAU,KAAK,YAAY,gDAAgD,aAAa,MAAM;AAAA,EAC1G,aAAa,UAAU,QAAQ,UAAU,QAAQ,YAAY,oCAAoC,aAAa;AAAA,EAC9G,kBAAkB,UAAU,OACzB,YAAY,+DACZ,aAAa;AAAA,EAChB,OAAO,UAAU,IAAI,YAAY,6CAA6C,aAAa;AAAA;AAGtF,MAAM,eAAe;AAAA,EAC1B,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,gBAAgB,CAAC;AAAA,EACjB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,OAAO;AAAA;",
6
+ "names": []
7
+ }