* feat: sync org from wecom, pref: member list pagination (#3549) * feat: sync org * chore: fe * chore: loading * chore: type * pref: team member list change to pagination. Edit a sort of list apis. * feat: member update avatar * chore: user avatar move to tmb * chore: init scripts move user avatar * chore: sourceMember * fix: list api sourceMember * fix: member sync * fix: pagination * chore: adjust code * chore: move changeOwner to pro * chore: init v4819 script * chore: adjust code * chore: UserBox * perf: scroll page code * perf: list data * docs:更新用户答疑 (#3576) * docs: add custom uid docs (#3572) * fix: pagination bug (#3577) * 4.8.19 test (#3584) * faet: dataset search filter * fix: scroll page * fix: collection list api old version (#3591) * fix: collection list api format * fix: type error of addSourceMemeber * fix: scroll fetch (#3592) * fix: yuque dataset file folder can enter (#3593) * perf: load members;perf: yuque load;fix: workflow llm params cannot close (#3594) * chat openapi doc * feat: dataset openapi doc * perf: load members * perf: member load code * perf: yuque load * fix: workflow llm params cannot close * fix: api dataset reference tag preview (#3600) * perf: doc * feat: chat page config * fix: http parse (#3634) * update doc * fix: http parse * fix code run node reset template (#3633) Co-authored-by: Archer <545436317@qq.com> * docs:faq (#3627) * docs:faq * docsFix * perf: sleep plugin * fix: selector --------- Co-authored-by: Finley Ge <32237950+FinleyGe@users.noreply.github.com> Co-authored-by: Jiangween <145003935+Jiangween@users.noreply.github.com> Co-authored-by: heheer <heheer@sealos.io>
104 lines
2.7 KiB
TypeScript
104 lines
2.7 KiB
TypeScript
import { Box, HStack, VStack } from '@chakra-ui/react';
|
|
import type { OrgType } from '@fastgpt/global/support/user/team/org/type';
|
|
import Avatar from '@fastgpt/web/components/common/Avatar';
|
|
import { useToggle } from 'ahooks';
|
|
import { useMemo } from 'react';
|
|
import IconButton from './IconButton';
|
|
import { getOrgChildrenPath } from '@fastgpt/global/support/user/team/org/constant';
|
|
|
|
function OrgTreeNode({
|
|
org,
|
|
list,
|
|
selectedOrg,
|
|
setSelectedOrg,
|
|
index = 0
|
|
}: {
|
|
org: OrgType;
|
|
list: OrgType[];
|
|
selectedOrg?: OrgType;
|
|
setSelectedOrg: (org?: OrgType) => void;
|
|
index?: number;
|
|
}) {
|
|
const children = useMemo(
|
|
() => list.filter((item) => item.path === getOrgChildrenPath(org)),
|
|
[org, list]
|
|
);
|
|
const [isExpanded, toggleIsExpanded] = useToggle(index === 0);
|
|
|
|
return (
|
|
<Box userSelect={'none'}>
|
|
<HStack
|
|
borderRadius="sm"
|
|
_hover={{ bg: 'myGray.100' }}
|
|
py={1}
|
|
pr={2}
|
|
pl={index === 0 ? '0.5rem' : `${1.75 * (index - 1) + 0.5}rem`}
|
|
cursor={'pointer'}
|
|
{...(selectedOrg === org
|
|
? {
|
|
bg: 'primary.50 !important',
|
|
onClick: () => setSelectedOrg(undefined)
|
|
}
|
|
: {
|
|
onClick: () => setSelectedOrg(org)
|
|
})}
|
|
>
|
|
{index > 0 && (
|
|
<IconButton
|
|
name={isExpanded ? 'common/downArrowFill' : 'common/rightArrowFill'}
|
|
color={'myGray.500'}
|
|
p={0}
|
|
w={'1.25rem'}
|
|
visibility={children.length > 0 ? 'visible' : 'hidden'}
|
|
onClick={(e) => {
|
|
e.stopPropagation();
|
|
toggleIsExpanded.toggle();
|
|
}}
|
|
/>
|
|
)}
|
|
<HStack
|
|
flex={'1 0 0'}
|
|
onClick={() => setSelectedOrg(org)}
|
|
cursor={'pointer'}
|
|
borderRadius={'xs'}
|
|
>
|
|
<Avatar src={org.avatar} w={'1.25rem'} borderRadius={'xs'} />
|
|
<Box>{org.name}</Box>
|
|
</HStack>
|
|
</HStack>
|
|
{isExpanded &&
|
|
children.length > 0 &&
|
|
children.map((child) => (
|
|
<Box key={child._id} mt={0.5}>
|
|
<OrgTreeNode
|
|
org={child}
|
|
index={index + 1}
|
|
list={list}
|
|
selectedOrg={selectedOrg}
|
|
setSelectedOrg={setSelectedOrg}
|
|
/>
|
|
</Box>
|
|
))}
|
|
</Box>
|
|
);
|
|
}
|
|
|
|
function OrgTree({
|
|
orgs,
|
|
selectedOrg,
|
|
setSelectedOrg
|
|
}: {
|
|
orgs: OrgType[];
|
|
selectedOrg?: OrgType;
|
|
setSelectedOrg: (org?: OrgType) => void;
|
|
}) {
|
|
const root = orgs[0];
|
|
if (!root) return;
|
|
|
|
return (
|
|
<OrgTreeNode org={root} list={orgs} setSelectedOrg={setSelectedOrg} selectedOrg={selectedOrg} />
|
|
);
|
|
}
|
|
|
|
export default OrgTree;
|