import React, { cloneElement, MouseEvent, ReactElement, ReactNode, CSSProperties, } from 'react' import _ from 'lodash' import classNames from 'classnames' import SVGRemove from '../../svg/remove.svg' import { IconDownUp } from '../icon_down_up' import { Flex } from '../flex' interface MultipleSelectionSelectedItem { value: V text: string [key: string]: any } interface MultipleSelectionProps { selected: MultipleSelectionSelectedItem[] onSelect(selected: MultipleSelectionSelectedItem[]): void placeholder?: string /** 自定义 selected */ renderSelected?(item: MultipleSelectionSelectedItem): ReactNode /** 代替默认的 Icon */ funIcon?: ReactNode /** 禁用清除 */ disabledClose?: boolean className?: string style?: CSSProperties } function MultipleSelection({ selected, onSelect, placeholder, renderSelected = (value: any) => value.text, funIcon, disabledClose, className, style, ...rest }: MultipleSelectionProps) { const handleClear = (e: MouseEvent): void => { e.preventDefault() e.stopPropagation() onSelect([]) } const handleClose = (item: MultipleSelectionSelectedItem) => { onSelect(_.xorBy(selected, [item], (v) => v.value)) } return (
{selected.length === 0 && {placeholder}} {_.map(selected, (item: MultipleSelectionSelectedItem, i) => (
{renderSelected(item)} { handleClose(item) }} className='gm-multiple-selection-item-close' />
))}
{selected && !disabledClose && (
)} {funIcon ? ( cloneElement(funIcon as ReactElement, { className: classNames( 'gm-multiple-selection-icon', { 'gm-multiple-selection-fun-icon': selected && !disabledClose, }, (funIcon as ReactElement).props?.className ), }) ) : ( )}
) } export default MultipleSelection export type { MultipleSelectionProps, MultipleSelectionSelectedItem }