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); } });