diff options
| author | John Christopher Anderson <jchris@apache.org> | 2009-01-07 18:21:23 +0000 | 
|---|---|---|
| committer | John Christopher Anderson <jchris@apache.org> | 2009-01-07 18:21:23 +0000 | 
| commit | aa48faa19166a1f31d3f2ba6a7c28cc7535b7c6d (patch) | |
| tree | fdf7a81cf1c66f7c9d202084936ea9a24e85050b /share/www | |
| parent | f4d88a0164ac42b3781ebd9d170668ff95f7d9ca (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/www')
| -rw-r--r-- | share/www/browse/database.html | 3 | ||||
| -rw-r--r-- | share/www/browse/document.html | 3 | ||||
| -rw-r--r-- | share/www/index.html | 21 | ||||
| -rw-r--r-- | share/www/script/jquery.history.js | 150 | 
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); +		} +	} +}); + +  | 
