|
@@ -1,5 +1,6 @@
|
|
|
import Menu from 'ant-design-vue/es/menu'
|
|
import Menu from 'ant-design-vue/es/menu'
|
|
|
import Icon from 'ant-design-vue/es/icon'
|
|
import Icon from 'ant-design-vue/es/icon'
|
|
|
|
|
+import Badge from 'ant-design-vue/es/badge'
|
|
|
|
|
|
|
|
const { Item, SubMenu } = Menu
|
|
const { Item, SubMenu } = Menu
|
|
|
|
|
|
|
@@ -38,10 +39,17 @@ export default {
|
|
|
const keys = []
|
|
const keys = []
|
|
|
vm.menu.forEach(item => keys.push(item.path))
|
|
vm.menu.forEach(item => keys.push(item.path))
|
|
|
return keys
|
|
return keys
|
|
|
|
|
+ },
|
|
|
|
|
+ waitCount () {
|
|
|
|
|
+ return this.$store.state.user.waitCount
|
|
|
|
|
+ },
|
|
|
|
|
+ transferCount () {
|
|
|
|
|
+ return this.$store.state.user.transferCount
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
mounted () {
|
|
mounted () {
|
|
|
this.updateMenu()
|
|
this.updateMenu()
|
|
|
|
|
+ this.dumpApprovalMenu()
|
|
|
},
|
|
},
|
|
|
watch: {
|
|
watch: {
|
|
|
collapsed (val) {
|
|
collapsed (val) {
|
|
@@ -57,6 +65,22 @@ export default {
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
methods: {
|
|
methods: {
|
|
|
|
|
+ // 调试用:打印所有「审批」相关菜单的真实 title/path/name/children
|
|
|
|
|
+ dumpApprovalMenu: function () {
|
|
|
|
|
+ const walk = (arr) => {
|
|
|
|
|
+ if (!arr) return
|
|
|
|
|
+ arr.forEach(m => {
|
|
|
|
|
+ const mt = (m.meta && m.meta.title) || ''
|
|
|
|
|
+ const rt = (m.title) || ''
|
|
|
|
|
+ const t = mt || rt
|
|
|
|
|
+ if (t.indexOf('审批') >= 0 || t === '我的审批' || (m.children && m.children.some(c => ((c.meta && c.meta.title) || '').indexOf('审批') >= 0))) {
|
|
|
|
|
+ console.log('MENU-DEBUG', JSON.stringify({ title: t, metaTitle: mt, rawTitle: rt, path: m.path, name: m.name, childCount: m.children ? m.children.length : 0, childTitles: m.children ? m.children.map(c => (c.meta && c.meta.title) || c.title) : [] }))
|
|
|
|
|
+ }
|
|
|
|
|
+ walk(m.children)
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ walk(this.menu)
|
|
|
|
|
+ },
|
|
|
// select menu item
|
|
// select menu item
|
|
|
onOpenChange (openKeys) {
|
|
onOpenChange (openKeys) {
|
|
|
// 在水平模式下时执行,并且不再执行后续
|
|
// 在水平模式下时执行,并且不再执行后续
|
|
@@ -113,11 +137,41 @@ export default {
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // 菜单红点:维修审批 / 转派审批 各自待办数(原生角标,避免 antd Badge 在 Menu.Item 内不显示)
|
|
|
|
|
+ let badge = null
|
|
|
|
|
+ const _t = (menu.meta.title || '')
|
|
|
|
|
+ let count = 0
|
|
|
|
|
+ if (_t.indexOf('维修审批') >= 0) {
|
|
|
|
|
+ count = this.waitCount
|
|
|
|
|
+ } else if (_t.indexOf('转派审批') >= 0) {
|
|
|
|
|
+ count = this.transferCount
|
|
|
|
|
+ }
|
|
|
|
|
+ if (count > 0) {
|
|
|
|
|
+ badge = (
|
|
|
|
|
+ <span style={{ position: 'relative', display: 'inline-block', marginLeft: '8px', verticalAlign: 'middle' }}>
|
|
|
|
|
+ <sup style={{ position: 'absolute', top: '-12px', right: '-12px', minWidth: '18px', height: '18px', lineHeight: '18px', borderRadius: '9px', background: '#f5222d', color: '#fff', fontSize: '12px', fontStyle: 'normal', fontWeight: 'normal', padding: '0 4px', textAlign: 'center', whiteSpace: 'nowrap', boxSizing: 'border-box' }}>{count}</sup>
|
|
|
|
|
+ </span>
|
|
|
|
|
+ )
|
|
|
|
|
+ }
|
|
|
|
|
+ if (_t.indexOf('审批') >= 0) {
|
|
|
|
|
+ console.log('ITEM-BADGE', JSON.stringify({ mt: _t, path: menu.path, wc: this.waitCount, tc: this.transferCount, hasBadge: !!badge }))
|
|
|
|
|
+ }
|
|
|
|
|
+ if (_t.indexOf('维修审批') >= 0) {
|
|
|
|
|
+ this.$nextTick(() => {
|
|
|
|
|
+ document.querySelectorAll('.ant-menu-item').forEach(el => {
|
|
|
|
|
+ if (el.textContent.indexOf('维修审批') >= 0) {
|
|
|
|
|
+ console.log('ITEM-DOM', el.outerHTML.slice(0, 600))
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
return (
|
|
return (
|
|
|
<Item {...{ key: menu.path }}>
|
|
<Item {...{ key: menu.path }}>
|
|
|
<tag {...{ props, attrs }}>
|
|
<tag {...{ props, attrs }}>
|
|
|
{this.renderIcon(menu.meta.icon)}
|
|
{this.renderIcon(menu.meta.icon)}
|
|
|
<span>{menu.meta.title}</span>
|
|
<span>{menu.meta.title}</span>
|
|
|
|
|
+ {badge}
|
|
|
</tag>
|
|
</tag>
|
|
|
</Item>
|
|
</Item>
|
|
|
)
|
|
)
|
|
@@ -127,11 +181,19 @@ export default {
|
|
|
if (!menu.hideChildrenInMenu) {
|
|
if (!menu.hideChildrenInMenu) {
|
|
|
menu.children.forEach(item => itemArr.push(this.renderItem(item)))
|
|
menu.children.forEach(item => itemArr.push(this.renderItem(item)))
|
|
|
}
|
|
}
|
|
|
|
|
+ // 菜单红点:父级「我的审批」= 维修审批数 + 转派审批数(indexOf 兼容 title 带空格/后缀)
|
|
|
|
|
+ let badge = null
|
|
|
|
|
+ const _p = (menu.meta.title || '')
|
|
|
|
|
+ if (_p.indexOf('我的审批') >= 0) {
|
|
|
|
|
+ console.log('SUBMENU-BADGE', JSON.stringify({ mt: _p, path: menu.path, wc: this.waitCount, tc: this.transferCount, sum: this.waitCount + this.transferCount }))
|
|
|
|
|
+ badge = <Badge count={this.waitCount + this.transferCount} offset={[10, -4]} />
|
|
|
|
|
+ }
|
|
|
return (
|
|
return (
|
|
|
<SubMenu {...{ key: menu.path }}>
|
|
<SubMenu {...{ key: menu.path }}>
|
|
|
<span slot="title">
|
|
<span slot="title">
|
|
|
{this.renderIcon(menu.meta.icon)}
|
|
{this.renderIcon(menu.meta.icon)}
|
|
|
<span>{menu.meta.title}</span>
|
|
<span>{menu.meta.title}</span>
|
|
|
|
|
+ {badge}
|
|
|
</span>
|
|
</span>
|
|
|
{itemArr}
|
|
{itemArr}
|
|
|
</SubMenu>
|
|
</SubMenu>
|