/** * @upsetjs/react * https://github.com/upsetjs/upsetjs * * Copyright (c) 2021 Samuel Gratzl */ import type { ISetLike } from '@upsetjs/model'; import React, { PropsWithChildren } from 'react'; import type { UpSetAddon, UpSetAddonProps } from '../interfaces'; import CombinationSelectionChart from './CombinationSelectionChart'; import type { UpSetDataInfo } from '../derive/deriveDataDependent'; import type { UpSetSizeInfo } from '../derive/deriveSizeDependent'; import type { UpSetStyleInfo } from '../derive/deriveStyleDependent'; import LabelsSelection from './LabelsSelection'; import SetSelectionChart from './SetSelectionChart'; import UpSetSelectionChart from './UpSetSelectionChart'; import { generateSelectionOverlap, elemElemOverlapOf, isSetLike, generateSelectionName } from '../utils'; const EMPTY_ARRAY: any[] = []; export default function UpSetSelection({ size, data, style, selection, hasHover, }: PropsWithChildren<{ size: UpSetSizeInfo; style: UpSetStyleInfo; data: UpSetDataInfo; hasHover?: boolean; selection: ISetLike | null | readonly T[] | ((s: ISetLike) => number); }>) { const empty = style.emptySelection; const selectionOverlap = generateSelectionOverlap(selection, data.overlapGuesser, data.toElemKey); const selectionName = generateSelectionName(selection); const someAddon = size.sets.addons.some((s) => s.renderSelection != null) || size.cs.addons.some((s) => s.renderSelection != null); const selectionElemOverlap = selection && typeof selection !== 'function' && someAddon ? elemElemOverlapOf(Array.isArray(selection) ? selection : (selection as ISetLike).elems, data.toElemKey) : null; function wrapAddon>(addon: UpSetAddon) { return { ...addon, render: (props: UpSetAddonProps) => { const overlap = selectionElemOverlap ? selectionElemOverlap(props.set) : null; return addon.renderSelection ? addon.renderSelection({ selection, selectionColor: style.selectionColor || props.set.color || 'orange', overlap, ...props, }) : null; }, }; } return ( {(selection || empty) && ( )} {(selection || empty) && ( )} {isSetLike(selection) && } {isSetLike(selection) && } ); }