You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rave.apache.org by ja...@apache.org on 2011/10/20 13:32:12 UTC

svn commit: r1186745 - in /incubator/rave/trunk: rave-components/rave-core/src/main/java/org/apache/rave/portal/service/ rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/ rave-components/rave-core/src/test/java/org/apache/rav...

Author: jasha
Date: Thu Oct 20 11:32:12 2011
New Revision: 1186745

URL: http://svn.apache.org/viewvc?rev=1186745&view=rev
Log:
RAVE-301 basic widget admin functionality (no search yet)

Added:
    incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/views/admin/widgetdetail.jsp
      - copied, changed from r1186623, incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/views/admin/userdetail.jsp
Modified:
    incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/WidgetService.java
    incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultWidgetService.java
    incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/WidgetServiceTest.java
    incubator/rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/admin/WidgetController.java
    incubator/rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java
    incubator/rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/admin/WidgetControllerTest.java
    incubator/rave/trunk/rave-portal-resources/src/main/resources/messages.properties
    incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/views/admin/widgets.jsp
    incubator/rave/trunk/rave-portal-resources/src/main/webapp/css/default.css

Modified: incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/WidgetService.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/WidgetService.java?rev=1186745&r1=1186744&r2=1186745&view=diff
==============================================================================
--- incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/WidgetService.java (original)
+++ incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/WidgetService.java Thu Oct 20 11:32:12 2011
@@ -101,4 +101,11 @@ public interface WidgetService {
      * @return Widget if it is new and can be stored, otherwise {@literal null}
      */
     Widget registerNewWidget(Widget widget);
+
+    /**
+     * Updates {@link Widget}
+     *
+     * @param widget to save
+     */
+    void updateWidget(Widget widget);
 }

Modified: incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultWidgetService.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultWidgetService.java?rev=1186745&r1=1186744&r2=1186745&view=diff
==============================================================================
--- incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultWidgetService.java (original)
+++ incubator/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultWidgetService.java Thu Oct 20 11:32:12 2011
@@ -126,4 +126,9 @@ public class DefaultWidgetService implem
         }
         return widgetRepository.save(widget);
     }
+
+    @Override
+    public void updateWidget(Widget widget) {
+        widgetRepository.save(widget);
+    }
 }

Modified: incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/WidgetServiceTest.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/WidgetServiceTest.java?rev=1186745&r1=1186744&r2=1186745&view=diff
==============================================================================
--- incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/WidgetServiceTest.java (original)
+++ incubator/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/WidgetServiceTest.java Thu Oct 20 11:32:12 2011
@@ -33,6 +33,7 @@ import java.util.List;
 import static org.easymock.EasyMock.createNiceMock;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.nullValue;
 import static org.hamcrest.CoreMatchers.sameInstance;
@@ -41,6 +42,7 @@ import static org.junit.Assert.assertNot
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Test for {@link DefaultWidgetService}
@@ -210,4 +212,19 @@ public class WidgetServiceTest {
         Widget noWidget = service.registerNewWidget(widget);
         assertNull("Widget already exists", noWidget);
     }
+
+    @Test
+    public void updateWidget() {
+        final String widgetUrl =
+                        "http://hosting.gmodules.com/ig/gadgets/file/112581010116074801021/hamster.xml";
+        Widget widget = new Widget();
+        widget.setUrl(widgetUrl);
+        expect(repository.save(widget)).andReturn(widget).once();
+        replay(repository);
+
+        service.updateWidget(widget);
+        verify(repository);
+
+        assertTrue("Save called", true);
+    }
 }

Modified: incubator/rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/admin/WidgetController.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/admin/WidgetController.java?rev=1186745&r1=1186744&r2=1186745&view=diff
==============================================================================
--- incubator/rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/admin/WidgetController.java (original)
+++ incubator/rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/admin/WidgetController.java Thu Oct 20 11:32:12 2011
@@ -19,22 +19,80 @@
 
 package org.apache.rave.portal.web.controller.admin;
 
+import org.apache.rave.portal.model.Widget;
+import org.apache.rave.portal.model.WidgetStatus;
+import org.apache.rave.portal.model.util.SearchResult;
+import org.apache.rave.portal.service.WidgetService;
+import org.apache.rave.portal.web.util.ModelKeys;
 import org.apache.rave.portal.web.util.ViewNames;
+import org.apache.rave.portal.web.validator.NewWidgetValidator;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.SessionAttributes;
+
+import static org.apache.rave.portal.model.WidgetStatus.values;
 
 /**
  * Admin controller to manipulate Widget data
  */
 @Controller
+@SessionAttributes({"widget"})
 public class WidgetController {
 
+    private static final String SELECTED_ITEM = "widgets";
+
+    @Autowired
+    private WidgetService widgetService;
+
+    @Autowired
+    private NewWidgetValidator widgetValidator;
+
     @RequestMapping(value = "/admin/widgets", method = RequestMethod.GET)
-    public String viewWidgets(Model model) {
-        AdminControllerUtil.addNavigationMenusToModel("widgets", model);
+    public String viewWidgets(@RequestParam(required = false, defaultValue = "0") int offset, Model model) {
+        AdminControllerUtil.addNavigationMenusToModel(SELECTED_ITEM, model);
+        final SearchResult<Widget> widgets =
+                widgetService.getLimitedListOfWidgets(offset, AdminControllerUtil.DEFAULT_PAGE_SIZE);
+        model.addAttribute(ModelKeys.SEARCHRESULT, widgets);
         return ViewNames.ADMIN_WIDGETS;
     }
 
+    @RequestMapping(value = "/admin/widgetdetail/{widgetid}", method = RequestMethod.GET)
+    public String viewWidgetDetail(@PathVariable("widgetid") Long widgetid, Model model) {
+        AdminControllerUtil.addNavigationMenusToModel(SELECTED_ITEM, model);
+        model.addAttribute(widgetService.getWidget(widgetid));
+        return ViewNames.ADMIN_WIDGETDETAIL;
+    }
+
+    @RequestMapping(value = "/admin/widgetdetail/update", method = RequestMethod.POST)
+    public String updateWidgetDetail(@ModelAttribute("widget") Widget widget, BindingResult result) {
+        widgetValidator.validate(widget, result);
+        if (result.hasErrors()) {
+            return ViewNames.ADMIN_WIDGETDETAIL;
+        }
+        widgetService.updateWidget(widget);
+        return "redirect:" + widget.getEntityId();
+    }
+
+    @ModelAttribute("widgetStatus")
+    public WidgetStatus[] getWidgetStatusValues() {
+        return values();
+    }
+
+
+    // setters for unit tests
+    
+    void setWidgetService(WidgetService widgetService) {
+        this.widgetService = widgetService;
+    }
+
+    void setWidgetValidator(NewWidgetValidator widgetValidator) {
+        this.widgetValidator = widgetValidator;
+    }
 }

Modified: incubator/rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java?rev=1186745&r1=1186744&r2=1186745&view=diff
==============================================================================
--- incubator/rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java (original)
+++ incubator/rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java Thu Oct 20 11:32:12 2011
@@ -35,6 +35,7 @@ public class ViewNames {
     public static final String ADMIN_USERS = "admin/users";
     public static final String ADMIN_USERDETAIL = "admin/userdetail";
     public static final String ADMIN_WIDGETS = "admin/widgets";
+    public static final String ADMIN_WIDGETDETAIL = "admin/widgetdetail";
 
     public static final String REDIRECT = "redirect:/";
 }

Modified: incubator/rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/admin/WidgetControllerTest.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/admin/WidgetControllerTest.java?rev=1186745&r1=1186744&r2=1186745&view=diff
==============================================================================
--- incubator/rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/admin/WidgetControllerTest.java (original)
+++ incubator/rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/admin/WidgetControllerTest.java Thu Oct 20 11:32:12 2011
@@ -19,14 +19,30 @@
 
 package org.apache.rave.portal.web.controller.admin;
 
+import org.apache.rave.portal.model.Widget;
+import org.apache.rave.portal.model.util.SearchResult;
+import org.apache.rave.portal.service.WidgetService;
+import org.apache.rave.portal.web.util.ModelKeys;
 import org.apache.rave.portal.web.util.ViewNames;
+import org.apache.rave.portal.web.validator.NewWidgetValidator;
 import org.junit.Before;
 import org.junit.Test;
 import org.springframework.ui.ExtendedModelMap;
 import org.springframework.ui.Model;
+import org.springframework.validation.BeanPropertyBindingResult;
+import org.springframework.validation.BindingResult;
+
+import java.util.ArrayList;
+import java.util.List;
 
 import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertTrue;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
 
 /**
  * Test for {@link WidgetController}
@@ -34,20 +50,92 @@ import static junit.framework.Assert.ass
 public class WidgetControllerTest {
 
     private static final String TABS = "tabs";
+    public static final int DEFAULT_OFFSET = 0;
+    public static final int DEFAULT_PAGESIZE = AdminControllerUtil.DEFAULT_PAGE_SIZE;
 
     private WidgetController controller;
+    private WidgetService service;
+    private NewWidgetValidator validator;
 
     @Test
     public void adminWidgets() throws Exception {
         Model model = new ExtendedModelMap();
-        String adminWidgetsView = controller.viewWidgets(model);
+
+        SearchResult<Widget> widgetSearchResult = populateWidgetSearchResult();
+        expect(service.getLimitedListOfWidgets(DEFAULT_OFFSET, DEFAULT_PAGESIZE)).andReturn(widgetSearchResult);
+        replay(service);
+        String adminWidgetsView = controller.viewWidgets(DEFAULT_OFFSET, model);
+        verify(service);
         assertEquals(ViewNames.ADMIN_WIDGETS, adminWidgetsView);
+        assertEquals(widgetSearchResult, model.asMap().get(ModelKeys.SEARCHRESULT));
         assertTrue(model.containsAttribute(TABS));
     }
 
+    @Test
+    public void viewAdminWidgetDetail() throws Exception {
+        Model model = new ExtendedModelMap();
+        Widget widget = new Widget();
+        final long entityId = 123L;
+        widget.setEntityId(entityId);
+        widget.setTitle("My widget");
+
+        expect(service.getWidget(entityId)).andReturn(widget);
+        replay(service);
+        String adminWidgetDetailView = controller.viewWidgetDetail(entityId, model);
+        verify(service);
+
+        assertEquals(ViewNames.ADMIN_WIDGETDETAIL, adminWidgetDetailView);
+        assertTrue(model.containsAttribute(TABS));
+        assertEquals(widget, model.asMap().get("widget"));
+    }
+
+    @Test
+    public void updateWidget_valid() {
+        Widget widget = new Widget(123L, "http://example.com/widget");
+        widget.setTitle("Widget title");
+        widget.setType("OpenSocial");
+        BindingResult errors = new BeanPropertyBindingResult(widget, "widget");
+
+        service.updateWidget(widget);
+        expectLastCall();
+        replay(service);
+        String view = controller.updateWidgetDetail(widget, errors);
+        verify(service);
+
+        assertFalse("No errors", errors.hasErrors());
+        assertEquals("redirect:123", view);
+
+    }
+
+    @Test
+    public void updateWidget_invalid() {
+        Widget widget = new Widget(123L, "http://broken/url");
+        BindingResult errors = new BeanPropertyBindingResult(widget, "widget");
+
+        String view = controller.updateWidgetDetail(widget, errors);
+
+        assertTrue("Errors", errors.hasErrors());
+        assertEquals(ViewNames.ADMIN_WIDGETDETAIL, view);
+
+    }
 
     @Before
     public void setUp() throws Exception {
         controller = new WidgetController();
+        service = createMock(WidgetService.class);
+        controller.setWidgetService(service);
+        validator = new NewWidgetValidator();
+        controller.setWidgetValidator(validator);
+    }
+
+
+    private static SearchResult<Widget> populateWidgetSearchResult() {
+        List<Widget> widgetList = new ArrayList<Widget>();
+        for (int i = 0; i < DEFAULT_PAGESIZE; i++) {
+            Widget widget = new Widget();
+            widget.setTitle("Widget " + i);
+            widgetList.add(widget);
+        }
+        return new SearchResult<Widget>(widgetList, 25);
     }
 }

Modified: incubator/rave/trunk/rave-portal-resources/src/main/resources/messages.properties
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal-resources/src/main/resources/messages.properties?rev=1186745&r1=1186744&r2=1186745&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal-resources/src/main/resources/messages.properties (original)
+++ incubator/rave/trunk/rave-portal-resources/src/main/resources/messages.properties Thu Oct 20 11:32:12 2011
@@ -128,6 +128,10 @@ admin.userdata.enabled=Account enabled
 admin.userdata.expired=Account expired
 admin.userdata.locked=Account locked
 admin.userdata.authorities=Authorities:
+admin.widgetdetail.title=Rave admin interface - Widget detail
+admin.widgetdetail.goback=\u00AB Back to widgets
+admin.widgetdetail.editdata=Edit widget data
+admin.widgetdetail.updatebutton=Update widget
 admin.clearsearch=Clear search
 
 admin.list.noresult=No results found
@@ -153,6 +157,7 @@ widget.type.required=Choose a widget typ
 widget.url=Location (URL)
 widget.url.malformed=URL is malformed
 widget.url.required=URL is required
+widget.widgetStatus=Status
 widget.widgetStatus.PREVIEW=This widget is waiting for approval by the site administrator.
 widget.widgetStatus.PUBLISHED=
 

Copied: incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/views/admin/widgetdetail.jsp (from r1186623, incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/views/admin/userdetail.jsp)
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/views/admin/widgetdetail.jsp?p2=incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/views/admin/widgetdetail.jsp&p1=incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/views/admin/userdetail.jsp&r1=1186623&r2=1186745&rev=1186745&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/views/admin/userdetail.jsp (original)
+++ incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/views/admin/widgetdetail.jsp Thu Oct 20 11:32:12 2011
@@ -25,79 +25,129 @@
 <%@ taglib tagdir="/WEB-INF/tags" prefix="rave" %>
 <fmt:setBundle basename="messages"/>
 
-<fmt:message key="admin.userdetail.title" var="pagetitle"/>
-
-<c:set var="canChangeUserStatus" value="${user.username ne loggedInUser}"/>
+<fmt:message key="admin.widgetdetail.title" var="pagetitle"/>
 
 <rave:rave_generic_page pageTitle="${pagetitle}">
     <rave:header pageTitle="${pagetitle}"/>
     <rave:admin_tabsheader/>
-    <div id="pageContent">
+    <div class="pageContent">
         <article class="admincontent">
             <ul class="horizontal-list goback">
-                <li><a href="<spring:url value="/app/admin/users"/>"><fmt:message key="admin.userdetail.goback"/></a>
+                <li><a href="<spring:url value="/app/admin/widgets"/>"><fmt:message key="admin.widgetdetail.goback"/></a>
                 </li>
             </ul>
-            <h2><c:out value="${user.username}"/></h2>
+            <h2><c:out value="${widget.title}"/></h2>
 
             <div class="rightcolumn">
-
+                <c:if test="${not empty widget.screenshotUrl or not empty widget.thumbnailUrl}">
+                    <section class="formbox">
+                        <c:if test="${not empty widget.screenshotUrl}">
+                            <figure class="screenshot">
+                                <img src="<c:out value="${widget.screenshotUrl}"/>" alt="">
+                                <figcaption><fmt:message key="widget.screenshotUrl"/></figcaption>
+                            </figure>
+                        </c:if>
+
+                        <c:if test="${not empty widget.thumbnailUrl}">
+                            <figure>
+                                <img src="<c:out value="${widget.thumbnailUrl}"/>" alt="">
+                                <figcaption><fmt:message key="widget.thumbnailUrl"/></figcaption>
+                            </figure>
+                        </c:if>
+                    </section>
+                </c:if>
             </div>
 
             <div class="leftcolumn">
                 <section class="formbox">
-                    <h3><fmt:message key="admin.userdetail.editdata"/></h3>
-                    <form:form id="updateUserProfile" action="update" commandName="user" method="POST">
+                    <h3><fmt:message key="admin.widgetdetail.editdata"/></h3>
+                    <form:form id="updateWidget" action="update" commandName="widget" method="POST">
                         <form:errors cssClass="error" element="p"/>
                         <fieldset>
+                            <p><fmt:message key="form.some.fields.required"/></p>
+
+                            <p>
+                                <form:label path="title"><fmt:message key="widget.title"/> *</form:label>
+                                <form:input path="title" cssClass="long" required="required" autofocus="autofocus"/>
+                                <form:errors path="title" cssClass="error"/>
+                            </p>
+
                             <p>
-                                <label for="email"><fmt:message key="page.general.email"/></label>
-                                <spring:bind path="email">
-                                    <input type="email" name="email" id="email" value="<c:out value="${status.value}"/>"
-                                           class="long"/>
+                                <spring:bind path="url">
+                                    <label for="url"><fmt:message key="widget.url"/> *</label>
+                                    <input type="url" name="url" id="url"
+                                           placeholder="http://example.com/widget.xml" required="required"
+                                           class="long" value="<c:out value="${widget.url}"/>"/>
                                 </spring:bind>
+                                <form:errors path="url" cssClass="error"/>
+                            </p>
+
+                            <p>
+                                <label for="type1"><fmt:message key="widget.type"/> *</label>
+                                <label for="type1" class="formradio"><form:radiobutton path="type" value="OpenSocial"/>
+                                    <fmt:message key="widget.type.OpenSocial"/></label>
+                                <label for="type2" class="formradio"><form:radiobutton path="type" value="W3C"/>
+                                    <fmt:message key="widget.type.W3C"/></label>
+                                <form:errors path="type" cssClass="error"/>
+                            </p>
+
+                            <p>
+                                <form:label path="description"><fmt:message key="widget.description"/></form:label>
+                                <form:textarea path="description" cssClass="long"/>
+                                <form:errors path="description" cssClass="error"/>
                             </p>
 
                             <p>
-                                <label for="openIdField"><fmt:message key="page.userprofile.openid.url"/></label>
-                                <spring:bind path="openId">
-                                    <input type="url" id="openIdField" name="openId"
-                                           value="<c:out value="${status.value}"/>" class="long"/>
+                                <form:label path="widgetStatus"><fmt:message key="widget.widgetStatus"/></form:label>
+                                <form:select path="widgetStatus" items="${widgetStatus}"/>
+                            </p>
+
+                            <p>
+                                <spring:bind path="thumbnailUrl">
+                                    <label for="thumbnailUrl"><fmt:message key="widget.thumbnailUrl"/></label>
+                                    <input type="url" name="thumbnailUrl" id="thumbnailUrl"
+                                           placeholder="http://example.com/thumbnail.png" class="long"
+                                           value="<c:out value="${widget.thumbnailUrl}"/>"/>
                                 </spring:bind>
-                                <form:errors path="openId" cssClass="error"/>
+                                <form:errors path="thumbnailUrl" cssClass="error"/>
+                            </p>
+
+                            <p>
+                                <spring:bind path="screenshotUrl">
+                                    <label for="screenshotUrl"><fmt:message key="widget.screenshotUrl"/></label>
+                                    <input type="url" name="screenshotUrl" id="screenshotUrl"
+                                           placeholder="http://example.com/screenshot.png" class="long"
+                                           value="<c:out value="${widget.screenshotUrl}"/>"/>
+                                </spring:bind>
+                                <form:errors path="screenshotUrl" cssClass="error"/>
+                            </p>
+
+                            <p>
+                                <spring:bind path="titleUrl">
+                                    <label for="titleUrl"><fmt:message key="widget.titleUrl"/></label>
+                                    <input type="url" name="titleUrl" id="titleUrl"
+                                           class="long" value="<c:out value="${widget.titleUrl}"/>"/>
+                                </spring:bind>
+                                <form:errors path="titleUrl" cssClass="error"/>
+                            </p>
+
+                            <p>
+                                <form:label path="author"><fmt:message key="widget.author"/></form:label>
+                                <form:input path="author" cssClass="long"/>
+                                <form:errors path="author" cssClass="error"/>
+                            </p>
+                            <p>
+                                <spring:bind path="authorEmail">
+                                    <label for="authorEmail"><fmt:message key="widget.authorEmail"/></label>
+                                    <input type="email" name="authorEmail" id="authorEmail" class="long"
+                                            value="<c:out value="${widget.authorEmail}"/>"/>
+                                </spring:bind>
+                                <form:errors path="titleUrl" cssClass="error"/>
                             </p>
 
-                            <div>
-                                <span class="label"><fmt:message key="admin.userdata.accountstatus"/></span>
-                                <ul class="checkboxlist">
-                                    <li>
-                                        <fmt:message key="admin.userdata.enabled" var="labelEnabled"/>
-                                        <form:checkbox path="enabled" label="${labelEnabled}"
-                                                       disabled="${canChangeUserStatus ne true}"/>
-                                    </li>
-                                    <li>
-                                        <fmt:message key="admin.userdata.expired" var="labelExpired"/>
-                                        <form:checkbox path="expired" label="${labelExpired}"
-                                                       disabled="${canChangeUserStatus ne true}"/>
-                                    </li>
-                                    <li>
-                                        <fmt:message key="admin.userdata.locked" var="labelLocked"/>
-                                        <form:checkbox path="locked" label="${labelLocked}"
-                                                       disabled="${canChangeUserStatus ne true}"/>
-                                    </li>
-                                </ul>
-                            </div>
-                        </fieldset>
-                        <fieldset>
-                            <span class="label"><fmt:message key="admin.userdata.authorities"/></span>
-                            <%--@elvariable id="authorities" type="org.apache.rave.portal.model.util.SearchResult<org.apache.rave.portal.model.Authority>"--%>
-                            <ul class="checkboxlist">
-                                <form:checkboxes path="authorities" items="${authorities.resultSet}"
-                                                 itemLabel="authority" itemValue="authority" element="li" />
-                            </ul>
                         </fieldset>
                         <fieldset>
-                            <fmt:message key="page.userprofile.button" var="updateButtonText"/>
+                            <fmt:message key="admin.widgetdetail.updatebutton" var="updateButtonText"/>
                             <input type="submit" value="${updateButtonText}"/>
                         </fieldset>
                     </form:form>

Modified: incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/views/admin/widgets.jsp
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/views/admin/widgets.jsp?rev=1186745&r1=1186744&r2=1186745&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/views/admin/widgets.jsp (original)
+++ incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/views/admin/widgets.jsp Thu Oct 20 11:32:12 2011
@@ -23,12 +23,54 @@
 <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
 <%@ taglib tagdir="/WEB-INF/tags" prefix="rave" %>
 <fmt:setBundle basename="messages"/>
+<%--@elvariable id="searchResult" type="org.apache.rave.portal.model.util.SearchResult<org.apache.rave.portal.model.Widget>"--%>
 
 <fmt:message key="admin.widgets.title" var="pagetitle"/>
 <rave:rave_generic_page pageTitle="${pagetitle}">
     <rave:header pageTitle="${pagetitle}"/>
     <rave:admin_tabsheader/>
-    <div id="pageContent">
-        <p>Content goes here</p>
+    <div class="pageContent">
+        <article class="admincontent">
+            <%--<ul class="horizontal-list searchbox">
+                <li>
+                    Searchform goes here
+                </li>
+                <c:if test="${not empty searchTerm}">
+                    <li><a href="<spring:url value="/app/admin/widgets"/>"><fmt:message key="admin.clearsearch"/></a></li>
+                </c:if>
+            </ul>--%>
+            <rave:admin_listheader/>
+            <rave:admin_paging/>
+
+            <table class="datatable widgetstable">
+                <thead>
+                <tr>
+                    <th class="largetextcell"><fmt:message key="widget.title"/></th>
+                    <th class="textcell"><fmt:message key="widget.type"/></th>
+                    <th class="textcell"><fmt:message key="widget.widgetStatus"/></th>
+                </tr>
+                </thead>
+                <tbody>
+                    <c:forEach var="widget" items="${searchResult.resultSet}">
+                        <spring:url value="/app/admin/widgetdetail/${widget.entityId}" var="detaillink"/>
+                        <tr data-detaillink="${detaillink}">
+                            <td><a href="${detaillink}"><c:out value="${widget.title}"/></a></td>
+                            <td><a href="${detaillink}"><fmt:message key="widget.type.${widget.type}" /></a></td>
+                            <td><a href="${detaillink}"><c:out value="${widget.widgetStatus}"/></a></td>
+                        </tr>
+                    </c:forEach>
+                </tbody>
+            </table>
+
+            <rave:admin_paging/>
+
+        </article>
     </div>
+
+    <script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.1.min.js"></script>
+    <script src="<spring:url value="/script/rave_admin.js"/>"></script>
+    <script>$(function() {
+        rave.admin.initAdminUi();
+    });</script>
+
 </rave:rave_generic_page>
\ No newline at end of file

Modified: incubator/rave/trunk/rave-portal-resources/src/main/webapp/css/default.css
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal-resources/src/main/webapp/css/default.css?rev=1186745&r1=1186744&r2=1186745&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal-resources/src/main/webapp/css/default.css (original)
+++ incubator/rave/trunk/rave-portal-resources/src/main/webapp/css/default.css Thu Oct 20 11:32:12 2011
@@ -739,6 +739,22 @@ span.error, label.error {
     width: 30%;
 }
 
+.admincontent figure {
+    display: block;
+    margin: 1em 0;
+    width: 100%;
+}
+.admincontent figure.screenshot img {
+    max-width: 100%;
+}
+
+.admincontent figcaption {
+    display: block;
+    margin: 0 0 1em 0;
+    padding: 0;
+    font-style: italic;
+}
+
 .formbox {
     border:1px solid #B4C4CF;
     margin:1em 10px;