2025-04-02 21:57:33 +08:00

189 lines
5.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import './index.less';
import PropTypes from 'ant-design-vue/es/_util/vue-types';
import 'ant-design-vue/es/layout/style';
import Layout from 'ant-design-vue/es/layout';
import { isFun } from '../../utils/util';
import BaseMenu from '../RouteMenu';
var Sider = Layout.Sider;
export var SiderMenuProps = {
i18nRender: PropTypes.oneOfType([PropTypes.func, PropTypes.bool]).def(false),
mode: PropTypes.string.def('inline'),
theme: PropTypes.string.def('dark'),
contentWidth: PropTypes.oneOf(['Fluid', 'Fixed']).def('Fluid'),
collapsible: PropTypes.bool,
collapsed: PropTypes.bool,
collapsedWidth: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).def(80),
openKeys: PropTypes.array.def(undefined),
selectedKeys: PropTypes.array.def(undefined),
openOnceKey: PropTypes.bool.def(true),
handleCollapse: PropTypes.func,
menus: PropTypes.array,
siderWidth: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).def(256),
isMobile: PropTypes.bool,
layout: PropTypes.string.def('inline'),
fixSiderbar: PropTypes.bool,
logo: PropTypes.any,
title: PropTypes.string.def(''),
// render function or vnode
menuHeaderRender: PropTypes.oneOfType([PropTypes.func, PropTypes.array, PropTypes.object, PropTypes.bool]),
menuRender: PropTypes.oneOfType([PropTypes.func, PropTypes.array, PropTypes.object, PropTypes.bool]),
// listeners
openChange: PropTypes.func,
select: PropTypes.func,
menuClick: PropTypes.func
};
export var defaultRenderLogo = function defaultRenderLogo(h, logo) {
if (typeof logo === 'string') {
return h("img", {
attrs: {
src: logo,
alt: "logo"
}
});
}
if (typeof logo === 'function') {
return logo();
}
return h(logo);
};
export var defaultRenderLogoAntTitle = function defaultRenderLogoAntTitle(h, props) {
var _props$logo = props.logo,
logo = _props$logo === void 0 ? 'https://gw.alipayobjects.com/zos/antfincdn/PmY%24TNNDBI/logo.svg' : _props$logo,
title = props.title,
menuHeaderRender = props.menuHeaderRender;
if (menuHeaderRender === false) {
return null;
}
var logoDom = defaultRenderLogo(h, logo);
var titleDom = h("h1", [title]);
if (menuHeaderRender) {
return isFun(menuHeaderRender) && menuHeaderRender(h, logoDom, props.collapsed ? null : titleDom, props) || menuHeaderRender;
}
return h("span", [logoDom, titleDom]);
};
var adaptWidth = function adaptWidth(collapsedWidth) {
if (collapsedWidth >= 32 && collapsedWidth <= 80) {
return collapsedWidth;
} else {
return 80;
}
};
var SiderMenu = {
name: 'SiderMenu',
model: {
prop: 'collapsed',
event: 'collapse'
},
props: SiderMenuProps,
render: function render(h) {
var collapsible = this.collapsible,
collapsed = this.collapsed,
collapsedWidth = this.collapsedWidth,
selectedKeys = this.selectedKeys,
openKeys = this.openKeys,
_this$openChange = this.openChange,
openChange = _this$openChange === void 0 ? function () {
return null;
} : _this$openChange,
_this$select = this.select,
select = _this$select === void 0 ? function () {
return null;
} : _this$select,
_this$menuClick = this.menuClick,
menuClick = _this$menuClick === void 0 ? function () {
return null;
} : _this$menuClick,
openOnceKey = this.openOnceKey,
siderWidth = this.siderWidth,
fixSiderbar = this.fixSiderbar,
mode = this.mode,
theme = this.theme,
menus = this.menus,
logo = this.logo,
title = this.title,
_this$onMenuHeaderCli = this.onMenuHeaderClick,
onMenuHeaderClick = _this$onMenuHeaderCli === void 0 ? function () {
return null;
} : _this$onMenuHeaderCli,
i18nRender = this.i18nRender,
menuHeaderRender = this.menuHeaderRender,
menuRender = this.menuRender;
var siderCls = ['ant-pro-sider-menu-sider'];
if (fixSiderbar) siderCls.push('fix-sider-bar');
if (theme === 'light') siderCls.push('light'); //
// const handleCollapse = (collapsed, type) => {
// this.$emit('collapse', collapsed)
// }
var headerDom = defaultRenderLogoAntTitle(h, {
logo: logo,
title: title,
menuHeaderRender: menuHeaderRender,
collapsed: collapsed
}); // 用户的logo图片宽度无法动态获取暂时写死32后续有更好的方案再修改
var logoPaddingLeft = function logoPaddingLeft(collapsed, collapsedWidth) {
if (collapsed) {
return "".concat(collapsedWidth ? Math.abs((collapsedWidth - 32) / 2) : 0, "px");
}
return 32;
};
return h(Sider, {
"class": siderCls,
attrs: {
breakpoint: 'lg',
trigger: null,
width: siderWidth,
theme: theme,
collapsible: collapsible,
collapsed: collapsed,
collapsedWidth: adaptWidth(collapsedWidth)
}
}, [headerDom && h("div", {
"class": "ant-pro-sider-menu-logo",
on: {
"click": onMenuHeaderClick
},
style: {
paddingLeft: logoPaddingLeft(collapsed, adaptWidth(collapsedWidth))
},
attrs: {
id: "logo"
}
}, [h("router-link", {
attrs: {
to: {
path: '/'
}
}
}, [headerDom])]), menuRender && (isFun(menuRender) && menuRender(h, this.$props) || menuRender) || h(BaseMenu, {
attrs: {
collapsed: collapsed,
collapsedWidth: adaptWidth(collapsedWidth),
openKeys: openKeys,
selectedKeys: selectedKeys,
openOnceKey: openOnceKey,
menus: menus,
mode: mode,
theme: theme,
i18nRender: i18nRender
},
on: {
"openChange": openChange,
"select": select,
"click": menuClick
}
})]);
}
};
export default SiderMenu;