SharePoint

Kolorowy kalendarz SharePoint

Styczeń 28, 2016 2
Podziel się:

Pracując z pakietem SharePoint, wykorzystywanym przez duża grupę ludzi, każdy wcześniej czy później spotka się z problemem kolorowania kalendarza. Możemy chcieć pokolorować go zgodnie z kategoriami wydarzeń, ich priorytetem czy osobą, która to wydarzenie utworzyła. Powiedzmy sobie szczerze: każdy lubi kolory 🙂 Jedno spojrzenie na kolory w kalendarzu sprawi, że znajdziemy poszukiwaną informację. Tego samego nie można powiedzieć o jednokolorowym, nudnym kalendarzu:

Widok kalendarza SharePoint z jednym kolorem

Widok wielokolorowego kalendarza SharePoint

Porównanie kalendarza jednobarwnego z kolorowym

Oczywiście, istnieje możliwość stworzenia kilku kalendarzy w różnych kolorach i nałożenia ich na siebie. Jednak ta opcja nie nadaje się do zastosowania we wszystkich przypadkach i jest ograniczona do dziesięciu kalendarzy na jednym widoku.

Chciałbym Wam zaproponować ciekawsze i równie proste rozwiązanie.

Kolorowanie kalendarza – opis rozwiązania

Przygotowałem kalendarz urlopowy, w którym każda osoba ma przyporządkowany własny kolor. Wykorzystałem do tego dodatkową listę, która przechowuje konfigurację nazwisko – kolor. W widoku kalendarza użyłem edytora skryptów do wprowadzenia skryptu JavaScript. Użytkownik tworzący wydarzenie musi podać w tytule tylko swoje imię i nazwisko, a skrypt zrobi za niego resztę. Przedstawię krok po kroku, jak tego dokonać. Do dzieła!

Lista konfiguracyjna

Pierwszą czynnością, jaką należy wykonać, jest dodanie nowej listy niestandardowej. Wchodzimy w zawartość interesującej nas witryny i “intuicyjnie” wybieramy Dodaj aplikację, a następnie pozycję nazwaną Lista niestandardowa:

3

4

Wprowadzamy nazwę naszej listy. Będzie ona użyta w skrypcie kalendarza.

Dodawanie listy niestandardowej w SharePoint

Na nowo stworzonej liście tworzymy interesujące nas kolumny. Opis jak ukryć kolumnę z tytułem znajdziesz w moim wcześniejszym poście.

Tworzenie kolumn w Sharepoint

Widok utworzonej listy z kolumnami w SharePoint

Lista jest już gotowa. Jak widać, kolumna z kolorami nie jest przyjemna dla użytkownika. Jeśli nie jesteś osobą, która spędziła całe życie na pisaniu stylów CSS, to ciężko wywnioskować, jaki kolor został wybrany. Poprawmy to trochę. Po pierwsze, musimy utworzyć plik z JavaScriptem. Nazwijmy go ColumnColoringScript.js i umieśćmy w nim następujący skrypt:


SP.SOD.executeFunc("clienttemplates.js", "SPClientTemplates", function() {

SPClientTemplates.TemplateManager.RegisterTemplateOverrides( {
    OnPostRender: function(ctx) {

      var rows = ctx.ListData.Row;
      for (var i = 0; i < rows.length; i++) {
        var color = rows[i]["Kolor"];
        var rowId = GenerateIIDForListItem(ctx, rows[i]);
        var row = document.getElementById(rowId);
        $('.ms-vb2:contains(' + color + ')').css('color', color);
      }
    }
  });
});

Plik wrzucamy na naszą stronę i dodajemy do naszej listy. Jak to zrobić?

Dodawanie pliku z JavaScriptem do strony w SharePoint

W moim przypadku ścieżka wyglądała tak:

~site/SiteAssets/ColumnColoringScript.js

Oto efekt, o jaki nam chodziło. Oczywiście, wystarczy lekka modyfikacja skryptu, aby uzyskać inny efekt – w zależności od upodobań.

Lista z dodanym plikiem kolorów JavaScript w SharePoint

Oto przykłady, które można wykorzystać we własnych rozwiązaniach.

Wystarczy tylko podmienić linijkę $(‘.ms-vb2:contains(‘ + color + ‘)’).css(‘color’, color):

Lista z dodanym plikiem kolorów JavaScript w SharePoint - modyfikacja 1

row.style.backgroundColor = color;

Lista z dodanym plikiem kolorów JavaScript w SharePoint - modyfikacja 2

$(‘.ms-vb2:contains(‘ + color + ‘)’).css(‘backgroundColor’, color);

Kalendarz

Wreszcie przechodzimy do kalendarza. W tej chwili sprawa jest prosta: na stronie z kalendarzem musimy dodać dodatkowy WebPart. W kategorii Multimedia i zawartość odnajdujemy Edytor skryptu. Potem klikamy Edytuj wstawkę i wklejamy kod. Po zatwierdzeniu możemy przeładować stronę i cieszyć się kolorowym kalendarzem.


<style>
.ms-acal-item{display:none;}
</style>

 
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
<script type="text/javascript">
 
function WaitForCalendarToLoad() {
   SP.UI.ApplicationPages.SummaryCalendarView.prototype.renderGrids =
            function SP_UI_ApplicationPages_SummaryCalendarView$renderGrids($p0) {
                var $v_0 = new Sys.StringBuilder();
                var $v_1 = $p0.length; for (var $v_2 = 0; $v_2 < $v_1; $v_2++) {
                        this.$7V_2($v_2, $p0[$v_2]);
                }
                for (var $v_3 = 0; $v_3 < $v_1; $v_3++) {
                        $v_0.append('
<div>');
                        this.$I_2.$7Q_1($v_0, $p0[$v_3], $v_3);
                        $v_0.append(this.emptY_DIV);
                        $v_0.append('</div>

');
                }
                this.setInnerHtml($v_0.toString());
                getColoursConfig();
        }
 
        SP.UI.ApplicationPages.CalendarStateHandler.prototype.onItemsSucceed = function ($p0, $p1) {
                if (this.$K_1.$8G_0()) {
                        this.$28_1();
                        return;
                }
                this.$41_1 = false;
                if (this.$3G_1) {
                        this.$D_1.$4T_1();
                        this.$3G_1 = false;
                }
                if (SP.UI.ApplicationPages.SU.$2(this.$39_1[this.$j_1])) {
                        this.$39_1[this.$j_1] = [];
                }
                Array.addRange(this.$39_1[this.$j_1], $p0);
                this.$D_1.$7S_1(this.$j_1, this.$v_1, $p1, this.$39_1[this.$j_1]);
                this.$j_1++;
                this.$1h_1();
                getColoursConfig();
        }
}
 
function getColoursConfig() {
        var siteUrl = '/sites/teamsiites/psd/workspace/sharepoint';
 
        var clientContext = new SP.ClientContext(siteUrl);
        var oList = clientContext.get_web().get_lists().getByTitle('Konfiguracja kalendarza urlopów');
 
        var camlQuery = new SP.CamlQuery();
        camlQuery.set_viewXml('<View></View>');
        this.collListItem = oList.getItems(camlQuery);
 
        clientContext.load(collListItem);
 
        clientContext.executeQueryAsync(
                Function.createDelegate(this, this.onQuerySucceeded),
                Function.createDelegate(this, this.onQueryFailed)
        );
}
 
function onQuerySucceeded(sender, args) {
 
        var listItemEnumerator = collListItem.getEnumerator();
 
        while (listItemEnumerator.moveNext()) {
                var oListItem = listItemEnumerator.get_current();
                var name = oListItem.get_item('Osoba').get_lookupValue();
                var colour = oListItem.get_item('Kolor');
 
                $('a:contains(' + name + ')').closest('.ms-acal-item').css('background-color', colour);
        }
        $('.ms-acal-item').css('display', 'block');
}
 
function onQueryFailed(sender, args) {
        $('.ms-acal-item').css('display', 'block');
        alert('Błąd pobierania listy konfiguracyjnej kolorów kalendarza. ' + args.get_message() + '\n' + args.get_stackTrace());
}
 
function ShowCalendarRibbon () 
{
        setTimeout( function(){
                var defaultWP = document.getElementById( "MSOZoneCell_WebPartWPQ2");
                WpClick( { target:defaultWP,srcElement:defaultWP});
                SP.Ribbon.WebPartComponent.$3.deselectWebPartAndZone = function() { };
        },100);    
}
 
LoadSodByKey("SP.UI.ApplicationPages.Calendar.js", function () {
        WaitForCalendarToLoad();
});
 
$(document).ready(function(){
        ExecuteOrDelayUntilScriptLoaded(ShowCalendarRibbon, "sp.ribbon.js" );
});
 
</script>

Personalizacja skryptu

Oczywiście, nie każdy jest zainteresowany kalendarzem urlopowym lub nie posiada takiej samej listy albo struktury katalogów. To nie problem. Skonfigurujemy każdą rzecz po kolei.

Opis skryptu

Skrypt składa się z kilku części, które możemy wyróżnić:

  • Na początku ukrywane są wydarzenia. Istnieje tu problem natury estetycznej, gdyż kalendarz wyświetla się z domyślnymi kolorami, a skrypt z ułamkiem sekundy opóźnienia nakłada kolory. Jeśli nie ukryjemy wydarzeń, przeskok kolorów będzie widoczny.
  • Funkcja WaitForCalendarToLoad nadpisuje domyślne zdarzenia kalendarza. Usunięcie tej funkcji spowoduje, że kolory w kalendarzu nie nałożą się przy zmianie widoku czy kolejnych miesięcy. Oczekuje ona również na załadowanie się kalendarza przed nałożeniem kolorów.
  • Funkcja getColoursConfig pobiera konfigurację kalendarza z listy wykorzystując SharePoint Client Object Model. Kwerenda wykonywana jest asynchronicznie, a od jej powodzenia zależy wywołanie jednej z kolejnych metod.
  • Funkcja onQuerySucceeded jest wywoływana, gdy uda się pobrać listę konfiguracyjną. Tutaj zawiera się cała magia. Przeglądana jest lista konfiguracyjna i odpowiednie kolory nakładane są na wydarzenia zapisanych osób. Po udanym kolorowaniu wydarzenia te są wyświetlane.
  • Funkcja onQueryFailed uruchamia się przy niepowodzeniu kwerendy. Wyświetla wydarzenia z domyślnymi kolorami i finalizuje swoje działanie komunikatem o błędzie.
  • Funkcja ShowCalendarRibbon jest opcjonalna. Dodając WebPart Edytor Skryptów sprawiamy, że na stronie znajdują się co najmniej dwa WebParty. W takim wypadku SharePoint nie wybiera żadnego z nich jako domyślny, przez co nie widzimy wstążki z opcjami. Ta funkcja ustawia focus na nasz kalendarz.

Wybór listy

Po pierwsze, musimy podać ścieżkę do strony, na której znajduje się nasza lista. To z niej właśnie pobierzemy konfiguracje. Wystarczy podmienić URL:

var siteUrl = '/sites/teamsiites/psd/workspace/sharepoint';

Oczywiście, na naszej stronie może znajdować się więcej niż jedna lista. Nazwę naszej precyzujemy parę linijek niżej:

var oList = clientContext.get_web().get_lists().getByTitle('Konfiguracja kalendarza urlopów');

Wybór kolumn

Ostatnią rzeczą, która może wymagać konfiguracji, jest wybór kolumn z listy:

</pre>
var name = oListItem.get_item('Osoba').get_lookupValue();

var colour = oListItem.get_item('Kolor');
<pre>

Wprowadzamy tutaj nazwę kolumny, po której przeszukujemy listę i kolumny, z której pobieramy kolor. U mnie były to kolumny Osoba i Kolor. W tym właśnie miejscu, w funkcji onQuerySucceeded można dokonywać własnych zmian. Liczba możliwości jest wręcz nieograniczona. Kolumnę Kolor możemy przykładowo zastąpić kolumną z kategorią, a funkcję w skrypcie – na sztywno wpisanymi wartościami kolorów.

Podsumowanie

Powyżej przedstawiłem jeden ze sposobów pokolorowania kalendarza, wykorzystując do tego listę konfiguracyjną. Jak widać, nie jest to trudne, a przeglądany kalendarz jest przyjemny dla oka. Jedyną rzeczą, która może budzić wątpliwości, jest sposób wprowadzenia koloru. Miałem do dyspozycji niestandardowe narzędzie w postaci Color Pickera, które znacznie ułatwia wypełnianie listy konfiguracyjnej.

Ten wpis może świetnie posłużyć jako punkt zaczepienia przy wypracowaniu własnego rozwiązania. Wystarczy podstawowa znajomość JavaScript, aby zmodyfikować funkcję kolorującą. Możemy utworzyć system priorytetów, kategorii czy kolorowania na podstawie pozostałych do wydarzenia dni. Jeśli chcesz zagłębić się w temat, zapraszam do zapoznania się z udostępnionymi poniżej stronami.

Powiązane artykuły

Wspomniane w artykule omówienie tokenów i URLów:
https://msdn.microsoft.com/en-us/library/office/ms431831.aspx

Pobieranie (i nie tylko) elementów z SharePoint’owej listy przy pomocy JavaScript:
https://msdn.microsoft.com/en-us/library/office/hh185007(v=office.14).aspx

Kolorowanie kalendarza po kategorii. Ciekawy wpis na blogu o podobnej tematyce:
http://blog.metrostarsystems.com/2014/07/16/sharepoint-2013-any-color-coded-calendar-step-by-step/

Opis jak wykorzystać workflow do wyświetlenia niestandardowego tytułu wydarzenia:
http://blog.incworx.com/blog/sharepoint-administrators-blog/a-simple-guide-to-show-more-information-on-a-calendar-event

 

Dziękuję za zainteresowanie artykułem! Mam nadzieję, że Twój kalendarz nabierze nowych kolorów.

5 / 5
Kategorie: SharePoint
Konrad Rugała
Autor: Konrad Rugała
Cześć! Mam na imię Konrad. Pracuję na stanowisku SharePoint Developer w Sii Polska. Od kilku lat mam kontakt z różnymi technologiami, z których każda ma coś ciekawego do zaoferowania. Wiedzą, którą zdobędę lubię się dzielić, szczególnie jeśli może się ona okazać pomocna dla innych. SharePoint daje mi pewną okazję, gdyż w polskojęzycznej części Internetu nie jest on popularny. Dlatego zapraszam Cię drogi czytelniku do śledzenia tego bloga.

Imię i nazwisko (wymagane)

Adres email (wymagane)

Temat

Treść wiadomości

komentarze(2)

Cezary
29 stycznia 2016 Odpowiedz

Ciekawe rozwiązanie. Dla osób, które preferują rozwiązania konsultanckie - analogiczny efekt można osiągnąć za pomocą Nakładek tzw. Overlays. Ograniczeniem takiego rozwiązania jest konieczność skorzystania z listy gotowych kolorów oraz limit nakładek na widok (max 9).

avatar'
Jk
3 czerwca 2016 Odpowiedz

A co w przypadku shp 2010?

Zostaw komentarz