feat: add registerable icon component
This commit is contained in:
parent
437c49d211
commit
f8e8b2b9c7
55
packages/app/src/components/icons/index.tsx
Normal file
55
packages/app/src/components/icons/index.tsx
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import {
|
||||||
|
createFromIconfontCN,
|
||||||
|
UserOutlined,
|
||||||
|
TeamOutlined,
|
||||||
|
DatabaseOutlined,
|
||||||
|
DashboardOutlined,
|
||||||
|
SettingOutlined,
|
||||||
|
TableOutlined,
|
||||||
|
MenuOutlined,
|
||||||
|
} from '@ant-design/icons';
|
||||||
|
|
||||||
|
const IconFont = createFromIconfontCN({
|
||||||
|
scriptUrl: [
|
||||||
|
'//at.alicdn.com/t/font_2261954_u9jzwc44ug.js',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
const icons = new Map<string, any>();
|
||||||
|
|
||||||
|
export function registerIcon(type: string, icon) {
|
||||||
|
icons.set(type.toLowerCase(), icon);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function registerIcons(components) {
|
||||||
|
Object.keys(components).forEach(type => {
|
||||||
|
registerIcon(type, components[type]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
registerIcons({
|
||||||
|
MenuOutlined,
|
||||||
|
TableOutlined,
|
||||||
|
SettingOutlined,
|
||||||
|
TeamOutlined,
|
||||||
|
UserOutlined,
|
||||||
|
DatabaseOutlined,
|
||||||
|
DashboardOutlined,
|
||||||
|
});
|
||||||
|
|
||||||
|
interface IconProps {
|
||||||
|
type: string;
|
||||||
|
[key: string]: any;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function Icon(props: IconProps) {
|
||||||
|
const { type = '', ...restProps } = props;
|
||||||
|
if (type && icons.has(type.toLowerCase())) {
|
||||||
|
const IconComponent = icons.get(type.toLowerCase());
|
||||||
|
return <IconComponent {...restProps}/>;
|
||||||
|
}
|
||||||
|
return <IconFont type={type} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Icon;
|
@ -2,6 +2,7 @@ import React from 'react';
|
|||||||
import { Layout, Menu, Breadcrumb } from 'antd';
|
import { Layout, Menu, Breadcrumb } from 'antd';
|
||||||
import { Link } from 'umi';
|
import { Link } from 'umi';
|
||||||
import './style.less';
|
import './style.less';
|
||||||
|
import Icon from '@/components/icons';
|
||||||
|
|
||||||
export function SideMenuLayout(props: any) {
|
export function SideMenuLayout(props: any) {
|
||||||
const { menu = [] } = props.page;
|
const { menu = [] } = props.page;
|
||||||
@ -12,7 +13,7 @@ export function SideMenuLayout(props: any) {
|
|||||||
<Menu mode={'inline'} defaultSelectedKeys={['2']}>
|
<Menu mode={'inline'} defaultSelectedKeys={['2']}>
|
||||||
{menu.map(item => (
|
{menu.map(item => (
|
||||||
<Menu.Item key={item.path}>
|
<Menu.Item key={item.path}>
|
||||||
<Link to={item.path}>{item.title}</Link>
|
<Link to={item.path}><Icon type={item.icon}/> {item.title}</Link>
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
))}
|
))}
|
||||||
</Menu>
|
</Menu>
|
||||||
|
@ -3,6 +3,7 @@ import { Layout, Menu, Dropdown, Avatar } from 'antd';
|
|||||||
import './style.less';
|
import './style.less';
|
||||||
import { history, Link, request, useModel } from 'umi';
|
import { history, Link, request, useModel } from 'umi';
|
||||||
import { UserOutlined } from '@ant-design/icons';
|
import { UserOutlined } from '@ant-design/icons';
|
||||||
|
import Icon from '@/components/icons';
|
||||||
|
|
||||||
const overlay = (
|
const overlay = (
|
||||||
<Menu>
|
<Menu>
|
||||||
@ -28,7 +29,7 @@ export function TopMenuLayout(props: any) {
|
|||||||
<Menu style={{float: 'left'}} theme="dark" mode="horizontal" defaultSelectedKeys={['2']}>
|
<Menu style={{float: 'left'}} theme="dark" mode="horizontal" defaultSelectedKeys={['2']}>
|
||||||
{menu.map(item => (
|
{menu.map(item => (
|
||||||
<Menu.Item key={item.path}>
|
<Menu.Item key={item.path}>
|
||||||
<Link to={item.path}>{item.title}</Link>
|
<Link to={item.path}><Icon type={item.icon}/>{item.title}</Link>
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
))}
|
))}
|
||||||
</Menu>
|
</Menu>
|
||||||
|
@ -22,9 +22,9 @@ export default async function (options = {}) {
|
|||||||
const [Collection, Page] = database.getModels(['collections', 'pages']);
|
const [Collection, Page] = database.getModels(['collections', 'pages']);
|
||||||
|
|
||||||
async function createCollectionPage(model) {
|
async function createCollectionPage(model) {
|
||||||
if (!model.get('showInDataMenu')) {
|
// if (!model.get('showInDataMenu')) {
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
const parent = await Page.findOne({
|
const parent = await Page.findOne({
|
||||||
where: {
|
where: {
|
||||||
path: '/collections',
|
path: '/collections',
|
||||||
@ -48,7 +48,7 @@ export default async function (options = {}) {
|
|||||||
page.set({
|
page.set({
|
||||||
title: model.get('title'),
|
title: model.get('title'),
|
||||||
icon: model.get('icon'),
|
icon: model.get('icon'),
|
||||||
showInMenu: model.get('showInDataMenu'),
|
showInMenu: !!model.get('showInDataMenu'),
|
||||||
});
|
});
|
||||||
page.save();
|
page.save();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user