Skip to content

Commit b3d8ee7

Browse files
committed
refactor: change implementation of sidebar menu (CSidebarNavLink)
1 parent bbd10ac commit b3d8ee7

File tree

2 files changed

+34
-76
lines changed

2 files changed

+34
-76
lines changed

src/components/Sidebar/CSidebarNavItems.vue

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,7 @@
4444
v-for="(childL2, index2) in childL1.children"
4545
>
4646
<CSidebarNavLink
47-
:name="childL2.name"
48-
:url="childL2.url"
49-
:icon="childL2.icon"
50-
:badge="childL2.badge"
47+
v-bind="childL2"
5148
:variant="item.variant"
5249
/>
5350
</li>
@@ -56,10 +53,7 @@
5653
<template v-else>
5754
<CSidebarNavItem :key="index1" :classes="item.class">
5855
<CSidebarNavLink
59-
:name="childL1.name"
60-
:url="childL1.url"
61-
:icon="childL1.icon"
62-
:badge="childL1.badge"
56+
v-bind="childL1"
6357
:variant="item.variant"
6458
/>
6559
</CSidebarNavItem>
@@ -69,13 +63,7 @@
6963
</template>
7064
<template v-else>
7165
<CSidebarNavItem :key="index" :classes="item.class">
72-
<CSidebarNavLink
73-
:name="item.name"
74-
:url="item.url"
75-
:icon="item.icon"
76-
:badge="item.badge"
77-
:variant="item.variant"
78-
/>
66+
<CSidebarNavLink v-bind="item"/>
7967
</CSidebarNavItem>
8068
</template>
8169
</template>

src/components/Sidebar/CSidebarNavLink.vue

Lines changed: 31 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,44 @@
11
<template>
2-
<div v-if="isExternalLink">
3-
<a :href="url" :class="classList">
4-
<i :class="classIcon"></i> {{name}}
5-
<c-badge v-if="badge && badge.text" :variant="badge.variant">{{badge.text}}</c-badge>
6-
</a>
7-
</div>
8-
<div v-else>
9-
<router-link :to="url" :class="classList">
10-
<i :class="classIcon"></i> {{name}}
11-
<c-badge v-if="badge && badge.text" :variant="badge.variant">{{badge.text}}</c-badge>
12-
</router-link>
13-
</div>
2+
<CLink
3+
v-bind="computedProps"
4+
:exact="true"
5+
class="nav-link"
6+
>
7+
<i :class="['nav-icon', icon]"></i> {{name}}
8+
<CBadge
9+
v-if="badge && badge.text"
10+
:variant="badge.variant"
11+
>
12+
{{badge.text}}
13+
</CBadge>
14+
</CLink>
1415
</template>
1516

16-
1717
<script>
18-
export default {
19-
name: 'CSidebarNavLink',
20-
props: {
21-
name: {
22-
type: String,
23-
default: ''
24-
},
25-
url: {
26-
type: String,
27-
default: ''
28-
},
29-
icon: {
30-
type: String,
31-
default: ''
32-
},
18+
import CLink, { propsFactory as linkPropsFactory} from '../Link/CLink'
19+
20+
const props = Object.assign(linkPropsFactory(), {
21+
name: String,
22+
icon: [String, Array, Object],
3323
badge: {
3424
type: Object,
3525
default: () => {}
3626
},
37-
variant: {
38-
type: String,
39-
default: ''
40-
},
41-
classes: {
42-
type: String,
43-
default: ''
44-
}
45-
},
27+
variant: String,
28+
url: String
29+
}
30+
)
31+
export default {
32+
name: 'CSidebarNavLink',
33+
props,
4634
computed: {
47-
classList () {
48-
return [
49-
'nav-link',
50-
this.linkVariant,
51-
...this.itemClasses
52-
]
53-
},
54-
classIcon () {
55-
return [
56-
'nav-icon',
57-
this.icon
58-
]
59-
},
60-
linkVariant () {
61-
return this.variant ? `nav-link-${this.variant}` : ''
62-
},
63-
itemClasses () {
64-
return this.classes ? this.classes.split(' ') : []
35+
linkGeneratedFromUrlProp () {
36+
if (!this.url) return {}
37+
return this.url && this.url.substring(0,4) === 'http' ?
38+
{ href: this.url } : { to: this.url }
6539
},
66-
isExternalLink () {
67-
if (this.url.substring(0, 4) === 'http') {
68-
return true
69-
} else {
70-
return false
71-
}
40+
computedProps () {
41+
return Object.assign({}, this.$props, this.linkGeneratedFromUrlProp)
7242
}
7343
}
7444
}

0 commit comments

Comments
 (0)