Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
2304098
first commit
jschuler Sep 3, 2021
57cf7d7
remove spaces
jschuler Sep 3, 2021
788305f
Merge remote-tracking branch 'upstream/main'
jschuler Sep 15, 2021
2e19ec9
Merge remote-tracking branch 'upstream/main'
jschuler Sep 23, 2021
6f2ab19
Merge remote-tracking branch 'upstream/main'
jschuler Oct 14, 2021
62e2cf9
Merge remote-tracking branch 'upstream/main'
jschuler Oct 29, 2021
09fc2f4
Merge remote-tracking branch 'upstream/main'
jschuler Nov 5, 2021
bc50d5a
Merge remote-tracking branch 'upstream/main'
jschuler Nov 9, 2021
2162ab9
Merge remote-tracking branch 'upstream/main'
jschuler Nov 10, 2021
bdf0910
Merge remote-tracking branch 'upstream/main'
jschuler Nov 12, 2021
d123f50
Merge remote-tracking branch 'upstream/main'
jschuler Dec 2, 2021
b7303c2
Merge remote-tracking branch 'upstream/main'
jschuler Dec 13, 2021
8059107
Merge remote-tracking branch 'upstream/main'
jschuler Dec 15, 2021
558efb1
Merge remote-tracking branch 'upstream/main'
jschuler Jan 12, 2022
7692901
resize observers
jschuler Jan 14, 2022
4cf5d66
wip
jschuler Jan 18, 2022
b2bb7b0
cleanup
jschuler Jan 18, 2022
f16d8ec
more cleanup
jschuler Jan 18, 2022
9d14b48
getBreakpoint function
jschuler Jan 18, 2022
95a19c0
snapshots
jschuler Jan 19, 2022
3b3ec49
Merge remote-tracking branch 'upstream/main' into resize-observers
jschuler Jan 19, 2022
af07a1d
snaps
jschuler Jan 19, 2022
ff3ceb5
revert 3 snaps
jschuler Jan 19, 2022
e80bd9a
navlist, masthead, util, page observer, page demo
jschuler Jan 19, 2022
607e00e
snaps
jschuler Jan 19, 2022
aac7c7a
getBreakpoint interface
jschuler Jan 19, 2022
2ad85c5
getBreakpoint interface
jschuler Jan 19, 2022
d41ff61
xs -> default, integration, snaps
jschuler Jan 19, 2022
732e0d9
fix toolbartogglegroup visibility
jschuler Jan 20, 2022
9869b6e
default width
jschuler Jan 20, 2022
00433fe
return null if no resize observer for getBreakpoint
jschuler Jan 20, 2022
075d26c
classes
jschuler Jan 20, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 23 additions & 16 deletions packages/react-core/src/components/Masthead/Masthead.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import * as React from 'react';
import styles from '@patternfly/react-styles/css/components/Masthead/masthead';
import { css } from '@patternfly/react-styles';
import { formatBreakpointMods } from '../../helpers/util';
import { PageContext } from '../Page/Page';

export interface MastheadProps extends React.DetailedHTMLProps<React.HTMLProps<HTMLDivElement>, HTMLDivElement> {
/** Content rendered inside of the masthead */
children?: React.ReactNode;
Expand Down Expand Up @@ -33,22 +35,27 @@ export const Masthead: React.FunctionComponent<MastheadProps> = ({
children,
className,
backgroundColor = 'dark',
display,
display = {
md: 'inline'
},
inset,
...props
}: MastheadProps) => (
<header
className={css(
styles.masthead,
formatBreakpointMods(display, styles, 'display-'),
formatBreakpointMods(inset, styles),
backgroundColor === 'light' && styles.modifiers.light,
backgroundColor === 'light200' && styles.modifiers.light_200,
className
)}
{...props}
>
{children}
</header>
);
}: MastheadProps) => {
const { width, getBreakpoint } = React.useContext(PageContext);
return (
<header
className={css(
styles.masthead,
formatBreakpointMods(display, styles, 'display-', getBreakpoint(width)),
formatBreakpointMods(inset, styles, '', getBreakpoint(width)),
backgroundColor === 'light' && styles.modifiers.light,
backgroundColor === 'light200' && styles.modifiers.light_200,
className
)}
{...props}
>
{children}
</header>
);
};
Masthead.displayName = 'Masthead';
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

exports[`Masthead verify basic 1`] = `
<header
className="pf-c-masthead"
className="pf-c-masthead pf-m-display-inline-on-md"
>
test
</header>
Expand All @@ -13,7 +13,7 @@ exports[`Masthead verify custom class 1`] = `
className="custom-css"
>
<header
className="pf-c-masthead custom-css"
className="pf-c-masthead pf-m-display-inline-on-md custom-css"
>
test
</header>
Expand All @@ -23,7 +23,7 @@ exports[`Masthead verify custom class 1`] = `
exports[`Masthead verify full structure 1`] = `
<Masthead>
<header
className="pf-c-masthead"
className="pf-c-masthead pf-m-display-inline-on-md"
>
<MastheadToggle>
<div
Expand Down Expand Up @@ -94,7 +94,7 @@ exports[`Masthead verify inset2xl inset breakpoints 1`] = `
}
>
<header
className="pf-c-masthead pf-m-inset-2xl pf-m-inset-2xl-on-sm pf-m-inset-2xl-on-md pf-m-inset-2xl-on-lg pf-m-inset-2xl-on-xl pf-m-inset-2xl-on-2xl"
className="pf-c-masthead pf-m-display-inline-on-md pf-m-inset-2xl pf-m-inset-2xl-on-sm pf-m-inset-2xl-on-md pf-m-inset-2xl-on-lg pf-m-inset-2xl-on-xl pf-m-inset-2xl-on-2xl"
>
test
</header>
Expand All @@ -115,7 +115,7 @@ exports[`Masthead verify inset3xl inset breakpoints 1`] = `
}
>
<header
className="pf-c-masthead"
className="pf-c-masthead pf-m-display-inline-on-md"
>
test
</header>
Expand All @@ -136,7 +136,7 @@ exports[`Masthead verify insetLg inset breakpoints 1`] = `
}
>
<header
className="pf-c-masthead pf-m-inset-lg pf-m-inset-lg-on-sm pf-m-inset-lg-on-md pf-m-inset-lg-on-lg pf-m-inset-lg-on-xl pf-m-inset-lg-on-2xl"
className="pf-c-masthead pf-m-display-inline-on-md pf-m-inset-lg pf-m-inset-lg-on-sm pf-m-inset-lg-on-md pf-m-inset-lg-on-lg pf-m-inset-lg-on-xl pf-m-inset-lg-on-2xl"
>
test
</header>
Expand All @@ -157,7 +157,7 @@ exports[`Masthead verify insetMd inset breakpoints 1`] = `
}
>
<header
className="pf-c-masthead pf-m-inset-md pf-m-inset-md-on-sm pf-m-inset-md-on-md pf-m-inset-md-on-lg pf-m-inset-md-on-xl pf-m-inset-md-on-2xl"
className="pf-c-masthead pf-m-display-inline-on-md pf-m-inset-md pf-m-inset-md-on-sm pf-m-inset-md-on-md pf-m-inset-md-on-lg pf-m-inset-md-on-xl pf-m-inset-md-on-2xl"
>
test
</header>
Expand All @@ -178,7 +178,7 @@ exports[`Masthead verify insetNone inset breakpoints 1`] = `
}
>
<header
className="pf-c-masthead pf-m-inset-none pf-m-inset-none-on-sm pf-m-inset-none-on-md pf-m-inset-none-on-lg pf-m-inset-none-on-xl pf-m-inset-none-on-2xl"
className="pf-c-masthead pf-m-display-inline-on-md pf-m-inset-none pf-m-inset-none-on-sm pf-m-inset-none-on-md pf-m-inset-none-on-lg pf-m-inset-none-on-xl pf-m-inset-none-on-2xl"
>
test
</header>
Expand All @@ -199,7 +199,7 @@ exports[`Masthead verify insetSm inset breakpoints 1`] = `
}
>
<header
className="pf-c-masthead pf-m-inset-sm pf-m-inset-sm-on-sm pf-m-inset-sm-on-md pf-m-inset-sm-on-lg pf-m-inset-sm-on-xl pf-m-inset-sm-on-2xl"
className="pf-c-masthead pf-m-display-inline-on-md pf-m-inset-sm pf-m-inset-sm-on-sm pf-m-inset-sm-on-md pf-m-inset-sm-on-lg pf-m-inset-sm-on-xl pf-m-inset-sm-on-2xl"
>
test
</header>
Expand All @@ -220,7 +220,7 @@ exports[`Masthead verify insetXl inset breakpoints 1`] = `
}
>
<header
className="pf-c-masthead pf-m-inset-xl pf-m-inset-xl-on-sm pf-m-inset-xl-on-md pf-m-inset-xl-on-lg pf-m-inset-xl-on-xl pf-m-inset-xl-on-2xl"
className="pf-c-masthead pf-m-display-inline-on-md pf-m-inset-xl pf-m-inset-xl-on-sm pf-m-inset-xl-on-md pf-m-inset-xl-on-lg pf-m-inset-xl-on-xl pf-m-inset-xl-on-2xl"
>
test
</header>
Expand All @@ -241,7 +241,7 @@ exports[`Masthead verify insetXs inset breakpoints 1`] = `
}
>
<header
className="pf-c-masthead"
className="pf-c-masthead pf-m-display-inline-on-md"
>
test
</header>
Expand Down
6 changes: 4 additions & 2 deletions packages/react-core/src/components/Nav/Nav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export interface NavProps
variant?: 'default' | 'horizontal' | 'tertiary' | 'horizontal-subnav';
}

export const NavContext = React.createContext<{
export interface NavContextProps {
onSelect?: (
event: React.FormEvent<HTMLInputElement>,
groupId: number | string,
Expand All @@ -57,7 +57,9 @@ export const NavContext = React.createContext<{
isHorizontal?: boolean;
flyoutRef?: React.Ref<HTMLLIElement>;
setFlyoutRef?: (ref: React.Ref<HTMLLIElement>) => void;
}>({});
}
export const navContextDefaults = {};
export const NavContext = React.createContext<NavContextProps>(navContextDefaults);

export class Nav extends React.Component<
NavProps,
Expand Down
11 changes: 4 additions & 7 deletions packages/react-core/src/components/Nav/NavList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import AngleRightIcon from '@patternfly/react-icons/dist/esm/icons/angle-right-i
import { isElementInView } from '../../helpers/util';
import { NavContext } from './Nav';
import { PageSidebarContext } from '../Page/PageSidebar';
import { canUseDOM } from '../../helpers/util';
import { getResizeObserver } from '../../helpers/resizeObserver';

export interface NavListProps
extends React.DetailedHTMLProps<React.HTMLAttributes<HTMLUListElement>, HTMLUListElement> {
Expand Down Expand Up @@ -35,6 +35,7 @@ export class NavList extends React.Component<NavListProps> {
};

navList = React.createRef<HTMLUListElement>();
observer: any = () => {};

handleScrollButtons = () => {
const container = this.navList.current;
Expand Down Expand Up @@ -91,16 +92,12 @@ export class NavList extends React.Component<NavListProps> {
};

componentDidMount() {
if (canUseDOM) {
window.addEventListener('resize', this.handleScrollButtons, false);
}
this.observer = getResizeObserver(this.navList.current, this.handleScrollButtons);
this.handleScrollButtons();
}

componentWillUnmount() {
if (canUseDOM) {
window.removeEventListener('resize', this.handleScrollButtons, false);
}
this.observer();
}

render() {
Expand Down
65 changes: 49 additions & 16 deletions packages/react-core/src/components/Page/Page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import globalBreakpointXl from '@patternfly/react-tokens/dist/esm/global_breakpo
import { debounce, canUseDOM } from '../../helpers/util';
import { Drawer, DrawerContent, DrawerContentBody, DrawerPanelContent } from '../Drawer';
import { PageGroup, PageGroupProps } from './PageGroup';
import { getResizeObserver } from '../../helpers/resizeObserver';
import { getBreakpoint } from '../../helpers/util';

export enum PageLayouts {
vertical = 'vertical',
Expand All @@ -15,13 +17,17 @@ export interface PageContextProps {
isManagedSidebar: boolean;
onNavToggle: () => void;
isNavOpen: boolean;
width: number;
getBreakpoint: (width: number | null) => 'default' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
}

const PageContext = React.createContext<PageContextProps>({
export const pageContextDefaults: PageContextProps = {
isManagedSidebar: false,
isNavOpen: false,
onNavToggle: () => null
});
onNavToggle: () => null,
width: null,
getBreakpoint
};
export const PageContext = React.createContext<PageContextProps>(pageContextDefaults);

export const PageContextProvider = PageContext.Provider;
export const PageContextConsumer = PageContext.Consumer;
Expand Down Expand Up @@ -67,6 +73,13 @@ export interface PageProps extends React.HTMLProps<HTMLDivElement> {
* Returns object { mobileView: boolean, windowSize: number }
*/
onPageResize?: (object: any) => void;
/**
* The page resize observer uses the breakpoints returned from this function when adding the pf-m-breakpoint-[default|sm|md|lg|xl|2xl] class
* You can override the default getBreakpoint function to return breakpoints at different sizes than the default
* You can view the default getBreakpoint function here:
* https://github.com/patternfly/patternfly-react/blob/main/packages/react-core/src/helpers/util.ts
*/
getBreakpoint?: (width: number | null) => 'default' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
/** Breadcrumb component for the page */
breadcrumb?: React.ReactNode;
/** Tertiary nav component for the page */
Expand All @@ -87,6 +100,7 @@ export interface PageState {
desktopIsNavOpen: boolean;
mobileIsNavOpen: boolean;
mobileView: boolean;
width: number;
}

export class Page extends React.Component<PageProps, PageState> {
Expand All @@ -98,9 +112,12 @@ export class Page extends React.Component<PageProps, PageState> {
onPageResize: (): void => null,
mainTabIndex: -1,
isNotificationDrawerExpanded: false,
onNotificationDrawerExpand: () => null
onNotificationDrawerExpand: () => null,
getBreakpoint
};
mainRef = React.createRef<HTMLDivElement>();
pageRef = React.createRef<HTMLDivElement>();
observer: any = () => {};

constructor(props: PageProps) {
super(props);
Expand All @@ -110,16 +127,15 @@ export class Page extends React.Component<PageProps, PageState> {
this.state = {
desktopIsNavOpen: managedSidebarOpen,
mobileIsNavOpen: false,
mobileView: false
mobileView: false,
width: null
};
}

componentDidMount() {
const { isManagedSidebar, onPageResize } = this.props;
if (isManagedSidebar || onPageResize) {
if (canUseDOM) {
window.addEventListener('resize', this.handleResize);
}
this.observer = getResizeObserver(this.pageRef.current, this.handleResize);
const currentRef = this.mainRef.current;
if (currentRef) {
currentRef.addEventListener('mousedown', this.handleMainClick);
Expand All @@ -133,9 +149,7 @@ export class Page extends React.Component<PageProps, PageState> {
componentWillUnmount() {
const { isManagedSidebar, onPageResize } = this.props;
if (isManagedSidebar || onPageResize) {
if (canUseDOM) {
window.removeEventListener('resize', this.handleResize);
}
this.observer();
const currentRef = this.mainRef.current;
if (currentRef) {
currentRef.removeEventListener('mousedown', this.handleMainClick);
Expand All @@ -144,7 +158,13 @@ export class Page extends React.Component<PageProps, PageState> {
}
}

getWindowWidth = () => (canUseDOM ? window.innerWidth : 1200);
getWindowWidth = () => {
if (canUseDOM) {
return this.pageRef.current ? this.pageRef.current.clientWidth : window.innerWidth;
} else {
return 1200;
}
};

isMobile = () =>
// eslint-disable-next-line radix
Expand All @@ -159,6 +179,7 @@ export class Page extends React.Component<PageProps, PageState> {
if (mobileView !== this.state.mobileView) {
this.setState({ mobileView });
}
this.pageRef.current && this.setState({ width: this.pageRef.current.clientWidth });
};

handleResize = debounce(this.resize, 250);
Expand Down Expand Up @@ -201,6 +222,7 @@ export class Page extends React.Component<PageProps, PageState> {
defaultManagedSidebarIsOpen,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
onPageResize,
getBreakpoint,
mainAriaLabel,
mainTabIndex,
tertiaryNav,
Expand All @@ -210,12 +232,14 @@ export class Page extends React.Component<PageProps, PageState> {
groupProps,
...rest
} = this.props;
const { mobileView, mobileIsNavOpen, desktopIsNavOpen } = this.state;
const { mobileView, mobileIsNavOpen, desktopIsNavOpen, width } = this.state;

const context = {
isManagedSidebar,
onNavToggle: mobileView ? this.onNavToggleMobile : this.onNavToggleDesktop,
isNavOpen: mobileView ? mobileIsNavOpen : desktopIsNavOpen
isNavOpen: mobileView ? mobileIsNavOpen : desktopIsNavOpen,
width,
getBreakpoint
};

let nav = null;
Expand Down Expand Up @@ -270,7 +294,16 @@ export class Page extends React.Component<PageProps, PageState> {

return (
<PageContextProvider value={context}>
<div {...rest} className={css(styles.page, className)}>
<div
ref={this.pageRef}
{...rest}
className={css(
styles.page,
width !== null && 'pf-m-resize-observer',
width !== null && `pf-m-breakpoint-${getBreakpoint(width)}`,
className
)}
>
{skipToContent}
{header}
{sidebar}
Expand Down
Loading