import React, { HTMLAttributes } from "react"; import { useMultipleSelection } from "downshift"; import classNames from "classnames"; import { Field } from ":/components/Forms/Field"; import { LabelledBox } from ":/components/Forms/LabelledBox"; import { Button } from ":/components/Button"; import { useCunningham } from ":/components/Provider"; import { Option, SelectProps } from ":/components/Forms/Select/mono"; import { getOptionsFilter, optionToValue, } from ":/components/Forms/Select/mono-common"; /** * This method returns a comparator that can be used to filter out options for multi select. * For an option to be visible it must: * - Match the input value in terms of search * - Not be selected already * * @param selectedOptions * @param inputValue */ export function getMultiOptionsFilter( selectedOptions: Option[], inputValue?: string ) { const optionsFilter = getOptionsFilter(inputValue); return (option: Option) => { return ( !selectedOptions.find( (selectedOption) => optionToValue(selectedOption) === optionToValue(option) ) && optionsFilter(option) ); }; } export type SelectMultiProps = Omit & { onChange?: (event: { target: { value: string[] } }) => void; }; export interface SubProps extends SelectMultiProps { selectedItems: Option[]; onSelectedItemsChange: (selectedItems: Option[]) => void; } export const SelectMultiAux = ({ options, labelAsPlaceholder, selectedItems, clearable = true, disabled, hideLabel, name, downshiftReturn, useMultipleSelectionReturn, children, ...props }: SubProps & { options: Option[]; labelAsPlaceholder: boolean; selectedItems: Option[]; clearable?: boolean; downshiftReturn: { isOpen: boolean; getLabelProps: any; toggleButtonProps: any; getMenuProps: any; getItemProps: any; highlightedIndex: number; wrapperProps?: HTMLAttributes; }; useMultipleSelectionReturn: ReturnType>; }) => { const { t } = useCunningham(); const labelProps = downshiftReturn.getLabelProps(); return ( 0, } )} > {selectedItems.map((selectedItem, index) => ( ))} {clearable && !disabled && selectedItems.length > 0 && ( <> { e.stopPropagation(); props.onSelectedItemsChange([]); }} icon={close} /> > )} arrow_drop_down } disabled={disabled} {...downshiftReturn.toggleButtonProps} /> {selectedItems.map((selectedItemForRender, index) => { return ( {selectedItemForRender.label} { e.stopPropagation(); useMultipleSelectionReturn.removeSelectedItem( selectedItemForRender ); }} icon={close} /> ); })} {children} {downshiftReturn.isOpen && options.map((option, index) => { const isActive = index === downshiftReturn.highlightedIndex; return ( {option.label} ); })} ); };