import { isArray, isString } from 'lodash'; import React, { useState } from 'react'; import { SilkeColor } from '../../silke-theme-provider'; import { SilkeBox } from '../silke-box'; import { SilkeCheckbox } from '../silke-checkbox'; import { SilkeContextMenu } from '../silke-context-menu'; import { SilkeImage, SilkeImageColorBackdrop } from '../silke-image'; import { SilkeOverflowMenu, SilkeOverflowMenuItem } from '../silke-overflow-menu'; import { SilkeTag, SilkeTagProps } from '../silke-tag'; import { SilkeText } from '../silke-text'; import styles from './silke-card.scss'; import { SilkeButton } from '../silke-button'; type SilkeCardProps = { title: React.ReactNode; subTitle?: React.ReactNode; image?: string | React.ReactElement | string[]; autoFocus?: boolean; text?: string; customTags?: React.ReactNode; menu?: SilkeOverflowMenuItem[]; colorBackdrop?: boolean | SilkeColor; tags?: SilkeTagProps[]; tagsTop?: SilkeTagProps[]; link?: string; selected?: boolean; checked?: boolean; onCheck?: (checked: boolean) => void; /** Shows info icon in label */ onMore?: () => void; /** * Show overflow menu above menu button */ overflowMenuAbove?: boolean; // overflowRibbonIcon?: SilkeIcons | React.ReactElement; // overflowRibbonTooltip?: string; } & Omit, 'title' | 'children'>; const stopPropagation = (e: React.MouseEvent) => { e.stopPropagation(); }; export const SilkeCard = React.forwardRef( ( { image, title, subTitle, text, className, link, overflowMenuAbove, menu, tags, customTags, tagsTop, colorBackdrop, checked, selected, onCheck, onMore, ...rest }: SilkeCardProps, cardRef, ) => { const [showContextMenu, setShowContextMenu] = useState(false); let cl = styles.card; if (className) cl += ' ' + className; if (colorBackdrop) cl += ' ' + styles.colorBackdrop; if (tags?.length) cl += ' ' + styles.hasTags; if (checked) cl += ' ' + styles.checked; if (selected) cl += ' ' + styles.selected; return ( { e.preventDefault(); setShowContextMenu(true); }} {...(rest as any)} > {image && (isArray(image) ? ( ) : isString(image) ? ( colorBackdrop === true ? ( ) : isString(colorBackdrop) ? ( ) : ( ) ) : ( image ))} {onCheck && ( e.stopPropagation()} onMouseDown={(e: React.MouseEvent) => e.stopPropagation()} > )} {tagsTop && ( {tagsTop?.map((tagContent, i) => ( ))} )} {(tags || customTags) && ( {customTags} {tags?.map((tagContent, i) => ( ))} )} {title} {subTitle && ( {subTitle} )} {onMore && ( { e.stopPropagation(); onMore(); }} /> )} {menu && ( )} {text && ( {text} )} {showContextMenu && menu && ( } onRequestClose={() => setShowContextMenu(false)} /> )} ); }, ); SilkeCard.displayName = 'SilkeCard'; function CardImageFolder({ images }: { images: string[] }) { return (
{[0, 1, 2, 3, 4, 5].map((i) => ( {images[i] && } ))}
); }