custos-portal/src/components/Groups/GroupDetails.tsx (71 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 React from "react";
import { Link, useParams } from "react-router-dom";
import { NavContainer } from "../NavContainer";
import { PageTitle } from "../PageTitle";
import { FaArrowLeft } from "react-icons/fa6";
import {
Flex,
Icon,
Box,
Text,
Tabs, TabList, TabPanels, Tab, TabPanel
} from "@chakra-ui/react";
import { GroupSettings } from "./GroupSettings";
import { GroupMembers } from "./GroupMembers";
import { useApi } from "../../hooks/useApi";
import { BACKEND_URL } from "../../lib/constants";
interface CustomTabProps {
children: React.ReactNode;
}
const CustomTab = ({ children }: CustomTabProps) => {
return (
<Tab
_selected={{
borderColor: 'default.default',
}}
>
{children}
</Tab>
);
}
export const GroupDetails = () => {
const { id, path } = useParams();
const defaultIndex = path === 'members' ? 1 : 0;
const basicGroupInfo = useApi(`${BACKEND_URL}/api/v1/group-management/groups/${id}`);
return (
<>
<NavContainer activeTab="Groups">
<Link to="/groups">
<Flex alignItems='center' gap={2} color="default.secondary">
<Icon as={FaArrowLeft} />
<Text fontWeight='bold' fontSize='sm'>Back to Groups</Text>
</Flex>
</Link>
<Box mt={4}>
<PageTitle>{basicGroupInfo?.data?.name}</PageTitle>
<Text color="default.secondary" mt={2}>{basicGroupInfo?.data?.description}</Text>
</Box>
<Tabs
defaultIndex={defaultIndex}
onChange={(index) => {
window.history.replaceState(null, '', `/groups/${id}/${index === 0 ? 'settings' : 'members'}`);
}}
isLazy
>
<TabList mt={4}>
<CustomTab>Settings</CustomTab>
<CustomTab>Members</CustomTab>
</TabList>
<TabPanels>
<TabPanel>
<GroupSettings groupId={id} />
</TabPanel>
<TabPanel>
<GroupMembers groupId={id} />
</TabPanel>
</TabPanels>
</Tabs>
</NavContainer>
</>
);
}