{"version":3,"file":"Autocomplete.mjs","sources":["../../../../../../../../web/src/adminPortal/components/Autocomplete.tsx"],"sourcesContent":["import CheckIcon from '@mui/icons-material/CheckRounded';\nimport Close from '@mui/icons-material/Close';\nimport ExpandMore from '@mui/icons-material/ExpandMore';\nimport {\n  Autocomplete as MuiAutocomplete,\n  autocompleteClasses,\n  IconButton,\n  inputBaseClasses,\n  outlinedInputClasses,\n  OutlinedTextFieldProps,\n  styled,\n  TextField,\n  Typography,\n} from '@mui/material';\nimport React, { MouseEventHandler, ReactNode, useState } from 'react';\n\nimport { useUniqueId } from '../../utils/uniqueId';\nimport { SelectContainer } from '../shared/components/Select';\nimport { FlexBox } from './FlexBox';\nimport { Label } from './Label';\nimport { Tag } from './Tag';\n\nconst StyledAutocomplete = styled(MuiAutocomplete)(({ theme }) => ({\n  [`& .${inputBaseClasses.root}`]: {\n    padding: theme.spacing(1),\n    gap: theme.spacing(0.5),\n    color: theme.styleConfig.inputs.textColor,\n  },\n  [`& .${outlinedInputClasses.input}.${autocompleteClasses.input}`]: {\n    padding: 0,\n    height: 24,\n    '&::placeholder': {\n      color: theme.styleConfig.inputs.placeholderColor,\n      opacity: 1,\n    },\n    '&:hover': {\n      borderColor: theme.styleConfig.inputs.textColor,\n    },\n  },\n  [`& .${outlinedInputClasses.notchedOutline}`]: {\n    border: '1px solid',\n    borderRadius: theme.styleConfig.inputs.borderRadius,\n    borderColor: theme.styleConfig.inputs.borderColor,\n  },\n  [`&:hover .${outlinedInputClasses.root} .${outlinedInputClasses.notchedOutline}, .${outlinedInputClasses.root}.${outlinedInputClasses.focused} .${outlinedInputClasses.notchedOutline}`]:\n    {\n      borderWidth: 1,\n      borderColor: theme.styleConfig.inputs.textColor,\n    },\n  [`& .${autocompleteClasses.tag}`]: {\n    margin: 0,\n  },\n})) as typeof MuiAutocomplete;\n\ninterface AutocompleteTagReceivedProps {\n  className?: string;\n  ['data-tag-index']?: number;\n  disabled?: boolean;\n  onDelete?: MouseEventHandler<HTMLElement>;\n  tabIndex?: number;\n}\n\ninterface AutocompleteTagProps extends AutocompleteTagReceivedProps {\n  children: ReactNode;\n}\n\nconst StyledIconButton = styled(IconButton)({\n  padding: '3px',\n});\n\nconst AutocompleteTag = ({ children, onDelete, ...props }: AutocompleteTagProps) => {\n  return (\n    <Tag {...props} size=\"small\" hasTopAndBottomPadding={false}>\n      <FlexBox gap={0.5} alignItems=\"center\">\n        {children}\n        {onDelete && (\n          <StyledIconButton size=\"small\" onClick={onDelete}>\n            <Close fontSize=\"small\" />\n          </StyledIconButton>\n        )}\n      </FlexBox>\n    </Tag>\n  );\n};\n\nconst Input = (props: Omit<OutlinedTextFieldProps, 'variant'>) => {\n  return <TextField {...props} variant=\"outlined\" />;\n};\n\nexport interface AutocompleteProps<TSelectItem> {\n  caption?: string;\n  fullWidth?: boolean;\n  getOptionDescription?: (item: TSelectItem) => string | undefined;\n  getOptionDisabled?: (item: TSelectItem) => boolean;\n  getOptionLabel?: (item: TSelectItem) => string;\n  id?: string;\n  label?: ReactNode;\n  menuAnchorHorizontal?: 'left' | 'right' | 'center';\n  selectItems: TSelectItem[];\n  onChange?: (value: TSelectItem[]) => void;\n  placeholder?: string;\n  readOnly?: boolean;\n  required?: boolean;\n  value: TSelectItem[];\n}\n\nconst defaultGetOptionLabel = <T,>(item: T) => item as string;\n\nexport const Autocomplete = <TSelectItem,>({\n  caption,\n  fullWidth,\n  getOptionDescription,\n  getOptionDisabled,\n  getOptionLabel = defaultGetOptionLabel,\n  id,\n  label,\n  onChange,\n  placeholder,\n  required,\n  selectItems,\n  value,\n}: AutocompleteProps<TSelectItem>) => {\n  const selectId = useUniqueId(id);\n  const [isOpen, setIsOpen] = useState(false);\n\n  return (\n    <SelectContainer fullWidth={fullWidth}>\n      {label && (\n        <Label htmlFor={selectId} required={required} variant=\"caption\" labelColor=\"secondary\">\n          {label}\n        </Label>\n      )}\n      <StyledAutocomplete\n        popupIcon={<ExpandMore />}\n        fullWidth\n        id={selectId}\n        multiple\n        onChange={(_, newValue, reason) => {\n          if (onChange) {\n            if (reason === 'clear' && getOptionDisabled) {\n              // Retain any selected values that are also disabled (i.e., should\n              // not be clearable)\n              onChange(value.filter((item) => getOptionDisabled(item)));\n            } else {\n              onChange(newValue);\n            }\n          }\n        }}\n        onClose={() => setIsOpen(false)}\n        onOpen={() => setIsOpen(true)}\n        open={isOpen}\n        value={value}\n        options={selectItems}\n        getOptionDisabled={getOptionDisabled}\n        getOptionLabel={getOptionLabel}\n        renderOption={(props, option, state) => {\n          const description = getOptionDescription?.(option);\n          return (\n            <li {...props}>\n              <FlexBox gap={0.5} alignItems=\"center\">\n                <CheckIcon\n                  fontSize=\"small\"\n                  style={{ visibility: state.selected ? 'visible' : 'hidden' }}\n                  aria-hidden={!state.selected}\n                />\n                <div>\n                  {getOptionLabel(option)}\n                  {description && <Typography variant=\"body2\">{description}</Typography>}\n                </div>\n              </FlexBox>\n            </li>\n          );\n        }}\n        renderInput={(params) => <Input {...params} placeholder={placeholder} />}\n        renderTags={(value, getTagProps) =>\n          value.map((option, index) => {\n            const { onDelete, ...tagProps } = getTagProps({ index });\n            return (\n              // key is in tagProps\n              // eslint-disable-next-line react/jsx-key\n              <AutocompleteTag {...tagProps} onDelete={getOptionDisabled?.(option) ? undefined : onDelete}>\n                {getOptionLabel(option)}\n              </AutocompleteTag>\n            );\n          })\n        }\n      />\n      {caption && <Typography variant=\"body2\">{caption}</Typography>}\n    </SelectContainer>\n  );\n};\n"],"names":["StyledAutocomplete","styled","MuiAutocomplete","theme","inputBaseClasses","root","padding","spacing","gap","color","styleConfig","inputs","textColor","outlinedInputClasses","input","autocompleteClasses","height","placeholderColor","opacity","borderColor","notchedOutline","border","borderRadius","focused","borderWidth","tag","margin","StyledIconButton","IconButton","AutocompleteTag","children","onDelete","props","React","Tag","size","hasTopAndBottomPadding","FlexBox","alignItems","onClick","Close","fontSize","Input","TextField","variant","defaultGetOptionLabel","item","Autocomplete","caption","fullWidth","getOptionDescription","getOptionDisabled","getOptionLabel","id","label","onChange","placeholder","required","selectItems","value","selectId","useUniqueId","isOpen","setIsOpen","useState","SelectContainer","Label","htmlFor","labelColor","popupIcon","ExpandMore","multiple","_","newValue","reason","filter","onClose","onOpen","open","options","renderOption","option","state","description","li","CheckIcon","style","visibility","selected","aria-hidden","div","Typography","renderInput","params","renderTags","getTagProps","map","index","tagProps","undefined"],"mappings":"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"}