// Copyright 2024 The Casdoor Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import * as Setting from "./Setting"; import {Avatar, Button, Card, Drawer, Dropdown, Menu, Result, Tooltip} from "antd"; import EnableMfaNotification from "./common/notifaction/EnableMfaNotification"; import {Link, Redirect, Route, Switch, withRouter} from "react-router-dom"; import React, {useState} from "react"; import i18next from "i18next"; import { AppstoreTwoTone, BarsOutlined, DeploymentUnitOutlined, DollarTwoTone, DownOutlined, HomeTwoTone, LockTwoTone, LogoutOutlined, SafetyCertificateTwoTone, SettingOutlined, SettingTwoTone, WalletTwoTone } from "@ant-design/icons"; import Dashboard from "./basic/Dashboard"; import AppListPage from "./basic/AppListPage"; import ShortcutsPage from "./basic/ShortcutsPage"; import AccountPage from "./account/AccountPage"; import OrganizationListPage from "./OrganizationListPage"; import OrganizationEditPage from "./OrganizationEditPage"; import UserListPage from "./UserListPage"; import GroupTreePage from "./GroupTreePage"; import GroupListPage from "./GroupListPage"; import GroupEditPage from "./GroupEditPage"; import UserEditPage from "./UserEditPage"; import InvitationListPage from "./InvitationListPage"; import InvitationEditPage from "./InvitationEditPage"; import ApplicationListPage from "./ApplicationListPage"; import ApplicationEditPage from "./ApplicationEditPage"; import ProviderListPage from "./ProviderListPage"; import ProviderEditPage from "./ProviderEditPage"; import RecordListPage from "./RecordListPage"; import ResourceListPage from "./ResourceListPage"; import CertListPage from "./CertListPage"; import CertEditPage from "./CertEditPage"; import RoleListPage from "./RoleListPage"; import RoleEditPage from "./RoleEditPage"; import PermissionListPage from "./PermissionListPage"; import PermissionEditPage from "./PermissionEditPage"; import ModelListPage from "./ModelListPage"; import ModelEditPage from "./ModelEditPage"; import AdapterListPage from "./AdapterListPage"; import AdapterEditPage from "./AdapterEditPage"; import EnforcerListPage from "./EnforcerListPage"; import EnforcerEditPage from "./EnforcerEditPage"; import SessionListPage from "./SessionListPage"; import TokenListPage from "./TokenListPage"; import TokenEditPage from "./TokenEditPage"; import ProductListPage from "./ProductListPage"; import ProductEditPage from "./ProductEditPage"; import ProductBuyPage from "./ProductBuyPage"; import PaymentListPage from "./PaymentListPage"; import PaymentEditPage from "./PaymentEditPage"; import PaymentResultPage from "./PaymentResultPage"; import PlanListPage from "./PlanListPage"; import PlanEditPage from "./PlanEditPage"; import PricingListPage from "./PricingListPage"; import PricingEditPage from "./PricingEditPage"; import SubscriptionListPage from "./SubscriptionListPage"; import SubscriptionEditPage from "./SubscriptionEditPage"; import SystemInfo from "./SystemInfo"; import SyncerListPage from "./SyncerListPage"; import SyncerEditPage from "./SyncerEditPage"; import WebhookListPage from "./WebhookListPage"; import WebhookEditPage from "./WebhookEditPage"; import LdapEditPage from "./LdapEditPage"; import LdapSyncPage from "./LdapSyncPage"; import MfaSetupPage from "./auth/MfaSetupPage"; import OdicDiscoveryPage from "./auth/OidcDiscoveryPage"; import * as Conf from "./Conf"; import LanguageSelect from "./common/select/LanguageSelect"; import ThemeSelect from "./common/select/ThemeSelect"; import OpenTour from "./common/OpenTour"; import OrganizationSelect from "./common/select/OrganizationSelect"; import AccountAvatar from "./account/AccountAvatar"; import {Content, Header} from "antd/es/layout/layout"; import * as AuthBackend from "./auth/AuthBackend"; import {clearWeb3AuthToken} from "./auth/Web3Auth"; import TransactionListPage from "./TransactionListPage"; import TransactionEditPage from "./TransactionEditPage"; import VerificationListPage from "./VerificationListPage"; function ManagementPage(props) { const [menuVisible, setMenuVisible] = useState(false); function logout() { AuthBackend.logout() .then((res) => { if (res.status === "ok") { const owner = props.account.owner; props.setLogoutState(); clearWeb3AuthToken(); Setting.showMessage("success", i18next.t("application:Logged out successfully")); const redirectUri = res.data2; if (redirectUri !== null && redirectUri !== undefined && redirectUri !== "") { Setting.goToLink(redirectUri); } else if (owner !== "built-in") { Setting.goToLink(`${window.location.origin}/login/${owner}`); } else { Setting.goToLinkSoft({props}, "/"); } } else { Setting.showMessage("error", `Failed to log out: ${res.msg}`); } }); } function renderAvatar() { if (props.account.avatar === "") { return ( {Setting.getShortName(props.account.name)} ); } else { return ( } > {Setting.getShortName(props.account.name)} ); } } function renderRightDropdown() { const items = []; if (props.requiredEnableMfa === false) { items.push(Setting.getItem(<>  {i18next.t("account:My Account")}, "/account" )); } items.push(Setting.getItem(<>  {i18next.t("account:Logout")}, "/logout")); const onClick = (e) => { if (e.key === "/account") { props.history.push("/account"); } else if (e.key === "/subscription") { props.history.push("/subscription"); } else if (e.key === "/logout") { logout(); } }; return (
{ renderAvatar() }     {Setting.isMobile() ? null : Setting.getShortText(Setting.getNameAtLeast(props.account.displayName), 30)}        
); } function renderAccountMenu() { if (props.account === undefined) { return null; } else if (props.account === null) { return ( ); } else { return ( {renderRightDropdown()} { Conf.AiAssistantUrl?.trim() && (
) } {Setting.isAdminUser(props.account) && (props.uri.indexOf("/trees") === -1) && { Setting.setOrganization(value); }} className="select-box" /> }
); } } function getMenuItems() { const res = []; if (props.account === null || props.account === undefined) { return []; } let textColor = "black"; const twoToneColor = props.themeData.colorPrimary; let logo = props.account.organization.logo ? props.account.organization.logo : Setting.getLogo(props.themeAlgorithm); if (props.themeAlgorithm.includes("dark")) { if (props.account.organization.logoDark) { logo = props.account.organization.logoDark; } textColor = "white"; } !Setting.isMobile() ? res.push({ label: logo , disabled: true, key: "logo", style: { padding: 0, height: "auto", }, }) : null; res.push(Setting.getItem({i18next.t("general:Home")}, "/home", , [ Setting.getItem({i18next.t("general:Dashboard")}, "/"), Setting.getItem({i18next.t("general:Shortcuts")}, "/shortcuts"), Setting.getItem({i18next.t("general:Apps")}, "/apps"), ].filter(item => { return Setting.isLocalAdminUser(props.account); }))); if (Setting.isLocalAdminUser(props.account)) { if (Conf.ShowGithubCorner) { res.push(Setting.getItem( 🚀 SaaS Hosting 🔥 , "#")); } res.push(Setting.getItem({i18next.t("general:User Management")}, "/orgs", , [ Setting.getItem({i18next.t("general:Organizations")}, "/organizations"), Setting.getItem({i18next.t("general:Groups")}, "/groups"), Setting.getItem({i18next.t("general:Users")}, "/users"), Setting.getItem({i18next.t("general:Invitations")}, "/invitations"), ])); res.push(Setting.getItem({i18next.t("general:Identity")}, "/identity", , [ Setting.getItem({i18next.t("general:Applications")}, "/applications"), Setting.getItem({i18next.t("general:Providers")}, "/providers"), Setting.getItem({i18next.t("general:Resources")}, "/resources"), Setting.getItem({i18next.t("general:Certs")}, "/certs"), ])); res.push(Setting.getItem({i18next.t("general:Authorization")}, "/auth", , [ Setting.getItem({i18next.t("general:Roles")}, "/roles"), Setting.getItem({i18next.t("general:Permissions")}, "/permissions"), Setting.getItem({i18next.t("general:Models")}, "/models"), Setting.getItem({i18next.t("general:Adapters")}, "/adapters"), Setting.getItem({i18next.t("general:Enforcers")}, "/enforcers"), ].filter(item => { if (!Setting.isLocalAdminUser(props.account) && ["/models", "/adapters", "/enforcers"].includes(item.key)) { return false; } else { return true; } }))); res.push(Setting.getItem({i18next.t("general:Logging & Auditing")}, "/logs", , [ Setting.getItem({i18next.t("general:Sessions")}, "/sessions"), Conf.CasvisorUrl ? Setting.getItem({i18next.t("general:Records")}, "/records") : Setting.getItem({i18next.t("general:Records")}, "/records"), Setting.getItem({i18next.t("general:Tokens")}, "/tokens"), Setting.getItem({i18next.t("general:Verifications")}, "/verifications"), ])); res.push(Setting.getItem({i18next.t("general:Business & Payments")}, "/business", , [ Setting.getItem({i18next.t("general:Products")}, "/products"), Setting.getItem({i18next.t("general:Payments")}, "/payments"), Setting.getItem({i18next.t("general:Plans")}, "/plans"), Setting.getItem({i18next.t("general:Pricings")}, "/pricings"), Setting.getItem({i18next.t("general:Subscriptions")}, "/subscriptions"), Setting.getItem({i18next.t("general:Transactions")}, "/transactions"), ])); if (Setting.isAdminUser(props.account)) { res.push(Setting.getItem({i18next.t("general:Admin")}, "/admin", , [ Setting.getItem({i18next.t("general:System Info")}, "/sysinfo"), Setting.getItem({i18next.t("general:Syncers")}, "/syncers"), Setting.getItem({i18next.t("general:Webhooks")}, "/webhooks"), Setting.getItem({i18next.t("general:Swagger")}, "/swagger")])); } else { res.push(Setting.getItem({i18next.t("general:Admin")}, "/admin", , [ Setting.getItem({i18next.t("general:Syncers")}, "/syncers"), Setting.getItem({i18next.t("general:Webhooks")}, "/webhooks")])); } } const navItems = props.account.organization.navItems; if (!Array.isArray(navItems)) { return res; } if (navItems.includes("all")) { return res; } const resFiltered = res.map(item => { if (!Array.isArray(item.children)) { return item; } const filteredChildren = []; item.children.forEach(itemChild => { if (navItems.includes(itemChild.key)) { filteredChildren.push(itemChild); } }); item.children = filteredChildren; return item; }); return resFiltered.filter(item => { if (item.key === "#" || item.key === "logo") {return true;} return Array.isArray(item.children) && item.children.length > 0; }); } function renderLoginIfNotLoggedIn(component) { if (props.account === null) { sessionStorage.setItem("from", window.location.pathname); return ; } else if (props.account === undefined) { return null; } else if (props.account.needUpdatePassword) { return ; } else { return component; } } function renderRouter() { const account = props.account; const onChangeTheme = props.onChangeTheme; const onfinish = props.onfinish; return ( renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> } /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> renderLoginIfNotLoggedIn()} /> } /> } />} /> ); } function isWithoutCard() { return Setting.isMobile() || window.location.pathname.startsWith("/trees"); } const menuStyleRight = Setting.isAdminUser(props.account) && !Setting.isMobile() ? "calc(180px + 280px)" : "320px"; const onClose = () => { setMenuVisible(false); }; const showMenu = () => { setMenuVisible(true); }; return (
{props.requiredEnableMfa || (Setting.isMobile() ? : )} { renderAccountMenu() }
{isWithoutCard() ? renderRouter() : {renderRouter()} }
); } export default withRouter(ManagementPage);