/* Copyright 2014 InterCommIT b.v. * * This file is part of the "Weaves" project hosted on https://github.com/intercommit/Weaves * * Weaves is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * Weaves is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Weaves. If not, see <http://www.gnu.org/licenses/>. * */ package nl.intercommit.weaves.components; import java.net.URLDecoder; import java.util.ArrayList; import java.util.List; import nl.intercommit.weaves.growler.Message; import org.apache.commons.lang.StringEscapeUtils; import org.apache.tapestry5.Asset; import org.apache.tapestry5.BindingConstants; import org.apache.tapestry5.MarkupWriter; import org.apache.tapestry5.annotations.AfterRender; import org.apache.tapestry5.annotations.Import; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.annotations.SessionState; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.javascript.JavaScriptSupport; /** * Growler-like user feedback based on: https://github.com/prtksxna/growl-prototype/ * * TODO: Support for zone updates. * * @tapestrydoc */ @Import(stylesheet={"growler/Growler.css"},library={"growler/Growler.js"}) public class Growler { @SessionState(create=false) private List<Message> _msgs; @Inject private JavaScriptSupport js; @Parameter(defaultPrefix = BindingConstants.ASSET, value = "growler/error.png") private Asset errorimage; @Parameter(defaultPrefix = BindingConstants.ASSET, value = "growler/info.png") private Asset infoimage; @Parameter(defaultPrefix = BindingConstants.ASSET, value = "growler/warn.png") private Asset warnimage; @AfterRender private void displayUserMessages(final MarkupWriter writer) { js.addScript("var growl = new k.Growler();", ""); String imageUrl = ""; if (_msgs !=null) { for (Message msg: _msgs) { switch(msg.getLevel()) { case ERROR:{ imageUrl = errorimage.toClientURL(); js.addScript("growl."+msg.getLevel().name().toLowerCase()+"('"+StringEscapeUtils.escapeJavaScript(URLDecoder.decode(msg.getMessage()))+"',{ className: 'atwork', image: '"+imageUrl+"', sticky: true});", ""); break; } case INFO: { imageUrl = infoimage.toClientURL(); js.addScript("growl."+msg.getLevel().name().toLowerCase()+"('"+StringEscapeUtils.escapeJavaScript(URLDecoder.decode(msg.getMessage()))+"',{ className: 'atwork', image: '"+imageUrl+"', sticky: true,life: 3});", ""); break; } case WARN: { imageUrl = warnimage.toClientURL(); js.addScript("growl."+msg.getLevel().name().toLowerCase()+"('"+StringEscapeUtils.escapeJavaScript(URLDecoder.decode(msg.getMessage()))+"',{ className: 'atwork', image: '"+imageUrl+"', sticky: true,life: 5});", ""); break; } } } _msgs.clear(); } } public void addMessage(final Message msg) { if (_msgs == null) { _msgs = new ArrayList<Message>(); } _msgs.add(msg); } }