/** * Child Concept Component * Renders a list of child concepts for a given concept. * @todo consider modularizing add and remove buttons * @todo Add dialogue explaining max depth * @todo Improve accessibility of hidden children and max depth disclosures * @todo Handle childConcept and level definition checks more elegantly */ import {useCallback, useContext, useState} from 'react' import {Box, Inline, Stack, Text, Tooltip} from '@sanity/ui' import { AddCircleIcon, ErrorOutlineIcon, InfoOutlineIcon, SquareIcon, ToggleArrowRightIcon, TrashIcon, } from '@sanity/icons' import {useCreateConcept, useRemoveConcept} from '../hooks' import {ChildConceptTerm} from '../types' import {StyledChildConcept, StyledTreeButton, StyledTreeToggle} from '../styles' import {SchemeContext} from './TreeView' import {TreeContext} from './Hierarchy' import {ChildConcepts} from './ChildConcepts' import {ConceptDetailLink} from './ConceptDetailLink' import {ConceptDetailDialogue} from './ConceptDetailDialogue' export const Children = ({concept}: {concept: ChildConceptTerm}) => { const document: any = useContext(SchemeContext) || {} //@ts-expect-error — This is part of the same complaint as in Hierarchy.tsx const {treeVisibility} = useContext(TreeContext) || {} const createConcept = useCreateConcept(document) const removeConcept = useRemoveConcept(document) const handleAddChild = useCallback(() => { createConcept('concept', concept?.id, concept?.prefLabel.en) }, [concept?.id, concept?.prefLabel, createConcept]) const handleRemoveConcept = useCallback(() => { removeConcept(concept.id, 'concept', concept?.prefLabel.en) }, [concept.id, concept?.prefLabel, removeConcept]) const [levelVisibility, setLevelVisibility] = useState(treeVisibility) const handleToggle = useCallback(() => { if (levelVisibility == 'open') { setLevelVisibility('closed') } else if (levelVisibility == 'closed') { setLevelVisibility('open') } }, [levelVisibility]) return ( {concept?.childConcepts && concept.childConcepts.length > 0 && ( )} {concept?.childConcepts && concept.childConcepts.length == 0 && ( )} {!concept?.prefLabel && [new concept]} {!document.displayed?.controls && } {document.displayed?.controls && concept?.level && concept.level < 5 && ( )} {document.displayed?.controls && concept.childConcepts?.length == 0 && concept.level == 5 && ( This concept is at the maximum Taxonomy Manager hierarchy depth of 5 levels. } fallbackPlacements={['right', 'left']} placement="top" > )} {concept?.childConcepts && concept?.childConcepts?.length > 0 && concept.level == 5 && ( This concept has unlisted child concepts. The maximum hierarchy depth is 5 levels. } fallbackPlacements={['right', 'left']} placement="top" > {document.displayed?.controls && ( )} )} {concept?.childConcepts && concept.childConcepts.length > 0 && concept?.level && concept.level < 5 && } ) }