Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Componente primefaces Schedule

Boa noite, tava dando uma olhada no primefaces e eu consegui fazer a tela de consulta usando o componente Schedule, mais eu não consigo gravar na minha tela de consulta uma consulta, tipo ele grava no banco mais na tela da consulta onde clico no dia e tudo mais não fica gravado. Como fazer para gravar na tela? Meu código ta assim.

@Named
@ViewScoped
@SuppressWarnings("serial")
public class ConsultaBean implements Serializable{

    @Inject
    private Consulta consulta;
    @Inject
    private ConsultaDao consultaDao;
    @Inject
    private MensagemUtil mensagem;
    @Inject
    private PessoaDao pessoaDao;

    private ScheduleModel consultas;

    @PostConstruct
    public void lista() {
        consultas = new DefaultScheduleModel();
    }

    @Transacional
    public void salvar(ActionEvent actionEvent) {
        if(consulta.getCodigo() == null) {
            Pessoa pessoaCodigo = pessoaDao.buscarPorCodigo(consulta.getPessoa().getCodigo());
            consulta.setPessoa(pessoaCodigo);
            consultaDao.salvar(consulta);
            mensagem.mensagemInfo("Consulta salva com sucesso!");
        } else {

        }
        this.consulta = new Consulta();
    }

    @Transacional
    public List<Consulta> getListaPessoas() {
        return consultaDao.consultaPessoas();
    }

    public ScheduleModel getConsultas() {
        return consultas;
    }

    public void setConsultas(ScheduleModel consultas) {
        this.consultas = consultas;
    }

    public Consulta getConsulta() {
        return consulta;
    }

    public void setConsulta(Consulta consulta) {
        this.consulta = consulta;
    }





}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">

<ui:composition template="/template/template.xhtml">
    <ui:define name="conteudo">
        <h:form id="formularioAgendamento">
            <p:growl id="mensagem" showDetail="true" sticky="true" />
            <p:schedule value="#{consultaBean.consultas}">
                <p:ajax event="dateSelect" oncomplete="PF('dialogo').show();"
                    update=":dialogoFormulario"  />
            </p:schedule>
        </h:form>

        <p:dialog widgetVar="dialogo" resizable="false" draggable="false"
            closable="true" modal="true" appendTo="@(body)" header="Consultas">
            <h:form id="dialogoFormulario">
                <h:panelGrid columns="2">
                    <p:outputLabel value="Dia: " for="dia" />
                    <p:inputText id="dia" value="#{consultaBean.consulta.data.time}">
                        <f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss"
                            timeZone="America/Sao_Paulo" />
                    </p:inputText>

                    <p:outputLabel value="Valor: " for="valor" />
                    <p:inputText id="valor" value="#{consultaBean.consulta.valor}" />


                    <p:outputLabel value="Cliente" for="cliente" />
                    <p:selectOneMenu id="cliente"
                        value="#{consultaBean.consulta.pessoa.codigo}" filter="true"
                        filterMatchMode="contains">
                        <f:selectItem itemValue="" itemLabel="Selecione um cliente" />
                        <f:selectItems itemValue="#{pessoa.codigo}"
                            itemLabel="#{pessoa.nome}" value="#{consultaBean.listaPessoas}"
                            var="pessoa" />
                    </p:selectOneMenu>
                </h:panelGrid>

                <p:commandButton value="Salvar"
                    actionListener="#{consultaBean.salvar}"
                    oncomplete="PF('dialogo').hide();" update="formularioAgendamento" />

            </h:form>
        </p:dialog>
    </ui:define>
</ui:composition>

</html>
8 respostas

Opa, esse aqui é o código da documentação:

 @PostConstruct
    public void init() {
        eventModel = new DefaultScheduleModel();
        eventModel.addEvent(new DefaultScheduleEvent("Champions League Match", previousDay8Pm(), previousDay11Pm()));
        eventModel.addEvent(new DefaultScheduleEvent("Birthday Party", today1Pm(), today6Pm()));
        eventModel.addEvent(new DefaultScheduleEvent("Breakfast at Tiffanys", nextDay9Am(), nextDay11Am()));
        eventModel.addEvent(new DefaultScheduleEvent("Plant the new garden stuff", theDayAfter3Pm(), fourDaysLater3pm()));

    }

O seu método que retorna as consultas, precisa retornar um objeto preenchido, para que ele popule o calendário. Documentação ta aqui => http://www.primefaces.org/showcase/ui/data/schedule.xhtml

Fala Alberto tranquilo? então eu consegui colocar na tela pela documentação do primefaces, porque tava dando nullpointer toda hora, pois então tava olhando que esse shedule do primefaces, tem data de inicio data de termino, descrição e titulo, todos esses campos tem que ser obrigado? porque criei uma consulta com pessoa, preço e o dia, tem como salvar só esses 3 campos?

solução!

Alberto tranquilo? depois de muito esforço e erro e tudo mais, consegui fazer salvar selecionar e tudo mais no componente, poderia ver se está correto? irei postar meus metodos que eu fiz, mais só não gostei que eu meio que forcei para usar o proprio eventModel de data de começo e fim kkk, mais tirando isso. tudo foi ok.

@Transacional
    public void salvar() {
        if (consulta == null) {
            if (consulta.getInicio().getTime() <= consulta.getFim().getTime()) {
                try {
                    Pessoa pessoaCodigo = pessoaDao.buscarPorCodigo(consulta.getPessoa().getCodigo());
                    consulta.setPessoa(pessoaCodigo);
                    consultaDao.salvar(consulta);
                    iniciar();
                    mensagem.mensagemInfo("Consulta salva com sucesso");
                } catch (RuntimeException ex) {
                    FacesContext
                            .getCurrentInstance()
                            .addMessage(
                                    null,
                                    new FacesMessage(
                                            "Data do começo do evento não pode ser maior que a do final",
                                            "Data do começo do evento não pode ser maior que a do final"));
                }
            }
        } else {
            try {
                consultaDao.atualizar(consulta);
                mensagem.mensagemInfo("Consulta atualizada com sucusso");
            } catch (RuntimeException ex) {
                FacesContext
                        .getCurrentInstance()
                        .addMessage(
                                null,
                                new FacesMessage(
                                        "Data do começo do evento não pode ser maior que a do final",
                                        "Data do começo do evento não pode ser maior que a do final"));
            }
        }
        this.consulta = new Consulta();
    }

    public void clicar(SelectEvent selectEvent) {
        this.consulta = new Consulta();
        ScheduleEvent event = new DefaultScheduleEvent("",
                (Date) selectEvent.getObject(), (Date) selectEvent.getObject());
        consulta.setInicio(new java.sql.Date(event.getStartDate().getTime()));
        consulta.setFim(new java.sql.Date(event.getEndDate().getTime()));
    }

    public void selecionar(SelectEvent selectEvent) {
        ScheduleEvent evento = (ScheduleEvent) selectEvent.getObject();
        for (Consulta con : lista) {
            if (con.getCodigo() == evento.getData()) {
                consulta = con;
                break;
            }
        }
    }

    @PostConstruct
    public void iniciar() {
        eventoModelo = new DefaultScheduleModel();
        lista = consultaDao.lista();
        for (Consulta con : lista) {
            DefaultScheduleEvent evento = new DefaultScheduleEvent();
            evento.setEndDate(con.getFim());
            evento.setStartDate(con.getInicio());
            evento.setData(con.getCodigo());
            evento.setTitle(con.getTitulo());
            evento.setDescription(con.getDescricao());
            evento.setAllDay(true);
            evento.setEditable(true);

            eventoModelo.addEvent(evento);
        }
    }

    @Transacional
    public void salvar(ActionEvent actionEvent) {
        if (consulta.getCodigo() == null) {
            Pessoa pessoaCodigo = pessoaDao.buscarPorCodigo(consulta
                    .getPessoa().getCodigo());
            consulta.setPessoa(pessoaCodigo);
            consultaDao.salvar(consulta);
            mensagem.mensagemInfo("Consulta salva com sucesso!");
        } else {

        }
        this.consulta = new Consulta();
    }

Só estou com um probleminha que quando eu salvo uma consulta ele não marca na hora logo depois do insert, eu tenho que dar um f5 e recarregar a página :(, não entendo o porque sendo que coloquei update em tudo qualquer lugar.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">

<ui:composition template="/template/template.xhtml">
    <ui:define name="conteudo">
        <p:growl id="mensagem" showDetail="true" sticky="true" />
        <h:form id="formularioAgendamento">
            <p:schedule value="#{consultaBean.eventoModelo}" widgetVar="consulta"
                id="scheduleConsulta" timeZone="America/Sao_Paulo">
                <p:ajax event="eventSelect" listener="#{consultaBean.selecionar}"
                    oncomplete="PF('caixaDialogo').show();" update=":formularioDialogo" />

                <p:ajax event="dateSelect" listener="#{consultaBean.clicar}"
                    update=":formularioDialogo" oncomplete="PF('caixaDialogo').show();" />
            </p:schedule>
        </h:form>

        <p:dialog id="dialog" draggable="false" resizable="false"
            closable="true" modal="true" appendTo="@(body)" header="Evento"
            widgetVar="caixaDialogo">
            <h:form id="formularioDialogo">
                <h:panelGrid columns="2">

                    <p:outputLabel value="Nome do cliente: " />
                    <p:inputText value="#{consultaBean.consulta.titulo}" />

                    <p:outputLabel value="Inicio evento: " />
                    <p:calendar value="#{consultaBean.consulta.inicio}"
                        pattern="dd/MM/yyyy" />

                    <p:outputLabel value="Fim evento: " />
                    <p:calendar value="#{consultaBean.consulta.fim}"
                        pattern="dd/MM/yyyy" />

                    <p:outputLabel value="Status: " />
                    <p:selectBooleanCheckbox value="#{consultaBean.consulta.status}" />

                    <p:outputLabel value="Descrição: " />
                    <p:inputTextarea value="#{consultaBean.consulta.descricao}" />

                    <p:outputLabel value="Cliente" for="cliente" />
                    <p:selectOneMenu id="cliente"
                        value="#{consultaBean.consulta.pessoa.codigo}">
                        <f:selectItem itemValue="" itemLabel="Selecione um cliente" />
                        <f:selectItems value="#{consultaBean.listaPessoas}" var="pessoa"
                            itemValue="#{pessoa.codigo}" itemLabel="#{pessoa.nome}" />
                    </p:selectOneMenu>
                </h:panelGrid>

                <p:separator />

                <p:commandButton value="Salvar" action="#{consultaBean.salvar}"
                    update=":formularioAgendamento :mensagem :formularioAgendamento:scheduleConsulta"
                    oncomplete="PF('caixaDialogo').hide();" />
            </h:form>
        </p:dialog>

    </ui:define>
</ui:composition>

</html>

Resolvido já, obrigado mesmo assim. Se ta funcional então acho que deve estar da maneira correta kkkk

Ótimo! acho que a única parte estranha é vc ter utilizado o java.sql.Date. Poderia ter usado a api do java 8 de data, java time, ou até mesmo o calendar e convertido para passar os valores para o primefaces.

Vou trocar isso, é que estava fazendo com o calendar e tava me retornando o erro de converter :(

Alisson, tudo bem? Estou fazendo um Schedule também, mas o DAO não estou conseguindo fazer, consegue postar seu DAO?