You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rave.apache.org by ca...@apache.org on 2011/11/23 22:02:34 UTC

svn commit: r1205591 - in /incubator/rave/trunk/rave-portal-resources/src: main/resources/ main/webapp/WEB-INF/jsp/views/ main/webapp/css/ main/webapp/script/ test/javascript/

Author: carlucci
Date: Wed Nov 23 21:02:32 2011
New Revision: 1205591

URL: http://svn.apache.org/viewvc?rev=1205591&view=rev
Log:
RAVE-365: Display a friendly message on pages that don't have any widgets

Modified:
    incubator/rave/trunk/rave-portal-resources/src/main/resources/messages.properties
    incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/home.jsp
    incubator/rave/trunk/rave-portal-resources/src/main/webapp/css/default.css
    incubator/rave/trunk/rave-portal-resources/src/main/webapp/script/rave.js
    incubator/rave/trunk/rave-portal-resources/src/main/webapp/script/rave_layout.js
    incubator/rave/trunk/rave-portal-resources/src/test/javascript/raveSpec.js

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=1205591&r1=1205590&r2=1205591&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 Wed Nov 23 21:02:32 2011
@@ -48,6 +48,7 @@ page.general.confirmpassword=Confirm pas
 page.general.deletepage=Delete Page
 page.general.editpage=Edit Page
 page.general.email=Email address:
+page.general.empty=Add widgets to this page
 page.general.logout=Logout
 page.general.movepage=Move Page
 page.general.movethispage=Move this page:
@@ -130,7 +131,7 @@ admin.users.shorttitle=Users
 admin.users.search=Search Users
 admin.users.add=Add user
 admin.userdetail.title=Rave admin interface - User detail
-admin.userdetail.goback=\u00AB Back to users
+admin.userdetail.goback=\u00ab Back to users
 admin.userdetail.editdata=Edit user data
 admin.userdetail.action.delete.success=The user profile has been removed
 admin.userdetail.action.delete.confirm=Yes I want to delete this user
@@ -147,7 +148,7 @@ admin.widgets.search=Search Widgets
 admin.widgets.search.choosetype=Choose Type...
 admin.widgets.search.choosestatus=Choose Status...
 admin.widgetdetail.title=Rave admin interface - Widget detail
-admin.widgetdetail.goback=\u00AB Back to widgets
+admin.widgetdetail.goback=\u00ab Back to widgets
 admin.widgetdetail.editdata=Edit widget data
 admin.widgetdetail.updatebutton=Update widget
 admin.widgetdetail.action.delete.success=The widget has been removed
@@ -160,7 +161,7 @@ admin.preferencedetail.pageSize=Number o
 admin.preferencedetail.pageSize.malformed=Enter a whole number greater than 0
 admin.preferencedetail.updateButton=Update preferences
 admin.preferencedetail.action.update.success=Preferences have been updated
-admin.preferencedetail.goback=\u00AB Back to overview
+admin.preferencedetail.goback=\u00ab Back to overview
 admin.clearsearch=Clear search
 admin.delete=Delete
 

Modified: incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/home.jsp
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/home.jsp?rev=1205591&r1=1205590&r2=1205591&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/home.jsp (original)
+++ incubator/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/home.jsp Wed Nov 23 21:02:32 2011
@@ -92,6 +92,11 @@
 </div>
 <%--render the main page content (regions/widgets) --%>
 <div id="pageContent">
+    <div id="emptyPageMessageWrapper" class="hidden">
+        <div id="emptyPageMessage">
+            <a href="<spring:url value="/app/store?referringPageId=${page.entityId}" />"><fmt:message key="page.general.empty" /></a>
+        </div>
+    </div>
     <div class="regions">
     <c:forEach var="region" items="${page.regions}" varStatus="status">
     <%--@elvariable id="region" type="org.apache.rave.portal.model.Region"--%>

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=1205591&r1=1205590&r2=1205591&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 Wed Nov 23 21:02:32 2011
@@ -682,6 +682,23 @@ span.error, label.error {
     *display: inline;
 }
 
+#emptyPageMessage {
+    background-color: #FFFFFF;
+    border: 1px solid #B4C4CF;
+    border-radius: 10px 10px 10px 10px;
+    box-shadow: 1px 1px 0 #D9DADC;
+    font-weight: bold;
+    margin: 20px auto;
+    padding: 20px;
+    text-align: center;
+    width: 300px;  
+    font-size: 1.25em;
+}
+
+#emptyPageMessageWrapper {
+    padding-top: 20px;
+}
+
 /* page menu related styles */
 #pageMenuWrapper {
     position: relative;

Modified: incubator/rave/trunk/rave-portal-resources/src/main/webapp/script/rave.js
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal-resources/src/main/webapp/script/rave.js?rev=1205591&r1=1205590&r2=1205591&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal-resources/src/main/webapp/script/rave.js (original)
+++ incubator/rave/trunk/rave-portal-resources/src/main/webapp/script/rave.js Wed Nov 23 21:02:32 2011
@@ -528,7 +528,14 @@ var rave = rave || (function() {
                 $toggleIcon.removeClass(WIDGET_TOGGLE_DISPLAY_NORMAL);
                 $toggleIcon.addClass(WIDGET_TOGGLE_DISPLAY_COLLAPSED);
             }
-        }   
+        }        
+        
+        /**
+         * Displays the "empty page" message on the page
+         */
+        function displayEmptyPageMessage() {            
+            $("#emptyPageMessageWrapper").removeClass("hidden");
+        }
 
         return {
           init : init,       
@@ -540,7 +547,8 @@ var rave = rave || (function() {
           setMobileState: setMobileState,
           getMobileState: getMobileState,
           doWidgetUiCollapse: doWidgetUiCollapse,
-          toggleMobileWidget: toggleMobileWidget
+          toggleMobileWidget: toggleMobileWidget,
+          displayEmptyPageMessage: displayEmptyPageMessage
         };
 
     })();
@@ -562,7 +570,7 @@ var rave = rave || (function() {
         }
     }
 
-    function initializeWidgets(widgetsByRegionIdMap) {
+    function initializeWidgets(widgetsByRegionIdMap) {                           
         //We get the widget objects in a map keyed by region ID.  The code below converts that map into a flat array
         //of widgets with all the top widgets in each region first, then the seconds widgets in each region, then the
         //third, etc until we have all widgets in the array.  This allows us to render widgets from left to right and
@@ -594,11 +602,15 @@ var rave = rave || (function() {
             }
         }
 
-        //Initialize the widgets for supported providers
-        for (var i = 0; i < widgets.length; i++) {
-            var widget = widgets[i];
-            initializeWidget(widget);
-            widgetByIdMap[widget.regionWidgetId] = widget;
+        if (widgets.length == 0) {
+            rave.displayEmptyPageMessage();
+        } else {
+            //Initialize the widgets for supported providers
+            for (var i = 0; i < widgets.length; i++) {
+                var widget = widgets[i];
+                initializeWidget(widget);
+                widgetByIdMap[widget.regionWidgetId] = widget;
+            }           
         }
     }
 
@@ -653,6 +665,21 @@ var rave = rave || (function() {
     function isFunction(obj) {       
         return (typeof obj == "function");
     }
+    
+    /**
+     * Determines if a page is empty (has zero widgets)        
+     */
+    function isPageEmpty() {           
+        return $.isEmptyObject(widgetByIdMap);            
+    }
+    
+    /**
+     * Removes a regionWidgetId from the internal widget map
+     * @param regionWidgetId the region widget id to remove
+     */
+    function removeWidgetFromMap(regionWidgetId) {
+        delete widgetByIdMap[regionWidgetId];
+    }
 
     /**
      * Public API
@@ -801,6 +828,21 @@ var rave = rave || (function() {
          * Toggles a mobile widget collapse/restore
          * @param args
          */
-        toggleMobileWidget: ui.toggleMobileWidget
+        toggleMobileWidget: ui.toggleMobileWidget,
+        
+        /**
+         * Determines if a page is empty (has zero widgets)
+         * @param widgetByIdMap the map of widgets on the page
+         */        
+        isPageEmpty: isPageEmpty,
+        /**
+         * Removes a regionWidgetId from the internal widget map
+         * @param regionWidgetId the region widget id to remove
+         */        
+        removeWidgetFromMap: removeWidgetFromMap,
+        /**
+         * Displays the "empty page" message on the page
+         */        
+        displayEmptyPageMessage: ui.displayEmptyPageMessage
     }
 })();

Modified: incubator/rave/trunk/rave-portal-resources/src/main/webapp/script/rave_layout.js
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal-resources/src/main/webapp/script/rave_layout.js?rev=1205591&r1=1205590&r2=1205591&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal-resources/src/main/webapp/script/rave_layout.js (original)
+++ incubator/rave/trunk/rave-portal-resources/src/main/webapp/script/rave_layout.js Wed Nov 23 21:02:32 2011
@@ -434,7 +434,12 @@ rave.layout = rave.layout || (function()
             rave.api.rpc.removeWidget({
                 regionWidgetId: regionWidgetId,
                 successCallback: function() {
-                    $("#widget-" + this.regionWidgetId + "-wrapper").remove();
+                    // remove the widget from the dom and the internal memory map
+                    $("#widget-" + this.regionWidgetId + "-wrapper").remove();                    
+                    rave.removeWidgetFromMap(this.regionWidgetId);
+                    if (rave.isPageEmpty()) {
+                        rave.displayEmptyPageMessage();
+                    }
                 }
             });
         }

Modified: incubator/rave/trunk/rave-portal-resources/src/test/javascript/raveSpec.js
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal-resources/src/test/javascript/raveSpec.js?rev=1205591&r1=1205590&r2=1205591&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal-resources/src/test/javascript/raveSpec.js (original)
+++ incubator/rave/trunk/rave-portal-resources/src/test/javascript/raveSpec.js Wed Nov 23 21:02:32 2011
@@ -66,11 +66,11 @@ describe("Rave", function() {
     });
 
     describe("initWidgets", function() {
-
-        //Creates a simple mock jquery object that records one call and returns the result of the call
+        //Creates a mock jquery object with the functions we need in this context
         function createMockJQuery() {
             var html;
             var expression;
+            var classMap = [];
             $ = function(expr) {
 
                 if (typeof expr != "undefined") {
@@ -91,12 +91,29 @@ describe("Rave", function() {
                     },
                     attr: function(a, b) {
 
-                    }
+                    },                    
+                    hasClass : function (className) {
+                        return classMap.indexOf(className) != -1;
+                    },
+                    addClass : function (className) {
+                        classMap.push(className);
+                    },
+                    removeClass: function(className) {                        
+                        var idx = classMap.indexOf(className); 
+                        if (idx != -1) {
+                            classMap.splice(idx, 1); 
+                        }
+                    }   
                 }
-            };
+            };            
         }
 
         it("calls the appropriate providers", function() {
+            var HIDDEN_CLASS = "hidden";            
+            createMockJQuery(); 
+            $().addClass(HIDDEN_CLASS);
+            expect($().hasClass(HIDDEN_CLASS)).toEqual(true);
+            
             var widgetsByRegionIdMap = {};
             widgetsByRegionIdMap[1] = [
                     {type:"FOO"},
@@ -110,10 +127,13 @@ describe("Rave", function() {
             rave.registerProvider(provider2);
             rave.initWidgets(widgetsByRegionIdMap);
             expect(provider1.initWidgetsWasCalled(2)).toBeTruthy();
-            expect(provider2.initWidgetsWasCalled(2)).toBeTruthy();
+            expect(provider2.initWidgetsWasCalled(2)).toBeTruthy();   
+            expect($().hasClass(HIDDEN_CLASS)).toEqual(true);
         });
 
         it("renders widgets in the appropriate order (first 'row', second 'row', third 'row', ...)", function() {
+            createMockJQuery(); 
+            
             var widgetsByRegionIdMap = {};
             widgetsByRegionIdMap[1] = [
                     {type:"FOO", renderOrder:1},
@@ -150,6 +170,8 @@ describe("Rave", function() {
         });
 
         it("puts widgets in buckets keyed by regionIds", function() {
+            createMockJQuery(); 
+             
             var widgetsByRegionIdMap = {};
             var regionOneKey = 1;
             var regionTwoKey = 2;
@@ -168,6 +190,8 @@ describe("Rave", function() {
         });
 
         it("Renders an error gadget when invalid widget is provided", function(){
+            createMockJQuery();  
+             
             var widgetsByRegionIdMap = {};
             widgetsByRegionIdMap[1] = [
                     {type:"FOO",  regionWidgetId:20},
@@ -176,7 +200,7 @@ describe("Rave", function() {
                     {type:"BAR",  regionWidgetId:23},
                     {type:"NONE", regionWidgetId:43}
             ];
-            createMockJQuery();
+            
             var provider1 = getMockProvider("FOO");
             var provider2 = getMockProvider("BAR");
             rave.registerProvider(provider1);
@@ -187,6 +211,18 @@ describe("Rave", function() {
             expect(provider1.initWidgetsWasCalled(2)).toBeTruthy();
             expect(provider2.initWidgetsWasCalled(2)).toBeTruthy();
         });
+        
+        it("Renders the empty page message when page has no widgets", function(){
+            var HIDDEN_CLASS = "hidden";
+            createMockJQuery();  
+            $().addClass(HIDDEN_CLASS);
+            expect($().hasClass(HIDDEN_CLASS)).toEqual(true);
+            
+            var widgetsByRegionIdMap = {};
+                                   
+            rave.initWidgets(widgetsByRegionIdMap);
+            expect($().hasClass(HIDDEN_CLASS)).toEqual(false);           
+        });        
     });
 
     describe("initUI", function() {