Меню

Как сделать выбор ресурса в Корпоративном настраиваемом поле в Project Server (Project Online)?

Добрый день дорогие читатели и коллеги.

Сегодня я хочу поговорить о выборе пользователей в корпоративном поле на карточке проекта. Представим себе, что у нас на карточке есть текстовое поле «Куратор», увы в стандартном функционале Project Server 2013 (2016) есть поля с типом «Стоимость, Флаг, Число, Текст, даже связанные с Таблицей подстановки», но нет поля типа «Человек», но это не беда, данную проблему можно решить при помощи веб-части Редактор контента (Content Editor Web Part) и Javascript (без применения Visual Studio), проделав следующие шаги:

Для начала создадим корпоративное текстовое поле «Куратор»

 

 

Далее на страницу PDP на которой у нас отображаются поля добавим наше созданное поле и веб-часть редактора контента проделав выполнив следующую последовательность действий:

 

 

 

Добавим веб-часть Редактор контента. Веб-часть «Редактор контента» должна быть размещена ниже веб-части полей проекта.

 

Отредактируем содержание веб-части «Редактор контента» добавив следующий JavaScript

<script>

var targetFields = ['Куратор'];
//var targetFields = ['Field 1', 'Field 2'];

//Безопасно загружаем JQuery
if (typeof jQuery == 'undefined') {
var s = document.createElement("script");
s.src = '//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js';
if (s.addEventListener) {
s.addEventListener("load", function () { myJQueryCode() }, false);
} else if (s.readyState) {
s.onreadystatechange = function () { myJQueryCode() };
}
document.getElementsByTagName('head')[0].appendChild(s);
} else {
myJQueryCode();
}

function myJQueryCode() {
$(document).ready(function () {
var scriptRoot = _spPageContextInfo.siteAbsoluteUrl + '/_layouts/15/';

$.when(
$.getScript(scriptRoot + "clienttemplates.js"),
$.getScript(scriptRoot + "clientforms.js"),
$.getScript(scriptRoot + "clientpeoplepicker.js"),
$.getScript(scriptRoot + "autofill.js")
)
.done(function () {
window.console && console.log('Scripts loaded');
renderPeoplePickers();
})
.fail(function (message) {
window.console && console.error('Loading scripts failed: ' + message);
});
});
}

function renderPeoplePickers() {
for (fieldIndex = 0; fieldIndex < targetFields.length; fieldIndex++) {
$("input[type='text'][title='" + targetFields[fieldIndex] + "']").each(function () {
this.style.color = "green";
renderPeoplePicker(this);
window.console && console.log('PeoplePicker rendered: ' + targetFields[fieldIndex]);
});
}
}

function renderPeoplePicker(targetInput) {
var divPeoplePicker = document.createElement('div');
var idPeoplePicker = targetInput.id + '_PeoplePicker';
var targetValue = $(targetInput).attr('value');

divPeoplePicker.id = idPeoplePicker;
$(targetInput).parent().append(divPeoplePicker);

initializePeoplePicker(idPeoplePicker);
var newPeoplePicker = this.SPClientPeoplePicker.SPClientPeoplePickerDict[idPeoplePicker + '_TopSpan'];
$(targetInput).hide();

if (typeof targetValue !== "undefined") {
newPeoplePicker.AddUnresolvedUser({
Key: targetValue,
DisplayText: targetValue
}, true);
}

newPeoplePicker.OnControlResolvedUserChanged = function () {
if (this.TotalUserCount > 0) {
//we have a resolved user
var resolvedUser = this.GetAllUserInfo()[0];

//Set the underlying field value
$('input#' + (this.TopLevelElementId.split("_PeoplePicker_TopSpan")[0])).attr('value', resolvedUser.DisplayText);

//If value has changed then mark the PDP dirty to enable save
//Thankyou to Martin Laukkanen (nearbaseline.com) for this fix!
if ($('input#' + (this.TopLevelElementId.split("_PeoplePicker_TopSpan")[0])).attr('origvalue') !== $('input#' + (this.TopLevelElementId.split("_PeoplePicker_TopSpan")[0])).attr('value'))
{
WPDPParts[0].IsDirty = true;
}
} else {
//we have nothing - so clear out the target field
$('input#' + (this.TopLevelElementId.split("_PeoplePicker_TopSpan")[0])).attr('value', '');
}
}}

function initializePeoplePicker(peoplePickerElementId, defaultValue) {

var users;
if ((defaultValue != undefined) && (defaultValue != "")) {
users = new Array(1);
var defaultUser = new Object();
defaultUser.AutoFillDisplayText = defaultValue;
defaultUser.AutoFillKey = defaultValue;
//defaultUser.Description = user.get_email();
defaultUser.DisplayText = defaultValue;
defaultUser.EntityType = "User";
defaultUser.IsResolved = false;
defaultUser.Key = defaultValue;
defaultUser.Resolved = false;
users[0] = defaultUser;
} else {
users = null;
}

var schema = {};
schema['PrincipalAccountType'] = 'User';
//schema['PrincipalAccountType'] = 'User,DL,SecGroup,SPGroup';
schema['SearchPrincipalSource'] = 15;
schema['ResolvePrincipalSource'] = 15;
schema['AllowMultipleValues'] = false;
schema['MaximumEntitySuggestions'] = 50;
schema['Width'] = '360px';

this.SPClientPeoplePicker_InitStandaloneControlWrapper(peoplePickerElementId, users, schema);
}
</script>

 

Ура наш выбор пользователей работает!

🙂