From 04122b8ab2c841f72e655c663ef822dc2cfd25fb Mon Sep 17 00:00:00 2001
From: Shane Tomlinson <stomlinson@mozilla.com>
Date: Mon, 17 Sep 2012 11:16:28 +0100
Subject: [PATCH] Add partial support to client side templates.

---
 lib/static/views.js                    |  7 ++++++-
 lib/templates.js                       |  2 +-
 resources/static/common/js/renderer.js | 13 ++++++++++---
 3 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/lib/static/views.js b/lib/static/views.js
index 800eb4b19..03b310f47 100644
--- a/lib/static/views.js
+++ b/lib/static/views.js
@@ -239,8 +239,13 @@ exports.setup = function(app) {
     });
 
     var siteTemplatesPath = path.join(__dirname, "../../resources/views");
+    var sitePartialTemplatesPath = path.join(__dirname, "../../resources/views/partial");
     app.get('/test/mocks/site-templates.js', function(req, res) {
-      res.send(templates.generate(siteTemplatesPath, "site/"));
+      // combine main templates and partials into one big set for development
+      // mode.
+      var siteTemplates = templates.generate(siteTemplatesPath, "site/");
+      siteTemplates += templates.generate(sitePartialTemplatesPath, "partial/");
+      res.send(siteTemplates);
     });
   }
 
diff --git a/lib/templates.js b/lib/templates.js
index f9caaa449..4df22cdbe 100644
--- a/lib/templates.js
+++ b/lib/templates.js
@@ -51,7 +51,7 @@ exports.generate = function generate(templatesDir, namePrefix, lastGen) {
   templateData = "BrowserID.Templates = BrowserID.Templates || {};";
   for (var t in templates) {
     if (templates.hasOwnProperty(t)) {
-      templateData += "\nBrowserID.Templates['" + t + "'] = " + String(templates[t]);
+      templateData += "\nBrowserID.Templates['" + t + "'] = " + String(templates[t]) + ";";
     }
   }
 
diff --git a/resources/static/common/js/renderer.js b/resources/static/common/js/renderer.js
index 4a613d473..ad8dae95a 100644
--- a/resources/static/common/js/renderer.js
+++ b/resources/static/common/js/renderer.js
@@ -11,12 +11,19 @@ BrowserID.Renderer = (function() {
 
   function getTemplateHTML(templateName, vars) {
     var templateFn = bid.Templates[templateName];
-    vars = vars || {};
-
     if (!templateFn) throw "Template not found: " + templateName;
 
+    var localVars = _.extend({}, vars);
+    if(!localVars.partial) {
+      localVars.partial = function(name) {
+        // partials are not supported by the client side EJS. Create
+        // a standin that does what partial rendering would do on the backend.
+        return getTemplateHTML(name, vars);
+      }
+    }
+
     // arguments are: locals, filters (which cant be used client-side), escapeFn
-    return templateFn.call(null, vars);
+    return templateFn.call(null, localVars);
   }
 
   function render(target, templateName, vars) {
-- 
GitLab