Commit 86ac1d58 authored by Sendya's avatar Sendya

fix: IconFont url

parent 3f18261b
...@@ -3,3 +3,4 @@ node_modules/ ...@@ -3,3 +3,4 @@ node_modules/
**/style/ **/style/
*.html *.html
src/icons src/icons
vite.config.ts
\ No newline at end of file
...@@ -156,11 +156,11 @@ export default defineComponent({ ...@@ -156,11 +156,11 @@ export default defineComponent({
const state = reactive({ const state = reactive({
menuData, menuData,
splitMenus: false, splitMenus: true,
// title: 'ProLayout', // title: 'ProLayout',
// logo: 'https://alicdn.antdv.com/v2/assets/logo.1ef800a8.svg', // logo: 'https://alicdn.antdv.com/v2/assets/logo.1ef800a8.svg',
navTheme: 'dark', navTheme: 'dark',
layout: 'top', layout: 'mix',
fixSiderbar: true, fixSiderbar: true,
}); });
const breadcrumb = computed(() => const breadcrumb = computed(() =>
......
...@@ -31,9 +31,10 @@ ...@@ -31,9 +31,10 @@
"serve": "vite preview", "serve": "vite preview",
"build:types": "tsc -b --force tsconfig.esm.json" "build:types": "tsc -b --force tsconfig.esm.json"
}, },
"types": "./dist",
"peerDependencies": { "peerDependencies": {
"ant-design-vue": ">=2.2.0", "ant-design-vue": ">=2.2.0",
"vue": ">=3.1.0", "vue": ">=3.2.0",
"vue-router": "^4.0.3" "vue-router": "^4.0.3"
}, },
"dependencies": { "dependencies": {
...@@ -43,14 +44,13 @@ ...@@ -43,14 +44,13 @@
"vue": "^3.1.0", "vue": "^3.1.0",
"vue-router": "^4.0.10" "vue-router": "^4.0.10"
}, },
"types": "./dist",
"devDependencies": { "devDependencies": {
"@types/lodash-es": "^4.17.4", "@types/lodash-es": "^4.17.4",
"@types/node": "^16.0.1", "@types/node": "^16.0.1",
"@typescript-eslint/eslint-plugin": "^4.28.2", "@typescript-eslint/eslint-plugin": "^4.28.2",
"@typescript-eslint/parser": "^4.28.2", "@typescript-eslint/parser": "^4.28.2",
"@vitejs/plugin-vue": "^1.2.4", "@vitejs/plugin-vue": "^1.6.0",
"@vitejs/plugin-vue-jsx": "^1.1.6", "@vitejs/plugin-vue-jsx": "^1.1.7",
"@vue/compiler-sfc": "^3.1.0", "@vue/compiler-sfc": "^3.1.0",
"@vuedx/typescript-plugin-vue": "^0.7.4", "@vuedx/typescript-plugin-vue": "^0.7.4",
"eslint": "^7.30.0", "eslint": "^7.30.0",
......
import { computed, reactive, unref, provide, defineComponent, toRefs } from 'vue'; import { computed, reactive, unref, defineComponent, toRefs } from 'vue';
import type { CSSProperties, PropType, ExtractPropTypes } from 'vue'; import type { CSSProperties, PropType, ExtractPropTypes } from 'vue';
import 'ant-design-vue/es/layout/style'; import 'ant-design-vue/es/layout/style';
import Layout from 'ant-design-vue/es/layout'; import Layout from 'ant-design-vue/es/layout';
import omit from 'omit.js';
import { withInstall } from 'ant-design-vue/es/_util/type'; import { withInstall } from 'ant-design-vue/es/_util/type';
import useMediaQuery from './hooks/useMediaQuery'; import useMediaQuery from './hooks/useMediaQuery';
...@@ -13,12 +12,12 @@ import SiderMenuWrapper, { siderMenuProps } from './SiderMenu'; ...@@ -13,12 +12,12 @@ import SiderMenuWrapper, { siderMenuProps } from './SiderMenu';
import { WrapContent } from './WrapContent'; import { WrapContent } from './WrapContent';
import globalHeaderProps from './GlobalHeader/headerProps'; import globalHeaderProps from './GlobalHeader/headerProps';
import { HeaderView as Header, headerViewProps } from './Header'; import { HeaderView as Header, headerViewProps } from './Header';
import { getPropsSlot, getPropsSlotfn, PropTypes } from './utils'; import { getPropsSlot, getPropsSlotfn, PropTypes, pick } from './utils';
import type { BreadcrumbProps } from './RouteContext'; import type { BreadcrumbProps } from './RouteContext';
import type { CustomRender, FormatMessage, WithFalse } from './typings'; import type { CustomRender, FormatMessage, WithFalse } from './typings';
import './BasicLayout.less';
import PageLoading from './PageLoading'; import PageLoading from './PageLoading';
import './BasicLayout.less';
export const basicLayoutProps = { export const basicLayoutProps = {
...defaultSettingProps, ...defaultSettingProps,
...@@ -141,10 +140,6 @@ const ProLayout = defineComponent({ ...@@ -141,10 +140,6 @@ const ProLayout = defineComponent({
genLayoutStyle.minHeight = 0; genLayoutStyle.minHeight = 0;
} }
// const [collapsed, onCollapse] = useMergedState<boolean>(defaultCollapsed || false, {
// value: props.collapsed,
// onChange: propsOnCollapse,
// });
const headerRender = ( const headerRender = (
p: BasicLayoutProps & { p: BasicLayoutProps & {
hasSiderMenu: boolean; hasSiderMenu: boolean;
...@@ -158,19 +153,41 @@ const ProLayout = defineComponent({ ...@@ -158,19 +153,41 @@ const ProLayout = defineComponent({
} }
return <Header {...p} matchMenuKeys={matchMenuKeys || []} />; return <Header {...p} matchMenuKeys={matchMenuKeys || []} />;
}; };
const breadcrumb = computed(() => ({
const breadcrumb = computed<BreadcrumbProps>(() => ({
...props.breadcrumb, ...props.breadcrumb,
itemRender: getPropsSlotfn(slots, props, 'breadcrumbRender'), itemRender: getPropsSlotfn(slots, props, 'breadcrumbRender'),
})); }));
const routeContext = reactive<RouteContextProps>({ console.log('props', toRefs(props));
...defaultRouteContext,
...(omit(toRefs(props), ['onCollapse', 'onOpenKeys', 'onSelect', 'onMenuClick']) as any), const routeContext = reactive<RouteContextProps>(
breadcrumb: breadcrumb, Object.assign(
}); {...defaultRouteContext},
pick(toRefs(props), [
'locale',
'menuData',
'openKeys',
'selectedKeys',
'contentWidth',
'disableMobile',
'fixSiderbar',
'fixedHeader',
// 'hasSideMenu',
// 'hasHeader',
// 'hasFooter',
// 'hasFooterToolbar',
// 'setHasFooterToolbar',
]) as any,
{
isMobile,
breadcrumb,
}
)
);
provideRouteContext(routeContext); provideRouteContext(routeContext);
return () => {
return () => {
const { const {
pure, pure,
onCollapse: propsOnCollapse, onCollapse: propsOnCollapse,
......
...@@ -208,10 +208,11 @@ const defaultPageHeaderRender = ( ...@@ -208,10 +208,11 @@ const defaultPageHeaderRender = (
if (!title && title !== false) { if (!title && title !== false) {
pageHeaderTitle = value.title; pageHeaderTitle = value.title;
} }
const unrefBreadcrumb = unref(value.breadcrumb || {})
const breadcrumb = restProps.breadcrumb || { const breadcrumb = restProps.breadcrumb || {
...(value.breadcrumb || {}), ...(unrefBreadcrumb),
routes: unref(value.breadcrumb?.routes), routes: unrefBreadcrumb.routes,
itemRender: unref(value.breadcrumb?.itemRender), itemRender: unrefBreadcrumb.itemRender,
}; };
// inject value // inject value
return ( return (
......
import { InjectionKey, provide, reactive, Ref } from 'vue'; import { InjectionKey, provide, reactive, Ref, VNodeChild, ComputedRef } from 'vue';
import { createContext, useContext } from './hooks/context'; import { createContext, useContext } from './hooks/context';
import { MenuDataItem, FormatMessage, WithFalse, CustomRender } from './typings'; import { MenuDataItem, FormatMessage, WithFalse } from './typings';
import { PureSettings } from './defaultSettings'; import { PureSettings } from './defaultSettings';
export interface Route { export interface Route {
...@@ -13,13 +13,13 @@ export interface BreadcrumbProps { ...@@ -13,13 +13,13 @@ export interface BreadcrumbProps {
prefixCls?: string; prefixCls?: string;
routes?: Route[]; routes?: Route[];
params?: any; params?: any;
separator?: CustomRender; separator?: VNodeChild;
itemRender?: (opts: { itemRender?: (opts: {
route: Route; route: Route;
params: any; params: any;
routes: Array<Route>; routes: Array<Route>;
paths: Array<string>; paths: Array<string>;
}) => CustomRender; }) => VNodeChild;
} }
export type BreadcrumbListReturn = Pick< export type BreadcrumbListReturn = Pick<
...@@ -30,16 +30,14 @@ export type BreadcrumbListReturn = Pick< ...@@ -30,16 +30,14 @@ export type BreadcrumbListReturn = Pick<
export interface MenuState { export interface MenuState {
selectedKeys: string[]; selectedKeys: string[];
openKeys: string[]; openKeys: string[];
setSelectedKeys?: (key: string[]) => void;
setOpenKeys?: (key: string[]) => void;
} }
export interface RouteContextProps extends Partial<PureSettings>, MenuState { export interface RouteContextProps extends Partial<PureSettings>, MenuState {
menuData: MenuDataItem[];
getPrefixCls?: (suffixCls?: string, customizePrefixCls?: string) => string; getPrefixCls?: (suffixCls?: string, customizePrefixCls?: string) => string;
locale?: WithFalse<FormatMessage>; locale?: WithFalse<FormatMessage>;
breadcrumb?: BreadcrumbListReturn | ComputedRef<BreadcrumbListReturn>;
breadcrumb?: BreadcrumbListReturn;
menuData: MenuDataItem[];
isMobile?: boolean; isMobile?: boolean;
prefixCls?: string; prefixCls?: string;
collapsed?: boolean; collapsed?: boolean;
......
...@@ -9,6 +9,8 @@ import { ...@@ -9,6 +9,8 @@ import {
isVNode, isVNode,
ExtractPropTypes, ExtractPropTypes,
ConcreteComponent, ConcreteComponent,
watchEffect,
FunctionalComponent,
} from 'vue'; } from 'vue';
import { createFromIconfontCN } from '@ant-design/icons-vue'; import { createFromIconfontCN } from '@ant-design/icons-vue';
import 'ant-design-vue/es/menu/style'; import 'ant-design-vue/es/menu/style';
...@@ -97,15 +99,15 @@ export const baseMenuProps = { ...@@ -97,15 +99,15 @@ export const baseMenuProps = {
export type BaseMenuProps = ExtractPropTypes<typeof baseMenuProps>; export type BaseMenuProps = ExtractPropTypes<typeof baseMenuProps>;
const IconFont = createFromIconfontCN({ let IconFont = createFromIconfontCN({
scriptUrl: defaultSettings.iconfontUrl, scriptUrl: defaultSettings.iconfontUrl,
}); });
const LazyIcon = (props: { const LazyIcon: FunctionalComponent<{
icon: VNodeChild | string; icon: VNodeChild | string;
iconPrefixes?: string; iconPrefixes?: string;
prefixCls?: string; prefixCls?: string;
}) => { }> = (props) => {
const { icon, iconPrefixes = 'icon-', prefixCls = 'ant-pro' } = props; const { icon, iconPrefixes = 'icon-', prefixCls = 'ant-pro' } = props;
if (!icon) { if (!icon) {
return null; return null;
...@@ -125,13 +127,13 @@ const LazyIcon = (props: { ...@@ -125,13 +127,13 @@ const LazyIcon = (props: {
return (typeof LazyIcon === 'function' && <DynamicIcon />) || null; return (typeof LazyIcon === 'function' && <DynamicIcon />) || null;
}; };
LazyIcon.props = { // LazyIcon.props = {
icon: { // icon: {
type: [String, Function, Object] as PropType<string | Function | VNode | JSX.Element>, // type: [String, Function, Object] as PropType<string | Function | VNode | JSX.Element>,
}, // },
iconPrefixes: String, // iconPrefixes: String,
prefixCls: String, // prefixCls: String,
}; // };
class MenuUtil { class MenuUtil {
props: BaseMenuProps; props: BaseMenuProps;
...@@ -235,6 +237,20 @@ class MenuUtil { ...@@ -235,6 +237,20 @@ class MenuUtil {
}; };
} }
export type MenuOnSelect = {
key: string | number;
keyPath: string[] | number[];
item: VNodeChild | any;
domEvent: MouseEvent;
selectedKeys: string[];
}
export type MenuOnClick={
item: VNodeChild;
key: string | number;
keyPath: string | string[] | number | number[];
}
export default defineComponent({ export default defineComponent({
name: 'BaseMenu', name: 'BaseMenu',
props: baseMenuProps, props: baseMenuProps,
...@@ -242,42 +258,43 @@ export default defineComponent({ ...@@ -242,42 +258,43 @@ export default defineComponent({
setup(props, { emit }) { setup(props, { emit }) {
const menuUtil = new MenuUtil(props); const menuUtil = new MenuUtil(props);
// update iconfontUrl
watchEffect(() => {
if (props.iconfontUrl) {
IconFont = createFromIconfontCN({
scriptUrl: props.iconfontUrl,
})
}
})
const handleOpenChange = (openKeys: string[]): void => { const handleOpenChange = (openKeys: string[]): void => {
emit('update:openKeys', openKeys); emit('update:openKeys', openKeys);
}; };
const handleSelect = (params: { const handleSelect = (args: MenuOnSelect): void => {
key: string | number; emit('update:selectedKeys', args.selectedKeys);
keyPath: string[] | number[];
item: VNodeChild | any;
domEvent: MouseEvent;
selectedKeys: string[];
}): void => {
emit('update:selectedKeys', params.selectedKeys);
}; };
const handleClick = (args: { const handleClick = (args: MenuOnClick) => {
item: VNodeChild;
key: string | number;
keyPath: string | string[] | number | number[];
}) => {
emit('click', args); emit('click', args);
}; };
return () => (
<Menu
key="Menu" return () => {
// inlineCollapsed={(isInline.value && props.collapsed) || undefined} return (
inlineIndent={16} <Menu
mode={props.mode} key="Menu"
theme={props.theme as 'dark' | 'light'} inlineIndent={16}
openKeys={props.openKeys === false ? [] : props.openKeys} mode={props.mode}
selectedKeys={props.selectedKeys || []} theme={props.theme as 'dark' | 'light'}
// @ts-ignore openKeys={props.openKeys === false ? [] : props.openKeys}
onOpenChange={handleOpenChange} selectedKeys={props.selectedKeys || []}
onSelect={handleSelect} onOpenChange={handleOpenChange}
onClick={handleClick} onSelect={handleSelect}
{...props.menuProps} onClick={handleClick}
> {...props.menuProps}
{menuUtil.getNavMenuItems(props.menuData)} >
</Menu> {menuUtil.getNavMenuItems(props.menuData)}
); </Menu>
)
};
}, },
}); });
...@@ -11,7 +11,6 @@ import Layout from 'ant-design-vue/es/layout'; ...@@ -11,7 +11,6 @@ import Layout from 'ant-design-vue/es/layout';
import 'ant-design-vue/es/menu/style'; import 'ant-design-vue/es/menu/style';
import Menu from 'ant-design-vue/es/menu'; import Menu from 'ant-design-vue/es/menu';
import { MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons-vue'; import { MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons-vue';
import { warn } from '@/utils/base';
import BaseMenu, { baseMenuProps } from './BaseMenu'; import BaseMenu, { baseMenuProps } from './BaseMenu';
import { WithFalse, CustomRender } from '../typings'; import { WithFalse, CustomRender } from '../typings';
import { SiderProps } from './typings'; import { SiderProps } from './typings';
......
import type { PropType, ExtractPropTypes } from 'vue'; import type { PropType, ExtractPropTypes } from 'vue';
import type { MenuTheme, ContentWidth } from './typings'; import type { MenuTheme, ContentWidth } from './typings';
export interface RenderSetting {
headerRender?: false;
footerRender?: false;
menuRender?: false;
menuHeaderRender?: false;
}
export interface RenderSetting { export interface RenderSetting {
headerRender?: false; headerRender?: false;
footerRender?: false; footerRender?: false;
......
...@@ -82,3 +82,12 @@ export type StringKeyOf<T> = Extract<keyof T, string>; ...@@ -82,3 +82,12 @@ export type StringKeyOf<T> = Extract<keyof T, string>;
export type EventHandlers<E> = { export type EventHandlers<E> = {
[K in StringKeyOf<E>]?: E[K] extends Function ? E[K] : (payload: E[K]) => void; [K in StringKeyOf<E>]?: E[K] extends Function ? E[K] : (payload: E[K]) => void;
}; };
/**
* Creates an object composed of the picked object properties.
* @param obj The source object
* @param paths The property paths to pick
*/
export function pick<T, K extends keyof T>(obj: T, paths: K[]): Pick<T, K> {
return { ...paths.reduce((mem, key) => ({ ...mem, [key]: obj[key] }), {}) } as Pick<T, K>;
}
...@@ -9,11 +9,11 @@ import vueLess from './scripts/vite/less'; ...@@ -9,11 +9,11 @@ import vueLess from './scripts/vite/less';
export default defineConfig({ export default defineConfig({
plugins: [ plugins: [
vue(), vue(),
vueJsx(), vueJsx({
mergeProps: false,
enableObjectSlots: false,
}),
vueLess(), vueLess(),
/* dts({
tsConfigFilePath: resolve(__dirname, './tsconfig.json'),
}), */
], ],
resolve: { resolve: {
alias: { alias: {
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment