Skip to content

Commit

Permalink
[Pagination] Migrate Pagination and PaginationItem to emotion (#25146)
Browse files Browse the repository at this point in the history
  • Loading branch information
mngu committed Mar 1, 2021
1 parent 5264039 commit ab16c85
Show file tree
Hide file tree
Showing 21 changed files with 442 additions and 282 deletions.
3 changes: 2 additions & 1 deletion docs/pages/api-docs/pagination-item.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
},
"default": "'medium'"
},
"sx": { "type": { "name": "object" } },
"type": {
"type": {
"name": "enum",
Expand Down Expand Up @@ -70,6 +71,6 @@
"filename": "/packages/material-ui/src/PaginationItem/PaginationItem.js",
"inheritance": null,
"demos": "<ul><li><a href=\"/components/pagination/\">Pagination</a></li></ul>",
"styledComponent": false,
"styledComponent": true,
"cssComponent": false
}
3 changes: 2 additions & 1 deletion docs/pages/api-docs/pagination.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
},
"default": "'medium'"
},
"sx": { "type": { "name": "object" } },
"variant": {
"type": {
"name": "union",
Expand All @@ -54,6 +55,6 @@
"filename": "/packages/material-ui/src/Pagination/Pagination.js",
"inheritance": null,
"demos": "<ul><li><a href=\"/components/pagination/\">Pagination</a></li></ul>",
"styledComponent": false,
"styledComponent": true,
"cssComponent": false
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"selected": "If <code>true</code> the pagination item is selected.",
"shape": "The shape of the pagination item.",
"size": "The size of the component.",
"sx": "The system prop that allows defining system overrides as well as additional CSS styles. See the <a href=\"/system/basics/#the-sx-prop\">`sx` page</a> for more details.",
"type": "The type of pagination item.",
"variant": "The variant to use."
},
Expand Down
1 change: 1 addition & 0 deletions docs/translations/api-docs/pagination/pagination.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
"showLastButton": "If <code>true</code>, show the last-page button.",
"siblingCount": "Number of always visible pages before and after the current page.",
"size": "The size of the component.",
"sx": "The system prop that allows defining system overrides as well as additional CSS styles. See the <a href=\"/system/basics/#the-sx-prop\">`sx` page</a> for more details.",
"variant": "The variant to use."
},
"classDescriptions": {
Expand Down
2 changes: 1 addition & 1 deletion packages/material-ui/src/Autocomplete/Autocomplete.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import useAutocomplete, { createFilterOptions } from '../useAutocomplete';
import useThemeProps from '../styles/useThemeProps';
import experimentalStyled from '../styles/experimentalStyled';
import autocompleteClasses, { getAutocompleteUtilityClass } from './autocompleteClasses';
import { capitalize } from '../utils';
import capitalize from '../utils/capitalize';

const overridesResolver = (props, styles) => {
const { styleProps } = props;
Expand Down
6 changes: 6 additions & 0 deletions packages/material-ui/src/Pagination/Pagination.d.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import * as React from 'react';
import { OverridableStringUnion } from '@material-ui/types';
import { SxProps } from '@material-ui/system';
import { InternalStandardProps as StandardProps } from '@material-ui/core';
import { Theme } from '../styles';
import { UsePaginationItem, UsePaginationProps } from '../usePagination/usePagination';

export interface PaginationRenderItemParams extends UsePaginationItem {
Expand Down Expand Up @@ -67,6 +69,10 @@ export interface PaginationProps
* @default 'medium'
*/
size?: 'small' | 'medium' | 'large';
/**
* The system prop that allows defining system overrides as well as additional CSS styles.
*/
sx?: SxProps<Theme>;
/**
* The variant to use.
* @default 'text'
Expand Down
128 changes: 82 additions & 46 deletions packages/material-ui/src/Pagination/Pagination.js
Original file line number Diff line number Diff line change
@@ -1,39 +1,71 @@
import * as React from 'react';
import PropTypes from 'prop-types';
import clsx from 'clsx';
import { withStyles, useThemeVariants } from '../styles';
import { unstable_composeClasses as composeClasses } from '@material-ui/unstyled';
import { deepmerge } from '@material-ui/utils';
import useThemeProps from '../styles/useThemeProps';
import paginationClasses, { getPaginationUtilityClass } from './paginationClasses';
import usePagination from '../usePagination';
import PaginationItem from '../PaginationItem';
import experimentalStyled from '../styles/experimentalStyled';

export const styles = {
/* Styles applied to the root element. */
root: {},
/* Styles applied to the ul element. */
ul: {
display: 'flex',
flexWrap: 'wrap',
alignItems: 'center',
padding: 0,
margin: 0,
listStyle: 'none',
},
/* Styles applied to the root element if `variant="outlined"`. */
outlined: {},
/* Styles applied to the root element if `variant="text"`. */
text: {},
const overridesResolver = (props, styles) => {
const { styleProps } = props;

return deepmerge(styles.root || {}, {
...styles[styleProps.variant],
[`& .${paginationClasses.ul}`]: styles.ul,
});
};

const useUtilityClasses = (styleProps) => {
const { classes, variant } = styleProps;

const slots = {
root: ['root', variant],
ul: ['ul'],
};

return composeClasses(slots, getPaginationUtilityClass, classes);
};

const PaginationRoot = experimentalStyled(
'nav',
{},
{
name: 'MuiPagination',
slot: 'Root',
overridesResolver,
},
)({});

const PaginationUl = experimentalStyled(
'ul',
{},
{
name: 'MuiPagination',
slot: 'Ul',
},
)({
display: 'flex',
flexWrap: 'wrap',
alignItems: 'center',
padding: 0,
margin: 0,
listStyle: 'none',
});

function defaultGetAriaLabel(type, page, selected) {
if (type === 'page') {
return `${selected ? '' : 'Go to '}page ${page}`;
}
return `Go to ${type} page`;
}

const Pagination = React.forwardRef(function Pagination(props, ref) {
const Pagination = React.forwardRef(function Pagination(inProps, ref) {
const props = useThemeProps({ props: inProps, name: 'MuiPagination' });
const {
boundaryCount = 1,
classes,
className,
color = 'standard',
count = 1,
Expand All @@ -56,36 +88,36 @@ const Pagination = React.forwardRef(function Pagination(props, ref) {

const { items } = usePagination({ ...props, componentName: 'Pagination' });

const themeVariantsClasses = useThemeVariants(
{
...props,
boundaryCount,
color,
count,
defaultPage,
disabled,
getItemAriaLabel,
hideNextButton,
hidePrevButton,
renderItem,
shape,
showFirstButton,
showLastButton,
siblingCount,
size,
variant,
},
'MuiPaginationItem',
);
const styleProps = {
...props,
boundaryCount,
color,
count,
defaultPage,
disabled,
getItemAriaLabel,
hideNextButton,
hidePrevButton,
renderItem,
shape,
showFirstButton,
showLastButton,
siblingCount,
size,
variant,
};

const classes = useUtilityClasses(styleProps);

return (
<nav
<PaginationRoot
aria-label="pagination navigation"
className={clsx(classes.root, classes[variant], themeVariantsClasses, className)}
className={clsx(classes.root, className)}
styleProps={styleProps}
ref={ref}
{...other}
>
<ul className={classes.ul}>
<PaginationUl className={classes.ul} styleProps={styleProps}>
{items.map((item, index) => (
<li key={index}>
{renderItem({
Expand All @@ -98,8 +130,8 @@ const Pagination = React.forwardRef(function Pagination(props, ref) {
})}
</li>
))}
</ul>
</nav>
</PaginationUl>
</PaginationRoot>
);
});

Expand Down Expand Up @@ -208,6 +240,10 @@ Pagination.propTypes = {
* @default 'medium'
*/
size: PropTypes.oneOf(['large', 'medium', 'small']),
/**
* The system prop that allows defining system overrides as well as additional CSS styles.
*/
sx: PropTypes.object,
/**
* The variant to use.
* @default 'text'
Expand All @@ -218,4 +254,4 @@ Pagination.propTypes = {
]),
};

export default withStyles(styles, { name: 'MuiPagination' })(Pagination);
export default Pagination;
23 changes: 11 additions & 12 deletions packages/material-ui/src/Pagination/Pagination.test.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
import * as React from 'react';
import { expect } from 'chai';
import { spy } from 'sinon';
import { getClasses, createMount, describeConformance, createClientRender } from 'test/utils';
import { createMuiTheme, ThemeProvider } from '../styles';
import Pagination from './Pagination';
import { createMount, describeConformanceV5, createClientRender } from 'test/utils';
import { createMuiTheme, ThemeProvider } from '@material-ui/core/styles';
import Pagination, { paginationClasses as classes } from '@material-ui/core/Pagination';

describe('<Pagination />', () => {
let classes;
const mount = createMount();
const render = createClientRender();
const mount = createMount();

before(() => {
classes = getClasses(<Pagination />);
});

describeConformance(<Pagination />, () => ({
describeConformanceV5(<Pagination />, () => ({
classes,
inheritComponent: 'nav',
render,
mount,
muiName: 'MuiPagination',
refInstanceof: window.HTMLElement,

skip: ['componentProp'],
testDeepOverrides: { slotName: 'ul', slotClassName: classes.ul },
testVariantProps: { variant: 'foo' },
testStateOverrides: { prop: 'variant', value: 'outlined', styleKey: 'outlined' },
skip: ['componentProp', 'componentsProp'],
}));

it('should render', () => {
Expand Down
3 changes: 3 additions & 0 deletions packages/material-ui/src/Pagination/index.d.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
export { default } from './Pagination';
export * from './Pagination';

export { default as paginationClasses } from './paginationClasses';
export * from './paginationClasses';
3 changes: 3 additions & 0 deletions packages/material-ui/src/Pagination/index.js
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
export { default } from './Pagination';

export { default as paginationClasses } from './paginationClasses';
export * from './paginationClasses';
9 changes: 9 additions & 0 deletions packages/material-ui/src/Pagination/paginationClasses.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { PaginationClassKey } from './Pagination';

export type PaginationClasses = Record<PaginationClassKey, string>;

declare const paginationClasses: PaginationClasses;

export function getPaginationUtilityClass(slot: string): string;

export default paginationClasses;
14 changes: 14 additions & 0 deletions packages/material-ui/src/Pagination/paginationClasses.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { generateUtilityClass, generateUtilityClasses } from '@material-ui/unstyled';

export function getPaginationUtilityClass(slot) {
return generateUtilityClass('MuiPagination', slot);
}

const paginationClasses = generateUtilityClasses('MuiPagination', [
'root',
'ul',
'outlined',
'text',
]);

export default paginationClasses;
6 changes: 6 additions & 0 deletions packages/material-ui/src/PaginationItem/PaginationItem.d.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import * as React from 'react';
import { OverridableStringUnion } from '@material-ui/types';
import { OverridableComponent, OverrideProps } from '@material-ui/core/OverridableComponent';
import { SxProps } from '@material-ui/system';
import { Theme } from '../styles';
import { UsePaginationItem } from '../usePagination/usePagination';

export interface PaginationItemPropsVariantOverrides {}
Expand Down Expand Up @@ -74,6 +76,10 @@ export interface PaginationItemTypeMap<P = {}, D extends React.ElementType = 'di
* @default 'medium'
*/
size?: 'small' | 'medium' | 'large';
/**
* The system prop that allows defining system overrides as well as additional CSS styles.
*/
sx?: SxProps<Theme>;
/**
* The type of pagination item.
* @default 'page'
Expand Down
Loading

0 comments on commit ab16c85

Please sign in to comment.