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(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: , }, ], }, { id: "ui.nav.admin.manage", title: t("segments.manage"), icon: , path: "", items: [ { id: UI_NAV_IDS.adminAccounts, title: t("app.sidebar.accountsAndUsers"), path: adminSidebarPath("accounts"), icon: , 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: , 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: , permission: "admin.events.view", }, { id: UI_NAV_IDS.adminAuditTrails, title: t("app.sidebar.auditTrails"), path: adminSidebarPath("audit-trails"), icon: , permission: "admin.auditTrails.view", }, { id: UI_NAV_IDS.adminNotifications, title: t("app.sidebar.notifications"), path: adminSidebarPath("notifications"), icon: , 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: , permission: "admin.entities.view", }, ...enabledAdminRouteItem("workflow-engine", { id: UI_NAV_IDS.adminWorkflows, title: t("models.workflow.plural"), path: adminSidebarPath("workflow-engine"), icon: , 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: , 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: , 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: , }, ...enabledAdminRouteItem("portals", { id: UI_NAV_IDS.adminPortals, title: t("app.sidebar.portals"), path: adminSidebarPath("portals"), icon: , }), ], }, { 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: , 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: , 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: , 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: , 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: , 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: , 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: , 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: , exact: true, }, ], }, ];