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);