Microsoft любит революции

Microsoft любит революции. Революции в ПО. Windows Vista, Metro UI, Windows 8, SharePoint 2013 Apps, Office 365 — no on-premise…

Хорошо, что Microsoft понимает и похоже начинает любить исправлять ошибки и шагать чуть назад, но уже на твёрдую почву.

Windows 7 исправила суперинтерфейс Vista и довела до ума UAC.
Windows Phone 10 дала возможность широкой настройки телефона, исправив радикальное упрощение 8ки.
Windows 10 вернула было потерянный Пуск и вновь разделила операционки по устройствам.
SharePoint Framework — людям нужно дать возможность делать на клиенте то, что они хотят и легко это устанавливать, тиражировать. Революция 3х видов Apps отгремела и гроза похоже смыла всю пыль.
SharePoint 2016 is not the last on-premise version. Спасибо MS!

Ну а кому двигать прогресс? Google повторил идеи Metro в более спокойном ключе, выждал время, научился на чужих ошибках и вот они опять «на коне».
Нам надо получше разбираться в сути вещей и побольше ценить важность истории.

Спасибо, Microsoft, мы тоже любим тебя!

Рубрика: SharePoint, Windows, WP7, Веб-дизайн, Это интересно | Комментарии (2)

Элемент списка SharePoint 2013 в папку c помощью CSOM

Иногда возникает необходимость перенести элемент списка в папку. Я подумал в сторону SharePoint Designer 2013, но там есть такая возможность для библиотек, но не для обычных списков. Серверный код писать и деплоить не хочется, а вот CSOM в самый раз. Возникли трудности, поэтому делюсь с вами полученным результатом.

sourceUrl — шаблон строки-ссылки на элемент для перемещения
targetUrl — шаблон строки-ссылки на элемент после перемещения в папку

static void MoveListItemToFolder()
{
    int itemToMove = 264;
    string targetFolderName = "Title(folder)";

    string sourceUrl = string.Format("/Lists/Reports/{0}_.000", itemToMove);
    string targetUrl = string.Format("https://siteUrl/Lists/Reports/{0}/{1}_.000", targetFolderName, itemToMove);

    SP.ClientContext clientContext = new SP.ClientContext(SiteUrl);

    File file = clientContext.Web.GetFileByServerRelativeUrl(sourceUrl);
    clientContext.Load(file, f => f.Name, f => f.TimeCreated);

    clientContext.ExecuteQuery();

    Console.WriteLine("Make sure! File {0} {1}", file.Name, file.TimeCreated);
    
    file.MoveTo(targetUrl, MoveOperations.Overwrite);
    clientContext.ExecuteQuery();

    Console.ReadLine();
}
Рубрика: Без рубрики | Добавить комментарий

Заметка: SharePoint loading.gif

sp-working-on-it

Для тех, кто так же как я забывает местоположение стандартного файла SharePoint с анимацией загрузки вот новый пост.
Ну а если кто-то не подумал использовать его в проектах, то вот она готовая анимация, которую не нужно отдельно деплоить.

Вот картинки в SP2013:

  • вашСайт/_layouts/images/loading.gif — зелёная змейка движется по кругу с анимацией, мне не очень нравится
  • вашСайт/_layouts/images/loadingcirclests16.gif — серенькая змейка, как на картинке
  • вашСайт/_layouts/images/loading16.gif — серенькое крутящееся солнышко

Лучший подход в разработке — использовать максимум стандартных возможностей, начиная с малого.

Рубрика: Без рубрики | Добавить комментарий

Заметка: Associated file

Не все знают, что за привязку html-шаблона отображения поиска к JS файлу отвечает параметр Associated file (Связанный файл). При снятии галочки, js-шаблон больше не будет синхронизироваться с html-файлом. Точно также для мастер-страниц.

associated

Рубрика: SharePoint, Без рубрики, Это интересно | Добавить комментарий

Установка master-страницы вместе с html шаблоном

В сети, да и в решениях на практике, практически везде встречается такая штука: в SharePoint 2013 со всеми его прелестями шаблонов и js предлагают устанавливать на продакшн только конечный seattle-custom.master или Display Template Item_DefaultPage.js,

master-with-html

А как же кастомизация? Лёгкая доработка и поддержка? Я задался вопросом, но просто так установить оба файла не получится, а надо так: устанавливаем html-файл (если это мастер-страница) с помощью wsp, в событии Feature Activation делаем его извлечение и возврат (чекаут и чекин, публикуем). И вуаля — срабатывает ресивер и создаёт master файл!
Также для html шаблона js. И администраторы снова могут быстро подправить нужный шаблон!

Рубрика: SharePoint, Без рубрики | Добавить комментарий

Заметка: Поменять url SP.UI.ModalDialog

Возможно кому-то пост покажется скучным или капитанским, но:
в диалоге SharePoint SP.UI.ModalDialog можно поменять контент простым вызовом скрипта

//смена url модального диалога SharePoint
window.location.href = "новый url";

Это работает, потому что ModalDialog реализован через iframe.

З.Ы. Если так не нравится, то можно закрыть текущий и открыть новый по кнопке. Делается через dialogReturnValueCallback. Функция принимает проверяет параметр и если приходит необходимый, то вызывает закрытие текущего и открытие нового диалога.

Рубрика: Без рубрики | Добавить комментарий

Ура! Я нашёл как добавлять стили в Masterpage Sharepoint 2013!

Несколько месяцев назад я мучался с проблемой добавления CSS-стилей в напрямую в Html Masterpage без ссылок на файлы. Они удалялись при сохранении! Но решение найдено. Я наткнулся на статью Applying Custom Styles to Page Layouts in SharePoint 2013 и вуаля!

Добавлять теги style нужно на сразу за блоком <!—MS:<asp:ContentPlaceHolder id="PlaceHolderAdditionalPageHead" runat="server">—> вот в таком виде:

<!--MS:<asp:ContentPlaceHolder id="PlaceHolderAdditionalPageHead" runat="server">-->
<!--MS:<style type="text/css">--> 
   #wr_leftNav { display: none !important; } 
<!--ME: </style>-->
Рубрика: Без рубрики | Добавить комментарий

Поиск SharePoint 2013: Managed Property добавленное в Display Template не отображается

При кастомизации отображения результатов поиска SharePoint 2013 иногда приходится добавлять созданные Manager Property. Нужно обновить секцию <mso:ManagedPropertyMapping …>, добавив туда нужные свойства. Но почему свойства могут не отображаться в Display Template?

Потратив несколько часов самостоятельно, поискав решение в интернете, я увидел вот эту статью SharePoint 2013 Search: Managed Property Added to Display Template Doesn’t Appear. В ней говорится, что нужно обновить Result Type, но похоже это действует только если изменения вносились в Display Template конкретного типа.

В моём случае помогла публикация (чекин) Major версии Display Template. Сделать это можно Site Settings > Design Manager > Edit Display Templates, найти нужный и зачекинить. Видимо при этом действии срабатывает ресивер, которые настраивает шаблон для новые свойств. Успехов в SharePoint!

Рубрика: Без рубрики | 1 комментарий

Хорошая статья: Использование CSR и JSLink с SharePoint 2013

Полезная статья, отражающая все самые необходимые моменты кастомизации списков SharePoint 2013 c помощью CSR и JSLink:
Использование JSLink с SharePoint 2013

Однажды, с помощью этой статьи я прикрутил плагин галереи Galleria (Responsive JavaScript Image Gallery) на представление списка. Пишите в комментариях, если кому-то интересно, расскажу.

Рубрика: Без рубрики | Добавить комментарий

Оставить стандартное меню представлений при кастомизации с помощью CSR и JSLink

При кастомизации представлений списков с помощью JSLink часто возникает небольшая проблема: переопределение overrideCtx.Templates.Header переопределяет заодно и меню переключения представлений. Аналогично и с overrideCtx.Templates.Footer. Но есть решение.

Меню выбора представлений

В файле clienttemplates.js (адрес /_layouts/15/clienttemplates.js) содержатся многие стандартные преобразования для представлений. Там можно найти стандартный заголовок — в функции SingleItem_RenderHeaderTemplate(renderCtx) { … }. Для использования кода удобно пользоваться файлом clienttemplates.debug.js.

Наш header будет выглядеть так

...
overrideCtx.Templates.Header = customHeader;
...
function customHeader(ctx) {
    var listSchema = ctx.ListSchema;
    var ret = [];

    ret.push("<div>");
    if (listSchema.RenderViewSelectorPivotMenu == "True")
        ret.push(RenderViewSelectorPivotMenu(ctx));
    else if (listSchema.RenderViewSelectorPivotMenuAsync == "True")
        ret.push(RenderViewSelectorPivotMenuAsync(ctx));
    ret.push("</div>");
	
    //наша добавленная разметка
    ret.push("<div id='galleria' ></div>");
	
    return ret.join("");
}

Вообще, полезно поизучать clienttemplates.debug.js. В этом файле есть часть стандартных JSLink представлений SharePoint 2013.

Рубрика: SharePoint | Добавить комментарий