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

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