X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/3789b528d8dd8aad4558e38e22d775bcab1cbd36..6746dc89c47ed01b165cc1152533605f97eb8e8d:/docs/app/History.js diff --git a/docs/app/History.js b/docs/app/History.js new file mode 100644 index 00000000..bb8883ef --- /dev/null +++ b/docs/app/History.js @@ -0,0 +1,100 @@ +/** + * Browser history management using Ext.util.History. + */ +Ext.define("Docs.History", { + extend: 'Docs.LocalStore', + storeName: 'History', + singleton: true, + + // Maximum number of items to keep in history store + maxHistoryLength: 25, + + /** + * Initializes history management. + */ + init: function() { + Ext.util.History.init(function() { + this.navigate(Ext.util.History.getToken()); + }, this); + Ext.util.History.on("change", this.navigate, this); + this.callParent(); + }, + + // Parses current URL and navigates to the page + navigate: function(token) { + if (this.ignoreChange) { + this.ignoreChange = false; + return; + } + + var url = this.parseToken(token); + if (url.type === "api") { + Docs.App.getController('Classes').loadClass(url.key, true); + } + else if (url.type === "guide") { + Docs.App.getController('Classes').showGuide(url.key, true); + } + else { + Ext.getCmp('container').layout.setActiveItem(0); + } + }, + + // Parses current browser location + parseToken: function(token) { + var matches = token && token.match(/\/(api|guide)\/(.*)/); + return matches ? {type: matches[1], key: matches[2]} : {}; + }, + + // Extracts class name from history token + // Returns false when it's not class-related token. + parseClassName: function(token) { + var url = this.parseToken(token); + if (url.type === "api") { + return url.key.replace(/-.*$/, ''); + } + else { + return false; + } + }, + + /** + * Adds URL to history + * + * @param {String} token the part of URL after # + */ + push: function(token) { + this.ignoreChange = true; + Ext.util.History.add(token); + + // Add class name to history store if it's not there already + var cls = this.parseClassName(token); + if (cls) { + // When class already in history remove it and add again. + // This way the most recently visited items will always be at the top. + var oldIndex = this.store.findExact('cls', cls); + if (oldIndex > -1) { + this.store.removeAt(oldIndex); + } + + // Add new item at the beginning + this.store.insert(0, {cls: cls}); + + // Remove items from the end of history if there are too many + while (this.store.getAt(this.maxHistoryLength)) { + this.store.removeAt(this.maxHistoryLength); + } + this.syncStore(); + } + }, + + /** + * Removes class from History store + * + * @param {String} cls + */ + removeClass: function(cls) { + var index = this.store.findExact('cls', cls); + this.store.removeAt(index); + this.syncStore(); + } +});