Author: carlucci
Date: Mon Oct  8 18:12:52 2012
New Revision: 1395702

URL: http://svn.apache.org/viewvc?rev=1395702&view=rev
Log:
RAVE-816: Incorrect Widget Initialization Order

Modified:
    rave/trunk/rave-portal-resources/src/main/webapp/static/script/rave.js
    rave/trunk/rave-portal-resources/src/test/javascript/raveSpec.js

Modified: rave/trunk/rave-portal-resources/src/main/webapp/static/script/rave.js
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/webapp/static/script/rave.js?rev=1395702&r1=1395701&r2=1395702&view=diff
==============================================================================
--- rave/trunk/rave-portal-resources/src/main/webapp/static/script/rave.js 
(original)
+++ rave/trunk/rave-portal-resources/src/main/webapp/static/script/rave.js Mon 
Oct  8 18:12:52 2012
@@ -19,7 +19,8 @@
 var rave = rave || (function () {
     var providerMap = {};
     var widgetByIdMap = {};
-    var widgetsByRegionIdMap = {};
+    var widgetsByRegionIdArray = [];
+
     var context = "";
     var clientMessages = {};
     var openAjaxHub;
@@ -922,18 +923,30 @@ var rave = rave || (function () {
     }
 
     function registerWidget(regionId, widget) {
-        if (!widgetsByRegionIdMap.hasOwnProperty(regionId)) {
-            widgetsByRegionIdMap[regionId] = [];
+        // first find the region in the array, if it exists
+        var regionExists = false;
+        for (var i = 0; i < widgetsByRegionIdArray.length; i++) {
+            var tempRegion = widgetsByRegionIdArray[i];
+            if (tempRegion.regionId === regionId) {
+                // add the widget to the existing region object
+                regionExists = true;
+                tempRegion.widgets.push(widget);
+                break;
+            }
+        }
+
+        // if this region doesn't exist yet add it to the 
widgetsByRegionIdArray
+        if (!regionExists) {
+            widgetsByRegionIdArray.push({regionId: regionId, widgets: 
[widget]});
         }
-        widgetsByRegionIdMap[regionId].push(widget);
     }
 
-    function getWidgetsByRegionIdMap() {
-        return widgetsByRegionIdMap;
+    function getWidgetsByRegionIdArray() {
+        return widgetsByRegionIdArray;
     }
 
-    function clearWidgetsByRegionIdMap() {
-        widgetsByRegionIdMap = {};
+    function clearWidgetsByRegionIdArray() {
+        widgetsByRegionIdArray = [];
     }
 
     function initializeProviders() {
@@ -1011,23 +1024,20 @@ var rave = rave || (function () {
     }
 
     function initializeWidgets() {
-        //We get the widget objects in a map keyed by region ID.  The code 
below converts that map into a flat array
+        //The code below converts the widgetsByRegionIdArray 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
         //top to bottom to give the best user experience possible (rendering 
the top widgets first).
-        //Note that this strategy relies on the javascript implementation to 
enumerate object properties in order:
-        
//http://stackoverflow.com/questions/280713/elements-order-in-a-for-in-loop
         //However this should at least get us to render the top "row" first, 
then the second "row", ... in any browser.
-        //If this turns out to be a major concern we can change the 
widgetsByRegionIdMap to a 2D array instead of a map.
         var widgets = [];
         var regionWidget;
         for (var i = 0; ; i++) {
-            var foundGadgets = false;
-            for (var regionWidgets in widgetsByRegionIdMap) {
-                regionWidgets = widgetsByRegionIdMap[regionWidgets];
-                if (regionWidgets.length > i) {
-                    foundGadgets = true;
-                    regionWidget = regionWidgets[i];
+            var foundWidgets = false;
+            for (var x = 0; x < widgetsByRegionIdArray.length; x++) {
+                region = widgetsByRegionIdArray[x];
+                if (region.widgets.length > i) {
+                    foundWidgets = true;
+                    regionWidget = region.widgets[i];
                     // if client is viewing in mobile mode
                     // default to collapsed state
                     if (rave.isMobile()) {
@@ -1037,7 +1047,7 @@ var rave = rave || (function () {
                 }
             }
 
-            if (!foundGadgets) {
+            if (!foundWidgets) {
                 break;
             }
         }
@@ -1261,7 +1271,7 @@ var rave = rave || (function () {
      */
     return {
         /**
-         * Registers the specified widget into the widgetsByRegionIdMap under 
the specified regionId.
+         * Registers the specified widget into the widgetsByRegionIdArray 
under the specified regionId.
          * @param regionId The regionId.
          * @param widget The widget.
          */
@@ -1566,14 +1576,14 @@ var rave = rave || (function () {
         log:log,
 
         /**
-         * Returns the widgetsByRegionIdMap
+         * Returns the widgetsByRegionIdArray
          */
-        getWidgetsByRegionIdMap:getWidgetsByRegionIdMap,
+        getWidgetsByRegionIdArray:getWidgetsByRegionIdArray,
 
         /**
-         * Clears the widgetsByRegionIdMap.  Useful for testing.
+         * Clears the widgetsByRegionIdArray.  Useful for testing.
          */
-        clearWidgetsByRegionIdMap:clearWidgetsByRegionIdMap,
+        clearWidgetsByRegionIdArray:clearWidgetsByRegionIdArray,
 
         /**
          * Registers a new popup definition

Modified: rave/trunk/rave-portal-resources/src/test/javascript/raveSpec.js
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/test/javascript/raveSpec.js?rev=1395702&r1=1395701&r2=1395702&view=diff
==============================================================================
--- rave/trunk/rave-portal-resources/src/test/javascript/raveSpec.js (original)
+++ rave/trunk/rave-portal-resources/src/test/javascript/raveSpec.js Mon Oct  8 
18:12:52 2012
@@ -17,13 +17,12 @@
  * under the License.
  */
 describe("Rave", function() {
-    function registerWidgetsFromRegionIdMap(widgetsByRegionIdMap) {
-        for(var regionId in widgetsByRegionIdMap) {
-            if(widgetsByRegionIdMap.hasOwnProperty(regionId)) {
-                var widgetMap = widgetsByRegionIdMap[regionId];
-                for (var i=0; i < widgetMap.length; i++) {
-                    rave.registerWidget(regionId, widgetMap[i]);
-                }
+    function registerWidgetsFromRegionIdArray(widgetsByRegionIdArray) {
+        for (var x=0; x < widgetsByRegionIdArray.length; x++) {
+            var region = widgetsByRegionIdArray[x];
+            var widgetMap = region.widgets;
+            for (var i=0; i < widgetMap.length; i++) {
+                rave.registerWidget(region.regionId, widgetMap[i]);
             }
         }
     }
@@ -159,17 +158,22 @@ describe("Rave", function() {
             $().addClass(HIDDEN_CLASS);
             expect($().hasClass(HIDDEN_CLASS)).toEqual(true);
 
-            var widgetsByRegionIdMap = {};
-            widgetsByRegionIdMap[1] = [
-                    {type:"FOO"},
-                    {type:"BAR"},
-                    {type:"FOO"},
-                    {type:"BAR"}
-            ];
+            var widgetsByRegionIdArray = [];
+            widgetsByRegionIdArray.push(
+                { regionId: 1,
+                    widgets:[
+                        {type:"FOO"},
+                        {type:"BAR"},
+                        {type:"FOO"},
+                        {type:"BAR"}
+                    ]
+                }
+            );
+
             var provider1 = getMockProvider("FOO");
             var provider2 = getMockProvider("BAR");
-            rave.clearWidgetsByRegionIdMap();
-            registerWidgetsFromRegionIdMap(widgetsByRegionIdMap);
+            rave.clearWidgetsByRegionIdArray();
+            registerWidgetsFromRegionIdArray(widgetsByRegionIdArray);
             rave.registerProvider(provider1);
             rave.registerProvider(provider2);
             rave.initWidgets();
@@ -182,25 +186,40 @@ describe("Rave", function() {
         it("renders widgets in the appropriate order (first 'row', second 
'row', third 'row', ...)", function() {
             createMockJQuery();
 
-            var widgetsByRegionIdMap = {};
-            widgetsByRegionIdMap[1] = [
+            var widgetsByRegionIdArray = [];
+            widgetsByRegionIdArray.push(
+                { regionId: 1,
+                  widgets:[
                     {type:"FOO", renderOrder:1},
                     {type:"FOO", renderOrder:4},
                     {type:"FOO", renderOrder:7},
                     {type:"FOO", renderOrder:9}
-            ];
-            widgetsByRegionIdMap[2] = [
-                    {type:"FOO", renderOrder:2},
-                    {type:"FOO", renderOrder:5},
-                    {type:"FOO", renderOrder:8},
-                    {type:"FOO", renderOrder:10},
-                    {type:"FOO", renderOrder:11},
-                    {type:"FOO", renderOrder:12}
-            ];
-            widgetsByRegionIdMap[3] = [
-                    {type:"FOO", renderOrder:3},
-                    {type:"FOO", renderOrder:6}
-            ];
+                  ]
+                }
+            );
+
+            widgetsByRegionIdArray.push(
+                { regionId: 2,
+                    widgets:[
+                        {type:"FOO", renderOrder:2},
+                        {type:"FOO", renderOrder:5},
+                        {type:"FOO", renderOrder:8},
+                        {type:"FOO", renderOrder:10},
+                        {type:"FOO", renderOrder:11},
+                        {type:"FOO", renderOrder:12}
+                    ]
+                }
+            );
+
+            widgetsByRegionIdArray.push(
+                { regionId: 3,
+                    widgets:[
+                        {type:"FOO", renderOrder:3},
+                        {type:"FOO", renderOrder:6}
+                    ]
+                }
+            );
+
             var widgets = [];
             var provider1 = getMockProvider("FOO");
             var originalInitWidgetFunction = provider1.initWidget;
@@ -208,8 +227,8 @@ describe("Rave", function() {
                 originalInitWidgetFunction(widget);
                 widgets.push(widget);
             };
-            rave.clearWidgetsByRegionIdMap();
-            registerWidgetsFromRegionIdMap(widgetsByRegionIdMap);
+            rave.clearWidgetsByRegionIdArray();
+            registerWidgetsFromRegionIdArray(widgetsByRegionIdArray);
             rave.registerProvider(provider1);
             rave.initWidgets();
             expect(provider1.initWidgetsWasCalled(12)).toBeTruthy();
@@ -222,7 +241,7 @@ describe("Rave", function() {
         it("puts widgets in buckets keyed by regionIds", function() {
             createMockJQuery();
 
-            rave.clearWidgetsByRegionIdMap();
+            rave.clearWidgetsByRegionIdArray();
             var regionOneKey = 1;
             var regionTwoKey = 2;
             rave.registerWidget(regionOneKey, {arbitrary:"value"});
@@ -235,26 +254,30 @@ describe("Rave", function() {
 
             rave.registerWidget(regionTwoKey, {arbitrary:"value"});
 
-            
expect(rave.getWidgetsByRegionIdMap()[regionOneKey].length).toEqual(4);
-            
expect(rave.getWidgetsByRegionIdMap()[regionTwoKey].length).toEqual(2);
+            
expect(rave.getWidgetsByRegionIdArray()[0].widgets.length).toEqual(4);
+            
expect(rave.getWidgetsByRegionIdArray()[1].widgets.length).toEqual(2);
         });
 
         it("Renders an error gadget when invalid widget is provided", 
function(){
             createMockJQuery();
 
-            var widgetsByRegionIdMap = {};
-            widgetsByRegionIdMap[1] = [
-                    {type:"FOO",  regionWidgetId:20},
-                    {type:"BAR",  regionWidgetId:21},
-                    {type:"FOO",  regionWidgetId:22},
-                    {type:"BAR",  regionWidgetId:23},
-                    {type:"NONE", regionWidgetId:43}
-            ];
-
+            var widgetsByRegionIdArray = [];
+            widgetsByRegionIdArray.push(
+                { regionId: 1,
+                    widgets:[
+                        {type:"FOO",  regionWidgetId:20},
+                        {type:"BAR",  regionWidgetId:21},
+                        {type:"FOO",  regionWidgetId:22},
+                        {type:"BAR",  regionWidgetId:23},
+                        {type:"NONE", regionWidgetId:43}
+                    ]
+                }
+            );            
+                      
             var provider1 = getMockProvider("FOO");
             var provider2 = getMockProvider("BAR");
-            rave.clearWidgetsByRegionIdMap();
-            registerWidgetsFromRegionIdMap(widgetsByRegionIdMap);
+            rave.clearWidgetsByRegionIdArray();
+            registerWidgetsFromRegionIdArray(widgetsByRegionIdArray);
 
             rave.registerProvider(provider1);
             rave.registerProvider(provider2);
@@ -269,12 +292,17 @@ describe("Rave", function() {
         it("Renders a disabled gadget when disabled flag is set", function(){
             createMockJQuery();
 
-            var widgetsByRegionIdMap = {};
-            widgetsByRegionIdMap[1] = [
-                    {type:"DISABLED",  regionWidgetId:20, disabledMessage: 
"Widget disabled"}
-            ];
-            rave.clearWidgetsByRegionIdMap();
-            registerWidgetsFromRegionIdMap(widgetsByRegionIdMap);
+            var widgetsByRegionIdArray = [];
+            widgetsByRegionIdArray.push(
+                { regionId: 1,
+                    widgets:[
+                        {type:"DISABLED",  regionWidgetId:20, disabledMessage: 
"Widget disabled"}
+                    ]
+                }
+            );
+
+            rave.clearWidgetsByRegionIdArray();
+            registerWidgetsFromRegionIdArray(widgetsByRegionIdArray);
             rave.initWidgets();
             expect($().expression()).toEqual("#widget-20-body");
             expect($().html()).toEqual("Widget disabled");
@@ -286,9 +314,9 @@ describe("Rave", function() {
             $().addClass(HIDDEN_CLASS);
             expect($().hasClass(HIDDEN_CLASS)).toEqual(true);
 
-            var widgetsByRegionIdMap = {};
-            rave.clearWidgetsByRegionIdMap();
-            registerWidgetsFromRegionIdMap(widgetsByRegionIdMap);
+            var widgetsByRegionIdArray = [];
+            rave.clearWidgetsByRegionIdArray();
+            registerWidgetsFromRegionIdArray(widgetsByRegionIdArray);
 
             rave.initWidgets();
             expect($().hasClass(HIDDEN_CLASS)).toEqual(false);


Reply via email to