{"version":3,"file":"ComboboxList.cjs","sources":["../../../../src/components/Combobox/ComboboxList.tsx"],"sourcesContent":["import { cx } from '@emotion/css';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport type { UseComboboxPropGetters } from 'downshift';\nimport { useCallback } from 'react';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { Checkbox } from '../Forms/Checkbox';\nimport { ScrollContainer } from '../ScrollContainer/ScrollContainer';\n\nimport { AsyncError, LoadingOptions, NotFoundError } from './MessageRows';\nimport { getComboboxStyles, MENU_OPTION_HEIGHT, MENU_OPTION_HEIGHT_DESCRIPTION } from './getComboboxStyles';\nimport { ALL_OPTION_VALUE, ComboboxOption } from './types';\nimport { isNewGroup } from './utils';\n\nexport const VIRTUAL_OVERSCAN_ITEMS = 4;\n\ninterface ComboboxListProps<T extends string | number> {\n  options: Array<ComboboxOption<T>>;\n  highlightedIndex: number | null;\n  selectedItems?: Array<ComboboxOption<T>>;\n  scrollRef: React.RefObject<HTMLDivElement | null>;\n  getItemProps: UseComboboxPropGetters<ComboboxOption<T>>['getItemProps'];\n  enableAllOption?: boolean;\n  isMultiSelect?: boolean;\n  error?: boolean;\n  loading?: boolean;\n}\n\nexport const ComboboxList = <T extends string | number>({\n  options,\n  highlightedIndex,\n  selectedItems = [],\n  scrollRef,\n  getItemProps,\n  enableAllOption,\n  isMultiSelect = false,\n  error = false,\n  loading = false,\n}: ComboboxListProps<T>) => {\n  const styles = useStyles2(getComboboxStyles);\n\n  const estimateSize = useCallback(\n    (index: number) => {\n      const firstGroupItem = isNewGroup(options[index], index > 0 ? options[index - 1] : undefined);\n      const hasDescription = 'description' in options[index];\n      const hasGroup = 'group' in options[index];\n\n      let itemHeight = MENU_OPTION_HEIGHT;\n      if (hasDescription) {\n        itemHeight = MENU_OPTION_HEIGHT_DESCRIPTION;\n      }\n      if (firstGroupItem && hasGroup) {\n        itemHeight += MENU_OPTION_HEIGHT;\n      }\n      return itemHeight;\n    },\n    [options]\n  );\n\n  const rowVirtualizer = useVirtualizer({\n    count: options.length,\n    getScrollElement: () => scrollRef.current,\n    estimateSize,\n    overscan: VIRTUAL_OVERSCAN_ITEMS,\n  });\n\n  const isOptionSelected = useCallback(\n    (item: ComboboxOption<T>) => selectedItems.some((opt) => opt.value === item.value),\n    [selectedItems]\n  );\n\n  const allItemsSelected = enableAllOption && options.length > 1 && selectedItems.length === options.length - 1;\n\n  return (\n    <ScrollContainer showScrollIndicators maxHeight=\"inherit\" ref={scrollRef} padding={0.5}>\n      <div style={{ height: rowVirtualizer.getTotalSize() }} className={styles.menuUlContainer}>\n        {rowVirtualizer.getVirtualItems().map((virtualRow, index, allVirtualRows) => {\n          const item = options[virtualRow.index];\n          const startingNewGroup = isNewGroup(item, options[virtualRow.index - 1]);\n\n          // Find the item that renders the group header. It can be this same item if this is rendering it.\n          const groupHeaderIndex = allVirtualRows.find((row) => {\n            const rowItem = options[row.index];\n            return rowItem.group === item.group;\n          });\n          const groupHeaderItem = groupHeaderIndex && options[groupHeaderIndex.index];\n\n          const itemId = `combobox-option-${item.value}`;\n          // If we're rendering the group header, this is the ID for it. Otherwise its used on\n          // the option for aria-describedby.\n          const groupHeaderId = groupHeaderItem ? `combobox-option-group-${groupHeaderItem.value}` : undefined;\n\n          return (\n            // Wrapping div should have no styling other than virtual list positioning.\n            // It's children (header and option) should appear as flat list items.\n            <div\n              key={item.value}\n              className={styles.listItem}\n              style={{\n                height: virtualRow.size,\n                transform: `translateY(${virtualRow.start}px)`,\n              }}\n            >\n              {/* Group header */}\n              {startingNewGroup && (\n                <div\n                  role=\"presentation\"\n                  data-testid=\"combobox-option-group\"\n                  id={groupHeaderId}\n                  className={cx(\n                    styles.optionGroupHeader,\n                    item.group && styles.optionGroupLabel,\n                    virtualRow.index === 0 && styles.optionFirstGroupHeader\n                  )}\n                >\n                  {item.group}\n                </div>\n              )}\n\n              {/* Option */}\n              <div\n                className={cx(\n                  styles.option,\n                  !isMultiSelect && isOptionSelected(item) && styles.optionSelected,\n                  highlightedIndex === virtualRow.index && !item.infoOption && styles.optionFocused,\n                  item.infoOption && styles.optionInfo\n                )}\n                {...getItemProps({\n                  item: item,\n                  index: virtualRow.index,\n                  id: itemId,\n                  'aria-describedby': groupHeaderId,\n                  disabled: item.infoOption,\n                })}\n              >\n                {isMultiSelect && (\n                  <div className={styles.optionAccessory}>\n                    {!item.infoOption && (\n                      <Checkbox\n                        key={itemId}\n                        value={allItemsSelected || isOptionSelected(item)}\n                        indeterminate={item.value === ALL_OPTION_VALUE && selectedItems.length > 0 && !allItemsSelected}\n                        aria-labelledby={itemId}\n                        onClick={(e) => {\n                          e.stopPropagation();\n                        }}\n                        data-testid={`${itemId}-checkbox`}\n                      />\n                    )}\n                  </div>\n                )}\n\n                <div className={styles.optionBody}>\n                  <div className={styles.optionLabel}>{item.label ?? item.value}</div>\n\n                  {item.description && <div className={styles.optionDescription}>{item.description}</div>}\n                </div>\n              </div>\n            </div>\n          );\n        })}\n      </div>\n\n      <div aria-live=\"polite\">\n        {error && <AsyncError />}\n        {!loading && options.length === 0 && !error && <NotFoundError />}\n        {loading && options.length === 0 && <LoadingOptions />}\n      </div>\n    </ScrollContainer>\n  );\n};\n"],"names":["useStyles2","getComboboxStyles","useCallback","isNewGroup","MENU_OPTION_HEIGHT","MENU_OPTION_HEIGHT_DESCRIPTION","useVirtualizer","jsxs","ScrollContainer","jsx","cx","Checkbox","ALL_OPTION_VALUE","AsyncError","NotFoundError","LoadingOptions"],"mappings":"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"}