/* * Copyright (c) 2015 Nordic Semiconductor ASA * * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause */ import React, { useState } from 'react'; import FormLabel from 'react-bootstrap/FormLabel'; import classNames from '../utils/classNames'; import styles from './Dropdown.module.scss'; export interface DropdownItem { label: React.ReactNode; value: T; } export type DropdownProps = { id?: string; label?: React.ReactNode; defaultButtonLabel?: string; items: DropdownItem[]; onSelect: (item: DropdownItem) => void; transparentButtonBg?: boolean; minWidth?: boolean; disabled?: boolean; selectedItem: DropdownItem; numItemsBeforeScroll?: number; className?: string; size?: 'sm' | 'md'; }; export default ({ id, label, defaultButtonLabel = '', items, onSelect, transparentButtonBg = false, minWidth = false, disabled = false, selectedItem, numItemsBeforeScroll = 0, className = '', size = 'md', }: DropdownProps) => { const [isActive, setIsActive] = useState(false); const onClickItem = (item: DropdownItem) => { onSelect(item); setIsActive(false); }; return (
{ if (!event.currentTarget.contains(event.relatedTarget)) { setIsActive(false); } }} > {label && ( {label} )} {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- We need an interactive handler as described below */}
{ // To prevent the dropdown from closing when users click on the scrollbar of the items ev.preventDefault(); }} style={ numItemsBeforeScroll > 0 ? { maxHeight: `${numItemsBeforeScroll * 24}px`, } : {} } data-height={ numItemsBeforeScroll > 0 && items.length > numItemsBeforeScroll } className={`tw-text-while tw-absolute tw-z-10 tw-border-t-2 tw-border-solid tw-border-gray-600 tw-bg-gray-700 tw-p-0 ${classNames( styles.content, minWidth ? '' : 'tw-right-0 tw-w-full', !isActive && 'tw-hidden', )}`} > {items.map(item => ( ))}
); };