Skip to content

Commit 46738ac

Browse files
committed
Adding support to display matched synonyms as a list like Sharepoint online does
1 parent eb22253 commit 46738ac

3 files changed

Lines changed: 75 additions & 17 deletions

File tree

src/controls/modernTaxonomyPicker/ModernTaxonomyPicker.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,11 @@ export function ModernTaxonomyPicker(props: IModernTaxonomyPickerProps): JSX.Ele
168168
return terms;
169169
}
170170

171+
let searchFilter: string = null;
172+
171173
async function onResolveSuggestions(filter: string, selectedItems?: ITermInfo[]): Promise<ITermInfo[]> {
174+
175+
searchFilter = filter;
172176
if (filter === '') {
173177
return [];
174178
}
@@ -213,6 +217,7 @@ export function ModernTaxonomyPicker(props: IModernTaxonomyPickerProps): JSX.Ele
213217
term={term}
214218
termStoreInfo={currentTermStoreInfo}
215219
languageTag={currentLanguageTag}
220+
searchFilter={searchFilter}
216221
{...itemProps}
217222
/>
218223
);

src/controls/modernTaxonomyPicker/termItem/TermItemSuggestion.tsx

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export interface ITermItemSuggestionProps<T> extends ISuggestionItemProps<T> {
99
term: ITermInfo;
1010
languageTag?: string;
1111
termStoreInfo?: ITermStoreInfo;
12+
searchFilter?: string;
1213
onLoadParentLabel?: (termId: Guid) => Promise<string>;
1314
}
1415

@@ -27,28 +28,44 @@ export function TermItemSuggestion(props: ITermItemSuggestionProps<ITermInfo>):
2728
}
2829
}, []);
2930

30-
let labels: {
31-
name: string;
32-
isDefault: boolean;
33-
languageTag: string;
34-
}[];
31+
const filterLabels = (isDefault: boolean, nameFilter?: (name: string) => boolean): {
32+
name: string;
33+
isDefault: boolean;
34+
languageTag: string;
35+
}[] => {
3536

36-
if (props.languageTag && props.termStoreInfo) {
37-
labels = props.term.labels.filter((name) => name.languageTag === props.languageTag && name.isDefault);
38-
if (labels.length === 0) {
39-
labels = props.term.labels.filter((name) => name.languageTag === props.termStoreInfo.defaultLanguageTag && name.isDefault);
37+
nameFilter = nameFilter || (() => true);
38+
39+
if (props.languageTag && props.termStoreInfo) {
40+
let labels = props.term.labels.filter((name) => name.languageTag === props.languageTag && name.isDefault === isDefault && nameFilter(name.name));
41+
if (labels.length === 0) {
42+
labels = props.term.labels.filter((name) => name.languageTag === props.termStoreInfo.defaultLanguageTag && name.isDefault === isDefault && nameFilter(name.name));
43+
}
44+
return labels;
45+
}
46+
else {
47+
return props.term.labels.filter((name) => name.isDefault === isDefault && nameFilter(name.name));
4048
}
4149
}
42-
else {
43-
labels = props.term.labels.filter((name) => name.isDefault);
44-
}
50+
51+
const labels = filterLabels(true);
52+
const synonyms = props.searchFilter ? filterLabels(false, (name) => {
53+
const prefix = props.searchFilter!;
54+
if (prefix.length > name.length)
55+
return false;
56+
const compareTo = name.substring(0, prefix.length);
57+
return compareTo.localeCompare(prefix, undefined, { sensitivity: 'base' }) === 0;
58+
}) : [];
4559

4660
return (
4761
<div className={styles.termSuggestionContainer} title={labels[0]?.name}>
4862
{labels[0]?.name}
4963
{parentLabel !== "" && <div>
5064
<span className={styles.termSuggestionPath}>{`${strings.ModernTaxonomyPickerSuggestionInLabel} ${parentLabel}`}</span>
5165
</div>}
66+
{synonyms.length > 0 && <ul className={styles.termSynonymList}>
67+
{synonyms.map((synonym) => <li key={synonym.name}><span className={styles.synonymPrefix}>{synonym.name.substring(0, props.searchFilter!.length)}</span><span>{synonym.name.substring(props.searchFilter!.length)}</span></li>)}
68+
</ul>}
5269
</div>
5370
);
5471
}
Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
11
@import '~@fluentui/react/dist/sass/References.scss';
22

3-
html[dir='ltr'] .termSuggestionContainer
3+
html[dir='ltr']
44
{
5-
text-align: left;
5+
.termSuggestionContainer
6+
{
7+
text-align: left;
8+
}
9+
.termSynonymList {
10+
padding-left: 0;
11+
}
612
}
713

8-
html[dir='rtl'] .termSuggestionContainer
14+
html[dir='rtl']
915
{
10-
text-align: right;
16+
.termSuggestionContainer
17+
{
18+
text-align: right;
19+
}
20+
.termSynonymList {
21+
padding-right: 0;
22+
}
1123
}
1224

1325
.termSuggestionContainer
@@ -17,10 +29,34 @@ html[dir='rtl'] .termSuggestionContainer
1729
padding-right: 12px;
1830
padding-bottom: 7px;
1931

20-
.termSuggestionPath
32+
.termSuggestionPath,
33+
.termSynonymList
2134
{
2235
font-size: 12px;
2336
color: #666666;
2437
}
2538

39+
.termSynonymList
40+
{
41+
color: #605e5c;
42+
font-size: var(--ms-fonts-medium-fontSize, 14px);
43+
list-style: none;
44+
margin-block-start: 2px;
45+
margin-top: 2px;
46+
> li
47+
{
48+
&::before
49+
{
50+
content: '';
51+
font-size: 11px;
52+
padding-left: 4px;
53+
}
54+
55+
> span.synonymPrefix
56+
{
57+
font-weight: 600;
58+
}
59+
}
60+
}
61+
2662
}

0 commit comments

Comments
 (0)