Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added Prop hideUnavailableVariations that enables hiding unavailable variations from DOM #1110

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
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
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.

## [Unreleased]

### Added

- Prop `hideUnavailableVariations` that enables hiding unavailable variations from DOM

## [3.176.1] - 2024-11-08

## [3.176.0] - 2024-11-06
Expand Down
1 change: 1 addition & 0 deletions docs/SKUSelector.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ The `sku-selector` block is mainly used in Product Details Pages (PDPs) to displ
| `variationsSpacing` | `number` | Defines the `margin-bottom` size to be applied in the rendered product variations. Possible values range from `0` to `11` (the prop value is not in `px`; every value represents a tachyon class). | `7` |
| `visibility` | `enum` | Defines the scenarios in which the SKU selector should be displayed. Possible values are: `always` (it will always be displayed, even if the product has only one SKU option) or `more-than-one` (the SKU selector is only displayed when the product has more than one SKU option). | `always` |
| `visibleVariations` | `array` | Specifies which product variations should be displayed on the product details page. Please note that no variations will be displayed if you declare a name that does not represent a real product variation or an empty array. There is more information regarding this prop structure below this table. | `undefined` |
| `hideUnavailableVariations`|`boolean`| When this prop is set to `true` all unavailable variations will not be rendered.|`false`|

- **`visibleVariations` props**

Expand Down
2 changes: 2 additions & 0 deletions react/components/SKUSelector/Wrapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ interface Props {
sliderArrowSize?: number
sliderItemsPerPage?: ResponsiveValuesTypes.ResponsiveValue<number>
sortVariationsByLabel?: boolean
hideUnavailableVariations?: boolean
/** Used to override default CSS handles */
classes?: CssHandlesTypes.CustomClasses<typeof SKU_SELECTOR_CSS_HANDLES>
}
Expand Down Expand Up @@ -262,6 +263,7 @@ function SKUSelectorWrapper(props: Props) {
sliderArrowSize={props.sliderArrowSize}
sliderDisplayThreshold={props.sliderDisplayThreshold}
sortVariationsByLabel={props.sortVariationsByLabel}
hideUnavailableVariations={props.hideUnavailableVariations}
/>
</SKUSelectorCssHandlesProvider>
)
Expand Down
3 changes: 3 additions & 0 deletions react/components/SKUSelector/components/SKUSelector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ interface Props {
sliderArrowSize: number
sliderItemsPerPage: ResponsiveValuesTypes.ResponsiveValue<number>
sortVariationsByLabel?: boolean
hideUnavailableVariations?: boolean
}

function isSkuAvailable(item?: SelectorProductItem) {
Expand Down Expand Up @@ -360,6 +361,7 @@ function SKUSelector({
sliderArrowSize,
sliderItemsPerPage,
sortVariationsByLabel = false,
hideUnavailableVariations,
}: Props) {
const { handles } = useSKUSelectorCssHandles()
const variationsSpacing = getValidMarginBottom(marginBottomProp)
Expand Down Expand Up @@ -454,6 +456,7 @@ function SKUSelector({
sliderDisplayThreshold={sliderDisplayThreshold}
sliderArrowSize={sliderArrowSize}
sliderItemsPerPage={sliderItemsPerPage}
hideUnavailableVariations={hideUnavailableVariations}
/>
)
})}
Expand Down
13 changes: 12 additions & 1 deletion react/components/SKUSelector/components/Variation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ interface Props {
sliderDisplayThreshold: number
sliderArrowSize: number
sliderItemsPerPage: ResponsiveValuesTypes.ResponsiveValue<number>
hideUnavailableVariations?: boolean
}

const ITEMS_VISIBLE_THRESHOLD = 2
Expand Down Expand Up @@ -60,8 +61,13 @@ const Variation: FC<Props> = ({
sliderArrowSize,
sliderDisplayThreshold,
sliderItemsPerPage,
hideUnavailableVariations,
}) => {
const { originalName, name, options } = variation
const { originalName, name, options: initialOptions } = variation

const options = hideUnavailableVariations
? initialOptions.filter(option => option.available)
: [...initialOptions]

const visibleItemsWhenCollapsed = maxItems - ITEMS_VISIBLE_THRESHOLD

Expand All @@ -88,6 +94,11 @@ const Variation: FC<Props> = ({
)

const showAllAction = useCallback(() => setShowAll(true), [setShowAll])

if (options.length === 0) {
return null
}

const containerClasses = classnames(
'flex flex-column',
containerClassesProp,
Expand Down
3 changes: 3 additions & 0 deletions react/components/SKUSelector/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ interface Props {
sliderArrowSize?: number
sliderItemsPerPage?: ResponsiveValuesTypes.ResponsiveValue<number>
sortVariationsByLabel?: boolean
hideUnavailableVariations?: boolean
}

const getNewSelectedVariations = (
Expand Down Expand Up @@ -254,6 +255,7 @@ const SKUSelectorContainer: FC<Props> = ({
tablet: 2,
phone: 1,
},
hideUnavailableVariations = false,
}) => {
const productContext = useProduct()
const selectedItem = productContext?.selectedItem
Expand Down Expand Up @@ -425,6 +427,7 @@ const SKUSelectorContainer: FC<Props> = ({
sliderArrowSize={sliderArrowSize}
sliderItemsPerPage={sliderItemsPerPage}
sortVariationsByLabel={sortVariationsByLabel}
hideUnavailableVariations={hideUnavailableVariations}
/>
)
}
Expand Down