Files
HiveGrid-Wireframes/hivegrid-cloud/apps/web/app/application/sidebar/AdminSidebar.tsx
T

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,
},
],
},
];