public void encodeBeginInternal()

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