/* 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 javax.management.RuntimeErrorException;
import org.apache.commons.lang.ArrayUtils;
import org.apache.tapestry5.BindingConstants;
import org.apache.tapestry5.Block;
import org.apache.tapestry5.ComponentEventCallback;
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.Link;
import org.apache.tapestry5.MarkupConstants;
import org.apache.tapestry5.MarkupWriter;
import org.apache.tapestry5.annotations.CleanupRender;
import org.apache.tapestry5.annotations.OnEvent;
import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.annotations.SetupRender;
import org.apache.tapestry5.corelib.base.AbstractLink;
import org.apache.tapestry5.dom.Element;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.annotations.Symbol;
import org.apache.tapestry5.ioc.internal.util.TapestryException;
import org.apache.tapestry5.ioc.services.TypeCoercer;
import org.apache.tapestry5.services.ClientBehaviorSupport;
import org.apache.tapestry5.services.Request;
import org.apache.tapestry5.services.ajax.AjaxResponseRenderer;
import org.apache.tapestry5.services.ajax.JavaScriptCallback;
import org.apache.tapestry5.services.javascript.JavaScriptSupport;
/**
* A bootstrap modal see: http://getbootstrap.com/javascript/#modals
*
*/
public class Modal extends AbstractLink {
@Parameter(allowNull=true,defaultPrefix=BindingConstants.LITERAL)
private String block;
@Parameter(allowNull=true,defaultPrefix=BindingConstants.LITERAL)
private String event;
@Parameter
private Object[] context;
@Inject
@Symbol(nl.intercommit.weaves.SymbolConstants.BOOTSTRAP_ENABLED)
private boolean bootstrap;
@Inject
private ComponentResources resources;
@Inject
private JavaScriptSupport jss;
@Inject
private ClientBehaviorSupport cbs;
@Inject
private AjaxResponseRenderer arr;
@Inject
private Request request;
@Inject
private TypeCoercer tc;
private String _modalId;
private String _generatedZoneID;
@SetupRender
private void init() {
if (!bootstrap) {
throw new RuntimeException("Bootstrap (stack) should be enabled for this component");
}
if (block == null && event == null) {
throw new RuntimeException("Either block or event must be specified");
}
_generatedZoneID = jss.allocateClientId("modalZone");
cbs.addZone(_generatedZoneID, "show", "none");
_modalId = jss.allocateClientId(resources);
}
@OnEvent(value="fetchModalContent")
private void openModal(final Object... localcontext) {
if (block != null) {
arr.addRender(tc.coerce(localcontext[1],String.class), resources.getPage().getComponentResources().findBlock(block));
} else {
resources.triggerEvent(event,ArrayUtils.subarray(localcontext,2,localcontext.length), new ComponentEventCallback<Block>() {
public boolean handleResult(Block result) {
if (result != null) {
arr.addRender(tc.coerce(localcontext[1],String.class), result);
return true;
}
return false;
};
});
}
arr.addCallback(new JavaScriptCallback() {
@Override
public void run(JavaScriptSupport javascriptSupport) {
javascriptSupport.addScript("$T5_JQUERY('#m_"+tc.coerce(localcontext[0],String.class)+"').modal('toggle');");
}
});
}
void beginRender(MarkupWriter writer)
{
if (isDisabled()) return;
final Link link = resources.createEventLink("fetchModalContent",ArrayUtils.addAll(new Object[] {_modalId, _generatedZoneID},context));
writeLink(writer, link);
if (_generatedZoneID != null)
{
if (!request.isXHR())
writer.getElement().forceAttributes(MarkupConstants.ONCLICK, MarkupConstants.WAIT_FOR_PAGE);
cbs.linkZone(getClientId(), _generatedZoneID, link);
}
}
void afterRender(MarkupWriter writer) {
if (isDisabled()) return;
writer.end(); // <a>
}
@CleanupRender
void createModal(MarkupWriter writer) {
// write the modal , somewhere below the body
final Element body = writer.getDocument().getRootElement().find("body");
final Element modal = body.element("div", "class","modal","id","m_"+_modalId);
final Element dialog = modal.element("div", "class","modal-dialog");
final Element content = dialog.element("div", "class","modal-content");
content.element("div", "id",_generatedZoneID);
}
}