From e19b5124101f2ff5aa755df99b0fcbd0923aa01f Mon Sep 17 00:00:00 2001 From: Christopher Lenz Date: Fri, 9 Jan 2009 18:20:37 +0000 Subject: Refactoring in Futon to clean up interactions between specific pages and the navigation. Also, switched some graphics over to PNGs with alpha-transparency (screw you IE6), and added a button for removing databases from the recent databases list. git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@733104 13f79535-47bb-0310-9956-ffa450edef68 --- share/www/script/browse.js | 41 +++++++++------ share/www/script/futon.js | 127 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+), 17 deletions(-) create mode 100644 share/www/script/futon.js (limited to 'share/www/script') diff --git a/share/www/script/browse.js b/share/www/script/browse.js index 66acd679..f6aad59f 100644 --- a/share/www/script/browse.js +++ b/share/www/script/browse.js @@ -107,7 +107,10 @@ function CouchDatabasePage() { viewName = decodeURIComponent(viewName); $.cookies.set(dbName + ".view", viewName); } else { - viewName = $.cookies.get(dbName + ".view") || ""; + viewName = $.cookies.get(dbName + ".view", ""); + if (viewName) { + location.href = "database.html?" + dbName + "/" + viewName; + } } var db = $.couch.db(dbName); @@ -157,15 +160,7 @@ function CouchDatabasePage() { $("#dbs li").filter(function(index) { return $("a", this).text() == dbName; }).remove(); - - // remove database from recent databases list - var recentDbs = $.cookies.get("recent", "").split(","); - var recentIdx = $.inArray(db.name, recentDbs) - if (recentIdx >= 0) { - recentDbs.splice(recentIdx, 1); - $.cookies.set("recent", recentDbs.join(",")); - updateRecentDatabasesList(); - } + $.futon.navigation.removeDatabase(dbName); } } }); @@ -200,6 +195,11 @@ function CouchDatabasePage() { .bind("textInput", updateDirtyState); } }); + } else if (viewName == "_slow_view") { + page.updateViewEditor( + $.cookies.get(db.name + ".map"), + $.cookies.get(db.name + ".reduce", "") + ); } } @@ -252,11 +252,7 @@ function CouchDatabasePage() { }, success: function(resp) { var viewCode = resp.views[localViewName]; - $("#viewcode_map").val(viewCode.map); - $("#viewcode_reduce").val(viewCode.reduce || ""); - var lines = Math.max(viewCode.map.split("\n").length, - (viewCode.reduce ? viewCode.reduce.split("\n").length : 1)); - $("#viewcode textarea").attr("rows", Math.min(15, Math.max(3, lines))); + page.updateViewEditor(viewCode.map, viewCode.reduce || ""); $("#viewcode button.revert, #viewcode button.save").attr("disabled", "disabled"); page.storedViewCode = viewCode; if (callback) callback(); @@ -271,13 +267,24 @@ function CouchDatabasePage() { } } + this.updateViewEditor = function(mapFun, reduceFun) { + if (!mapFun) return; + $("#viewcode_map").val(mapFun); + $("#viewcode_reduce").val(reduceFun); + var lines = Math.max( + mapFun.split("\n").length, + reduceFun.split("\n").length + ); + $("#viewcode textarea").attr("rows", Math.min(15, Math.max(3, lines))); + } + this.saveViewAs = function() { if (viewName && /^_design/.test(viewName)) { var viewNameParts = viewName.split("/"); var designDocId = viewNameParts[1]; var localViewName = viewNameParts[2]; } else { - var designDocId = "", localViewName = "" + var designDocId = "", localViewName = ""; } $.showDialog("dialog/_save_view_as.html", { load: function(elem) { @@ -496,7 +503,7 @@ function CouchDatabasePage() { $(document.body).removeClass("loading"); } - if (!viewName) { + if (!viewName || viewName == "_all_docs") { $("#switch select")[0].selectedIndex = 0; db.allDocs(options); } else { diff --git a/share/www/script/futon.js b/share/www/script/futon.js new file mode 100644 index 00000000..bf148189 --- /dev/null +++ b/share/www/script/futon.js @@ -0,0 +1,127 @@ +// 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. + +(function($) { + + function Navigation() { + var nav = this; + this.loaded = false; + this.eventHandlers = { + load: [] + }; + + this.ready = function(callback) { + if (callback) { + if (this.loaded) { + callback.apply(this); + } + this.eventHandlers["load"].push(callback); + } else { + this.loaded = true; + callbacks = this.eventHandlers["load"]; + for (var i = 0; i < callbacks.length; i++) { + callbacks[i].apply(this); + } + } + } + + this.addDatabase = function(name) { + var recentDbs = $.cookies.get("recent", "").split(","); + if ($.inArray(name, recentDbs) == -1) { + recentDbs.unshift(name); + if (recentDbs.length > 10) recentDbs.length = 10; + $.cookies.set("recent", recentDbs.join(",")); + this.updateDatabases(); + } + } + + this.removeDatabase = function(name) { + // remove database from recent databases list + var recentDbs = $.cookies.get("recent", "").split(","); + var recentIdx = $.inArray(name, recentDbs); + if (recentIdx >= 0) { + recentDbs.splice(recentIdx, 1); + $.cookies.set("recent", recentDbs.join(",")); + this.updateDatabases(); + } + } + + this.updateDatabases = function() { + var selection = null; + $("#dbs .selected a").each(function() { + selection = [this.pathname, this.search]; + }); + $("#dbs").empty(); + var recentDbs = $.cookies.get("recent", "").split(","); + recentDbs.sort(); + $.each(recentDbs, function(idx, name) { + if (name) { + $("#dbs").append("
  • " + name + + "" + + "
  • "); + } + }); + if (selection) { + this.updateSelection(selection[0], selection[1]); + } + $("#dbs button.remove").click(function() { + nav.removeDatabase(this.value); + return false; + }); + } + + this.updateSelection = function(path, queryString) { + function fixupPath(path) { // hack for IE/Win + return (path.charAt(0) != "/") ? ("/" + path) : path; + } + if (!path) { + path = location.pathname; + if (!queryString) { + queryString = location.search; + } + } else if (!queryString) { + queryString = ""; + } + var href = fixupPath(path + queryString); + $("#nav li").removeClass("selected"); + $("#nav li a").each(function() { + if (fixupPath(this.pathname) + this.search != href) return; + $(this).parent("li").addClass("selected").parents("li").addClass("selected"); + }); + } + + } + + $.futon = $.futon || {}; + $.fn.extend($.futon, { + navigation: new Navigation() + }); + + $(function() { + document.title = "Apache CouchDB - Futon: " + document.title; + $.get("_sidebar.html", function(resp) { + $(resp).insertAfter("#wrap"); + + $.futon.navigation.updateDatabases(); + $.futon.navigation.updateSelection(); + $.futon.navigation.ready(); + + $.couch.info({ + success: function(info, status) { + $("#version").text(info.version); + } + }); + }); + }); + +})(jQuery); -- cgit v1.2.3