Клиентская валидация полей на карточке проекта Project Server 2013

Статья Андрея Путина (Компания Бастион-Интегратор), первоначально опубликованная здесь.

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

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

1. Откроем страницу с « Карточкой проекта » и отредактируем ее, нажав на вкладке « Страница » кнопку « Изменить страницу ».

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

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

Перед вставкой в редактор сценариев откорректируем id элементов. Для получения Id элементов откроем страницу « Карточка проекта » в IE 11, откроем панель инструментов Developer Tools нажав F12.
В разделе DOM Explorer выберем пункт меню Select Element (Ctrl+B) найдем Id наших полей.

Откорректируем скрипт вписав валидные Id.

<script type="text/javascript">
function CompareDates(compareElem1,compareElem2)
{
    //Функция сравнения двух дат
    if (compareElem1 != null && compareElem2 != null && Date.parseLocale(compareElem1.value) != null && Date.parseLocale(compareElem2.value) != null && Date.parseLocale(compareElem1.value) >= Date.parseLocale(compareElem2.value))
    {
        //Пользовательское сообщение
        PJAlert('\u0414\u0430\u0442\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0430\u0442\u044b \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f', '\u041e\u0448\u0438\u0431\u043a\u0430', false, null);
        return 0;
    } else return 1;
}

function DateValidation()  
{
    var StartDate;
    var FinishDate;
    var arr = document.getElementsByTagName('input');

    for (var i = 0; i < arr.length; i++)
    {
        if (arr[i].id == 'idCF_3317c796-5fa1-4231-9212-a4c90a2ce05f')  
        {
            //Запоминаем значение StartDate      
            StartDate= arr[i];   
        }  
        if(arr[i].id == 'idCF_940d22dc-9be9-e211-942b-10604b9b497f')  
        {
            //Запоминаем значение FinishDate  
            FinishDate = arr[i];
        }
    }
 
    if(CompareDates(StartDate,FinishDate) == 0)
    {
        for (var i = 0; i < arr.length; i++)
        {  
            //Очищаем не валидное значение
            if(arr[i].id == 'idCF_940d22dc-9be9-e211-942b-10604b9b497f'){arr[i].value='';}
        }
    }
}

function findacontrolForDates()  
{
    var arr = document.getElementsByTagName('input');
    //Поиск контролов дата по Id
    for (var i = 0; i < arr.length; i++)
    {
        if (arr[i].id == 'idCF_3317c796-5fa1-4231-9212-a4c90a2ce05f')  
        {
            //Подписываемся на событие onblur
            document.getElementById(arr[i].id).onblur = DateValidation;
        }  
        if(arr[i].id == 'idCF_940d22dc-9be9-e211-942b-10604b9b497f')  
        {
            //Подписываемся на событие onblur
            document.getElementById(arr[i].id).onblur = DateValidation;
        }
    }
}
findacontrolForDates();
</script> 

Ура наша проверка работает !

P.S. Аналогична может быть реализована валидация на введенные значения в числовые и текстовые поля.

Успехов Вам в Ваших начинаниях!