Author: woonsan Date: Wed Dec 16 19:58:44 2009 New Revision: 891409 URL: http://svn.apache.org/viewvc?rev=891409&view=rev Log: JS2-1057: Adding pagination
Modified: portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/toolbox/JetspeedToolbox.java portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/toolbox/toolbox.jsp Modified: portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/toolbox/JetspeedToolbox.java URL: http://svn.apache.org/viewvc/portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/toolbox/JetspeedToolbox.java?rev=891409&r1=891408&r2=891409&view=diff ============================================================================== --- portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/toolbox/JetspeedToolbox.java (original) +++ portals/jetspeed-2/applications/j2-admin/trunk/src/main/java/org/apache/jetspeed/portlets/toolbox/JetspeedToolbox.java Wed Dec 16 19:58:44 2009 @@ -18,7 +18,9 @@ import java.io.IOException; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.portlet.ActionRequest; import javax.portlet.ActionResponse; @@ -26,6 +28,7 @@ import javax.portlet.PortletConfig; import javax.portlet.PortletContext; import javax.portlet.PortletException; +import javax.portlet.PortletPreferences; import javax.portlet.PortletRequest; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; @@ -102,9 +105,15 @@ public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException { - request.setAttribute("categories", retrieveCategories(request)); + List<String> categories = retrieveCategories(request); + request.setAttribute("categories", categories); + Map<String, String> categoryKeywordsMap = retrieveCategoryKeywordsMap(categories, request); + request.setAttribute("categoryKeywords", categoryKeywordsMap); + request.setAttribute("layouts", LayoutBean.retrieveLayouts(request, decorationFactory)); request.setAttribute("themes", ThemeBean.retrieveThemes(request, decorationFactory)); + PortletPreferences prefs = request.getPreferences(); + request.setAttribute("prefs", prefs.getMap()); boolean hasEditAccess = false; @@ -186,4 +195,18 @@ return categories; } + public Map<String, String> retrieveCategoryKeywordsMap(List<String> categories, PortletRequest request) throws PortletException + { + Map<String, String> keywordsMap = new HashMap<String, String>(); + PortletPreferences prefs = request.getPreferences(); + + for (String category : categories) + { + String keywords = prefs.getValue("Keywords:" + category, ""); + keywordsMap.put(category, keywords); + } + + return keywordsMap; + } + } Modified: portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/toolbox/toolbox.jsp URL: http://svn.apache.org/viewvc/portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/toolbox/toolbox.jsp?rev=891409&r1=891408&r2=891409&view=diff ============================================================================== --- portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/toolbox/toolbox.jsp (original) +++ portals/jetspeed-2/applications/j2-admin/trunk/src/main/webapp/WEB-INF/view/toolbox/toolbox.jsp Wed Dec 16 19:58:44 2009 @@ -31,16 +31,17 @@ <portlet:defineObjects/> <c_rt:set var="requestContext" value="<%=request.getAttribute(RequestContext.REQUEST_PORTALENV)%>"/> -<c:set var="portalContextPrefix" value="${requestContext.request.contextPath}"/> <c:set var="portalContextPath" value="${requestContext.request.contextPath}"/> <c:set var="portalPagePath" value="${requestContext.portalURL.path}"/> <c:if test="${empty portalPagePath}"> <c:set var="portalPagePath" value="/"/> </c:if> +<c:set var="portletPageSize" value="${prefs['Rows'][0]}"/> + <table style="border-collapse: collapse; width: 100%; margin-top: 0px; margin-bottom: 0px; float: left;"> <tr> - <td class="portlet-section-subheader" colspan='10'> + <td class="portlet-section-subheader"> <a href="#" id="<portlet:namespace/>portletsTabAction">Portlets</a> | <a href="#" id="<portlet:namespace/>layoutTabAction">Layout</a> @@ -55,21 +56,21 @@ <form id="<portlet:namespace/>form"> <table id="<portlet:namespace/>portletsTab" style="display: none; border-collapse: collapse; width: 100%; margin-top: 0px; margin-bottom: 0px; float: left;"> <tr> - <th class="portlet-section-header" colspan="10">Portlets</th> + <th class="portlet-section-header">Portlets</th> </tr> <tr> - <td class="portlet-section-subheader" colspan='10'> + <td class="portlet-section-subheader"> <input type="text" name="query" size="15" value="" > <input type="submit" value="Search" /> </td> </tr> <tr> - <td class="portlet-section-subheader" colspan='10'> + <td class="portlet-section-subheader"> <select id="<portlet:namespace/>categories"> <option value="">Choose a category</option> <c:forEach var="category" items="${categories}"> - <option value="${category}">${category}</option> + <option value="${category}" keywords="${categoryKeywords[category]}">${category}</option> </c:forEach> </select> </td> @@ -82,7 +83,22 @@ </tr> <tr> - <th class="portlet-section-header" colspan="2"></th> + <td class="portlet-section-subheader"> + <div id="<portlet:namespace/>pageNavBar" class="jstbPageNavBar"> + <a href="#" class="jstbPageNav" pageIndex="first"><<</a> + <a href="#" class="jstbPageNav" pageIndex="prev"><</a> + <select id="<portlet:namespace/>pageNavIndex"> + <option value="">Page</option> + </select> + </select> + <a href="#" class="jstbPageNav" pageIndex="next">></a> + <a href="#" class="jstbPageNav" pageIndex="last">>></a> + </div> + </td> + </tr> + + <tr> + <th class="portlet-section-header"></th> </tr> </table> </form> @@ -170,7 +186,57 @@ </table> <script language="javascript"> -YUI().use('io', 'json', 'node-base', 'cookie', 'jetui-portal', function(Y) { +YUI().use('jetui-portal', 'io', 'json', 'node-base', 'cookie', function(Y) { + + var pagination = { + portlet : { uri : null, totalSize : 0, pageSize : ${portletPageSize}, beginIndex : 0 }, + + getPageBeginIndex : function(info, scrollTo) { + if (isNaN(scrollTo)) { + if ("first" == scrollTo) { + return 0; + } else if ("prev" == scrollTo) { + return Math.max(info.beginIndex - info.pageSize, 0); + } else if ("next" == scrollTo) { + var lastPageBeginIndex = 0; + if (info.totalSize > 0) { + lastPageBeginIndex = parseInt((info.totalSize - 1) / info.pageSize) * info.pageSize; + } + return Math.min(info.beginIndex + info.pageSize, lastPageBeginIndex); + } else if ("last" == scrollTo) { + var lastPageBeginIndex = 0; + if (info.totalSize > 0) { + lastPageBeginIndex = parseInt((info.totalSize - 1) / info.pageSize) * info.pageSize; + } + return lastPageBeginIndex; + } else { + return -1; + } + } else { + var lastPageBeginIndex = 0; + if (info.totalSize > 0) { + lastPageBeginIndex = parseInt((info.totalSize - 1) / info.pageSize) * info.pageSize; + } + return Math.min((parseInt(scrollTo) - 1) * info.pageSize, lastPageBeginIndex); + } + }, + + getPageCount : function(info) { + var count = parseInt(info.totalSize / info.pageSize); + if (info.totalSize % info.pageSize != 0) { + ++count; + } + return count; + }, + + getCurrentPageIndex : function(info) { + if (info.totalSize > 0) { + return parseInt(info.beginIndex / info.pageSize) + 1; + } else { + return 0; + } + } + }; function switchTab(e) { var tabId = null; @@ -222,6 +288,9 @@ return; } + pagination.portlet.totalSize = dataOut.totalSize; + pagination.portlet.beginIndex = Math.max(dataOut.beginIndex, 0); + var portletsPanel = Y.Node.one("#<portlet:namespace/>portletItemsPanel"); var clonedPortletsPanel = portletsPanel.cloneNode(false); portletsPanel.get("parentNode").replaceChild(clonedPortletsPanel, portletsPanel); @@ -236,9 +305,9 @@ clone.setStyle('display', ''); var imgNode = clone.one('img'); if (def.portletIcon) { - imgNode.set("src", "${portalContextPrefix}/images/portlets/" + def.portletIcon); + imgNode.set("src", "${portalContextPath}/images/portlets/" + def.portletIcon); } else { - imgNode.set("src", "${portalContextPefix}/images/portlets/applications-other.png"); + imgNode.set("src", "${portalContextPath}/images/portlets/applications-other.png"); } var nameNode = clone.one('div'); @@ -260,6 +329,20 @@ portletsPanel.appendChild(clone); } + + var navSel = Y.one("#<portlet:namespace/>pageNavIndex"); + var options = navSel.getElementsByTagName("OPTION"); + for (var i = options.size() - 1; i > 0; i--) { + navSel.removeChild(options.item(i)); + } + var pageCount = pagination.getPageCount(pagination.portlet); + for (var i = 1; i <= pageCount; i++) { + var option = Y.Node.create("<option value='" + i + "'>" + (i < 10 ? " " + i : i) + "</option>"); + navSel.appendChild(option); + } + var curPageIndex = pagination.getCurrentPageIndex(pagination.portlet); + var pageIndices = Y.Node.getDOMNode(navSel); + pageIndices.options[curPageIndex].selected = true; }; var loadPortletsInCategory = function(e) { @@ -272,8 +355,10 @@ return; } Y.Cookie.set("toolboxcat", category); - var uri = "${portalContextPrefix}/services/portletregistry/definition/?_type=json"; + var uri = "${portalContextPath}/services/portletregistry/definition/?_type=json"; + uri += "&max=" + pagination.portlet.pageSize + "&begin=0"; uri += "&query=" + category; + pagination.portlet.uri = uri; var request = Y.io(uri, { on: { complete: onLoadPortletComplete } }); Y.Node.getDOMNode(Y.Node.one("#<portlet:namespace/>form")).query.value = ""; } @@ -281,14 +366,43 @@ var loadPortletsByQuery = function(e) { var form = Y.Node.getDOMNode(e.target); var query = form.query.value; - var uri = "${portalContextPrefix}/services/portletregistry/definition/?_type=json"; + var uri = "${portalContextPath}/services/portletregistry/definition/?_type=json"; + uri += "&max=" + pagination.portlet.pageSize + "&begin=0"; if (query) { uri += "&query=" + query; } + pagination.portlet.uri = uri; var request = Y.io(uri, { on: { complete: onLoadPortletComplete } }); - Y.Node.getDOMNode(Y.Node.one("#<portlet:namespace/>categories")).selectedIndex = 0; + e.halt(); + }; + var onPortletPaginationLinkClick = function(e) { + var navElem = e.target; + var beginIndex = pagination.getPageBeginIndex(pagination.portlet, navElem.getAttribute("pageIndex")); + + if (beginIndex != -1 && beginIndex != pagination.portlet.beginIndex) { + var uri = pagination.portlet.uri.replace(/&begin=\d+/, "&begin=" + beginIndex); + var request = Y.io(uri, { on: { complete: onLoadPortletComplete } }); + } + + e.halt(); + }; + + var onPortletPaginationSelectChange = function(e) { + var pageIndices = Y.Node.getDOMNode(e.target); + var pageIndex = pageIndices.options[pageIndices.selectedIndex].value; + if (pageIndex) { + var beginIndex = pagination.getPageBeginIndex(pagination.portlet, pageIndex); + + if (beginIndex != -1 && beginIndex != pagination.portlet.beginIndex) { + var uri = pagination.portlet.uri.replace(/&begin=\d+/, "&begin=" + beginIndex); + var request = Y.io(uri, { on: { complete: onLoadPortletComplete } }); + } + } else { + var curPageIndex = pagination.getCurrentPageIndex(pagination.portlet); + pageIndices.options[curPageIndex].selected = true; + } e.halt(); }; @@ -308,7 +422,7 @@ return; } - var portal = JETUI_YUI.getPortalInstance(); + var portal = (JETUI_YUI ? JETUI_YUI.getPortalInstance() : null); if (portal) { portal.addPortlet(dataOut); } else { @@ -321,7 +435,7 @@ var portletUniqueName = a.getAttribute("portletUniqueName"); if (portletUniqueName) { - var uri = "${portalContextPrefix}/services/pagelayout/fragment/portlet/" + portletUniqueName + "/?_type=json"; + var uri = "${portalContextPath}/services/pagelayout/fragment/portlet/" + portletUniqueName + "/?_type=json"; var config = { on: { complete: onAddPortletComplete }, method: "POST", @@ -341,6 +455,13 @@ Y.on("change", loadPortletsInCategory, "#<portlet:namespace/>categories"); Y.on("submit", loadPortletsByQuery, "#<portlet:namespace/>form"); + var pageNavBar = Y.one("#<portlet:namespace/>pageNavBar"); + var navLinks = pageNavBar.all(".jstbPageNav"); + navLinks.each(function(v, k) { + v.on("click", onPortletPaginationLinkClick); + }); + Y.one("#<portlet:namespace/>pageNavIndex").on("change", onPortletPaginationSelectChange); + var tabId = Y.Cookie.get("toolboxtab"); if (!tabId) { tabId = "portlets"; --------------------------------------------------------------------- To unsubscribe, e-mail: jetspeed-dev-unsubscr...@portals.apache.org For additional commands, e-mail: jetspeed-dev-h...@portals.apache.org