antd#Avatar TypeScript Examples
The following examples show how to use
antd#Avatar.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: Header.tsx From vite-react-ts with MIT License | 6 votes |
MyHeader: React.FC = () => {
const user = useStore((state) => state.user);
const handleChange = (e: { key: string }) => {
if (e.key === '0') {
localStorage.removeItem('vite-react-ts-antd-token');
window.location.href = '/user/login';
}
};
const menu = (
<Menu onClick={handleChange}>
<Menu.Item key="0">退出登录</Menu.Item>
</Menu>
);
return (
<Header className={cls.layout_header}>
<Dropdown overlay={menu}>
<Space>
<Avatar src={logo} />
{user?.username}
</Space>
</Dropdown>
</Header>
);
}
Example #2
Source File: Contributors.tsx From ppeforfree with GNU General Public License v3.0 | 6 votes |
Person = ({data}: PersonProps) => (
<Col xs={24} sm={8} className="text-align-center margin-bottom contributor">
<div>
{data.avatarUrl ? (
<Avatar src={data.avatarUrl} size={64} />
) : (
<Avatar size={64}>{data.name.charAt(0)}</Avatar>
)}
</div>
<div>
{data.url ? (
<a href={data.url} target="_blank" rel="noopener noreferrer">
{data.name}
</a>
) : (
<>{data.name}</>
)}
</div>
<div>
{data.location ? `${data.location} - ` : ""}
{data.roles.join(", ")}
</div>
</Col>
)
Example #3
Source File: TaskRow.tsx From RareCamp with Apache License 2.0 | 6 votes |
export function AssigneeAvatar({
assignee,
size,
}: {
assignee: any
size?: number
}) {
return assignee ? (
<Space size={4}>
<Avatar size={size || 32}>
{(assignee.name || assignee.firstName)?.[0]}
</Avatar>
<span>{assignee.name || assignee.firstName}</span>
</Space>
) : null
}
Example #4
Source File: Header.tsx From nodestatus with MIT License | 6 votes |
Header: FC<Props> = props => {
const navigate = useNavigate();
const { isCollapsed, toggleCollapsed } = props.collapsed;
const menu = (
<Menu
items={[
{
key: 'logout',
label: 'Logout',
icon: <LogoutOutlined className="mr-2 align-middle" />,
className: 'align-middle'
}
]}
onClick={({ key }) => {
if (key === 'logout') {
localStorage.removeItem('token');
navigate('/login');
}
}}
/>
);
return (
<div className="h-full flex items-center justify-between">
{React.createElement(isCollapsed ? MenuUnfoldOutlined : MenuFoldOutlined, {
className: 'text-2xl',
onClick: toggleCollapsed
})}
<Dropdown overlay={menu} placement="bottom">
<Avatar size={40} icon={<UserOutlined />} />
</Dropdown>
</div>
);
}
Example #5
Source File: index.tsx From erda-ui with GNU Affero General Public License v3.0 | 6 votes |
optionRender = (user: IMember, roleMap?: object, _type?: string, showRole?: boolean) => {
const { avatar, nick, name, roles } = user;
return (
<>
<Avatar src={avatar || undefined} size="small" className={'bg-light-pop-bg'}>
{nick ? getAvatarChars(nick) : i18n.t('None')}
</Avatar>
{
<span className="ml-2" title={name}>
{nick || i18n.t('common:None')}
{_type === 'normal' && roleMap && showRole
? `(${map(roles, (role) => roleMap[role] || i18n.t('common:None')).join(',')})`
: ''}
</span>
}
</>
);
}
Example #6
Source File: index.tsx From ant-design-pro-V4 with MIT License | 6 votes |
PageHeaderContent: FC<{ currentUser: Partial<CurrentUser> }> = ({ currentUser }) => {
const loading = currentUser && Object.keys(currentUser).length;
if (!loading) {
return <Skeleton avatar paragraph={{ rows: 1 }} active />;
}
return (
<div className={styles.pageHeaderContent}>
<div className={styles.avatar}>
<Avatar size="large" src={currentUser.avatar} />
</div>
<div className={styles.content}>
<div className={styles.contentTitle}>
早安,
{currentUser.name}
,祝你开心每一天!
</div>
<div>
{currentUser.title} |{currentUser.group}
</div>
</div>
</div>
);
}
Example #7
Source File: NodeTemplate.tsx From jetlinks-ui-antd with MIT License | 6 votes |
NodeTemplate = (props: Props) => {
const { data, action } = props;
return (
<div>
<div className={styles.node}>
<div className={styles.top}>
<span className={styles.title}>{data.name}</span>
<Avatar size="small" icon={<UserOutlined />} />
</div>
<div className={styles.content}>
<div className={styles.item}>
{data.code!==null&&(<div>
<span className={styles.mark}>编码</span>
<span>{data.code}</span>
</div>)}
<div>
<span className={styles.mark}>下级数量</span>
<span>{data?.children?.length || 0}</span>
</div>
</div>
<div className={styles.action}>
<Dropdown overlay={action}>
<a className="ant-dropdown-link" onClick={e => e.preventDefault()}>
<SmallDashOutlined />
</a>
</Dropdown>
</div>
</div>
</div>
</div>
);
}
Example #8
Source File: index.tsx From metaplex with Apache License 2.0 | 6 votes |
MetaAvatarItem = (props: {
creator: Artist;
size: number;
alt?: string;
}) => {
const { creator, size, alt } = props;
const [noImage, setNoImage] = useState(false);
const image = creator.image || '';
return (
<Avatar
alt={alt}
size={size}
src={
noImage ? (
<Identicon
alt={alt}
address={creator.address}
style={{ width: size }}
/>
) : (
image
)
}
onError={() => {
setNoImage(true);
return false;
}}
/>
);
}
Example #9
Source File: MobileUserMenu.tsx From condo with MIT License | 6 votes |
MobileUserMenu: React.FC = () => {
const intl = useIntl()
const SignInMessage = intl.formatMessage({ id: 'SignIn' })
const auth = useAuth()
const [showModal, setShowModal] = useState(false)
const modalView = useCallback(() => <ModalView setShowModal={setShowModal} />, [setShowModal])
return (
auth.isAuthenticated
? (
<>
<Button
type={'inlineLink'}
icon={<Avatar size={40} icon={<UserOutlined />} />}
onClick={() => setShowModal(true)}
/>
<Modal
transitionName=""
centered
visible={showModal}
modalRender={modalView}
style={modalStyle}
onCancel={()=> setShowModal(false)}
/>
</>
)
: <Button type='inlineLink' onClick={goToSignin}>{SignInMessage}</Button>
)
}
Example #10
Source File: index.tsx From react-amap with MIT License | 6 votes |
Marker: React.FC<MarkerProps> = (props) => {
console.log(props);
return (
<MapMarker {...props}>
<Avatar
className={styles.marker}
icon={<AntDesignOutlined />}
/>
</MapMarker>
)
}
Example #11
Source File: styles.ts From config-generator with MIT License | 6 votes |
SidebarAvatar = styled(Avatar)`
background-color: ${({ theme }) => theme.color.primary400} !important;
height: 48px !important;
width: 48px !important;
svg {
height: 24px;
width: 24px;
vertical-align: middle;
}
`
Example #12
Source File: AvatarWithInitials.tsx From office-hours with GNU General Public License v3.0 | 6 votes |
export default function AvatarWithInitals({
name,
fontSize,
style,
...props
}: AvatarWithInitalsProps): ReactElement {
return (
<Avatar
style={{
backgroundColor: name ? nameToRGB(name) : "#1abc9c",
fontSize,
...style,
}}
{...props}
>
{getInitialsFromName(name)}
</Avatar>
);
}
Example #13
Source File: Logo.tsx From vite-react-ts with MIT License | 5 votes |
Logo: React.FC<{ size: number }> = ({ size = 120 }) => (
<Avatar size={size} src={logo} />
)
Example #14
Source File: TrackListItem.tsx From spotify-recently-played-readme with MIT License | 5 votes |
/**
* Track list item component.
*/
export default function TrackListItem(props: Props): JSX.Element {
const { playHistory } = props;
const trackInfo = playHistory.track;
// Join artists with comma
const combinedArtistName = trackInfo.artists.map((artist) => artist.name).join(', ');
const trackName = trackInfo.name;
const trackUrl = trackInfo.external_urls.spotify;
const albumName = trackInfo.album.name;
const albumUrl = trackInfo.album.external_urls.spotify;
const albumCoverSrc = trackInfo.inlineimage;
return (
<List.Item className="track-item" extra={<Timestamp isoDate={playHistory.played_at} />}>
<List.Item.Meta
avatar={
<a target="_blank" rel="noopener noreferrer" href={albumUrl} title={albumName}>
<Avatar shape="square" src={albumCoverSrc} />
</a>
}
title={
<a
className="ellipsis-overflow a-spotify"
target="_blank"
rel="noopener noreferrer"
href={trackUrl}
title={trackName}>
{trackName}
</a>
}
description={
<Text className="ellipsis-overflow" type="secondary" title={combinedArtistName}>
{combinedArtistName}
</Text>
}
/>
</List.Item>
);
}
Example #15
Source File: FrameworkGrid.tsx From posthog-foss with MIT License | 5 votes |
function TabContents(frameworks: Record<string, string>, sort?: boolean): JSX.Element {
const { setPlatform, setFramework } = useActions(ingestionLogic)
const { activeTab } = useValues(ingestionLogic)
return (
<List
style={{ height: 300, maxHeight: 300, overflowY: 'auto' }}
grid={{}}
size={'large'}
dataSource={getDataSource(frameworks, sort) as Framework[]}
renderItem={(item: Framework) => (
<List.Item
className="selectable-item"
data-attr={'select-framework-' + item}
key={item}
onClick={() => {
setPlatform(frameworkToPlatform(item))
setFramework(item)
}}
>
<div className="framework-container">
<div className={'logo-container'}>
<Avatar
size={64}
shape={'square'}
className={'logo'}
src={item && item in logos ? logos[item] : logos['default']}
/>
</div>
<Paragraph className="framework-name" type="secondary" strong>
{getDisplayName(frameworks, item)}{' '}
{item?.toString() === 'AUTOCAPTURE' && activeTab !== 'all' && (
<Tag color="success">Recommended</Tag>
)}
</Paragraph>
</div>
</List.Item>
)}
/>
)
}
Example #16
Source File: BrickList.tsx From next-basics with GNU General Public License v3.0 | 5 votes |
export function BrickList(props: BrickListProps): React.ReactElement {
const { configProps, itemList = [], isCardList } = props;
return (
<List
split={!isCardList}
{...configProps}
dataSource={itemList}
className={classNames({
[styles.cardList]: isCardList
})}
renderItem={item => {
const { meta, content, ...originItemProps } = item;
return (
<>
{props.itemBrick ? (
<List.Item style={props.itemStyle}>
<props.itemBrick.brick
ref={(el: any) => {
el &&
Object.assign(el, {
dataSource: item,
...props.itemBrick.properties
});
}}
/>
</List.Item>
) : (
<List.Item {...originItemProps} style={props.itemStyle}>
{meta && (
<List.Item.Meta
{...(item.meta.src && {
avatar: <Avatar src={item.meta.src} />
})}
title={item.meta.title}
description={item.meta.description}
/>
)}
<div>{content}</div>
</List.Item>
)}
</>
);
}}
/>
);
}
Example #17
Source File: Layout.tsx From yugong with MIT License | 5 votes |
MainLayout: React.FC<Props> = ({ children }) => {
const [collapsed, setCollapsed] = useState(true);
let location = useLocation();
const history = useHistory();
const { auth } = useSelector((state: RootState) => state.controller);
const { loginOut } = useDispatch<Dispatch>().controller;
return (
<Layout>
<Sider
theme="light"
className={s.side}
trigger={null}
collapsible
collapsed={collapsed}
>
<div className={s.logo}>
<GroupOutlined /> {collapsed ? "" : "YuGong"}
</div>
<Menu
theme="light"
mode="inline"
defaultSelectedKeys={[location.pathname]}
>
{menus.map((item) => (
<Menu.Item key={item.path} icon={item.icon}>
{item.name}
<Link to={item.path || "/"} />
</Menu.Item>
))}
</Menu>
</Sider>
<Layout className="site-layout">
<Header className={s.layout} style={{ padding: 0 }}>
{React.createElement(
collapsed ? MenuUnfoldOutlined : MenuFoldOutlined,
{
className: s.trigger,
onClick: () => setCollapsed(!collapsed),
}
)}
<div className={s.auto} />
<div className={s.auth}>
{auth?.isLogin ? (
<div>
<Avatar size="small" icon={<UserOutlined />} />
{auth.session?.username}
<Button type="link" onClick={loginOut}>退出</Button>
</div>
) : (
<>
{location.pathname !== '/login' ? <Button type="link" onClick={() => history.push('/login')}>登录</Button> : null}
{location.pathname !== '/register' ? <Button type="link" onClick={() => history.push('/register')}>注册</Button> : null}
</>
)}
</div>
</Header>
<Content className={s.content}>{children}</Content>
</Layout>
</Layout>
);
}
Example #18
Source File: index.tsx From erda-ui with GNU Affero General Public License v3.0 | 5 votes |
UserSelector = (props: any) => {
const { value } = props;
const [searchKey, setSearchKey] = React.useState('');
const [searchResult, setSearchResult] = React.useState([] as any[]);
const [searchLackUser, setSearchLackUser] = React.useState(false);
React.useEffect(() => {
if (!isEmpty(value)) {
// 兼容选项有值无list情况
const curValue = isString(value) ? [value] : value;
const existUserId = map(searchResult || [], 'id'); // 当前存在的user
const lackUser = difference(curValue, existUserId);
if (lackUser.length && !searchLackUser) {
setSearchLackUser(true); // 请求过一次后就不再请求
getUsers({ userID: lackUser }).then((res: any) => {
setSearchResult(get(res, 'data.users'));
});
}
}
}, [value, searchResult, searchLackUser]);
const handleSearch = (q: string) => {
const query = {
q,
pageNo: 1,
pageSize: 15,
};
setSearchKey(q);
if (q.trim() !== '') {
getUsersNew(query).then((res: any) => {
setSearchResult(get(res, 'data.users'));
});
}
};
const userOptionRender = (member: IMember) => {
const { avatar, nick, name } = member;
const id = member.id || member.userId;
return (
<Option key={id} value={id}>
<Avatar src={avatar} size="small">
{nick ? getAvatarChars(nick) : i18n.t('None')}
</Avatar>
<span className="ml-2" title={name}>
{nick || i18n.t('common:None')}
</span>
</Option>
);
};
return (
<Select
className="w-full"
showSearch
notFoundContent={searchKey ? i18n.t('common:please confirm that the user is registered') : ''}
showArrow={false}
filterOption={false}
defaultActiveFirstOption={false}
placeholder={i18n.t('Please enter the member name to search')}
onSearch={debounce(handleSearch, 800)}
{...props}
>
{(searchResult || []).map(userOptionRender)}
</Select>
);
}
Example #19
Source File: AvatarDropdown.tsx From ant-design-pro-V4 with MIT License | 5 votes |
render(): React.ReactNode {
const { todoList } = this.props?.todo
// const todoNum = todoList.filter((item: any) => item.status === 0).length
const todoNum = todoList?.filter((item: any) => {
if (item != null) {
return item.status === 0
}
}).length
const {
currentUser = {
avatar: '',
name: '',
},
menu,
} = this.props;
const menuHeaderDropdown = (
<Menu className={styles.menu} selectedKeys={[]} onClick={this.onMenuClick}>
{menu && (
<Menu.Item key="center">
<UserOutlined />
个人中心
</Menu.Item>
)}
{menu && (
<Menu.Item key="settings">
<SettingOutlined />
个人设置
</Menu.Item>
)}
{menu && <Menu.Divider />}
<Menu.Item key="todo">
<UnorderedListOutlined />
待办事项
<Badge count={todoNum} offset={[10, -5]} />
</Menu.Item>
{menu && <Menu.Divider />}
<Menu.Item key="logout">
<LogoutOutlined />
退出登录
</Menu.Item>
</Menu>
);
return currentUser && currentUser.name ? (
<HeaderDropdown overlay={menuHeaderDropdown}>
<span className={`${styles.action} ${styles.account}`}>
<Avatar size="small" className={styles.avatar} src={currentUser.avatar} alt="avatar" />
<span className={`${styles.name} anticon`}>{currentUser.name}
<Badge count={todoNum} dot={true} /></span>
</span>
</HeaderDropdown>
) : (
<span className={`${styles.action} ${styles.account}`}>
<Spin
size="small"
style={{
marginLeft: 8,
marginRight: 8,
}}
/>
</span>
);
}
Example #20
Source File: AvatarDropdown.tsx From jetlinks-ui-antd with MIT License | 5 votes |
AvatarDropdown: React.FC<GlobalHeaderRightProps> = props => {
const onMenuClick = (event: ClickParam) => {
const { key } = event;
if (key === 'logout') {
const { dispatch } = props;
if (dispatch) {
dispatch({
type: 'login/logout',
});
}
return;
}
router.push(`/account/${key}`);
};
const [user, setUser] = useState<any>({});
const service = new Service('user/detail');
const {
currentUser = {
avatar: user.avatar || '',
name: '',
},
} = props;
useEffect(() => {
const u = service.get().subscribe(resp => {
setUser(resp);
localStorage.setItem('user-detail', JSON.stringify(resp));
// localStorage.setItem('tenants-admin', resp.tenants[0]?.adminMember);
});
return () => {
u.unsubscribe();
};
}, [currentUser]);
const menuHeaderDropdown = (
<Menu className={styles.menu} selectedKeys={[]} onClick={onMenuClick}>
{/* <Menu.Item key="center">
<Icon type="user" />
个人中心
</Menu.Item> */}
<Menu.Item key="settings">
<Icon type="setting" />
个人设置
</Menu.Item>
<Menu.Divider />
<Menu.Item key="logout">
<Icon type="logout" />
退出登录
</Menu.Item>
</Menu>
);
return currentUser && currentUser.name ? (
<HeaderDropdown overlay={menuHeaderDropdown}>
<span className={`${styles.action} ${styles.account}`}>
<Avatar size="small" className={styles.avatar} src={user.avatar} alt="avatar" />
<span className={styles.name}>{currentUser.name}</span>
</span>
</HeaderDropdown>
) : (
<Spin
size="small"
style={{
marginLeft: 8,
marginRight: 8,
}}
/>
);
}
Example #21
Source File: AvatarDropdown.tsx From ui-visualization with MIT License | 5 votes |
render(): React.ReactNode {
const {
currentUser = {
avatar: '',
name: '',
},
menu,
} = this.props;
const menuHeaderDropdown = (
<Menu className={styles.menu} selectedKeys={[]} onClick={this.onMenuClick}>
{menu && (
<Menu.Item key="center">
<UserOutlined />
个人中心
</Menu.Item>
)}
{menu && (
<Menu.Item key="settings">
<SettingOutlined />
个人设置
</Menu.Item>
)}
{menu && <Menu.Divider />}
<Menu.Item key="logout">
<LogoutOutlined />
退出登录
</Menu.Item>
</Menu>
);
return currentUser && currentUser.name ? (
<HeaderDropdown overlay={menuHeaderDropdown}>
<span className={`${styles.action} ${styles.account}`}>
<Avatar size="small" className={styles.avatar} src={currentUser.avatar} alt="avatar" />
<span className={styles.name}>{currentUser.name}</span>
</span>
</HeaderDropdown>
) : (
<span className={`${styles.action} ${styles.account}`}>
<Spin
size="small"
style={{
marginLeft: 8,
marginRight: 8,
}}
/>
</span>
);
}
Example #22
Source File: index.tsx From tinyhouse with MIT License | 5 votes |
export function MenuItems({ viewer, setViewer }: MenuItemsProps) {
const [logOut] = useMutation<LogOutData>(LOG_OUT, {
onCompleted: (data) => {
if (data && data.logOut) {
setViewer(data.logOut);
sessionStorage.removeItem("token");
displaySuccessNotification("You've successfully logged out!");
}
},
onError: (error) => {
displayErrorMessage(
"Sorry, we weren't able to to log you out. Please try again later!"
);
},
});
const handleLogout = async () => {
await logOut();
};
const subMenuLogin =
viewer.id && viewer.avatar ? (
<SubMenu key={viewer.id} title={<Avatar src={viewer.avatar} />}>
<Item key="/user">
<NavLink to={`/user/${viewer.id}`}>
<UserOutlined></UserOutlined>
Profile
</NavLink>
</Item>
<Item key="/logout" onClick={handleLogout}>
<LogoutOutlined></LogoutOutlined>
Log out
</Item>
</SubMenu>
) : (
<Item>
<NavLink to="/login">
<Button type="primary">Sign In</Button>
</NavLink>
</Item>
);
return (
<Menu mode="horizontal" selectable={false} className="menu">
<Item key="/host">
<NavLink to="/host">
<HomeOutlined />
Host
</NavLink>
</Item>
{subMenuLogin}
</Menu>
);
}
Example #23
Source File: AvatarPicker.tsx From tailchat with GNU General Public License v3.0 | 5 votes |
AvatarPicker: React.FC<AvatarPickerProps> = React.memo((props) => {
const fileRef = useRef<HTMLInputElement>(null);
const [avatarUrl, setAvatarUrl] = useState<string>(props.imageUrl || ''); // 裁剪后并使用的url/或者未经裁剪的 gif url
const updateAvatar = (imageBlobUrl: string) => {
setAvatarUrl(imageBlobUrl);
if (typeof props.onChange === 'function') {
props.onChange(imageBlobUrl);
}
};
const handleSelectFile = (e: React.ChangeEvent<HTMLInputElement>) => {
if (e.target.files && e.target.files.length > 0) {
const pickedFile = e.target.files[0];
if (isGIF(pickedFile)) {
updateAvatar(URL.createObjectURL(pickedFile));
} else {
const reader = new FileReader();
reader.addEventListener('load', () => {
if (reader.result) {
const key = openModal(
<ModalAvatarCropper
imageUrl={reader.result.toString()}
onConfirm={(croppedImageBlobUrl) => {
closeModal(key);
updateAvatar(croppedImageBlobUrl);
}}
/>,
{
maskClosable: false,
closable: true,
}
);
} else {
showToasts(t('文件读取失败'), 'error');
}
});
reader.readAsDataURL(pickedFile);
}
// 清理选中状态
e.target.files = null;
e.target.value = '';
}
};
return (
<div className={props.className}>
<div
className="cursor-pointer inline-block relative"
onClick={() => !props.disabled && fileRef.current?.click()}
>
<input
ref={fileRef}
type="file"
className="hidden"
onChange={handleSelectFile}
accept="image/*"
/>
{props.children ? (
props.children
) : (
<Avatar
size={64}
icon={<Icon className="anticon" icon="mdi:account" />}
src={avatarUrl}
/>
)}
</div>
</div>
);
})
Example #24
Source File: QueueCardSharedComponents.tsx From office-hours with GNU General Public License v3.0 | 5 votes |
Photo = styled(Avatar)`
margin-right: 16px;
@media (max-width: 992px) {
display: none;
}
`
Example #25
Source File: useRightContent.tsx From plugin-layout with MIT License | 5 votes |
export default function useRightContent(
runtimeLayout: ILayoutRuntimeConfig,
loading: boolean,
initialState: any,
) {
const rightContentRender = useCallback(() => {
if (runtimeLayout.rightRender) {
return runtimeLayout.rightRender(initialState);
}
const menu = (
<Menu className="umi-plugin-layout-menu">
<Menu.Item key="logout" onClick={runtimeLayout.logout}>
<Icon type="logout" />
退出登陆
</Menu.Item>
</Menu>
);
const avatar = (
<span className="umi-plugin-layout-action umi-plugin-layout-account">
<Avatar
size="small"
className="umi-plugin-layout-avatar"
src={
initialState?.avatar ||
'https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png'
}
alt="avatar"
/>
<span className="umi-plugin-layout-name">{initialState?.name}</span>
</span>
);
if (loading) {
return (
<div className="umi-plugin-layout-right">
<Spin size="small" style={{ marginLeft: 8, marginRight: 8 }} />
</div>
);
}
return (
initialState && <div className="umi-plugin-layout-right">
{runtimeLayout.logout ? (
<Dropdown overlay={menu} overlayClassName="umi-plugin-layout-container">
{avatar}
</Dropdown>
) : (
avatar
)}
</div>
);
}, [initialState, loading]);
return rightContentRender;
}
Example #26
Source File: AvatarDropdown.tsx From ant-design-pro-V5-multitab with MIT License | 5 votes |
AvatarDropdown: React.FC<GlobalHeaderRightProps> = ({ menu }) => {
const { initialState, setInitialState } = useModel('@@initialState');
const onMenuClick = useCallback(
(event: {
key: React.Key;
keyPath: React.Key[];
item: React.ReactInstance;
domEvent: React.MouseEvent<HTMLElement>;
}) => {
const { key } = event;
if (key === 'logout' && initialState) {
setInitialState({ ...initialState, currentUser: undefined });
loginOut();
return;
}
history.push(`/account/${key}`);
},
[initialState, setInitialState],
);
const loading = (
<span className={`${styles.action} ${styles.account}`}>
<Spin
size="small"
style={{
marginLeft: 8,
marginRight: 8,
}}
/>
</span>
);
if (!initialState) {
return loading;
}
const { currentUser } = initialState;
if (!currentUser || !currentUser.name) {
return loading;
}
const menuHeaderDropdown = (
<Menu className={styles.menu} selectedKeys={[]} onClick={onMenuClick}>
{menu && (
<Menu.Item key="center">
<UserOutlined />
个人中心
</Menu.Item>
)}
{menu && (
<Menu.Item key="settings">
<SettingOutlined />
个人设置
</Menu.Item>
)}
{menu && <Menu.Divider />}
<Menu.Item key="logout">
<LogoutOutlined />
退出登录
</Menu.Item>
</Menu>
);
return (
<HeaderDropdown overlay={menuHeaderDropdown}>
<span className={`${styles.action} ${styles.account}`}>
<Avatar size="small" className={styles.avatar} src={currentUser.avatar} alt="avatar" />
<span className={`${styles.name} anticon`}>{currentUser.name}</span>
</span>
</HeaderDropdown>
);
}
Example #27
Source File: AvatarDropdown.tsx From anew-server with MIT License | 5 votes |
AvatarDropdown: React.FC<GlobalHeaderRightProps> = ({ menu }) => {
const { initialState, setInitialState } = useModel('@@initialState');
const onMenuClick = useCallback(
(event: MenuInfo) => {
const { key } = event;
if (key === 'logout' && initialState) {
setInitialState({ ...initialState, currentUser: undefined });
loginOut();
return;
}
history.push('/account/settings');
},
[initialState, setInitialState],
);
const loading = (
<span className={`${styles.action} ${styles.account}`}>
<Spin
size="small"
style={{
marginLeft: 8,
marginRight: 8,
}}
/>
</span>
);
if (!initialState) {
return loading;
}
const { currentUser } = initialState;
if (!currentUser || !currentUser.name) {
return loading;
}
const menuHeaderDropdown = (
<Menu className={styles.menu} selectedKeys={[]} onClick={onMenuClick}>
{menu && (
<Menu.Item key="settings">
<SettingOutlined />
个人设置
</Menu.Item>
)}
{menu && <Menu.Divider />}
<Menu.Item key="logout">
<LogoutOutlined />
退出登录
</Menu.Item>
</Menu>
);
return (
<HeaderDropdown overlay={menuHeaderDropdown}>
<span className={`${styles.action} ${styles.account}`}>
<Avatar size="small" className={styles.avatar} src={currentUser.avatar} alt="avatar" />
<span className={`${styles.name} anticon`}>{currentUser.name}</span>
</span>
</HeaderDropdown>
);
}
Example #28
Source File: edit-user-drawer.tsx From shippo with MIT License | 4 votes |
Component: React.ForwardRefRenderFunction<EditUserDrawerRef, EditUserDrawerProps> = (
props,
ref
) => {
const { onClose } = props
const [user, setUser] = useState<IUserExtRoleName>(__defaultUserExtRoleName)
const [visible, setVisible] = useState(false)
const editUserRoleDrawerRef = useRef<EditUserRoleDrawerRef>(null)
const isUpdate = useMemo(() => {
return user.id !== 0
}, [user])
// ref
useImperativeHandle(ref, () => {
return {
// 打开抽屉
open: (user?: IUserExtRoleName) => {
if (user) {
setUser({ ...user })
} else {
setUser(__userExtRoleName())
}
setVisible(true)
},
}
})
// 关闭抽屉
const closeDrawer = useCallback(() => {
onClose && onClose()
setVisible(false)
}, [onClose])
// 更改user
const changeUser = useCallback((user: Partial<IUserExtRoleName>) => {
setUser((old) => ({ ...old, ...user }))
}, [])
const handleSave = useCallback(async () => {
// console.log(user)
// if (isUpdate) {
// const hr = await services.user.update({
// id: user.id,
// userName: user.userName,
// remark: user.remark,
// })
// if (hr.data.success) {
// message.success('成功')
// closeDrawer()
// } else {
// message.success('失败')
// }
// } else {
// const hr = await services.user.create({ userName: user.userName, remark: user.remark })
// if (hr.data.success) {
// message.success('成功')
// closeDrawer()
// } else {
// message.success('失败')
// }
// }
}, [isUpdate, user, closeDrawer])
return (
<Drawer
title={isUpdate ? '编辑用户' : '新增用户'}
width={720}
onClose={closeDrawer}
visible={visible}
bodyStyle={{ paddingBottom: 80 }}
>
<EditUserRoleDrawer ref={editUserRoleDrawerRef} onClose={(u) => setUser(u)} />
<Form layout="vertical" requiredMark={false}>
<Row gutter={16}>
<Col span={12}>
<Form.Item label="手机号" rules={[{ required: true, message: '请输入手机号' }]}>
<Input
placeholder="请输入手机号"
value={user.phone}
onChange={(event) => {
changeUser({ phone: event.currentTarget.value })
}}
disabled
/>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item label="邮箱" rules={[{ required: true, message: '请输入邮箱' }]}>
<Input
placeholder="请输入邮箱"
value={user.email}
onChange={(event) => {
changeUser({ email: event.currentTarget.value })
}}
disabled
/>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item label="昵称" rules={[{ required: true, message: '请输入昵称' }]}>
<Input
placeholder="请输入昵称"
value={user.nickname}
onChange={(event) => {
changeUser({ nickname: event.currentTarget.value })
}}
disabled
/>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item label="头像">
<Avatar shape="square" size={64} icon={<UserOutlined />} />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item label="经验" rules={[{ required: true, message: '请输入经验' }]}>
<Input
placeholder="请输入经验"
value={user.exp}
onChange={(event) => {
changeUser({ exp: Number(event.currentTarget.value) })
}}
disabled
/>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item label="硬币" rules={[{ required: true, message: '请输入硬币' }]}>
<Input
placeholder="请输入硬币"
value={user.coin}
onChange={(event) => {
changeUser({ coin: Number(event.currentTarget.value) })
}}
disabled
/>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item label="角色名称">
<span style={{ padding: '0 10px' }}>{user.roleName}</span>
<Button type="link" onClick={() => editUserRoleDrawerRef.current?.open(user)}>
编辑用户角色
</Button>
</Form.Item>
</Col>
</Row>
<Form.Item>
<Space>
<Button onClick={closeDrawer}>关闭</Button>
<Button onClick={handleSave} type="primary">
保存
</Button>
</Space>
</Form.Item>
</Form>
</Drawer>
)
}
Example #29
Source File: palette.tsx From jmix-frontend with Apache License 2.0 | 4 votes |
palette = () => (
<Palette>
<Category name="Text">
<Component name="Formatted Message">
<Variant>
<FormattedMessage />
</Variant>
</Component>
<Component name="Heading">
<Variant name="h1">
<Typography.Title></Typography.Title>
</Variant>
<Variant name="h2">
<Typography.Title level={2}></Typography.Title>
</Variant>
<Variant name="h3">
<Typography.Title level={3}></Typography.Title>
</Variant>
<Variant name="h4">
<Typography.Title level={4}></Typography.Title>
</Variant>
<Variant name="h5">
<Typography.Title level={5}></Typography.Title>
</Variant>
</Component>
<Component name="Text">
<Variant>
<Typography.Text></Typography.Text>
</Variant>
<Variant name="Secondary">
<Typography.Text type="secondary"></Typography.Text>
</Variant>
<Variant name="Success">
<Typography.Text type="success"></Typography.Text>
</Variant>
<Variant name="Warning">
<Typography.Text type="warning"></Typography.Text>
</Variant>
<Variant name="Danger">
<Typography.Text type="danger"></Typography.Text>
</Variant>
<Variant name="Disabled">
<Typography.Text disabled></Typography.Text>
</Variant>
</Component>
</Category>
<Category name="Layout">
<Component name="Divider">
<Variant>
<Divider />
</Variant>
</Component>
<Component name="Grid">
<Variant name="Simple Row">
<Row></Row>
</Variant>
<Variant name="Two columns">
<Row>
<Col span={12}></Col>
<Col span={12}></Col>
</Row>
</Variant>
<Variant name="Three columns">
<Row>
<Col span={8}></Col>
<Col span={8}></Col>
<Col span={8}></Col>
</Row>
</Variant>
</Component>
<Component name="Space">
<Variant>
<Space />
</Variant>
<Variant name="Small">
<Space size={"small"} />
</Variant>
<Variant name="Large">
<Space size={"large"} />
</Variant>
</Component>
</Category>
<Category name="Controls">
<Component name="Autocomplete">
<Variant>
<AutoComplete placeholder="input here" />
</Variant>
</Component>
<Component name="Button">
<Variant>
<Button></Button>
</Variant>
<Variant name="Primary">
<Button type="primary"></Button>
</Variant>
<Variant name="Link">
<Button type="link"></Button>
</Variant>
<Variant name="Dropdown">
<Dropdown
trigger={["click"]}
overlay={
<Menu>
<Menu.Item></Menu.Item>
<Menu.Item></Menu.Item>
<Menu.Item></Menu.Item>
</Menu>
}
>
<Button></Button>
</Dropdown>
</Variant>
</Component>
<Component name="Checkbox">
<Variant>
<Checkbox />
</Variant>
</Component>
<Component name="Switch">
<Variant>
<Switch />
</Variant>
</Component>
<Component name="Radio Group">
<Variant>
<Radio.Group>
<Radio value={1}>A</Radio>
<Radio value={2}>B</Radio>
<Radio value={3}>C</Radio>
<Radio value={4}>D</Radio>
</Radio.Group>
</Variant>
<Variant name="Button">
<Radio.Group>
<Radio.Button value={1}>A</Radio.Button>
<Radio.Button value={2}>B</Radio.Button>
<Radio.Button value={3}>C</Radio.Button>
<Radio.Button value={4}>D</Radio.Button>
</Radio.Group>
</Variant>
</Component>
<Component name="DatePicker">
<Variant>
<DatePicker />
</Variant>
<Variant name="Range">
<DatePicker.RangePicker />
</Variant>
</Component>
<Component name="TimePicker">
<Variant>
<TimePicker />
</Variant>
<Variant name="Range">
<TimePicker.RangePicker />
</Variant>
</Component>
<Component name="Input">
<Variant>
<Input />
</Variant>
<Variant name="Number">
<InputNumber />
</Variant>
</Component>
<Component name="Select">
<Variant>
<Select defaultValue="1">
<Select.Option value="1">1</Select.Option>
<Select.Option value="2">2</Select.Option>
</Select>
</Variant>
<Variant name="Multiple">
<Select defaultValue={["1"]} mode="multiple" allowClear>
<Select.Option value="1">1</Select.Option>
<Select.Option value="2">2</Select.Option>
</Select>
</Variant>
</Component>
<Component name="Link">
<Variant>
<Typography.Link href="" target="_blank"></Typography.Link>
</Variant>
</Component>
<Component name="Slider">
<Variant>
<Slider defaultValue={30} />
</Variant>
<Variant name="Range">
<Slider range defaultValue={[20, 50]} />
</Variant>
</Component>
</Category>
<Category name="Data Display">
<Component name="Field">
<Variant>
<Field
entityName={ENTITY_NAME}
disabled={readOnlyMode}
propertyName=""
formItemProps={{
style: { marginBottom: "12px" }
}}
/>
</Variant>
</Component>
<Component name="Card">
<Variant>
<Card />
</Variant>
<Variant name="With Title">
<Card>
<Card title="Card title">
<p>Card content</p>
</Card>
</Card>
</Variant>
<Variant name="My custom card">
<Card>
<Card title="Card title">
<p>Card content</p>
<Avatar />
</Card>
</Card>
</Variant>
</Component>
<Component name="Tabs">
<Variant>
<Tabs defaultActiveKey="1">
<Tabs.TabPane tab="Tab 1" key="1">
Content of Tab Pane 1
</Tabs.TabPane>
<Tabs.TabPane tab="Tab 2" key="2">
Content of Tab Pane 2
</Tabs.TabPane>
<Tabs.TabPane tab="Tab 3" key="3">
Content of Tab Pane 3
</Tabs.TabPane>
</Tabs>
</Variant>
<Variant name="Tab Pane">
<Tabs.TabPane></Tabs.TabPane>
</Variant>
</Component>
<Component name="Collapse">
<Variant>
<Collapse defaultActiveKey="1">
<Collapse.Panel
header="This is panel header 1"
key="1"
></Collapse.Panel>
<Collapse.Panel
header="This is panel header 2"
key="2"
></Collapse.Panel>
<Collapse.Panel
header="This is panel header 3"
key="3"
></Collapse.Panel>
</Collapse>
</Variant>
</Component>
<Component name="Image">
<Variant>
<Image width={200} src="" />
</Variant>
</Component>
<Component name="Avatar">
<Variant>
<Avatar icon={<UserOutlined />} />
</Variant>
<Variant name="Image">
<Avatar src="https://joeschmoe.io/api/v1/random" />
</Variant>
</Component>
<Component name="Badge">
<Variant>
<Badge count={1}></Badge>
</Variant>
</Component>
<Component name="Statistic">
<Variant>
<Statistic title="Title" value={112893} />
</Variant>
</Component>
<Component name="Alert">
<Variant name="Success">
<Alert message="Text" type="success" />
</Variant>
<Variant name="Info">
<Alert message="Text" type="info" />
</Variant>
<Variant name="Warning">
<Alert message="Text" type="warning" />
</Variant>
<Variant name="Error">
<Alert message="Text" type="error" />
</Variant>
</Component>
<Component name="List">
<Variant>
<List
bordered
dataSource={[]}
renderItem={item => <List.Item></List.Item>}
/>
</Variant>
</Component>
</Category>
<Category name="Icons">
<Component name="Arrow">
<Variant name="Up">
<ArrowUpOutlined />
</Variant>
<Variant name="Down">
<ArrowDownOutlined />
</Variant>
<Variant name="Left">
<ArrowLeftOutlined />
</Variant>
<Variant name="Right">
<ArrowRightOutlined />
</Variant>
</Component>
<Component name="Question">
<Variant>
<QuestionOutlined />
</Variant>
<Variant name="Circle">
<QuestionCircleOutlined />
</Variant>
</Component>
<Component name="Plus">
<Variant>
<PlusOutlined />
</Variant>
<Variant name="Circle">
<PlusCircleOutlined />
</Variant>
</Component>
<Component name="Info">
<Variant>
<InfoOutlined />
</Variant>
<Variant name="Circle">
<InfoCircleOutlined />
</Variant>
</Component>
<Component name="Exclamation">
<Variant>
<ExclamationOutlined />
</Variant>
<Variant name="Circle">
<ExclamationCircleOutlined />
</Variant>
</Component>
<Component name="Close">
<Variant>
<CloseOutlined />
</Variant>
<Variant name="Circle">
<CloseCircleOutlined />
</Variant>
</Component>
<Component name="Check">
<Variant>
<CheckOutlined />
</Variant>
<Variant name="Circle">
<CheckCircleOutlined />
</Variant>
</Component>
<Component name="Edit">
<Variant>
<EditOutlined />
</Variant>
</Component>
<Component name="Copy">
<Variant>
<CopyOutlined />
</Variant>
</Component>
<Component name="Delete">
<Variant>
<DeleteOutlined />
</Variant>
</Component>
<Component name="Bars">
<Variant>
<BarsOutlined />
</Variant>
</Component>
<Component name="Bell">
<Variant>
<BellOutlined />
</Variant>
</Component>
<Component name="Clear">
<Variant>
<ClearOutlined />
</Variant>
</Component>
<Component name="Download">
<Variant>
<DownloadOutlined />
</Variant>
</Component>
<Component name="Upload">
<Variant>
<UploadOutlined />
</Variant>
</Component>
<Component name="Sync">
<Variant>
<SyncOutlined />
</Variant>
</Component>
<Component name="Save">
<Variant>
<SaveOutlined />
</Variant>
</Component>
<Component name="Search">
<Variant>
<SearchOutlined />
</Variant>
</Component>
<Component name="Settings">
<Variant>
<SettingOutlined />
</Variant>
</Component>
<Component name="Paperclip">
<Variant>
<PaperClipOutlined />
</Variant>
</Component>
<Component name="Phone">
<Variant>
<PhoneOutlined />
</Variant>
</Component>
<Component name="Mail">
<Variant>
<MailOutlined />
</Variant>
</Component>
<Component name="Home">
<Variant>
<HomeOutlined />
</Variant>
</Component>
<Component name="Contacts">
<Variant>
<ContactsOutlined />
</Variant>
</Component>
<Component name="User">
<Variant>
<UserOutlined />
</Variant>
<Variant name="Add">
<UserAddOutlined />
</Variant>
<Variant name="Remove">
<UserDeleteOutlined />
</Variant>
</Component>
<Component name="Team">
<Variant>
<TeamOutlined />
</Variant>
</Component>
</Category>
<Category name="Screens">
<Component name="ExampleCustomScreen">
<Variant>
<ExampleCustomScreen />
</Variant>
</Component>
<Component name="CustomEntityFilterTest">
<Variant>
<CustomEntityFilterTest />
</Variant>
</Component>
<Component name="CustomFormControls">
<Variant>
<CustomFormControls />
</Variant>
</Component>
<Component name="CustomDataDisplayComponents">
<Variant>
<CustomDataDisplayComponents />
</Variant>
</Component>
<Component name="CustomAppLayouts">
<Variant>
<CustomAppLayouts />
</Variant>
</Component>
<Component name="CustomControls">
<Variant>
<CustomControls />
</Variant>
</Component>
<Component name="ErrorBoundaryTests">
<Variant>
<ErrorBoundaryTests />
</Variant>
</Component>
<Component name="TestBlankScreen">
<Variant>
<TestBlankScreen />
</Variant>
</Component>
<Component name="CarEditor">
<Variant>
<CarEditor />
</Variant>
</Component>
<Component name="CarBrowserCards">
<Variant>
<CarBrowserCards />
</Variant>
</Component>
<Component name="CarBrowserList">
<Variant>
<CarBrowserList />
</Variant>
</Component>
<Component name="CarBrowserTable">
<Variant>
<CarBrowserTable />
</Variant>
</Component>
<Component name="CarCardsGrid">
<Variant>
<CarCardsGrid />
</Variant>
</Component>
<Component name="FavoriteCars">
<Variant>
<FavoriteCars />
</Variant>
</Component>
<Component name="CarCardsWithDetails">
<Variant>
<CarCardsWithDetails />
</Variant>
</Component>
<Component name="CarTableWithFilters">
<Variant>
<CarTableWithFilters />
</Variant>
</Component>
<Component name="CarMasterDetail">
<Variant>
<CarMasterDetail />
</Variant>
</Component>
<Component name="FormWizardCompositionO2O">
<Variant>
<FormWizardCompositionO2O />
</Variant>
</Component>
<Component name="FormWizardEditor">
<Variant>
<FormWizardEditor />
</Variant>
</Component>
<Component name="FormWizardBrowserTable">
<Variant>
<FormWizardBrowserTable />
</Variant>
</Component>
<Component name="CarMultiSelectionTable">
<Variant>
<CarMultiSelectionTable />
</Variant>
</Component>
<Component name="DatatypesTestEditor">
<Variant>
<DatatypesTestEditor />
</Variant>
</Component>
<Component name="DatatypesTestBrowserCards">
<Variant>
<DatatypesTestBrowserCards />
</Variant>
</Component>
<Component name="DatatypesTestBrowserList">
<Variant>
<DatatypesTestBrowserList />
</Variant>
</Component>
<Component name="DatatypesTestBrowserTable">
<Variant>
<DatatypesTestBrowserTable />
</Variant>
</Component>
<Component name="DatatypesTestCards">
<Variant>
<DatatypesTestCards />
</Variant>
</Component>
<Component name="AssociationO2OEditor">
<Variant>
<AssociationO2OEditor />
</Variant>
</Component>
<Component name="AssociationO2OBrowserTable">
<Variant>
<AssociationO2OBrowserTable />
</Variant>
</Component>
<Component name="AssociationO2MEditor">
<Variant>
<AssociationO2MEditor />
</Variant>
</Component>
<Component name="AssociationO2MBrowserTable">
<Variant>
<AssociationO2MBrowserTable />
</Variant>
</Component>
<Component name="AssociationM2OEditor">
<Variant>
<AssociationM2OEditor />
</Variant>
</Component>
<Component name="AssociationM2OBrowserTable">
<Variant>
<AssociationM2OBrowserTable />
</Variant>
</Component>
<Component name="AssociationM2MEditor">
<Variant>
<AssociationM2MEditor />
</Variant>
</Component>
<Component name="AssociationM2MBrowserTable">
<Variant>
<AssociationM2MBrowserTable />
</Variant>
</Component>
<Component name="CompositionO2OEditor">
<Variant>
<CompositionO2OEditor />
</Variant>
</Component>
<Component name="CompositionO2OBrowserTable">
<Variant>
<CompositionO2OBrowserTable />
</Variant>
</Component>
<Component name="CompositionO2MEditor">
<Variant>
<CompositionO2MEditor />
</Variant>
</Component>
<Component name="CompositionO2MBrowserTable">
<Variant>
<CompositionO2MBrowserTable />
</Variant>
</Component>
<Component name="DeeplyNestedTestEntityEditor">
<Variant>
<DeeplyNestedTestEntityEditor />
</Variant>
</Component>
<Component name="DeeplyNestedO2MTestEntityTable">
<Variant>
<DeeplyNestedO2MTestEntityTable />
</Variant>
</Component>
<Component name="DeeplyNestedO2MTestEntityEditor">
<Variant>
<DeeplyNestedO2MTestEntityEditor />
</Variant>
</Component>
<Component name="IntIdEditor">
<Variant>
<IntIdEditor />
</Variant>
</Component>
<Component name="IntIdBrowserTable">
<Variant>
<IntIdBrowserTable />
</Variant>
</Component>
<Component name="IntIdBrowserCards">
<Variant>
<IntIdBrowserCards />
</Variant>
</Component>
<Component name="IntIdBrowserList">
<Variant>
<IntIdBrowserList />
</Variant>
</Component>
<Component name="IntIdentityIdCards">
<Variant>
<IntIdentityIdCards />
</Variant>
</Component>
<Component name="IntIdentityIdEditor">
<Variant>
<IntIdentityIdEditor />
</Variant>
</Component>
<Component name="IntIdentityIdBrowserTable">
<Variant>
<IntIdentityIdBrowserTable />
</Variant>
</Component>
<Component name="IntIdentityIdBrowserCards">
<Variant>
<IntIdentityIdBrowserCards />
</Variant>
</Component>
<Component name="IntIdentityIdBrowserList">
<Variant>
<IntIdentityIdBrowserList />
</Variant>
</Component>
<Component name="StringIdCards">
<Variant>
<StringIdCards />
</Variant>
</Component>
<Component name="StringIdMgtCardsEdit">
<Variant>
<StringIdMgtCardsEdit />
</Variant>
</Component>
<Component name="StringIdBrowserCards">
<Variant>
<StringIdBrowserCards />
</Variant>
</Component>
<Component name="StringIdBrowserList">
<Variant>
<StringIdBrowserList />
</Variant>
</Component>
<Component name="StringIdBrowserTable">
<Variant>
<StringIdBrowserTable />
</Variant>
</Component>
<Component name="WeirdStringIdEditor">
<Variant>
<WeirdStringIdEditor />
</Variant>
</Component>
<Component name="WeirdStringIdBrowserCards">
<Variant>
<WeirdStringIdBrowserCards />
</Variant>
</Component>
<Component name="WeirdStringIdBrowserList">
<Variant>
<WeirdStringIdBrowserList />
</Variant>
</Component>
<Component name="WeirdStringIdBrowserTable">
<Variant>
<WeirdStringIdBrowserTable />
</Variant>
</Component>
<Component name="BoringStringIdEditor">
<Variant>
<BoringStringIdEditor />
</Variant>
</Component>
<Component name="BoringStringIdBrowserTable">
<Variant>
<BoringStringIdBrowserTable />
</Variant>
</Component>
<Component name="TrickyIdEditor">
<Variant>
<TrickyIdEditor />
</Variant>
</Component>
<Component name="TrickyIdBrowserTable">
<Variant>
<TrickyIdBrowserTable />
</Variant>
</Component>
</Category>
</Palette>
)