With a Sharepoint Calendar the events with a long title/description are cropped and you cannot see the full description, except if you move your mouse over it.
Example:
So I’ve had to do some CSS and a complicated JavaScript code to be able to create some large boxes. Now we are able to see the full content title/description of the event.
The result is below:
As you can see, the boxes for the events are now bigger!
To do so, you’ll have to insert the below code into your page:
<style type="text/css">
.ms-acal-rootdiv div {
overflow: visible;
white-space: normal;
}
.ms-acal-item { height:auto !important }
.ms-acal-outday { height:100% !important }
</style>
<script type="text/javascript" src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript">
// load the function after the events are loaded
_spBodyOnLoadFunctionNames.push('changeCalendarEventLinkIntercept');
function changeCalendarEventLinkIntercept() {
var OldCalendarNotify4a = SP.UI.ApplicationPages.CalendarNotify.$4b;
SP.UI.ApplicationPages.CalendarNotify.$4b = function () {
OldCalendarNotify4a();
setTimeout(function() { showFullEvents() }, 250)
}
}
// on resize the boxes must be replaced
$(window).on('resize', function() {
setTimeout(function() { showFullEvents() }, 500)
});
function showFullEvents() {
var prevPos={bottom:0,left:0};
var minHeight=0,savedHeight=0,savedMinHeight=0,diffHeight=0;
var aRows=jQuery('.ms-acal-summary-itemrow');
// set the same size for each row
aRows.each(function() {
var h=$(this).outerHeight();
if (savedMinHeight<h) savedMinHeight=h;
// save the current height of the row
$(this).data("saved-height",h)
}).each(function() { $(this).css("height",savedMinHeight+"px"); });
savedHeight=savedMinHeight;
// move the events
jQuery('.ms-acal-item').each(function() {
var $this=$(this);
var pos=$this.position();
var height=$this.outerHeight();
var bottom=pos.top+height;
minHeight+=height;
// check if the current event is hover the previous one
if (prevPos.left === pos.left && prevPos.bottom>pos.top) {
$this.css("top",(1+prevPos.bottom)+"px")
bottom += prevPos.bottom-pos.top + 1;
minHeight+=2;
}
// check if we need to make the cell bigger
if (prevPos.left !== pos.left && savedMinHeight<minHeight) {
diffHeight=minHeight-savedHeight; // diffHeight will permit to move down all the events later
savedMinHeight=minHeight;
jQuery('.ms-acal-summary-itemrow > td').css("height",minHeight+"px")
}
if (prevPos.left !== pos.left) minHeight=0
prevPos={bottom:bottom,left:pos.left};
})
if (diffHeight>0) {
var prevDiff=0,diff=0,prevRow=0;
jQuery('.ms-acal-item').each(function(idx) {
var $this=$(this);
// find index that defines the row
var row=1*$this.attr("_index").split(",")[0];
if (idx===0 || prevRow!=row) {
prevDiff=diff;
diff+=savedMinHeight-aRows.eq(row).data("saved-height");
}
if (row > 0) $this.css("top",($this.position().top+prevDiff+2)+"px")
prevRow=row;
})
}
}
</script>
The code could be more clean, but I did that during an evening after a long day of work, so I’m just happy that it’s working. If you’re able to produce a cleaner code, please share it with me!
To give some explanations :
- The CSS permits to wrap the text and make the colored boxes bigger
- The problem starts when there are more than 1 event in a day because the boxes hover each other
- So with JavaScript we have to calculate which boxes are hover the others, and then move them down
- But if you move the boxes, you also have to make the cells bigger…
- And if the cells are bigger, then you need to move down the events/boxes that are in the below row
- And finally, when the window is resized, Sharepoint is moving them around, so the script has to execute again after a resize.
Tested only with Sharepoint 2010, with IE7+, Firefox and Chrome.