2024-05-02 17:04:18 +03:00
|
|
|
'use client';
|
|
|
|
|
|
|
|
import { useCallback } from 'react';
|
|
|
|
|
|
|
|
import Dropdown from '@/components/ui/Dropdown';
|
|
|
|
import SelectorButton from '@/components/ui/SelectorButton';
|
|
|
|
import useDropdown from '@/hooks/useDropdown';
|
|
|
|
import useWindowSize from '@/hooks/useWindowSize';
|
|
|
|
import { CstMatchMode } from '@/models/miscellaneous';
|
|
|
|
import { prefixes } from '@/utils/constants';
|
|
|
|
import { describeCstMatchMode, labelCstMatchMode } from '@/utils/labels';
|
|
|
|
|
2024-06-02 23:41:46 +03:00
|
|
|
import { MatchModeIcon } from '../DomainIcons';
|
2024-05-02 17:04:18 +03:00
|
|
|
import DropdownButton from '../ui/DropdownButton';
|
|
|
|
|
|
|
|
interface SelectMatchModeProps {
|
|
|
|
value: CstMatchMode;
|
2024-06-04 14:20:43 +03:00
|
|
|
dense?: boolean;
|
2024-05-02 17:04:18 +03:00
|
|
|
onChange: (value: CstMatchMode) => void;
|
|
|
|
}
|
|
|
|
|
2024-06-04 14:20:43 +03:00
|
|
|
function SelectMatchMode({ value, dense, onChange }: SelectMatchModeProps) {
|
2024-05-02 17:04:18 +03:00
|
|
|
const menu = useDropdown();
|
|
|
|
const size = useWindowSize();
|
|
|
|
|
|
|
|
const handleChange = useCallback(
|
|
|
|
(newValue: CstMatchMode) => {
|
|
|
|
menu.hide();
|
|
|
|
onChange(newValue);
|
|
|
|
},
|
|
|
|
[menu, onChange]
|
|
|
|
);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div ref={menu.ref}>
|
|
|
|
<SelectorButton
|
|
|
|
transparent
|
|
|
|
title='Настройка фильтрации по проверяемым атрибутам'
|
|
|
|
hideTitle={menu.isOpen}
|
|
|
|
className='h-full pr-2'
|
2024-06-06 22:01:28 +03:00
|
|
|
icon={<MatchModeIcon value={value} size='1rem' />}
|
2024-06-04 14:20:43 +03:00
|
|
|
text={dense || size.isSmall ? undefined : labelCstMatchMode(value)}
|
2024-05-02 17:04:18 +03:00
|
|
|
onClick={menu.toggle}
|
|
|
|
/>
|
|
|
|
<Dropdown stretchLeft isOpen={menu.isOpen}>
|
|
|
|
{Object.values(CstMatchMode)
|
|
|
|
.filter(value => !isNaN(Number(value)))
|
|
|
|
.map((value, index) => {
|
|
|
|
const matchMode = value as CstMatchMode;
|
|
|
|
return (
|
|
|
|
<DropdownButton
|
2024-06-04 14:20:43 +03:00
|
|
|
className={!dense ? 'w-[20rem]' : undefined}
|
2024-05-02 17:04:18 +03:00
|
|
|
key={`${prefixes.cst_source_list}${index}`}
|
|
|
|
onClick={() => handleChange(matchMode)}
|
|
|
|
>
|
|
|
|
<div className='inline-flex items-center gap-1'>
|
2024-06-06 22:01:28 +03:00
|
|
|
{<MatchModeIcon value={matchMode} size='1rem' />}
|
2024-06-04 14:20:43 +03:00
|
|
|
{!dense ? (
|
|
|
|
<span>
|
|
|
|
<b>{labelCstMatchMode(matchMode)}:</b> {describeCstMatchMode(matchMode)}
|
|
|
|
</span>
|
|
|
|
) : null}
|
2024-05-02 17:04:18 +03:00
|
|
|
</div>
|
|
|
|
</DropdownButton>
|
|
|
|
);
|
|
|
|
})}
|
|
|
|
</Dropdown>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
export default SelectMatchMode;
|