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(); +};