You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ns...@apache.org on 2013/12/14 12:41:16 UTC

[10/51] [partial] Bring Fauxton directories together

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/test/mocha/testUtils.js
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/test/mocha/testUtils.js b/share/www/fauxton/src/test/mocha/testUtils.js
new file mode 100644
index 0000000..f9643e8
--- /dev/null
+++ b/share/www/fauxton/src/test/mocha/testUtils.js
@@ -0,0 +1,50 @@
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+define([
+       "chai",
+       "sinon-chai",
+       "underscore"
+],
+function(chai, sinonChai) {
+  chai.use(sinonChai);
+
+  var ViewSandbox = function () {
+    this.initialize();
+  };
+   
+   _.extend(ViewSandbox.prototype, {
+    initialize: function () {
+      this.$el = $('<div style="display:none"></div>').appendTo('body');
+      this.$ = this.$el.find;
+    },
+    views: [],
+    renderView: function (view) {
+      this.views.push(view);
+      this.$el.append(view.el);
+      view.render();
+    },
+
+    remove: function () {
+      _.each(this.views, function (view) {
+        view.remove();
+      }, this);
+    }
+  });
+
+  return {
+    chai: chai,
+    assert: chai.assert,
+    ViewSandbox: ViewSandbox
+  };
+});
+

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/test/runner.html
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/test/runner.html b/share/www/fauxton/src/test/runner.html
new file mode 100644
index 0000000..2eeb27f
--- /dev/null
+++ b/share/www/fauxton/src/test/runner.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<!--
+
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed
+under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+CONDITIONS OF ANY KIND, either express or implied. See the License for the
+specific language governing permissions and limitations under the License.
+
+-->
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>testrunnner Fauxton</title>
+    <link rel="stylesheet" href="mocha/mocha.css" />
+  </head>
+  <body>
+    <div id="mocha"></div>
+    <script type="text/javascript" src="mocha/mocha.js"></script>
+    <script type="text/javascript" src="mocha/sinon.js"></script>
+    <script type="text/javascript">
+      // MOCHA SETUP
+      mocha.setup('bdd');
+      mocha.reporter('html');
+    </script>
+    <script data-main="./test.config.js" src="../assets/js/libs/require.js"></script>
+  </body>
+</html>

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/test/test.config.underscore
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/test/test.config.underscore b/share/www/fauxton/src/test/test.config.underscore
new file mode 100644
index 0000000..dda16f2
--- /dev/null
+++ b/share/www/fauxton/src/test/test.config.underscore
@@ -0,0 +1,15 @@
+// vim: set ft=javascript:
+// Set the require.js configuration for your test setup.
+require.config(
+<%= JSON.stringify(configInfo, null, '\t') %>
+);
+
+require([
+        <% _.each(testFiles, function (test) {%>
+           '../<%= test %>',
+        <% }) %>
+], function() {
+  if (window.mochaPhantomJS) { mochaPhantomJS.run(); }
+  else { mocha.run(); }
+});
+

http://git-wip-us.apache.org/repos/asf/couchdb/blob/c14b2991/share/www/fauxton/src/writing_addons.md
----------------------------------------------------------------------
diff --git a/share/www/fauxton/src/writing_addons.md b/share/www/fauxton/src/writing_addons.md
new file mode 100644
index 0000000..08f44fc
--- /dev/null
+++ b/share/www/fauxton/src/writing_addons.md
@@ -0,0 +1,173 @@
+# Addons
+Addons allow you to extend Fauxton for a specific use case. Addons will usually
+have the following structure:
+
+ * templates/
+   * my_addon.html - _underscore template fragments_
+ * base.js - _entry point to the addon_
+ * resources.js - _models and collections of the addon_
+ * routes.js - _URL routing for the addon_
+ * views.js - _views that the model provides_
+
+ [optional]
+ * assets/less
+   * my_addon.less
+
+## Generating an addon
+We have a `grunt-init` template that lets you create a skeleton addon,
+including all the boiler plate code. Run
+`./node_modules/.bin/grunt-init tasks/addon` and answer the questions
+it asks to create an addon:
+
+    $ ./node_modules/.bin/grunt-init tasks/addon
+    path.existsSync is now called `fs.existsSync`.
+    Running "addon" task
+
+    Please answer the following:
+    [?] Add on Name (WickedCool) SuperAddon
+    [?] Location of add ons (app/addons)
+    [?] Do you need an assets folder?(for .less) (y/N)
+    [?] Do you need to make any changes to the above before continuing? (y/N)
+
+    Created addon SuperAddon in app/addons
+
+    Done, without errors.
+
+Once the addon is created add the name to the settings.json file to get it
+compiled and added on the next install.
+
+## Routes and hooks
+An addon can insert itself into fauxton in two ways; via a route or via a hook.
+
+### Routes
+An addon will override an existing route should one exist, but in all other
+ways is just a normal backbone route/view. This is how you would add a whole
+new feature.
+
+### Hooks
+Hooks let you modify/extend an existing feature. They modify a DOM element by
+selector for a named set of routes, for example:
+
+    var Search = new FauxtonAPI.addon();
+    Search.hooks = {
+      // Render additional content into the sidebar
+      "#sidebar-content": {
+        routes:[
+          "database/:database/_design/:ddoc/_search/:search",
+          "database/:database/_design/:ddoc/_view/:view",
+          "database/:database/_:handler"],
+        callback: searchSidebar
+      }
+    };
+    return Search;
+
+adds the `searchSidebar` callback to `#sidebar-content` for three routes.
+
+## Hello world addon
+First create the addon skeleton:
+
+    ± bbb addon
+    path.existsSync is now called `fs.existsSync`.
+    Running "addon" task
+
+    Please answer the following:
+    [?] Add on Name (WickedCool) Hello
+    [?] Location of add ons (app/addons)
+    [?] Do you need to make any changes to the above before continuing? (y/N)
+
+    Created addon Hello in app/addons
+
+    Done, without errors.
+
+In `app/addons/hello/templates/hello.html` place:
+
+    <h1>Hello!</h1>
+
+Next, we'll defined a simple view in `resources.js` (for more complex addons
+you may want to have a views.js) that renders that template:
+
+    define([
+      "app",
+      "api"
+    ],
+
+    function (app, FauxtonAPI) {
+      var Resources = {};
+
+      Resources.Hello = FauxtonAPI.View.extend({
+        template: "addons/hello/templates/hello"
+      });
+
+      return Resources;
+    });
+
+
+Then define a route in `routes.js` that the addon is accessible at:
+
+    define([
+      "app",
+      "api",
+      "addons/hello/resources"
+    ],
+
+    function(app, FauxtonAPI, Resources) {
+      var  HelloRouteObject = FauxtonAPI.RouteObject.extend({
+        layout: "one_pane",
+
+        crumbs: [
+          {"name": "Hello","link": "_hello"}
+        ],
+
+        routes: {
+           "_hello": "helloRoute"
+        },
+
+        selectedHeader: "Hello",
+
+        roles: ["_admin"],
+
+        apiUrl:'hello',
+
+        initialize: function () {
+            //put common views used on all your routes here (eg:  sidebars )
+        },
+
+        helloRoute: function () {
+          this.setView("#dashboard-content", new Resources.Hello({}));
+        }
+      });
+
+      Resources.RouteObjects = [HelloRouteObject];
+
+      return Resources;
+
+    });
+
+
+
+
+Then wire it all together in base.js:
+
+    define([
+      "app",
+      "api",
+      "addons/hello/routes"
+    ],
+
+    function(app, FauxtonAPI, HelloRoutes) {
+
+      HelloRoutes.initialize = function() {
+        FauxtonAPI.addHeaderLink({title: "Hello", href: "#_hello"});
+      };
+
+      return HelloRoutes;
+    });
+
+Once the code is in place include the add on in your `settings.json` so that it
+gets included by the `require` task. Your addon is included in one of three
+ways; a local path, a git URL or a name. Named plugins assume the plugin is in
+the fauxton base directory, addons with a git URL will be cloned into the
+application, local paths will be copied. Addons included from a local path will
+be cleaned out by the clean task, others are left alone.
+
+**TODO:** addons via npm module