Implementando un ContextMenu dinámico para un Primefaces Multi-select Datatable

Tengo un PrimeFaces Datatable con un menú contextual y deseo implementar la selección múltiple, donde los elementos del menú en función del número de elementos seleccionados, ya que algunas acciones solo estarán disponibles cuando solo se seleccione un elemento. , y otros serán válidos cuando se seleccionen uno o más.

Mi primera idea fue utilizar la opción "renderizada" de los elementos de menú individuales, que se establece en el bean controlador. Este tipo de obras, como de hecho se mostraron los elementos de menú correctos. El problema es que el uso de la funcionalidad renderizada de los menuitems tuvo el efecto de que la selección se pierde en la datación, lo que anula el propósito del ejercicio.

    <p:dataTable id="orders" dynamic="true" var="item" rowKey="#{item.id}" value="#{ordersController.orders}"
                 emptyMessage="#{uistrings['datatable.nodata']}" paginator="true" paginatorPosition="both"
                 paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink}  {PageLinks}  {NextPageLink} {LastPageLink}"
                 paginatorAlwaysVisible="false" rows="10" selectionMode="multiple" selection="#{ordersController.selectedOrders}" widgetVar="orderList">

        <p:ajax event="sort" listener="#{ordersController.onSort}" update="orders"/>
        <p:ajax event="rowSelect" update="contextMenu"/>
        <p:ajax event="rowUnselect" update="contextMenu"/> 

        <p:column id="balance_date" sortBy="#{item.balanceDate}">
            <f:facet name="header">
                <h:outputText value="#{uistrings['orders.column.label.balancedate']}"/>
            </f:facet>
            <h:outputText value="#{item.balanceDate}">
                <f:converter converterId="isoDateTimeConverter"/>
                <f:attribute name="#{webUiConstBean.ISO_CONVERTER_ATTRIBUTE_TYPE}" value="#{webUiConstBean.ISO_DATE_CLASS}" />
                <f:attribute name="#{webUiConstBean.ISO_CONVERTER_ATTRIBUTE_PATTERN}" value="#{webUiConstBean.ISO_DATE_FORMAT}" />
            </h:outputText>
        </p:column>
        <p:column id="recipient_name" sortBy="#{item.recipient.displayName}">
            <f:facet name="header">
                <h:outputText value="#{uistrings['orders.column.label.recipient.displayName']}"/>
            </f:facet>
            <h:outputText value="#{item.recipient.displayName}"/>
        </p:column>

    [snip]

    </p:dataTable>

    <p:contextMenu id="contextMenu" for="orders">
        <p:menuitem value="#{uistrings['orders.menu.details']}" update="details, orders"
                    oncomplete="detailDialog.show()" icon="ui-icon-search" rendered="#{ordersController.renderDisplayDetails}" />

        <p:menuitem value="#{uistrings['orders.button.label.delete']}" icon="ui-icon-trash"
                    update="orders" ajax="true" onclick="confirmDelete.show()"
                    rendered="#{ordersController.renderDeleteDocuments}"/>
    </p:contextMenu>

Después de buscar soluciones en este y otros foros, encontrar algunas sugerencias y descubrir algunas alternativas, hice varios intentos, entre ellos:

1) utilizando dos menús contextuales completos: uno para cuando se selecciona un elemento y otro para cuando se seleccionan muchos elementos, y el uso de la opción renderizada en los propios menús de contexto, en lugar de sus elementos.

En este caso, los eventos rowSelect y rowUnselect actualizan ambos

    <p:ajax event="rowSelect" update="contextMenu1Selected contextMenuManySelected"/>
    <p:ajax event="rowUnselect" update="contextMenu1Selected contextMenuManySelected"/> 

Y los menús contextuales se ven algo así.

    <p:contextMenu id="contextMenu1Selected" for="orders" rendered="#{ordersController.render1Selected}">
        <p:menuitem value="#{uistrings['orders.menu.details']}" update="details, orders"
                    oncomplete="detailDialog.show()" icon="ui-icon-search"/>

        <p:menuitem value="#{uistrings['orders.button.label.delete']}" icon="ui-icon-trash"
                    update="orders" ajax="true" onclick="confirmDelete.show()"/>
    </p:contextMenu>

    <p:contextMenu id="contextMenuManySelected" for="orders" rendered="#{ordersController.renderManySelected}">
        <p:menuitem value="#{uistrings['orders.button.label.delete']}" icon="ui-icon-trash"
                    update="orders" ajax="true" onclick="confirmDelete.show()"/>
    </p:contextMenu>

Pero esto no funcionó en absoluto. Nunca se mostraron menús.

2) Colocar los dos menús contextuales dentro de un panel de salida y actualizar el panel. Esto tuvo el mismo resultado que mi primer intento. es decir, elementos de menú representados correctamente pero perdiendo la selección

        <p:outputPanel id="contextMenuPanel" autoUpdate="true">
            <p:contextMenu id="contextMenu1Selected" for="orders" rendered="#{ordersController.renderDisplayDocument}">
                [menu items]
            </p:contextMenu>

            <p:contextMenu id="contextMenuManySelected" for="orders" rendered="#{ordersController.renderDeleteDocuments}">
        [menu items]
            </p:contextMenu>
        </p:outputPanel>

3) Definir el modelo de menú de contexto usando un modelo de menú provisto por el controlador, que a su vez tiene dos modelos disponibles para los dos casos y entrega el correcto dependiendo del número de elementos seleccionados. También en un panel de salida

        <p:outputPanel id="contextMenuPanel" autoUpdate="true">
            <p:contextMenu id="contextMenu" for="orders" model="#{ordersController.menuModel}"/>
        </p:outputPanel>>

Esto tampoco funcionó. Los elementos de menú se procesaron correctamente, pero las selecciones múltiples se perdieron como antes.

He agotado las opciones que conozco.

¿Alguien ha implementado con éxito menús contextuales dinámicos para datos con multi-selección?

¿O alguien tiene alguna otra idea que pueda funcionar?

Aclamaciones.

Respuestas a la pregunta(1)

Su respuesta a la pregunta