import { string2Title } from "@maykin-ui/client-common"; import React from "react"; import { DEFAULT_URL_FIELDS, FieldSet, getFieldName } from "../../../lib"; import { GroupedDataProps, getContextData, } from "../../../lib/data/groupeddata"; import { Button, ButtonLink, ButtonLinkProps, ButtonProps } from "../../button"; import { Column, Grid } from "../../layout"; import { Body, H1, H2, H3, P } from "../../typography"; import { Value } from "../value"; import "./itemgrid.scss"; export type ItemGridProps = GroupedDataProps; /** * ItemGrid Component * * Shows item over various rows. * * @typeParam T - The shape of a single item. */ export const ItemGrid = ({ buttonProps, buttonLinkProps, fieldset, fieldsets, groupBy, objectList, objectLists, renderPreview, title, urlFields = DEFAULT_URL_FIELDS, onClick, ...props }: ItemGridProps) => { const [_fieldsets, _objectLists] = getContextData( groupBy, fieldset, fieldsets, objectList as T[], objectLists as T[][], ); return (
{title && (

{title}

)} {_fieldsets.map((fieldset, index) => ( key={fieldset[0] ? fieldset[0] : index} buttonLinkProps={buttonLinkProps} buttonProps={buttonProps} fieldset={fieldset} objectList={_objectLists[index]} renderPreview={renderPreview} // @ts-expect-error - complex union urlFields={urlFields} onClick={onClick} /> ))}
); }; export type ItemGridSectionProps = Omit< React.ComponentProps<"section">, "onClick" > & { buttonLinkProps?: ButtonLinkProps; buttonProps?: ButtonProps; fieldset: FieldSet; objectList: T[]; renderPreview?: (data: T) => React.ReactNode; urlFields: (keyof ItemGridSectionProps["objectList"][number])[]; onClick?: (event: React.MouseEvent, data: T) => void; }; export const ItemGridSection = ({ buttonLinkProps, buttonProps, fieldset, objectList, renderPreview, urlFields, onClick, }: ItemGridSectionProps) => (
{fieldset[0] && (

{string2Title(fieldset[0])}

)} {objectList.map((o, index) => ( key={index} buttonLinkProps={buttonLinkProps} buttonProps={buttonProps} fieldset={fieldset} object={o} renderPreview={renderPreview} urlFields={urlFields} onClick={onClick} /> ))}
); export type ItemGridItemProps = Omit< React.ComponentProps<"li">, "onClick" > & { buttonLinkProps?: ButtonLinkProps; buttonProps?: ButtonProps; fieldset: FieldSet; object: T; renderPreview?: (data: T) => React.ReactNode; urlFields: (keyof ItemGridItemProps["object"])[]; onClick?: (event: React.MouseEvent, data: T) => void; }; export const ItemGridItem = ({ buttonLinkProps, buttonProps, fieldset, object, renderPreview, urlFields, onClick, }: ItemGridItemProps) => { const fields = fieldset[1].fields; const titleField = fieldset[1].title || Object.keys(object)[0]; const urlField = urlFields.find((f) => object[f]); const label = String(object[titleField as keyof T]); const href = urlField ? String(object[urlField]) || undefined : undefined; const otherFields = fields.filter( (field) => ![...urlFields, titleField].includes(getFieldName(field)), ); return ( buttonLinkProps={buttonLinkProps} buttonProps={buttonProps} href={href} object={object} renderPreview={renderPreview} title={label} onClick={onClick} >

{string2Title(label)}

{otherFields.map((field) => (

))}
); }; export type ItemGridButtonProps = { buttonLinkProps?: ButtonLinkProps; buttonProps?: ButtonProps; href?: string; object: T; renderPreview?: (data: T) => React.ReactNode; title: string; onClick?: (event: React.MouseEvent, data: T) => void; }; export const ItemGridButton = ({ buttonLinkProps, buttonProps, href, title, object, renderPreview = () =>

{title[0].toUpperCase()}

, onClick, }: ItemGridButtonProps) => { const content = renderPreview(object); return href ? ( onClick?.(e, object)} > {content} ) : ( ); };