timeline = new Timeline();
timeline.setWidth100();
timeline.setEventSnapGap(1440); // 60 * 24
timeline.setDisableWeekends(false);
timeline.setShowWeekends(false);
timeline.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATE);
timeline.setShowEventDescriptions(false);
timeline.setCanCreateEvents(false);
timeline.setEventLaneFieldTitle("Person");
timeline.setShowControlsBar(false);
timeline.setShowQuickEventDialog(false);
timeline.setCanRemoveEvents(false);
timeline.setLaneEventPadding(3);
timeline.setOverlapSortSpecifiers(new SortSpecifier("sortOrder", SortDirection.ASCENDING));
timeline.setLaneFields(new ListGridField("title", "People", 210));
timeline.setLanes(lanes);
timeline.setDataSource(ds);
timeline.setAutoFetchData(true);
timeline.setCanAcceptDrop(true);
timeline.setUseEventCanvasRolloverControls(false);
Canvas properties = new Canvas();
properties.setHoverWidth(500);
timeline.setAutoChildProperties("eventCanvas", properties);
timeline.setShowLaneRollOver(true);
timeline.setDateStyleCustomizer(new DateStyleCustomizer() {
@Override
public String getDateStyle(Date date, int rowNum, int colNum, CalendarView calendarView) {
// If we are currently showing the day view, set a different style for weekend days.
if(timeline.getTimelineGranularity() == TimeUnit.DAY)
{
for (Integer weekendDay : DateUtil.getWeekendDays()) {
if(date.getDay() == weekendDay)
return "calendarResourcePlanningWorkdayDisabled";
}
}
return null;
}
});
timeline.setEventHeaderHTMLCustomizer(new EventHeaderHTMLCustomizer() {
@Override
public String getEventHeaderHTML(CalendarEvent calendarEvent, CalendarView calendarView) {
if(calendarEvent.getStyleName().equals("eventWindowHeader-project") || calendarEvent.getStyleName().equals("eventWindowHeader-absence"))
{
boolean isBelowThreshold = calendarEvent.getAttribute("brightness") != null && calendarEvent.getAttributeAsDouble("brightness") < brightnessThreshold;
String imgUrl = isBelowThreshold ? "[SKIN]/actions/edit_resource.png" : "[SKIN]/actions/edit_resource_black.png";
String img = Canvas.imgHTML(imgUrl, 17, 18);
String changedImg = img.substring(0, img.length()-1) + "style='cursor: pointer;'>";
if (calendarEvent.getStyleName().equals("eventWindowHeader-project")) {
String color = isBelowThreshold ? "#ffffff" : "#5a5a5a";
return "
" + calendarEvent.getName() + " " + changedImg + " |
";
}
return "" + calendarEvent.getName() + " " + changedImg + " |
";
}
else
return "" + calendarEvent.getName() + " |
";
}
});
timeline.addEventClickHandler(new EventClickHandler() {
@Override
public void onEventClick(CalendarEventClick calendarEventClick) {
if(calendarEventClick.getEvent().getAttributeAsBoolean("canEdit"))
{
openEventEditModal(calendarEventClick.getEvent());
}
calendarEventClick.cancel();
}
});
timeline.setEventCanvasHoverHTMLCustomizer(new EventCanvasHoverHTMLCustomizer() {
@Override
public String getHoverHTML(CalendarEvent calendarEvent, EventCanvas eventWindow) {
DateTimeFormat dtf = DateTimeFormat.getFormat("d/M, yyyy");
Date editedEndDate = (Date) calendarEvent.getEndDate().clone();
CalendarUtil.addDaysToDate(editedEndDate, -1);
String hoverHtml = dtf.format(calendarEvent.getStartDate()) + " - " + dtf.format(editedEndDate) + "
";
hoverHtml += calendarEvent.getName() + "
";
hoverHtml += calendarEvent.getDescription();
return hoverHtml;
}
});
timeline.addDropHandler(getTimelineDrophandler());
timeline.setHeaderLevels(TimelineUtils.getDayViewHeaderLevels());
timeline.setDefaultTimelineColumnSpan(28);
Date startDate = DateUtil.getAbsoluteDate(RelativeDate.TODAY);
// if you don't call this, you'll get defaultTimelineColumnSpan columns (20)
timeline.setStartDate(startDate);
Date endDate = DateUtil.getAbsoluteDate(RelativeDate.TODAY);
CalendarUtil.addDaysToDate(endDate, 28);
timeline.setEndDate(endDate);
timeline.addEventChangedHandler(new EventChangedHandler() {
@Override
public void onEventChanged(CalendarEventChangedEvent event) {
if(event.getEvent().getAttribute("changedFromLane") != null)
updateLaneClientSide(timeline.getLane(event.getEvent().getLane()),timeline.getLane(event.getEvent().getAttribute("changedFromLane")),event.getEvent(),null,null,true);
else
updateLaneClientSide(timeline.getLane(event.getEvent().getLane()),null,event.getEvent(),null,null,true);
updateProjectInList(event.getEvent().getAttributeAsInt("projectId"));
}
});
timeline.addEventAddedHandler(new EventAddedHandler() {
@Override
public void onEventAdded(CalendarEventAdded event) {
updateLaneClientSide(timeline.getLane(event.getEvent().getLane()),null,null,null,event.getEvent(),true);
updateProjectInList(event.getEvent().getAttributeAsInt("projectId"));
}
});
timeline.addEventRemovedHandler(new EventRemovedHandler() {
@Override
public void onEventRemoved(CalendarEventRemoved event) {
updateLaneClientSide(timeline.getLane(event.getEvent().getLane()),null,null,event.getEvent(),null,true);
updateProjectInList(event.getEvent().getAttributeAsInt("projectId"));
}
});
// ShowLaneCustomizer works with the filter to exclude lanes
timeline.setShowLaneCustomizer(new ShowLaneCustomizer() {
@Override
public boolean shouldShowLane(Lane lane, CalendarView calendarView) {
if(lane != null)
{
// Employee Name
String employeeName = filterEmployeeValue;
if (employeeName != null && employeeName != "") {
String laneName = lane.getAttribute("employee");
if (laneName.toLowerCase().contains(employeeName.toLowerCase()) == false) {
return false;
}
}
// Role
if (filterRoleValue != null && filterRoleValue.length > 0) {
Integer laneRole = lane.getAttributeAsInt("roleId");
boolean found = false;
for (String roleId : filterRoleValue) {
if (laneRole.equals(Integer.parseInt(roleId))) {
found = true;
break;
}
}
if(!found)
return false;
}
// Team
if(filterTeamValue != null && filterTeamValue.length > 0)
{
int[] laneTeams = lane.getAttributeAsIntArray("teams");
if(laneTeams == null)
return false;
boolean found = false;
for (String teamName : filterTeamValue) {
int filterTeamId = Integer.parseInt(teamName);
for (int teamId : laneTeams) {
if (filterTeamId == teamId) {
found = true;
break;
}
}
if(found)
break;
}
if(!found)
return false;
}
// Project
String projectName = (String)filterProjectValue;
if (projectName != null && projectName != "") {
for (CalendarEvent event : timeline.getLaneEvents(lane)) {
if(event.getAttributeAsBoolean("isClientEvent"))
continue;
if(event.getName().toLowerCase().contains(projectName.toLowerCase()))
return executeDefault(lane, calendarView);
}
return false;
}
}
return executeDefault(lane, calendarView);
}
});