@@ -37,14 +37,16 @@ import {
3737} from '@pnp/sp/taxonomy' ;
3838import { TermItemSuggestion } from './termItem/TermItemSuggestion' ;
3939import { ModernTermPicker } from './modernTermPicker/ModernTermPicker' ;
40- import { IModernTermPickerProps , ITermItemProps } from './modernTermPicker/ModernTermPicker.types' ;
40+ import { IModernTermPickerProps , ITermItemProps , ITermItemStyles } from './modernTermPicker/ModernTermPicker.types' ;
4141import { TermItem } from './termItem/TermItem' ;
4242import { IReadonlyTheme } from '@microsoft/sp-component-base' ;
43+ import { ITermLabel } from '@pnp/sp/taxonomy/types' ;
4344
4445export type Optional < T , K extends keyof T > = Pick < Partial < T > , K > & Omit < T , K > ;
4546
4647export interface IModernTaxonomyPickerProps {
4748 allowMultipleSelections ?: boolean ;
49+ isPathRendered ?: boolean ;
4850 termSetId : string ;
4951 anchorTermId ?: string ;
5052 panelTitle : string ;
@@ -126,12 +128,36 @@ export function ModernTaxonomyPicker(props: IModernTaxonomyPickerProps) {
126128 onClosePanel ( ) ;
127129 }
128130
131+ async function getParentTree ( term : ITermInfo ) : Promise < ITermInfo > {
132+ let currentParent = term . parent ;
133+ if ( ! currentParent ) {
134+ const fullTerm = await taxonomyService . getTermById ( Guid . parse ( props . termSetId ) , Guid . parse ( term . id ) ) ;
135+ currentParent = fullTerm . parent ;
136+ }
137+ if ( ! currentParent ) { // Top-level term reached, no parents.
138+ return undefined ;
139+ } else {
140+ currentParent . parent = await getParentTree ( currentParent ) ;
141+ return currentParent ;
142+ }
143+ }
144+
145+ async function addParentInformationToTerms ( filteredTerms : ITermInfo [ ] ) : Promise < ITermInfo [ ] > {
146+ for ( const filteredTerm of filteredTerms ) {
147+ const termParent = await getParentTree ( filteredTerm ) ;
148+ filteredTerm . parent = termParent ;
149+ }
150+
151+ return filteredTerms ;
152+ }
153+
129154 async function onResolveSuggestions ( filter : string , selectedItems ?: ITermInfo [ ] ) : Promise < ITermInfo [ ] > {
130155 if ( filter === '' ) {
131156 return [ ] ;
132157 }
133158 const filteredTerms = await taxonomyService . searchTerm ( Guid . parse ( props . termSetId ) , filter , currentLanguageTag , props . anchorTermId ? Guid . parse ( props . anchorTermId ) : Guid . empty ) ;
134- const filteredTermsWithoutSelectedItems = filteredTerms . filter ( ( term ) => {
159+ const filteredTermsWithParentInformation = props . isPathRendered ? await addParentInformationToTerms ( filteredTerms ) : filteredTerms ;
160+ const filteredTermsWithoutSelectedItems = filteredTermsWithParentInformation . filter ( ( term ) => {
135161 if ( ! selectedItems || selectedItems . length === 0 ) {
136162 return true ;
137163 }
@@ -171,14 +197,29 @@ export function ModernTaxonomyPicker(props: IModernTaxonomyPickerProps) {
171197 ) ;
172198 }
173199
174- function onRenderItem ( itemProps : ITermItemProps ) : JSX . Element {
175- let labels = itemProps . item . labels . filter ( ( name ) => name . languageTag === currentLanguageTag && name . isDefault ) ;
200+ function getLabelsForCurrentLanguage ( item : ITermInfo ) : ITermLabel [ ] {
201+ let labels = item . labels . filter ( ( name ) => name . languageTag === currentLanguageTag && name . isDefault ) ;
176202 if ( labels . length === 0 ) {
177- labels = itemProps . item . labels . filter ( ( name ) => name . languageTag === currentTermStoreInfo . defaultLanguageTag && name . isDefault ) ;
203+ labels = item . labels . filter ( ( name ) => name . languageTag === currentTermStoreInfo . defaultLanguageTag && name . isDefault ) ;
178204 }
205+ return labels ;
206+ }
179207
208+ function onRenderItem ( itemProps : ITermItemProps ) : JSX . Element {
209+ const labels = getLabelsForCurrentLanguage ( itemProps . item ) ;
210+ let fullParentPrefixes : string [ ] = [ labels [ 0 ] . name ] ;
211+
212+ if ( props . isPathRendered ) {
213+ let currentTermProps = itemProps . item ;
214+ while ( currentTermProps . parent !== undefined ) {
215+ let currentParentLabels = getLabelsForCurrentLanguage ( currentTermProps . parent ) ;
216+ fullParentPrefixes . push ( currentParentLabels [ 0 ] . name ) ;
217+ currentTermProps = currentTermProps . parent ;
218+ }
219+ fullParentPrefixes = fullParentPrefixes . reverse ( ) ;
220+ }
180221 return labels . length > 0 ? (
181- < TermItem languageTag = { currentLanguageTag } termStoreInfo = { currentTermStoreInfo } { ...itemProps } > { labels [ 0 ] . name } </ TermItem >
222+ < TermItem languageTag = { currentLanguageTag } termStoreInfo = { currentTermStoreInfo } { ...itemProps } > { fullParentPrefixes . join ( ":" ) } </ TermItem >
182223 ) : null ;
183224 }
184225
0 commit comments