diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb
index f63e8f6bf..0f915ab8a 100644
--- a/app/controllers/dashboard_controller.rb
+++ b/app/controllers/dashboard_controller.rb
@@ -36,7 +36,7 @@ class DashboardController < ActionController::Base
'LOGOUT_REDIRECT_LINK',
'DISABLE_USER_PROFILE_UPDATE',
'DEPLOYMENT_ENV',
- 'CSML_EDITOR_HOST'
+ 'CSML_EDITOR_HOST', 'INSTALLATION_PRICING_PLAN'
).merge(app_config)
end
diff --git a/app/javascript/dashboard/components-next/captain/PageLayout.vue b/app/javascript/dashboard/components-next/captain/PageLayout.vue
index 1ce03cec5..dd76f1b62 100644
--- a/app/javascript/dashboard/components-next/captain/PageLayout.vue
+++ b/app/javascript/dashboard/components-next/captain/PageLayout.vue
@@ -1,12 +1,12 @@
-
+
diff --git a/app/javascript/dashboard/composables/usePolicy.js b/app/javascript/dashboard/composables/usePolicy.js
index 0653003ec..dc203cbac 100644
--- a/app/javascript/dashboard/composables/usePolicy.js
+++ b/app/javascript/dashboard/composables/usePolicy.js
@@ -1,20 +1,31 @@
+import { computed, unref } from 'vue';
import { useMapGetter } from 'dashboard/composables/store';
import { useAccount } from 'dashboard/composables/useAccount';
+import { useConfig } from 'dashboard/composables/useConfig';
import {
getUserPermissions,
hasPermissions,
} from 'dashboard/helper/permissionsHelper';
+import { PREMIUM_FEATURES } from 'dashboard/featureFlags';
+
+import { INSTALLATION_TYPES } from 'dashboard/constants/installationTypes';
export function usePolicy() {
const user = useMapGetter('getCurrentUser');
const isFeatureEnabled = useMapGetter('accounts/isFeatureEnabledonAccount');
+ const isOnChatwootCloud = useMapGetter('globalConfig/isOnChatwootCloud');
+ const isACustomBrandedInstance = useMapGetter(
+ 'globalConfig/isACustomBrandedInstance'
+ );
+
+ const { isEnterprise, enterprisePlanName } = useConfig();
const { accountId } = useAccount();
const getUserPermissionsForAccount = () => {
return getUserPermissions(user.value, accountId.value);
};
- const checkFeatureAllowed = featureFlag => {
+ const isFeatureFlagEnabled = featureFlag => {
if (!featureFlag) return true;
return isFeatureEnabled.value(accountId.value, featureFlag);
};
@@ -25,5 +36,99 @@ export function usePolicy() {
return hasPermissions(requiredPermissions, userPermissions);
};
- return { checkFeatureAllowed, checkPermissions };
+ const checkInstallationType = config => {
+ if (Array.isArray(config) && config.length > 0) {
+ const installationCheck = {
+ [INSTALLATION_TYPES.ENTERPRISE]: isEnterprise,
+ [INSTALLATION_TYPES.CLOUD]: isOnChatwootCloud.value,
+ [INSTALLATION_TYPES.COMMUNITY]: true,
+ };
+
+ return config.some(type => installationCheck[type]);
+ }
+
+ return true;
+ };
+
+ const isPremiumFeature = featureFlag => {
+ if (!featureFlag) return true;
+ return PREMIUM_FEATURES.includes(featureFlag);
+ };
+
+ const hasPremiumEnterprise = computed(() => {
+ if (isEnterprise) return enterprisePlanName !== 'community';
+
+ return true;
+ });
+
+ const shouldShow = (featureFlag, permissions, installationTypes) => {
+ const flag = unref(featureFlag);
+ const perms = unref(permissions);
+ const installation = unref(installationTypes);
+
+ // if the user does not have permissions or installation type is not supported
+ // return false;
+ // This supersedes everything
+ if (!checkPermissions(perms)) return false;
+ if (!checkInstallationType(installation)) return false;
+
+ if (isACustomBrandedInstance.value) {
+ // if this is a custom branded instance, we just use the feature flag as a reference
+ return isFeatureFlagEnabled(flag);
+ }
+
+ // if on cloud, we should if the feature is allowed
+ // or if the feature is a premium one like SLA to show a paywall
+ // the paywall should be managed by the individual component
+ if (isOnChatwootCloud.value) {
+ return isFeatureFlagEnabled(flag) || isPremiumFeature(flag);
+ }
+
+ if (isEnterprise) {
+ // in enterprise, if the feature is premium but they don't have an enterprise plan
+ // we should it anyway this is to show upsells on enterprise regardless of the feature flag
+ // Feature flag is only honored if they have a premium plan
+ //
+ // In case they have a premium plan, the check on feature flag alone is enough
+ // because the second condition will always be false
+ // That means once subscribed, the feature can be disabled by the admin
+ //
+ // the paywall should be managed by the individual component
+ return (
+ isFeatureFlagEnabled(flag) ||
+ (isPremiumFeature(flag) && !hasPremiumEnterprise.value)
+ );
+ }
+
+ // default to true
+ return true;
+ };
+
+ const shouldShowPaywall = featureFlag => {
+ const flag = unref(featureFlag);
+ if (!flag) return false;
+
+ if (isACustomBrandedInstance.value) {
+ // custom branded instances never show paywall
+ return false;
+ }
+
+ if (isPremiumFeature(flag)) {
+ if (isOnChatwootCloud.value) {
+ return !isFeatureFlagEnabled(flag);
+ }
+
+ if (isEnterprise) {
+ return !hasPremiumEnterprise.value;
+ }
+ }
+
+ return false;
+ };
+
+ return {
+ checkPermissions,
+ shouldShowPaywall,
+ shouldShow,
+ };
}
diff --git a/app/javascript/dashboard/constants/installationTypes.js b/app/javascript/dashboard/constants/installationTypes.js
new file mode 100644
index 000000000..87709e98d
--- /dev/null
+++ b/app/javascript/dashboard/constants/installationTypes.js
@@ -0,0 +1,5 @@
+export const INSTALLATION_TYPES = {
+ CLOUD: 'cloud',
+ ENTERPRISE: 'enterprise',
+ COMMUNITY: 'community',
+};
diff --git a/app/javascript/dashboard/featureFlags.js b/app/javascript/dashboard/featureFlags.js
index 0695be473..f7430bdba 100644
--- a/app/javascript/dashboard/featureFlags.js
+++ b/app/javascript/dashboard/featureFlags.js
@@ -36,3 +36,11 @@ export const FEATURE_FLAGS = {
REPORT_V4: 'report_v4',
CONTACT_CHATWOOT_SUPPORT_TEAM: 'contact_chatwoot_support_team',
};
+
+export const PREMIUM_FEATURES = [
+ FEATURE_FLAGS.SLA,
+ FEATURE_FLAGS.CAPTAIN,
+ FEATURE_FLAGS.CUSTOM_ROLES,
+ FEATURE_FLAGS.AUDIT_LOGS,
+ FEATURE_FLAGS.HELP_CENTER,
+];
diff --git a/app/javascript/dashboard/routes/dashboard/campaigns/campaigns.routes.js b/app/javascript/dashboard/routes/dashboard/campaigns/campaigns.routes.js
index a4f0a94f5..e0c1f3a17 100644
--- a/app/javascript/dashboard/routes/dashboard/campaigns/campaigns.routes.js
+++ b/app/javascript/dashboard/routes/dashboard/campaigns/campaigns.routes.js
@@ -3,6 +3,12 @@ import { frontendURL } from 'dashboard/helper/URLHelper.js';
import CampaignsPageRouteView from './pages/CampaignsPageRouteView.vue';
import LiveChatCampaignsPage from './pages/LiveChatCampaignsPage.vue';
import SMSCampaignsPage from './pages/SMSCampaignsPage.vue';
+import { FEATURE_FLAGS } from 'dashboard/featureFlags';
+
+const meta = {
+ featureFlag: FEATURE_FLAGS.CAMPAIGNS,
+ permissions: ['administrator'],
+};
const campaignsRoutes = {
routes: [
@@ -19,9 +25,7 @@ const campaignsRoutes = {
{
path: 'ongoing',
name: 'campaigns_ongoing_index',
- meta: {
- permissions: ['administrator'],
- },
+ meta,
redirect: to => {
return { name: 'campaigns_livechat_index', params: to.params };
},
@@ -29,9 +33,7 @@ const campaignsRoutes = {
{
path: 'one_off',
name: 'campaigns_one_off_index',
- meta: {
- permissions: ['administrator'],
- },
+ meta,
redirect: to => {
return { name: 'campaigns_sms_index', params: to.params };
},
@@ -39,17 +41,13 @@ const campaignsRoutes = {
{
path: 'live_chat',
name: 'campaigns_livechat_index',
- meta: {
- permissions: ['administrator'],
- },
+ meta,
component: LiveChatCampaignsPage,
},
{
path: 'sms',
name: 'campaigns_sms_index',
- meta: {
- permissions: ['administrator'],
- },
+ meta,
component: SMSCampaignsPage,
},
],
diff --git a/app/javascript/dashboard/routes/dashboard/captain/assistants/Index.vue b/app/javascript/dashboard/routes/dashboard/captain/assistants/Index.vue
index 3ea78e74a..bcc551966 100644
--- a/app/javascript/dashboard/routes/dashboard/captain/assistants/Index.vue
+++ b/app/javascript/dashboard/routes/dashboard/captain/assistants/Index.vue
@@ -78,8 +78,8 @@ onMounted(() => store.dispatch('captainAssistants/get'));
:button-policy="['administrator']"
:show-pagination-footer="false"
:is-fetching="isFetching"
- :feature-flag="FEATURE_FLAGS.CAPTAIN"
:is-empty="!assistants.length"
+ :feature-flag="FEATURE_FLAGS.CAPTAIN"
@click="handleCreate"
>
diff --git a/app/javascript/dashboard/routes/dashboard/captain/assistants/inboxes/Index.vue b/app/javascript/dashboard/routes/dashboard/captain/assistants/inboxes/Index.vue
index dd9e85735..a9a36706a 100644
--- a/app/javascript/dashboard/routes/dashboard/captain/assistants/inboxes/Index.vue
+++ b/app/javascript/dashboard/routes/dashboard/captain/assistants/inboxes/Index.vue
@@ -72,8 +72,8 @@ onMounted(() =>
:button-policy="['administrator']"
:is-fetching="isFetchingAssistant || isFetching"
:is-empty="!captainInboxes.length"
- :feature-flag="FEATURE_FLAGS.CAPTAIN"
:show-pagination-footer="false"
+ :feature-flag="FEATURE_FLAGS.CAPTAIN"
@click="handleCreate"
>
diff --git a/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js b/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js
index 1ae181e80..cf7751751 100644
--- a/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js
+++ b/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js
@@ -1,4 +1,5 @@
-// import { FEATURE_FLAGS } from 'dashboard/featureFlags';
+import { FEATURE_FLAGS } from 'dashboard/featureFlags';
+import { INSTALLATION_TYPES } from 'dashboard/constants/installationTypes';
import { frontendURL } from '../../../helper/URLHelper';
import AssistantIndex from './assistants/Index.vue';
import AssistantInboxesIndex from './assistants/inboxes/Index.vue';
@@ -12,6 +13,11 @@ export const routes = [
name: 'captain_assistants_index',
meta: {
permissions: ['administrator', 'agent'],
+ featureFlag: FEATURE_FLAGS.CAPTAIN,
+ installationTypes: [
+ INSTALLATION_TYPES.CLOUD,
+ INSTALLATION_TYPES.ENTERPRISE,
+ ],
},
},
{
@@ -22,6 +28,11 @@ export const routes = [
name: 'captain_assistants_inboxes_index',
meta: {
permissions: ['administrator', 'agent'],
+ featureFlag: FEATURE_FLAGS.CAPTAIN,
+ installationTypes: [
+ INSTALLATION_TYPES.CLOUD,
+ INSTALLATION_TYPES.ENTERPRISE,
+ ],
},
},
{
@@ -30,6 +41,11 @@ export const routes = [
name: 'captain_documents_index',
meta: {
permissions: ['administrator', 'agent'],
+ featureFlag: FEATURE_FLAGS.CAPTAIN,
+ installationTypes: [
+ INSTALLATION_TYPES.CLOUD,
+ INSTALLATION_TYPES.ENTERPRISE,
+ ],
},
},
{
@@ -38,6 +54,11 @@ export const routes = [
name: 'captain_responses_index',
meta: {
permissions: ['administrator', 'agent'],
+ featureFlag: FEATURE_FLAGS.CAPTAIN,
+ installationTypes: [
+ INSTALLATION_TYPES.CLOUD,
+ INSTALLATION_TYPES.ENTERPRISE,
+ ],
},
},
];
diff --git a/app/javascript/dashboard/routes/dashboard/captain/responses/Index.vue b/app/javascript/dashboard/routes/dashboard/captain/responses/Index.vue
index daa38e1f4..6aaee965e 100644
--- a/app/javascript/dashboard/routes/dashboard/captain/responses/Index.vue
+++ b/app/javascript/dashboard/routes/dashboard/captain/responses/Index.vue
@@ -163,8 +163,8 @@ onMounted(() => {
:button-label="$t('CAPTAIN.RESPONSES.ADD_NEW')"
:is-fetching="isFetching"
:is-empty="!responses.length"
- :feature-flag="FEATURE_FLAGS.CAPTAIN"
:show-pagination-footer="!isFetching && !!responses.length"
+ :feature-flag="FEATURE_FLAGS.CAPTAIN"
@update:current-page="onPageChange"
@click="handleCreate"
>
diff --git a/app/javascript/dashboard/routes/dashboard/contacts/routes.js b/app/javascript/dashboard/routes/dashboard/contacts/routes.js
index ea5238a3b..3610117a5 100644
--- a/app/javascript/dashboard/routes/dashboard/contacts/routes.js
+++ b/app/javascript/dashboard/routes/dashboard/contacts/routes.js
@@ -1,8 +1,10 @@
import { frontendURL } from '../../../helper/URLHelper';
import ContactsIndex from './pages/ContactsIndex.vue';
import ContactManageView from './pages/ContactManageView.vue';
+import { FEATURE_FLAGS } from '../../../featureFlags';
const commonMeta = {
+ featureFlag: FEATURE_FLAGS.CRM,
permissions: ['administrator', 'agent', 'contact_manage'],
};
diff --git a/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.js b/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.js
index 1897d90e8..fba4ba666 100644
--- a/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.js
+++ b/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.js
@@ -1,3 +1,4 @@
+import { FEATURE_FLAGS } from '../../../featureFlags';
import { getPortalRoute } from './helpers/routeHelper';
import HelpCenterPageRouteView from './pages/HelpCenterPageRouteView.vue';
@@ -21,21 +22,21 @@ const PortalsLocalesIndexPage = () =>
const PortalsSettingsIndexPage = () =>
import('./pages/PortalsSettingsIndexPage.vue');
+const meta = {
+ featureFlag: FEATURE_FLAGS.HELP_CENTER,
+ permissions: ['administrator', 'agent', 'knowledge_base_manage'],
+};
const portalRoutes = [
{
path: getPortalRoute(':portalSlug/:locale/:categorySlug?/articles/:tab?'),
name: 'portals_articles_index',
- meta: {
- permissions: ['administrator', 'agent', 'knowledge_base_manage'],
- },
+ meta,
component: PortalsArticlesIndexPage,
},
{
path: getPortalRoute(':portalSlug/:locale/:categorySlug?/articles/new'),
name: 'portals_articles_new',
- meta: {
- permissions: ['administrator', 'agent', 'knowledge_base_manage'],
- },
+ meta,
component: PortalsArticlesNewPage,
},
{
@@ -43,18 +44,14 @@ const portalRoutes = [
':portalSlug/:locale/:categorySlug?/articles/:tab?/edit/:articleSlug'
),
name: 'portals_articles_edit',
- meta: {
- permissions: ['administrator', 'agent', 'knowledge_base_manage'],
- },
+ meta,
component: PortalsArticlesEditPage,
},
{
path: getPortalRoute(':portalSlug/:locale/categories'),
name: 'portals_categories_index',
- meta: {
- permissions: ['administrator', 'agent', 'knowledge_base_manage'],
- },
+ meta,
component: PortalsCategoriesIndexPage,
},
{
@@ -62,9 +59,7 @@ const portalRoutes = [
':portalSlug/:locale/categories/:categorySlug/articles'
),
name: 'portals_categories_articles_index',
- meta: {
- permissions: ['administrator', 'agent', 'knowledge_base_manage'],
- },
+ meta,
component: PortalsArticlesIndexPage,
},
{
@@ -72,31 +67,26 @@ const portalRoutes = [
':portalSlug/:locale/categories/:categorySlug/articles/:articleSlug'
),
name: 'portals_categories_articles_edit',
- meta: {
- permissions: ['administrator', 'agent', 'knowledge_base_manage'],
- },
+ meta,
component: PortalsArticlesEditPage,
},
{
path: getPortalRoute(':portalSlug/locales'),
name: 'portals_locales_index',
- meta: {
- permissions: ['administrator', 'agent', 'knowledge_base_manage'],
- },
+ meta,
component: PortalsLocalesIndexPage,
},
{
path: getPortalRoute(':portalSlug/settings'),
name: 'portals_settings_index',
- meta: {
- permissions: ['administrator', 'agent', 'knowledge_base_manage'],
- },
+ meta,
component: PortalsSettingsIndexPage,
},
{
path: getPortalRoute('new'),
name: 'portals_new',
meta: {
+ featureFlag: FEATURE_FLAGS.HELP_CENTER,
permissions: ['administrator', 'knowledge_base_manage'],
},
component: PortalsNew,
@@ -105,6 +95,7 @@ const portalRoutes = [
path: getPortalRoute(':navigationPath'),
name: 'portals_index',
meta: {
+ featureFlag: FEATURE_FLAGS.HELP_CENTER,
permissions: ['administrator', 'knowledge_base_manage'],
},
component: PortalsIndex,
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 545c94eeb..753222f13 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/auditlogs/audit.routes.js
+++ b/app/javascript/dashboard/routes/dashboard/settings/auditlogs/audit.routes.js
@@ -1,4 +1,5 @@
import { FEATURE_FLAGS } from '../../../../featureFlags';
+import { INSTALLATION_TYPES } from 'dashboard/constants/installationTypes';
import { frontendURL } from '../../../../helper/URLHelper';
import SettingsWrapper from '../SettingsWrapper.vue';
@@ -21,6 +22,10 @@ export default {
name: 'auditlogs_list',
meta: {
featureFlag: FEATURE_FLAGS.AUDIT_LOGS,
+ installationTypes: [
+ INSTALLATION_TYPES.CLOUD,
+ INSTALLATION_TYPES.ENTERPRISE,
+ ],
permissions: ['administrator'],
},
component: AuditLogsHome,
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 26b441c75..8c03257c8 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/billing/billing.routes.js
+++ b/app/javascript/dashboard/routes/dashboard/settings/billing/billing.routes.js
@@ -1,4 +1,5 @@
import { frontendURL } from '../../../../helper/URLHelper';
+import { INSTALLATION_TYPES } from 'dashboard/constants/installationTypes';
import SettingsWrapper from '../SettingsWrapper.vue';
import Index from './Index.vue';
@@ -8,6 +9,7 @@ export default {
path: frontendURL('accounts/:accountId/settings/billing'),
meta: {
permissions: ['administrator'],
+ installationTypes: [INSTALLATION_TYPES.CLOUD],
},
component: SettingsWrapper,
props: {
@@ -21,6 +23,7 @@ export default {
name: 'billing_settings_index',
component: Index,
meta: {
+ installationTypes: [INSTALLATION_TYPES.CLOUD],
permissions: ['administrator'],
},
},
diff --git a/app/javascript/dashboard/routes/dashboard/settings/customRoles/customRole.routes.js b/app/javascript/dashboard/routes/dashboard/settings/customRoles/customRole.routes.js
index 361231e23..33d7df6c4 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/customRoles/customRole.routes.js
+++ b/app/javascript/dashboard/routes/dashboard/settings/customRoles/customRole.routes.js
@@ -1,4 +1,5 @@
import { FEATURE_FLAGS } from '../../../../featureFlags';
+import { INSTALLATION_TYPES } from 'dashboard/constants/installationTypes';
import { frontendURL } from 'dashboard/helper/URLHelper';
import SettingsWrapper from '../SettingsWrapper.vue';
@@ -19,6 +20,10 @@ export default {
name: 'custom_roles_list',
meta: {
featureFlag: FEATURE_FLAGS.CUSTOM_ROLES,
+ installationTypes: [
+ INSTALLATION_TYPES.CLOUD,
+ INSTALLATION_TYPES.ENTERPRISE,
+ ],
permissions: ['administrator'],
},
component: CustomRolesHome,
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 2283e82a5..43855240c 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/reports/reports.routes.js
+++ b/app/javascript/dashboard/routes/dashboard/settings/reports/reports.routes.js
@@ -22,37 +22,34 @@ import BotReports from './BotReports.vue';
import LiveReports from './LiveReports.vue';
import SLAReports from './SLAReports.vue';
+const meta = {
+ featureFlag: FEATURE_FLAGS.REPORTS,
+ permissions: ['administrator', 'report_manage'],
+};
+
const oldReportRoutes = [
{
path: 'agent',
name: 'agent_reports',
- meta: {
- permissions: ['administrator', 'report_manage'],
- },
+ meta,
component: AgentReports,
},
{
path: 'inboxes',
name: 'inbox_reports',
- meta: {
- permissions: ['administrator', 'report_manage'],
- },
+ meta,
component: InboxReports,
},
{
path: 'label',
name: 'label_reports',
- meta: {
- permissions: ['administrator', 'report_manage'],
- },
+ meta,
component: LabelReports,
},
{
path: 'teams',
name: 'team_reports',
- meta: {
- permissions: ['administrator', 'report_manage'],
- },
+ meta,
component: TeamReports,
},
];
@@ -124,17 +121,13 @@ export default {
{
path: 'overview',
name: 'account_overview_reports',
- meta: {
- permissions: ['administrator', 'report_manage'],
- },
+ meta,
component: LiveReports,
},
{
path: 'conversation',
name: 'conversation_reports',
- meta: {
- permissions: ['administrator', 'report_manage'],
- },
+ meta,
component: Index,
},
...oldReportRoutes,
@@ -142,26 +135,19 @@ export default {
{
path: 'sla',
name: 'sla_reports',
- meta: {
- permissions: ['administrator', 'report_manage'],
- featureFlag: FEATURE_FLAGS.SLA,
- },
+ meta,
component: SLAReports,
},
{
path: 'csat',
name: 'csat_reports',
- meta: {
- permissions: ['administrator', 'report_manage'],
- },
+ meta,
component: CsatResponses,
},
{
path: 'bot',
name: 'bot_reports',
- meta: {
- permissions: ['administrator', 'report_manage'],
- },
+ meta,
component: BotReports,
},
],
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 50ad28472..b44a8516d 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/sla/sla.routes.js
+++ b/app/javascript/dashboard/routes/dashboard/settings/sla/sla.routes.js
@@ -1,9 +1,16 @@
import { FEATURE_FLAGS } from '../../../../featureFlags';
+import { INSTALLATION_TYPES } from 'dashboard/constants/installationTypes';
import { frontendURL } from '../../../../helper/URLHelper';
import SettingsWrapper from '../SettingsWrapper.vue';
import Index from './Index.vue';
+const meta = {
+ featureFlag: FEATURE_FLAGS.SLA,
+ permissions: ['administrator'],
+ installationTypes: [INSTALLATION_TYPES.CLOUD, INSTALLATION_TYPES.ENTERPRISE],
+};
+
export default {
routes: [
{
@@ -14,10 +21,7 @@ export default {
{
path: '',
name: 'sla_wrapper',
- meta: {
- featureFlag: FEATURE_FLAGS.SLA,
- permissions: ['administrator'],
- },
+ meta,
redirect: to => {
return { name: 'sla_list', params: to.params };
},
@@ -25,10 +29,7 @@ export default {
{
path: 'list',
name: 'sla_list',
- meta: {
- featureFlag: FEATURE_FLAGS.SLA,
- permissions: ['administrator'],
- },
+ meta,
component: Index,
},
],
diff --git a/config/features.yml b/config/features.yml
index 59a37a7cf..756c93e2c 100644
--- a/config/features.yml
+++ b/config/features.yml
@@ -75,10 +75,13 @@
- name: message_reply_to
enabled: false
help_url: https://chwt.app/hc/reply-to
+ chatwoot_internal: true
- name: insert_article_in_reply
enabled: false
+ chatwoot_internal: true
- name: inbox_view
enabled: false
+ chatwoot_internal: true
- name: sla
enabled: false
premium: true
@@ -86,10 +89,12 @@
- name: help_center_embedding_search
enabled: false
premium: true
+ chatwoot_internal: true
- name: linear_integration
enabled: false
- name: captain_integration
enabled: false
+ premium: true
- name: custom_roles
enabled: false
premium: true