This example demonstrates timeline's customization (custom styles) along with i18n text.
<style>
/* Custom styles for the Timeline */
div.timeline-frame {
border-color: #5D99C3;
border-radius: 5px;
}
div.timeline-axis {
border-color: #5D99C3;
background-color: #5D99C3;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5D99C3', endColorstr='#3A6DA0') alpha(opacity=100);
background: -webkit-gradient(linear, left top, left bottom, from(#5D99C3), to(#3A6DA0));
background: -moz-linear-gradient(top, #5D99C3, #3A6DA0);
-khtml-opacity: 1;
-moz-opacity: 1;
opacity: 1;
}
div.timeline-groups-axis {
border-color: #5D99C3;
}
div.timeline-groups-axis-onleft {
border-style: none solid none none;
}
div.timeline-axis-text {
color: white;
}
div.timeline-event {
color: white !important;
border-radius: 5px !important;
}
div.timeline-event-content {
padding: 5px;
text-shadow: none;
}
div.unavailable {
background: #F03030 none !important; /* red */
border-color: #bd2828 !important; /* red */
}
div.available {
background: #1AA11A none !important; /* green */
border-color: #136e13 !important; /* green */
}
div.maybe {
background: #FFA500 none !important; /* orange */
border-color: #cc8100 !important; /* orange */
}
div.timeline-event-selected {
background: #BECEFE none !important;
border-color: #97B0F8 !important;
}
</style>
<h:form id="form">
<div class="card">
<p:timeline id="timeline" value="#{customTimelineView.model}"
editable="true" eventMargin="10" eventMarginAxis="0"
start="#{customTimelineView.start}" end="#{customTimelineView.end}"
stackEvents="false" widgetVar="timelineWdgt">
<f:facet name="menu">
<p:commandButton type="button" icon="pi pi-chevron-left" styleClass="ml-2" onclick="PF('timelineWdgt').move(-0.3);" />
<p:commandButton type="button" icon="pi pi-chevron-right" styleClass="ml-2" onclick="PF('timelineWdgt').move(0.3);" />
<p:commandButton type="button" icon="pi pi-search-minus" styleClass="ml-2" onclick="PF('timelineWdgt').zoom(-0.5);" />
<p:commandButton type="button" icon="pi pi-search-plus" styleClass="ml-2" onclick="PF('timelineWdgt').zoom(0.5);" />
</f:facet>
<f:facet name="loading">
<h1>Loading please wait...</h1>
</f:facet>
</p:timeline>
</div>
</h:form>
package org.primefaces.showcase.view.data.timeline;
import jakarta.annotation.PostConstruct;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import io.quarkus.runtime.annotations.RegisterForReflection;
import org.primefaces.model.timeline.TimelineEvent;
import org.primefaces.model.timeline.TimelineModel;
@Named("customTimelineView")
@ViewScoped
@RegisterForReflection(serialization = true)
public class CustomTimelineView implements Serializable {
private TimelineModel<String, ?> model;
private LocalDateTime start;
private LocalDateTime end;
@PostConstruct
public void init() {
// set initial start / end dates for the axis of the timeline
start = LocalDate.of(-140, 1, 1).atStartOfDay();
end = LocalDate.of(-140, 1, 2).atStartOfDay();
// groups
String[] names = new String[]{"User 1", "User 2", "User 3", "User 4", "User 5", "User 6"};
// create timeline model
model = new TimelineModel<>();
for (String name : names) {
LocalDateTime end = start.minusHours(12).withMinute(0).withSecond(0).withNano(0);
for (int i = 0; i < 5; i++) {
LocalDateTime start = end.plusHours(Math.round(Math.random() * 5));
end = start.plusHours(4 + Math.round(Math.random() * 5));
long r = Math.round(Math.random() * 2);
String availability = (r == 0 ? "Unavailable" : (r == 1 ? "Available" : "Maybe"));
// create an event with content, start / end dates, editable flag, group name and custom style class
TimelineEvent event = TimelineEvent.builder()
.data(availability)
.startDate(start)
.endDate(end)
.editable(true)
.group(name)
.styleClass(availability.toLowerCase())
.build();
model.add(event);
}
}
}
public TimelineModel<String, ?> getModel() {
return model;
}
public LocalDateTime getStart() {
return start;
}
public LocalDateTime getEnd() {
return end;
}
}