Portal/rsconcept/frontend/src/features/users/components/select-user.tsx

54 lines
1.6 KiB
TypeScript
Raw Normal View History

2025-04-13 22:28:28 +03:00
import { ComboBox } from '@/components/input/combo-box';
2025-02-20 20:22:05 +03:00
import { type Styling } from '@/components/props';
2025-04-07 21:43:20 +03:00
import { type IUserInfo } from '../backend/types';
2025-03-12 11:54:32 +03:00
import { useLabelUser } from '../backend/use-label-user';
import { useUsers } from '../backend/use-users';
2024-06-07 20:17:03 +03:00
2025-02-20 20:22:05 +03:00
interface SelectUserProps extends Styling {
value: number | null;
2025-04-11 19:59:08 +03:00
onChange: (newValue: number | null) => void;
2025-02-17 15:11:32 +03:00
filter?: (userID: number) => boolean;
2024-07-26 21:08:31 +03:00
placeholder?: string;
noBorder?: boolean;
2025-04-11 19:59:08 +03:00
noAnonymous?: boolean;
hidden?: boolean;
2024-06-07 20:17:03 +03:00
}
2025-04-07 21:43:20 +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-07-03 14:35:26 +03:00
export function SelectUser({ filter, noAnonymous, placeholder = 'Выбор пользователя', ...restProps }: SelectUserProps) {
2025-01-21 12:00:09 +03:00
const { users } = useUsers();
const getUserLabel = useLabelUser();
const items = filter ? users.filter(user => filter(user.id)) : users;
2025-04-07 21:43:20 +03:00
const sorted = [
...items.filter(user => !!user.first_name || !!user.last_name).sort(compareUsers),
2025-04-11 19:59:08 +03:00
...(!noAnonymous ? items.filter(user => !user.first_name && !user.last_name) : [])
].map(user => user.id);
2024-06-07 20:17:03 +03:00
return (
2025-04-11 19:59:08 +03:00
<ComboBox
items={sorted}
2024-06-07 20:17:03 +03:00
placeholder={placeholder}
2025-08-26 13:59:16 +03:00
clearable={true}
2025-04-11 19:59:08 +03:00
idFunc={user => String(user)}
labelValueFunc={user => getUserLabel(user)}
labelOptionFunc={user => getUserLabel(user)}
2024-06-07 20:17:03 +03:00
{...restProps}
/>
);
}