/**
* Copyright (c) 2009-2014 Câmara dos Deputados. Todos os direitos reservados.
*
* e-Democracia é um software livre; você pode redistribuí-lo e/ou modificá-lo dentro
* dos termos da Licença Pública Geral Menor GNU como publicada pela Fundação do
* Software Livre (FSF); na versão 2.1 da Licença, ou (na sua opinião) qualquer versão.
*
* Este programa é distribuído na esperança de que possa ser útil, mas SEM NENHUMA GARANTIA;
* sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR.
* Veja a Licença Pública Geral Menor GNU para maiores detalhes.
*/
package br.gov.camara.edemocracia.portlets.priorizacao.ui.pages;
import org.apache.wicket.PageParameters;
import org.apache.wicket.RequestCycle;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.WebComponent;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.LoadableDetachableModel;
import br.gov.camara.edemocracia.portlets.priorizacao.PropostaDisplay;
import br.gov.camara.edemocracia.portlets.priorizacao.TotalVotosExcedidoException;
import br.gov.camara.edemocracia.portlets.priorizacao.VotosPorPropostaExcedidoException;
import br.gov.camara.edemocracia.portlets.priorizacao.model.Configuracao;
import br.gov.camara.edemocracia.portlets.priorizacao.service.ConfiguracaoLocalServiceUtil;
import br.gov.camara.edemocracia.portlets.priorizacao.service.PriorizacaoServiceUtil;
import br.gov.camara.edemocracia.portlets.priorizacao.ui.panels.MenuPanel;
import br.gov.camara.edemocracia.portlets.priorizacao.ui.util.UIUtils;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
/**
* Página de votação de uma proposta
*
* @author robson
*
*/
public class VotacaoPage extends WebPage {
private PropostaDisplay getModelObject() {
return (PropostaDisplay) getDefaultModelObject();
}
private WebMarkupContainer votacaoContainer;
private FeedbackPanel feedbackPanel;
private Label totalVotos;
// private Label votosUsuario;
private Label votosDisponiveis;
private Form<?> form;
private final long propostaId;
private static final Log LOG = LogFactoryUtil
.getLog(VotacaoPage.class);
public VotacaoPage(PageParameters parameters) {
super(parameters);
propostaId = parameters.getLong("proposta", -1l);
if (propostaId <= 0)
throw new RestartResponseException(HomePage.class);
PropostaDisplay proposta = null;
try {
proposta = PriorizacaoServiceUtil.getPropostaDisplay(propostaId);
} catch (PortalException e) {
// TODO Log
LOG.error("Erro ao obter proposta", e);
} catch (SystemException e) {
// TODO Log
LOG.error("Erro ao obter proposta", e);
}
if (proposta == null)
throw new RestartResponseException(HomePage.class);
setDefaultModel(new CompoundPropertyModel<PropostaDisplay>(new LoadableDetachableModel<PropostaDisplay>(proposta) {
@Override
protected PropostaDisplay load() {
try {
return PriorizacaoServiceUtil.getPropostaDisplay(propostaId);
} catch (PortalException e) {
// TODO Log
LOG.error("Erro ao obter proposta",e);
return null;
} catch (SystemException e) {
// TODO Log
LOG.error("Erro ao obter proposta", e);
return null;
}
}
}));
init();
}
/**
* Configura a visibilidade dos elementos de votação
*/
@Override
protected void onConfigure() {
super.onConfigure();
configuraVisibilidade();
}
/**
*
*/
private void configuraVisibilidade() {
if (getDefaultModelObject() == null) {
throw new RestartResponseException(HomePage.class);
}
totalVotos.setVisible(getModelObject().getTotalVotos() > 0);
// votosUsuario.setVisible(getModelObject().getVotosUsuario() > 0);
votosDisponiveis.setVisible(getModelObject().isPodeVotar() && getModelObject().getVotosDisponiveis() > 0);
}
private boolean isVotacaoAberta() {
try {
Configuracao config = ConfiguracaoLocalServiceUtil
.getConfiguracaoPorGrupo(UIUtils.getScopeGroupId());
return config.isVotacaoAberta();
} catch (Exception e) {
return false;
}
}
/**
* Cria os componentes
*/
private void init() {
final String context = RequestCycle.get().getRequest()
.getRelativePathPrefixToContextRoot();
final boolean permissaoParaVotar = UIUtils.possuiPermissoes(
"br.gov.camara.edemocracia.portlets.priorizacao", "VOTE");
final boolean votacaoAberta = permissaoParaVotar && isVotacaoAberta();
form = new Form<Object>("form");
add(form);
add(new MenuPanel("menu"));
add(new BookmarkablePageLink<Void>("voltar", HomePage.class));
add(new Label("proposta.identificador"));
add(new Label("eixo.titulo"));
votacaoContainer = new WebMarkupContainer("votacaoContainer");
votacaoContainer.setOutputMarkupId(true);
add(votacaoContainer);
votacaoContainer.add(feedbackPanel = new FeedbackPanel("feedbackPanel"));
votacaoContainer.add(totalVotos = new Label("totalVotos"));
// votacaoContainer.add(votosUsuario = new Label("votosUsuario"));
votacaoContainer.add(votosDisponiveis = new Label("votosDisponiveis"));
votacaoContainer.add(form);
AjaxButton cancelarVoto = new AjaxButton("cancelarVoto", form) {
@Override
protected void onSubmit(AjaxRequestTarget target,
Form<?> form) {
target.addComponent(form);
VotacaoPage.this.onAjaxRequest(target);
try {
PriorizacaoServiceUtil.deleteVoto(propostaId);
} catch (SystemException e) {
throw new RuntimeException(e);
} catch (PortalException e) {
error("Proposta excluída");
throw new RestartResponseException(HomePage.class);
}
// Força recarregar o modelo
VotacaoPage.this.getDefaultModel().detach();
// Atualiza a visibilidade
configuraVisibilidade();
target.addComponent(votacaoContainer);
}
@Override
public boolean isVisible() {
return votacaoAberta;
}
};
cancelarVoto.add(new WebComponent("icone") {
@Override
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
checkComponentTag(tag, "img");
String imageUrl;
if (getModelObject().isPodeCancelarVoto())
imageUrl = "ico_menos.png";
else
imageUrl = "ico_menos_inativo.png";
tag.put("src", context + "html/imagens/" + imageUrl);
}
});
form.add(cancelarVoto);
form.add(new WebComponent("votosUsuario") {
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
checkComponentTag(tag, "img");
Integer votos = (Integer) getDefaultModelObject();
if (votos == null)
votos = 0;
tag.put("src", context + "html/imagens/ico_check"
+ votos + ".png");
}
@Override
public boolean isVisible() {
return permissaoParaVotar;
}
});
AjaxButton votar = new AjaxButton("votar", form) {
@Override
protected void onSubmit(AjaxRequestTarget target,
Form<?> form) {
target.addComponent(form);
VotacaoPage.this.onAjaxRequest(target);
try {
PriorizacaoServiceUtil.addVoto(propostaId);
} catch (TotalVotosExcedidoException e) {
error("Você já excedeu a quantidade máxima de votos");
} catch (VotosPorPropostaExcedidoException e) {
error("Você já votou o máximo de vezes nesta proposta");
} catch (SystemException e) {
throw new RuntimeException(e);
} catch (PortalException e) {
error("Proposta excluída");
throw new RestartResponseException(HomePage.class);
}
// Força recarregar o modelo
VotacaoPage.this.getDefaultModel().detach();
// Atualiza a visibilidade
configuraVisibilidade();
target.addComponent(votacaoContainer);
}
@Override
public boolean isVisible() {
return votacaoAberta;
}
};
votar.add(new WebComponent("icone") {
@Override
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
checkComponentTag(tag, "img");
String imageUrl;
if (getModelObject().isPodeVotar())
imageUrl = "ico_mais.png";
else
imageUrl = "ico_mais_inativo.png";
tag.put("src", context + "html/imagens/" + imageUrl);
}
});
form.add(votar);
add( new Label("proposta.texto").setEscapeModelStrings(false));
}
/**
* Método chamado quando houver alguma requisição AJAX
*
* @param target
*/
protected void onAjaxRequest(AjaxRequestTarget target) {
}
}