Updated Branches: refs/heads/master 62f939c22 -> 4b69ff383
http://git-wip-us.apache.org/repos/asf/couchdb/blob/89810cce/src/fauxton/app/modules/fauxton/layout.js ---------------------------------------------------------------------- diff --git a/src/fauxton/app/modules/fauxton/layout.js b/src/fauxton/app/modules/fauxton/layout.js deleted file mode 100644 index 1422241..0000000 --- a/src/fauxton/app/modules/fauxton/layout.js +++ /dev/null @@ -1,98 +0,0 @@ -// 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(["backbone"], - -function(Backbone) { - - // A wrapper of the main Backbone.layoutmanager - // Allows the main layout of the page to be changed by any plugin. - // Exposes the different views: - // navBar -> the top navigation bar - // dashboardContent -> Main display view - // breadcrumbs -> Breadcrumbs navigation section - var Layout = function (navBar, apiBar) { - this.navBar = navBar; - this.apiBar = apiBar; - - this.layout = new Backbone.Layout({ - template: "templates/layouts/with_sidebar", - - views: { - "#primary-navbar": this.navBar, - "#api-navbar": this.apiBar - }, - afterRender: function(){ - - } - }); - - this.layoutViews = {}; - //this.hooks = {}; - - this.el = this.layout.el; - }; - - // creatings the dashboard object same way backbone does - _.extend(Layout.prototype, { - render: function () { - return this.layout.render(); - }, - - setTemplate: function(template) { - if (template.prefix){ - this.layout.template = template.prefix + template.name; - } else{ - this.layout.template = "templates/layouts/" + template; - } - // If we're changing layouts all bets are off, so kill off all the - // existing views in the layout. - _.each(this.layoutViews, function(view){view.remove();}); - this.layoutViews = {}; - this.render(); - }, - - setTabs: function(view){ - // TODO: Not sure I like this - seems fragile/repetitive - this.tabs = this.layout.setView("#tabs", view); - this.tabs.render(); - }, - - setBreadcrumbs: function(view) { - this.breadcrumbs = this.layout.setView("#breadcrumbs", view); - this.breadcrumbs.render(); - }, - - clearBreadcrumbs: function () { - if (!this.breadcrumbs) {return ;} - - this.breadcrumbs.remove(); - }, - - setView: function(selector, view) { - this.layoutViews[selector] = this.layout.setView(selector, view, false); - }, - - renderView: function(selector) { - var view = this.layoutViews[selector]; - if (!view) { - return false; - } else { - return view.render(); - } - } - - }); - - return Layout; - -}); http://git-wip-us.apache.org/repos/asf/couchdb/blob/89810cce/src/fauxton/app/modules/pouchdb/base.js ---------------------------------------------------------------------- diff --git a/src/fauxton/app/modules/pouchdb/base.js b/src/fauxton/app/modules/pouchdb/base.js deleted file mode 100644 index ee323a7..0000000 --- a/src/fauxton/app/modules/pouchdb/base.js +++ /dev/null @@ -1,47 +0,0 @@ -/* - * NOTE: - * This temporarily uses the PouchDB map reduce implementation - * These files are modified locally until we make a more general version and - * push it back upstream. - */ - -define([ - "app", - - "api", - - // Modules - "modules/pouchdb/pouchdb.mapreduce.js" -], - -function(app, FauxtonAPI, MapReduce) { - var Pouch = {}; - Pouch.MapReduce = MapReduce; - - Pouch.runViewQuery = function(fun, opts) { - /*docs = [ - {_id: 'test_doc_1', foo: 'bar-1'}, - {_id: 'test_doc_2', foo: 'bar-2'}, - {_id: 'test_doc_3', foo: 'bar-3'}, - {_id: 'test_doc_4', foo: 'bar-4'}, - {_id: 'test_doc_5', foo: 'bar-5'}, - {_id: 'test_doc_6', foo: 'bar-6'}, - {_id: 'test_doc_7', foo: 'bar-7'}, - {_id: 'test_doc_8', foo: 'bar-8'}, - {_id: 'test_doc_9', foo: 'bar-9'}, - {_id: 'test_doc_10', foo: 'bar-10'} - ];*/ - - var deferred = FauxtonAPI.Deferred(); - var complete = function(resp, rows) { - deferred.resolve(rows); - }; - - var options = _.extend(opts, {complete: complete}); - - Pouch.MapReduce.query(fun, options); - return deferred; - }; - //pdb.runViewQuery({map:function(doc) { emit(doc._id, doc.foo) }}) - return Pouch; -}); http://git-wip-us.apache.org/repos/asf/couchdb/blob/89810cce/src/fauxton/app/modules/pouchdb/pouch.collate.js ---------------------------------------------------------------------- diff --git a/src/fauxton/app/modules/pouchdb/pouch.collate.js b/src/fauxton/app/modules/pouchdb/pouch.collate.js deleted file mode 100644 index 7cc5f9c..0000000 --- a/src/fauxton/app/modules/pouchdb/pouch.collate.js +++ /dev/null @@ -1,115 +0,0 @@ -/* - * NOTE: - * This temporarily uses the PouchDB map reduce implementation - * These files are modified locally until we make a more general version and - * push it back upstream. - * Original file: - * https://github.com/daleharvey/pouchdb/blob/master/src/pouch.collate.js - */ - -/* -(function() { - // a few hacks to get things in the right place for node.js - if (typeof module !== 'undefined' && module.exports) { - module.exports = Pouch; - } -*/ - -define([ - "app", - - "api", - - // Modules - "modules/pouchdb/pouch.collate.js" -], - -function(app, FauxtonAPI, Collate) { - var Pouch = {}; - - Pouch.collate = function(a, b) { - var ai = collationIndex(a); - var bi = collationIndex(b); - if ((ai - bi) !== 0) { - return ai - bi; - } - if (a === null) { - return 0; - } - if (typeof a === 'number') { - return a - b; - } - if (typeof a === 'boolean') { - return a < b ? -1 : 1; - } - if (typeof a === 'string') { - return stringCollate(a, b); - } - if (Array.isArray(a)) { - return arrayCollate(a, b); - } - if (typeof a === 'object') { - return objectCollate(a, b); - } - }; - - var stringCollate = function(a, b) { - // See: https://github.com/daleharvey/pouchdb/issues/40 - // This is incompatible with the CouchDB implementation, but its the - // best we can do for now - return (a === b) ? 0 : ((a > b) ? 1 : -1); - }; - - var objectCollate = function(a, b) { - var ak = Object.keys(a), bk = Object.keys(b); - var len = Math.min(ak.length, bk.length); - for (var i = 0; i < len; i++) { - // First sort the keys - var sort = Pouch.collate(ak[i], bk[i]); - if (sort !== 0) { - return sort; - } - // if the keys are equal sort the values - sort = Pouch.collate(a[ak[i]], b[bk[i]]); - if (sort !== 0) { - return sort; - } - - } - return (ak.length === bk.length) ? 0 : - (ak.length > bk.length) ? 1 : -1; - }; - - var arrayCollate = function(a, b) { - var len = Math.min(a.length, b.length); - for (var i = 0; i < len; i++) { - var sort = Pouch.collate(a[i], b[i]); - if (sort !== 0) { - return sort; - } - } - return (a.length === b.length) ? 0 : - (a.length > b.length) ? 1 : -1; - }; - - // The collation is defined by erlangs ordered terms - // the atoms null, true, false come first, then numbers, strings, - // arrays, then objects - var collationIndex = function(x) { - var id = ['boolean', 'number', 'string', 'object']; - if (id.indexOf(typeof x) !== -1) { - if (x === null) { - return 1; - } - return id.indexOf(typeof x) + 2; - } - if (Array.isArray(x)) { - return 4.5; - } - }; - - return Pouch; - -//}).call(this); - -}); http://git-wip-us.apache.org/repos/asf/couchdb/blob/89810cce/src/fauxton/app/modules/pouchdb/pouchdb.mapreduce.js ---------------------------------------------------------------------- diff --git a/src/fauxton/app/modules/pouchdb/pouchdb.mapreduce.js b/src/fauxton/app/modules/pouchdb/pouchdb.mapreduce.js deleted file mode 100644 index a2d0b91..0000000 --- a/src/fauxton/app/modules/pouchdb/pouchdb.mapreduce.js +++ /dev/null @@ -1,324 +0,0 @@ -/* - * NOTE: - * This temporarily uses the PouchDB map reduce implementation - * These files are modified locally until we make a more general version and - * push it back upstream. - * Original file: - * https://github.com/daleharvey/pouchdb/blob/master/src/plugins/pouchdb.mapreduce.js - */ - -/*global Pouch: true */ - -//"use strict"; - -// This is the first implementation of a basic plugin, we register the -// plugin object with pouch and it is mixin'd to each database created -// (regardless of adapter), adapters can override plugins by providing -// their own implementation. functions on the plugin object that start -// with _ are reserved function that are called by pouchdb for special -// notifications. - -// If we wanted to store incremental views we can do it here by listening -// to the changes feed (keeping track of our last update_seq between page loads) -// and storing the result of the map function (possibly using the upcoming -// extracted adapter functions) - -define([ - "app", - - "api", - - // Modules - "modules/pouchdb/pouch.collate.js" -], - -function(app, FauxtonAPI, Collate) { - var Pouch = {}; - Pouch.collate = Collate.collate; - - //var MapReduce = function(db) { - var MapReduce = function() { - - var builtInReduce = { - "_sum": function(keys, values){ - return sum(values); - }, - - "_count": function(keys, values, rereduce){ - if (rereduce){ - return sum(values); - } else { - return values.length; - } - }, - - "_stats": function(keys, values, rereduce){ - return { - 'sum': sum(values), - 'min': Math.min.apply(null, values), - 'max': Math.max.apply(null, values), - 'count': values.length, - 'sumsqr': (function(){ - _sumsqr = 0; - for(var idx in values){ - _sumsqr += values[idx] * values[idx]; - } - return _sumsqr; - })() - }; - } - }; - - function viewQuery(fun, options) { - console.log("IN VIEW QUERY"); - if (!options.complete) { - return; - } - - function sum(values) { - return values.reduce(function(a, b) { return a + b; }, 0); - } - - var results = []; - var current = null; - var num_started= 0; - var completed= false; - - var emit = function(key, val) { - //console.log("IN EMIT: ", key, val, current); - var viewRow = { - id: current.doc._id, - key: key, - value: val - }; - //console.log("VIEW ROW: ", viewRow); - - if (options.startkey && Pouch.collate(key, options.startkey) < 0) return; - if (options.endkey && Pouch.collate(key, options.endkey) > 0) return; - if (options.key && Pouch.collate(key, options.key) !== 0) return; - num_started++; - if (options.include_docs) { - // TODO:: FIX - throw({error: "Include Docs not supported"}); - /* - - //in this special case, join on _id (issue #106) - if (val && typeof val === 'object' && val._id){ - db.get(val._id, - function(_, joined_doc){ - if (joined_doc) { - viewRow.doc = joined_doc; - } - results.push(viewRow); - checkComplete(); - }); - return; - } else { - viewRow.doc = current.doc; - } - */ - } - console.log("EMITTING: ", viewRow); - results.push(viewRow); - }; - - // ugly way to make sure references to 'emit' in map/reduce bind to the - // above emit - eval('fun.map = ' + fun.map.toString() + ';'); - if (fun.reduce && options.reduce) { - if (builtInReduce[fun.reduce]) { - console.log('built in reduce'); - fun.reduce = builtInReduce[fun.reduce]; - } - eval('fun.reduce = ' + fun.reduce.toString() + ';'); - } - - // exclude _conflicts key by default - // or to use options.conflicts if it's set when called by db.query - var conflicts = ('conflicts' in options ? options.conflicts : false); - - //only proceed once all documents are mapped and joined - var checkComplete= function(){ - console.log('check'); - if (completed && results.length == num_started){ - results.sort(function(a, b) { - return Pouch.collate(a.key, b.key); - }); - if (options.descending) { - results.reverse(); - } - if (options.reduce === false) { - return options.complete(null, {rows: results}); - } - - console.log('reducing', options); - var groups = []; - results.forEach(function(e) { - var last = groups[groups.length-1] || null; - if (last && Pouch.collate(last.key[0][0], e.key) === 0) { - last.key.push([e.key, e.id]); - last.value.push(e.value); - return; - } - groups.push({key: [[e.key, e.id]], value: [e.value]}); - }); - groups.forEach(function(e) { - e.value = fun.reduce(e.key, e.value) || null; - e.key = e.key[0][0]; - }); - console.log('GROUPs', groups); - options.complete(null, {rows: groups}); - } - }; - - if (options.docs) { - //console.log("RUNNING MR ON DOCS: ", options.docs); - _.each(options.docs, function(doc) { - current = {doc: doc}; - fun.map.call(this, doc); - }, this); - completed = true; - return checkComplete();//options.complete(null, {rows: results}); - } else { - //console.log("COULD NOT FIND DOCS"); - return false; - } - - /* - db.changes({ - conflicts: conflicts, - include_docs: true, - onChange: function(doc) { - if (!('deleted' in doc)) { - current = {doc: doc.doc}; - fun.map.call(this, doc.doc); - } - }, - complete: function() { - completed= true; - checkComplete(); - } - }); - */ - } - - /* - function httpQuery(fun, opts, callback) { - - // List of parameters to add to the PUT request - var params = []; - var body = undefined; - var method = 'GET'; - - // If opts.reduce exists and is defined, then add it to the list - // of parameters. - // If reduce=false then the results are that of only the map function - // not the final result of map and reduce. - if (typeof opts.reduce !== 'undefined') { - params.push('reduce=' + opts.reduce); - } - if (typeof opts.include_docs !== 'undefined') { - params.push('include_docs=' + opts.include_docs); - } - if (typeof opts.limit !== 'undefined') { - params.push('limit=' + opts.limit); - } - if (typeof opts.descending !== 'undefined') { - params.push('descending=' + opts.descending); - } - if (typeof opts.startkey !== 'undefined') { - params.push('startkey=' + encodeURIComponent(JSON.stringify(opts.startkey))); - } - if (typeof opts.endkey !== 'undefined') { - params.push('endkey=' + encodeURIComponent(JSON.stringify(opts.endkey))); - } - if (typeof opts.key !== 'undefined') { - params.push('key=' + encodeURIComponent(JSON.stringify(opts.key))); - } - - // If keys are supplied, issue a POST request to circumvent GET query string limits - // see http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options - if (typeof opts.keys !== 'undefined') { - method = 'POST'; - body = JSON.stringify({keys:opts.keys}); - } - - // Format the list of parameters into a valid URI query string - params = params.join('&'); - params = params === '' ? '' : '?' + params; - - // We are referencing a query defined in the design doc - if (typeof fun === 'string') { - var parts = fun.split('/'); - db.request({ - method: method, - url: '_design/' + parts[0] + '/_view/' + parts[1] + params, - body: body - }, callback); - return; - } - - // We are using a temporary view, terrible for performance but good for testing - var queryObject = JSON.parse(JSON.stringify(fun, function(key, val) { - if (typeof val === 'function') { - return val + ''; // implicitly `toString` it - } - return val; - })); - - db.request({ - method:'POST', - url: '_temp_view' + params, - body: queryObject - }, callback); - } - */ - - function query(fun, opts, callback) { - if (typeof opts === 'function') { - callback = opts; - opts = {}; - } - - if (callback) { - opts.complete = callback; - } - - /* - if (db.type() === 'http') { - return httpQuery(fun, opts, callback); - } - */ - - if (typeof fun === 'object') { - console.log("RUNNING VIEW QUERY", fun, opts, arguments); - return viewQuery(fun, opts); - } - - throw({error: "Shouldn't have gotten here"}); - - /* - var parts = fun.split('/'); - db.get('_design/' + parts[0], function(err, doc) { - if (err) { - if (callback) callback(err); - return; - } - viewQuery({ - map: doc.views[parts[1]].map, - reduce: doc.views[parts[1]].reduce - }, opts); - }); - */ - } - - return {'query': query}; - }; - - // Deletion is a noop since we dont store the results of the view - MapReduce._delete = function() { }; - - //Pouch.plugin('mapreduce', MapReduce); - - return MapReduce(); -}); http://git-wip-us.apache.org/repos/asf/couchdb/blob/89810cce/src/fauxton/app/router.js ---------------------------------------------------------------------- diff --git a/src/fauxton/app/router.js b/src/fauxton/app/router.js index e3a1636..7cf69ad 100644 --- a/src/fauxton/app/router.js +++ b/src/fauxton/app/router.js @@ -25,27 +25,14 @@ define([ "api", // Modules - "modules/fauxton/base", + "addons/fauxton/base", // Layout - "modules/fauxton/layout", - - // Routes return the module that they define routes for - "modules/databases/base", - "modules/documents/base", - "modules/pouchdb/base", - - - // this needs to be added as a plugin later - // "modules/logs/base", - // "modules/config/base", + "addons/fauxton/layout", "load_addons" ], -function(req, app, Initialize, FauxtonAPI, Fauxton, Layout, Databases, Documents, Pouch, LoadAddons) { - - // TODO: auto generate this list if possible - var modules = [Databases, Documents]; +function(req, app, Initialize, FauxtonAPI, Fauxton, Layout, LoadAddons) { var beforeUnloads = {}; @@ -106,11 +93,6 @@ function(req, app, Initialize, FauxtonAPI, Fauxton, Layout, Databases, Documents }, setModuleRoutes: function() { - _.each(modules, function(module) { - if (module){ - _.each(module.RouteObjects, this.addModuleRouteObject, this); - } - }, this); _.each(LoadAddons.addons, function(module) { if (module){ module.initialize(); @@ -122,21 +104,6 @@ function(req, app, Initialize, FauxtonAPI, Fauxton, Layout, Databases, Documents }, this); }, - /*setAddonHooks: function() { - _.each(LoadAddons.addons, function(module) { - // This is updates to views by the addon - if (module && module.hooks){ - _.each(module.hooks, function(callback, route){ - if (this.masterLayout.hooks[route]) { - this.masterLayout.hooks[route].push(callback); - } else { - this.masterLayout.hooks[route] = [callback]; - } - }, this); - } - }, this); - },*/ - initialize: function() { //TODO: It would be nice to handle this with a router this.navBar = app.navBar = new Fauxton.NavBar(); http://git-wip-us.apache.org/repos/asf/couchdb/blob/89810cce/src/fauxton/settings.json.default ---------------------------------------------------------------------- diff --git a/src/fauxton/settings.json.default b/src/fauxton/settings.json.default index ad7e6b5..cb09eb2 100644 --- a/src/fauxton/settings.json.default +++ b/src/fauxton/settings.json.default @@ -1,5 +1,8 @@ { "deps": [ + { "name": "databases" }, + { "name": "documents" }, + { "name": "pouchdb" }, { "name": "activetasks" }, { "name": "config" }, { "name": "logs" },