355 lines
17 KiB
TypeScript
355 lines
17 KiB
TypeScript
import { SideBarItem } from "./SidebarItem";
|
|
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 IconEntities from "~/components/layouts/icons/IconEntities";
|
|
import IconAnalytics from "~/components/layouts/icons/IconAnalytics";
|
|
import IconDocs from "~/components/layouts/icons/IconDocs";
|
|
import IconEmails from "~/components/layouts/icons/IconEmails";
|
|
import IconEvents from "~/components/layouts/icons/IconEvents";
|
|
import IconFeatureFlags from "~/components/layouts/icons/IconFeatureFlags";
|
|
import IconHelpDesk from "~/components/layouts/icons/IconHelpDesk";
|
|
import IconMetrics from "~/components/layouts/icons/IconMetrics";
|
|
import IconNavigation from "~/components/layouts/icons/IconNavigation";
|
|
import IconNotifications from "~/components/layouts/icons/IconNotifications";
|
|
import IconOnboarding from "~/components/layouts/icons/IconOnboarding";
|
|
import IconPortals from "~/components/layouts/icons/IconPortals";
|
|
import IconWorkflows from "~/components/layouts/icons/IconWorkflows";
|
|
import { UI_NAV_IDS } from "~/application/ui/uiRegistry";
|
|
import { adminPath } from "~/utils/app/CanonicalUrlUtils";
|
|
import { absoluteAppRootPath, type PublicDomainRoutingConfig } from "~/utils/app/CrossHostUrls";
|
|
import { disabledPluginRouteSlugs } from "~/utils/app/PublicRouteSegments";
|
|
|
|
const adminSidebarPath = (path?: string) => adminPath(path, { mode: "host-aware" });
|
|
const rootAppFallbackPath = "/";
|
|
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;
|
|
};
|
|
|
|
export const AdminSidebar = ({ t, appConfiguration, routing }: 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 />,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
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",
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminAnalytics,
|
|
title: t("app.sidebar.analytics"),
|
|
path: adminSidebarPath("analytics"),
|
|
icon: <IconAnalytics />,
|
|
isCollapsible: true,
|
|
items: [
|
|
{ id: "ui.nav.admin.analytics.overview", title: t("app.sidebar.overview"), path: adminSidebarPath("analytics/overview"), permission: "admin.analytics.view" },
|
|
{ id: "ui.nav.admin.analytics.pageViews", title: t("app.sidebar.pageViews"), path: adminSidebarPath("analytics/page-views"), permission: "admin.analytics.view" },
|
|
{ id: "ui.nav.admin.analytics.visitors", title: t("app.sidebar.visitors"), path: adminSidebarPath("analytics/visitors"), permission: "admin.analytics.view" },
|
|
{ id: "ui.nav.admin.analytics.events", title: t("models.event.plural"), path: adminSidebarPath("analytics/events"), permission: "admin.analytics.view" },
|
|
{ id: "ui.nav.admin.analytics.settings", title: t("app.sidebar.settings"), path: adminSidebarPath("analytics/settings"), permission: "admin.settings.analytics.view" },
|
|
],
|
|
permission: "admin.analytics.view",
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminEvents,
|
|
title: t("models.event.plural"),
|
|
path: adminSidebarPath("events"),
|
|
icon: <IconEvents />,
|
|
permission: "admin.events.view",
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminAuditTrails,
|
|
title: t("app.sidebar.auditTrails"),
|
|
path: adminSidebarPath("audit-trails"),
|
|
icon: <IconEvents />,
|
|
permission: "admin.auditTrails.view",
|
|
},
|
|
{
|
|
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.build",
|
|
title: t("segments.build"),
|
|
path: "",
|
|
items: [
|
|
{
|
|
id: UI_NAV_IDS.adminEntities,
|
|
title: t("models.entity.plural"),
|
|
path: adminSidebarPath("entities"),
|
|
icon: <IconEntities />,
|
|
permission: "admin.entities.view",
|
|
},
|
|
...enabledAdminRouteItem("workflow-engine", {
|
|
id: UI_NAV_IDS.adminWorkflows,
|
|
title: t("models.workflow.plural"),
|
|
path: adminSidebarPath("workflow-engine"),
|
|
icon: <IconWorkflows />,
|
|
isCollapsible: true,
|
|
items: [
|
|
{ id: "ui.nav.admin.workflows.workflows", title: t("models.workflow.plural"), path: adminSidebarPath("workflow-engine/workflows") },
|
|
{ id: "ui.nav.admin.workflows.executions", title: t("app.sidebar.executions"), path: adminSidebarPath("workflow-engine/executions") },
|
|
{ id: "ui.nav.admin.workflows.templates", title: t("models.entity.templates"), path: adminSidebarPath("workflow-engine/templates") },
|
|
{ id: "ui.nav.admin.workflows.credentials", title: t("app.sidebar.credentials"), path: adminSidebarPath("workflow-engine/credentials") },
|
|
{ id: "ui.nav.admin.workflows.variables", title: t("app.sidebar.variables"), path: adminSidebarPath("workflow-engine/variables") },
|
|
],
|
|
}),
|
|
{
|
|
id: UI_NAV_IDS.adminApi,
|
|
title: t("settings.api.title"),
|
|
path: adminSidebarPath("api"),
|
|
icon: <IconKeys />,
|
|
permission: "admin.apiKeys.view",
|
|
hidden: !appConfiguration?.app.features.tenantApiKeys,
|
|
isCollapsible: true,
|
|
items: [
|
|
{ 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.docs", title: t("app.sidebar.docs"), path: adminSidebarPath("api/docs"), permission: "admin.apiKeys.view" },
|
|
{ id: "ui.nav.admin.api.credits", title: t("app.sidebar.credits"), path: adminSidebarPath("api/credits"), permission: "admin.apiKeys.view" },
|
|
],
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminFeatureFlags,
|
|
title: t("app.sidebar.featureFlags"),
|
|
path: adminSidebarPath("feature-flags"),
|
|
icon: <IconFeatureFlags />,
|
|
isCollapsible: true,
|
|
items: [
|
|
{ id: "ui.nav.admin.featureFlags.flags", title: t("app.sidebar.flags"), path: adminSidebarPath("feature-flags/flags"), permission: "admin.featureFlags.view" },
|
|
{ id: "ui.nav.admin.featureFlags.settings", title: t("app.sidebar.settings"), path: adminSidebarPath("feature-flags/settings"), permission: "admin.featureFlags.view" },
|
|
],
|
|
permission: "admin.featureFlags.view",
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminNavigation,
|
|
title: t("admin.navigation.title"),
|
|
path: adminSidebarPath("navigation"),
|
|
icon: <IconNavigation className="size-4" />,
|
|
},
|
|
...enabledAdminRouteItem("portals", {
|
|
id: UI_NAV_IDS.adminPortals,
|
|
title: t("app.sidebar.portals"),
|
|
path: adminSidebarPath("portals"),
|
|
icon: <IconPortals />,
|
|
}),
|
|
],
|
|
},
|
|
{
|
|
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-leads"),
|
|
icon: <IconAnalytics />,
|
|
isCollapsible: true,
|
|
items: [
|
|
{ id: "ui.nav.admin.marketing.leads", title: t("app.sidebar.leads"), path: adminSidebarPath("marketing-leads"), permission: "admin.marketing.leads.view" },
|
|
{ id: "ui.nav.admin.marketing.funnels", title: t("app.sidebar.funnels"), path: adminSidebarPath("marketing-funnels"), permission: "admin.marketing.funnels.view" },
|
|
{ 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",
|
|
},
|
|
...enabledAdminRouteItem("knowledge-base", {
|
|
id: UI_NAV_IDS.adminKnowledgeBase,
|
|
title: t("app.sidebar.knowledgeBase"),
|
|
path: adminSidebarPath("knowledge-base"),
|
|
icon: <IconDocs className="size-4" />,
|
|
isCollapsible: true,
|
|
items: [
|
|
{ id: "ui.nav.admin.knowledgeBase.bases", title: t("app.sidebar.bases"), path: adminSidebarPath("knowledge-base/bases"), permission: "admin.kb.view" },
|
|
{ id: "ui.nav.admin.knowledgeBase.articles", title: t("app.sidebar.articles"), path: adminSidebarPath("knowledge-base/articles"), permission: "admin.kb.view" },
|
|
],
|
|
permission: "admin.kb.view",
|
|
}),
|
|
...enabledAdminRouteItem("help-desk", {
|
|
id: UI_NAV_IDS.adminHelpDesk,
|
|
title: t("app.sidebar.helpDesk"),
|
|
path: adminSidebarPath("help-desk"),
|
|
icon: <IconHelpDesk className="size-4" />,
|
|
isCollapsible: true,
|
|
items: [
|
|
{ id: "ui.nav.admin.helpDesk.feedback", title: t("app.sidebar.feedback"), path: adminSidebarPath("help-desk/feedback") },
|
|
],
|
|
}),
|
|
{
|
|
id: UI_NAV_IDS.adminOnboarding,
|
|
title: t("app.sidebar.onboarding"),
|
|
path: adminSidebarPath("onboarding"),
|
|
icon: <IconOnboarding />,
|
|
isCollapsible: true,
|
|
items: [
|
|
{ id: "ui.nav.admin.onboarding.onboardings", title: t("app.sidebar.onboardings"), path: adminSidebarPath("onboarding/onboardings"), permission: "admin.onboarding.view" },
|
|
{ id: "ui.nav.admin.onboarding.sessions", title: t("app.sidebar.sessions"), path: adminSidebarPath("onboarding/sessions"), permission: "admin.onboarding.view" },
|
|
],
|
|
permission: "admin.onboarding.view",
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminMetrics,
|
|
title: t("app.sidebar.metrics"),
|
|
path: adminSidebarPath("metrics"),
|
|
icon: <IconMetrics />,
|
|
isCollapsible: true,
|
|
items: [
|
|
{ id: "ui.nav.admin.metrics.summary", title: t("app.sidebar.summary"), path: adminSidebarPath("metrics/summary"), permission: "admin.metrics.view" },
|
|
{ id: "ui.nav.admin.metrics.logs", title: t("app.sidebar.logs"), path: adminSidebarPath("metrics/logs"), permission: "admin.metrics.view" },
|
|
{ id: "ui.nav.admin.metrics.settings", title: t("app.sidebar.settings"), path: adminSidebarPath("metrics/settings"), permission: "admin.metrics.view" },
|
|
],
|
|
permission: "admin.metrics.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"),
|
|
isCollapsible: true,
|
|
items: [
|
|
{ id: "ui.nav.admin.settings.profile", title: t("settings.admin.profile.title"), path: adminSidebarPath("settings/profile") },
|
|
{ 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.analytics", title: t("settings.admin.analytics.title"), path: adminSidebarPath("settings/analytics"), permission: "admin.settings.analytics.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.admin.settings.accountTypes", title: t("settings.admin.tenants.types.title"), path: adminSidebarPath("settings/accounts/types"), permission: "admin.accountTypes.view" },
|
|
{ id: "ui.nav.admin.settings.cookies", title: t("settings.admin.cookies.title"), path: adminSidebarPath("settings/cookies"), permission: "admin.settings.cookies.view" },
|
|
{ id: "ui.nav.admin.settings.cache", title: t("settings.admin.cache.title"), path: adminSidebarPath("settings/cache"), permission: "admin.settings.general.update" },
|
|
],
|
|
},
|
|
{
|
|
id: UI_NAV_IDS.adminSwitchToApp,
|
|
title: t("admin.switchToApp"),
|
|
path: routing ? absoluteAppRootPath(routing) : rootAppFallbackPath,
|
|
icon: <IconApp />,
|
|
exact: true,
|
|
},
|
|
],
|
|
},
|
|
];
|