Drag events from the list on the left side and drop them onto the timeline.
Documentation<style type="text/css">
.ui-datalist-item .ui-draggable:hover {
background: #eeeeee;
}
</style>
<p:growl id="growl" showSummary="true" showDetail="false">
<p:autoUpdate />
</p:growl>
<div style="float:left; width: 130px;">
<strong>Drag and drop events</strong>
<p/>
<p:dataList id="eventsList" value="#{dndTimelineView.events}"
var="event" itemType="circle">
<h:panelGroup id="eventBox" layout="box" style="z-index:9999; cursor:move;">
#{event.name}
</h:panelGroup>
<p:draggable for="eventBox" revert="true" helper="clone" cursor="move"/>
</p:dataList>
</div>
<p:timeline id="timeline" value="#{dndTimelineView.model}" var="event"
editable="true" eventMargin="10" eventMarginAxis="0" minHeight="250"
start="#{dndTimelineView.start}" end="#{dndTimelineView.end}"
style="margin-left:135px;"
dropActiveStyleClass="ui-state-highlight" dropHoverStyleClass="ui-state-hover">
<p:ajax event="drop" listener="#{dndTimelineView.onDrop}" global="false" update="eventsList"/>
<h:panelGrid columns="1">
<h:outputText value="#{event.name}"/>
<h:outputText value="#{event.start}">
<f:convertDateTime type="localDateTime" pattern="hh:mm:ss a"/>
</h:outputText>
<h:outputText value="#{event.end}">
<f:convertDateTime type="localDateTime" pattern="hh:mm:ss a"/>
</h:outputText>
</h:panelGrid>
</p:timeline>@Named("dndTimelineView")
@ViewScoped
public class DndTimelineView implements Serializable {
private TimelineModel<Event, ?> model;
private LocalDateTime start;
private LocalDateTime end;
private final List<Event> events = new ArrayList<>();
@PostConstruct
public void init() {
start = LocalDateTime.now().minusHours(4);
end = LocalDateTime.now().plusHours(8);
model = new TimelineModel<>();
for (int i = 1; i <= 10; i++) {
events.add(new Event("Event " + i));
}
}
public void onDrop(TimelineDragDropEvent<Event> e) {
// get dragged model object (event class) if draggable item is within a data iteration component,
// update event's start and end dates.
Event dndEvent = e.getData();
dndEvent.setStart(e.getStartDate());
dndEvent.setEnd(e.getEndDate());
// create a timeline event (not editable)
TimelineEvent event = TimelineEvent.builder()
.data(dndEvent)
.startDate(e.getStartDate())
.endDate(e.getEndDate())
.editable(false)
.group(e.getGroup())
.build();
// add a new event
TimelineUpdater timelineUpdater = TimelineUpdater.getCurrentInstance("timeline");
model.add(event, timelineUpdater);
// remove from the list of all events
events.remove(dndEvent);
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "The " + dndEvent.getName() + " was added", null);
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public void onSwitchTimeZone(AjaxBehaviorEvent e) {
model.clear();
}
public TimelineModel<Event, ?> getModel() {
return model;
}
public List<Event> getEvents() {
return events;
}
public LocalDateTime getStart() {
return start;
}
public LocalDateTime getEnd() {
return end;
}
}