/**
* 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.admin.pages.proposta;
import org.apache.wicket.PageParameters;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.markup.html.JavascriptPackageResource;
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.form.RequiredTextField;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.internal.HtmlHeaderContainer;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.validation.validator.StringValidator;
import br.gov.camara.edemocracia.portlets.priorizacao.InvalidIdentificadorException;
import br.gov.camara.edemocracia.portlets.priorizacao.model.Proposta;
import br.gov.camara.edemocracia.portlets.priorizacao.service.PriorizacaoServiceUtil;
import br.gov.camara.edemocracia.portlets.priorizacao.ui.components.EixosDropDown;
import br.gov.camara.edemocracia.portlets.priorizacao.ui.components.TopicosDropDown;
import br.gov.camara.edemocracia.portlets.priorizacao.ui.util.HtmlStripper;
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;
import com.liferay.portlet.messageboards.service.MBThreadLocalServiceUtil;
public class PropostaPage extends WebPage{
private long propostaId;
private Form<Void> form;
private RequiredTextField<String> identificador;
private TextArea<String> ementa;
private TextArea<String> texto;
private EixosDropDown eixos;
private Label categoria;
private TopicosDropDown topicos;
private Link<GerenciarPropostasPage> cancelar;
private static final Log LOG = LogFactoryUtil.getLog(PropostaPage.class);
@Override
protected void onInitialize() {
super.onInitialize();
add(JavascriptPackageResource.getHeaderContribution("ckeditor/ckeditor.js"));
initCabecalho();
initMensagensFeedback();
initForm();
initIdentificador();
initEmenta();
initTexto();
initEixos();
initCategoria();
initTopicos();
initCancelar();
}
private Proposta getModelObject(){
return (Proposta) getDefaultModelObject();
}
public PropostaPage(PageParameters parameters) {
super(parameters);
if (parameters.containsKey("propostaId")) {
propostaId = Long.parseLong(parameters.getString("propostaId"));
getProposta();
}
}
@Override
public void renderHead(HtmlHeaderContainer container) {
super.renderHead(container);
String configCkEditor="CKEDITOR.config.toolbar_Basic =[['Bold', 'Italic','Link','Unlink' ]]; CKEDITOR.config.toolbar = 'Basic';";
container.getHeaderResponse().renderOnDomReadyJavascript(configCkEditor);
container.getHeaderResponse().renderOnDomReadyJavascript(String.format("CKEDITOR.replace('%s');", texto.getMarkupId()));
}
private void getProposta() {
IModel<Proposta> modelo = new LoadableDetachableModel<Proposta>() {
@Override
protected Proposta load() {
try {
return PriorizacaoServiceUtil.getProposta(propostaId);
} catch (Exception e) {
throw new RuntimeException("Unable to get proposta");
}
}
};
setDefaultModel(modelo);
}
private void initCabecalho() {
String cabecalho = getModelObject() != null ? "Editar Proposta" : "Nova Proposta";
add(new Label("cabecalho",Model.of(cabecalho)));
}
private void initMensagensFeedback() {
add(new FeedbackPanel("mensagensFeedback"));
}
private void initForm() {
form = new Form<Void>("form"){
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit() {
gravar();
}
};
add(form);
}
private void initIdentificador() {
String texto = getModelObject() != null ? getModelObject().getIdentificador() : "";
identificador = new RequiredTextField<String>("identificador",Model.of(texto));
identificador.setOutputMarkupId(true);
form.add(identificador);
}
private void initEmenta() {
String texto = getModelObject() != null ? getModelObject().getEmenta() : "";
ementa = new TextArea<String>("ementa",Model.of(texto));
ementa.setRequired(true);
ementa.setOutputMarkupId(true);
ementa.add(StringValidator.maximumLength(3000));
form.add(ementa);
}
private void initTexto() {
String textoModel = getModelObject() != null ? getModelObject().getTexto() : "";
texto = new TextArea<String>("texto",Model.of(textoModel));
texto.setOutputMarkupId(true);
form.add(texto);
}
private void initEixos(){
eixos = new EixosDropDown("eixos", UIUtils.getScopeGroupId(),null);
eixos.setRequired(true);
eixos.add(new OnChangeAjaxBehavior() {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
recarregarCategoria();
recarregarTopicos();
if (target != null){
target.addComponent(categoria);
target.addComponent(topicos);
}
}
});
if(getModelObject() != null){
try {
eixos.setModelObject(PriorizacaoServiceUtil.getEixo(getModelObject().getEixoId()));
} catch (Exception e) {
//Ignore
}
}
form.add(eixos);
}
private void initCategoria() {
categoria = new Label("categoria", Model.of(""));
categoria.setOutputMarkupId(true);
recarregarCategoria();
form.add(categoria);
}
private void initTopicos(){
if(getModelObject() != null){
topicos = new TopicosDropDown("topicos", UIUtils.getScopeGroupId(), eixos.getModelObject().getCategoryId());
try {
topicos.setModelObject(MBThreadLocalServiceUtil.getMBThread(getModelObject().getThreadId()));
} catch (Exception e) {
//Ignore
}
}else{
topicos = new TopicosDropDown("topicos", UIUtils.getScopeGroupId(),0l);
}
topicos.setRequired(true);
form.add(topicos);
}
private void initCancelar() {
cancelar = new Link<GerenciarPropostasPage>("cancelar") {
private static final long serialVersionUID = 1L;
@Override
public void onClick() {
setResponsePage(GerenciarPropostasPage.class);
}
};
form.add(cancelar);
}
private void recarregarTopicos() {
long categoryId = eixos.getModelObject() != null ? eixos.getModelObject().getCategoryId() : 0l;
topicos.recarregar(UIUtils.getScopeGroupId(), categoryId);
}
private void recarregarCategoria() {
long categoryId = eixos.getModelObject() != null ? eixos.getModelObject().getCategoryId() : 0l;
String categoria;
try {
categoria = PriorizacaoServiceUtil.getMBCategory(categoryId).getName();
} catch (Exception e) {
categoria = "";
}
this.categoria.setDefaultModelObject(categoria);
}
private void gravar(){
HtmlStripper htmlStripper = new HtmlStripper();
String identificador = this.identificador.getModelObject();
String ementa = this.ementa.getModelObject();
String texto = htmlStripper.strip(this.texto.getModelObject());
long eixoId = eixos.getModelObject() != null ? eixos.getModelObject().getEixoId() : 0l;
long threadId = topicos.getModelObject().getThreadId();
try {
if(getModelObject() != null){
PriorizacaoServiceUtil.updateProposta(propostaId, eixoId, ementa, texto, threadId, identificador);
} else {
PriorizacaoServiceUtil.addProposta(UIUtils.getScopeGroupId(), eixoId, ementa, texto, threadId, identificador);
}
info("Alterações gravadas com sucesso!");
} catch(InvalidIdentificadorException e){
error("Esse identificador já está cadastrado. Escolha outro.");
} catch (PortalException e) {
LOG.error("Erro ao gravar alterações na proposta.",e);
error("Erro ao gravar alterações.");
} catch (SystemException e) {
LOG.error("Erro ao gravar alterações na proposta.",e);
error("Erro ao gravar alterações.");
}
setResponsePage(GerenciarPropostasPage.class);
setRedirect(true);
}
}