Keynotes can be rendered dynamically from a list, as in data iteration components. Presentations are made with reveal.js.
value takes a list of KeynoteItem instances, which are exposed via var. This presentation
loops and advances automatically every 3 seconds (loop="true", autoSlide="3000").
<div class="card">
<h5>Dynamic</h5>
<p>
<code>value</code> takes a list of <code>KeynoteItem</code> instances, which are exposed via <code>var</code>. This presentation
loops and advances automatically every 3 seconds (<code>loop="true"</code>, <code>autoSlide="3000"</code>).
</p>
<h:form id="formDynamic">
<pe:keynote loop="true" autoSlide="3000" slideNumber="c/t" value="#{keynoteController.items}" var="item"
width="480" height="350" style="width: 50vw; height: 50vh;">
<pe:keynoteItem>
<h2>#{item.headline}</h2>
<p>#{item.content}</p>
</pe:keynoteItem>
</pe:keynote>
</h:form>
</div>
package org.primefaces.extensions.showcase.controller.keynote;
import java.io.Serial;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import jakarta.annotation.PostConstruct;
import jakarta.faces.application.FacesMessage;
import jakarta.faces.context.FacesContext;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;
import org.primefaces.extensions.event.KeynoteEvent;
import org.primefaces.extensions.model.keynote.KeynoteItem;
@Named
@ViewScoped
public class KeynoteController implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private List<KeynoteItem> items;
private boolean disabled = true;
@PostConstruct
protected void initialize() {
items = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
items.add(new KeynoteItem(new KeynoteItemContent("Section " + i, "Lorem ipsum content " + i)));
}
}
public void onSlideChanged(final KeynoteEvent event) {
disabled = !event.isLastSlide();
final FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_WARN,
"Trigger: " + new Date(),
"Slide changed: " + event.isCompleted() + ", last slide: " + event.isLastSlide());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public void onSlideTransitionEnd(final KeynoteEvent event) {
disabled = !event.isLastSlide();
final FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_WARN,
"Trigger: " + new Date(),
"Slide transition end: " + event.isCompleted() + ", last slide: " + event.isLastSlide());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public List<KeynoteItem> getItems() {
return items;
}
public boolean isDisabled() {
return disabled;
}
public class KeynoteItemContent implements Serializable {
private String headline;
private String content;
public KeynoteItemContent(final String headline, final String content) {
this.headline = headline;
this.content = content;
}
public String getHeadline() {
return headline;
}
public void setHeadline(final String headline) {
this.headline = headline;
}
public String getContent() {
return content;
}
public void setContent(final String content) {
this.content = content;
}
}
}