2024-05-27 20:42:34 +03:00
|
|
|
'use client';
|
|
|
|
|
2025-02-21 21:15:05 +03:00
|
|
|
import { type Styling } from '@/components/props';
|
2025-04-11 20:00:42 +03:00
|
|
|
import { ComboBox } from '@/components/ui/combo-box';
|
2025-02-10 01:32:55 +03:00
|
|
|
|
2025-04-07 21:43:49 +03:00
|
|
|
import { type IUserInfo } from '../backend/types';
|
2025-03-12 11:55:43 +03:00
|
|
|
import { useLabelUser } from '../backend/use-label-user';
|
|
|
|
import { useUsers } from '../backend/use-users';
|
2024-05-27 20:42:34 +03:00
|
|
|
|
2025-02-21 21:15:05 +03:00
|
|
|
interface SelectUserProps extends Styling {
|
2025-02-19 22:33:09 +03:00
|
|
|
value: number | null;
|
2025-04-11 20:00:42 +03:00
|
|
|
onChange: (newValue: number | null) => void;
|
2025-02-17 15:12:15 +03:00
|
|
|
filter?: (userID: number) => boolean;
|
2024-07-26 21:09:16 +03:00
|
|
|
|
|
|
|
placeholder?: string;
|
|
|
|
noBorder?: boolean;
|
2025-04-11 20:00:42 +03:00
|
|
|
noAnonymous?: boolean;
|
|
|
|
hidden?: boolean;
|
2024-05-27 20:42:34 +03:00
|
|
|
}
|
|
|
|
|
2025-04-07 21:43:49 +03:00
|
|
|
function compareUsers(a: IUserInfo, b: IUserInfo) {
|
|
|
|
if (!a.last_name && !!b.last_name) {
|
|
|
|
return 1;
|
|
|
|
} else if (!!a.last_name && !b.last_name) {
|
|
|
|
return -1;
|
|
|
|
} else if (a.last_name !== b.last_name) {
|
|
|
|
return a.last_name.localeCompare(b.last_name);
|
|
|
|
} else if (a.first_name !== b.first_name) {
|
|
|
|
return a.first_name.localeCompare(b.first_name);
|
|
|
|
}
|
|
|
|
return a.id - b.id;
|
|
|
|
}
|
|
|
|
|
2025-02-11 20:56:24 +03:00
|
|
|
export function SelectUser({
|
2025-01-27 15:03:48 +03:00
|
|
|
filter,
|
2025-04-11 20:00:42 +03:00
|
|
|
noAnonymous,
|
2024-05-27 20:42:34 +03:00
|
|
|
placeholder = 'Выберите пользователя',
|
|
|
|
...restProps
|
|
|
|
}: SelectUserProps) {
|
2025-01-27 15:03:48 +03:00
|
|
|
const { users } = useUsers();
|
|
|
|
const getUserLabel = useLabelUser();
|
|
|
|
|
|
|
|
const items = filter ? users.filter(user => filter(user.id)) : users;
|
2025-04-07 21:43:49 +03:00
|
|
|
const sorted = [
|
|
|
|
...items.filter(user => !!user.first_name || !!user.last_name).sort(compareUsers),
|
2025-04-11 20:00:42 +03:00
|
|
|
...(!noAnonymous ? items.filter(user => !user.first_name && !user.last_name) : [])
|
|
|
|
].map(user => user.id);
|
2024-05-27 20:42:34 +03:00
|
|
|
|
|
|
|
return (
|
2025-04-11 20:00:42 +03:00
|
|
|
<ComboBox
|
|
|
|
items={sorted}
|
2024-05-27 20:42:34 +03:00
|
|
|
placeholder={placeholder}
|
2025-04-11 20:00:42 +03:00
|
|
|
idFunc={user => String(user)}
|
|
|
|
labelValueFunc={user => getUserLabel(user)}
|
|
|
|
labelOptionFunc={user => getUserLabel(user)}
|
2024-05-27 20:42:34 +03:00
|
|
|
{...restProps}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|