Сегодня, в продолжении темы jQuery + SharePoint 2013 Part 1, я поделюсь своими наработками в применении javascript в представлениях списка.
задачи:
Первая задача – выделение жирным одно поле.
Задача два – форматирование в зависимости от значения поля.
Задача три – выделить цветом просроченные.
Задача четыре – статистика по выполнению.
вот полученный результат
Первая
задача – выделение жирным одно поле.
Переопределяем
шаблон отображения
(function () {
var overrideCtx = {};
overrideCtx.Templates = {};
// выделяем жирным поле Created, используем internalName поля
overrideCtx.Templates.Fields = {
'Created': { 'View' : '<#=ctx.CurrentItem.Created#>' },
};
SPClientTemplates.TemplateManager.RegisterTemplateOverrides(overrideCtx);
})();
Задача
два – форматирование в зависимости от значения поля
Добавляем
функцию форматирования
function FormattingRow (inCtx)
{
for (var i =0; i< inCtx.ListData.Row.length; ++i)
{
var listItem = inCtx.ListData.Row[i];
var iid = GenerateIIDForListItem(inCtx, listItem);
var row = document.getElementById(iid);
if (listItem.Status == "Отложенные")
{
if (row != null)
row.style.backgroundColor = "rgba(253,213,152,1)";
}
if (listItem.Status == "В работе")
{
if (row != null)
row.style.backgroundColor = "rgba(201,245,206,1)";
}
}
inCtx.skipNextAnimation = true;
}
Для ее вызова
добавляем
добавляем
overrideCtx.OnPostRender = [ FormattingRow ];
перед
SPClientTemplates.TemplateManager.RegisterTemplateOverrides(overrideCtx);
В предыдущем примере
Задача
три – выделить цветом просроченные
Для
этого нам нужно сравнить текущее время машины с значением поля дата в SharePoint. Но так как поле в SharePoint имеет вид dd.mm.yyyy 00:00
а в javascript текущее время имеет вид Fri Oct 31 09:43:13 UTC+0300 2014.
Нам
нужно преобразрование даты SharePoint в занчение даты с котоым работает
javascript.
В
начале я распарсил значение поля а потом значения передал в функцию которая
преобразует в требуемый формат
function getDateTime(itemData) {
// из даты SP фирмируем дату для корректного сравнения
var arrDate = (itemData.replace(' ','.')).split('.')
var arrTime = arrDate[3].split(':')
var yar = arrDate[2]
var month = arrDate[1]-1
var day = arrDate[0]
var hours = arrTime[0]
var minute = arrTime[1]
var dateTime = new Date (yar,month,day,hours,minute,0)
return dateTime;
}
При
вызове функции передаем значение поля SharePoin и получаем в ответ требуемое
значение даты и времени.
Задача
четыре – статистика по выполнению
Так
как у нас форматирование (окрашивание просроченных и в зависимости от статуса)
проходит циклом по всем элементам вебчасти. То можно добавить переменные для
подсчета количестава (это не сложно). Но возник опрос куда и ка вывести
полученные данные и я решил менять название вебчасти.
Название
можно получить
var titleWP = $( '#WebPartCaption… ').parent().text()
но
что делать, когда на странице несколько веб частей?
У
каждой веб-части на странице есть свой уникальный wpq, вот получив его мы и
можем потом поменять название у конкретной веб-части.
Его
получить можно - inCtx.wpq
Так
вызвать функцию по смене названия
var statistics = 'Всего заявок - ' + allCount +', В работе - ' + workCount + ', Отложенных - ' + deferredCount +', Просроченных - ' +overdueCount
setWPTitle(statistics, inCtx.wpq)
вот
функция смены названия
function setWPTitle(stat, wpq)
{
// изменяем название вебчасти
var newWPQ = '#WebPartCaption'+ wpq // получаем текущую вебчасть
var newTitleWP = ': '+ stat //формируем новое название
$(newWPQ).text(newTitleWP)
}
В веб-частях можно включить ajax и все будет работать. при обновлении содержимого веб-части происходить обновления и цвета и статистики.
Вот весь код :
(function () {
var overrideCtx = {};
overrideCtx.Templates = {};
// выделяем жирным
overrideCtx.Templates.Fields = {
//'Created': { 'View' : '<#=ctx.CurrentItem.Created#>' },
'DueDate1': { 'View' : '<#=ctx.CurrentItem.DueDate1#>' }
};
overrideCtx.OnPostRender = [ FormattingRow ];
SPClientTemplates.TemplateManager.RegisterTemplateOverrides(overrideCtx);
})();
function FormattingRow (inCtx)
{
var deferredCount = 0
var workCount = 0
var overdueCount = 0
var allCount = 0
for (var i =0; i< inCtx.ListData.Row.length; ++i)
{
allCount = allCount+1
var listItem = inCtx.ListData.Row[i];
var iid = GenerateIIDForListItem(inCtx, listItem);
var row = document.getElementById(iid);
var now = new Date() // получаем текущую дату
var itemData = getDateTime(listItem.DueDate1)
if (itemData < now )
{
overdueCount = overdueCount + 1
if (row != null)
row.style.backgroundColor = "rgba(255, 0, 0, 0.5)"; //red
}
else
{
if (listItem.Status == "Отложенные")
{
deferredCount = deferredCount + 1
//alert("listItem.Status");
//row.style.backgroundColor = "rgba(255, 0, 0, 0.5)";
if (row != null)
row.style.backgroundColor = "rgba(253,213,152,1)";
}
if (listItem.Status == "В работе")
{
workCount = workCount + 1
if (row != null)
row.style.backgroundColor = "rgba(201,245,206,1)";
}
}
}
var statistics = 'Всего заявок - ' + allCount +', В работе - ' + workCount + ', Отложенных - ' + deferredCount +', Просроченных - ' +overdueCount
// alert (statistics)
setWPTitle(statistics, inCtx.wpq)
inCtx.skipNextAnimation = true;
}
function setWPTitle(stat, wpq)
{
// изменяем название вебчасти
var newWPQ = '#WebPartCaption'+ wpq // получаем текущую вебчасть
var newTitleWP = ': '+ stat //формируем новое название
$(newWPQ).text(newTitleWP)
}
function getDateTime(itemData) {
// из даты SP фирмируем дату для корректного сравнения
var arrDate = (itemData.replace(' ','.')).split('.')
var arrTime = arrDate[3].split(':')
var yar = arrDate[2]
var month = arrDate[1]-1
var day = arrDate[0]
var hours = arrTime[0]
var minute = arrTime[1]
var dateTime = new Date (yar,month,day,hours,minute,0)
return dateTime;
}
Релевантные ссылки:
Свойство полей readonly и disabled в формах NewForm и EditForm (jQuery + SharePoint 2013 Fields Part 1)
Работа с полями элемента с помощью jQuery (jQuery + SharePoint 2013 Fields Part 3)
Работа с полями элемента с помощью jQuery в EditForm (jQuery + SharePoint 2013 Fields Part 4)

Комментариев нет:
Отправить комментарий