in tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/ToastsRenderer.java [140:244]
public void encodeBeginInternal(final FacesContext facesContext, final T component) throws IOException {
final TobagoResponseWriter writer = getResponseWriter(facesContext);
final String clientId = component.getClientId(facesContext);
final Placement placement = component.getPlacement();
final Integer disposeDelay = component.getDisposeDelay();
final Markup markup = component.getMarkup() != null ? component.getMarkup() : Markup.NULL;
final Map<String, StateData> states = component.getStates();
insideBegin(facesContext, HtmlElements.TOBAGO_TOASTS);
writer.startElement(HtmlElements.TOBAGO_TOASTS);
writer.writeIdAttribute(clientId);
HtmlRendererUtils.writeDataAttributes(facesContext, writer, component);
final AbstractUIReload reload = ComponentUtils.getReloadFacet(component);
if (reload != null) {
reload.encodeAll(facesContext);
}
final Collection<Toast> toasts = component.getValue();
final UIComponent header = ComponentUtils.getFacet(component, Facets.header);
final List<UIComponent> children = component.getChildren();
if (toasts.size() == component.getRowCount()) {
int rowIndex = component.getFirst();
for (Toast toast : toasts) {
component.setRowIndex(rowIndex);
if (!component.isRowAvailable()) {
break;
}
final String toastId = clientId + ComponentUtils.SUB_SEPARATOR + toast.getId();
if (!states.containsKey(toastId)) {
states.put(toastId, new StateData(StateEnum.created, null));
}
final StateData stateData = states.get(toastId);
writer.startElement(HtmlElements.DIV);
writer.writeIdAttribute(toastId);
writer.writeClassAttribute(
BootstrapClass.TOAST,
component.getCustomClass(),
markup.contains(Markup.HIDE_CLOSE_BUTTON) ? TobagoClass.HIDE_CLOSE_BUTTON : null);
writer.writeAttribute(HtmlAttributes.NAME, toastId, false);
writer.writeAttribute(HtmlAttributes.ROLE, HtmlRoleValues.ALERT.toString(), false);
writer.writeAttribute(Arias.LIVE, "assertive", false);
writer.writeAttribute(Arias.ATOMIC, true);
writer.writeAttribute(DataAttributes.PLACEMENT, placement.name(), false);
if (stateData.state.equals(StateEnum.created)) {
writer.writeAttribute(DataAttributes.DISPOSE_DELAY, disposeDelay);
if (disposeDelay > 0) {
LocalTime hideTime = LocalTime.now().plus(disposeDelay, ChronoUnit.MILLIS);
states.put(toastId, new StateData(StateEnum.created, hideTime));
}
} else if (stateData.state.equals(StateEnum.showed)) {
if (stateData.hideTime != null) {
int decreasedDisposeDelay = (int) LocalTime.now().until(stateData.hideTime, ChronoUnit.MILLIS);
writer.writeAttribute(DataAttributes.DISPOSE_DELAY, Math.max(decreasedDisposeDelay, 0));
if (decreasedDisposeDelay <= 0) {
states.put(toastId, new StateData(StateEnum.closed, null));
}
} else {
writer.writeAttribute(DataAttributes.DISPOSE_DELAY, disposeDelay);
}
}
if (header != null) {
writer.startElement(HtmlElements.DIV);
writer.writeClassAttribute(BootstrapClass.TOAST_HEADER);
insideBegin(facesContext, Facets.header);
for (final UIComponent child : RenderUtils.getFacetChildren(header)) {
child.encodeAll(facesContext);
}
encodeCloseButton(facesContext, writer);
insideEnd(facesContext, Facets.header);
writer.endElement(HtmlElements.DIV);
}
writer.startElement(HtmlElements.DIV);
writer.writeClassAttribute(BootstrapClass.TOAST_BODY);
if (header == null) {
encodeCloseButton(facesContext, writer);
}
for (UIComponent child : children) {
child.encodeAll(facesContext);
}
writer.endElement(HtmlElements.DIV);
writer.endElement(HtmlElements.DIV);
rowIndex++;
}
}
component.setRowIndex(-1);
final String statesInputId = clientId + ComponentUtils.SUB_SEPARATOR + SUFFIX_STATES;
writer.startElement(HtmlElements.INPUT);
writer.writeIdAttribute(statesInputId);
writer.writeNameAttribute(statesInputId);
writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.HIDDEN);
writer.writeAttribute(HtmlAttributes.VALUE, encodeStates(states), false);
writer.endElement(HtmlElements.INPUT);
}