Sim
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.
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.
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();
}
});
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.
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?
Uai, tu tinha mandado o link do exemplo. Primeiro tem que ver como a grid funciona.
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.
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
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.
Se vc tiver outra duvida abre um novo tópico.