Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
42 changes: 39 additions & 3 deletions packages/react-core/src/components/Toolbar/Toolbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
import { css } from '@patternfly/react-styles';
import { ToolbarContext } from './ToolbarUtils';
import { ToolbarLabelGroupContent } from './ToolbarLabelGroupContent';
import { formatBreakpointMods, canUseDOM } from '../../helpers/util';
import { formatBreakpointMods, canUseDOM, getBreakpoint } from '../../helpers/util';
import { getResizeObserver } from '../../helpers/resizeObserver';
import { getOUIAProps, OUIAProps } from '../../helpers';
import { SSRSafeIds } from '../../helpers/SSRSafeIds/SSRSafeIds';
import { PageContext } from '../Page/PageContext';
Expand Down Expand Up @@ -34,6 +35,8 @@
children?: React.ReactNode;
/** Id of the data toolbar */
id?: string;
/** Flag indicating if the toolbar is a container */
isContainer?: boolean;
/** Flag indicating the toolbar height should expand to the full height of the container */
isFullHeight?: boolean;
/** Flag indicating the toolbar is static */
Expand Down Expand Up @@ -84,6 +87,9 @@
class Toolbar extends Component<ToolbarProps, ToolbarState> {
static displayName = 'Toolbar';
labelGroupContentRef = createRef<HTMLDivElement>();
toolbarRef = createRef<HTMLDivElement>();
resizeObserver: () => void = () => {};
containerBreakpoint: ReturnType<typeof getBreakpoint>;
staticFilterInfo = {};
hasNoPadding = false;
state = {
Expand All @@ -109,18 +115,45 @@
}
};

closeExpandableContentOnContainerResize = () => {
const containerWidth = this.toolbarRef.current?.clientWidth;
if (!containerWidth) {
return;
}

const breakpoint = getBreakpoint(containerWidth);
if (breakpoint !== this.containerBreakpoint) {
this.containerBreakpoint = breakpoint;
if (this.state.isManagedToggleExpanded) {
this.setState({ isManagedToggleExpanded: false });
}
}
};

componentDidMount() {
if (canUseDOM) {
this.setState({ windowWidth: window.innerWidth });
}
if (this.isToggleManaged() && canUseDOM) {
window.addEventListener('resize', this.closeExpandableContent);
if (this.props.isContainer && this.toolbarRef.current) {
this.resizeObserver = getResizeObserver(
this.toolbarRef.current,
this.closeExpandableContentOnContainerResize,
true
);
} else {
window.addEventListener('resize', this.closeExpandableContent);
}
}
}

componentWillUnmount() {
if (this.isToggleManaged() && canUseDOM) {
window.removeEventListener('resize', this.closeExpandableContent);
if (this.props.isContainer) {
this.resizeObserver();
} else {
window.removeEventListener('resize', this.closeExpandableContent);
}
}
}

Expand All @@ -146,6 +179,7 @@
toggleIsExpanded,
className,
children,
isContainer,
isFullHeight,
isStatic,
isStickyBase,
Expand Down Expand Up @@ -174,6 +208,7 @@
className={css(
styles.toolbar,
hasNoPadding && styles.modifiers.noPadding,
isContainer && styles.modifiers.container,

Check failure on line 211 in packages/react-core/src/components/Toolbar/Toolbar.tsx

View workflow job for this annotation

GitHub Actions / Build

Property 'container' does not exist on type '{ hidden: "pf-m-hidden"; hiddenOnSmHeight: "pf-m-hidden-on-sm-height"; visibleOnSmHeight: "pf-m-visible-on-sm-height"; hiddenOnMdHeight: "pf-m-hidden-on-md-height"; visibleOnMdHeight: "pf-m-visible-on-md-height"; ... 360 more ...; hideOn_2xl: "pf-m-hide-on-2xl"; }'.

Check failure on line 211 in packages/react-core/src/components/Toolbar/Toolbar.tsx

View workflow job for this annotation

GitHub Actions / Build, test & deploy

Property 'container' does not exist on type '{ hidden: "pf-m-hidden"; hiddenOnSmHeight: "pf-m-hidden-on-sm-height"; visibleOnSmHeight: "pf-m-visible-on-sm-height"; hiddenOnMdHeight: "pf-m-hidden-on-md-height"; visibleOnMdHeight: "pf-m-visible-on-md-height"; ... 360 more ...; hideOn_2xl: "pf-m-hide-on-2xl"; }'.
Comment thread
coderabbitai[bot] marked this conversation as resolved.
isFullHeight && styles.modifiers.fullHeight,
isStatic && styles.modifiers.static,
isSticky && styles.modifiers.sticky,
Expand All @@ -187,6 +222,7 @@
className
)}
id={randomId}
ref={this.toolbarRef}
{...getOUIAProps(Toolbar.displayName, ouiaId !== undefined ? ouiaId : generatedOuiaId)}
{...props}
>
Expand Down
6 changes: 3 additions & 3 deletions packages/react-core/src/components/Toolbar/ToolbarContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -78,11 +78,11 @@ class ToolbarContent extends Component<ToolbarContentProps> {

return (
<PageContext.Consumer>
{({ width, getBreakpoint, height, getVerticalBreakpoint }) => (
{({ height, getVerticalBreakpoint }) => (
<div
className={css(
styles.toolbarContent,
formatBreakpointMods(visibility, styles, '', getBreakpoint(width)),
formatBreakpointMods(visibility, styles),
formatBreakpointMods(visibilityAtHeight, styles, '', getVerticalBreakpoint(height), true),
className
)}
Expand Down Expand Up @@ -115,7 +115,7 @@ class ToolbarContent extends Component<ToolbarContentProps> {
<div
className={css(
styles.toolbarContentSection,
formatBreakpointMods(rowWrap, styles, '', getBreakpoint(width)),
formatBreakpointMods(rowWrap, styles),
alignItems === 'center' && styles.modifiers.alignItemsCenter,
alignItems === 'start' && styles.modifiers.alignItemsStart,
alignItems === 'baseline' && styles.modifiers.alignItemsBaseline
Expand Down
16 changes: 8 additions & 8 deletions packages/react-core/src/components/Toolbar/ToolbarGroup.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ class ToolbarGroupWithRef extends Component<ToolbarGroupProps> {

return (
<PageContext.Consumer>
{({ width, getBreakpoint, height, getVerticalBreakpoint }) => (
{({ height, getVerticalBreakpoint }) => (
<div
className={css(
styles.toolbarGroup,
Expand All @@ -227,14 +227,14 @@ class ToolbarGroupWithRef extends Component<ToolbarGroupProps> {
| 'actionGroupPlain'
| 'labelGroup'
],
formatBreakpointMods(visibility, styles, '', getBreakpoint(width)),
formatBreakpointMods(visibility, styles),
formatBreakpointMods(visibilityAtHeight, styles, '', getVerticalBreakpoint(height), true),
formatBreakpointMods(align, styles, '', getBreakpoint(width)),
formatBreakpointMods(gap, styles, '', getBreakpoint(width)),
formatBreakpointMods(columnGap, styles, '', getBreakpoint(width)),
formatBreakpointMods(rowGap, styles, '', getBreakpoint(width)),
formatBreakpointMods(rowWrap, styles, '', getBreakpoint(width)),
formatBreakpointMods(flexGrow, styles, '', getBreakpoint(width)),
formatBreakpointMods(align, styles),
formatBreakpointMods(gap, styles),
formatBreakpointMods(columnGap, styles),
formatBreakpointMods(rowGap, styles),
formatBreakpointMods(rowWrap, styles),
formatBreakpointMods(flexGrow, styles),
alignItems === 'start' && styles.modifiers.alignItemsStart,
alignItems === 'center' && styles.modifiers.alignItemsCenter,
alignItems === 'baseline' && styles.modifiers.alignItemsBaseline,
Expand Down
17 changes: 9 additions & 8 deletions packages/react-core/src/components/Toolbar/ToolbarItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export interface ToolbarItemProps extends React.HTMLProps<HTMLDivElement> {
/** Visibility at various width breakpoints. */
visibility?: {
default?: 'hidden' | 'visible';
sm?: 'hidden' | 'visible';
md?: 'hidden' | 'visible';
lg?: 'hidden' | 'visible';
xl?: 'hidden' | 'visible';
Expand Down Expand Up @@ -236,22 +237,22 @@ export const ToolbarItem: React.FunctionComponent<ToolbarItemProps> = ({

return (
<PageContext.Consumer>
{({ width, getBreakpoint, height, getVerticalBreakpoint }) => (
{({ height, getVerticalBreakpoint }) => (
<div
className={css(
styles.toolbarItem,
variant && styles.modifiers[toCamel(variant) as 'pagination' | 'label'],
variant === ToolbarItemVariant['label-group'] && styles.modifiers.labelGroup,
isAllExpanded && styles.modifiers.expanded,
isOverflowContainer && styles.modifiers.overflowContainer,
formatBreakpointMods(visibility, styles, '', getBreakpoint(width)),
formatBreakpointMods(visibility, styles),
formatBreakpointMods(visibilityAtHeight, styles, '', getVerticalBreakpoint(height), true),
formatBreakpointMods(align, styles, '', getBreakpoint(width)),
formatBreakpointMods(gap, styles, '', getBreakpoint(width)),
formatBreakpointMods(columnGap, styles, '', getBreakpoint(width)),
formatBreakpointMods(rowGap, styles, '', getBreakpoint(width)),
formatBreakpointMods(rowWrap, styles, '', getBreakpoint(width)),
formatBreakpointMods(flexGrow, styles, '', getBreakpoint(width)),
formatBreakpointMods(align, styles),
formatBreakpointMods(gap, styles),
formatBreakpointMods(columnGap, styles),
formatBreakpointMods(rowGap, styles),
formatBreakpointMods(rowWrap, styles),
formatBreakpointMods(flexGrow, styles),
alignItems === 'start' && styles.modifiers.alignItemsStart,
alignItems === 'center' && styles.modifiers.alignItemsCenter,
alignItems === 'baseline' && styles.modifiers.alignItemsBaseline,
Expand Down
173 changes: 84 additions & 89 deletions packages/react-core/src/components/Toolbar/ToolbarToggleGroup.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import { ToolbarContext, ToolbarContentContext } from './ToolbarUtils';
import { Button } from '../Button';
import globalBreakpointLg from '@patternfly/react-tokens/dist/esm/t_global_breakpoint_lg';
import { formatBreakpointMods, toCamel } from '../../helpers/util';
import { PageContext } from '../Page/PageContext';
import { ToolbarExpandableContent } from './ToolbarExpandableContent';

export interface ToolbarToggleGroupProps extends ToolbarGroupProps {
Expand Down Expand Up @@ -188,99 +187,95 @@ class ToolbarToggleGroup extends Component<ToolbarToggleGroupProps> {
}

return (
<PageContext.Consumer>
{({ width, getBreakpoint }) => (
<ToolbarContext.Consumer>
{({ toggleIsExpanded: managedOnToggle }) => {
const _onToggle = onToggle !== undefined ? onToggle : managedOnToggle;
<ToolbarContext.Consumer>
{({ toggleIsExpanded: managedOnToggle }) => {
const _onToggle = onToggle !== undefined ? onToggle : managedOnToggle;

return (
<ToolbarContentContext.Consumer>
{({
expandableContentRef,
expandableContentId,
labelContainerRef: managedLabelContainerRef,
isExpanded: managedIsExpanded,
clearAllFilters: clearAllFiltersContext,
clearFiltersButtonText: clearFiltersButtonContext,
showClearFiltersButton: showClearFiltersButtonContext
}) => {
const _isExpanded = isExpanded !== undefined ? isExpanded : managedIsExpanded;
const _labelContainerRef =
labelContainerRef !== undefined ? labelContainerRef : managedLabelContainerRef;
return (
<ToolbarContentContext.Consumer>
{({
expandableContentRef,
expandableContentId,
labelContainerRef: managedLabelContainerRef,
isExpanded: managedIsExpanded,
clearAllFilters: clearAllFiltersContext,
clearFiltersButtonText: clearFiltersButtonContext,
showClearFiltersButton: showClearFiltersButtonContext
}) => {
const _isExpanded = isExpanded !== undefined ? isExpanded : managedIsExpanded;
const _labelContainerRef =
labelContainerRef !== undefined ? labelContainerRef : managedLabelContainerRef;

const breakpointMod: {
md?: 'show';
lg?: 'show';
xl?: 'show';
'2xl'?: 'show';
} = {};
breakpointMod[breakpoint] = 'show';
const breakpointMod: {
md?: 'show';
lg?: 'show';
xl?: 'show';
'2xl'?: 'show';
} = {};
breakpointMod[breakpoint] = 'show';

const expandableContent = (
<ToolbarExpandableContent
id={expandableContentId}
expandableContentRef={this.expandableContentRef}
isExpanded={_isExpanded}
clearAllFilters={clearAllFilters || clearAllFiltersContext}
showClearFiltersButton={showClearFiltersButton || showClearFiltersButtonContext}
clearFiltersButtonText={clearFiltersButtonText || clearFiltersButtonContext}
labelContainerRef={_labelContainerRef}
>
{children}
</ToolbarExpandableContent>
);
const expandableContent = (
<ToolbarExpandableContent
id={expandableContentId}
expandableContentRef={this.expandableContentRef}
isExpanded={_isExpanded}
clearAllFilters={clearAllFilters || clearAllFiltersContext}
showClearFiltersButton={showClearFiltersButton || showClearFiltersButtonContext}
clearFiltersButtonText={clearFiltersButtonText || clearFiltersButtonContext}
labelContainerRef={_labelContainerRef}
>
{children}
</ToolbarExpandableContent>
);

const toggleButton = (
<div className={css(styles.toolbarToggle)}>
<Button
variant="plain"
onClick={_onToggle}
aria-label="Show Filters"
{...(_isExpanded && { 'aria-expanded': true })}
aria-haspopup={_isExpanded && this.isContentPopup()}
aria-controls={_isExpanded ? expandableContentId : undefined}
ref={this.toggleRef}
icon={toggleIcon}
/>
</div>
);
const toggleButton = (
<div className={css(styles.toolbarToggle)}>
<Button
variant="plain"
onClick={_onToggle}
aria-label="Show Filters"
{...(_isExpanded && { 'aria-expanded': true })}
aria-haspopup={_isExpanded && this.isContentPopup()}
aria-controls={_isExpanded ? expandableContentId : undefined}
ref={this.toggleRef}
icon={toggleIcon}
/>
</div>
);

return (
<div
className={css(
styles.toolbarGroup,
styles.modifiers.toggleGroup,
variant &&
styles.modifiers[
toCamel(variant) as
| 'filterGroup'
| 'actionGroup'
| 'actionGroupInline'
| 'actionGroupPlain'
| 'labelGroup'
],
formatBreakpointMods(breakpointMod, styles, '', getBreakpoint(width)),
formatBreakpointMods(visibility, styles, '', getBreakpoint(width)),
formatBreakpointMods(gap, styles, '', getBreakpoint(width)),
formatBreakpointMods(columnGap, styles, '', getBreakpoint(width)),
formatBreakpointMods(rowGap, styles, '', getBreakpoint(width)),
className
)}
{...props}
>
{toggleButton}
{_isExpanded && ReactDOM.createPortal(expandableContent, expandableContentRef.current)}
{!_isExpanded && children}
</div>
);
}}
</ToolbarContentContext.Consumer>
);
}}
</ToolbarContext.Consumer>
)}
</PageContext.Consumer>
return (
<div
className={css(
styles.toolbarGroup,
styles.modifiers.toggleGroup,
variant &&
styles.modifiers[
toCamel(variant) as
| 'filterGroup'
| 'actionGroup'
| 'actionGroupInline'
| 'actionGroupPlain'
| 'labelGroup'
],
formatBreakpointMods(breakpointMod, styles),
formatBreakpointMods(visibility, styles),
formatBreakpointMods(gap, styles),
formatBreakpointMods(columnGap, styles),
formatBreakpointMods(rowGap, styles),
className
)}
{...props}
>
{toggleButton}
{_isExpanded && ReactDOM.createPortal(expandableContent, expandableContentRef.current)}
{!_isExpanded && children}
</div>
);
}}
</ToolbarContentContext.Consumer>
);
}}
</ToolbarContext.Consumer>
);
}
}
Expand Down
Loading
Loading