2022-06-06 12:14:54 -04:00
|
|
|
import React, { useEffect } from 'react';
|
2022-05-30 00:26:07 -04:00
|
|
|
import styled from 'styled-components/macro';
|
|
|
|
import { useGetRootGlossaryNodesQuery, useGetRootGlossaryTermsQuery } from '../../../graphql/glossary.generated';
|
|
|
|
import { GlossaryNode, GlossaryTerm } from '../../../types.generated';
|
2022-08-01 12:37:34 -04:00
|
|
|
import { sortGlossaryNodes } from '../../entity/glossaryNode/utils';
|
|
|
|
import { sortGlossaryTerms } from '../../entity/glossaryTerm/utils';
|
|
|
|
import { useEntityRegistry } from '../../useEntityRegistry';
|
2022-05-30 00:26:07 -04:00
|
|
|
import NodeItem from './NodeItem';
|
|
|
|
import TermItem from './TermItem';
|
|
|
|
|
|
|
|
const BrowserWrapper = styled.div`
|
|
|
|
color: #262626;
|
|
|
|
font-size: 12px;
|
|
|
|
max-height: calc(100% - 47px);
|
|
|
|
padding: 10px 20px 20px 20px;
|
|
|
|
overflow: auto;
|
|
|
|
`;
|
|
|
|
|
|
|
|
interface Props {
|
|
|
|
rootNodes?: GlossaryNode[];
|
|
|
|
rootTerms?: GlossaryTerm[];
|
|
|
|
isSelecting?: boolean;
|
|
|
|
hideTerms?: boolean;
|
|
|
|
openToEntity?: boolean;
|
|
|
|
refreshBrowser?: boolean;
|
2022-06-08 14:06:01 -04:00
|
|
|
nodeUrnToHide?: string;
|
2022-05-30 00:26:07 -04:00
|
|
|
selectTerm?: (urn: string, displayName: string) => void;
|
|
|
|
selectNode?: (urn: string, displayName: string) => void;
|
|
|
|
}
|
|
|
|
|
|
|
|
function GlossaryBrowser(props: Props) {
|
2022-06-08 14:06:01 -04:00
|
|
|
const {
|
|
|
|
rootNodes,
|
|
|
|
rootTerms,
|
|
|
|
isSelecting,
|
|
|
|
hideTerms,
|
|
|
|
refreshBrowser,
|
|
|
|
openToEntity,
|
|
|
|
nodeUrnToHide,
|
|
|
|
selectTerm,
|
|
|
|
selectNode,
|
|
|
|
} = props;
|
2022-05-30 00:26:07 -04:00
|
|
|
|
2022-06-06 12:14:54 -04:00
|
|
|
const { data: nodesData, refetch: refetchNodes } = useGetRootGlossaryNodesQuery({ skip: !!rootNodes });
|
|
|
|
const { data: termsData, refetch: refetchTerms } = useGetRootGlossaryTermsQuery({ skip: !!rootTerms });
|
2022-05-30 00:26:07 -04:00
|
|
|
|
|
|
|
const displayedNodes = rootNodes || nodesData?.getRootGlossaryNodes?.nodes || [];
|
|
|
|
const displayedTerms = rootTerms || termsData?.getRootGlossaryTerms?.terms || [];
|
|
|
|
|
2022-08-01 12:37:34 -04:00
|
|
|
const entityRegistry = useEntityRegistry();
|
|
|
|
const sortedNodes = displayedNodes.sort((nodeA, nodeB) => sortGlossaryNodes(entityRegistry, nodeA, nodeB));
|
|
|
|
const sortedTerms = displayedTerms.sort((termA, termB) => sortGlossaryTerms(entityRegistry, termA, termB));
|
|
|
|
|
2022-06-06 12:14:54 -04:00
|
|
|
useEffect(() => {
|
|
|
|
if (refreshBrowser) {
|
|
|
|
refetchNodes();
|
|
|
|
refetchTerms();
|
|
|
|
}
|
|
|
|
}, [refreshBrowser, refetchNodes, refetchTerms]);
|
|
|
|
|
2022-05-30 00:26:07 -04:00
|
|
|
return (
|
|
|
|
<BrowserWrapper>
|
2022-08-01 12:37:34 -04:00
|
|
|
{sortedNodes.map((node) => (
|
2022-05-30 00:26:07 -04:00
|
|
|
<NodeItem
|
|
|
|
key={node.urn}
|
|
|
|
node={node}
|
|
|
|
isSelecting={isSelecting}
|
|
|
|
hideTerms={hideTerms}
|
|
|
|
openToEntity={openToEntity}
|
|
|
|
refreshBrowser={refreshBrowser}
|
2022-06-08 14:06:01 -04:00
|
|
|
nodeUrnToHide={nodeUrnToHide}
|
2022-05-30 00:26:07 -04:00
|
|
|
selectTerm={selectTerm}
|
|
|
|
selectNode={selectNode}
|
|
|
|
/>
|
|
|
|
))}
|
|
|
|
{!hideTerms &&
|
2022-08-01 12:37:34 -04:00
|
|
|
sortedTerms.map((term) => (
|
2022-05-30 00:26:07 -04:00
|
|
|
<TermItem key={term.urn} term={term} isSelecting={isSelecting} selectTerm={selectTerm} />
|
|
|
|
))}
|
|
|
|
</BrowserWrapper>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
export default GlossaryBrowser;
|