Ultimo problema para finalizar meu primeiro Sistema

@Lucas_Camara

Sim

@Lucas_Camara

no momento em que ela for salva, certo?

Para agora, no momento em que ela for carregada para ser visualizada. Para ver se vc consegue apresentar os dados do produto que foi salvo no teste que vc fez.

No momento em que uma venda for selecionada, vc deve fazer algo assim:

List<ProdutosVendidos> produtosVendidos = venda.getProdutos();

// supondo que vc tenha algum método que popule a tabela de produtos
popularTabela(produtosVendidos);

algo mais ou menos assim viu. Dá uma pensada ai em como implementar de acordo em como está seu código.

1 curtida

@Lucas_Camara

Não tem nenhum metodo para popular a tabela produtos

então devo criar um metodo na View e dentro deste metodo add este código que vc passou?

Vc terá que selecionar uma venda para visualizar os dados dela. O código que exemplifiquei, vc deve colocar nesse momento.

O método popularTabela é soh um exemplo. Vc pode ou não criar esse método.

1 curtida

@Lucas_Camara

para visualizar uma venda, dou um duplo click na grid

	grdVenda.addItemDoubleClickListener(event -> {
			if (venda != null) {
				binderVenda.readBean(venda);
				dlgJanela.open();
				

			}
		});  

Então se eu entendi o que vc falou, devo deixar o código assim?:

    grdVenda.addItemDoubleClickListener(event -> {
			if (venda != null) {
				binderVenda.readBean(venda);
				dlgJanela.open();
				List<ProdutoVendido> produtosVendidos = venda.getProdutos();

			}
		});
1 curtida

@Lucas_Camara

Até o momento o sistema está desta forma:

1º chamar a tela de vendas através do menu lateral:

2º clicar no botão novo para lançar as informações sobre a venda(nome do cliente, forma de pagamento)

após clicar no botão novo abre a janela:

o usuario fornece os dados iniciais (nome cliente, forma de pagamento)

agora tem 3 botoes:

+Item = está sem nenhuma lógica.

salvar, que está com esta lógica:

btnSalvar.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		btnSalvar.getStyle().set("margin-top", "2.3em");
		btnSalvar.getStyle().set("margin-left", "1em");
		btnSalvar.setWidth("190px");
		btnSalvar.addClickListener(e -> {
			salvarClick();

		});

Lógica de salvarClick:

    private void salvarClick() {

		venda = binderVenda.getBean();

		Optional<Produto> produtoTeste = produtoRepository.findById(6L);

		if (produtoTeste.isPresent()) {
			venda.addProduto(produtoTeste.get());
		}
		
		boolean adicionarLista = venda.getId() == null ? true : false;
		vendaService.create(venda);
		
		if (adicionarLista) {
			listaVendas.add(venda);
		}
		
		atualizaGrdVenda();
		novaVenda();
		txtNomeCliente.focus();
		
		binderVenda.setBean(venda);
	}

e por fim tem o botão fechar:

	btnFechar.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		btnFechar.getStyle().set("margin-top", "2.3em");
		btnFechar.setWidth("190px");
		btnFechar.addClickListener(e -> {
			dlgJanela.close();

		});

Ok, então vamos tentar fazer gravar uma venda nova e depois vamos para a visualização de uma venda existente (que é o que eu estava pensando em fazer).

Tente implementar a lógica do botão +Item. Quando o botão for acionado, o sistema deverá pedir as informações do produto vendido e adicioná-lo na venda. A tabela de produtos deverá apresentar os produtos que foram adicionados na venda.

1 curtida

Para adicionar os produtos na venda, achei essa ideia que tu teve muito boa, mas acho que soh precisaria de algum clique para confirmar a ação. Com esse clique de confirmação, vc conseguiria adicionar o produto na venda. O que vc acha?

1 curtida

@Lucas_Camara

isso, seria perfeito…mas como colocamos em pratica?rs

Uai, tu tinha mandado o link do exemplo. Primeiro tem que ver como a grid funciona.

1 curtida

@Lucas_Camara

este é o exemplo no site vaadin

List<Person> personList = getItems();

// Providing a bean-type generates columns for all of it's properties
Grid<Person> grid = new Grid<>();
grid.setItems(personList);

Grid.Column<Person> firstNameColumn = grid
        .addColumn(Person::getFirstName).setHeader("First Name");
Grid.Column<Person> lastNameColumn = grid.addColumn(Person::getLastName)
        .setHeader("Last Name");
grid.addColumn(Person::getAge).setHeader("Age");

Button addButton = new Button("Add Item", event -> {

    personList.add(new Person(10000, "X", "Y", 16,
            new Address("95632", "New York"), "187-338-588"));
    // The dataProvider knows which List it is based on, so when you
    // edit the list
    // you edit the dataprovider.
    grid.getDataProvider().refreshAll();

});

Button removeButton = new Button("Remove last", event -> {

    personList.remove(personList.size() - 1);
    // The dataProvider knows which List it is based on, so when you
    // edit the list
    // you edit the dataprovider.
    grid.getDataProvider().refreshAll();
});

FooterRow footerRow = grid.appendFooterRow();
footerRow.getCell(firstNameColumn).setComponent(addButton);
footerRow.getCell(lastNameColumn).setComponent(removeButton);
add(grid, addButton, removeButton); 

Esta é a Entidade de exemplo do site vaadin:

public static class Person implements Cloneable {
    private int id;
    private String firstName;
    private String lastName;
    private int age;
    private Address address;
    private String phoneNumber;
    private MaritalStatus maritalStatus;
    private LocalDate birthDate;
    private boolean isSubscriber;
    private String email;

    public Person() {

    }

    public Person(int id, String firstName, String lastName, int age,
                  Address address, String phoneNumber) {
        super();
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
        this.address = address;
        this.phoneNumber = phoneNumber;
    }

    public Person(int id, String firstName, String lastName, int age,
                  Address address, String phoneNumber,
                  MaritalStatus maritalStatus, LocalDate birthDate) {
        super();
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
        this.address = address;
        this.phoneNumber = phoneNumber;
        this.maritalStatus = maritalStatus;
        this.birthDate = birthDate;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public MaritalStatus getMaritalStatus() {
        return maritalStatus;
    }

    public void setMaritalStatus(MaritalStatus maritalStatus) {
        this.maritalStatus = maritalStatus;
    }

    public LocalDate getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(LocalDate birthDate) {
        this.birthDate = birthDate;
    }

    public String getImage() {
        return "https://randomuser.me/api/portraits/men/" + getId()
                + ".jpg";
    }

    public boolean isSubscriber() {
        return isSubscriber;
    }

    public void setSubscriber(boolean isSubscriber) {
        this.isSubscriber = isSubscriber;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public int hashCode() {
        return id;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (!(obj instanceof Person)) {
            return false;
        }
        Person other = (Person) obj;
        return id == other.id;
    }

    @Override
    public String toString() {
        return firstName;
    }

    @Override
    public Person clone() { //NOSONAR
        try {
            return (Person) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(
                    "The Person object could not be cloned.", e);
        }
    }
}

public static class Address {
    private String street;
    private int number;
    private String postalCode;
    private String city;

    public Address() {

    }

    public Address(String postalCode, String city) {
        this.postalCode = postalCode;
        this.city = city;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getPostalCode() {
        return postalCode;
    }

    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return String.format("%s %s", postalCode, city);
    }

}

public enum MaritalStatus {
    MARRIED, SINGLE;
}

Acho que teria que fazer uma mescla com esses componentes:

Permite editar a linha na propria tabela
https://vaadin.com/components/vaadin-grid/java-examples/grid-editor

O que vc passou que permite ter os botões para adicionar novas linhas
https://vaadin.com/components/vaadin-grid/java-examples/assigning-data

Brabo que nunca usei o vaadin, teria que olhar com calma e estou meio enrolado no trampo aqui.

Tente fazer a tabela funcionar por partes. Pega o exemplo do site e vai trocando as classes pelas suas, ex.:

// onde tiver
Grid<Person> grid = new Grid<>();

// muda para 
Grid<ProdutoVendido> grid = new Grid<>();

// e vai fazendo a mesma coisa com o resto

Qdo tiver um tempinho tento dá uma lida na doc aqui.

1 curtida

@Lucas_Camara

tranquilo!!

1 curtida

@Lucas_Camara

Com este código:

    List<ProdutoVendido> produtosVendidosList = new ArrayList<ProdutoVendido>();

		Grid<ProdutoVendido> grid = new Grid<>();
		grid.setItems(produtosVendidosList);
		grid.setHeight("650px");
		
		grid.addColumn(ProdutoVendido::getProduto).setHeader("Produto:").setAutoWidth(true);
		grid.addColumn(ProdutoVendido::getQuantidade).setHeader("Quantidade:");
		grid.addColumn(ProdutoVendido::getValorUnitario).setHeader("Valor Unitário:");
		grid.addColumn(ProdutoVendido::getValorTotalItem).setHeader("Valor Total do Item:");

		Button addButton = new Button("Adicionar Produto");
		addButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		addButton.addClickListener(event -> {
			produtosVendidosList.add(new ProdutoVendido());
			grid.getDataProvider().refreshAll();
		});

		Button removeButton = new Button("Remover Produto");
		removeButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		removeButton.addClickListener(event -> {
			produtosVendidosList.remove(produtosVendidosList.size() - 1);
			grid.getDataProvider().refreshAll();
		});

		Label text = new Label("Valor Total");
		text.getElement().getStyle().set("fontWeight", "bold");
		text.getStyle().set("margin-top", "1em");
		text.getStyle().set("margin-left", "1em");
		text.getStyle().set("text-align", "center");
		campoSomaValores.getStyle().set("margin-top", "0.5em");
		campoSomaValores.getStyle().set("margin-right", "0.2em");
		campoSomaValores.setWidth("30em");

		barraLayoutDlgInferior.add(text, campoSomaValores);
		superior.add(primeiraLinhaDivSuperior, segundaLinhaDivSuperior);
		barraBotoesGridVendidos.setJustifyContentMode(JustifyContentMode.START);
		barraBotoesGridVendidos.add(addButton, removeButton);

		dlgJanela.add(superior, grid, barraBotoesGridVendidos); 

Consegui fazer a grid funcionar, ela está funcionando desta forma:

toda vez que clico no botão Adicionar Produto, acontece isso:

3 clicks:

agora precisamos bolar alguma forma de editar a própria grid, estou vendo se consigo fazer

1 curtida

Boa! É isso ai! Sobre conseguir editar diretamente na tabela, tinha visto isso na doc do vaadin: https://vaadin.com/components/vaadin-grid/java-examples/grid-editor

@rafaspara2017 depois de 200 mensagens em 20 dias, depois pega a conta do @RoinujNosde e do @Lucas_Camara para transferir um cachê pela consultoria.
:sweat_smile: :joy:

3 curtidas

Se vc tiver outra duvida abre um novo tópico.

1 curtida