'use client' import type { IComboboxState } from './types' import { PktIcon } from '../icon/Icon' interface IListboxProps { state: IComboboxState } export const Listbox = ({ state }: IListboxProps) => { const { listboxId, label, isOpen, options, filteredOptions, multiple, disabled, maxIsReached, maxlength, includeSearch, allowUserInput, addValueText, userInfoMessage, searchPlaceholder, searchValue, handleOptionClick, handleOptionKeydown, handleSearchInput, handleSearchKeydown, handleNewOptionClick, handleNewOptionKeydown, listboxRef, } = state const selectedCount = filteredOptions.filter((opt) => opt.selected).length const showMaxBanner = multiple && selectedCount > 0 && maxlength != null && maxlength > 0 const showNewOptionBanner = allowUserInput && addValueText && !maxIsReached const showUserMessage = !!userInfoMessage const listboxClasses = ['pkt-listbox', isOpen && 'pkt-listbox__open', 'pkt-txt-16-light'].filter(Boolean).join(' ') return ( <>
0 ? 'listbox' : undefined} aria-label={filteredOptions.length > 0 ? `Liste: ${label || ''}` : undefined} aria-multiselectable={filteredOptions.length > 0 && multiple ? 'true' : undefined} >
{includeSearch && (
)} {showMaxBanner && (
{selectedCount} av maks {maxlength} mulige er valgt.
)} {showUserMessage && (
{userInfoMessage}
)} {showNewOptionBanner && (
handleNewOptionClick(addValueText)} onKeyDown={handleNewOptionKeydown} > Legg til "{addValueText}"
)} {options.length === 0 && filteredOptions.length === 0 && !showUserMessage && (
Tom liste
)}
{userInfoMessage}
) }