Skip to content

Commit f5f70c5

Browse files
Styling, anchor term handling, new selection handling
1 parent e9f353f commit f5f70c5

File tree

3 files changed

+159
-84
lines changed

3 files changed

+159
-84
lines changed

src/controls/modernTaxonomyPicker/ModernTaxonomyPicker.tsx

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ import { IIconProps } from 'office-ui-fabric-react/lib/components/Icon';
55
import { PrimaryButton, DefaultButton, IconButton, IButtonStyles } from 'office-ui-fabric-react/lib/Button';
66
import { Label } from 'office-ui-fabric-react/lib/Label';
77
import { Panel, PanelType } from 'office-ui-fabric-react/lib/Panel';
8-
import { ITag, TagPicker } from 'office-ui-fabric-react/lib/Pickers';
8+
import { IBasePickerStyleProps, IBasePickerStyles, ITag, TagPicker } from 'office-ui-fabric-react/lib/Pickers';
99
import { IStackTokens, Stack } from 'office-ui-fabric-react/lib/Stack';
10+
import { IStyleFunctionOrObject } from 'office-ui-fabric-react/lib/Utilities';
1011
import { sp } from '@pnp/sp';
1112
import { SPTaxonomyService } from '../../services/SPTaxonomyService';
1213
import { TaxonomyForm } from './taxonomyForm';
@@ -15,7 +16,8 @@ import * as strings from 'ControlStrings';
1516
import { TooltipHost } from '@microsoft/office-ui-fabric-react-bundle';
1617
import { useId } from '@uifabric/react-hooks';
1718
import { ITooltipHostStyles } from 'office-ui-fabric-react';
18-
import { ITermStoreInfo } from '@pnp/sp/taxonomy';
19+
import { ITermInfo, ITermSetInfo, ITermStoreInfo } from '@pnp/sp/taxonomy';
20+
1921
export interface IModernTaxonomyPickerProps {
2022
allowMultipleSelections: boolean;
2123
termSetId: string;
@@ -36,13 +38,25 @@ export function ModernTaxonomyPicker(props: IModernTaxonomyPickerProps) {
3638
const [selectedOptions, setSelectedOptions] = React.useState<ITag[]>(Object.prototype.toString.call(props.initialValues) === '[object Array]' ? props.initialValues : []);
3739
const [selectedPanelOptions, setSelectedPanelOptions] = React.useState<ITag[]>([]);
3840
const [termStoreInfo, setTermStoreInfo] = React.useState<ITermStoreInfo>();
41+
const [termSetInfo, setTermSetInfo] = React.useState<ITermSetInfo>();
42+
const [anchorTermInfo, setAnchorTermInfo] = React.useState<ITermInfo>();
3943

4044
React.useEffect(() => {
4145
sp.setup(props.context);
4246
taxonomyService.getTermStoreInfo()
4347
.then((localTermStoreInfo) => {
4448
setTermStoreInfo(localTermStoreInfo);
4549
});
50+
taxonomyService.getTermSetInfo(Guid.parse(props.termSetId))
51+
.then((localTermSetInfo) => {
52+
setTermSetInfo(localTermSetInfo);
53+
});
54+
if (props.anchorTermId && props.anchorTermId !== Guid.empty.toString()) {
55+
taxonomyService.getTermById(Guid.parse(props.termSetId), props.anchorTermId ? Guid.parse(props.anchorTermId) : Guid.empty)
56+
.then((localAnchorTermInfo) => {
57+
setAnchorTermInfo(localAnchorTermInfo);
58+
});
59+
}
4660
}, []);
4761

4862
React.useEffect(() => {
@@ -74,14 +88,12 @@ export function ModernTaxonomyPicker(props: IModernTaxonomyPickerProps) {
7488
if (filter === '') {
7589
return [];
7690
}
77-
const filteredTerms = await taxonomyService.searchTerm(Guid.parse(props.termSetId), filter, languageTag, props.anchorTermId ? Guid.parse(props.anchorTermId) : undefined);
91+
const filteredTerms = await taxonomyService.searchTerm(Guid.parse(props.termSetId), filter, languageTag, props.anchorTermId ? Guid.parse(props.anchorTermId) : Guid.empty);
7892
const filteredTermsWithoutSelectedItems = filteredTerms.filter((term) => {
7993
if (!selectedItems || selectedItems.length === 0) {
8094
return true;
8195
}
82-
for (const selectedItem of selectedItems) {
83-
return selectedItem.key !== term.id;
84-
}
96+
return selectedItems.every((item) => item.key !== term.id);
8597
});
8698
const filteredTermsAndAvailable = filteredTermsWithoutSelectedItems.filter((term) => term.isAvailableForTagging.filter((t) => t.setId === props.termSetId)[0].isAvailable);
8799
const filteredTags = filteredTermsAndAvailable.map((term) => {
@@ -100,6 +112,7 @@ export function ModernTaxonomyPicker(props: IModernTaxonomyPickerProps) {
100112
const tooltipId = useId('tooltip');
101113
const hostStyles: Partial<ITooltipHostStyles> = { root: { display: 'inline-block' } };
102114
const addTermButtonStyles: IButtonStyles = {rootHovered: {backgroundColor: "inherit"}, rootPressed: {backgroundColor: "inherit"}};
115+
const tagPickerStyles: IStyleFunctionOrObject<IBasePickerStyleProps, IBasePickerStyles> = { input: {minheight: 34}, text: {minheight: 34} };
103116

104117
return (
105118
<div className={styles.modernTaxonomyPicker}>
@@ -112,6 +125,7 @@ export function ModernTaxonomyPicker(props: IModernTaxonomyPickerProps) {
112125
itemLimit={props.allowMultipleSelections ? undefined : 1}
113126
selectedItems={selectedOptions}
114127
disabled={props.disabled}
128+
styles={tagPickerStyles}
115129
onChange={(itms?: ITag[]) => {
116130
setSelectedOptions(itms || []);
117131
setSelectedPanelOptions(itms || []);
@@ -162,7 +176,8 @@ export function ModernTaxonomyPicker(props: IModernTaxonomyPickerProps) {
162176
allowMultipleSelections={props.allowMultipleSelections}
163177
onResolveSuggestions={onResolveSuggestions}
164178
onLoadMoreData={taxonomyService.getTerms}
165-
getTermSetInfo={taxonomyService.getTermSetInfo}
179+
anchorTermInfo={anchorTermInfo}
180+
termSetInfo={termSetInfo}
166181
termStoreInfo={termStoreInfo}
167182
context={props.context}
168183
termSetId={Guid.parse(props.termSetId)}

0 commit comments

Comments
 (0)