diff --git a/applications/default/extensions/layout/layout.js b/applications/default/extensions/layout/layout.js
index 983531c..18f21be 100644
--- a/applications/default/extensions/layout/layout.js
+++ b/applications/default/extensions/layout/layout.js
@@ -94,6 +94,10 @@ layout.type = function(types, callback) {
region: {
title: 'Region',
type: 'boolean'
+ },
+ alwaysRender: {
+ title: 'Always Render',
+ type: 'boolean'
}
}
};
@@ -125,6 +129,10 @@ layout.type = function(types, callback) {
region: {
title: 'Region',
type: 'boolean'
+ },
+ alwaysRender: {
+ title: 'Always Render',
+ type: 'boolean'
}
}
};
diff --git a/applications/default/extensions/layout/public/templates/column.html b/applications/default/extensions/layout/public/templates/column.html
index 585748c..fe03596 100644
--- a/applications/default/extensions/layout/public/templates/column.html
+++ b/applications/default/extensions/layout/public/templates/column.html
@@ -1,3 +1,3 @@
-
+
-
+
diff --git a/applications/default/extensions/layout/public/templates/layout.html b/applications/default/extensions/layout/public/templates/layout.html
index e2a4818..f9ebf91 100644
--- a/applications/default/extensions/layout/public/templates/layout.html
+++ b/applications/default/extensions/layout/public/templates/layout.html
@@ -1,2 +1,2 @@
-
+
diff --git a/applications/default/extensions/layout/public/templates/row.html b/applications/default/extensions/layout/public/templates/row.html
index fe7c01f..551c760 100644
--- a/applications/default/extensions/layout/public/templates/row.html
+++ b/applications/default/extensions/layout/public/templates/row.html
@@ -1,5 +1,5 @@
diff --git a/applications/default/extensions/panel/panel.js b/applications/default/extensions/panel/panel.js
index 01bdd8e..80d5f70 100644
--- a/applications/default/extensions/panel/panel.js
+++ b/applications/default/extensions/panel/panel.js
@@ -234,19 +234,24 @@ panel.contextReactionType = function(reactionTypes, callback) {
}
},
react: function(request, response, regionPanels, callback) {
+
+ // Get panel type.
+ var Panel = self.application.type('panel');
+
// Initialize panels container if not initialized yet.
response.payload.panels = response.payload.panels || {};
// Add all panels to response payload.
async.each(Object.keys(regionPanels), function(regionName, next) {
+
// Initialize panels container if not initialized yet.
response.payload.panels[regionName] = response.payload.panels[regionName] || [];
var panels = regionPanels[regionName];
+
// A context can set several panels for a region.
async.each(panels, function(regionPanel, next) {
- // Load the panel.
- var Panel = self.application.type('panel');
+ // Load the panel.
Panel.load(regionPanel.name, function(err, panel) {
if (err) {
return callback(err);
@@ -274,3 +279,45 @@ panel.contextReactionType = function(reactionTypes, callback) {
callback(null, newReactionTypes);
};
+
+/**
+ * The response() hook.
+ */
+panel.response = function (payload, request, response, callback) {
+
+ var layout = payload.data && payload.data.layout;
+ var panels = payload.data && payload.data.panels;
+
+ if (layout && panels) {
+
+ /**
+ * Recursively verifies if a row/column is empty.
+ */
+ function findContent(region, childType) {
+
+ // Consider empty by default, unless when region is told to always be
+ // rendered.
+ region.empty = region.alwaysRender ? false : true;
+
+ // Check if region has content.
+ if (region.empty && region.region == true) {
+ region.empty = !Boolean(panels[region.name] && panels[region.name].length);
+ }
+
+ // Iterate recursively
+ if (region[childType] && region[childType].length) {
+ region[childType].forEach(function (childRegion) {
+ var childEmpty = findContent(childRegion, childType == 'rows' ? 'columns' : 'rows');
+ region.empty = !region.empty ? region.empty : childEmpty;
+ });
+ }
+
+ return region.empty;
+ }
+
+ // As a layout contains rows, it behaves much like a column itself.
+ findContent(layout, 'rows');
+ }
+
+ callback();
+};