Menu

Al escoger una referencia se pierde el foco.

JOSE ELIAS
2024-03-05
2024-06-13
  • JOSE ELIAS

    JOSE ELIAS - 2024-03-05

    Cuando el usuario pasa, con el tabulador, por una referencia, escribiendo cualquier carácter, al no encontrarlo OX salta la búsqueda. Hasta aquí perfecto, el problema viene cuando selecciona la referencia y vuelve al modelo. Se ha perdido el foco para seguir registrando valores.

    He usado OnChange para intentar fijar el foco con getView().setFocus(getChangedProperty()), pero no funciona porque se lanza antes de escoger la referencia y al escogerla y verla reflejada en el modelo, ya no se lanza.

    ¿Hay alguna forma de recuperar el foco?

     
  • Javier Paniza

    Javier Paniza - 2024-03-07

    Hola JE:

    Tienes razón, lo acabo de probar y va tan mal como cuentas. Por favor, añadelo como bug para que lo podamos arreglar.

    Si lo quieres arreglar mientras tanto tendrás que refinar la acción de escoger.


    Ayuda a otros en este foro como yo te ayudo a ti.

     
  • JOSE ELIAS

    JOSE ELIAS - 2024-06-08

    Lo estoy intentado, pero no hay forma...
    He redefinido el controlador "Reference.search" por

    <controlador nombre="ReferenceSearchFocus">
    <accion nombre="choose" por-defecto="casi-siempre" clase="com.f4.elencoerp.acciones.ChooseReferenceAndFocusAction">
    <accion nombre="cancel" clase="org.openxava.actions.CancelFromCustomListAction">
    </accion></accion></controlador>

    y en ChooseReferenceAndFocusAction
    

    public class ChooseReferenceAndFocusAction extends ChooseReferenceAction {
    private static final Logger LOG = Logger.getLogger(ChooseReferenceAndFocusAction.class);

    @Override
    public void execute() throws Exception {
        super.execute();
    
        LOG.info(Util.userLog() + "---view.name:" + getView().getViewName() + ", view.model:" + getView().getModelName());
    
        getView().setFocus("nombreCliente");        //prueba para cliente
    
    }
    

    }

    No consigo que se fije el foco en ninguna propiedad de la vista desde donde se lanza la búsqueda. Lo he intentado con

    getView.setFocus(xxxx)
    getReferenceSubView().getParent().setFocus(xxx)

    LO que no he conseguido averiguar es porqué con los detalles (elementCollection) funciona y con las referencias en la vista principal no.

    La realidad es que el foco se va fuera de pantalla, al usuario del navegador. ¿por dónde puedo seguir?

     

    Last edit: JOSE ELIAS 2024-06-08
  • Javier Paniza

    Javier Paniza - 2024-06-10

    Hola José:

    El getView().setFocus("nombreCliente"); debería funcionar si nombreCliente es una propiedad editable de la vista.

    ¿El log que pones sacan el nombre de modelo y de vista correcto, los de la vista raíz?

    Si no consigues que te funcione puedes probar hacerl por JavaScript, algo así:

    public class ChooseReferenceAndFocusAction extends ChooseReferenceAction implements IJavaScriptPostAction {
            public String getPostJavaScript() {
                  $('#ox_tuaplicacion_TuModulo__tuPropiedad').focus();
            }
    
    }
    

    Ayuda a otros en este foro como yo te ayudo a ti.

     
  • JOSE ELIAS

    JOSE ELIAS - 2024-06-11

    ¿El log que pones sacan el nombre de modelo y de vista correcto, los de la vista raíz?

    Esta es la clase, que las llamadas que he puesto para ver el modelo devuelven bien el nombre del modelo. La propiedad "nombreCliente" está editable antes y después de escoger la referencia.

    ublic class ChooseReferenceAndFocusAction extends ChooseReferenceAction {
    private static final Logger LOG = Logger.getLogger(ChooseReferenceAndFocusAction.class);

    @Override
    public void execute() throws Exception {
    
        super.execute();
    
        LOG.info(Util.userLog() + "---view.name:" + getView().getViewName() + ", view.model:" + getView().getModelName());  //oferta-Oferta
        LOG.info(Util.userLog() + "---referenceSubView.name:" + super.getReferenceSubview().getViewName() + ", refereneSubview.model:" + super.getReferenceSubview().getModelName());   //id-Cliente
    
    
        //no funciona!!
        getView().setFocus("nombreCliente");        //prueba para cliente
    
    }
    

    }

     
  • JOSE ELIAS

    JOSE ELIAS - 2024-06-11

    Si no consigues que te funcione puedes probar hacerlo por JavaScrip.

    Así si que funciona...

    Aquí dejo cómo esta hecho:

    public class ChooseReferenceAndFocusAction extends ChooseReferenceAction implements IJavaScriptPostAction {
    private static final Logger LOG = Logger.getLogger(ChooseReferenceAndFocusAction.class);

    private String modelName = null;
    private String refName = null;
    
    @Override
    public void execute() throws Exception {
    
        super.execute();        
        //recoger el Modelo y la referencia para posicionar el foco despues de escoger
        modelName = getView().getModelName();   //Oferta
        refName = super.getReferenceSubview().getModelName();   //Cliente - Lugar
    }
    
    @Override
    public String getPostJavaScript() { 
        String res = null;
        if ("Oferta".equals(modelName)) {
            if ("Cliente".equals(refName)) res = "$('#ox_ElencoERP_Oferta__cliente___idCliente').focus()";  
            else if ("Lugar".equals(refName)) res = "$('#ox_ElencoERP_Oferta__lugar___id').focus()";  
            else res = null;    
        }
        return res;
    }
    

    }

     
  • Javier Paniza

    Javier Paniza - 2024-06-13

    Hola José:

    Me alegra que tengas una solución hasta que arreglemos el bug.

    Quizás lo de que getView().setFocus("nombreCliente") no funcione sea otro bug diferente, quizás no funciona justo al cerrar un diálogo.

    Si haces una acción en la vista principal que solo tenga getView().setFocus("nombreCliente"), ¿pone el foco en nombreCliente?


    Ayuda a otros en este foro como yo te ayudo a ti.

     

Log in to post a comment.