b01d032d0d
* Enhancement: Updates sidebar to a new design (#2733) * feat: Changes primary navbar to new design (#2598) * feat: updates design for secondary navbar (#2612) * Changes primary nvbar to new design * Updates design for contexual sidebar * Fixes issues with JSON * Remove duplication of notificatons in Navigation * Fixes broken tests * Fixes broken tests * Update app/javascript/dashboard/components/layout/AvailabilityStatus.vue * Update app/javascript/dashboard/components/layout/AvailabilityStatus.vue * Update app/javascript/dashboard/components/layout/SidebarItem.vue Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> * Update app/javascript/dashboard/components/layout/SidebarItem.vue Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> * Update app/javascript/dashboard/modules/sidebar/components/Secondary.vue Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> * Chore: Update design changes to features * Fixes menu transitions and refactors code * Refactors sidebar routeing logic * lint error fixes * Fixes dropdown menu styles * Fixes secondary new item links * Fixes lint scss issues * fixes linter issues * Fixes broken test cases * Update AvailabilityStatus.spec.js * Review feedbacks * Fixes add modal for label * Add tooltip for primary menu item * Tooltip for notifications * Adds tooltip for primary menu items * Review fixes * Review fixes * Fix merge issues * fixes logo size for login pages * fixes Merge breaks with styles Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Co-authored-by: Pranav Raj S <pranav@chatwoot.com>
215 lines
5.8 KiB
Vue
215 lines
5.8 KiB
Vue
<template>
|
|
<div class="main-nav secondary-menu">
|
|
<transition-group name="menu-list" tag="ul" class="menu vertical">
|
|
<sidebar-item
|
|
v-if="shouldShowConversationsSideMenu"
|
|
:key="inboxSection.toState"
|
|
:menu-item="inboxSection"
|
|
/>
|
|
<sidebar-item
|
|
v-if="shouldShowTeamsSideMenu"
|
|
:key="teamSection.toState"
|
|
:menu-item="teamSection"
|
|
/>
|
|
<sidebar-item
|
|
v-if="shouldShowConversationsSideMenu"
|
|
:key="labelSection.toState"
|
|
:menu-item="labelSection"
|
|
@add-label="showAddLabelPopup"
|
|
/>
|
|
<sidebar-item
|
|
v-if="shouldShowContactSideMenu"
|
|
:key="contactLabelSection.key"
|
|
:menu-item="contactLabelSection"
|
|
@add-label="showAddLabelPopup"
|
|
/>
|
|
<sidebar-item
|
|
v-if="shouldShowCampaignSideMenu"
|
|
:key="campaignSubSection.key"
|
|
:menu-item="campaignSubSection"
|
|
/>
|
|
<sidebar-item
|
|
v-if="shouldShowReportsSideMenu"
|
|
:key="reportsSubSection.key"
|
|
:menu-item="reportsSubSection"
|
|
/>
|
|
<sidebar-item
|
|
v-if="shouldShowSettingsSideMenu"
|
|
:key="settingsSubMenu.key"
|
|
:menu-item="settingsSubMenu"
|
|
/>
|
|
<sidebar-item
|
|
v-if="shouldShowNotificationsSideMenu"
|
|
:key="notificationsSubMenu.key"
|
|
:menu-item="notificationsSubMenu"
|
|
/>
|
|
</transition-group>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import { frontendURL } from '../../../helper/URLHelper';
|
|
import SidebarItem from 'dashboard/components/layout/SidebarItem';
|
|
import routesMixin from 'dashboard/modules/sidebar/mixins/routes.mixin';
|
|
|
|
export default {
|
|
components: {
|
|
SidebarItem,
|
|
},
|
|
mixins: [routesMixin],
|
|
props: {
|
|
accountId: {
|
|
type: Number,
|
|
default: 0,
|
|
},
|
|
accountLabels: {
|
|
type: Array,
|
|
default: () => [],
|
|
},
|
|
inboxes: {
|
|
type: Array,
|
|
default: () => [],
|
|
},
|
|
teams: {
|
|
type: Array,
|
|
default: () => [],
|
|
},
|
|
menuItems: {
|
|
type: Array,
|
|
default: () => [],
|
|
},
|
|
},
|
|
computed: {
|
|
inboxSection() {
|
|
return {
|
|
icon: 'folder',
|
|
label: 'INBOXES',
|
|
hasSubMenu: true,
|
|
newLink: true,
|
|
newLinkTag: 'NEW_INBOX',
|
|
key: 'inbox',
|
|
cssClass: 'menu-title align-justify',
|
|
toState: frontendURL(`accounts/${this.accountId}/settings/inboxes/new`),
|
|
toStateName: 'settings_inbox_new',
|
|
newLinkRouteName: 'settings_inbox_new',
|
|
children: this.inboxes.map(inbox => ({
|
|
id: inbox.id,
|
|
label: inbox.name,
|
|
truncateLabel: true,
|
|
toState: frontendURL(`accounts/${this.accountId}/inbox/${inbox.id}`),
|
|
type: inbox.channel_type,
|
|
phoneNumber: inbox.phone_number,
|
|
})),
|
|
};
|
|
},
|
|
labelSection() {
|
|
return {
|
|
icon: 'number-symbol',
|
|
label: 'LABELS',
|
|
hasSubMenu: true,
|
|
newLink: true,
|
|
newLinkTag: 'NEW_LABEL',
|
|
key: 'label',
|
|
cssClass: 'menu-title align-justify',
|
|
toState: frontendURL(`accounts/${this.accountId}/settings/labels`),
|
|
toStateName: 'labels_list',
|
|
showModalForNewItem: true,
|
|
modalName: 'AddLabel',
|
|
children: this.accountLabels.map(label => ({
|
|
id: label.id,
|
|
label: label.title,
|
|
color: label.color,
|
|
truncateLabel: true,
|
|
toState: frontendURL(
|
|
`accounts/${this.accountId}/label/${label.title}`
|
|
),
|
|
})),
|
|
};
|
|
},
|
|
contactLabelSection() {
|
|
return {
|
|
icon: 'number-symbol',
|
|
label: 'TAGGED_WITH',
|
|
hasSubMenu: true,
|
|
key: 'label',
|
|
newLink: true,
|
|
newLinkTag: 'NEW_LABEL',
|
|
cssClass: 'menu-title align-justify',
|
|
toState: frontendURL(`accounts/${this.accountId}/settings/labels`),
|
|
toStateName: 'labels_list',
|
|
showModalForNewItem: true,
|
|
modalName: 'AddLabel',
|
|
children: this.accountLabels.map(label => ({
|
|
id: label.id,
|
|
label: label.title,
|
|
color: label.color,
|
|
truncateLabel: true,
|
|
toState: frontendURL(
|
|
`accounts/${this.accountId}/labels/${label.title}/contacts`
|
|
),
|
|
})),
|
|
};
|
|
},
|
|
campaignSubSection() {
|
|
return this.getSubSectionByKey('campaigns');
|
|
},
|
|
teamSection() {
|
|
return {
|
|
icon: 'people-team',
|
|
label: 'TEAMS',
|
|
hasSubMenu: true,
|
|
newLink: true,
|
|
newLinkTag: 'NEW_TEAM',
|
|
key: 'team',
|
|
cssClass: 'menu-title align-justify teams-sidebar-menu',
|
|
toState: frontendURL(`accounts/${this.accountId}/settings/teams/new`),
|
|
toStateName: 'settings_teams_new',
|
|
newLinkRouteName: 'settings_teams_new',
|
|
children: this.teams.map(team => ({
|
|
id: team.id,
|
|
label: team.name,
|
|
truncateLabel: true,
|
|
toState: frontendURL(`accounts/${this.accountId}/team/${team.id}`),
|
|
})),
|
|
};
|
|
},
|
|
|
|
notificationsSubMenu() {
|
|
return {
|
|
icon: 'alert',
|
|
label: 'NOTIFICATIONS',
|
|
hasSubMenu: false,
|
|
cssClass: 'menu-title align-justify',
|
|
key: 'notifications',
|
|
children: [],
|
|
};
|
|
},
|
|
settingsSubMenu() {
|
|
return this.getSubSectionByKey('settings');
|
|
},
|
|
reportsSubSection() {
|
|
return this.getSubSectionByKey('reports');
|
|
},
|
|
},
|
|
methods: {
|
|
getSubSectionByKey(subSectionKey) {
|
|
const menuItems = Object.values(
|
|
this.sideMenuItems[subSectionKey].menuItems
|
|
);
|
|
const campaignItem = this.menuItems.find(
|
|
({ key }) => key === subSectionKey
|
|
);
|
|
|
|
return {
|
|
...campaignItem,
|
|
children: menuItems.map(item => ({
|
|
...item,
|
|
label: this.$t(`SIDEBAR.${item.label}`),
|
|
})),
|
|
};
|
|
},
|
|
showAddLabelPopup() {
|
|
this.$emit('add-label');
|
|
},
|
|
},
|
|
};
|
|
</script>
|