import React, { useMemo } from "react"; import TabList, { TabListProps } from "@mui/lab/TabList"; import { useUser } from "../contexts/UserContext"; import { hasAccess } from "../util/has_access"; import { usePage } from "./Page"; import { Tab } from "./Tab"; export interface TabsProps extends Omit { onChange?: (tab: string) => void; searchParam?: boolean | string; data?: unknown; } export const Tabs: React.FC> = ({ onChange, data, children, scrollButtons = "auto", variant = "scrollable", sx: passedSx, ...props }) => { const page = usePage(); const { user } = useUser(); const sx = useMemo( () => ({ display: "flex", pl: 3, transform: "translateY(1px)", ".MuiTabs-flexContainer": { gap: 3, height: "100%", }, ...passedSx, }), [passedSx], ); const handleTabChange = (_: React.SyntheticEvent, newTab: string) => { page.changeTab(newTab); if (onChange != null) { onChange(newTab); } }; return ( {children} {page.contrib .filter((operation) => operation.method === "GET" && operation.component?.variant === "tab") .map((operation) => { if (operation.component?.predicate && data && !operation.component?.predicate(data)) { return null; } if (!hasAccess(user, operation.component?.permission, operation.component?.group)) { return null; } const value = operation.id.match(/\w+\.contrib:(?.+)/)?.groups?.name; const Icon = operation.component?.icon as React.ComponentType; return ( value && ( } label={operation.component?.title ?? value} value={value} /> ) ); })} ); };