Zum Inhalt springen
Januar 23, 2013 / delucamarco

Gruppenkalender/Ressourcenkalender – Ressourcen per default anzeigen

Der Gruppenkalender wird gerne auch als Ressourcen-Kalender verwendet. Häufig wird die Anforderung gestellt, dass in der Wochen-Gruppen-Ansicht per default alle Ressourcen (oder auch nur ein Teil davon) im Kalender angezeigt werden. Das ist von Haus mit SharePoint 2010 leider nicht möglich. Die hineingeladenen Ressourcen werden bei jedem Aufruf der Seite wieder entfernt.

Das folgende JavaScript schafft hier Abhilfe, JavaScript-Datei (resources.js) für Ressourcen-Kalender:

var listItems;

function getListItems()

{

//Get all Resources from Resourcelist

var context = SP.ClientContext.get_current();

var web = context.get_web();

var camlQuery = new SP.CamlQuery();

camlQuery.set_viewXml(‚<View></View>‘);

var list = web.get_lists().getByTitle(„Resources“);

context.load(list);

listItems = list.getItems(camlQuery);

context.load(listItems);

context.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));

}

function onQuerySucceeded()

{

setDefaultResources();

}

function onQueryFailed(sender, args) {

alert(‚Request failed. ‚ + args.get_message() + ‚\n‘ + args.get_stackTrace());

}

function setDefaultResources()

{

var xml = ‚\u003cEntities Append=\u0022False\u0022 Error=\u0022\u0022 DoEncodeErrorMessage=\u0022True\u0022 Separator=\u0022;\u0022 MaxHeight=\u00223\u0022\u003e‘;

var listItemEnumerator = listItems.getEnumerator();

while (listItemEnumerator.moveNext())

{

var listItem = listItemEnumerator.get_current();

xml += ‚\u003cEntity Key=\u0022’+ listItem.get_item(‚Title‘) +’\u0022 DisplayText=\u0022’+ listItem.get_item(‚Title‘) +’\u0022 IsResolved=\u0022True\u0022 Description=\u0022\u0022\u003e\u003cExtraData\u003e\u003cArrayOfDictionaryEntry xmlns:xsi=\u0022http:\u002f\u002fwww.w3.org\u002f2001\u002fXMLSchema-instance\u0022 xmlns:xsd=\u0022http:\u002f\u002fwww.w3.org\u002f2001\u002fXMLSchema\u0022\u003e\u003cDictionaryEntry\u003e\u003cKey xsi:type=\u0022xsd:string\u0022\u003eSPResourceId\u003c\u002fKey\u003e\u003cValue xsi:type=\u0022xsd:string\u0022\u003e’+ listItem.get_id() +’\u003c\u002fValue\u003e\u003c\u002fDictionaryEntry\u003e\u003cDictionaryEntry\u003e\u003cKey xsi:type=\u0022xsd:string\u0022\u003ePrincipalType\u003c\u002fKey\u003e\u003cValue xsi:type=\u0022xsd:string\u0022\u003eResource\u003c\u002fValue\u003e\u003c\u002fDictionaryEntry\u003e\u003c\u002fArrayOfDictionaryEntry\u003e\u003c\u002fExtraData\u003e\u003cMultipleMatches \u002f\u003e\u003c\u002fEntity\u003e‘;

}

xml += ‚\u003c\u002fEntities\u003e‘;

var sel = SP.UI.ApplicationPages.CalendarSelector.instance().getSelector(1, „<ID-des-Kalender-WebParts>“); //for example „WPQ2“ for ID

sel.selectEntities(xml, true);

}

ExecuteOrDelayUntilScriptLoaded(getListItems, „sp.ribbon.js“);

Nun muss die resources.js Datei in die SiteAssets Bibliothek der Site geladen werden, auf der der Gruppenkalender angelegt wurde.

Anschließend muss in einem Content-Editor WebPart, auf der Kalender Seite folgender JavaScript-Code eingefügt werden.

Dazu sollte das Content-Editor WebPart nach dem Kalender WebPart eingefügt werden.

1

Anschließend muss in das Content Editor WebPart geklickt werden und im Ribbon unter „Format Text“ der Button HTML -> Edit HTML Source angeklickt werden.

Daraufhin öffnet sich ein Popup, in das der unten aufgelistete Javascript Code eingetragen werden muss:

2

<!–JavaScript JavaScript COM Files –>

<script src="http://ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js" type="text/javascript"></script><script src="/<sitename>/14/_layouts/sp.runtime.js" type="text/javascript"></script><script src="/<sitename>/14/_layouts/sp.js" type="text/javascript"></script>

<!–JavaScript JSOM Files –>

<script src=“/<sitename>/siteassets/resources.js“ type=“text/javascript“></script>

Damit das Content Editor WebPart später auf der Seite nicht mehr zu sehen ist, sollte in den WebPart Eigenschaften der Chrome Type auf None gestellt werden:

1.1

Nun Lädt SharePoint künftig alle Ressourcen aus der Liste Ressourcen in den Gruppen-Kalender.

Mit etwas mehr Aufwand ließe sich auch eine Auswahl realisieren, die nur bestimmte Objekte anzeigt.

______________________________________________________________

Vielleicht noch zur Erklärung, dieser etwas verwirrende String, der der xml Variablen zugewiesen wird ist ein encodierter XML String. Hier noch der decodierte Ausdruck:

'<Entity Key="'+ listItem.get_item('Title') +'" DisplayText="'+ listItem.get_item('Title') +'" IsResolved="True" Description=""><ExtraData><ArrayOfDictionaryEntry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><DictionaryEntry><Key xsi:type="xsd:string">SPResourceId</Key><Value xsi:type="xsd:string">'+ listItem.get_id() +'</Value></DictionaryEntry><DictionaryEntry><Key xsi:type="xsd:string">PrincipalType</Key><Value xsi:type="xsd:string">Resource</Value></DictionaryEntry></ArrayOfDictionaryEntry></ExtraData><MultipleMatches /></Entity>'

12 Kommentare

Kommentar verfassen
  1. Matthias / Aug 8 2013 12:16 pm

    Hallo delucamarco,

    ich bekomme das Script einfach nicht zum laufen.
    Bei mir heisst die Ressourcen Liste „Fahrzeuge“; Spalte „Fahrzeug“ enthält die Ressourcen. (Manuelles hinzufügen und anzeigen funktioniert bis zum reload der Seite)

    Also hab ich folgende Zeilen „korrigiert“
    var list = web.get_lists().getByTitle(“Resources”);
    ->
    var list = web.get_lists().getByTitle(“Fahrzeuge”);

    xml += ‘\u003cEntity Key=\u0022′+ listItem.get_item(‘Title’) +’\u0022 DisplayText=\u0022′+ listItem.get_item(‘Title’) +’\u0022
    ->
    xml += ‘\u003cEntity Key=\u0022′+ listItem.get_item(‘Fahrzeug’) +’\u0022 DisplayText=\u0022′+ listItem.get_item(‘Fahrzeug’) +’\u0022

    Bei der ID des Webparts bin ich mir nicht 100% sicher wie das genau heisst, wo finde ich die ID genau? Ich finde nur eine ID: WebPartWPQ3 im Sourcecode die ev. passen könnte.

    Hast du ev. einen Tipp für mich bitte?

  2. delucamarco / Aug 8 2013 1:02 pm

    Hallo Matthias,

    zunächst mal vielen Dank für deinen Kommentar. Ich habe eben den Beitrag nochmals überarbeitet, weil ich feststellen musste, dass er an zwei Stellen undeutlich geschrieben war.

    Folgende Hinweise habe ich für dich:

    Zunächst sollte die resources.js Datei in die SiteAssets Bibliothek auf der Site hochgeladen werden, die den Gruppenkalender enthält.

    Außerdem muss der Code im Content-Editor WebPart auch noch entsprechend angepasst werden, wichtig ist, dass hier der Pfad zu den Javascript-Dateien stimmt (das kannst du im Browser durch direktes Eingeben des Pfades prüfen). Du kannst dich am folgenden Code Snippet orientieren. Ersetze einfach <sitename> durch den relativen URL zu deiner Site.

    <script src="/<sitename>/_layouts/15/sp.runtime.js“ type=“text/javascript“><script src="/<sitename>/_layouts/15/sp.js“ type=“text/javascript“>

    <script src="/<sitename>/siteassets/resources.js“ type=“text/javascript“>

    Die ID deines WebParts müsste folglich WPQ3 lauten.

    Bei Spalten- und Listenname musst du außerdem darauf achten, dass du den Internalname verwendest.

    Viel Erfolg,
    solltest du noch Schwierigkeiten haben, kannst du dich gerne nochmal melden.

    Marco De Luca

  3. Matthias / Aug 8 2013 1:49 pm

    Hallo (leider) nochmal,

    vorab schonmal danke für die Unterstützung!

    ich habe die SPL seite nochmal gelöscht und von anfang an angefangen ohne bereits bearbeitete Listen. Kalender ist ein Ressourcenkalender, Ressourcen Liste existiert mit 3 Einträgen und die Ressourcen können zum Kalender manuell hinzugefügt werden. (Basis sollte also passen).

    Ich meinen Code mal hier hochgeladen, ev. fällt dir noch etwas auf. Das einzige was ich bemerkt habe war dass beim Webpart der Ajaxlink nicht mehr exisitert und mit einem ; statt “ geschlossen wurde.

    Liegt es ev. daran dass ich die deutsche version habe und daher die Codeteile nicht zusammenpassen?

    resources.js: http://www.img-hoster.de/uploads/2013/08/i1597bvtb0n.png
    Webpart: http://www.img-hoster.de/uploads/2013/08/i1596bltx9w.png

    • delucamarco / Aug 8 2013 4:16 pm

      Hallo Matthias,

      WordPress hat meinen Code leider etwas verhunzt, habe nun aber einen Workarround gefunden damit er manche Zeichen nicht escaped. Wie dem auch sei…

      Ist der SharePoint eine deutsche Installation oder ist es ein englischer SharePoint mit deutschem Language Pack?

      Wobei, die Sprache dürfte da eigentlich keine Rolle spielen, höchstens vielleicht bei den Namen für die Liste und die Spalte. Wobei sich der internal-name da nicht unterscheiden dürfte.

      Wichtig ist, dass du wie bereits gesagt in der resources.js, die internal-names von Spalten und Listen verwendest, die Bezeichnung, die auch im URL jeweils verwendet werden (Sicher, dass die Spalte Title heißt?, Sicher dass die Liste Ressourcen heißt?). Ansonsten sieht die resources.js gut aus.

      Beim Screenshot deines Webparts fällt mir auf, dass beim kopieren meines Codes das “ encoded (&#8221;) wurde:

      Die Source für Ajax lautet: „http://ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js“ das &#8221; muss durch ein “ ersetzt werden.

      Außerdem, abhängig von der Tolleranz deines Browsers werden unter Umständen die // vor Fahrzeugvergabe nicht korrekt interpretiert.

      [edit] wie ich nun bei genauerem hinsehen festgestellt habe, muss der Javascript Code im HTML-Source Modus des CEWP eingefügt werden. Außerdem muss das CEWP nach dem Kalender WebPart eingefügt werden.[/edit]

      Viel Erfolg

      Grüße
      Marco De Luca

  4. Mike / Aug 16 2013 1:57 pm

    Hallo Marco
    nach einigen Versuchen hat es bei mir auch funktioniert.
    Ich habe nun eine Frage die die Reservation betrifft. Wenn ich nun einen Raum reservieren möchte sind alle Räume voreingestellt. Kann ich dies auch unterbinden? Optimal wäre, wenn der aktuell selektierte Raum ausgewählt ist.

    Wenn dies nicht möglich ist, dann am liebsten kein ausgewählter Raum.

    Kann man da was machen?

    Vielen Dank.

    Gruss Mike

    • delucamarco / Sept 1 2013 9:38 pm

      Hallo Mike,

      zunächst mal Entschuldigung für die späte Antwort, ich war ziemlich beschäftigt in den letzten Wochen.

      Zu deiner Frage: wenn du eine Ressource in der Wochen-Gruppen Ansicht buchst werden im Formular die Ressourcen alle automatisch hinzugefügt. Ich bin mit relativ sicher, dass es mit etwas Entwicklungsaufwand möglich ist, die Ressourcen alle zu deselektieren. Das müsste ich mir bei Gelegenheit mal etwas genauer ansehen.

      Grüße Marco

  5. Matthias / Sept 4 2013 1:21 pm

    Hallo Marco, hätte auch noch eine Frage, da ich bei der Ressource rel. viele Zeilen mitauslese wird mir die Zelle der Ressource zu klein.
    Die Höhe kann ich über JScript variieren, aber wenn ich die Breite ebenfalls vergrößere, dann wird der Text trotzdem abgeschnitten.

    kann man hier die MaxWidth auch mitübergeben, wenn ja mit welchem Parameter? Ev. wird dann das Feld breiter und ich sehe alle infos.

    var xml = ‘\u003cEntities Append=\u0022False\u0022 Error=\u0022\u0022 DoEncodeErrorMessage=\u0022True\u0022 Separator=\u0022;\u0022 MaxHeight=\u00223\u0022\u003e’;

  6. Thorsten / Okt 28 2013 9:50 am

    Lässt sich dieser Workarround auch auf SP2013 anwenden?

    • delucamarco / Okt 28 2013 5:27 pm

      Offiziell ist der Ressourcenkalender in 2013 deprecated. Er ist nur noch aus Abwärtskompatibilitätsgründen (was ein Wort 🙂 ) vorhanden. Es gibt aber die Möglichkeit die Ressourcenliste und die Verknüpfung mit dem Kalender auch in 2013 umzusetzen. Anleitungen dazu gibt es bestimmt im Netz.

      Konkret zu deiner Frage: prinzipiell funktioniert dieser Workaround mit SP2013 auch. Weil sich diesbezüglich CSOM-seitig (Client Object Model) nichts geändert hat. Einziger Unsicherheitsfaktor ist der Part bei dem das Kalender-Webpart ermittelt wird, da könnte sich eventuell etwas geändert haben.

      Hoffe ich konnte helfen.

  7. Mine / Nov 11 2013 4:03 pm

    Hallo Marco,

    Ich habe deinen Script bei uns aufgesetzt.

    Es werden mir zwar die Ressourcen im Gruppenkalender angezeigt, aber leider nicht die Termine dazu.
    Ich setze SharePoint 2013 ein und habe als Vorlage für die Website den Gruppenkalender von SP 2010 genutzt.
    Wo habe ich einen Fehler gemacht?
    Könntest du mir einige Tips geben?

    Viele Grüße
    Mine

    • delucamarco / Nov 13 2013 7:12 pm

      Hallo Mine,

      in welcher Ansicht werden dir die Termine nicht angezeigt? Wochen-Gruppen, Tages-Gruppen oder Monatsansicht?
      Oder bekommst du generell keine Termine angezeigt?
      Was ist mit Terminen die du neu einträgst?

      Grüße
      Marco

  8. tha619 / Mär 17 2015 6:03 am

    Ich habe die selbe Frage:

    „Hallo Marco
    nach einigen Versuchen hat es bei mir auch funktioniert.
    Ich habe nun eine Frage die die Reservation betrifft. Wenn ich nun einen Raum reservieren möchte sind alle Räume voreingestellt. Kann ich dies auch unterbinden? Optimal wäre, wenn der aktuell selektierte Raum ausgewählt ist.

    Wenn dies nicht möglich ist, dann am liebsten kein ausgewählter Raum.

    Kann man da was machen?

    Vielen Dank.

    Gruss Mike“

    Hat inzwischen jemand eine Lösung gefunden? Wenn ja,würde er sie mit mir teilen?

Hinterlasse einen Kommentar