From 989894a2cff289169c28c5b1655013c62b1d8826 Mon Sep 17 00:00:00 2001 From: Eric Olkowski Date: Tue, 26 Mar 2024 14:22:29 -0400 Subject: [PATCH 1/5] fix(Card): updated v5 logic to prevent unclickable cards --- .../react-core/src/components/Card/Card.tsx | 28 ++++++++++++++----- .../src/components/Card/CardHeader.tsx | 14 ++++------ .../src/components/Card/examples/Card.md | 20 +++++++------ .../Card/examples/CardSingleSelectable.tsx | 17 +++++++++-- .../cypress/integration/card.spec.ts | 2 -- 5 files changed, 52 insertions(+), 29 deletions(-) diff --git a/packages/react-core/src/components/Card/Card.tsx b/packages/react-core/src/components/Card/Card.tsx index abdf05d82b3..6ada27a1a29 100644 --- a/packages/react-core/src/components/Card/Card.tsx +++ b/packages/react-core/src/components/Card/Card.tsx @@ -14,15 +14,21 @@ export interface CardProps extends React.HTMLProps, OUIAProps { component?: keyof JSX.IntrinsicElements; /** Modifies the card to include compact styling. Should not be used with isLarge. */ isCompact?: boolean; - /** Modifies the card to include selectable styling */ + /** Flag indicating that the card is selectable. */ isSelectable?: boolean; /** @deprecated Specifies the card is selectable, and applies raised styling on hover and select */ isSelectableRaised?: boolean; - /** Modifies the card to include selected styling */ - isSelected?: boolean; - /** Modifies the card to include clickable styling */ + /** Flag indicating that the card is clickable and contains some action that triggers on click. */ isClickable?: boolean; - /** Modifies a clickable or selectable card to have disabled styling. */ + /** Flag indicating whether a card that is both clickable and selectable is currently selected and has selected styling. + * This will not determine the card's actual selected state. + */ + isSelected?: boolean; + /** Flag indicating whether a card that is either only clickable or that is both clickable and selectable + * is currently clicked and has clicked styling. + */ + isClicked?: boolean; + /** Flag indicating that a clickable or selectable card is disabled. */ isDisabled?: boolean; /** @deprecated Modifies a raised selectable card to have disabled styling */ isDisabledRaised?: boolean; @@ -56,6 +62,7 @@ interface CardContextProps { isExpanded: boolean; isClickable: boolean; isSelectable: boolean; + isClicked: boolean; isDisabled: boolean; // TODO: Remove hasSelectableInput when deprecated prop is removed hasSelectableInput: boolean; @@ -72,6 +79,7 @@ export const CardContext = React.createContext>({ isExpanded: false, isClickable: false, isSelectable: false, + isClicked: false, isDisabled: false }); @@ -86,6 +94,7 @@ export const Card: React.FunctionComponent = ({ isDisabled = false, isSelectableRaised = false, isSelected = false, + isClicked = false, isDisabledRaised = false, isFlat = false, isExpanded = false, @@ -119,7 +128,11 @@ export const Card: React.FunctionComponent = ({ return css(styles.modifiers.selectableRaised, isSelected && styles.modifiers.selectedRaised); } if (isSelectable && isClickable) { - return css(styles.modifiers.selectable, styles.modifiers.clickable, isSelected && styles.modifiers.current); + return css( + styles.modifiers.selectable, + styles.modifiers.clickable, + (isSelected || isClicked) && styles.modifiers.current + ); } if (isSelectable) { @@ -127,7 +140,7 @@ export const Card: React.FunctionComponent = ({ } if (isClickable) { - return css(styles.modifiers.clickable, isSelected && styles.modifiers.selected); + return css(styles.modifiers.clickable, isClicked && styles.modifiers.current); } return ''; @@ -162,6 +175,7 @@ export const Card: React.FunctionComponent = ({ isExpanded, isClickable, isSelectable, + isClicked, isDisabled, // TODO: Remove hasSelectableInput when deprecated prop is removed hasSelectableInput diff --git a/packages/react-core/src/components/Card/CardHeader.tsx b/packages/react-core/src/components/Card/CardHeader.tsx index c8b34353b34..8bb7407fc0d 100644 --- a/packages/react-core/src/components/Card/CardHeader.tsx +++ b/packages/react-core/src/components/Card/CardHeader.tsx @@ -80,7 +80,7 @@ export const CardHeader: React.FunctionComponent = ({ }: CardHeaderProps) => ( {/* TODO: Remove hasSelectableInput when deprecated props are removed */} - {({ cardId, isClickable, isSelectable, isDisabled: isCardDisabled, hasSelectableInput }) => { + {({ cardId, isClickable, isSelectable, isClicked, isDisabled: isCardDisabled, hasSelectableInput }) => { const cardHeaderToggle = (