import { Fragment } from "react"; import { Field, FieldProps } from "formik"; import { Transition, Listbox } from "@headlessui/react"; import { CheckIcon, SelectorIcon } from "@heroicons/react/solid"; import { MultiSelect as RMSC } from "react-multi-select-component"; import { classNames, COL_WIDTHS } from "../../utils"; import { SettingsContext } from "../../utils/Context"; export interface MultiSelectOption { value: string | number; label: string; key?: string; disabled?: boolean; } interface MultiSelectProps { name: string; label?: string; options: MultiSelectOption[]; columns?: COL_WIDTHS; creatable?: boolean; } export const MultiSelect = ({ name, label, options, columns, creatable }: MultiSelectProps) => { const settingsContext = SettingsContext.useValue(); const handleNewField = (value: string) => ({ value: value.toUpperCase(), label: value.toUpperCase(), key: value }); return (
{({ field, form: { setFieldValue } }: FieldProps) => ( ({ value: i.value ?? i, label: i.label ?? i }))].reduce((map, obj) => map.set(obj.value, obj), new Map()).values()]} labelledBy={name} isCreatable={creatable} onCreateOption={handleNewField} value={field.value && field.value.map((item: MultiSelectOption) => ({ value: item.value ? item.value : item, label: item.label ? item.label : item }))} onChange={(values: Array) => { const am = values && values.map((i) => i.value); setFieldValue(field.name, am); }} className={settingsContext.darkTheme ? "dark" : ""} /> )}
); }; interface IndexerMultiSelectOption { id: number; name: string; } export const IndexerMultiSelect = ({ name, label, options, columns }: MultiSelectProps) => { const settingsContext = SettingsContext.useValue(); return (
{({ field, form: { setFieldValue } }: FieldProps) => ( ({ value: item.id, label: item.name }))} onChange={(values: MultiSelectOption[]) => { const item = values && values.map((i) => ({ id: i.value, name: i.label })); setFieldValue(field.name, item); }} className={settingsContext.darkTheme ? "dark" : ""} /> )}
); }; interface DownloadClientSelectProps { name: string; action: Action; clients: DownloadClient[]; } export function DownloadClientSelect({ name, action, clients }: DownloadClientSelectProps) { return (
{({ field, form: { setFieldValue } }: FieldProps) => ( setFieldValue(field?.name, value)} > {({ open }) => ( <> Client
{field.value ? clients.find((c) => c.id === field.value)?.name : "Choose a client"} {clients .filter((c) => c.type === action.type) .map((client) => ( classNames( active ? "text-white dark:text-gray-100 bg-indigo-600 dark:bg-gray-800" : "text-gray-900 dark:text-gray-300", "cursor-default select-none relative py-2 pl-3 pr-9" )} value={client.id} > {({ selected, active }) => ( <> {client.name} {selected ? ( ) : null} )} ))}
)}
)}
); } interface SelectFieldOption { label: string; value: string; } interface SelectFieldProps { name: string; label: string; optionDefaultText: string; options: SelectFieldOption[]; } export const Select = ({ name, label, optionDefaultText, options }: SelectFieldProps) => { return (
{({ field, form: { setFieldValue } }: FieldProps) => ( setFieldValue(field?.name, value)} > {({ open }) => ( <> {label}
{field.value ? options.find((c) => c.value === field.value)?.label : optionDefaultText } {options.map((opt) => ( classNames( active ? "text-white dark:text-gray-100 bg-indigo-600 dark:bg-gray-800" : "text-gray-900 dark:text-gray-300", "cursor-default select-none relative py-2 pl-3 pr-9" ) } value={opt.value} > {({ selected, active }) => ( <> {opt.label} {selected ? ( ) : null} )} ))}
)}
)}
); }; export const SelectWide = ({ name, label, optionDefaultText, options }: SelectFieldProps) => { return (
{({ field, form: { setFieldValue } }: FieldProps) => ( setFieldValue(field?.name, value)} > {({ open }) => (
{label}
{field.value ? options.find((c) => c.value === field.value)?.label : optionDefaultText } {options.map((opt) => ( classNames( active ? "text-white dark:text-gray-100 bg-indigo-600 dark:bg-gray-800" : "text-gray-900 dark:text-gray-300", "cursor-default select-none relative py-2 pl-3 pr-9" ) } value={opt.value} > {({ selected, active }) => ( <> {opt.label} {selected ? ( ) : null} )} ))}
)}
)}
); };