@@ -40,11 +40,13 @@ import { ModernTermPicker } from './modernTermPicker/ModernTermPicker';
40
40
import { IModernTermPickerProps , ITermItemProps } from './modernTermPicker/ModernTermPicker.types' ;
41
41
import { TermItem } from './termItem/TermItem' ;
42
42
import { IReadonlyTheme } from '@microsoft/sp-component-base' ;
43
+ import { ITermLabel } from '@pnp/sp/taxonomy/types' ;
43
44
44
45
export type Optional < T , K extends keyof T > = Pick < Partial < T > , K > & Omit < T , K > ;
45
46
46
47
export interface IModernTaxonomyPickerProps {
47
48
allowMultipleSelections ?: boolean ;
49
+ isPathRendered ?: boolean ;
48
50
termSetId : string ;
49
51
anchorTermId ?: string ;
50
52
panelTitle : string ;
@@ -126,12 +128,36 @@ export function ModernTaxonomyPicker(props: IModernTaxonomyPickerProps) {
126
128
onClosePanel ( ) ;
127
129
}
128
130
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
+
129
154
async function onResolveSuggestions ( filter : string , selectedItems ?: ITermInfo [ ] ) : Promise < ITermInfo [ ] > {
130
155
if ( filter === '' ) {
131
156
return [ ] ;
132
157
}
133
158
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 ) => {
135
161
if ( ! selectedItems || selectedItems . length === 0 ) {
136
162
return true ;
137
163
}
@@ -171,14 +197,29 @@ export function ModernTaxonomyPicker(props: IModernTaxonomyPickerProps) {
171
197
) ;
172
198
}
173
199
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 ) ;
176
202
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 ) ;
178
204
}
205
+ return labels ;
206
+ }
179
207
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
+ }
180
221
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 >
182
223
) : null ;
183
224
}
184
225
0 commit comments