RESOLVIDO - Ajuda com Vaadin

Bom dia a todos, estou criando uma tela de venda de produtos, na verdade já criei e ela ficou bem simples, sem muita frescura como vcs podem ver na imagem

Ao clicar no botão new, uma nova janela se abre conforme imagem

É aqui nesta janela que preciso de ajuda.

Quero colocar aqui 3 guias horizontais na parte superior desta janela(guia vendas. guia entrega, guia financeiro)

e cada uma destas guias irá receber varios tipos de componentes (ComboBox, DatePicker, TextField…etc).

Vou deixar uma imagem feito no Excel para vcs terem uma ideia de como quero que ela fique

Algo proximo disso, como posso fazer isso? Alguem com mais experiencia poderia me ajudar?

Vou postar o código para que possam ver

Obrigado a todos.

Código no momento atual:

package br.com.fjsistemas.cadastros.view;

import java.util.List;
import java.util.Locale;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;

import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.datepicker.DatePicker;
import com.vaadin.flow.component.dialog.Dialog;
import com.vaadin.flow.component.formlayout.FormLayout;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.grid.GridVariant;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.NumberField;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.binder.Binder;
import com.vaadin.flow.data.binder.PropertyId;
import com.vaadin.flow.data.renderer.NumberRenderer;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;

import br.com.fjsistemas.backend.Venda;
import br.com.fjsistemas.main.MainView;
import br.com.fjsistemas.service.VendaService;

@Route(value = "venda-view", layout = MainView.class)
@PageTitle("Lançamento de Vendas")
public class VendaView extends VerticalLayout {

	private static final long serialVersionUID = 1L;

	private HorizontalLayout hltVenda = new HorizontalLayout();
	Grid<Venda> grdVenda = new Grid<>(Venda.class, false);

	private HorizontalLayout hltBarraBotoes = new HorizontalLayout();
	Button btnNovo = new Button("New");
	Button btnAlterar = new Button("Change");
	Button btnExcluir = new Button("Delete");

	private Dialog dlgJanela = new Dialog();

	private FormLayout fltCamposVenda = new FormLayout();

	@PropertyId("data")
	private DatePicker txtData = new DatePicker("Sale Date");

	@PropertyId("nomeCliente")
	private TextField txtNomeCliente = new TextField("Nome Cliente");

	@PropertyId("valorTotalVenda")
	private NumberField txtValor = new NumberField("Valor Total");

	private HorizontalLayout htlDlgBarraBotoes = new HorizontalLayout();
	private Button btnSalvar = new Button("Save");
	private Button btnFechar = new Button("Close");

	@Autowired
	VendaService vendaService;

	private List<Venda> listaVendas;
	private Venda venda;

	Binder<Venda> binderVenda = new Binder<>(Venda.class);

	public VendaView() {

	}

	@PostConstruct
	public void init() {
		configuraTela();

	}

	private void configuraTela() {

		setMargin(false);
		setPadding(false);

		configuraHltVenda();
		configuraFltBarraBotoes();
		configuraDlgJanela();
		populaGrdVenda();
		configuraBinder();

		add(hltVenda, hltBarraBotoes);
	}

	private void configuraFltBarraBotoes() {

		btnNovo.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		btnNovo.addClickListener(e -> {
			novoClick();
		});

		btnAlterar.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		btnAlterar.addClickListener(e -> {
			alterarClick();
		});

		btnExcluir.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		btnExcluir.addClickListener(e -> {
			excluirClick();
		});

		hltBarraBotoes.add(btnNovo, btnAlterar, btnExcluir);
	}

	private void excluirClick() {

		if (venda != null) {
			listaVendas.remove(venda);
			vendaService.delete(venda);
			atualizaGrdVenda();
		}
	}

	private void configuraHltVenda() {
		hltVenda.setWidthFull();
		configuraGrdVenda();
		hltVenda.add(grdVenda);
	}

	private void configuraGrdVenda() {
		grdVenda.setHeight("820px");
		grdVenda.setWidthFull();

		grdVenda.addColumn(Venda::getId).setHeader("ID:").setAutoWidth(true);

		grdVenda.addColumn(Venda::getDataVenda).setHeader("Sale Date:").setAutoWidth(true).setKey("dataVenda");

		grdVenda.addColumn(Venda::getNomeCliente).setHeader("Customer:").setAutoWidth(true).setKey("nomeCliente");

		grdVenda.addColumn(new NumberRenderer<>(Venda::getValorTotalVenda, "R$ %(,.2f", Locale.getDefault(), "R$ 0.00"))
				.setHeader("Total Value:").setAutoWidth(true).setKey("valorTotalVenda");

		grdVenda.addThemeVariants(GridVariant.LUMO_COMPACT, GridVariant.LUMO_COLUMN_BORDERS);

		grdVenda.getColumns().forEach(col -> col.setAutoWidth(true).setSortable(true).setResizable(true));

		grdVenda.addItemClickListener(e -> {
			venda = e.getItem();
		});

	}

	private void configuraDlgJanela() {

		dlgJanela.setHeightFull();
		dlgJanela.setWidthFull();

		btnSalvar.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		btnSalvar.getStyle().set("margin-top", "835px");
		btnSalvar.getStyle().set("margin-left", "0px");
		btnSalvar.addClickListener(e -> {
			salvarClick();
		});

		btnFechar.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		btnFechar.getStyle().set("margin-top", "835px");
		btnFechar.addClickListener(e -> {
			dlgJanela.close();
		});

		htlDlgBarraBotoes.add(btnSalvar, btnFechar);

		dlgJanela.add(fltCamposVenda, htlDlgBarraBotoes);
	}

	private void salvarClick() {

		venda = binderVenda.getBean();

		boolean adicionarLista = venda.getId() == null ? true : false;

		vendaService.create(venda);

		if (adicionarLista) {
			listaVendas.add(venda);
		}
		atualizaGrdVenda();
		novaVenda();
		txtNomeCliente.focus();

		binderVenda.setBean(venda);

		if (adicionarLista) {
			dlgJanela.close();
		}
	}

	private void populaGrdVenda() {

		listaVendas = vendaService.read();
		atualizaGrdVenda();
	}

	private void atualizaGrdVenda() {
		grdVenda.setItems(listaVendas);
	}

	private void configuraBinder() {

		binderVenda.bindInstanceFields(this);

	}

	private void novoClick() {

		novaVenda();
		binderVenda.setBean(venda);

		dlgJanela.open();
		txtNomeCliente.focus();
	}

	private void alterarClick() {

		if (venda != null) {
			binderVenda.setBean(venda);

			dlgJanela.open();

		}
	}

	private void novaVenda() {
		venda = new Venda();
		venda.setNomeCliente(" ");
		dlgJanela.close();

	}
}

CÓDIGO ALTERADO

package br.com.fjsistemas.cadastros.view;

import java.util.List;
import java.util.Locale;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.vaadin.textfieldformatter.CustomStringBlockFormatter;

import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.datepicker.DatePicker;
import com.vaadin.flow.component.dialog.Dialog;
import com.vaadin.flow.component.formlayout.FormLayout;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.grid.GridVariant;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.tabs.Tab;
import com.vaadin.flow.component.tabs.Tabs;
import com.vaadin.flow.component.textfield.NumberField;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.binder.Binder;
import com.vaadin.flow.data.binder.PropertyId;
import com.vaadin.flow.data.renderer.NumberRenderer;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;

import br.com.fjsistemas.backend.Venda;
import br.com.fjsistemas.main.MainView;
import br.com.fjsistemas.service.VendaService;

@Route(value = "venda-view", layout = MainView.class)
@PageTitle("Lançamento de Vendas")
public class VendaView extends VerticalLayout {

	private static final long serialVersionUID = 1L;

	private HorizontalLayout hltVenda = new HorizontalLayout();
	Grid<Venda> grdVenda = new Grid<>(Venda.class, false);

	private HorizontalLayout hltBarraBotoes = new HorizontalLayout();
	Button btnNovo = new Button("Novo");
	Button btnAlterar = new Button("Alterar");
	Button btnExcluir = new Button("Excluir");

	private Dialog dlgJanela = new Dialog();

	private FormLayout fltCamposVenda = new FormLayout();

	@PropertyId("data")
	private DatePicker txtData = new DatePicker("Data Venda");

	@PropertyId("nomeCliente")
	private TextField txtNomeCliente = new TextField("Nome Cliente");

	@PropertyId("valorTotalVenda")
	private NumberField txtValor = new NumberField("Valor Total");

	private HorizontalLayout htlDlgBarraBotoes = new HorizontalLayout();
	private Button btnSalvar = new Button("Salvar");
	private Button btnFechar = new Button("Fechar");

	@Autowired
	VendaService vendaService;

	private List<Venda> listaVendas;
	private Venda venda;

	Binder<Venda> binderVenda = new Binder<>(Venda.class);

	public VendaView() {

	}

	@PostConstruct
	public void init() {
		configuraTela();

	}

	private void configuraTela() {

		setMargin(false);
		setPadding(false);

		configuraHltVenda();
		configuraFltBarraBotoes();
		configuraDlgJanela();
		populaGrdVenda();
		configuraBinder();

		add(hltVenda, hltBarraBotoes);
	}

	private void configuraFltBarraBotoes() {

		btnNovo.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		btnNovo.addClickListener(e -> {
			novoClick();
		});

		btnAlterar.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		btnAlterar.addClickListener(e -> {
			alterarClick();
		});

		btnExcluir.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		btnExcluir.addClickListener(e -> {
			excluirClick();
		});

		hltBarraBotoes.add(btnNovo, btnAlterar, btnExcluir);
	}

	private void excluirClick() {

		if (venda != null) {
			listaVendas.remove(venda);
			vendaService.delete(venda);
			atualizaGrdVenda();
		}
	}

	private void configuraHltVenda() {
		hltVenda.setWidthFull();
		configuraGrdVenda();
		hltVenda.add(grdVenda);
	}

	private void configuraGrdVenda() {
		grdVenda.setHeight("820px");
		grdVenda.setWidthFull();

		grdVenda.addColumn(Venda::getId).setHeader("ID:").setAutoWidth(true);

		grdVenda.addColumn(Venda::getDataVenda).setHeader("Data Venda:").setAutoWidth(true).setKey("dataVenda");

		grdVenda.addColumn(Venda::getNomeCliente).setHeader("Cliente:").setAutoWidth(true).setKey("nomeCliente");

		grdVenda.addColumn(new NumberRenderer<>(Venda::getValorTotalVenda, "R$ %(,.2f", Locale.getDefault(), "R$ 0.00"))
				.setHeader("Valor Total:").setAutoWidth(true).setKey("valorTotalVenda");

		grdVenda.addThemeVariants(GridVariant.LUMO_COMPACT, GridVariant.LUMO_COLUMN_BORDERS);

		grdVenda.getColumns().forEach(col -> col.setAutoWidth(true).setSortable(true).setResizable(true));

		grdVenda.addItemClickListener(e -> {
			venda = e.getItem();
		});

	}

	private void configuraDlgJanela() {

		dlgJanela.setHeightFull();
		dlgJanela.setWidthFull();

		Tab vender = new Tab("Vendas");
		Tab entregar = new Tab("Entregas");
		Tab financeiro = new Tab("Financeiro");

		Tabs tabs = new Tabs();
		tabs.add(vender, entregar, financeiro);

		HorizontalLayout layoutGuiaVenda = new HorizontalLayout();

		DatePicker dataVenda = new DatePicker("Data Venda");
		TextField cliente = new TextField("Cliente");
		TextField telefone = new TextField("Telefone");
		TextField celular = new TextField("Celular");
		
		new CustomStringBlockFormatter.Builder().blocks(0, 2, 4, 4).delimiters("(", ")", "-").numeric().build()
		.extend(telefone);
		
		new CustomStringBlockFormatter.Builder().blocks(0, 2, 5, 4).delimiters("(", ")", "-").numeric().build()
		.extend(celular);

		layoutGuiaVenda.add(dataVenda, cliente, telefone, celular);
		fltCamposVenda.add(layoutGuiaVenda);
		vender.add(fltCamposVenda);

		dlgJanela.add(tabs);

		btnSalvar.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		btnSalvar.getStyle().set("margin-top", "835px");
		btnSalvar.getStyle().set("margin-left", "0px");
		btnSalvar.addClickListener(e -> {
			salvarClick();
		});

		btnFechar.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
		btnFechar.getStyle().set("margin-top", "835px");
		btnFechar.addClickListener(e -> {
			dlgJanela.close();
		});

		htlDlgBarraBotoes.add(btnSalvar, btnFechar);

		dlgJanela.add(fltCamposVenda, htlDlgBarraBotoes);
	}

	private void salvarClick() {

		venda = binderVenda.getBean();

		boolean adicionarLista = venda.getId() == null ? true : false;

		vendaService.create(venda);

		if (adicionarLista) {
			listaVendas.add(venda);
		}
		atualizaGrdVenda();
		novaVenda();
		txtNomeCliente.focus();

		binderVenda.setBean(venda);

		if (adicionarLista) {
			dlgJanela.close();
		}
	}

	private void populaGrdVenda() {

		listaVendas = vendaService.read();
		atualizaGrdVenda();
	}

	private void atualizaGrdVenda() {
		grdVenda.setItems(listaVendas);
	}

	private void configuraBinder() {

		binderVenda.bindInstanceFields(this);

	}

	private void novoClick() {

		novaVenda();
		binderVenda.setBean(venda);

		dlgJanela.open();
		txtNomeCliente.focus();
	}

	private void alterarClick() {

		if (venda != null) {
			binderVenda.setBean(venda);

			dlgJanela.open();

		}
	}

	private void novaVenda() {
		venda = new Venda();
		venda.setNomeCliente(" ");
		dlgJanela.close();

	}
}