/* 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.util.List; import org.apache.tapestry5.ComponentResources; import org.apache.tapestry5.EventConstants; import org.apache.tapestry5.Link; import org.apache.tapestry5.MarkupWriter; import org.apache.tapestry5.annotations.Events; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.dom.Element; import org.apache.tapestry5.internal.InternalConstants; import org.apache.tapestry5.ioc.Messages; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.annotations.Symbol; import org.apache.tapestry5.services.AssetSource; /** * Generates a series of links used to jump to a particular page index within the overall data set. * * TODO: support for zones * TODO: should be able to remove the 'row' column ? * * @tapestrydoc */ @Events({InternalConstants.GRID_INPLACE_UPDATE + " (internal event)","pagesize"}) public class PagedGridPager { @Parameter(required = true) private boolean hasNextPage; /** * The number of rows displayed per page. */ @Parameter(required = true) private int rowsPerPage; /** * The current page number (indexed from 1). */ @Parameter(required = true) private int currentPage; @Parameter(required = true) private List<Long> pagination; @Inject private ComponentResources resources; @Inject private Messages messages; @Inject private AssetSource as; @Inject @Symbol(nl.intercommit.weaves.SymbolConstants.BOOTSTRAP_ENABLED) private boolean bootstrap; void beginRender(final MarkupWriter writer) { if (bootstrap) { writeBootStrappedPager(writer); } else { writeTapestryPager(writer); } } /* * http://getbootstrap.com/components/#pagination */ private void writeBootStrappedPager(final MarkupWriter writer) { writer.element("ul","class","pagination"); if (currentPage> 1) { writer.element("li"); writer.element("a", "href",resources.createEventLink(EventConstants.ACTION, currentPage-1)); writer.write("<<"); writer.end(); writer.end(); } else { writer.element("li","class","disabled"); writer.element("a", "href","#"); writer.write("<<"); writer.end(); writer.end(); } if (hasNextPage) { writer.element("li"); writer.element("a", "href",resources.createEventLink(EventConstants.ACTION, currentPage+1)); writer.write(">>"); writer.end(); writer.end(); } else { writer.element("li","class","disabled"); writer.element("a", "href","#"); writer.write(">>"); writer.end(); writer.end(); } writer.element("li"); writer.element("a", "href",resources.createEventLink(EventConstants.ACTION, currentPage)); writer.element("span","class","glyphicon glyphicon-refresh"); writer.end(); writer.write(" refresh"); writer.end(); writer.end(); // dropdown pagesize selector..// fuckina writer.element("li","class","dropdown"); writer.writeRaw("<a href=\"#\" data-toggle=\"dropdown\" class=\"dropdown-toggle\"><b class=\"caret\"></b> pagesize <span class=\"badge\">"+rowsPerPage+"</span></a>" + "<ul class=\"dropdown-menu\">"); for (final Long pagesize: pagination) { final Link link = resources.getContainer().getComponentResources().createEventLink("pagesize",pagesize); writer.writeRaw("<li><a href=\""+link+"\">"+pagesize+"</a></li>"); } writer.writeRaw("</ul>"); writer.end(); // li writer.end(); // ul } private void writeTapestryPager(final MarkupWriter writer) { writer.element("div", "class", "t-data-grid-pager"); final Element divElement = writer.element("div", "class","paged_navigation", "style","float:left"); if (currentPage> 1) { writePageLink(divElement,currentPage-1,"prev_page"); } else { writePageLink(divElement,-1,"prev_page_disabled"); } if (hasNextPage) { writePageLink(divElement,currentPage+1,"next_page"); } else { writePageLink(divElement,-1,"next_page_disabled"); } writePageLink(divElement,currentPage,"refresh"); writer.end(); final Element divPagerRows = writer.element("div", "class","paged_rows"); divPagerRows.raw(messages.get("records_per_page")+" : "); final Link link = resources.getContainer().getComponentResources().createEventLink("pagesize","$pg$"); Element select = writer.element("select","class","t-data-grid-pageselect","onchange","changePageSize('"+link.toURI()+"',this);"); for (final Long size: pagination) { /* * Generate an eventlink for the container which normally is the org.apache.tapestry5.corelib.components.Grid component * and generate an event for it, the PagedGrid for example catches this event.. */ if (size.intValue() == rowsPerPage) { select = select.element("option","value",""+size,"selected","selected"); } else { select = select.element("option","value", ""+size); } select.text(""+size); } writer.end(); // selectbox writer.end(); // paged_rows div writer.end(); // t-data-grid-pager div } private void writePageLink(final Element element, final int pageIndex,final String display) { String hrefLink = ""; Link link = null; if (pageIndex != -1) { link = resources.createEventLink(EventConstants.ACTION, pageIndex); hrefLink= link.toString(); } else { hrefLink = "#"; } final Element aElement = element.element("a", "href", hrefLink, "title", messages.get(display), "class",display); aElement.element("img", "src",as.getClasspathAsset(resources.getBaseResource().getFolder()+"/"+display+".png").toClientURL()); } /** * Normal, non-Ajax event handler. */ void onAction(final int newPage) { currentPage = newPage; } }