{"version":3,"file":"FluentScrollLoadAutocompleteMenu.mjs","names":["React","useState","useCallback","useEffect","forwardRef","useRef","Children","PropTypes","CircularProgress","apiMutate","FluentSelectMenu","makeStyles","useTranslation","Box","Alert","useStyles","theme","listbox","position","maxHeight","overflow","listboxHidden","loadingItem","textAlign","padding","spacing","overlay","inset","background","display","flexDirection","alignItems","justifyContent","zIndex","overlayText","marginTop","alert","FluentScrollLoadAutocompleteMenu","apiBaseUrl","apiEndpoint","apiConfig","apiData","mapResponse","onChange","getOptionLabel","o","name","groupBy","placeholder","displayProperty","width","fetchEnabled","initialValue","initialOptions","isPaginated","isSortable","isFilterable","pageSize","sortColumn","sortDirection","classes","options","setOptions","value","setValue","inputValue","setInputValue","loading","setLoading","loadingMore","setLoadingMore","error","setError","pageNumber","setPageNumber","totalRows","setTotalRows","configRef","dataRef","listboxRef","prevScrollPositionRef","t","fetchPage","keyword","page","append","url","resp","current","items","total","data","prev","err","response","message","defaultValue","handleListboxScroll","e","node","currentTarget","scrollTop","clientHeight","scrollHeight","length","Listbox","children","initialLoading","other","ref","inst","count","displayName","timer","setTimeout","clearTimeout","val","endAdornment","onInputChange","_e","v","ListboxComponent","ListboxProps","onScroll","propTypes","string","isRequired","func","object","any","oneOfType","number","bool","array","oneOf"],"sources":["../../../../src/UI/inputs/menus/FluentScrollLoadAutocompleteMenu.jsx"],"sourcesContent":["import React, {\n  useState,\n  useCallback,\n  useEffect,\n  forwardRef,\n  useRef,\n  Children,\n} from 'react';\nimport PropTypes from 'prop-types';\nimport { CircularProgress } from '@material-ui/core';\nimport { apiMutate } from '../../../utilities/useAxiosMutate';\nimport { FluentSelectMenu } from './FluentSelectMenu';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { useTranslation } from 'react-i18next';\nimport { Box } from '../../Box';\nimport Alert from '@material-ui/lab/Alert';\n\nconst useStyles = makeStyles((theme) => ({\n  listbox: {\n    position: 'relative',\n    maxHeight: 300,\n    overflow: 'auto',\n  },\n  listboxHidden: {\n    overflow: 'hidden',\n  },\n  loadingItem: {\n    textAlign: 'center',\n    padding: theme.spacing(1),\n  },\n  overlay: {\n    position: 'absolute',\n    inset: 0,\n    background: 'rgba(255,255,255,.95)',\n    display: 'flex',\n    flexDirection: 'column',\n    alignItems: 'center',\n    justifyContent: 'center',\n    zIndex: 1,\n  },\n  overlayText: {\n    marginTop: theme.spacing(1),\n  },\n  alert: {\n    marginTop: theme.spacing(1),\n  },\n}));\n\n/**\n* **FluentScrollLoadAutocompleteMenu**\n*\n* A drop‑in extension for MUI’s `<Autocomplete>` that:\n*\n* 1. Fetches paginated / sortable data from any REST endpoint  \n* 2. Implements infinite scrolling with automatic scroll‑position restore  \n* 3. Supports client‑side filtering, grouping   \n* 4. Displays a Material UI `<CircularProgress>` while loading and a MUI `<Alert>` on errors\n*\n* Internally it wraps **unity‑fluent‑library**’s `<FluentSelectMenu>` so you get the same\n* keyboard navigation and styling as the rest of the Fluent controls.\n*\n* ---\n*\n* ### Typical usage\n* ```jsx\n* const endpoint = (q, page, size, sortCol, sortDir) =>\n*   `/api/products?search=${q}&page=${page}&pageSize=${size}&sort=${sortCol}&dir=${sortDir}`;\n*\n* const map = (raw) => ({\n*   items: raw.items,\n*   total: raw.totalRows,\n* });\n*\n* <FluentScrollLoadAutocompleteMenu\n*   apiBaseUrl=\"https://api.example.com\"\n*   apiEndpoint={endpoint}\n*   mapResponse={map}\n*   onChange={(product) => console.log(product)}\n* />\n* ```\n* ---\n*\n* @param {Object}   props\n* @param {string}   props.apiBaseUrl   Base URL forwarded to **apiMutate**\n* @param {Function} props.apiEndpoint  `(keyword, page, pageSize, sortCol, sortDir) => string`\n* @param {Function} props.mapResponse  Maps raw API payload → `{ items, total }`\n* @param {Function} [props.onChange]   Fires when the user selects/clears an option\n* @param {Function} [props.getOptionLabel] Returns the display label for an item (default: `o.name`)\n* @param {Function} [props.groupBy]    Returns a group heading string for an item\n* @param {string}   [props.placeholder='Search…'] Placeholder text\n* @param {string}   [props.displayProperty='name'] Property passed to `<FluentSelectMenu>`\n* @param {number|string} [props.width=300] Fixed width of the component container\n* @param {boolean}  [props.fetchEnabled=true] Disable to work fully offline\n* @param {*}        [props.initialValue=null]  Pre‑selected value shown immediately\n* @param {Array}    [props.initialOptions=[]]  Pre‑loaded options shown immediately\n* @param {boolean}  [props.isPaginated=true]   Disable if your API returns the full list\n* @param {boolean}  [props.isSortable=true]    Disable server‑side sorting\n* @param {boolean}  [props.isFilterable=true]  Disable server‑side filtering\n* @param {number}   [props.pageSize=50]        Items per page when paginating\n* @param {string}   [props.sortColumn='Name']  Default sort column\n* @param {'ASC'|'DESC'} [props.sortDirection='ASC'] Default sort direction\n*\n* @returns {JSX.Element}\n*/\nexport const FluentScrollLoadAutocompleteMenu = ({\n  apiBaseUrl,\n  apiEndpoint,\n  apiConfig = {},\n  apiData = null,\n  mapResponse,\n  onChange,\n  getOptionLabel = (o) => o?.name ?? '',\n  groupBy,\n  placeholder,\n  displayProperty = 'name',\n  width = 300,\n  fetchEnabled = true,\n  initialValue = null,\n  initialOptions = [],\n  isPaginated = true,\n  isSortable = true,\n  isFilterable = true,\n  pageSize = 50,\n  sortColumn = 'Name',\n  sortDirection = 'ASC',\n}) => {\n  const classes = useStyles();\n  const [options, setOptions] = useState(initialOptions);\n  const [value, setValue] = useState(initialValue);\n  const [inputValue, setInputValue] = useState('');\n  const [loading, setLoading] = useState(false);\n  const [loadingMore, setLoadingMore] = useState(false);\n  const [error, setError] = useState(null);\n  const [pageNumber, setPageNumber] = useState(1);\n  const [totalRows, setTotalRows] = useState(0);\n\n  const configRef = useRef(apiConfig);\n  const dataRef = useRef(apiData);\n  const listboxRef = useRef(null);\n  const prevScrollPositionRef = useRef(0);\n\n  const { t } = useTranslation();\n\n  /**\n   * Fetches a page of data from the provided API endpoint and updates the component state accordingly.\n   *\n   * This function supports:\n   * - Filtering (if `isFilterable` is true)\n   * - Sorting (if `isSortable` is true)\n   * - Pagination (based on the `page` and `pageSize` arguments)\n   * - Infinite scroll appending (via the `append` flag)\n   *\n   * @function fetchPage\n   * @param {string} keyword - The keyword to filter results by (if filtering is enabled)\n   * @param {number} page - The page number to fetch\n   * @param {boolean} [append=false] - If true, appends results to the current list; otherwise replaces it\n   * @returns {Promise<void>} - Resolves once data is fetched and state is updated\n   */\n  const fetchPage = useCallback(\n    async (keyword, page, append = false) => {\n      if (!fetchEnabled) return;\n\n      setError(null);\n      page === 1 ? setLoading(true) : setLoadingMore(true);\n\n      try {\n        const url = apiEndpoint(\n          isFilterable ? keyword : '',\n          page,\n          pageSize,\n          isSortable ? sortColumn : '',\n          isSortable ? sortDirection : 'ASC'\n        );\n        const resp = await apiMutate(apiBaseUrl, url, configRef.current, dataRef.current);\n        const { items, total } = mapResponse(resp.data);\n\n        setOptions((prev) => (append ? [...prev, ...items] : items));\n        setTotalRows(total);\n        setPageNumber(page);\n      } catch (err) {\n        setError(\n          err.response?.data?.message ??\n            err.message ??\n            t('ui.search.unknownError', { defaultValue: 'Unknown error' })\n        );\n      } finally {\n        page === 1 ? setLoading(false) : setLoadingMore(false);\n      }\n    },\n    [\n      apiBaseUrl,\n      apiEndpoint,\n      mapResponse,\n      pageSize,\n      sortColumn,\n      sortDirection,\n      isFilterable,\n      isSortable,\n      fetchEnabled,\n      t,\n    ]\n  );\n\n  /* ---------- infinite scroll ---------- */\n  const handleListboxScroll = (e) => {\n    if (!isPaginated) return;\n\n    const node = e.currentTarget;\n    prevScrollPositionRef.current = node.scrollTop;\n\n    if (\n      node.scrollTop + node.clientHeight >= node.scrollHeight - 30 &&\n      !loadingMore &&\n      options.length < totalRows\n    ) {\n      fetchPage(inputValue, pageNumber + 1, true);\n    }\n  };\n\n  /**\n   * **Listbox**\n   *\n   * Custom scrollable container used by the Autocomplete dropdown.\n   * - Attaches a ref to preserve scroll position between pages.\n   * - Displays a loading message if no options are present initially.\n   * - Shows a full overlay spinner when `loadingMore` is true.\n   *\n   * This component is passed as the `ListboxComponent` to FluentSelectMenu’s\n   * Autocomplete integration, enabling infinite scroll with visual feedback.\n   *\n   * @param {Object} props\n   * @param {React.ReactNode} props.children - Option elements to render\n   * @param {boolean} props.initialLoading - Whether to show the “Loading…” message initially\n   * @param {React.Ref} ref - Forwarded ref from the Autocomplete dropdown\n   * @returns {JSX.Element}\n   */\n  const Listbox = forwardRef(({ children, initialLoading, ...other }, ref) => (\n    <ul\n      ref={(inst) => {\n        if (inst) listboxRef.current = inst;\n        if (typeof ref === 'function') ref(inst);\n        else if (ref) ref.current = inst;\n      }}\n      {...other}\n      style={{\n        position: 'relative',\n        maxHeight: 300,\n        overflow: loadingMore ? 'hidden' : 'auto',\n      }}\n    >\n      {Children.count(children) === 0 && initialLoading ? (\n        <li style={{ textAlign: 'center', padding: 8 }}>\n          {t('common.loading', { defaultValue: 'Loading...' })}\n        </li>\n      ) : (\n        children\n      )}\n\n      {loadingMore && (\n        <Box className={classes.overlay}>\n          <CircularProgress size={20} />\n          <span className={classes.overlayText}>\n            {t('common.loading', { defaultValue: 'Loading...' })}\n          </span>\n        </Box>\n      )}\n    </ul>\n  ));\n  Listbox.displayName = 'FluentSMAutocompleteListbox';\n\n  /* [Initial / filtered fetch] */\n  useEffect(() => {\n    if (!fetchEnabled || !isFilterable) return;\n    if (value && inputValue === getOptionLabel(value)) return;\n\n    const timer = setTimeout(() => fetchPage(inputValue, 1, false), 400);\n    return () => clearTimeout(timer);\n  }, [inputValue, fetchPage, value, getOptionLabel, isFilterable, fetchEnabled]);\n\n  // [Initial fetch when filtering is disabled]\n  useEffect(() => {\n    if (!fetchEnabled || isFilterable) return;\n    fetchPage('', 1, false);\n  }, [isFilterable, fetchEnabled, fetchPage]);\n\n  // [Restores scroll position after loading more items]\n  useEffect(() => {\n    if (!loadingMore && listboxRef.current) {\n      listboxRef.current.scrollTop = prevScrollPositionRef.current;\n    }\n  }, [options, loadingMore]);\n\n  useEffect(() => { configRef.current = apiConfig }, [apiConfig]);\n  useEffect(() => { dataRef.current = apiData }, [apiData]);\n\n  return (\n    <Box width={width}>\n      <FluentSelectMenu\n        placeholder={\n          placeholder ??\n          t('ui.search.searchPlaceholder', { defaultValue: 'Search…' })\n        }\n        data={options}\n        displayProperty={displayProperty}\n        onChange={(val) => {\n          setValue(val);\n          onChange?.(val);\n        }}\n        InputProps={{\n          endAdornment:\n            loading && pageNumber === 1 ? (\n              <CircularProgress color=\"inherit\" size={20} />\n            ) : null,\n        }}\n        autoCompleteProps={{\n          value,\n          inputValue,\n          onInputChange: (_e, v) => setInputValue(v),\n          loading: loading && pageNumber === 1,\n          getOptionLabel,\n          groupBy,\n          ListboxComponent: Listbox,\n          ListboxProps: {\n            onScroll: handleListboxScroll,\n            initialLoading: loading && pageNumber === 1,\n          },\n        }}\n      />\n\n      {error && (\n        <Alert severity=\"error\" style={{ marginTop: 8 }}>\n          {error}\n        </Alert>\n      )}\n    </Box>\n  );\n};\n\nFluentScrollLoadAutocompleteMenu.propTypes = {\n  /** Base URL used by apiMutate */\n  apiBaseUrl: PropTypes.string.isRequired,\n\n  /** Builds the endpoint URL: (keyword, page, pageSize, sortCol, sortDir) => string */\n  apiEndpoint: PropTypes.func.isRequired,\n\n  /** Additional config passed to apiMutate */\n  apiConfig: PropTypes.object,\n\n  /** Raw API data passed to apiMutate */\n  apiData: PropTypes.any,\n\n  /** Maps raw API payload into { items, total } */\n  mapResponse: PropTypes.func.isRequired,\n\n  /** Called when the user selects or clears an option */\n  onChange: PropTypes.func,\n\n  /** Returns the text label for a given option */\n  getOptionLabel: PropTypes.func,\n\n  /** Returns the group heading for a given option */\n  groupBy: PropTypes.func,\n\n  placeholder: PropTypes.string,\n  displayProperty: PropTypes.string,\n  width: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n\n  /* Behavior flags */\n  fetchEnabled: PropTypes.bool,\n  initialValue: PropTypes.any,\n  initialOptions: PropTypes.array,\n\n  isPaginated: PropTypes.bool,\n  isSortable: PropTypes.bool,\n  isFilterable: PropTypes.bool,\n\n  pageSize: PropTypes.number,\n  sortColumn: PropTypes.string,\n  sortDirection: PropTypes.oneOf(['ASC', 'DESC']),\n};\n"],"mappings":"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"}