189 lines
5.8 KiB
JavaScript
189 lines
5.8 KiB
JavaScript
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; |