2019-08-14 09:48:44 +00:00
|
|
|
<template>
|
|
|
|
<aside class="sidebar animated shrink columns">
|
|
|
|
<div class="logo">
|
2019-08-25 14:29:28 +00:00
|
|
|
<router-link :to="dashboardPath" replace>
|
2019-10-16 09:06:17 +00:00
|
|
|
<img src="~dashboard/assets/images/woot-logo.svg" alt="Woot-logo" />
|
2019-08-14 09:48:44 +00:00
|
|
|
</router-link>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="main-nav">
|
|
|
|
<transition-group name="menu-list" tag="ul" class="menu vertical">
|
|
|
|
<sidebar-item
|
2019-08-25 14:29:28 +00:00
|
|
|
v-for="item in accessibleMenuItems"
|
|
|
|
:key="item.toState"
|
2019-08-14 09:48:44 +00:00
|
|
|
:menu-item="item"
|
|
|
|
/>
|
2019-12-28 16:26:42 +00:00
|
|
|
|
|
|
|
<sidebar-item
|
|
|
|
v-if="shouldShowInboxes"
|
|
|
|
:key="inboxSection.toState"
|
|
|
|
:menu-item="inboxSection"
|
|
|
|
/>
|
2019-08-14 09:48:44 +00:00
|
|
|
</transition-group>
|
|
|
|
</div>
|
2019-11-24 13:39:17 +00:00
|
|
|
|
|
|
|
<!-- this block is only required in the hosted version with billing enabled -->
|
2019-08-14 09:48:44 +00:00
|
|
|
<transition name="fade" mode="out-in">
|
|
|
|
<woot-status-bar
|
2019-08-25 14:29:28 +00:00
|
|
|
v-if="shouldShowStatusBox"
|
2019-08-14 09:48:44 +00:00
|
|
|
:message="trialMessage"
|
2019-08-25 14:29:28 +00:00
|
|
|
:button-text="$t('APP_GLOBAL.TRAIL_BUTTON')"
|
|
|
|
:button-route="{ name: 'billing' }"
|
2019-08-14 09:48:44 +00:00
|
|
|
:type="statusBarClass"
|
|
|
|
:show-button="isAdmin()"
|
|
|
|
/>
|
|
|
|
</transition>
|
2019-11-24 13:39:17 +00:00
|
|
|
|
2019-08-14 09:48:44 +00:00
|
|
|
<div class="bottom-nav">
|
|
|
|
<transition name="menu-slide">
|
2019-08-25 14:29:28 +00:00
|
|
|
<div
|
|
|
|
v-if="showOptionsMenu"
|
|
|
|
v-on-clickaway="showOptions"
|
|
|
|
class="dropdown-pane top"
|
|
|
|
>
|
2019-08-14 09:48:44 +00:00
|
|
|
<ul class="vertical dropdown menu">
|
2020-02-16 11:50:38 +00:00
|
|
|
<li>
|
2020-03-09 17:57:10 +00:00
|
|
|
<router-link :to="`/app/accounts/${accountId}/profile/settings`">
|
2020-04-06 16:47:07 +00:00
|
|
|
{{ $t('SIDEBAR_ITEMS.PROFILE_SETTINGS') }}
|
2020-02-16 11:50:38 +00:00
|
|
|
</router-link>
|
|
|
|
</li>
|
|
|
|
<li>
|
|
|
|
<a href="#" @click.prevent="logout()">
|
2020-04-06 16:47:07 +00:00
|
|
|
{{ $t('SIDEBAR_ITEMS.LOGOUT') }}
|
2020-02-16 11:50:38 +00:00
|
|
|
</a>
|
|
|
|
</li>
|
2019-08-14 09:48:44 +00:00
|
|
|
</ul>
|
|
|
|
</div>
|
|
|
|
</transition>
|
|
|
|
<div class="current-user" @click.prevent="showOptions()">
|
2020-02-16 11:50:38 +00:00
|
|
|
<thumbnail :src="currentUser.avatar_url" :username="currentUser.name" />
|
2019-08-14 09:48:44 +00:00
|
|
|
<div class="current-user--data">
|
2019-08-25 14:29:28 +00:00
|
|
|
<h3 class="current-user--name">
|
|
|
|
{{ currentUser.name }}
|
|
|
|
</h3>
|
|
|
|
<h5 class="current-user--role">
|
|
|
|
{{ currentUser.role }}
|
|
|
|
</h5>
|
2019-08-14 09:48:44 +00:00
|
|
|
</div>
|
2019-12-28 16:26:42 +00:00
|
|
|
<span class="current-user--options icon ion-android-more-vertical">
|
|
|
|
</span>
|
2019-08-14 09:48:44 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</aside>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
import { mapGetters } from 'vuex';
|
|
|
|
import { mixin as clickaway } from 'vue-clickaway';
|
|
|
|
|
|
|
|
import adminMixin from '../../mixins/isAdmin';
|
|
|
|
import Auth from '../../api/auth';
|
|
|
|
import SidebarItem from './SidebarItem';
|
|
|
|
import WootStatusBar from '../widgets/StatusBar';
|
2019-08-25 14:29:28 +00:00
|
|
|
import { frontendURL } from '../../helper/URLHelper';
|
2019-11-05 04:45:09 +00:00
|
|
|
import Thumbnail from '../widgets/Thumbnail';
|
2019-12-28 16:26:42 +00:00
|
|
|
import sidemenuItems from '../../i18n/default-sidebar';
|
2019-08-25 14:29:28 +00:00
|
|
|
|
2019-08-14 09:48:44 +00:00
|
|
|
export default {
|
2019-12-28 16:26:42 +00:00
|
|
|
components: {
|
|
|
|
SidebarItem,
|
|
|
|
WootStatusBar,
|
|
|
|
Thumbnail,
|
|
|
|
},
|
2019-08-25 14:29:28 +00:00
|
|
|
mixins: [clickaway, adminMixin],
|
2019-08-14 09:48:44 +00:00
|
|
|
props: {
|
2019-08-25 14:29:28 +00:00
|
|
|
route: {
|
|
|
|
type: String,
|
2019-12-28 16:26:42 +00:00
|
|
|
default: '',
|
2019-08-25 14:29:28 +00:00
|
|
|
},
|
2019-08-14 09:48:44 +00:00
|
|
|
},
|
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
showOptionsMenu: false,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
computed: {
|
|
|
|
...mapGetters({
|
|
|
|
daysLeft: 'getTrialLeft',
|
|
|
|
subscriptionData: 'getSubscription',
|
2019-12-28 16:26:42 +00:00
|
|
|
inboxes: 'inboxes/getInboxes',
|
2020-02-16 11:50:38 +00:00
|
|
|
currentUser: 'getCurrentUser',
|
2019-08-14 09:48:44 +00:00
|
|
|
}),
|
2019-08-25 14:29:28 +00:00
|
|
|
accessibleMenuItems() {
|
2019-08-14 09:48:44 +00:00
|
|
|
// get all keys in menuGroup
|
2019-12-28 16:26:42 +00:00
|
|
|
const groupKey = Object.keys(sidemenuItems);
|
2019-08-25 14:29:28 +00:00
|
|
|
|
|
|
|
let menuItems = [];
|
2019-08-14 09:48:44 +00:00
|
|
|
// Iterate over menuGroup to find the correct group
|
|
|
|
for (let i = 0; i < groupKey.length; i += 1) {
|
2019-12-28 16:26:42 +00:00
|
|
|
const groupItem = sidemenuItems[groupKey[i]];
|
2019-08-14 09:48:44 +00:00
|
|
|
// Check if current route is included
|
2019-12-28 16:26:42 +00:00
|
|
|
const isRouteIncluded = groupItem.routes.includes(this.currentRoute);
|
2019-08-14 09:48:44 +00:00
|
|
|
if (isRouteIncluded) {
|
2019-08-25 14:29:28 +00:00
|
|
|
menuItems = Object.values(groupItem.menuItems);
|
2019-08-14 09:48:44 +00:00
|
|
|
}
|
|
|
|
}
|
2019-08-25 14:29:28 +00:00
|
|
|
|
2019-11-24 13:39:17 +00:00
|
|
|
if (!window.chatwootConfig.billingEnabled) {
|
|
|
|
menuItems = this.filterBillingRoutes(menuItems);
|
|
|
|
}
|
|
|
|
|
|
|
|
return this.filterMenuItemsByRole(menuItems);
|
2019-08-14 09:48:44 +00:00
|
|
|
},
|
2019-12-28 16:26:42 +00:00
|
|
|
currentRoute() {
|
|
|
|
return this.$store.state.route.name;
|
|
|
|
},
|
|
|
|
shouldShowInboxes() {
|
|
|
|
return sidemenuItems.common.routes.includes(this.currentRoute);
|
|
|
|
},
|
|
|
|
inboxSection() {
|
|
|
|
return {
|
|
|
|
icon: 'ion-folder',
|
2020-04-06 16:47:07 +00:00
|
|
|
label: 'INBOXES',
|
2019-12-28 16:26:42 +00:00
|
|
|
hasSubMenu: true,
|
|
|
|
newLink: true,
|
|
|
|
key: 'inbox',
|
|
|
|
cssClass: 'menu-title align-justify',
|
2020-03-09 17:57:10 +00:00
|
|
|
toState: frontendURL(`accounts/${this.accountId}/settings/inboxes`),
|
2019-12-28 16:26:42 +00:00
|
|
|
toStateName: 'settings_inbox_list',
|
|
|
|
children: this.inboxes.map(inbox => ({
|
|
|
|
id: inbox.id,
|
|
|
|
label: inbox.name,
|
2020-03-09 17:57:10 +00:00
|
|
|
toState: frontendURL(`accounts/${this.accountId}/inbox/${inbox.id}`),
|
2020-02-19 05:00:34 +00:00
|
|
|
type: inbox.channel_type,
|
2019-12-28 16:26:42 +00:00
|
|
|
})),
|
|
|
|
};
|
|
|
|
},
|
2019-11-24 13:39:17 +00:00
|
|
|
dashboardPath() {
|
2020-03-09 17:57:10 +00:00
|
|
|
return frontendURL(`accounts/${this.accountId}/dashboard`);
|
2019-08-14 09:48:44 +00:00
|
|
|
},
|
|
|
|
shouldShowStatusBox() {
|
2019-08-25 14:29:28 +00:00
|
|
|
return (
|
2019-11-24 13:39:17 +00:00
|
|
|
window.chatwootConfig.billingEnabled &&
|
|
|
|
(this.subscriptionData.state === 'trial' ||
|
|
|
|
this.subscriptionData.state === 'cancelled')
|
2019-08-25 14:29:28 +00:00
|
|
|
);
|
2019-08-14 09:48:44 +00:00
|
|
|
},
|
|
|
|
statusBarClass() {
|
|
|
|
if (this.subscriptionData.state === 'trial') {
|
|
|
|
return 'warning';
|
2019-08-25 14:29:28 +00:00
|
|
|
}
|
|
|
|
if (this.subscriptionData.state === 'cancelled') {
|
2019-08-14 09:48:44 +00:00
|
|
|
return 'danger';
|
|
|
|
}
|
|
|
|
return '';
|
|
|
|
},
|
2019-11-24 13:39:17 +00:00
|
|
|
trialMessage() {
|
|
|
|
return `${this.daysLeft} ${this.$t('APP_GLOBAL.TRIAL_MESSAGE')}`;
|
|
|
|
},
|
2020-03-09 17:57:10 +00:00
|
|
|
accountId() {
|
|
|
|
return this.currentUser.account_id;
|
|
|
|
},
|
2019-08-14 09:48:44 +00:00
|
|
|
},
|
2019-12-28 16:26:42 +00:00
|
|
|
mounted() {
|
|
|
|
this.$store.dispatch('inboxes/get');
|
|
|
|
},
|
2019-08-14 09:48:44 +00:00
|
|
|
methods: {
|
2019-11-24 13:39:17 +00:00
|
|
|
filterBillingRoutes(menuItems) {
|
|
|
|
return menuItems.filter(
|
|
|
|
menuItem => !menuItem.toState.includes('billing')
|
|
|
|
);
|
|
|
|
},
|
|
|
|
filterMenuItemsByRole(menuItems) {
|
|
|
|
const { role } = this.currentUser;
|
2020-02-16 11:50:38 +00:00
|
|
|
if (!role) {
|
|
|
|
return [];
|
|
|
|
}
|
2019-11-24 13:39:17 +00:00
|
|
|
return menuItems.filter(
|
|
|
|
menuItem =>
|
|
|
|
window.roleWiseRoutes[role].indexOf(menuItem.toStateName) > -1
|
|
|
|
);
|
|
|
|
},
|
|
|
|
logout() {
|
|
|
|
Auth.logout();
|
|
|
|
},
|
2019-08-14 09:48:44 +00:00
|
|
|
showOptions() {
|
|
|
|
this.showOptionsMenu = !this.showOptionsMenu;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
</script>
|