summaryrefslogtreecommitdiff
path: root/share
diff options
context:
space:
mode:
authorJohn Christopher Anderson <jchris@apache.org>2009-01-07 18:21:23 +0000
committerJohn Christopher Anderson <jchris@apache.org>2009-01-07 18:21:23 +0000
commitaa48faa19166a1f31d3f2ba6a7c28cc7535b7c6d (patch)
treefdf7a81cf1c66f7c9d202084936ea9a24e85050b /share
parentf4d88a0164ac42b3781ebd9d170668ff95f7d9ca (diff)
Futon history browsing - applied patch from COUCHDB-186
git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@732413 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'share')
-rw-r--r--share/www/browse/database.html3
-rw-r--r--share/www/browse/document.html3
-rw-r--r--share/www/index.html21
-rw-r--r--share/www/script/jquery.history.js150
4 files changed, 175 insertions, 2 deletions
diff --git a/share/www/browse/database.html b/share/www/browse/database.html
index 6b12ed7d..a3c08804 100644
--- a/share/www/browse/database.html
+++ b/share/www/browse/database.html
@@ -103,6 +103,9 @@ specific language governing permissions and limitations under the License.
$("#toolbar button.add").click(page.addDocument);
$("#toolbar button.compact").click(page.compactDatabase);
$("#toolbar button.delete").click(page.deleteDatabase);
+
+ // Update title
+ document.title = "Browse Database " + page.db.name;
});
</script>
</head>
diff --git a/share/www/browse/document.html b/share/www/browse/document.html
index 09136533..f4f6fff9 100644
--- a/share/www/browse/document.html
+++ b/share/www/browse/document.html
@@ -64,6 +64,9 @@ specific language governing permissions and limitations under the License.
$("#toolbar button.add").click(page.addField);
$("#toolbar button.load").click(page.uploadAttachment);
$("#toolbar button.delete").click(page.deleteDocument);
+
+ // Update the title
+ document.title = "View Document " + page.docId;
});
</script>
</head>
diff --git a/share/www/index.html b/share/www/index.html
index 37217384..a20754b8 100644
--- a/share/www/index.html
+++ b/share/www/index.html
@@ -30,7 +30,8 @@ specific language governing permissions and limitations under the License.
<script src="script/jquery.js?1.2.6"></script>
<script src="script/jquery.cookies.js?0.8.0"></script>
<script src="script/jquery.couch.js?0.8.0"></script>
- <script>
+ <script src="script/jquery.history.js?0.8.0"></script>
+ <script type="text/javascript">
function updateRecentDatabasesList() {
$("#dbs").empty();
var recentDbs = $.cookies.get("recent", "").split(",");
@@ -41,6 +42,17 @@ specific language governing permissions and limitations under the License.
"</a></li>");
});
}
+ var baseURL = location.pathname.match(/.*\//).toString();
+ function updateIFrame(hash) {
+ var l = frames['content'].location;
+ var title = frames['content'].document.title + " - Apache CouchDB: Futon Utility Client";
+ document.title = title;
+ var href = baseURL + hash;
+ // For some reason the onload event fires twice; the 2nd time with URL-decoded l.href
+ if (hash != '' && decodeURIComponent(l.pathname + l.search) != decodeURIComponent(href)) {
+ l.href = href;
+ }
+ }
function updateNavigation(path, queryString) {
function fixupPath(path) { // hack for IE/Win
return (path.charAt(0) != "/") ? ("/" + path) : path;
@@ -69,6 +81,11 @@ specific language governing permissions and limitations under the License.
});
}
$(function() {
+ $.historyInit(updateIFrame);
+ $('#content').load(function() {
+ var l = frames["content"].location;
+ $.historyLoad(l.pathname.substring(baseURL.length) + l.search);
+ });
$.couch.info({
success: function(info, status) {
$("#version").text(info.version);
@@ -95,7 +112,7 @@ specific language governing permissions and limitations under the License.
</ul>
<div id="footer">Futon on Apache CouchDB <span id="version">?</span></div>
<div id="view">
- <iframe name="content" src="browse/index.html" allowtransparency="true">
+ <iframe name="content" src="browse/index.html" allowtransparency="true" id="content">
</div>
</body>
</html>
diff --git a/share/www/script/jquery.history.js b/share/www/script/jquery.history.js
new file mode 100644
index 00000000..14e40824
--- /dev/null
+++ b/share/www/script/jquery.history.js
@@ -0,0 +1,150 @@
+/*
+ * jQuery history plugin
+ *
+ * Copyright (c) 2006 Taku Sano (Mikage Sawatari)
+ * Licensed under the MIT License:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * Modified by Lincoln Cooper to add Safari support and only call the callback once during initialization
+ * for msie when no initial hash supplied.
+ */
+
+
+jQuery.extend({
+ historyCurrentHash: undefined,
+
+ historyCallback: undefined,
+
+ historyInit: function(callback){
+ jQuery.historyCallback = callback;
+ var current_hash = location.hash;
+
+ jQuery.historyCurrentHash = current_hash;
+ if(jQuery.browser.msie) {
+ // To stop the callback firing twice during initilization if no hash present
+ if (jQuery.historyCurrentHash == '') {
+ jQuery.historyCurrentHash = '#';
+ }
+
+ // add hidden iframe for IE
+ $("body").prepend('<iframe id="jQuery_history" style="display: none;"></iframe>');
+ var ihistory = $("#jQuery_history")[0];
+ var iframe = ihistory.contentWindow.document;
+ iframe.open();
+ iframe.close();
+ iframe.location.hash = current_hash;
+ }
+ else if ($.browser.safari) {
+ // etablish back/forward stacks
+ jQuery.historyBackStack = [];
+ jQuery.historyBackStack.length = history.length;
+ jQuery.historyForwardStack = [];
+
+ jQuery.isFirst = true;
+ }
+ jQuery.historyCallback(current_hash.replace(/^#/, ''));
+ setInterval(jQuery.historyCheck, 100);
+ },
+
+ historyAddHistory: function(hash) {
+ // This makes the looping function do something
+ jQuery.historyBackStack.push(hash);
+
+ jQuery.historyForwardStack.length = 0; // clear forwardStack (true click occured)
+ this.isFirst = true;
+ },
+
+ historyCheck: function(){
+ if(jQuery.browser.msie) {
+ // On IE, check for location.hash of iframe
+ var ihistory = $("#jQuery_history")[0];
+ var iframe = ihistory.contentDocument || ihistory.contentWindow.document;
+ var current_hash = iframe.location.hash;
+ if(current_hash != jQuery.historyCurrentHash) {
+
+ location.hash = current_hash;
+ jQuery.historyCurrentHash = current_hash;
+ jQuery.historyCallback(current_hash.replace(/^#/, ''));
+
+ }
+ } else if ($.browser.safari) {
+ if (!jQuery.dontCheck) {
+ var historyDelta = history.length - jQuery.historyBackStack.length;
+
+ if (historyDelta) { // back or forward button has been pushed
+ jQuery.isFirst = false;
+ if (historyDelta < 0) { // back button has been pushed
+ // move items to forward stack
+ for (var i = 0; i < Math.abs(historyDelta); i++) jQuery.historyForwardStack.unshift(jQuery.historyBackStack.pop());
+ } else { // forward button has been pushed
+ // move items to back stack
+ for (var i = 0; i < historyDelta; i++) jQuery.historyBackStack.push(jQuery.historyForwardStack.shift());
+ }
+ var cachedHash = jQuery.historyBackStack[jQuery.historyBackStack.length - 1];
+ if (cachedHash != undefined) {
+ jQuery.historyCurrentHash = location.hash;
+ jQuery.historyCallback(cachedHash);
+ }
+ } else if (jQuery.historyBackStack[jQuery.historyBackStack.length - 1] == undefined && !jQuery.isFirst) {
+ // back button has been pushed to beginning and URL already pointed to hash (e.g. a bookmark)
+ // document.URL doesn't change in Safari
+ if (document.URL.indexOf('#') >= 0) {
+ jQuery.historyCallback(document.URL.split('#')[1]);
+ } else {
+ var current_hash = location.hash;
+ jQuery.historyCallback('');
+ }
+ jQuery.isFirst = true;
+ }
+ }
+ } else {
+ // otherwise, check for location.hash
+ var current_hash = location.hash;
+ if(current_hash != jQuery.historyCurrentHash) {
+ jQuery.historyCurrentHash = current_hash;
+ jQuery.historyCallback(current_hash.replace(/^#/, ''));
+ }
+ }
+ },
+ historyLoad: function(hash){
+ var newhash;
+
+ if (jQuery.browser.safari) {
+ newhash = hash;
+ }
+ else {
+ newhash = '#' + hash;
+ location.hash = newhash;
+ }
+ jQuery.historyCurrentHash = newhash;
+
+ if(jQuery.browser.msie) {
+ var ihistory = $("#jQuery_history")[0];
+ var iframe = ihistory.contentWindow.document;
+ iframe.open();
+ iframe.close();
+ iframe.location.hash = newhash;
+ jQuery.historyCallback(hash);
+ }
+ else if (jQuery.browser.safari) {
+ jQuery.dontCheck = true;
+ // Manually keep track of the history values for Safari
+ this.historyAddHistory(hash);
+
+ // Wait a while before allowing checking so that Safari has time to update the "history" object
+ // correctly (otherwise the check loop would detect a false change in hash).
+ var fn = function() {jQuery.dontCheck = false;};
+ window.setTimeout(fn, 200);
+ jQuery.historyCallback(hash);
+ // N.B. "location.hash=" must be the last line of code for Safari as execution stops afterwards.
+ // By explicitly using the "location.hash" command (instead of using a variable set to "location.hash") the
+ // URL in the browser and the "history" object are both updated correctly.
+ location.hash = newhash;
+ }
+ else {
+ jQuery.historyCallback(hash);
+ }
+ }
+});
+
+