UNPKG

@patternfly/react-core

Version:

This library provides a set of common React components for use with the PatternFly reference implementation.

82 lines (79 loc) 3.21 kB
import * as React from 'react'; import { ApplicationLauncherSeparator } from '../components/ApplicationLauncher/ApplicationLauncherSeparator'; import { Divider } from '../components/Divider/Divider'; /** * This function is a helper for creating an array of renderable favorite items for the Application launcher or Select * * @param {object} items The items rendered in Select or Application aLauncher * @param {boolean} isGrouped Flag indicating if items are grouped * @param {any[]} favorites Array of ids of favorited items * @param {boolean} isEnterTriggersArrowDown Flag indicating if we should add isEnterTriggersArrowDown to favorited item */ export const createRenderableFavorites = ( items: object, isGrouped: boolean, favorites: any[], isEnterTriggersArrowDown?: boolean ) => { if (isGrouped) { const favoriteItems: React.ReactNode[] = []; (items as React.ReactElement[]).forEach(group => { if (favorites.length > 0) { return ( group.props.children && (group.props.children as React.ReactElement[]) .filter(item => favorites.includes(item.props.id)) .map(item => { if (isEnterTriggersArrowDown) { return favoriteItems.push( React.cloneElement(item, { isFavorite: true, enterTriggersArrowDown: isEnterTriggersArrowDown, id: `favorite-${item.props.id}` }) ); } else { return favoriteItems.push( React.cloneElement(item, { isFavorite: true, id: `favorite-${item.props.id}` }) ); } }) ); } }); return favoriteItems; } return (items as React.ReactElement[]) .filter(item => favorites.includes(item.props.id)) .map(item => React.cloneElement(item, { isFavorite: true, enterTriggersArrowDown: isEnterTriggersArrowDown })); }; /** * This function is a helper for extending the array of renderable favorite with the select/application launcher items to render in the Application launcher or Select * * @param {object} items The items rendered in Select or Application aLauncher * @param {boolean} isGrouped Flag indicating if items are grouped * @param {any[]} favorites Array of ids of favorited items */ export const extendItemsWithFavorite = (items: object, isGrouped: boolean, favorites: any[]) => { if (isGrouped) { return (items as React.ReactElement[]).map(group => React.cloneElement(group, { children: React.Children.map(group.props.children as React.ReactElement[], item => { if (item.type === ApplicationLauncherSeparator || item.type === Divider) { return item; } return React.cloneElement(item, { isFavorite: favorites.some( favoriteId => favoriteId === item.props.id || `favorite-${favoriteId}` === item.props.id ) }); }) }) ); } return (items as React.ReactElement[]).map(item => React.cloneElement(item, { isFavorite: favorites.some(favoriteId => favoriteId === item.props.id) }) ); };