42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
import { useState } from 'react';
|
|
import { Select, Spin } from 'antd';
|
|
import type { SelectProps } from 'antd';
|
|
import { api } from '@admin/src/utils/trpc';
|
|
|
|
interface RoleSelectProps {
|
|
value?: string | string[];
|
|
onChange?: (value: string | string[]) => void;
|
|
style?: React.CSSProperties;
|
|
multiple?: boolean;
|
|
}
|
|
|
|
export default function RoleSelect({ value, onChange, style, multiple }: RoleSelectProps) {
|
|
const [keyword, setQuery] = useState<string>('');
|
|
const { data, isLoading } = api.role.findMany.useQuery({ keyword });
|
|
|
|
const handleSearch = (value: string) => {
|
|
setQuery(value);
|
|
};
|
|
|
|
const options: SelectProps['options'] = data?.map((role: any) => ({
|
|
value: role.id,
|
|
label: role.name,
|
|
})) || [];
|
|
|
|
return (
|
|
<Select
|
|
allowClear
|
|
showSearch
|
|
mode={multiple ? 'multiple' : undefined}
|
|
placeholder="请选择角色"
|
|
notFoundContent={isLoading ? <Spin size="small" /> : null}
|
|
filterOption={false}
|
|
onSearch={handleSearch}
|
|
options={options}
|
|
value={value}
|
|
onChange={onChange}
|
|
style={{ minWidth: 200, ...style }}
|
|
/>
|
|
);
|
|
}
|