{"version":3,"file":"FluentTextFieldAutoComplete.mjs","names":["React","useCallback","useEffect","useState","TextField","makeStyles","Popper","Autocomplete","clsx","useStyles","theme","formTextInput","fontSize","labelRoot","AutoCompletePopper","props","$","_c","t0","FluentTextFieldAutoComplete","label","placeholder","options","textFieldProps","disabled","onChange","onChangeProp","value","optionKey","additionalOnChangeAction","classes","classProps","variant","inputProps","inputPropClasses","customPopper","disableClearable","defaultValue","additionalOptionKey","isMultiple","limitTags","renderTags","optionLabelDisplayFunction","option","groupBy","size","id","udprecordid","freeSolo","formatUserInputValue","filterOptions","filterOptionsProp","other","autocompleteRoot","inputValue","setInputValue","shouldControlInputValue","autoCompleteId","getOptionLabel","formatRawInput","raw","getComparableLabel","normalizeFilterValue","toLowerCase","trim","defaultFilterOptions","optionList","input","filter","includes","hasMatchingValue","values","candidate","Array","isArray","undefined","candidateLabel","some","item","itemKey","candidateKey","commitFreeSoloMultiple","formatted","currentValues","nextValues","e","nextValue","reason","resolvedValue","length","trimmed","pop","push","handleInputChange","newInputValue","handleClose","event","updatedValue","val","root","formControl","params","onKeyDown","defaultMuiPrevented","key","didCommit","preventDefault","stopPropagation","InputProps","inputPropRoot","inputPropInput","formLabelRoot"],"sources":["../../../../src/UI/inputs/textField/FluentTextFieldAutoComplete.jsx"],"sourcesContent":["/* eslint-disable no-use-before-define */\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { TextField, makeStyles, Popper } from '@material-ui/core';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport clsx from 'clsx';\n\nconst useStyles = makeStyles((theme) => ({\n  formTextInput: {\n    fontSize: 14\n  },\n  labelRoot: {\n    fontSize: 14\n  }\n}));\n\nconst AutoCompletePopper = (props) => {\n  return <Popper {...props} placement='bottom-start' />;\n};\n\nexport const FluentTextFieldAutoComplete = (props) => {\n  const {\n    label,\n    placeholder,\n    options,\n    textFieldProps,\n    disabled,\n    onChange: onChangeProp,\n    value,\n    optionKey,\n    additionalOnChangeAction,\n    classes: classProps,\n    variant = 'outlined',\n    inputProps,\n    inputPropClasses,\n    customPopper,\n    disableClearable = false,\n    defaultValue,\n    additionalOptionKey,\n    isMultiple = false,\n    limitTags,\n    renderTags,\n    optionLabelDisplayFunction = (option) => option,\n    groupBy = null,\n    size = 'medium',\n    id,\n    udprecordid,\n    freeSolo = false,\n    formatUserInputValue,\n    filterOptions: filterOptionsProp,\n    ...other\n  } = props;\n\n  const classes = useStyles();\n  const { autocompleteRoot } = classProps || {};\n  const [inputValue, setInputValue] = useState('');\n  const shouldControlInputValue = freeSolo;\n  const autoCompleteId = id;\n\n  const getOptionLabel = useCallback(\n    (option) => {\n      if (!option) return '';\n      if (optionKey && typeof option === 'object') {\n        return `${optionLabelDisplayFunction(option[optionKey])}${\n          additionalOptionKey ? ` - (${option[additionalOptionKey]})` : ''\n        }`;\n      }\n      return optionLabelDisplayFunction(option) || '';\n    },\n    [optionKey, additionalOptionKey, optionLabelDisplayFunction]\n  );\n\n  const formatRawInput = useCallback(\n    (raw) => (formatUserInputValue ? formatUserInputValue(raw) : raw),\n    [formatUserInputValue]\n  );\n\n  const getComparableLabel = useCallback(\n    (option) => {\n      if (!option) return '';\n      if (typeof option === 'string') return option;\n      return getOptionLabel(option);\n    },\n    [getOptionLabel]\n  );\n\n  const normalizeFilterValue = useCallback(\n    (value) => `${value ?? ''}`.toLowerCase().trim(),\n    []\n  );\n\n  const defaultFilterOptions = useCallback(\n    (optionList) => {\n      const input = normalizeFilterValue(inputValue);\n\n      if (!input) return optionList;\n      return optionList.filter((option) =>\n        normalizeFilterValue(getComparableLabel(option)).includes(input)\n      );\n    },\n    [getComparableLabel, normalizeFilterValue, inputValue]\n  );\n\n  const hasMatchingValue = useCallback(\n    (values, candidate) => {\n      if (\n        !Array.isArray(values) ||\n        candidate === null ||\n        candidate === undefined\n      )\n        return false;\n\n      const candidateLabel = getComparableLabel(candidate);\n\n      return values.some((item) => {\n        if (item === candidate) return true;\n\n        if (\n          optionKey &&\n          typeof item === 'object' &&\n          typeof candidate === 'object'\n        ) {\n          const itemKey = item?.[optionKey];\n          const candidateKey = candidate?.[optionKey];\n          if (itemKey !== undefined && candidateKey !== undefined) {\n            return itemKey === candidateKey;\n          }\n        }\n\n        if (\n          optionKey &&\n          typeof item === 'object' &&\n          typeof candidate === 'string'\n        ) {\n          const itemKey = item?.[optionKey];\n          if (itemKey !== undefined) return `${itemKey}` === candidate;\n        }\n\n        if (\n          optionKey &&\n          typeof candidate === 'object' &&\n          typeof item === 'string'\n        ) {\n          const candidateKey = candidate?.[optionKey];\n          if (candidateKey !== undefined) return `${candidateKey}` === item;\n        }\n\n        return getComparableLabel(item) === candidateLabel;\n      });\n    },\n    [optionKey, getComparableLabel]\n  );\n\n  const commitFreeSoloMultiple = useCallback(() => {\n    if (!freeSolo || !isMultiple) return false;\n\n    const raw = (inputValue || '').trim();\n    if (!raw) return false;\n\n    const formatted = formatRawInput(raw);\n    if (formatted === '' || formatted === null || formatted === undefined) {\n      setInputValue('');\n      return false;\n    }\n\n    const currentValues = Array.isArray(value) ? value : [];\n    if (hasMatchingValue(currentValues, formatted)) {\n      setInputValue('');\n      return false;\n    }\n\n    const nextValues = [...currentValues, formatted];\n    if (additionalOnChangeAction) additionalOnChangeAction(nextValues);\n    onChangeProp?.(nextValues);\n    setInputValue('');\n    return true;\n  }, [\n    freeSolo,\n    isMultiple,\n    inputValue,\n    formatRawInput,\n    value,\n    hasMatchingValue,\n    additionalOnChangeAction,\n    onChangeProp\n  ]);\n\n  const onChange = useCallback(\n    (e, nextValue, reason) => {\n      let resolvedValue = nextValue;\n\n      if (freeSolo && isMultiple && reason === 'create-option') {\n        const values = Array.isArray(nextValue) ? [...nextValue] : [];\n        const raw = values[values.length - 1];\n\n        if (typeof raw === 'string') {\n          const trimmed = raw.trim();\n          values.pop();\n\n          if (trimmed) {\n            const formatted = formatRawInput(trimmed);\n            if (\n              formatted !== '' &&\n              formatted !== null &&\n              formatted !== undefined &&\n              !hasMatchingValue(values, formatted)\n            ) {\n              values.push(formatted);\n            }\n          }\n\n          setInputValue('');\n          resolvedValue = values;\n        }\n      }\n\n      if (\n        freeSolo &&\n        isMultiple &&\n        (reason === 'select-option' || reason === 'clear')\n      ) {\n        setInputValue('');\n      }\n\n      if (additionalOnChangeAction) {\n        additionalOnChangeAction(resolvedValue);\n      }\n      return onChangeProp?.(resolvedValue);\n    },\n    [\n      additionalOnChangeAction,\n      freeSolo,\n      isMultiple,\n      formatRawInput,\n      hasMatchingValue,\n      onChangeProp\n    ]\n  );\n\n  const handleInputChange = useCallback(\n    (e, newInputValue, reason) => {\n      const nextValue = newInputValue ?? '';\n      if (freeSolo && isMultiple && reason === 'reset') {\n        return;\n      }\n      setInputValue(nextValue);\n\n      if (!freeSolo || isMultiple) return;\n\n      if (reason === 'input' || reason === 'clear') {\n        if (additionalOnChangeAction) additionalOnChangeAction(nextValue);\n        onChangeProp?.(nextValue);\n      }\n    },\n    [freeSolo, isMultiple, additionalOnChangeAction, onChangeProp]\n  );\n\n  const handleClose = useCallback(\n    (event, reason) => {\n      if (!freeSolo) return;\n\n      const raw = (inputValue || '').trim();\n      if (!raw) return;\n\n      if (isMultiple) {\n        if (reason !== 'blur') return;\n        commitFreeSoloMultiple();\n        return;\n      }\n\n      if (value && typeof value === 'object') return;\n\n      if (\n        reason === 'blur' ||\n        reason === 'enter' ||\n        reason === 'create-option'\n      ) {\n        const updatedValue = formatRawInput(raw);\n        if (additionalOnChangeAction) additionalOnChangeAction(updatedValue);\n        onChangeProp?.(updatedValue);\n      }\n    },\n    [\n      freeSolo,\n      isMultiple,\n      value,\n      inputValue,\n      formatRawInput,\n      commitFreeSoloMultiple,\n      additionalOnChangeAction,\n      onChangeProp\n    ]\n  );\n\n  useEffect(() => {\n    if (!freeSolo || isMultiple) return;\n\n    if (value === null || value === undefined) {\n      if (inputValue !== '') setInputValue('');\n      return;\n    }\n\n    const nextValue = typeof value === 'string' ? value : getOptionLabel(value);\n    if (nextValue !== inputValue) {\n      setInputValue(nextValue || '');\n    }\n  }, [freeSolo, isMultiple, value, getOptionLabel, inputValue]);\n\n  return (\n    <Autocomplete\n      id={autoCompleteId}\n      multiple={isMultiple}\n      limitTags={limitTags}\n      disabled={disabled}\n      options={options || []}\n      getOptionLabel={getOptionLabel}\n      getOptionSelected={(option, val) =>\n        optionKey ? option[optionKey] === val[optionKey] : option === val\n      }\n      groupBy={groupBy}\n      onChange={onChange}\n      inputValue={shouldControlInputValue ? inputValue : undefined}\n      onInputChange={shouldControlInputValue ? handleInputChange : undefined}\n      onClose={handleClose}\n      value={value || (isMultiple ? [] : null)}\n      className={autocompleteRoot}\n      classes={{\n        root: classProps?.formControl\n      }}\n      PopperComponent={customPopper || AutoCompletePopper}\n      disableClearable={disableClearable}\n      defaultValue={defaultValue}\n      size={size}\n      renderInput={(params) => (\n        <TextField\n          {...textFieldProps}\n          {...params}\n          {...other}\n          inputProps={{\n            ...params.inputProps,\n            udprecordid: udprecordid,\n            onKeyDown: (event) => {\n              params.inputProps?.onKeyDown?.(event);\n              textFieldProps?.onKeyDown?.(event);\n\n              if (event.defaultMuiPrevented) return;\n              if (!freeSolo || !isMultiple) return;\n              if (event.key !== 'Enter') return;\n\n              const didCommit = commitFreeSoloMultiple();\n              if (didCommit) {\n                event.preventDefault();\n                event.stopPropagation();\n              }\n            }\n          }}\n          label={label}\n          margin='dense'\n          variant={variant}\n          placeholder={placeholder}\n          size='small'\n          InputProps={{\n            ...params.InputProps,\n            ...inputProps,\n            classes: {\n              root: classProps?.inputPropRoot,\n              input: clsx(classes.formTextInput, classProps?.inputPropInput)\n            }\n          }}\n          InputLabelProps={{\n            classes: {\n              root: clsx(classes.labelRoot, classProps?.formLabelRoot)\n            }\n          }}\n        />\n      )}\n      renderTags={renderTags}\n      filterOptions={\n        filterOptionsProp || (freeSolo ? defaultFilterOptions : undefined)\n      }\n      freeSolo={freeSolo}\n    />\n  );\n};\n"],"mappings":"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"}