Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
0800 1 255 255

Geburtstagsliste im Confluence

Wie können wir sehen wer bei uns als nächstes Geburtstag hat? Eine nicht selten gestellte Frage in vielen Unternehmen. Die Antwort ist: „Mit Confluence und dem User Profile Plugin von Communardo“! Sehen Sie hier wie es funktioniert.

United-Kingdom-flag-icon

Wie kön­nen wir sehen wer bei uns als nächs­tes Geburtstag hat? Eine nicht sel­ten gestellte Frage in vie­len Unternehmen. Die Antwort ist: "Mit Confluence und dem User Profile Plugin von Communardo"! Sehen Sie hier wie es funktioniert…

Das User Profile Plugin bie­tet eine Vielzahl an Funktionen um die Confluence Profile nach den eige­nen Wünschen und Vorstellungen anzu­pas­sen. So kön­nen zum Beispiel neue Profile Elemente hin­zu­ge­fügt oder belie­bige Nutzerdaten aus exter­nen Nutzerverzeichnissen in das Confluence syn­chro­ni­siert wer­den. Als net­ter Nebeneffekt wer­den diese Informationen auch im Confluence Suchindex zur Verfügung gestellt. Weiterhin bie­tet das User Profile Plugin ab der Version 1.9 eine REST Schnittstelle um die Nutzerdaten aus­zu­le­sen. Und genau das kön­nen wir nut­zen um eine Auflistung aller Nutzer, die um das aktu­elle Datum Geburtstag haben, zu bekommen.

Was brauchen wir?

Grundvoraussetzung für das Funktionieren ist ein instal­lier­tes User Profile Plugin ab der Version 1.9. Mit die­sem ist es nun mög­lich in der glo­ba­len Administration im Abschnitt "User Profile Plugin" bei "Profile Elements" ein neues Profilelement anzu­le­gen. Diesem geben wir den Namen "Birthday". Als Hilfetext sollte man nun noch hin­zu­fü­gen dass das Geburtsdatum im Format "TT.MM.JJJJ" oder TT.MM.  erwar­tet wird.

Nun haben alle Nutzer in Ihrem Profil die Möglichkeit das eigene Geburtsdatum zu hinterlegen.

 

Ein Nutzermakro trägt unseren Code

Wir ver­wen­den ein Nutzermakro in wel­chem wir ein wenig Javascript Code und Style-Definitionen hin­ter­le­gen. Dem Nutzermakro geben wir einen belie­bi­gen Namen und fügen fol­gen­den Code als Nutzermakro Code ein.

 

## @noparams
 
<style type="text/css">
    .upp-birthday-list {
        margin-top: 10px;
    }
    .upp-birthday-user .upp-pic {
		display: inline-block;
     }	
    .upp-birthday-user .upp-data {
		display: inline-block;
		vertical-align: top;
		margin-left: 10px;
		width: 130px;
		text-align: left;
    }
	.upp-birthday-user  {
		display: inline-block;
		vertical-align: top;
		margin-right: 10px;
		margin-bottom: 10px;
		padding: 5px;
		border: 1px solid #ccc;
	}
</style>
<h2>Birthday List</h2>
<div class="upp-birthday-list"> Search for birthdays... </div>
<script type="text/javascript">
  

	jQuery(document).ready(function(){

		var queryStringArray = [];
		var actualDate = new Date();
       		
		for(var i = -5; i <= 5; i++) {
			var newDate = new Date(actualDate.getFullYear(), actualDate.getMonth(), actualDate.getDate()+i); 
			var day = (newDate.getDate() < 10 ? "0" : "") + newDate.getDate();
			var month = ((newDate.getMonth() + 1) < 10 ? "0" : "") + (newDate.getMonth()+1);
			
			queryStringArray.push("Birthday:" + day + "." + month + "*");
		}
 		
		var queryString = queryStringArray.join(" OR ");
		jQuery.getJSON(contextPath+"/rest/searchv3/1.0/search?type=userinfo&queryString="+queryString ,function(result){
			
			if(result.results && result.results.length > 0) {
				
				jQuery(".upp-birthday-list").html("");
				jQuery.each(result.results, function(index, value){
					var match = value.url.match(/~(.*)\?/)[1];
                	if(match) {
                   		var userRawContainer = jQuery("<div class='upp-birthday-user' username='"+match+"'><div class='upp-pic'></div><div class='upp-data'></div></div>");
                   		jQuery(".upp-birthday-list").append(userRawContainer);
                   		initializeUppBirthdayUser(userRawContainer);
                	}
            	});
			} else {
				jQuery(".upp-birthday-list").html("No birthdays found :(");
			}
		});
 
        function initializeUppBirthdayUser(userRawContainer) {
            var userName = userRawContainer.attr("username");
            jQuery.getJSON(contextPath+"/rest/mobile/1.0/profile/"+userName, function(result){
				var userImg = jQuery("<img src='"+result.avatarUrl+"' >");
				userRawContainer.find(".upp-pic").append(userImg); 
            	var userNameContainer = jQuery("<div>"+result.fullName+"</div>");
				userRawContainer.find(".upp-data").append(userNameContainer); 
				getUppFieldValue(userName, "Birthday", userRawContainer.find(".upp-data"));
            });
        }
 
		 function getUppFieldValue(username, fieldKey, containerToAppendTo) {
 			jQuery.getJSON(contextPath+"/rest/communardo/upp/1.0/profileData/"+username+"?expand=profileData.profileElement", function(uppdata){
               jQuery.each(uppdata.profileData, function(uppindex, uppvalue) {
					
                    if(uppvalue.profileElement.defaultName == fieldKey) {
						var birthdayStampArray = uppvalue.data.split(".");
						var valueContainer = jQuery("<div>"+uppvalue.data+"</div>").hide();
						containerToAppendTo.closest(".upp-birthday-user").attr("birthdayforsort", (birthdayStampArray[1]+birthdayStampArray[0]));
                    	containerToAppendTo.append(valueContainer);        
						sortBirthdayElements();
						valueContainer.fadeIn();
                    }
                });
            });			
 		}
 
		function sortBirthdayElements() {
			var uppBirthdayList = jQuery(".upp-birthday-list");
			var sortedItems = uppBirthdayList.find(".upp-birthday-user").sort(function(a, b) { 
				if(!a || !b || !jQuery(a).attr("birthdayforsort") || !jQuery(b).attr("birthdayforsort")) {
					return 0;
				}
				return (jQuery(a).attr("birthdayforsort") < jQuery(b).attr("birthdayforsort") ? -1 : (jQuery(a).attr("birthdayforsort") > jQuery(b).attr("birthdayforsort") ? 1 : 0)); 
			});
			uppBirthdayList.find(".upp-birthday-user").remove();
			uppBirthdayList.append(sortedItems);
		}
 	});
</script> 

 

Was genau passiert im Nutzermakro?

Der Ablauf im Nutzermakro ist an sich recht ein­fach. Als ers­tes wird eine Suchanfrage per Javascript an Confluence geschickt. Diese gibt uns alle Nutzer die in den letz­ten 5 Tagen Geburtstag hat­ten oder in den nächs­ten 5 Tagen Geburtstagen Geburtstag haben. Pro gefun­de­nem Nutzer wird nun nach dem eigent­li­chen Geburtstag gefragt. Sobald alle Profile mit Ihrem Geburtstag gela­den wur­den wer­den diese noch abschlie­ßend nach Geburtsdatum auf­stei­gend sortiert.

 

 

 

 

21. Mai 2014

Hallo,

wir haben das Communardo Plugin und auch die­ses Nutzermakro bei uns im Einsatz.
Uns fällt beim Einsatz auf, dass einer­seits Fotos nicht kor­rekt ska­liert wer­den (sind alle unter­schied­lich groß) und dar­über hin­aus bei einem Export der Seite, nicht die erstellte Liste, son­dern der Text "Searching for bir­th­days…" ange­zeigt wird.
Gibt es dafür Lösungen?

Viele Grüße
ISB

Avatar Sandro Herrmann

Die Fotos soll­ten sich mit etwas CSS noch in die rich­tige Größe ska­lie­ren las­sen. Beim Export ist nichts zu sehen weil die eigent­li­chen Daten erst per Javascript nach­ge­la­den wer­den. Der Workaround wäre hier, nicht die Standard Confluence PDF Export Funktion zu nut­zen, son­dern die Druckfunktion des Browsers.

Comments are closed.

Pin It on Pinterest