|
| 1 | +import { useMemo } from 'react'; |
| 2 | +import { useIntl } from '@edx/frontend-platform/i18n'; |
| 3 | +import { getConfig } from '@edx/frontend-platform'; |
| 4 | +import { |
| 5 | + Collapsible, |
| 6 | + Icon, |
| 7 | + Stack, |
| 8 | + useToggle, |
| 9 | +} from '@openedx/paragon'; |
| 10 | +import { |
| 11 | + ExpandLess, ExpandMore, Tag, |
| 12 | +} from '@openedx/paragon/icons'; |
| 13 | + |
| 14 | +import { ContentTagsDrawer, useContentTaxonomyTagsData } from '../../content-tags-drawer'; |
| 15 | +import { useLibraryContext } from '../common/context/LibraryContext'; |
| 16 | +import { useSidebarContext } from '../common/context/SidebarContext'; |
| 17 | +import messages from './messages'; |
| 18 | + |
| 19 | +const ContainerOrganize = () => { |
| 20 | + const intl = useIntl(); |
| 21 | + const [tagsCollapseIsOpen, , , toggleTags] = useToggle(true); |
| 22 | + |
| 23 | + const { readOnly } = useLibraryContext(); |
| 24 | + const { sidebarComponentInfo } = useSidebarContext(); |
| 25 | + |
| 26 | + const containerId = sidebarComponentInfo?.id; |
| 27 | + // istanbul ignore if: this should never happen |
| 28 | + if (!containerId) { |
| 29 | + throw new Error('containerId is required'); |
| 30 | + } |
| 31 | + |
| 32 | + const { data: componentTags } = useContentTaxonomyTagsData(containerId); |
| 33 | + |
| 34 | + const tagsCount = useMemo(() => { |
| 35 | + if (!componentTags) { |
| 36 | + return 0; |
| 37 | + } |
| 38 | + let result = 0; |
| 39 | + componentTags.taxonomies.forEach((taxonomy) => { |
| 40 | + const countedTags : string[] = []; |
| 41 | + taxonomy.tags.forEach((tagData) => { |
| 42 | + tagData.lineage.forEach((tag) => { |
| 43 | + if (!countedTags.includes(tag)) { |
| 44 | + result += 1; |
| 45 | + countedTags.push(tag); |
| 46 | + } |
| 47 | + }); |
| 48 | + }); |
| 49 | + }); |
| 50 | + return result; |
| 51 | + }, [componentTags]); |
| 52 | + |
| 53 | + return ( |
| 54 | + <Stack gap={3}> |
| 55 | + {[true, 'true'].includes(getConfig().ENABLE_TAGGING_TAXONOMY_PAGES) |
| 56 | + && ( |
| 57 | + <Collapsible.Advanced |
| 58 | + open={tagsCollapseIsOpen} |
| 59 | + className="collapsible-card border-0" |
| 60 | + > |
| 61 | + <Collapsible.Trigger |
| 62 | + onClick={toggleTags} |
| 63 | + className="collapsible-trigger d-flex justify-content-between p-2" |
| 64 | + > |
| 65 | + <Stack gap={1} direction="horizontal"> |
| 66 | + <Icon src={Tag} /> |
| 67 | + {intl.formatMessage(messages.organizeTabTagsTitle, { count: tagsCount })} |
| 68 | + </Stack> |
| 69 | + <Collapsible.Visible whenClosed> |
| 70 | + <Icon src={ExpandMore} /> |
| 71 | + </Collapsible.Visible> |
| 72 | + <Collapsible.Visible whenOpen> |
| 73 | + <Icon src={ExpandLess} /> |
| 74 | + </Collapsible.Visible> |
| 75 | + </Collapsible.Trigger> |
| 76 | + <Collapsible.Body className="collapsible-body"> |
| 77 | + <ContentTagsDrawer |
| 78 | + id={containerId} |
| 79 | + variant="component" |
| 80 | + readOnly={readOnly} |
| 81 | + /> |
| 82 | + </Collapsible.Body> |
| 83 | + </Collapsible.Advanced> |
| 84 | + )} |
| 85 | + </Stack> |
| 86 | + ); |
| 87 | +}; |
| 88 | + |
| 89 | +export default ContainerOrganize; |
0 commit comments