import React from "react";
import styled from "styled-components";
import AdminConfig from "@appsmith/pages/AdminSettings/config";
import {
CategoryType,
type Category,
} from "@appsmith/pages/AdminSettings/config/types";
import { adminSettingsCategoryUrl } from "RouteBuilder";
import { useParams } from "react-router";
import AnalyticsUtil from "utils/AnalyticsUtil";
import { Link, Text } from "design-system";
import { useDispatch, useSelector } from "react-redux";
import { ReduxActionTypes } from "@appsmith/constants/ReduxActionConstants";
import { getCurrentUser } from "selectors/usersSelectors";
import BusinessTag from "components/BusinessTag";
import EnterpriseTag from "components/EnterpriseTag";
import { getTenantPermissions } from "@appsmith/selectors/tenantSelectors";
import { hasAuditLogsReadPermission } from "@appsmith/utils/permissionHelpers";
import {
getFilteredAclCategories,
getFilteredGeneralCategories,
getFilteredOtherCategories,
} from "@appsmith/utils/adminSettingsHelpers";
export const Wrapper = styled.div`
flex-basis: ${(props) => props.theme.sidebarWidth};
overflow-y: auto;
border-right: 1px solid var(--ads-v2-color-border);
flex-shrink: 0;
padding: 12px 0;
&::-webkit-scrollbar {
display: none;
}
> div:not(:first-child) {
border-top: 1px solid var(--ads-v2-color-border);
}
`;
export const HeaderContainer = styled.div`
margin: 12px;
`;
export const StyledHeader = styled(Text)`
height: 20px;
margin: 16px;
color: var(--ads-v2-color-fg-emphasis);
`;
export const CategoryList = styled.ul`
margin: 0;
list-style-type: none;
`;
export const CategoryItem = styled.li`
/* width: 90%; */
`;
export const StyledLink = styled(Link)<{ $active: boolean }>`
padding: 8px 16px;
border-radius: var(--ads-v2-border-radius);
background-color: ${(props) =>
props.$active ? `var(--ads-v2-color-bg-muted)` : ""};
text-decoration: none !important;
.ads-v2-text {
display: flex;
gap: 12px;
align-items: center;
}
&& {
color: var(--ads-v2-color-fg);
}
&:hover {
text-decoration: none;
}
&:hover:not(.active) {
background-color: var(--ads-v2-color-bg-subtle);
}
`;
export const SettingName = styled(Text)<{ active?: boolean }>`
color: ${(props) =>
props.active
? "var(--ads-v2-color-fg-emphasis-plus)"
: "var(--ads-v2-color-fg)"};
font-weight: 400;
`;
export function getSettingsCategory(type: string): Category[] {
return Array.from(
AdminConfig.categories.filter((cat: any) => cat.categoryType === type),
);
}
export function Categories({
categories,
currentCategory,
currentSubCategory,
parentCategory,
showSubCategory,
}: {
categories?: Category[];
parentCategory?: Category;
currentCategory: string;
currentSubCategory?: string;
showSubCategory?: boolean;
}) {
const dispatch = useDispatch();
const triggerAnalytics = (page: string) => {
const source: any = {
"audit-logs": "AuditLogs",
"access-control": "AccessControl",
provisioning: "Provisioning",
};
AnalyticsUtil.logEvent("ADMIN_SETTINGS_CLICK", {
source: source[page],
});
};
const onClickHandler = (category: string, showUpgradeTag: boolean) => {
if (category === "general") {
dispatch({
type: ReduxActionTypes.FETCH_ADMIN_SETTINGS,
});
}
if (showUpgradeTag) {
triggerAnalytics(category);
}
};
return (
{categories?.map((config) => {
const active =
!!currentSubCategory && showSubCategory
? currentSubCategory == config.slug
: currentCategory == config.slug;
const showUpgradeTag = config?.isFeatureEnabled === false;
return (
onClickHandler(config.slug, showUpgradeTag || false)
}
startIcon={showUpgradeTag ? "lock-2-line" : `${config.icon}`}
target="_self"
to={
!parentCategory
? adminSettingsCategoryUrl({ category: config.slug })
: adminSettingsCategoryUrl({
category: parentCategory.slug,
selected: config.slug,
})
}
>
{config.title}
{showUpgradeTag &&
(config?.isEnterprise ? : )}
{showSubCategory && (
)}
);
})}
);
}
export default function LeftPane() {
const categories = getSettingsCategory(CategoryType.GENERAL);
const aclCategories = getSettingsCategory(CategoryType.ACL);
const othersCategories = getSettingsCategory(CategoryType.OTHER);
const { category, selected: subCategory } = useParams() as any;
const user = useSelector(getCurrentUser);
const isSuperUser = user?.isSuperUser;
const tenantPermissions = useSelector(getTenantPermissions);
const isAuditLogsEnabled = hasAuditLogsReadPermission(tenantPermissions);
const filteredGeneralCategories = getFilteredGeneralCategories(categories);
const filteredAclCategories = getFilteredAclCategories(
aclCategories,
isSuperUser,
);
const filteredOthersCategories = getFilteredOtherCategories(
othersCategories,
isSuperUser,
);
return (
{isSuperUser && (
Admin settings
)}
Access control
{isAuditLogsEnabled && (
Others
)}
);
}