es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo mostrar el objeto del elemento seleccionado dentro de la fábrica de formularios en Vaadin Flow?

Estoy usando la biblioteca CRUD de Alejandro (https://vaadin.com/directory/component/crud-ui-add-on/5.0.0) y Vaadin 21.0.3.

Cuando selecciono un usuario (transportista en mi ejemplo) de la tabla de la cuadrícula CRUD, los detalles se muestran correctamente. Pero, ¿cómo puedo obtener el objeto del transportista seleccionado desde dentro del formulario mismo para poder mostrar las relaciones?

Por ejemplo, si tengo el objeto transportista dentro de la fábrica del formulario, crearía una lista de casillas de verificación para mostrar los conductores [la relación es OneToMany].

Aquí está el código:


DefaultCrudFormFactory<transportista> formFactory = new DefaultCrudFormFactory<>(Transportista.class) { @Override protected void configureForm(FormLayout formLayout, List<hasvalueandelement> fields) { Component nameField = (Component) fields.get(0); formLayout.setColspan(nameField, 2); } };

    formFactory.setFieldProvider("drivers",
            new CheckBoxGroupProvider<>("Conductores",
                    formFactory.getNewInstanceSupplier().get().getDrivers(),   <<<<< ¿Cómo obtener el objeto de transportista seleccionado? 
                    Driver::getFullName));

¿Alguien tiene un ejemplo de CRUD con relación?

O, ¿cómo mostrar el objeto del transportista seleccionado dentro de la fábrica del formulario?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener el objeto del transportista seleccionado desde dentro del formulario en Vaadin 21.0.3, puedes utilizar el método addEditActionListener del componente Crud para escuchar eventos de edición y luego obtener el elemento seleccionado del objeto de evento.

    Aquí tienes un ejemplo de código:

    Crud<transporter> crud = new Crud<>(Transporter.class, formFactory);
    
    crud.addEditActionListener(event -> {
        Transporter selectedTransporter = event.getItem();
        // Ahora puedes utilizar el objeto selectedTransporter para mostrar relaciones, etc.
    });
    
    // ...
    

    En cuanto a la segunda pregunta de cómo mostrar el objeto del transportista seleccionado dentro de la fábrica de formularios, puedes pasarlo como parámetro al constructor de la fábrica de formularios y almacenarlo como una variable de instancia. Luego puedes usarlo en tu CheckBoxGroupProvider.

    Aquí tienes un ejemplo de código:

    public class TransporterFormFactory extends DefaultCrudFormFactory<transporter> {
    
        private Transporter selectedTransporter;
    
        public TransporterFormFactory(Class<transporter> domainType, Transporter selectedTransporter) {
            super(domainType);
            this.selectedTransporter = selectedTransporter;
        }
    
        // ...
    
        @Override
        protected void configureForm(FormLayout formLayout, List<><?>> fields) {
            super.configureForm(formLayout, fields);
    
            // Ahora puedes utilizar el objeto selectedTransporter en la configuración de tu formulario
            List<driver> drivers = selectedTransporter.getDrivers();
            if (drivers != null && !drivers.isEmpty()) {
                formLayout.addFormItem(new CheckBoxGroupProvider<>("Drivers",
                        drivers, Driver::getFullName).buildComponent(), "drivers");
            }
        }
    
        // ...
    }
    

    Luego puedes utilizar esta fábrica de formularios personalizada en tu componente Crud:

    “`java
    Transporter selectedTransporter = …; // obtener el transportista seleccionado
    Crud crud = new Crud<>(Transporter.class, new TransporterFormFactory(Transporter.class, selectedTransporter));

    // …
    “`

Comments are closed.