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