Skip to content

Commit 522b7c3

Browse files
committed
Merge branch 'AJIXuMuK-user-id' into dev
2 parents 1ab6145 + be3a8c7 commit 522b7c3

File tree

2 files changed

+83
-54
lines changed

2 files changed

+83
-54
lines changed

src/common/utilities/SPHelper.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import * as Constants from '../Constants';
55
import { ListItemAccessor } from '@microsoft/sp-listview-extensibility';
66
import { SPField } from '@microsoft/sp-page-context';
77
import { sp } from '@pnp/sp';
8+
import { SPHttpClient } from '@microsoft/sp-http';
89

910
declare var window: any;
1011

@@ -328,6 +329,39 @@ export class SPHelper {
328329
return viewIdQueryParam || context.pageContext.legacyPageContext.viewId;
329330
}
330331

332+
/**
333+
* Returns the user corresponding to the specified member identifier for the current site
334+
* @param id user id
335+
* @param context SPFx context
336+
*/
337+
public static async getUserById(id: number, context: IContext): Promise<any> {
338+
sp.setup({
339+
spfxContext: context
340+
});
341+
342+
return sp.web.getUserById(id).get();
343+
}
344+
345+
/**
346+
* Returns user profile properties
347+
* @param loginName User's login name
348+
* @param context SPFx context
349+
*/
350+
public static async getUserProperties(loginName: string, context: IContext): Promise<any> {
351+
let url: string;
352+
url = context.pageContext.web.absoluteUrl;
353+
url = GeneralHelper.trimSlash(url);
354+
355+
url += `/_api/SP.UserProfiles.PeopleManager/GetPropertiesFor('${encodeURIComponent(loginName)}')`;
356+
return context.spHttpClient.get(url, SPHttpClient.configurations.v1)
357+
.then((response): Promise<any> => {
358+
return response.json();
359+
})
360+
.then((value) => {
361+
return value;
362+
});
363+
}
364+
331365

332366
private static _updateFieldInSessionStorage(field: ISPField, context: IContext): void {
333367
let loadedViewFields: { [viewId: string]: IFields } = SPHelper._getLoadedViewFieldsFromStorage();

src/controls/fields/fieldUserRenderer/FieldUserRenderer.tsx

Lines changed: 49 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import FieldUserHoverCard, { IFieldUserHoverCardProps } from './FieldUserHoverCa
1515
import * as appInsights from '../../../common/appInsights';
1616

1717
import * as strings from 'ControlStrings';
18+
import { SPHelper } from '../../../common/utilities';
1819

1920
export interface IFieldUserRendererProps extends IFieldRendererProps {
2021
/**
@@ -173,18 +174,18 @@ export class FieldUserRenderer extends React.Component<IFieldUserRendererProps,
173174
<li className={styles.section}>
174175
<div className={styles.header}>{strings.Contact} <Icon iconName="ChevronRight" className={styles.chevron} /></div>
175176
<div className={styles.contactItem}>
176-
<Icon iconName={'Mail'}/>
177+
<Icon iconName={'Mail'} />
177178
<Link className={styles.content} title={user.email} href={`mailto:${user.email}`} target={'_self'}>{user.email}</Link>
178179
</div>
179180
{user.workPhone &&
180181
<div className={styles.contactItem}>
181-
<Icon iconName={'Phone'}/>
182+
<Icon iconName={'Phone'} />
182183
<Link className={styles.content} title={user.workPhone} href={`tel:${user.workPhone}`} target={'_self'}>{user.workPhone}</Link>
183184
</div>
184185
}
185186
{user.cellPhone &&
186187
<div className={styles.contactItem}>
187-
<Icon iconName={'Phone'}/>
188+
<Icon iconName={'Phone'} />
188189
<Link className={styles.content} title={user.cellPhone} href={`tel:${user.cellPhone}`} target={'_self'}>{user.cellPhone}</Link>
189190
</div>
190191
}
@@ -236,67 +237,61 @@ export class FieldUserRenderer extends React.Component<IFieldUserRendererProps,
236237
/**
237238
* Requests User Profile Properties
238239
*/
239-
private _requestUserProfile(user: IFieldUser, index: number): void {
240+
private async _requestUserProfile(user: IFieldUser, index: number): Promise<void> {
240241
if (this._loadedUserProfiles[user.id]) {
241242
return; // we've already have the profile info
242243
}
243244

244245
const context: IContext = this.props.context;
245-
let url: string;
246-
url = context.pageContext.web.absoluteUrl;
247-
url = GeneralHelper.trimSlash(url);
248246

249-
url += `/_api/SP.UserProfiles.PeopleManager/GetPropertiesFor('i%3A0%23.f%7Cmembership%7C${user.email.replace('@', '%40')}')`;
250-
context.spHttpClient.get(url, SPHttpClient.configurations.v1)
251-
.then((response): Promise<any> => {
252-
return response.json();
253-
})
254-
.then((value) => {
255-
const mthumbStr = 'MThumb.jpg';
256-
const userProfileProps: IUserProfileProperties = {
257-
displayName: value.DisplayName,
258-
email: value.Email,
259-
jobTitle: value.Title,
260-
userUrl: value.UserUrl,
261-
pictureUrl: value.PictureUrl && value.PictureUrl.toString().indexOf(mthumbStr) === value.PictureUrl.toString().length - mthumbStr.length ? '' : value.PictureUrl //this._userImageUrl.replace('{0}', user.email)
262-
};
247+
const siteUser = await SPHelper.getUserById(parseInt(user.id), context);
263248

264-
const props: IODataKeyValuePair[] = value.UserProfileProperties as IODataKeyValuePair[];
265-
let foundPropsCount: number = 0;
266-
for (let i = 0, len = props.length; i < len; i++) {
267-
const prop: IODataKeyValuePair = props[i];
268-
switch (prop.Key) {
269-
case 'WorkPhone':
270-
userProfileProps.workPhone = prop.Value;
271-
foundPropsCount++;
272-
break;
273-
case 'Department':
274-
userProfileProps.department = prop.Value;
275-
foundPropsCount++;
276-
break;
277-
case 'SPS-SipAddress':
278-
userProfileProps.sip = prop.Value;
279-
foundPropsCount++;
280-
break;
281-
case 'CellPhone':
282-
userProfileProps.cellPhone = prop.Value;
283-
foundPropsCount++;
284-
break;
285-
}
249+
const value = await SPHelper.getUserProperties(siteUser.LoginName, context);
286250

287-
if (foundPropsCount === 4) {
288-
break;
289-
}
290-
}
251+
const mthumbStr = 'MThumb.jpg';
252+
const userProfileProps: IUserProfileProperties = {
253+
displayName: value.DisplayName,
254+
email: value.Email,
255+
jobTitle: value.Title,
256+
userUrl: value.UserUrl,
257+
pictureUrl: value.PictureUrl && value.PictureUrl.toString().indexOf(mthumbStr) === value.PictureUrl.toString().length - mthumbStr.length ? '' : value.PictureUrl //this._userImageUrl.replace('{0}', user.email)
258+
};
291259

292-
this._loadedUserProfiles[user.id] = userProfileProps;
293-
this.setState((prevState: IFieldUserRendererState, componentProps: IFieldUserRendererProps) => {
294-
const newUsers = _.clone<IFieldUser[]>(prevState.users);
295-
newUsers[index] = this._getUserFromPrincipalAndProps(this.props.users[index], userProfileProps);
260+
const props: IODataKeyValuePair[] = value.UserProfileProperties as IODataKeyValuePair[];
261+
let foundPropsCount: number = 0;
262+
for (let i = 0, len = props.length; i < len; i++) {
263+
const prop: IODataKeyValuePair = props[i];
264+
switch (prop.Key) {
265+
case 'WorkPhone':
266+
userProfileProps.workPhone = prop.Value;
267+
foundPropsCount++;
268+
break;
269+
case 'Department':
270+
userProfileProps.department = prop.Value;
271+
foundPropsCount++;
272+
break;
273+
case 'SPS-SipAddress':
274+
userProfileProps.sip = prop.Value;
275+
foundPropsCount++;
276+
break;
277+
case 'CellPhone':
278+
userProfileProps.cellPhone = prop.Value;
279+
foundPropsCount++;
280+
break;
281+
}
296282

297-
return { users: newUsers };
283+
if (foundPropsCount === 4) {
284+
break;
285+
}
286+
}
287+
288+
this._loadedUserProfiles[user.id] = userProfileProps;
289+
this.setState((prevState: IFieldUserRendererState, componentProps: IFieldUserRendererProps) => {
290+
const newUsers = _.clone<IFieldUser[]>(prevState.users);
291+
newUsers[index] = this._getUserFromPrincipalAndProps(this.props.users[index], userProfileProps);
298292

299-
});
300-
});
293+
return { users: newUsers };
294+
295+
});
301296
}
302297
}

0 commit comments

Comments
 (0)