527 lines
18 KiB
TypeScript
527 lines
18 KiB
TypeScript
import { SideBarItem } from "./SidebarItem";
|
|
import {
|
|
FeatherBuilding2,
|
|
FeatherCalendarDays,
|
|
FeatherDatabase,
|
|
FeatherKanbanSquare,
|
|
FeatherListTodo,
|
|
FeatherMail,
|
|
FeatherPhone,
|
|
FeatherTarget,
|
|
FeatherUsers,
|
|
} from "@subframe/core";
|
|
import { TFunction } from "i18next";
|
|
import IconDashboard from "~/components/layouts/icons/IconDashboard";
|
|
import MembershipCardIcon from "~/components/ui/icons/MembershipCardIcon";
|
|
import { AppConfiguration } from "~/utils/db/appConfiguration.db.server";
|
|
import IconSettings from "~/components/layouts/icons/IconSettings";
|
|
import IconApp from "~/components/layouts/icons/IconApp";
|
|
import IconKeys from "~/components/layouts/icons/IconKeys";
|
|
import IconAnalytics from "~/components/layouts/icons/IconAnalytics";
|
|
import IconEmails from "~/components/layouts/icons/IconEmails";
|
|
import IconEvents from "~/components/layouts/icons/IconEvents";
|
|
import IconMetrics from "~/components/layouts/icons/IconMetrics";
|
|
import IconNotifications from "~/components/layouts/icons/IconNotifications";
|
|
import { UI_NAV_IDS } from "~/application/ui/uiRegistry";
|
|
import { adminPath } from "~/utils/app/CanonicalUrlUtils";
|
|
import type { PublicDomainRoutingConfig } from "~/utils/app/CrossHostUrls";
|
|
import { disabledPluginRouteSlugs } from "~/utils/app/PublicRouteSegments";
|
|
import { ADMIN_AREA_ACCESS } from "~/services/admin/admin-access-contract";
|
|
|
|
const adminSidebarPath = (path?: string) => adminPath(path, { mode: "host-aware" });
|
|
const disabledAdminRouteSlugs = new Set<string>(disabledPluginRouteSlugs);
|
|
|
|
function isAdminRouteEnabled(slug: string) {
|
|
return !disabledAdminRouteSlugs.has(slug);
|
|
}
|
|
|
|
function enabledAdminRouteItem(slug: string, item: SideBarItem): SideBarItem[] {
|
|
return isAdminRouteEnabled(slug) ? [item] : [];
|
|
}
|
|
|
|
type Props = {
|
|
t: TFunction;
|
|
appConfiguration: AppConfiguration | null;
|
|
routing?: PublicDomainRoutingConfig;
|
|
};
|
|
|
|
function consolidatedPlatformItem(input: {
|
|
id: string;
|
|
title: string;
|
|
path: string;
|
|
icon: SideBarItem["icon"];
|
|
permission?: SideBarItem["permission"];
|
|
anyPermissions?: SideBarItem["anyPermissions"];
|
|
contextItems: SideBarItem[];
|
|
}): SideBarItem {
|
|
return {
|
|
...input,
|
|
activePaths: input.contextItems.map((item) => item.path),
|
|
isCollapsible: false,
|
|
items: input.contextItems,
|
|
};
|
|
}
|
|
|
|
export const AdminSidebar = ({ t, appConfiguration }: Props): SideBarItem[] => [
|
|
{
|
|
id: "ui.nav.admin.primary",
|
|
title: "",
|
|
path: "",
|
|
items: [
|
|
{
|
|
id: UI_NAV_IDS.adminDashboard,
|
|
title: t("app.sidebar.dashboard"),
|
|
path: adminSidebarPath("dashboard"),
|
|
icon: <IconDashboard />,
|
|
permission: ADMIN_AREA_ACCESS.dashboard,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
id: "ui.nav.admin.manage",
|
|
title: t("segments.manage"),
|
|
icon: <IconDashboard />,
|
|
path: "",
|
|
items: [
|
|
{
|
|
id: UI_NAV_IDS.adminAccounts,
|
|
title: t("app.sidebar.accountsAndUsers"),
|
|
path: adminSidebarPath("accounts"),
|
|
icon: <MembershipCardIcon />,
|
|
isCollapsible: true,
|
|
isActive: false,
|
|
items: [
|
|
{
|
|
id: "ui.nav.admin.accounts.tenants",
|
|
title: t("admin.tenants.title"),
|
|
path: adminSidebarPath("accounts"),
|
|
// icon: SvgIcon.TENANTS,
|
|
items: [],
|
|
permission: "admin.accounts.view",
|
|
},
|
|
{
|
|
id: "ui.nav.admin.accounts.users",
|
|
title: t("models.user.plural"),
|
|
path: adminSidebarPath("accounts/users"),
|
|
items: [],
|
|
permission: "admin.users.view",
|
|
},
|
|
{
|
|
id: "ui.nav.admin.accounts.usageFeatures",
|
|
title: t("admin.accounts.usageFeatures"),
|
|
path: adminSidebarPath("accounts/subscriptions"),
|
|
items: [],
|
|
permission: "admin.accounts.view",
|
|
},
|
|
{
|
|
id: "ui.nav.admin.accounts.rolesAndPermissions",
|
|
title: t("app.sidebar.rolesAndPermissions"),
|
|
path: adminSidebarPath("accounts/roles-and-permissions"),
|
|
items: [],
|
|
permission: "admin.roles.view",
|
|
},
|
|
{
|
|
id: "ui.nav.admin.accounts.blacklist",
|
|
title: t("models.blacklist.object"),
|
|
path: adminSidebarPath("accounts/blacklist"),
|
|
items: [],
|
|
permission: "admin.blacklist.view",
|
|
},
|
|
{
|
|
id: "ui.nav.admin.accounts.ipAddresses",
|
|
title: t("models.tenantIpAddress.plural"),
|
|
path: adminSidebarPath("accounts/ip-addresses"),
|
|
items: [],
|
|
permission: "admin.tenantIpAddress.view",
|
|
},
|
|
],
|
|
permission: "admin.accounts.view",
|
|
excludePaths: [adminSidebarPath("accounts/billing")],
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminAudit,
|
|
title: t("admin.auditAndEvents"),
|
|
path: adminSidebarPath("audit"),
|
|
icon: <IconEvents />,
|
|
isCollapsible: true,
|
|
items: [
|
|
{ id: "ui.nav.admin.audit.viewer", title: t("app.sidebar.audit"), path: adminSidebarPath("audit"), permission: "admin_identity.audit.read" },
|
|
{
|
|
id: "ui.nav.admin.audit.trails",
|
|
title: t("app.sidebar.auditTrails"),
|
|
path: adminSidebarPath("audit-trails"),
|
|
permission: "admin.auditTrails.view",
|
|
},
|
|
{ id: "ui.nav.admin.audit.events", title: t("models.event.plural"), path: adminSidebarPath("events"), permission: "admin.events.view" },
|
|
],
|
|
anyPermissions: ["admin.auditTrails.view", "admin_identity.audit.read"],
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminNotifications,
|
|
title: t("app.sidebar.notifications"),
|
|
path: adminSidebarPath("notifications"),
|
|
icon: <IconNotifications />,
|
|
isCollapsible: true,
|
|
items: [
|
|
{
|
|
id: "ui.nav.admin.notifications.messages",
|
|
title: t("app.sidebar.messages"),
|
|
path: adminSidebarPath("notifications/messages"),
|
|
permission: "admin.notifications.view",
|
|
},
|
|
{
|
|
id: "ui.nav.admin.notifications.channels",
|
|
title: t("app.sidebar.channels"),
|
|
path: adminSidebarPath("notifications/channels"),
|
|
permission: "admin.notifications.view",
|
|
},
|
|
{
|
|
id: "ui.nav.admin.notifications.subscribers",
|
|
title: t("app.sidebar.subscribers"),
|
|
path: adminSidebarPath("notifications/subscribers"),
|
|
permission: "admin.notifications.view",
|
|
},
|
|
],
|
|
permission: "admin.notifications.view",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
id: "ui.nav.admin.platform",
|
|
title: t("segments.platform"),
|
|
path: "",
|
|
items: [
|
|
consolidatedPlatformItem({
|
|
id: "ui.nav.admin.platform.operations",
|
|
title: t("admin.platformNavigation.operations"),
|
|
path: adminSidebarPath("system"),
|
|
icon: <IconMetrics />,
|
|
anyPermissions: [ADMIN_AREA_ACCESS.health, "admin.events.view", "admin.account.subscription"],
|
|
contextItems: [
|
|
{
|
|
id: "ui.nav.admin.health",
|
|
title: t("admin.health.title"),
|
|
path: adminSidebarPath("system"),
|
|
permission: ADMIN_AREA_ACCESS.health,
|
|
},
|
|
{
|
|
id: "ui.nav.admin.system",
|
|
title: t("admin.system.title"),
|
|
path: adminSidebarPath("system/health"),
|
|
permission: ADMIN_AREA_ACCESS.system,
|
|
},
|
|
{
|
|
id: "ui.nav.admin.deploys",
|
|
title: t("admin.deploys.title"),
|
|
path: adminSidebarPath("system/deploys"),
|
|
permission: ADMIN_AREA_ACCESS.deploys,
|
|
},
|
|
{
|
|
id: "ui.nav.admin.jobs",
|
|
title: t("admin.jobs.title"),
|
|
path: adminSidebarPath("system/jobs"),
|
|
permission: ADMIN_AREA_ACCESS.jobs,
|
|
},
|
|
{
|
|
id: "ui.nav.admin.webhooks",
|
|
title: t("admin.webhooks.title"),
|
|
path: adminSidebarPath("system/webhooks"),
|
|
permission: "admin.events.view",
|
|
},
|
|
{
|
|
id: "ui.nav.admin.billingSync",
|
|
title: t("admin.health.subsystems.billing.label"),
|
|
path: adminSidebarPath("system/billing"),
|
|
permission: "admin.account.subscription",
|
|
},
|
|
],
|
|
}),
|
|
consolidatedPlatformItem({
|
|
id: "ui.nav.admin.platform.support",
|
|
title: t("admin.platformNavigation.support"),
|
|
path: adminSidebarPath("support"),
|
|
icon: <IconEmails />,
|
|
anyPermissions: [ADMIN_AREA_ACCESS.support, "admin.metrics.view"],
|
|
contextItems: [
|
|
{
|
|
id: UI_NAV_IDS.adminHelpDesk,
|
|
title: t("admin.supportInbox.title"),
|
|
path: adminSidebarPath("support"),
|
|
permission: ADMIN_AREA_ACCESS.support,
|
|
},
|
|
{
|
|
id: "ui.nav.admin.kwpContracts",
|
|
title: t("admin.kwpContracts.title"),
|
|
path: adminSidebarPath("support/kwp-contracts"),
|
|
permission: "admin.metrics.view",
|
|
},
|
|
],
|
|
}),
|
|
{
|
|
id: UI_NAV_IDS.adminApi,
|
|
title: t("admin.platformNavigation.apiAccess"),
|
|
path: adminSidebarPath("api"),
|
|
icon: <IconKeys />,
|
|
permission: "admin.apiKeys.view",
|
|
hidden: !appConfiguration?.app.features.tenantApiKeys,
|
|
isCollapsible: true,
|
|
items: [
|
|
{ id: "ui.nav.admin.api.overview", title: t("shared.overview"), path: adminSidebarPath("api"), permission: "admin.apiKeys.view" },
|
|
{ id: "ui.nav.admin.api.keys", title: t("app.sidebar.apiKeys"), path: adminSidebarPath("api/keys"), permission: "admin.apiKeys.view" },
|
|
{ id: "ui.nav.admin.api.logs", title: t("app.sidebar.logs"), path: adminSidebarPath("api/logs"), permission: "admin.apiKeys.view" },
|
|
{ id: "ui.nav.admin.api.clients", title: t("admin.apiAdmin.tabs.clients"), path: adminSidebarPath("api/clients"), permission: "admin.apiKeys.view" },
|
|
{
|
|
id: "ui.nav.admin.api.inbound",
|
|
title: t("admin.apiAdmin.tabs.inbound"),
|
|
path: adminSidebarPath("api/inbound-registrations"),
|
|
permission: "admin.apiKeys.view",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminSales,
|
|
title: t("admin.sales.navigation.title"),
|
|
path: adminSidebarPath("sales/tasks/today"),
|
|
icon: <IconAnalytics />,
|
|
items: [
|
|
{
|
|
id: UI_NAV_IDS.adminSalesToday,
|
|
title: t("admin.sales.navigation.today"),
|
|
path: adminSidebarPath("sales/tasks/today"),
|
|
icon: <FeatherListTodo />,
|
|
permission: ADMIN_AREA_ACCESS.sales,
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminPlatformLeads,
|
|
title: t("admin.sales.navigation.leads"),
|
|
path: adminSidebarPath("leads"),
|
|
icon: <FeatherTarget />,
|
|
permission: "admin_sales.crm.read",
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminSalesDeals,
|
|
title: t("admin.sales.navigation.deals"),
|
|
path: adminSidebarPath("sales/deals"),
|
|
icon: <FeatherKanbanSquare />,
|
|
permission: "admin_sales.crm.read",
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminSalesContacts,
|
|
title: t("admin.sales.navigation.contacts"),
|
|
path: adminSidebarPath("sales/contacts"),
|
|
icon: <FeatherUsers />,
|
|
permission: "admin_sales.crm.read",
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminSalesCompanies,
|
|
title: t("admin.sales.navigation.companies"),
|
|
path: adminSidebarPath("sales/companies"),
|
|
icon: <FeatherBuilding2 />,
|
|
permission: "admin_sales.crm.read",
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminSalesImportExport,
|
|
title: t("admin.sales.navigation.importExport"),
|
|
path: adminSidebarPath("sales/import-export"),
|
|
icon: <FeatherDatabase />,
|
|
permission: "admin_sales.crm.read",
|
|
},
|
|
],
|
|
anyPermissions: [ADMIN_AREA_ACCESS.sales],
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminSalesCommunication,
|
|
title: t("admin.sales.navigation.communicationSection"),
|
|
path: adminSidebarPath("sales/email/inbox"),
|
|
items: [
|
|
{
|
|
id: UI_NAV_IDS.adminSalesEmail,
|
|
title: t("admin.sales.navigation.email"),
|
|
path: adminSidebarPath("sales/email/inbox"),
|
|
icon: <FeatherMail />,
|
|
permission: "admin_sales.email.send",
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminSalesCalls,
|
|
title: t("admin.sales.navigation.calls"),
|
|
path: adminSidebarPath("sales/calls"),
|
|
icon: <FeatherPhone />,
|
|
permission: "admin_sales.phone.call",
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminSalesBookings,
|
|
title: t("admin.sales.navigation.bookings"),
|
|
path: adminSidebarPath("sales/bookings"),
|
|
icon: <FeatherCalendarDays />,
|
|
permission: "admin_sales.booking.manage",
|
|
},
|
|
],
|
|
anyPermissions: ["admin_sales.email.send", "admin_sales.phone.call", "admin_sales.booking.manage"],
|
|
},
|
|
{
|
|
id: "ui.nav.admin.market",
|
|
title: t("segments.market"),
|
|
path: "",
|
|
items: [
|
|
...enabledAdminRouteItem("email-marketing", {
|
|
id: UI_NAV_IDS.adminEmailMarketing,
|
|
title: t("app.sidebar.emailMarketing"),
|
|
path: adminSidebarPath("email-marketing"),
|
|
icon: <IconEmails />,
|
|
isCollapsible: true,
|
|
items: [
|
|
{
|
|
id: "ui.nav.admin.emailMarketing.campaigns",
|
|
title: t("app.sidebar.campaigns"),
|
|
path: adminSidebarPath("email-marketing/campaigns"),
|
|
permission: "admin.emails.view",
|
|
},
|
|
{
|
|
id: "ui.nav.admin.emailMarketing.senders",
|
|
title: t("app.sidebar.senders"),
|
|
path: adminSidebarPath("email-marketing/senders"),
|
|
permission: "admin.emails.view",
|
|
},
|
|
{
|
|
id: "ui.nav.admin.emailMarketing.activity",
|
|
title: t("app.sidebar.activity"),
|
|
path: adminSidebarPath("email-marketing/activity"),
|
|
permission: "admin.emails.view",
|
|
},
|
|
],
|
|
permission: "admin.emails.view",
|
|
}),
|
|
{
|
|
id: UI_NAV_IDS.adminMarketing,
|
|
title: t("app.sidebar.marketing"),
|
|
path: adminSidebarPath("marketing-integrations"),
|
|
icon: <IconAnalytics />,
|
|
isCollapsible: true,
|
|
items: [
|
|
{
|
|
id: "ui.nav.admin.marketing.integrations",
|
|
title: t("app.sidebar.integrations"),
|
|
path: adminSidebarPath("marketing-integrations"),
|
|
permission: "admin.marketing.integrations.view",
|
|
},
|
|
{
|
|
id: "ui.nav.admin.marketing.emailSequences",
|
|
title: t("app.sidebar.emailSequences"),
|
|
path: adminSidebarPath("email-sequences"),
|
|
permission: "admin.marketing.leads.view",
|
|
},
|
|
],
|
|
permission: "admin.marketing.leads.view",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
id: "ui.nav.admin.secondary",
|
|
title: "",
|
|
path: "",
|
|
// isSecondary: true,
|
|
items: [
|
|
{
|
|
id: UI_NAV_IDS.adminSettings,
|
|
title: t("app.sidebar.settings"),
|
|
icon: <IconSettings />,
|
|
path: adminSidebarPath("settings"),
|
|
anyPermissions: [
|
|
"admin_identity.sessions.read",
|
|
"admin_identity.users.read",
|
|
"admin_identity.roles.read",
|
|
"admin.settings.general.view",
|
|
"admin.pricing.view",
|
|
"admin.settings.authentication.view",
|
|
"admin.emails.view",
|
|
"admin_sales.crm.write",
|
|
"admin_sales.crm.assign",
|
|
"admin_sales.crm.read",
|
|
"admin_sales.integrations.manage",
|
|
"admin.settings.danger.reset",
|
|
],
|
|
isCollapsible: false,
|
|
activePaths: [adminSidebarPath("settings")],
|
|
items: [
|
|
{
|
|
id: "ui.nav.admin.settings.profile",
|
|
title: t("admin.sales.security.title"),
|
|
path: adminSidebarPath("settings/security"),
|
|
permission: "admin_identity.sessions.read",
|
|
},
|
|
{
|
|
id: "ui.nav.admin.settings.adminUsers",
|
|
title: t("admin.sales.adminUsers.title"),
|
|
path: adminSidebarPath("settings/admin-users"),
|
|
permission: ADMIN_AREA_ACCESS.employees,
|
|
},
|
|
{
|
|
id: "ui.nav.admin.settings.adminRoles",
|
|
title: t("admin.sales.adminRoles.title"),
|
|
path: adminSidebarPath("settings/admin-roles"),
|
|
permission: ADMIN_AREA_ACCESS.roles,
|
|
},
|
|
{
|
|
id: "ui.nav.admin.settings.general",
|
|
title: t("settings.admin.general.title"),
|
|
path: adminSidebarPath("settings/general"),
|
|
permission: "admin.settings.general.view",
|
|
},
|
|
{
|
|
id: "ui.nav.admin.settings.pricing",
|
|
title: t("settings.admin.pricing.title"),
|
|
path: adminSidebarPath("settings/pricing"),
|
|
permission: "admin.pricing.view",
|
|
},
|
|
{
|
|
id: "ui.nav.admin.settings.authentication",
|
|
title: t("settings.admin.authentication.title"),
|
|
path: adminSidebarPath("settings/authentication"),
|
|
permission: "admin.settings.authentication.view",
|
|
},
|
|
{
|
|
id: "ui.nav.admin.settings.transactionalEmails",
|
|
title: t("settings.admin.transactionalEmails.title"),
|
|
path: adminSidebarPath("settings/transactional-emails"),
|
|
permission: "admin.emails.view",
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminSalesPipelineSettings,
|
|
title: t("admin.sales.navigation.pipelineSettings"),
|
|
path: adminSidebarPath("settings/pipelines"),
|
|
permission: "admin_sales.crm.write",
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminSalesLeadSettings,
|
|
title: t("admin.sales.navigation.leadSettings"),
|
|
path: adminSidebarPath("settings/leads"),
|
|
permission: "admin_sales.crm.assign",
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminSalesFieldsTags,
|
|
title: t("admin.sales.navigation.fieldsTags"),
|
|
path: adminSidebarPath("settings/fields-tags"),
|
|
permission: "admin_sales.crm.read",
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminSalesTelephonySettings,
|
|
title: t("admin.sales.navigation.telephonySettings"),
|
|
path: adminSidebarPath("settings/telephony"),
|
|
permission: "admin_sales.integrations.manage",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminSwitchToApp,
|
|
title: t("admin.switchToApp"),
|
|
path: adminSidebarPath("select-tenant"),
|
|
icon: <IconApp />,
|
|
permission: "admin.accounts.view",
|
|
exact: true,
|
|
},
|
|
],
|
|
},
|
|
];
|