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() {