Skip to content

Commit b8ee05f

Browse files
krdealaarongreenwald
authored andcommitted
add people picker (#132)
1 parent 71e9af3 commit b8ee05f

File tree

10 files changed

+126
-11
lines changed

10 files changed

+126
-11
lines changed

apps/demo/src/app/app.component.html

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ <h2>Getting up and running...</h2>
192192
weekNumberFormatString="Week number {0}"
193193
></fab-calendar-strings>
194194
</fab-calendar>
195-
195+
196196
<fab-marquee-selection [isEnabled]="marqueeEnabled" [selection]="selection">
197197
<fab-details-list
198198
[selection]="selection"
@@ -254,4 +254,6 @@ <h2>Getting up and running...</h2>
254254
<fab-default-button (onClick)="marqueeEnabled = !marqueeEnabled">
255255
Marquee {{ marqueeEnabled === false ? 'Disabled' : 'Enabled' }}
256256
</fab-default-button>
257-
</div>
257+
<fab-people-picker [inputProps]="{placeholder: 'Search for a person'}" [pickerSuggestionsOptions]="{noResultsFoundText: 'No results found', loadingText: 'Loading'}" [selectedItems]="peoplePickerSelectedItems" (onChange)="updatePeoplePickerSelectedItems($event)" [resolveSuggestions]="peoplePickerInputChanged"></fab-people-picker>
258+
<div>{{peoplePickerSelectedItems.length}} item(s) selected in the people picker</div>
259+
</div>

apps/demo/src/app/app.component.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@ import {
77
DropdownMenuItemType,
88
IDropdownOption,
99
ICheckboxProps,
10+
IPersonaProps,
11+
IPeoplePickerProps,
1012
} from 'office-ui-fabric-react';
1113
import { RenderPropOptions } from '@angular-react/core';
1214
import { FabDropdownComponent } from '@angular-react/fabric';
15+
import { FabPeoplePickerComponent } from '@angular-react/fabric/public-api';
1316

1417
const suffix = ' cm';
1518

@@ -44,6 +47,9 @@ export class AppComponent {
4447
console.log(args);
4548
}
4649

50+
peoplePickerSelectedItems: any[] = [{text:"Default person"}];
51+
pickerSuggestions: IPersonaProps[] = [{text: "Bob Jones"},{text: "Steve Fred"}, {text: "Mary"}];
52+
4753
selectedItem?: IDropdownOption;
4854
options: FabDropdownComponent['options'] = [
4955
{ key: 'A', text: 'Option a' },
@@ -157,6 +163,15 @@ export class AppComponent {
157163
return String(value) + suffix;
158164
}
159165

166+
peoplePickerInputChanged(data: any){
167+
const results = this.pickerSuggestions.filter(value => value.text.toLowerCase().indexOf(data.toLowerCase()) > -1);
168+
return new Promise<IPersonaProps[]>((resolve, reject) => setTimeout(() => resolve(results), 250));
169+
}
170+
171+
updatePeoplePickerSelectedItems(items){
172+
this.peoplePickerSelectedItems = items.items;
173+
}
174+
160175
private _hasSuffix(value: string, suffix: string): Boolean {
161176
const subString = value.substr(value.length - suffix.length);
162177
return subString === suffix;
@@ -176,6 +191,7 @@ export class AppComponent {
176191
this.onValidate = this.onValidate.bind(this);
177192
this.onIncrement = this.onIncrement.bind(this);
178193
this.onDecrement = this.onDecrement.bind(this);
194+
this.peoplePickerInputChanged = this.peoplePickerInputChanged.bind(this);
179195
}
180196

181197
customItemCount = 1;

apps/demo/src/app/app.module.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ import {
3434
FabTooltipModule,
3535
FabSpinButtonModule,
3636
FabTextFieldModule,
37+
FabPeoplePickerModule,
38+
FabTagPickerModule,
3739
} from '@angular-react/fabric';
3840
import { NgModule } from '@angular/core';
3941
import { NxModule } from '@nrwl/nx';
@@ -79,6 +81,8 @@ import { CounterComponent } from './counter/counter.component';
7981
FabMarqueeSelectionModule,
8082
FabSpinButtonModule,
8183
FabTextFieldModule,
84+
FabPeoplePickerModule,
85+
FabTagPickerModule
8286
],
8387
declarations: [AppComponent, CounterComponent],
8488
bootstrap: [AppComponent],
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
import {
5+
ChangeDetectionStrategy,
6+
ChangeDetectorRef,
7+
Component,
8+
ElementRef,
9+
NgZone,
10+
Renderer2,
11+
ViewChild,
12+
Output,
13+
EventEmitter,
14+
} from '@angular/core';
15+
import { FabBasePickerComponent } from '../base-picker/base-picker.component';
16+
import { IPersonaProps, IPeoplePickerProps, BaseAutoFill } from 'office-ui-fabric-react';
17+
18+
@Component({
19+
selector: 'fab-people-picker',
20+
exportAs: 'fabPeoplePicker',
21+
template: `
22+
<PeoplePicker
23+
#reactNode
24+
[componentRef]="componentRef"
25+
[resolveDelay]="resolveDelay"
26+
[defaultSelectedItems]="defaultSelectedItems"
27+
[getTextFromItem]="getTextFromItem"
28+
[className]="className"
29+
[pickerCalloutProps]="pickerCalloutProps"
30+
[searchingText]="searchingText"
31+
[disabled]="disabled"
32+
[itemLimit]="itemLimit"
33+
[createGenericItem]="createGenericItem"
34+
[removeButtonAriaLabel]="removeButtonAriaLabel"
35+
[selectedItems]="selectedItems"
36+
[enableSelectedSuggestionAlert]="enableSelectedSuggestionAlert"
37+
[inputProps]="inputProps"
38+
[pickerSuggestionsProps]="pickerSuggestionsProps"
39+
[ItemSelected]="onItemSelected"
40+
[InputChange]="onInputChange"
41+
[EmptyInputFocus]="onEmptyInputFocus"
42+
[ResolveSuggestions]="onResolveSuggestions"
43+
[GetMoreResults]="onGetMoreResults"
44+
[ValidateInput]="onValidateInput"
45+
[RenderItem]="renderItem && onRenderItem"
46+
[RenderSuggestionsItem]="renderSuggestionsItem && onRenderSuggestionsItem"
47+
[Change]="onChangeHandler"
48+
[Focus]="onFocusHandler"
49+
[Blur]="onBlurHandler"
50+
[Dismiss]="onDismissHandler"
51+
[RemoveSuggestion]="onRemoveSuggestionHandler"
52+
>
53+
</PeoplePicker>
54+
`,
55+
styles: ['react-renderer'],
56+
changeDetection: ChangeDetectionStrategy.OnPush,
57+
})
58+
export class FabPeoplePickerComponent extends FabBasePickerComponent<IPersonaProps, IPeoplePickerProps> {
59+
@ViewChild('reactNode', { static: true }) protected reactNodeRef: ElementRef;
60+
61+
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2, ngZone: NgZone) {
62+
super(elementRef, changeDetectorRef, renderer, ngZone);
63+
}
64+
}
65+
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
import { registerElement } from '@angular-react/core';
5+
import { CommonModule } from '@angular/common';
6+
import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';
7+
import * as PeoplePickerItemCss from 'office-ui-fabric-react/lib-amd/components/pickers/PeoplePicker/PeoplePickerItems/PickerItemsDefault.scss';
8+
import { NormalPeoplePickerBase } from 'office-ui-fabric-react';
9+
import { noop } from '../../../utils/noop';
10+
import { FabBasePickerModule } from '../base-picker/base-picker.module';
11+
import { FabPeoplePickerComponent } from './people-picker.component';
12+
13+
// Dummy action to force PeoplePickerItemCss to load and not be tree-shaken away.
14+
noop(PeoplePickerItemCss);
15+
16+
const components = [FabPeoplePickerComponent];
17+
18+
@NgModule({
19+
imports: [CommonModule, FabBasePickerModule],
20+
declarations: components,
21+
exports: components,
22+
schemas: [NO_ERRORS_SCHEMA],
23+
})
24+
export class FabPeoplePickerModule {
25+
constructor() {
26+
// Add any React elements to the registry (used by the renderer).
27+
registerElement('PeoplePicker', () => NormalPeoplePickerBase as any);
28+
}
29+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
export * from './people-picker.component';
5+
export * from './people-picker.module';

libs/fabric/src/lib/components/pickers/public-api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33

44
export * from './base-picker/public-api';
55
export * from './tag-picker/public-api';
6+
export * from './people-picker/public-api';

libs/fabric/src/lib/components/pickers/tag-picker/tag-picker.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ import { FabBasePickerComponent } from '../base-picker/base-picker.component';
5454
changeDetection: ChangeDetectionStrategy.OnPush,
5555
})
5656
export class FabTagPickerComponent extends FabBasePickerComponent<ITag, ITagPickerProps> {
57-
@ViewChild('reactNode') protected reactNodeRef: ElementRef;
57+
@ViewChild('reactNode', { static: true }) protected reactNodeRef: ElementRef;
5858

5959
constructor(elementRef: ElementRef, changeDetectorRef: ChangeDetectorRef, renderer: Renderer2, ngZone: NgZone) {
6060
super(elementRef, changeDetectorRef, renderer, ngZone);

libs/fabric/src/lib/components/pickers/tag-picker/tag-picker.module.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,10 @@
44
import { registerElement } from '@angular-react/core';
55
import { CommonModule } from '@angular/common';
66
import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';
7-
import * as TagItemCss from 'office-ui-fabric-react/lib-amd/components/pickers/TagPicker/TagItem.scss';
87
import { TagPicker } from 'office-ui-fabric-react';
9-
import { noop } from '../../../utils/noop';
108
import { FabBasePickerModule } from '../base-picker/base-picker.module';
119
import { FabTagPickerComponent } from './tag-picker.component';
1210

13-
// Dummy action to force TagItemCss to load and not be tree-shaken away.
14-
noop(TagItemCss);
15-
1611
const components = [FabTagPickerComponent];
1712

1813
@NgModule({

libs/fabric/src/public-api.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,4 @@ export * from './lib/components/text-field/public-api';
3737
export * from './lib/components/toggle/public-api';
3838
export * from './lib/components/tooltip/public-api';
3939
export * from './lib/components/nav/public-api';
40-
41-
// Pickers had some warnings at runtime. Leaving out of public API for now
42-
// export * from './lib/components/pickers/public-api';
40+
export * from './lib/components/pickers/public-api';

0 commit comments

Comments
 (0)