Portal/rsconcept/frontend/src/features/library/components/mini-selector-oss.tsx

54 lines
1.8 KiB
TypeScript
Raw Normal View History

'use client';
import clsx from 'clsx';
2025-03-12 12:04:23 +03:00
import { MiniButton } from '@/components/control';
import { Dropdown, DropdownButton, useDropdown } from '@/components/dropdown';
import { IconOSS } from '@/components/icons';
import { Label } from '@/components/input';
2025-02-22 14:03:13 +03:00
import { type Styling } from '@/components/props';
import { prefixes } from '@/utils/constants';
2025-02-20 20:22:05 +03:00
import { type ILibraryItemReference } from '../models/library';
2025-02-12 15:12:59 +03:00
2025-02-20 20:22:05 +03:00
interface MiniSelectorOSSProps extends Styling {
items: ILibraryItemReference[];
2025-02-22 16:12:29 +03:00
onSelect: (event: React.MouseEvent<HTMLElement>, newValue: ILibraryItemReference) => void;
}
2025-02-12 15:12:59 +03:00
export function MiniSelectorOSS({ items, onSelect, className, ...restProps }: MiniSelectorOSSProps) {
2025-10-14 01:05:52 +03:00
const { elementRef: ossRef, isOpen: isOssOpen, toggle: toggleOss, handleBlur: handleOssBlur } = useDropdown();
2025-02-22 16:12:29 +03:00
function onToggle(event: React.MouseEvent<HTMLElement>) {
if (items.length > 1) {
2025-10-14 01:05:52 +03:00
toggleOss();
} else {
onSelect(event, items[0]);
}
}
return (
2025-10-14 01:05:52 +03:00
<div ref={ossRef} onBlur={handleOssBlur} className={clsx('relative flex items-center', className)} {...restProps}>
<MiniButton
title='Операционные схемы'
2025-03-20 11:33:19 +03:00
icon={<IconOSS size='1.25rem' className='icon-primary' />}
2025-10-14 01:05:52 +03:00
hideTitle={isOssOpen}
onClick={onToggle}
/>
{items.length > 1 ? (
2025-10-14 01:05:52 +03:00
<Dropdown isOpen={isOssOpen} margin='mt-1'>
<Label text='Список ОСС' className='border-b px-3 py-1' />
{items.map((reference, index) => (
<DropdownButton
key={`${prefixes.oss_list}${index}`}
text={reference.alias}
2025-03-20 11:33:19 +03:00
className='min-w-20'
onClick={event => onSelect(event, reference)}
/>
))}
</Dropdown>
) : null}
</div>
);
}