import React, { useMemo } from "react"; import clsx from "clsx"; import type { SelectOptionListProps, SelectOptionState } from "./types"; import type { ExtendedSelectData } from "../types"; const OPTIONS_WITHOUT_GROUP = 0; const TESelect: React.FC = ({ data, selectData, selectedElements, optionHeight, handleOptionClick, handleSelectAll, selectAll, selectAllLabel, multiple, activeElementIndex, search, noResultsText, theme = {}, }) => { // classes const optionClasses = ({ disabled, selected, active, hidden, group, }: SelectOptionState) => { return clsx( theme.selectOption, !disabled && !selected && !active && theme.selectOptionDefault, !disabled && theme.selectOptionNonDisabled, disabled && theme.selectOptionDisabled, hidden && "hidden", selected && theme.selectOptionSelected, active && theme.selectOptionActive, group && theme.selectOptionsOptGroup ); }; // group options const optionGroups = useMemo(() => { const groups = selectData.filter((el) => el.optgroup).map((el) => el.text); return groups; }, [selectData]); const groupedSelectData = useMemo(() => { let groupIndex = 0; const groupedData = selectData.map((el) => { if (el.optgroup) { groupIndex++; } return { ...el, groupIndex: groupIndex }; }); return groupedData; }, [selectData]); const isEmptyResults = useMemo(() => { return ( selectData.filter((item) => !item.optgroup && !item.hidden).length === 0 ); }, [selectData]); // options content const singleOption = (item: ExtendedSelectData) => ( <> {multiple && ( )} {item.text} {item.secondaryText && ( {item.secondaryText} )} {item.icon && ( )} ); const createOptions = (group?: number) => { return groupedSelectData.map((el) => { if (!el.optgroup && group === el.groupIndex) { return (
handleOptionClick(el)} > {singleOption(el)}
); } }); }; return ( <> {multiple && selectAll && !isEmptyResults && (
!el.disabled).length ), active: activeElementIndex === -1, group: false, })} style={{ height: `${optionHeight}px` }} onClick={handleSelectAll} role="option" aria-selected={ selectedElements.length === data.filter((el) => !el.disabled).length } > !el.disabled && !el.optgroup).length === selectedElements.length } role="option" readOnly /> {selectAllLabel}
)}
{createOptions(OPTIONS_WITHOUT_GROUP)} {!isEmptyResults && optionGroups?.map((groupName, index) => { const options = createOptions(index + 1).filter( (option) => option !== undefined ); if (options.length === 0) { return; } return (
{options}
); })}
{search && isEmptyResults && (
{noResultsText}
)} ); }; export default TESelect;