diff --git a/app/javascript/dashboard/components/layout/Sidebar.vue b/app/javascript/dashboard/components/layout/Sidebar.vue index ff87835b4..6853ef00f 100644 --- a/app/javascript/dashboard/components/layout/Sidebar.vue +++ b/app/javascript/dashboard/components/layout/Sidebar.vue @@ -98,9 +98,12 @@ export default { return getSidebarItems(this.accountId); }, primaryMenuItems() { + const permissions = this.currentUser.permissions; const menuItems = this.sideMenuConfig.primaryMenu; return menuItems.filter(menuItem => { - const isAvailableForTheUser = menuItem.roles.includes(this.currentRole); + const isAvailableForTheUser = permissions.some(permission => + menuItem.meta.permissions.includes(permission) + ); if (!isAvailableForTheUser) { return false; diff --git a/app/javascript/dashboard/components/layout/config/sidebarItems/campaigns.js b/app/javascript/dashboard/components/layout/config/sidebarItems/campaigns.js index 62bdbd635..ea33f105f 100644 --- a/app/javascript/dashboard/components/layout/config/sidebarItems/campaigns.js +++ b/app/javascript/dashboard/components/layout/config/sidebarItems/campaigns.js @@ -11,6 +11,9 @@ const campaigns = accountId => ({ hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/campaigns/ongoing`), toStateName: 'ongoing_campaigns', + meta: { + permissions: ['account_manage'], + }, }, { key: 'oneOffCampaigns', @@ -19,6 +22,9 @@ const campaigns = accountId => ({ hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/campaigns/one_off`), toStateName: 'one_off', + meta: { + permissions: ['account_manage'], + }, }, ], }); diff --git a/app/javascript/dashboard/components/layout/config/sidebarItems/contacts.js b/app/javascript/dashboard/components/layout/config/sidebarItems/contacts.js index d615bd15c..9efc53708 100644 --- a/app/javascript/dashboard/components/layout/config/sidebarItems/contacts.js +++ b/app/javascript/dashboard/components/layout/config/sidebarItems/contacts.js @@ -14,6 +14,9 @@ const contacts = accountId => ({ label: 'ALL_CONTACTS', hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/contacts`), + meta: { + permissions: ['account_manage'], + }, toStateName: 'contacts_dashboard', }, ], diff --git a/app/javascript/dashboard/components/layout/config/sidebarItems/conversations.js b/app/javascript/dashboard/components/layout/config/sidebarItems/conversations.js index a8302bd58..74e26b786 100644 --- a/app/javascript/dashboard/components/layout/config/sidebarItems/conversations.js +++ b/app/javascript/dashboard/components/layout/config/sidebarItems/conversations.js @@ -28,6 +28,9 @@ const conversations = accountId => ({ key: 'conversations', toState: frontendURL(`accounts/${accountId}/dashboard`), toolTip: 'Conversation from all subscribed inboxes', + meta: { + permissions: ['account_manage'], + }, toStateName: 'home', }, { @@ -35,6 +38,9 @@ const conversations = accountId => ({ label: 'MENTIONED_CONVERSATIONS', key: 'conversation_mentions', toState: frontendURL(`accounts/${accountId}/mentions/conversations`), + meta: { + permissions: ['account_manage'], + }, toStateName: 'conversation_mentions', }, { @@ -42,6 +48,9 @@ const conversations = accountId => ({ label: 'UNATTENDED_CONVERSATIONS', key: 'conversation_unattended', toState: frontendURL(`accounts/${accountId}/unattended/conversations`), + meta: { + permissions: ['account_manage'], + }, toStateName: 'conversation_unattended', }, ], diff --git a/app/javascript/dashboard/components/layout/config/sidebarItems/primaryMenu.js b/app/javascript/dashboard/components/layout/config/sidebarItems/primaryMenu.js index 7513e3d1c..925f9040f 100644 --- a/app/javascript/dashboard/components/layout/config/sidebarItems/primaryMenu.js +++ b/app/javascript/dashboard/components/layout/config/sidebarItems/primaryMenu.js @@ -9,7 +9,14 @@ const primaryMenuItems = accountId => [ featureFlag: FEATURE_FLAGS.INBOX_VIEW, toState: frontendURL(`accounts/${accountId}/inbox-view`), toStateName: 'inbox_view', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, }, { icon: 'chat', @@ -17,7 +24,14 @@ const primaryMenuItems = accountId => [ label: 'CONVERSATIONS', toState: frontendURL(`accounts/${accountId}/dashboard`), toStateName: 'home', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, }, { icon: 'book-contacts', @@ -26,7 +40,14 @@ const primaryMenuItems = accountId => [ featureFlag: FEATURE_FLAGS.CRM, toState: frontendURL(`accounts/${accountId}/contacts`), toStateName: 'contacts_dashboard', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, }, { icon: 'arrow-trending-lines', @@ -35,7 +56,9 @@ const primaryMenuItems = accountId => [ featureFlag: FEATURE_FLAGS.REPORTS, toState: frontendURL(`accounts/${accountId}/reports`), toStateName: 'settings_account_reports', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { icon: 'megaphone', @@ -44,7 +67,9 @@ const primaryMenuItems = accountId => [ featureFlag: FEATURE_FLAGS.CAMPAIGNS, toState: frontendURL(`accounts/${accountId}/campaigns`), toStateName: 'ongoing_campaigns', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { icon: 'library', @@ -54,7 +79,9 @@ const primaryMenuItems = accountId => [ alwaysVisibleOnChatwootInstances: true, toState: frontendURL(`accounts/${accountId}/portals`), toStateName: 'default_portal_articles', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { icon: 'settings', @@ -62,7 +89,14 @@ const primaryMenuItems = accountId => [ label: 'SETTINGS', toState: frontendURL(`accounts/${accountId}/settings`), toStateName: 'settings_home', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, }, ]; diff --git a/app/javascript/dashboard/components/layout/config/sidebarItems/reports.js b/app/javascript/dashboard/components/layout/config/sidebarItems/reports.js index e7e4997fd..d6e42214c 100644 --- a/app/javascript/dashboard/components/layout/config/sidebarItems/reports.js +++ b/app/javascript/dashboard/components/layout/config/sidebarItems/reports.js @@ -20,6 +20,9 @@ const reports = accountId => ({ label: 'REPORTS_OVERVIEW', hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/reports/overview`), + meta: { + permissions: ['account_manage'], + }, toStateName: 'account_overview_reports', }, { @@ -27,6 +30,9 @@ const reports = accountId => ({ label: 'REPORTS_CONVERSATION', hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/reports/conversation`), + meta: { + permissions: ['account_manage'], + }, toStateName: 'conversation_reports', }, { @@ -34,6 +40,9 @@ const reports = accountId => ({ label: 'CSAT', hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/reports/csat`), + meta: { + permissions: ['account_manage'], + }, toStateName: 'csat_reports', }, { @@ -42,6 +51,9 @@ const reports = accountId => ({ hasSubMenu: false, featureFlag: FEATURE_FLAGS.RESPONSE_BOT, toState: frontendURL(`accounts/${accountId}/reports/bot`), + meta: { + permissions: ['account_manage'], + }, toStateName: 'bot_reports', }, { @@ -49,6 +61,9 @@ const reports = accountId => ({ label: 'REPORTS_AGENT', hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/reports/agent`), + meta: { + permissions: ['account_manage'], + }, toStateName: 'agent_reports', }, { @@ -56,6 +71,9 @@ const reports = accountId => ({ label: 'REPORTS_LABEL', hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/reports/label`), + meta: { + permissions: ['account_manage'], + }, toStateName: 'label_reports', }, { @@ -63,6 +81,9 @@ const reports = accountId => ({ label: 'REPORTS_INBOX', hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/reports/inboxes`), + meta: { + permissions: ['account_manage'], + }, toStateName: 'inbox_reports', }, { @@ -70,6 +91,9 @@ const reports = accountId => ({ label: 'REPORTS_TEAM', hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/reports/teams`), + meta: { + permissions: ['account_manage'], + }, toStateName: 'team_reports', }, { @@ -78,6 +102,9 @@ const reports = accountId => ({ hasSubMenu: false, featureFlag: FEATURE_FLAGS.SLA, toState: frontendURL(`accounts/${accountId}/reports/sla`), + meta: { + permissions: ['account_manage'], + }, toStateName: 'sla_reports', }, ], diff --git a/app/javascript/dashboard/components/layout/config/sidebarItems/settings.js b/app/javascript/dashboard/components/layout/config/sidebarItems/settings.js index f450bd7a7..1cddac792 100644 --- a/app/javascript/dashboard/components/layout/config/sidebarItems/settings.js +++ b/app/javascript/dashboard/components/layout/config/sidebarItems/settings.js @@ -47,6 +47,9 @@ const settings = accountId => ({ label: 'ACCOUNT_SETTINGS', hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/settings/general`), + meta: { + permissions: ['account_manage'], + }, toStateName: 'general_settings_index', }, { @@ -55,6 +58,9 @@ const settings = accountId => ({ hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/settings/agents/list`), toStateName: 'agent_list', + meta: { + permissions: ['account_manage'], + }, featureFlag: FEATURE_FLAGS.AGENT_MANAGEMENT, }, { @@ -63,6 +69,9 @@ const settings = accountId => ({ hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/settings/teams/list`), toStateName: 'settings_teams_list', + meta: { + permissions: ['account_manage'], + }, featureFlag: FEATURE_FLAGS.TEAM_MANAGEMENT, }, { @@ -71,6 +80,9 @@ const settings = accountId => ({ hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/settings/inboxes/list`), toStateName: 'settings_inbox_list', + meta: { + permissions: ['account_manage'], + }, featureFlag: FEATURE_FLAGS.INBOX_MANAGEMENT, }, { @@ -79,6 +91,9 @@ const settings = accountId => ({ hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/settings/labels/list`), toStateName: 'labels_list', + meta: { + permissions: ['account_manage'], + }, featureFlag: FEATURE_FLAGS.LABELS, }, { @@ -89,6 +104,9 @@ const settings = accountId => ({ `accounts/${accountId}/settings/custom-attributes/list` ), toStateName: 'attributes_list', + meta: { + permissions: ['account_manage'], + }, featureFlag: FEATURE_FLAGS.CUSTOM_ATTRIBUTES, }, { @@ -97,6 +115,9 @@ const settings = accountId => ({ hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/settings/automation/list`), toStateName: 'automation_list', + meta: { + permissions: ['account_manage'], + }, featureFlag: FEATURE_FLAGS.AUTOMATIONS, }, { @@ -106,6 +127,9 @@ const settings = accountId => ({ globalConfigFlag: 'csmlEditorHost', toState: frontendURL(`accounts/${accountId}/settings/agent-bots`), toStateName: 'agent_bots', + meta: { + permissions: ['account_manage'], + }, featureFlag: FEATURE_FLAGS.AGENT_BOTS, }, { @@ -114,6 +138,9 @@ const settings = accountId => ({ hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/settings/macros`), toStateName: 'macros_wrapper', + meta: { + permissions: ['account_manage'], + }, featureFlag: FEATURE_FLAGS.MACROS, }, { @@ -124,6 +151,9 @@ const settings = accountId => ({ `accounts/${accountId}/settings/canned-response/list` ), toStateName: 'canned_list', + meta: { + permissions: ['account_manage'], + }, featureFlag: FEATURE_FLAGS.CANNED_RESPONSES, }, { @@ -132,6 +162,9 @@ const settings = accountId => ({ hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/settings/integrations`), toStateName: 'settings_integrations', + meta: { + permissions: ['account_manage'], + }, featureFlag: FEATURE_FLAGS.INTEGRATIONS, }, { @@ -140,6 +173,9 @@ const settings = accountId => ({ hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/settings/applications`), toStateName: 'settings_applications', + meta: { + permissions: ['account_manage'], + }, featureFlag: FEATURE_FLAGS.INTEGRATIONS, }, { @@ -150,6 +186,9 @@ const settings = accountId => ({ toStateName: 'auditlogs_list', isEnterpriseOnly: true, featureFlag: FEATURE_FLAGS.AUDIT_LOGS, + meta: { + permissions: ['account_manage'], + }, beta: true, }, { @@ -160,6 +199,9 @@ const settings = accountId => ({ toStateName: 'sla_list', isEnterpriseOnly: true, featureFlag: FEATURE_FLAGS.SLA, + meta: { + permissions: ['account_manage'], + }, beta: true, }, { @@ -168,6 +210,9 @@ const settings = accountId => ({ hasSubMenu: false, toState: frontendURL(`accounts/${accountId}/settings/billing`), toStateName: 'billing_settings_index', + meta: { + permissions: ['account_manage'], + }, showOnlyOnCloud: true, }, ], diff --git a/app/javascript/dashboard/components/layout/sidebarComponents/Secondary.vue b/app/javascript/dashboard/components/layout/sidebarComponents/Secondary.vue index 6d00bd4c2..430dd8e8a 100644 --- a/app/javascript/dashboard/components/layout/sidebarComponents/Secondary.vue +++ b/app/javascript/dashboard/components/layout/sidebarComponents/Secondary.vue @@ -80,12 +80,9 @@ export default { return this.customViews.filter(view => view.filter_type === 'contact'); }, accessibleMenuItems() { - if (!this.currentRole) { - return []; - } const menuItemsFilteredByPermissions = this.menuConfig.menuItems.filter( menuItem => { - const { meta: { menuPermissions = [] } = {} } = menuItem; + const { meta: { permissions: menuPermissions = [] } = {} } = menuItem; const { permissions: userPermissions = [] } = this.currentUser; return menuPermissions.some(permission => userPermissions.includes(permission) diff --git a/app/javascript/dashboard/components/policy.vue b/app/javascript/dashboard/components/policy.vue index 5520fdcc6..bb77a9052 100644 --- a/app/javascript/dashboard/components/policy.vue +++ b/app/javascript/dashboard/components/policy.vue @@ -10,7 +10,7 @@ const props = defineProps({ }); const getters = useStoreGetters(); -const user = getters.getCurrentUser(); +const user = getters.getCurrentUser.value; const hasPermission = computed(() => props.permissions.some(permission => user.permissions.includes(permission)) diff --git a/app/javascript/dashboard/modules/search/search.routes.js b/app/javascript/dashboard/modules/search/search.routes.js index 320f64a44..33de47d83 100644 --- a/app/javascript/dashboard/modules/search/search.routes.js +++ b/app/javascript/dashboard/modules/search/search.routes.js @@ -7,7 +7,14 @@ export const routes = [ { path: frontendURL('accounts/:accountId/search'), name: 'search', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: SearchView, }, ]; diff --git a/app/javascript/dashboard/routes/dashboard/contacts/routes.js b/app/javascript/dashboard/routes/dashboard/contacts/routes.js index 10a560740..d14d3c1e3 100644 --- a/app/javascript/dashboard/routes/dashboard/contacts/routes.js +++ b/app/javascript/dashboard/routes/dashboard/contacts/routes.js @@ -7,13 +7,27 @@ export const routes = [ { path: frontendURL('accounts/:accountId/contacts'), name: 'contacts_dashboard', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: ContactsView, }, { path: frontendURL('accounts/:accountId/contacts/custom_view/:id'), name: 'contacts_segments_dashboard', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: ContactsView, props: route => { return { segmentsId: route.params.id }; @@ -22,7 +36,14 @@ export const routes = [ { path: frontendURL('accounts/:accountId/labels/:label/contacts'), name: 'contacts_labels_dashboard', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: ContactsView, props: route => { return { label: route.params.label }; @@ -31,7 +52,14 @@ export const routes = [ { path: frontendURL('accounts/:accountId/contacts/:contactId'), name: 'contact_profile_dashboard', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: ContactManageView, props: route => { return { contactId: route.params.contactId }; diff --git a/app/javascript/dashboard/routes/dashboard/dashboard.routes.js b/app/javascript/dashboard/routes/dashboard/dashboard.routes.js index 9e18ca42c..d23a2e34d 100644 --- a/app/javascript/dashboard/routes/dashboard/dashboard.routes.js +++ b/app/javascript/dashboard/routes/dashboard/dashboard.routes.js @@ -28,7 +28,9 @@ export default { { path: frontendURL('accounts/:accountId/suspended'), name: 'account_suspended', - roles: ['administrator', 'agent'], + meta: { + permissions: ['profile_manage'], + }, component: Suspended, }, ], diff --git a/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.js b/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.js index a165b0277..0f287d3df 100644 --- a/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.js +++ b/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.js @@ -30,13 +30,27 @@ const portalRoutes = [ { path: getPortalRoute(''), name: 'default_portal_articles', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: DefaultPortalArticles, }, { path: getPortalRoute('all'), name: 'list_all_portals', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: ListAllPortals, }, { @@ -47,55 +61,88 @@ const portalRoutes = [ path: '', name: 'new_portal_information', component: PortalDetails, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: ':portalSlug/customization', name: 'portal_customization', component: PortalCustomization, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: ':portalSlug/finish', name: 'portal_finish', component: PortalSettingsFinish, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, ], }, { path: getPortalRoute(':portalSlug'), name: 'portalSlug', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: ShowPortal, }, { path: getPortalRoute(':portalSlug/edit'), - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: EditPortal, children: [ { path: '', name: 'edit_portal_information', component: EditPortalBasic, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: 'customizations', name: 'edit_portal_customization', component: EditPortalCustomization, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: 'locales', name: 'edit_portal_locales', component: EditPortalLocales, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: 'categories', name: 'list_all_locale_categories', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: ListAllCategories, }, ], @@ -106,39 +153,81 @@ const articleRoutes = [ { path: getPortalRoute(':portalSlug/:locale/articles'), name: 'list_all_locale_articles', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: ListAllArticles, }, { path: getPortalRoute(':portalSlug/:locale/articles/new'), name: 'new_article', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: NewArticle, }, { path: getPortalRoute(':portalSlug/:locale/articles/mine'), name: 'list_mine_articles', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: ListAllArticles, }, { path: getPortalRoute(':portalSlug/:locale/articles/archived'), name: 'list_archived_articles', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: ListAllArticles, }, { path: getPortalRoute(':portalSlug/:locale/articles/draft'), name: 'list_draft_articles', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: ListAllArticles, }, { path: getPortalRoute(':portalSlug/:locale/articles/:articleSlug'), name: 'edit_article', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: EditArticle, }, ]; @@ -147,19 +236,40 @@ const categoryRoutes = [ { path: getPortalRoute(':portalSlug/:locale/categories'), name: 'all_locale_categories', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: ListAllCategories, }, { path: getPortalRoute(':portalSlug/:locale/categories/new'), name: 'new_category_in_locale', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: NewCategory, }, { path: getPortalRoute(':portalSlug/:locale/categories/:categorySlug'), name: 'show_category', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: ListAllArticles, }, { @@ -167,13 +277,27 @@ const categoryRoutes = [ ':portalSlug/:locale/categories/:categorySlug/articles' ), name: 'show_category_articles', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: ListCategoryArticles, }, { path: getPortalRoute(':portalSlug/:locale/categories/:categorySlug'), name: 'edit_category', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: EditCategory, }, ]; diff --git a/app/javascript/dashboard/routes/dashboard/inbox/routes.js b/app/javascript/dashboard/routes/dashboard/inbox/routes.js index 9c26fa64e..3b986520b 100644 --- a/app/javascript/dashboard/routes/dashboard/inbox/routes.js +++ b/app/javascript/dashboard/routes/dashboard/inbox/routes.js @@ -12,13 +12,27 @@ export const routes = [ path: '', name: 'inbox_view', component: InboxEmptyStateView, - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, }, { path: ':notification_id', name: 'inbox_view_conversation', component: InboxDetailView, - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, }, ], }, diff --git a/app/javascript/dashboard/routes/dashboard/notifications/routes.js b/app/javascript/dashboard/routes/dashboard/notifications/routes.js index 38812fc92..a47b458fe 100644 --- a/app/javascript/dashboard/routes/dashboard/notifications/routes.js +++ b/app/javascript/dashboard/routes/dashboard/notifications/routes.js @@ -18,7 +18,14 @@ export const routes = [ path: '', name: 'notifications_index', component: NotificationsView, - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, }, ], }, diff --git a/app/javascript/dashboard/routes/dashboard/settings/account/account.routes.js b/app/javascript/dashboard/routes/dashboard/settings/account/account.routes.js index 0acfd5bd5..1fb1346b0 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/account/account.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/account/account.routes.js @@ -6,7 +6,9 @@ export default { routes: [ { path: frontendURL('accounts/:accountId/settings/general'), - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: SettingsContent, props: { headerTitle: 'GENERAL_SETTINGS.TITLE', @@ -18,7 +20,9 @@ export default { path: '', name: 'general_settings_index', component: Index, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, ], }, diff --git a/app/javascript/dashboard/routes/dashboard/settings/agentBots/agentBot.routes.js b/app/javascript/dashboard/routes/dashboard/settings/agentBots/agentBot.routes.js index 382594c73..33effbf0d 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/agentBots/agentBot.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/agentBots/agentBot.routes.js @@ -8,7 +8,9 @@ export default { routes: [ { path: frontendURL('accounts/:accountId/settings/agent-bots'), - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: SettingsContent, props: { headerTitle: 'AGENT_BOTS.HEADER', @@ -20,19 +22,25 @@ export default { path: '', name: 'agent_bots', component: Bot, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: 'csml/new', name: 'agent_bots_csml_new', component: CsmlNewBot, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: 'csml/:botId', name: 'agent_bots_csml_edit', component: CsmlEditBot, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, ], }, diff --git a/app/javascript/dashboard/routes/dashboard/settings/agents/agent.routes.js b/app/javascript/dashboard/routes/dashboard/settings/agents/agent.routes.js index cd23432ff..7d9f52cc9 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/agents/agent.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/agents/agent.routes.js @@ -22,7 +22,9 @@ export default { path: 'list', name: 'agent_list', component: AgentHome, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, ], }, diff --git a/app/javascript/dashboard/routes/dashboard/settings/attributes/attributes.routes.js b/app/javascript/dashboard/routes/dashboard/settings/attributes/attributes.routes.js index 72d79a9de..c23d5cde6 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/attributes/attributes.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/attributes/attributes.routes.js @@ -22,7 +22,9 @@ export default { path: 'list', name: 'attributes_list', component: AttributesHome, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, ], }, diff --git a/app/javascript/dashboard/routes/dashboard/settings/auditlogs/audit.routes.js b/app/javascript/dashboard/routes/dashboard/settings/auditlogs/audit.routes.js index 00c1fda74..b2abae5aa 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/auditlogs/audit.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/auditlogs/audit.routes.js @@ -22,7 +22,9 @@ export default { { path: 'list', name: 'auditlogs_list', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: AuditLogsHome, }, ], diff --git a/app/javascript/dashboard/routes/dashboard/settings/automation/automation.routes.js b/app/javascript/dashboard/routes/dashboard/settings/automation/automation.routes.js index 3a5d6c887..669f50195 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/automation/automation.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/automation/automation.routes.js @@ -22,7 +22,9 @@ export default { path: 'list', name: 'automation_list', component: Automation, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, ], }, diff --git a/app/javascript/dashboard/routes/dashboard/settings/billing/billing.routes.js b/app/javascript/dashboard/routes/dashboard/settings/billing/billing.routes.js index 7a37f320a..84461bb78 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/billing/billing.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/billing/billing.routes.js @@ -6,7 +6,9 @@ export default { routes: [ { path: frontendURL('accounts/:accountId/settings/billing'), - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: SettingsContent, props: { headerTitle: 'BILLING_SETTINGS.TITLE', @@ -18,7 +20,9 @@ export default { path: '', name: 'billing_settings_index', component: Index, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, ], }, diff --git a/app/javascript/dashboard/routes/dashboard/settings/campaigns/campaigns.routes.js b/app/javascript/dashboard/routes/dashboard/settings/campaigns/campaigns.routes.js index 1ac007ed6..efdd222bb 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/campaigns/campaigns.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/campaigns/campaigns.routes.js @@ -19,7 +19,9 @@ export default { { path: 'ongoing', name: 'ongoing_campaigns', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: Index, }, ], @@ -35,7 +37,9 @@ export default { { path: 'one_off', name: 'one_off', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: Index, }, ], diff --git a/app/javascript/dashboard/routes/dashboard/settings/canned/canned.routes.js b/app/javascript/dashboard/routes/dashboard/settings/canned/canned.routes.js index 73b370e2a..80fcc4b47 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/canned/canned.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/canned/canned.routes.js @@ -22,7 +22,14 @@ export default { { path: 'list', name: 'canned_list', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: CannedHome, }, ], diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/inbox.routes.js b/app/javascript/dashboard/routes/dashboard/settings/inbox/inbox.routes.js index 4e4c14c00..63f4f11b7 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/inbox.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/inbox.routes.js @@ -35,7 +35,9 @@ export default { path: 'list', name: 'settings_inbox_list', component: InboxHome, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: 'new', @@ -45,19 +47,25 @@ export default { path: '', name: 'settings_inbox_new', component: ChannelList, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: ':inbox_id/finish', name: 'settings_inbox_finish', component: FinishSetup, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: ':sub_page', name: 'settings_inboxes_page_channel', component: channelFactory.create(), - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, props: route => { return { channel_name: route.params.sub_page }; }, @@ -65,7 +73,9 @@ export default { { path: ':inbox_id/agents', name: 'settings_inboxes_add_agents', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: AddAgents, }, ], @@ -74,7 +84,9 @@ export default { path: ':inboxId', name: 'settings_inbox_show', component: Settings, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, ], }, diff --git a/app/javascript/dashboard/routes/dashboard/settings/integrationapps/integrations.routes.js b/app/javascript/dashboard/routes/dashboard/settings/integrationapps/integrations.routes.js index a0f8477b2..5559c8e1b 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/integrationapps/integrations.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/integrationapps/integrations.routes.js @@ -26,13 +26,17 @@ export default { path: '', name: 'settings_applications', component: Index, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: ':integration_id', name: 'settings_applications_integration', component: IntegrationHooks, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, props: route => ({ integrationId: route.params.integration_id, }), diff --git a/app/javascript/dashboard/routes/dashboard/settings/integrations/integrations.routes.js b/app/javascript/dashboard/routes/dashboard/settings/integrations/integrations.routes.js index 542cf591e..acad3c6eb 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/integrations/integrations.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/integrations/integrations.routes.js @@ -30,32 +30,42 @@ export default { path: '', name: 'settings_integrations', component: Index, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: 'webhook', component: Webhook, name: 'settings_integrations_webhook', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: 'dashboard-apps', component: DashboardApps, name: 'settings_integrations_dashboard_apps', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: 'slack', name: 'settings_integrations_slack', component: Slack, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, props: route => ({ code: route.query.code }), }, { path: ':integration_id', name: 'settings_integrations_integration', component: ShowIntegration, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, props: route => { return { integrationId: route.params.integration_id, diff --git a/app/javascript/dashboard/routes/dashboard/settings/labels/labels.routes.js b/app/javascript/dashboard/routes/dashboard/settings/labels/labels.routes.js index 4fc514da6..5eb9ca1b3 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/labels/labels.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/labels/labels.routes.js @@ -17,13 +17,17 @@ export default { { path: '', name: 'labels_wrapper', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, redirect: 'list', }, { path: 'list', name: 'labels_list', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: Index, }, ], diff --git a/app/javascript/dashboard/routes/dashboard/settings/macros/macros.routes.js b/app/javascript/dashboard/routes/dashboard/settings/macros/macros.routes.js index 58a26819f..77185f5ce 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/macros/macros.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/macros/macros.routes.js @@ -23,19 +23,40 @@ export default { path: '', name: 'macros_wrapper', component: Macros, - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, }, { path: 'new', name: 'macros_new', component: MacroEditor, - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, }, { path: ':macroId/edit', name: 'macros_edit', component: MacroEditor, - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, }, ], }, diff --git a/app/javascript/dashboard/routes/dashboard/settings/profile/profile.routes.js b/app/javascript/dashboard/routes/dashboard/settings/profile/profile.routes.js index 357c20e85..73cdd7c83 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/profile/profile.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/profile/profile.routes.js @@ -8,14 +8,28 @@ export default { { path: frontendURL('accounts/:accountId/profile'), name: 'profile_settings', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, component: SettingsContent, children: [ { path: 'settings', name: 'profile_settings_index', component: Index, - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, }, ], }, diff --git a/app/javascript/dashboard/routes/dashboard/settings/reports/reports.routes.js b/app/javascript/dashboard/routes/dashboard/settings/reports/reports.routes.js index 3792567da..78bf693d0 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/reports/reports.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/reports/reports.routes.js @@ -29,7 +29,9 @@ export default { { path: 'overview', name: 'account_overview_reports', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: LiveReports, }, ], @@ -46,7 +48,9 @@ export default { { path: 'conversation', name: 'conversation_reports', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: Index, }, ], @@ -63,7 +67,9 @@ export default { { path: 'csat', name: 'csat_reports', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: CsatResponses, }, ], @@ -80,7 +86,9 @@ export default { { path: 'bot', name: 'bot_reports', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: BotReports, }, ], @@ -97,7 +105,9 @@ export default { { path: 'agent', name: 'agent_reports', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: AgentReports, }, ], @@ -114,7 +124,9 @@ export default { { path: 'label', name: 'label_reports', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: LabelReports, }, ], @@ -131,7 +143,9 @@ export default { { path: 'inboxes', name: 'inbox_reports', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: InboxReports, }, ], @@ -147,7 +161,9 @@ export default { { path: 'teams', name: 'team_reports', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: TeamReports, }, ], @@ -164,7 +180,9 @@ export default { { path: 'sla', name: 'sla_reports', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: SLAReports, }, ], diff --git a/app/javascript/dashboard/routes/dashboard/settings/settings.routes.js b/app/javascript/dashboard/routes/dashboard/settings/settings.routes.js index dd5291fe8..f1e627b7b 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/settings.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/settings.routes.js @@ -24,7 +24,14 @@ export default { { path: frontendURL('accounts/:accountId/settings'), name: 'settings_home', - roles: ['administrator', 'agent'], + meta: { + permissions: [ + 'account_manage', + 'conversation_manage', + 'conversation_participating_manage', + 'conversation_unassigned_manage', + ], + }, redirect: () => { if (store.getters.getCurrentRole === 'administrator') { return frontendURL('accounts/:accountId/settings/general'); diff --git a/app/javascript/dashboard/routes/dashboard/settings/sla/sla.routes.js b/app/javascript/dashboard/routes/dashboard/settings/sla/sla.routes.js index a9c68470a..ad43aae8a 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/sla/sla.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/sla/sla.routes.js @@ -13,13 +13,17 @@ export default { { path: '', name: 'sla_wrapper', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, redirect: 'list', }, { path: 'list', name: 'sla_list', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: Index, }, ], diff --git a/app/javascript/dashboard/routes/dashboard/settings/teams/teams.routes.js b/app/javascript/dashboard/routes/dashboard/settings/teams/teams.routes.js index 4228e72e7..c6d870cfc 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/teams/teams.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/teams/teams.routes.js @@ -36,7 +36,9 @@ export default { path: 'list', name: 'settings_teams_list', component: TeamsHome, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: 'new', @@ -46,18 +48,24 @@ export default { path: '', name: 'settings_teams_new', component: CreateTeam, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: ':teamId/finish', name: 'settings_teams_finish', component: FinishSetup, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: ':teamId/agents', name: 'settings_teams_add_agents', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: AddAgents, }, ], @@ -70,18 +78,24 @@ export default { path: '', name: 'settings_teams_edit', component: EditTeam, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: 'agents', name: 'settings_teams_edit_members', component: EditAgents, - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, }, { path: 'finish', name: 'settings_teams_edit_finish', - roles: ['administrator'], + meta: { + permissions: ['account_manage'], + }, component: FinishSetup, }, ],