@nypl/design-system-react-components 0.25.2 → 0.25.6
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/CHANGELOG.md +101 -0
- package/README.md +47 -11
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +4 -0
- package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +1 -0
- package/dist/components/Button/Button.d.ts +9 -8
- package/dist/components/Button/ButtonTypes.d.ts +2 -1
- package/dist/components/Card/Card.d.ts +36 -52
- package/dist/components/Card/CardTypes.d.ts +0 -15
- package/dist/components/Checkbox/Checkbox.d.ts +8 -9
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +2 -2
- package/dist/components/DatePicker/DatePicker.d.ts +36 -36
- package/dist/components/Fieldset/Fieldset.d.ts +25 -0
- package/dist/components/HelperErrorText/HelperErrorText.d.ts +4 -0
- package/dist/components/HorizontalRule/HorizontalRule.d.ts +10 -3
- package/dist/components/Icons/Icon.d.ts +4 -0
- package/dist/components/Icons/IconSvgs.d.ts +11 -0
- package/dist/components/Icons/IconTypes.d.ts +11 -0
- package/dist/components/Image/Image.d.ts +19 -9
- package/dist/components/Image/ImageTypes.d.ts +20 -0
- package/dist/components/Link/Link.d.ts +4 -0
- package/dist/components/List/List.d.ts +7 -1
- package/dist/components/Notification/Notification.d.ts +6 -4
- package/dist/components/Pagination/Pagination.d.ts +16 -13
- package/dist/components/Pagination/Pagination.stories.d.ts +2 -0
- package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +29 -0
- package/dist/components/ProgressIndicator/ProgressIndicatorTypes.d.ts +8 -0
- package/dist/components/RadioGroup/RadioGroup.d.ts +2 -2
- package/dist/components/SearchBar/SearchBar.d.ts +3 -3
- package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +18 -14
- package/dist/components/Slider/Slider.d.ts +57 -0
- package/dist/components/Tabs/Tabs.d.ts +1 -1
- package/dist/components/TextInput/TextInput.d.ts +10 -0
- package/dist/design-system-react-components.cjs.development.js +3058 -936
- package/dist/design-system-react-components.cjs.development.js.map +1 -1
- package/dist/design-system-react-components.cjs.production.min.js +1 -1
- package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
- package/dist/design-system-react-components.esm.js +3049 -921
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/index.d.ts +12 -6
- package/dist/resources.scss +180 -170
- package/dist/styles.css +1 -1
- package/dist/theme/components/breadcrumb.d.ts +9 -0
- package/dist/theme/components/button.d.ts +22 -8
- package/dist/theme/components/card.d.ts +168 -0
- package/dist/theme/components/checkbox.d.ts +5 -1
- package/dist/theme/components/checkboxGroup.d.ts +12 -0
- package/dist/theme/components/datePicker.d.ts +16 -0
- package/dist/theme/components/fieldset.d.ts +27 -0
- package/dist/theme/components/global.d.ts +23 -13
- package/dist/theme/components/globalMixins.d.ts +9 -1
- package/dist/theme/components/heading.d.ts +5 -0
- package/dist/theme/components/image.d.ts +31 -0
- package/dist/theme/components/label.d.ts +5 -3
- package/dist/theme/components/link.d.ts +4 -0
- package/dist/theme/components/list.d.ts +5 -1
- package/dist/theme/components/notification.d.ts +4 -14
- package/dist/theme/components/pagination.d.ts +19 -0
- package/dist/theme/components/progressIndicator.d.ts +50 -0
- package/dist/theme/components/radioGroup.d.ts +12 -0
- package/dist/theme/components/select.d.ts +11 -2
- package/dist/theme/components/skeletonLoader.d.ts +98 -0
- package/dist/theme/components/slider.d.ts +51 -0
- package/dist/theme/components/textInput.d.ts +8 -0
- package/dist/theme/foundations/breakpoints.d.ts +8 -8
- package/dist/theme/foundations/global.d.ts +6 -1
- package/package.json +72 -84
- package/src/__tests__/setup.ts +2 -2
- package/src/components/Accordion/Accordion.stories.mdx +39 -42
- package/src/components/Autosuggest/Autosuggest.stories.mdx +3 -3
- package/src/components/Autosuggest/Autosuggest.stories.tsx +1 -0
- package/src/components/Autosuggest/_Autosuggest.scss +5 -5
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +24 -8
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +33 -0
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +5 -1
- package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +1 -0
- package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +298 -1
- package/src/components/Button/Button.stories.mdx +15 -10
- package/src/components/Button/Button.test.tsx +21 -7
- package/src/components/Button/Button.tsx +18 -33
- package/src/components/Button/ButtonTypes.tsx +1 -0
- package/src/components/Button/__snapshots__/Button.test.tsx.snap +41 -10
- package/src/components/Card/Card.stories.mdx +296 -259
- package/src/components/Card/Card.test.tsx +156 -84
- package/src/components/Card/Card.tsx +195 -145
- package/src/components/Card/CardTypes.tsx +0 -17
- package/src/components/Card/__snapshots__/Card.test.tsx.snap +410 -0
- package/src/components/CardEdition/CardEdition.stories.tsx +15 -47
- package/src/components/CardEdition/_CardEdition.scss +22 -23
- package/src/components/Chakra/Box.stories.mdx +14 -15
- package/src/components/Chakra/Center.stories.mdx +15 -8
- package/src/components/Chakra/Grid.stories.mdx +16 -7
- package/src/components/Chakra/Stack.stories.mdx +35 -18
- package/src/components/Checkbox/Checkbox.stories.mdx +33 -11
- package/src/components/Checkbox/Checkbox.test.tsx +30 -3
- package/src/components/Checkbox/Checkbox.tsx +27 -27
- package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +90 -2
- package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +82 -2
- package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +1 -1
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +14 -15
- package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +44 -80
- package/src/components/DatePicker/DatePicker.stories.mdx +163 -62
- package/src/components/DatePicker/DatePicker.test.tsx +248 -65
- package/src/components/DatePicker/DatePicker.tsx +158 -130
- package/src/components/DatePicker/_DatePicker.scss +33 -67
- package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +818 -0
- package/src/components/Fieldset/Fieldset.stories.mdx +55 -0
- package/src/components/Fieldset/Fieldset.test.tsx +125 -0
- package/src/components/Fieldset/Fieldset.tsx +52 -0
- package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +68 -0
- package/src/components/Form/Form.stories.mdx +4 -5
- package/src/components/Form/Form.tsx +1 -0
- package/src/components/Grid/SimpleGrid.stories.mdx +32 -39
- package/src/components/Grid/SimpleGrid.test.tsx +4 -4
- package/src/components/Heading/Heading.stories.mdx +3 -4
- package/src/components/HelperErrorText/HelperErrorText.stories.mdx +1 -1
- package/src/components/HelperErrorText/HelperErrorText.tsx +5 -1
- package/src/components/Hero/HeroTypes.tsx +1 -0
- package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +7 -7
- package/src/components/HorizontalRule/HorizontalRule.stories.mdx +6 -5
- package/src/components/HorizontalRule/HorizontalRule.test.tsx +17 -0
- package/src/components/HorizontalRule/HorizontalRule.tsx +21 -4
- package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +5 -5
- package/src/components/Icons/Icon.stories.mdx +11 -3
- package/src/components/Icons/Icon.test.tsx +18 -0
- package/src/components/Icons/Icon.tsx +6 -0
- package/src/components/Icons/IconSvgs.tsx +22 -0
- package/src/components/Icons/IconTypes.tsx +11 -0
- package/src/components/Image/Image.stories.mdx +220 -0
- package/src/components/Image/Image.test.tsx +131 -29
- package/src/components/Image/Image.tsx +84 -56
- package/src/components/Image/ImageTypes.ts +22 -0
- package/src/components/Image/__snapshots__/Image.test.tsx.snap +190 -0
- package/src/components/Input/Input.stories.tsx +20 -64
- package/src/components/Input/_Input.scss +23 -14
- package/src/components/Link/Link.tsx +4 -1
- package/src/components/List/List.stories.mdx +1 -1
- package/src/components/List/List.tsx +11 -4
- package/src/components/Modal/Modal.stories.mdx +3 -3
- package/src/components/Modal/_Modal.scss +2 -2
- package/src/components/Notification/Notification.stories.mdx +1 -3
- package/src/components/Notification/Notification.tsx +24 -9
- package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +2 -0
- package/src/components/Pagination/Pagination.stories.mdx +26 -27
- package/src/components/Pagination/Pagination.stories.tsx +11 -16
- package/src/components/Pagination/Pagination.test.tsx +276 -146
- package/src/components/Pagination/Pagination.tsx +174 -154
- package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +285 -0
- package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +292 -0
- package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +225 -0
- package/src/components/ProgressIndicator/ProgressIndicator.tsx +126 -0
- package/src/components/ProgressIndicator/ProgressIndicatorTypes.ts +8 -0
- package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +357 -0
- package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +3 -0
- package/src/components/RadioGroup/RadioGroup.stories.mdx +3 -4
- package/src/components/RadioGroup/RadioGroup.tsx +11 -16
- package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +39 -71
- package/src/components/SearchBar/SearchBar.Test.tsx +66 -21
- package/src/components/SearchBar/SearchBar.stories.mdx +114 -10
- package/src/components/SearchBar/SearchBar.tsx +15 -5
- package/src/components/Select/SelectTypes.tsx +1 -0
- package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +28 -59
- package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +97 -177
- package/src/components/SkeletonLoader/SkeletonLoader.tsx +74 -71
- package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +739 -0
- package/src/components/Slider/Slider.stories.mdx +529 -0
- package/src/components/Slider/Slider.test.tsx +653 -0
- package/src/components/Slider/Slider.tsx +303 -0
- package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +1946 -0
- package/src/components/StyleGuide/Bidirectionality.stories.mdx +1 -1
- package/src/components/StyleGuide/Breakpoints.stories.mdx +21 -7
- package/src/components/StyleGuide/Buttons.stories.mdx +69 -15
- package/src/components/StyleGuide/ColorCard.tsx +0 -1
- package/src/components/StyleGuide/DesignTokens.stories.mdx +170 -0
- package/src/components/StyleGuide/Iconography.stories.mdx +51 -62
- package/src/components/Tabs/Tabs.tsx +5 -5
- package/src/components/Template/Template.stories.mdx +11 -16
- package/src/components/TextInput/TextInput.stories.mdx +1 -1
- package/src/components/TextInput/TextInput.tsx +23 -6
- package/src/components/TextInput/TextInputTypes.tsx +2 -0
- package/src/components/VideoPlayer/VideoPlayer.stories.mdx +2 -3
- package/src/docs/Chakra.stories.mdx +2 -2
- package/src/index.ts +20 -12
- package/src/resources.scss +5 -5
- package/src/styles/base/{_02-breakpoints.scss → _01-breakpoints.scss} +9 -10
- package/src/styles/base/{_03-mixins.scss → _02-mixins.scss} +16 -5
- package/src/styles/base/{_04-base.scss → _03-base.scss} +7 -2
- package/src/styles/base/{_05-focus.scss → _04-focus.scss} +0 -15
- package/src/styles/base/_place-holder.scss +14 -3
- package/src/styles/{03-space → space}/_space-inline.scss +14 -14
- package/src/styles/{03-space → space}/_space-inset.scss +10 -10
- package/src/styles/space/_space-stack.scss +116 -0
- package/src/styles.scss +13 -55
- package/src/theme/components/breadcrumb.ts +10 -0
- package/src/theme/components/button.ts +18 -12
- package/src/theme/components/card.ts +174 -0
- package/src/theme/components/checkbox.ts +7 -2
- package/src/theme/components/checkboxGroup.ts +8 -0
- package/src/theme/components/datePicker.ts +17 -0
- package/src/theme/components/fieldset.ts +18 -0
- package/src/theme/components/global.ts +26 -15
- package/src/theme/components/globalMixins.ts +9 -1
- package/src/theme/components/heading.ts +5 -0
- package/src/theme/components/image.ts +116 -0
- package/src/theme/components/label.ts +3 -10
- package/src/theme/components/link.ts +4 -0
- package/src/theme/components/list.ts +6 -3
- package/src/theme/components/notification.ts +12 -14
- package/src/theme/components/pagination.ts +20 -0
- package/src/theme/components/progressIndicator.ts +62 -0
- package/src/theme/components/radioGroup.ts +8 -0
- package/src/theme/components/select.ts +5 -2
- package/src/theme/components/skeletonLoader.ts +107 -0
- package/src/theme/components/slider.ts +79 -0
- package/src/theme/components/textInput.ts +2 -0
- package/src/theme/foundations/breakpoints.ts +8 -8
- package/src/theme/foundations/global.ts +6 -1
- package/src/theme/index.ts +22 -4
- package/src/utils/componentCategories.ts +4 -3
- package/dist/components/Image/Image.stories.d.ts +0 -18
- package/dist/theme/components/customCheckboxGroup.d.ts +0 -18
- package/dist/theme/components/customRadioGroup.d.ts +0 -18
- package/src/components/Button/_Button.scss +0 -32
- package/src/components/Card/_Card.scss +0 -308
- package/src/components/Image/Image.stories.tsx +0 -54
- package/src/components/Image/_Image.scss +0 -38
- package/src/components/Pagination/_Pagination.scss +0 -40
- package/src/components/SkeletonLoader/_SkeletonLoader.scss +0 -142
- package/src/styles/01-colors/_colors-brand.scss +0 -62
- package/src/styles/01-colors/_colors-utility.scss +0 -67
- package/src/styles/02-typography/_type-scale.css +0 -11
- package/src/styles/02-typography/_type-weight.css +0 -7
- package/src/styles/02-typography/_typefaces.css +0 -4
- package/src/styles/03-space/_space-stack.scss +0 -116
- package/src/styles/03-space/_space.css +0 -30
- package/src/styles/base/_card-grid.scss +0 -77
- package/src/styles/base/_typography.scss +0 -11
- package/src/theme/components/customCheckboxGroup.ts +0 -12
- package/src/theme/components/customRadioGroup.ts +0 -12
|
@@ -1,218 +1,238 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Box, useMultiStyleConfig } from "@chakra-ui/react";
|
|
2
3
|
|
|
3
4
|
import Link from "../Link/Link";
|
|
4
|
-
import
|
|
5
|
+
import List from "../List/List";
|
|
6
|
+
import { ListTypes } from "../List/ListTypes";
|
|
5
7
|
import { range } from "../../utils/utils";
|
|
8
|
+
import generateUUID from "../../helpers/generateUUID";
|
|
6
9
|
|
|
7
10
|
export interface PaginationProps {
|
|
8
|
-
/**
|
|
9
|
-
blockName?: string;
|
|
10
|
-
/** Additional className for use with BEM. See how to work with blockNames and BEM here: http://getbem.com/introduction/ */
|
|
11
|
+
/** Additional className. */
|
|
11
12
|
className?: string;
|
|
12
|
-
/**
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
/** The callback function that takes a page number and returns a string
|
|
14
|
+
* to use for a link's `href` attribute. This is used when the current
|
|
15
|
+
* page should refresh when navigating. */
|
|
16
|
+
getPageHref?: undefined | ((pageNumber: number) => string);
|
|
17
|
+
/** ID that other components can cross reference for accessibility purposes. */
|
|
18
|
+
id?: string;
|
|
16
19
|
/** The current page selected. */
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
|
|
20
|
-
/** The method to callback when an item is selected. Passes the selected page to the consuming app as an argument. */
|
|
20
|
+
initialPage: number;
|
|
21
|
+
/** The callback function called when an item is selected and the current
|
|
22
|
+
* page should not refresh. */
|
|
21
23
|
onPageChange?: (selected: number) => void;
|
|
24
|
+
/** The total number of pages. */
|
|
25
|
+
pageCount: number;
|
|
22
26
|
}
|
|
23
27
|
|
|
24
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* A component that provides a navigational list of page items.
|
|
30
|
+
*/
|
|
25
31
|
const Pagination: React.FC<PaginationProps> = (props: PaginationProps) => {
|
|
26
32
|
const {
|
|
27
|
-
blockName,
|
|
28
33
|
className,
|
|
29
|
-
|
|
30
|
-
pageCount,
|
|
31
|
-
currentPage = 1,
|
|
34
|
+
initialPage = 1,
|
|
32
35
|
getPageHref,
|
|
33
|
-
|
|
36
|
+
id = generateUUID(),
|
|
37
|
+
onPageChange = () => {},
|
|
38
|
+
pageCount,
|
|
34
39
|
} = props;
|
|
40
|
+
const [currentPage, setCurrentPage] = useState<number>(initialPage);
|
|
41
|
+
const styles = useMultiStyleConfig("Pagination", {});
|
|
42
|
+
const previousPageNumber = currentPage - 1;
|
|
43
|
+
const nextPageNumber = currentPage + 1;
|
|
35
44
|
|
|
36
|
-
// If there are 0 or 1
|
|
45
|
+
// If there are 0 or 1 page, the pagination should not show.
|
|
37
46
|
if (pageCount <= 1) {
|
|
38
47
|
return null;
|
|
39
48
|
}
|
|
40
|
-
|
|
41
49
|
if (getPageHref && onPageChange) {
|
|
42
50
|
console.warn(
|
|
43
|
-
"
|
|
51
|
+
"Props for both `getPageHref` and `onPageChange` are passed. Will default to using `getPageHref`."
|
|
44
52
|
);
|
|
45
53
|
}
|
|
46
54
|
|
|
55
|
+
// If `getPageHref` was passed, then links should go to a new page.
|
|
47
56
|
const changeUrls =
|
|
48
57
|
typeof getPageHref !== "undefined" && typeof getPageHref === "function";
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
onPageChange(selectedItem);
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);
|
|
63
|
-
if (currentPage === item) return;
|
|
64
|
-
|
|
65
|
-
// Invoke the callback with the new selected item.
|
|
66
|
-
runCallback(item);
|
|
58
|
+
/**
|
|
59
|
+
* This function is only called when clicking on a link should
|
|
60
|
+
* not update the URL or refresh the page.
|
|
61
|
+
*/
|
|
62
|
+
const selectPage = (e: Event, selectedPage: number) => {
|
|
63
|
+
e.preventDefault && e.preventDefault();
|
|
64
|
+
if (currentPage === selectedPage) return;
|
|
65
|
+
setCurrentPage(selectedPage);
|
|
66
|
+
onPageChange(selectedPage);
|
|
67
67
|
};
|
|
68
|
-
|
|
69
|
-
const previousPage = (
|
|
70
|
-
evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);
|
|
68
|
+
// Select the previous page.
|
|
69
|
+
const previousPage = (e: Event) => {
|
|
71
70
|
if (currentPage > 1) {
|
|
72
|
-
selectPage(
|
|
71
|
+
selectPage(e, previousPageNumber);
|
|
73
72
|
}
|
|
74
73
|
};
|
|
75
|
-
|
|
76
|
-
const nextPage = (
|
|
77
|
-
evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);
|
|
74
|
+
// Select the next page.
|
|
75
|
+
const nextPage = (e: Event) => {
|
|
78
76
|
if (currentPage < pageCount) {
|
|
79
|
-
selectPage(
|
|
77
|
+
selectPage(e, nextPageNumber);
|
|
80
78
|
}
|
|
81
79
|
};
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
80
|
+
/**
|
|
81
|
+
* All `Link` components have similar attributes but we need to differentiate
|
|
82
|
+
* between the "previous", "next", and regular number links.
|
|
83
|
+
* 1. If `getPageHref` is passed, this means that the page refreshes and the
|
|
84
|
+
* URL changes. In this case, the parent component returns the `href` URL
|
|
85
|
+
* and the `onClick` callback is undefined.
|
|
86
|
+
* 2. Otherwise, we stay on the same page by setting the `href` attribute to
|
|
87
|
+
* "#" and call the `onPageChange` prop through the `onClick` callback.
|
|
88
|
+
*/
|
|
89
|
+
const getLinkElement = (type: string, item?: number) => {
|
|
90
|
+
const isCurrentPage = currentPage === item;
|
|
91
|
+
// The current page link has different styles.
|
|
92
|
+
const currentStyles = isCurrentPage
|
|
93
|
+
? {
|
|
94
|
+
color: "ui.black",
|
|
95
|
+
pointerEvent: "none",
|
|
96
|
+
}
|
|
97
|
+
: {};
|
|
98
|
+
const allAttrs = {
|
|
99
|
+
items: {
|
|
100
|
+
href: changeUrls ? getPageHref(item) : "#",
|
|
101
|
+
attributes: {
|
|
102
|
+
"aria-label": `Page ${item}`,
|
|
103
|
+
"aria-current": isCurrentPage ? "page" : null,
|
|
104
|
+
onClick: changeUrls ? undefined : (e) => selectPage(e, item),
|
|
105
|
+
},
|
|
106
|
+
text: item,
|
|
107
|
+
},
|
|
108
|
+
previous: {
|
|
109
|
+
href: changeUrls ? getPageHref(previousPageNumber) : "#",
|
|
110
|
+
attributes: {
|
|
111
|
+
"aria-label": "Previous page",
|
|
112
|
+
onClick: changeUrls ? undefined : previousPage,
|
|
113
|
+
},
|
|
114
|
+
text: "Previous",
|
|
115
|
+
},
|
|
116
|
+
next: {
|
|
117
|
+
href: changeUrls ? getPageHref(nextPageNumber) : "#",
|
|
118
|
+
attributes: {
|
|
119
|
+
"aria-label": "Next page",
|
|
120
|
+
onClick: changeUrls ? undefined : nextPage,
|
|
121
|
+
},
|
|
122
|
+
text: "Next",
|
|
123
|
+
},
|
|
89
124
|
};
|
|
90
|
-
|
|
91
|
-
pageAttributes["aria-label"] = item ? item : null;
|
|
92
|
-
|
|
93
|
-
const pageClass = currentPage === item ? "selected" : null;
|
|
94
|
-
|
|
125
|
+
const linkAttrs = allAttrs[type];
|
|
95
126
|
return (
|
|
96
127
|
<Link
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
128
|
+
additionalStyles={{
|
|
129
|
+
...styles.link,
|
|
130
|
+
...currentStyles,
|
|
131
|
+
}}
|
|
132
|
+
attributes={linkAttrs.attributes}
|
|
133
|
+
href={linkAttrs.href}
|
|
134
|
+
id={`${id}-${linkAttrs.text}`}
|
|
100
135
|
>
|
|
101
|
-
{
|
|
136
|
+
{linkAttrs.text}
|
|
102
137
|
</Link>
|
|
103
138
|
);
|
|
104
139
|
};
|
|
105
140
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
141
|
+
/**
|
|
142
|
+
* This function returns an array of `li` elements with numbers based on the
|
|
143
|
+
* total pages that `Pagination` should display. When there are many pages to
|
|
144
|
+
* display, ellipsis are shown to signify that the intermediate page numbers
|
|
145
|
+
* are hidden.
|
|
146
|
+
* For a small number of pages, the array will be simple.
|
|
147
|
+
* For a large number of pages, the resulting array will be in the shape of:
|
|
148
|
+
* [
|
|
149
|
+
* 1, this always displays
|
|
150
|
+
* 2 or an ellipsis,
|
|
151
|
+
* a range of numbers in the middle of the total count,
|
|
152
|
+
* pageCount - 1 or an ellipsis,
|
|
153
|
+
* pageCount, the total number of pages
|
|
154
|
+
* ]
|
|
155
|
+
*/
|
|
156
|
+
const getPaginationNumbers = (selected: number) => {
|
|
157
|
+
// Where should the middle range of numbers start at?
|
|
158
|
+
const middleRangeStart = Math.max(
|
|
159
|
+
// Start at three if the current page is near the beginning.
|
|
160
|
+
3,
|
|
110
161
|
Math.min(
|
|
111
|
-
// If
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
162
|
+
// If the current page is in the middle, start the range
|
|
163
|
+
// one number before the current page.
|
|
164
|
+
selected - 1,
|
|
165
|
+
// If the current page is near the end, show the last five items.
|
|
166
|
+
pageCount - 4
|
|
115
167
|
)
|
|
116
168
|
);
|
|
117
|
-
|
|
118
|
-
const
|
|
119
|
-
//
|
|
169
|
+
// Where should the middle range of numbers end at?
|
|
170
|
+
const middleRangeEnd = Math.min(
|
|
171
|
+
// If the current page is near the end, end the range
|
|
172
|
+
// two place before the last page number.
|
|
120
173
|
pageCount - 2,
|
|
121
174
|
Math.max(
|
|
122
|
-
// If in the middle,
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
175
|
+
// If the current page is in the middle, end the range
|
|
176
|
+
// one number after the current page.
|
|
177
|
+
selected + 1,
|
|
178
|
+
// If the current page is near the end, show the first five items.
|
|
179
|
+
5
|
|
126
180
|
)
|
|
127
181
|
);
|
|
128
|
-
const
|
|
182
|
+
const itemList =
|
|
129
183
|
pageCount < 4
|
|
130
|
-
?
|
|
131
|
-
|
|
132
|
-
|
|
184
|
+
? // Get a short array with 2 or 3 items: [1, 2] or [1, 2, 3]
|
|
185
|
+
Array.from({ length: pageCount }, (_, i) => i + 1)
|
|
186
|
+
: // Otherwise, create the longer array of items.
|
|
187
|
+
[
|
|
188
|
+
// Always display the first page.
|
|
133
189
|
1,
|
|
134
|
-
// second item will
|
|
135
|
-
|
|
136
|
-
//
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
//
|
|
190
|
+
// The second item will be 2 or an ellipse.
|
|
191
|
+
middleRangeStart > 3 ? "ellipse-start" : 2,
|
|
192
|
+
// The middle range of page numbers to display.
|
|
193
|
+
// Add +1 to the end since range() doesn't include the last number.
|
|
194
|
+
...range(middleRangeStart, middleRangeEnd + 1),
|
|
195
|
+
// The next to last item will be the next to last
|
|
196
|
+
// number or an ellipse.
|
|
197
|
+
middleRangeEnd < pageCount - 2 ? "ellipse-end" : pageCount - 1,
|
|
198
|
+
// Always display the last page.
|
|
141
199
|
pageCount,
|
|
142
200
|
];
|
|
143
|
-
|
|
144
|
-
|
|
201
|
+
// If it's a number, render an `li` element with a link page item,
|
|
202
|
+
// otherwise return the `li` with the ellipse for a break.
|
|
203
|
+
const pageLiItems = itemList.map((item) => {
|
|
145
204
|
const itemElement =
|
|
146
|
-
typeof item === "number" ?
|
|
147
|
-
return
|
|
148
|
-
<li key={item} className={bem("item", modifiers, "pagination")}>
|
|
149
|
-
{itemElement}
|
|
150
|
-
</li>
|
|
151
|
-
);
|
|
205
|
+
typeof item === "number" ? getLinkElement("items", item) : "...";
|
|
206
|
+
return <li key={item}>{itemElement}</li>;
|
|
152
207
|
});
|
|
153
208
|
|
|
154
|
-
return
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
// When at the beginning, disable Previous. When at the end, disable Next.
|
|
158
|
-
const prevDisabled = currentPage === 1;
|
|
159
|
-
const nextDisabled = currentPage === pageCount;
|
|
160
|
-
|
|
161
|
-
// Attributes for Previous and Next Buttons
|
|
162
|
-
const prevAttributes = {
|
|
163
|
-
"aria-disabled": prevDisabled ? "true" : null,
|
|
164
|
-
"aria-label": "Previous page",
|
|
165
|
-
role: "button",
|
|
166
|
-
onClick: changeUrls ? undefined : previousPage,
|
|
167
|
-
tabIndex: prevDisabled ? -1 : 0,
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
const nextAttributes = {
|
|
171
|
-
"aria-disabled": nextDisabled ? "true" : null,
|
|
172
|
-
"aria-label": "Next page",
|
|
173
|
-
role: "button",
|
|
174
|
-
onClick: changeUrls ? undefined : nextPage,
|
|
175
|
-
tabIndex: nextDisabled ? -1 : null,
|
|
209
|
+
return pageLiItems;
|
|
176
210
|
};
|
|
177
211
|
|
|
178
|
-
|
|
179
|
-
const
|
|
212
|
+
// Don't display the previous link when you're on the first page.
|
|
213
|
+
const previousLiLink = currentPage !== 1 && (
|
|
214
|
+
<li key="previous">{getLinkElement("previous")}</li>
|
|
215
|
+
);
|
|
216
|
+
/// Don't display the next link when you're on the last page.
|
|
217
|
+
const nextLiLink = currentPage !== pageCount && (
|
|
218
|
+
<li key="next">{getLinkElement("next")}</li>
|
|
219
|
+
);
|
|
180
220
|
|
|
181
221
|
return (
|
|
182
|
-
<
|
|
222
|
+
<Box
|
|
223
|
+
as="nav"
|
|
224
|
+
id={id}
|
|
183
225
|
aria-label="Pagination"
|
|
184
|
-
|
|
226
|
+
role="navigation"
|
|
227
|
+
className={className}
|
|
228
|
+
__css={styles}
|
|
185
229
|
>
|
|
186
|
-
<
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
!prevDisabled && changeUrls ? getPageHref(currentPage - 1) : "#"
|
|
193
|
-
}
|
|
194
|
-
>
|
|
195
|
-
Previous
|
|
196
|
-
</Link>
|
|
197
|
-
</li>
|
|
198
|
-
|
|
199
|
-
{pagination(currentPage)}
|
|
200
|
-
|
|
201
|
-
<li key="next" className={bem("item", modifiers, "pagination")}>
|
|
202
|
-
<Link
|
|
203
|
-
attributes={{
|
|
204
|
-
...nextAttributes,
|
|
205
|
-
}}
|
|
206
|
-
className={bem("link", modifiers, "pagination", [nextClass])}
|
|
207
|
-
href={
|
|
208
|
-
!nextDisabled && changeUrls ? getPageHref(currentPage + 1) : "#"
|
|
209
|
-
}
|
|
210
|
-
>
|
|
211
|
-
Next
|
|
212
|
-
</Link>
|
|
213
|
-
</li>
|
|
214
|
-
</ul>
|
|
215
|
-
</nav>
|
|
230
|
+
<List type={ListTypes.Unordered} inline noStyling id={`${id}-list`}>
|
|
231
|
+
{previousLiLink}
|
|
232
|
+
{getPaginationNumbers(currentPage)}
|
|
233
|
+
{nextLiLink}
|
|
234
|
+
</List>
|
|
235
|
+
</Box>
|
|
216
236
|
);
|
|
217
237
|
};
|
|
218
238
|
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`Pagination Rendering Renders the UI snapshot correctly 1`] = `
|
|
4
|
+
<nav
|
|
5
|
+
aria-label="Pagination"
|
|
6
|
+
className="css-0"
|
|
7
|
+
id="firstPage"
|
|
8
|
+
role="navigation"
|
|
9
|
+
>
|
|
10
|
+
<ul
|
|
11
|
+
className="css-0"
|
|
12
|
+
id="firstPage-list"
|
|
13
|
+
>
|
|
14
|
+
<li>
|
|
15
|
+
<a
|
|
16
|
+
aria-current="page"
|
|
17
|
+
aria-label="Page 1"
|
|
18
|
+
className="css-1858g8z"
|
|
19
|
+
href="page=1"
|
|
20
|
+
id="firstPage-1"
|
|
21
|
+
>
|
|
22
|
+
1
|
|
23
|
+
</a>
|
|
24
|
+
</li>
|
|
25
|
+
<li>
|
|
26
|
+
<a
|
|
27
|
+
aria-current={null}
|
|
28
|
+
aria-label="Page 2"
|
|
29
|
+
className="css-0"
|
|
30
|
+
href="page=2"
|
|
31
|
+
id="firstPage-2"
|
|
32
|
+
>
|
|
33
|
+
2
|
|
34
|
+
</a>
|
|
35
|
+
</li>
|
|
36
|
+
<li>
|
|
37
|
+
<a
|
|
38
|
+
aria-current={null}
|
|
39
|
+
aria-label="Page 3"
|
|
40
|
+
className="css-0"
|
|
41
|
+
href="page=3"
|
|
42
|
+
id="firstPage-3"
|
|
43
|
+
>
|
|
44
|
+
3
|
|
45
|
+
</a>
|
|
46
|
+
</li>
|
|
47
|
+
<li>
|
|
48
|
+
<a
|
|
49
|
+
aria-current={null}
|
|
50
|
+
aria-label="Page 4"
|
|
51
|
+
className="css-0"
|
|
52
|
+
href="page=4"
|
|
53
|
+
id="firstPage-4"
|
|
54
|
+
>
|
|
55
|
+
4
|
|
56
|
+
</a>
|
|
57
|
+
</li>
|
|
58
|
+
<li>
|
|
59
|
+
<a
|
|
60
|
+
aria-current={null}
|
|
61
|
+
aria-label="Page 5"
|
|
62
|
+
className="css-0"
|
|
63
|
+
href="page=5"
|
|
64
|
+
id="firstPage-5"
|
|
65
|
+
>
|
|
66
|
+
5
|
|
67
|
+
</a>
|
|
68
|
+
</li>
|
|
69
|
+
<li>
|
|
70
|
+
...
|
|
71
|
+
</li>
|
|
72
|
+
<li>
|
|
73
|
+
<a
|
|
74
|
+
aria-current={null}
|
|
75
|
+
aria-label="Page 10"
|
|
76
|
+
className="css-0"
|
|
77
|
+
href="page=10"
|
|
78
|
+
id="firstPage-10"
|
|
79
|
+
>
|
|
80
|
+
10
|
|
81
|
+
</a>
|
|
82
|
+
</li>
|
|
83
|
+
<li>
|
|
84
|
+
<a
|
|
85
|
+
aria-label="Next page"
|
|
86
|
+
className="css-0"
|
|
87
|
+
href="page=2"
|
|
88
|
+
id="firstPage-Next"
|
|
89
|
+
>
|
|
90
|
+
Next
|
|
91
|
+
</a>
|
|
92
|
+
</li>
|
|
93
|
+
</ul>
|
|
94
|
+
</nav>
|
|
95
|
+
`;
|
|
96
|
+
|
|
97
|
+
exports[`Pagination Rendering Renders the UI snapshot correctly 2`] = `
|
|
98
|
+
<nav
|
|
99
|
+
aria-label="Pagination"
|
|
100
|
+
className="css-0"
|
|
101
|
+
id="lastPage"
|
|
102
|
+
role="navigation"
|
|
103
|
+
>
|
|
104
|
+
<ul
|
|
105
|
+
className="css-0"
|
|
106
|
+
id="lastPage-list"
|
|
107
|
+
>
|
|
108
|
+
<li>
|
|
109
|
+
<a
|
|
110
|
+
aria-label="Previous page"
|
|
111
|
+
className="css-0"
|
|
112
|
+
href="page=9"
|
|
113
|
+
id="lastPage-Previous"
|
|
114
|
+
>
|
|
115
|
+
Previous
|
|
116
|
+
</a>
|
|
117
|
+
</li>
|
|
118
|
+
<li>
|
|
119
|
+
<a
|
|
120
|
+
aria-current={null}
|
|
121
|
+
aria-label="Page 1"
|
|
122
|
+
className="css-0"
|
|
123
|
+
href="page=1"
|
|
124
|
+
id="lastPage-1"
|
|
125
|
+
>
|
|
126
|
+
1
|
|
127
|
+
</a>
|
|
128
|
+
</li>
|
|
129
|
+
<li>
|
|
130
|
+
...
|
|
131
|
+
</li>
|
|
132
|
+
<li>
|
|
133
|
+
<a
|
|
134
|
+
aria-current={null}
|
|
135
|
+
aria-label="Page 6"
|
|
136
|
+
className="css-0"
|
|
137
|
+
href="page=6"
|
|
138
|
+
id="lastPage-6"
|
|
139
|
+
>
|
|
140
|
+
6
|
|
141
|
+
</a>
|
|
142
|
+
</li>
|
|
143
|
+
<li>
|
|
144
|
+
<a
|
|
145
|
+
aria-current={null}
|
|
146
|
+
aria-label="Page 7"
|
|
147
|
+
className="css-0"
|
|
148
|
+
href="page=7"
|
|
149
|
+
id="lastPage-7"
|
|
150
|
+
>
|
|
151
|
+
7
|
|
152
|
+
</a>
|
|
153
|
+
</li>
|
|
154
|
+
<li>
|
|
155
|
+
<a
|
|
156
|
+
aria-current={null}
|
|
157
|
+
aria-label="Page 8"
|
|
158
|
+
className="css-0"
|
|
159
|
+
href="page=8"
|
|
160
|
+
id="lastPage-8"
|
|
161
|
+
>
|
|
162
|
+
8
|
|
163
|
+
</a>
|
|
164
|
+
</li>
|
|
165
|
+
<li>
|
|
166
|
+
<a
|
|
167
|
+
aria-current={null}
|
|
168
|
+
aria-label="Page 9"
|
|
169
|
+
className="css-0"
|
|
170
|
+
href="page=9"
|
|
171
|
+
id="lastPage-9"
|
|
172
|
+
>
|
|
173
|
+
9
|
|
174
|
+
</a>
|
|
175
|
+
</li>
|
|
176
|
+
<li>
|
|
177
|
+
<a
|
|
178
|
+
aria-current="page"
|
|
179
|
+
aria-label="Page 10"
|
|
180
|
+
className="css-1858g8z"
|
|
181
|
+
href="page=10"
|
|
182
|
+
id="lastPage-10"
|
|
183
|
+
>
|
|
184
|
+
10
|
|
185
|
+
</a>
|
|
186
|
+
</li>
|
|
187
|
+
</ul>
|
|
188
|
+
</nav>
|
|
189
|
+
`;
|
|
190
|
+
|
|
191
|
+
exports[`Pagination Rendering Renders the UI snapshot correctly 3`] = `
|
|
192
|
+
<nav
|
|
193
|
+
aria-label="Pagination"
|
|
194
|
+
className="css-0"
|
|
195
|
+
id="middlePage"
|
|
196
|
+
role="navigation"
|
|
197
|
+
>
|
|
198
|
+
<ul
|
|
199
|
+
className="css-0"
|
|
200
|
+
id="middlePage-list"
|
|
201
|
+
>
|
|
202
|
+
<li>
|
|
203
|
+
<a
|
|
204
|
+
aria-label="Previous page"
|
|
205
|
+
className="css-0"
|
|
206
|
+
href="page=4"
|
|
207
|
+
id="middlePage-Previous"
|
|
208
|
+
>
|
|
209
|
+
Previous
|
|
210
|
+
</a>
|
|
211
|
+
</li>
|
|
212
|
+
<li>
|
|
213
|
+
<a
|
|
214
|
+
aria-current={null}
|
|
215
|
+
aria-label="Page 1"
|
|
216
|
+
className="css-0"
|
|
217
|
+
href="page=1"
|
|
218
|
+
id="middlePage-1"
|
|
219
|
+
>
|
|
220
|
+
1
|
|
221
|
+
</a>
|
|
222
|
+
</li>
|
|
223
|
+
<li>
|
|
224
|
+
...
|
|
225
|
+
</li>
|
|
226
|
+
<li>
|
|
227
|
+
<a
|
|
228
|
+
aria-current={null}
|
|
229
|
+
aria-label="Page 4"
|
|
230
|
+
className="css-0"
|
|
231
|
+
href="page=4"
|
|
232
|
+
id="middlePage-4"
|
|
233
|
+
>
|
|
234
|
+
4
|
|
235
|
+
</a>
|
|
236
|
+
</li>
|
|
237
|
+
<li>
|
|
238
|
+
<a
|
|
239
|
+
aria-current="page"
|
|
240
|
+
aria-label="Page 5"
|
|
241
|
+
className="css-1858g8z"
|
|
242
|
+
href="page=5"
|
|
243
|
+
id="middlePage-5"
|
|
244
|
+
>
|
|
245
|
+
5
|
|
246
|
+
</a>
|
|
247
|
+
</li>
|
|
248
|
+
<li>
|
|
249
|
+
<a
|
|
250
|
+
aria-current={null}
|
|
251
|
+
aria-label="Page 6"
|
|
252
|
+
className="css-0"
|
|
253
|
+
href="page=6"
|
|
254
|
+
id="middlePage-6"
|
|
255
|
+
>
|
|
256
|
+
6
|
|
257
|
+
</a>
|
|
258
|
+
</li>
|
|
259
|
+
<li>
|
|
260
|
+
...
|
|
261
|
+
</li>
|
|
262
|
+
<li>
|
|
263
|
+
<a
|
|
264
|
+
aria-current={null}
|
|
265
|
+
aria-label="Page 10"
|
|
266
|
+
className="css-0"
|
|
267
|
+
href="page=10"
|
|
268
|
+
id="middlePage-10"
|
|
269
|
+
>
|
|
270
|
+
10
|
|
271
|
+
</a>
|
|
272
|
+
</li>
|
|
273
|
+
<li>
|
|
274
|
+
<a
|
|
275
|
+
aria-label="Next page"
|
|
276
|
+
className="css-0"
|
|
277
|
+
href="page=6"
|
|
278
|
+
id="middlePage-Next"
|
|
279
|
+
>
|
|
280
|
+
Next
|
|
281
|
+
</a>
|
|
282
|
+
</li>
|
|
283
|
+
</ul>
|
|
284
|
+
</nav>
|
|
285
|
+
`;
|