Actualmente estoy tratando de configurar una tabla de datos editable que usa ajax para mantener el enfoque cuando un usuario edita una celda usando JavaScript o un bean de respaldo, porque cuando se produce una edición de celda, será necesario actualizar los datos en otras partes de la tabla, por lo tanto la tabla debe volver a dibujarse, desenfocando el elemento enfocado. Actualmente estoy tratando de hacer esto usando ap:focus, usando un oyente CellEditEvent para obtener la identificación del componente. Desafortunadamente, asignar a la variable la identificación del componente enfocado no cambia qué elemento está enfocado en la página.
Aquí está el HTML relevante:
<h:form id="addForm"> <p:focus id="focusID" for="#{beanView.focus}" /> <h:panelGroup id="entrypg"> <p:commandButton id="updateButton" widgetVar="updateButton" update="addForm:myDT" /> <p:dataTable id="myDT" widgetVar="myDT" var="iter" value="#{beanView.valList}" editable="true" editMode="cell"> <p:ajax event="cellEdit" listener="#{beanView.onCellEdit}" oncomplete="$('#addForm\\\:updateButton').click();"/> <p:column headerText="X"> <p:cellEditor> <f:facet name="output"> <h:outputText value="#{iter.x}" /> </f:facet> <f:facet name="input"> <p:inputText value="#{iter.x}" /> </f:facet> </p:cellEditor> </p:column> </p:dataTable> </h:panelGroup> </h:form>Y el controlador de edición de celdas en la vista:
public void onCellEdit(CellEditEvent edit) { if(edit.getNewValue() != null) { focus = edit.getColumn().getChildren().get(0).getClientId(); } }También estoy abierto a mejores formas de hacer esto, ya que no estoy seguro de si p:focus está diseñado para este propósito.
¡Gracias!
Ok, lo he hecho funcionar usando widgets:
function forceFocus(index) { var widget = PF('myDT'); widget.showCellEditor($('[role="gridcell"].ui-editable-column:eq(' + index + ')')); }El showCellEditor hace casi exactamente lo que necesito, resalta una celda y la enfoca, lo que permite la edición inmediata. También parece conservar el enfoque entre llamadas ajax.
Se necesitaría más lógica si quisiera hacer esto en una tabla con más de 1 columna editable.
Editar: Ok, parece que no está almacenando el foco entre los redibujados de la tabla, pero debería ser factible tomar el foco antes de que la tabla se vuelva a dibujar y restaurarlo después de que se vuelva a dibujar con la función anterior