Delo s ponavljajočimi dogodki v SharePointu

Predstavljajte si primer, ko želimo v SharePointu izdelati sistem razpisovanja dogodkov, na katere se je mogoče tudi prijaviti. Dogodke lahko razpisujemo na določen dan ali več dni, lahko so enkratni ali ponavljajoči.
Ker želimo izdelati čimbolj OOTB (out-of-the-box) rešitev, je najbolj logična pot ta, da uporabimo obstoječi koledar template iz SharePointa. Template za koledar v SharePointu je označen s številko TemplateType=106.

Za namen funkcionalnosti prijave na dogodek ustvarimo šest novih site column-ov:

Name Display Name Type
KoledarCheckInOption Možnost prijave Boolean
KoledarCheckInIndividual Prijava na posamezni dogodek (ponavljajoči dogodki) Boolean
KoledarSigned Prijavljeni UserMulti
KoledarSignedMaybe Prijavljeni (mogoče) UserMulti
KoledarDeclined Zavrnili UserMulti
KoledarMaxNr Maks. št. prijav Number

Vse skupaj zapakiramo v Content Type, ki je inheritan od Content Type-a Event (0x0102).
Ustvarimo torej list definition na osnovi Koledarja (koda 106, kot smo omenili zgoraj). V shemo list definicije dodamo zgornji Content Type.

Sledi, da kreiramo na našem seznamu tri custom forme: NewForm.aspx, EditForm.aspx in DisplayForm.aspx. NewForm in EditForm sta namenjeni temu, da dodatni field KoledarCheckInIndividual onemogočimo v primeru, da field KoledarCheckInOption ni izbran oz. je enako false.  V primeru, da bo uporabnik ob kreiranju dogodka izbral možnost, da se na dogodek lahko prijavimo (KoledarCheckInOption) pod točko 1 in da izbere, da gre za ponavljajoči dogodek pod točko 2, mu pod točko 3 omogočimo možnost prijave na posamezni dogodek (KoledarCheckInIndividual).

sl31

Kar moramo torej storiti, je le, da spišemo custom JS skripto, ki premakne polje KoledarCheckInIndividual znotraj sklopa nastavitev za ponavljajoče dogodke ter ga enabla v primeru, da je bila izbrana možnost prijave. Za dosego tega je najlažja uporaba JQuery-a. JS fajl vključimo v naš custom EditForm.aspx in NewForm.aspx page. JS skripto poženemo šele znotraj document ready eventa -> $(document).ready(function () { … });

V DisplayForm.aspx pa moramo postoriti naslednje:

  • Skriti fielde »Povabljeni«, »Prijavljeni«, »Prijavljeni (mogoče)« in »Zavrnili« v primeru, da gre za navadnega uporabnika (uporabnik ima samo read pravice na koledarju), ter jih pustiti prikazane, če gre za administratorja oz. razpisovalca dogodkov (uporabnika z edit pravicami).
  • Default field »Možnost prijave« popraviti tako, da ne izpisuje izbrane možnosti Da/Ne, ampak namesto nje prikaže možnosti prijave na dogodek kot Toogle Switch. Za ta namen lahko uporabimo spisano JQuery UI komponento https://plugins.jquery.com/toggleswitch/.

sl32

Tukaj velja omeniti, da zapis vaše odločitve iz Toogle Switcha ni mogoče zapisati preko JavaScripta direktno v koledar, ker ima navadni uporabnik na koledarju samo read pravice. V nasprotnem primeru bi lahko spreminjal obstoječe dogodke oz. dodajal nove. Torej rešitev je, da uporabite server-side kodo v nekem servisu, ki ga vključite v SharePoint ISAPI. Preko server-side kode lahko impersionirate drugega uporabnika z več pravicami in zapišete odločitev v item koledarja. JavaScript klic na web servis pa seveda ni nobena težava.

Edina težava oz. največji problem pri vsem skupaj je situacija, ko se uporabnik želi prijaviti samo na eno ponovitev znotraj nekega ponavljajočega dogodka. To je v SharePoint koledarju problem, saj SharePoint ponavljajoči dogodek zapiše zgolj kot en item v koledar in ne vsako ponovitev v svoj item. Kako torej implementirati prijavo zgolj na eno ponovitev?

Vidimo lahko, da imajo navadni dogodki vsak svoj unikaten ID v obliki neke številke. Če pa gremo podrobneje raziskovat ponavljajoče dogodke v SharePointu, lahko ugotovimo, da imajo ti ID v obliki, kot prikazuje ta primer -> 1.0.2017-02-26T11:00:00Z
Gre torej za kombinacijo treh podatkov, ločenih s pikami. Prvi podatek pove dejansko ID itema v koledarju, drugi naj nas ne zanima, tretji pa pove, na kateri datum se nanaša ponovitev, ki si jo trenutno ogledujemo.
Če pa sedaj poizkusimo določeno ponovitev urediti (spremeniti neko podrobnost), izberemo, da bi radi editirali samo to ponovitev in ne cele serije (spodaj na sliki). Naredimo neko spremembo in to shranimo. Če ponovno preverimo ID te ponovitve, opazimo, da se ID sedaj spremeni v obliko, kot prikazuje naslednji primer -> 3.1.1.

sl33

ID sedaj pove, da gre za 3-ti zapis modificirane 1 verzije od ponavljajočega dogodka z ID-jem 1. Drugače povedano, nek ponavljajoči dogodek je zapisan kot en item v koledarju vse dotlej, dokler neki ponovitvi ne spremenimo nekega podatka. Takrat dobi ta ponovitev drug ID (kombinacijo številk) in je s tem ločena od ostalih. To je torej stvar, ki jo moramo doseči tudi mi v naši kodi za shranjevanje odločitve o udeležbi: če neka ponovitev ponavljajočega dogodka še ni kreirana kot svoj item oz. ponovitev oz. nima še svojega ID-ja, je potrebno to storiti pred shranjevanjem podatkov o udeležbi, če želimo, da bo dejansko obiskovalec prijavljen samo na to ponovitev in ne na vse hkrati.

To storimo tako, da vzamemo item celotne serije ponovitev. Skopiramo vse njegove fielde, ki niso read-only, ter nastavimo nekaj posebnosti, kot so:

  • MasterSeriesItemID nastavimo na ID, ki predstavlja ID naše celotne serije ponovitev;
  • EventType nastavimo na 4;
  • UID nastavimo na istega, kot je UID naše celotne serije ponovitev (default nam ga generira vsakič novega);
  • fRecurrence nastavimo na 1;
  • ReccurrenceID in EventDate nastavimo na datum trenutne ponovitve;
  • EndDate izračunamo glede na podatek »Duration« in podatek »EventDate«.

sl34

Lep pozdrav!
Gašper Rupnik

{End.}

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Powered by WordPress.com.

Up ↑

%d bloggers like this: