From 1f3feca67ae46190e85f956e48a738449cf5b06f Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sat, 12 Jan 2013 11:46:24 +0100 Subject: [PATCH] use localStorage to store state of the user interface --- scm-webapp/src/main/webapp/index.mustache | 4 + .../src/main/webapp/resources/js/sonia.scm.js | 15 +++- .../resources/js/uistate/sonia.uistate.js | 31 ++++++++ .../sonia.uistate.webstorageprovider.js | 79 +++++++++++++++++++ 4 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 scm-webapp/src/main/webapp/resources/js/uistate/sonia.uistate.js create mode 100644 scm-webapp/src/main/webapp/resources/js/uistate/sonia.uistate.webstorageprovider.js diff --git a/scm-webapp/src/main/webapp/index.mustache b/scm-webapp/src/main/webapp/index.mustache index 475fc24d1b..d25b200365 100644 --- a/scm-webapp/src/main/webapp/index.mustache +++ b/scm-webapp/src/main/webapp/index.mustache @@ -83,6 +83,10 @@ + + + + diff --git a/scm-webapp/src/main/webapp/resources/js/sonia.scm.js b/scm-webapp/src/main/webapp/resources/js/sonia.scm.js index a04f2dea25..e756a86de3 100644 --- a/scm-webapp/src/main/webapp/resources/js/sonia.scm.js +++ b/scm-webapp/src/main/webapp/resources/js/sonia.scm.js @@ -574,7 +574,20 @@ Sonia.scm.Main = Ext.extend(Ext.util.Observable, { Ext.onReady(function(){ - Ext.state.Manager.setProvider(new Ext.state.CookieProvider()); + var stateProvider; + if (localStorage){ + if (debug){ + console.debug('use localStore to save application state'); + } + stateProvider = new Sonia.uistate.WebStorageProvider(); + } else { + if (debug){ + console.debug('use cookies to save application state, because localStore is not available'); + } + stateProvider = new Ext.state.CookieProvider(); + } + + Ext.state.Manager.setProvider(stateProvider); var mainTabPanel = new Ext.TabPanel({ id: 'mainTabPanel', diff --git a/scm-webapp/src/main/webapp/resources/js/uistate/sonia.uistate.js b/scm-webapp/src/main/webapp/resources/js/uistate/sonia.uistate.js new file mode 100644 index 0000000000..650af445ec --- /dev/null +++ b/scm-webapp/src/main/webapp/resources/js/uistate/sonia.uistate.js @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ +Ext.ns('Sonia.uistate'); \ No newline at end of file diff --git a/scm-webapp/src/main/webapp/resources/js/uistate/sonia.uistate.webstorageprovider.js b/scm-webapp/src/main/webapp/resources/js/uistate/sonia.uistate.webstorageprovider.js new file mode 100644 index 0000000000..0566020cb0 --- /dev/null +++ b/scm-webapp/src/main/webapp/resources/js/uistate/sonia.uistate.webstorageprovider.js @@ -0,0 +1,79 @@ +/* * + * Copyright (c) 2010, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + +Sonia.uistate.WebStorageProvider = Ext.extend(Ext.state.Provider,{ + + /** + * Configures the webstorage state provider for the application + * @param {Mixed} config provider configuration + */ + constructor : function(config){ + Ext.apply(this, config); + }, + + /** + * Returns the current value for a key + * @param {String} name The key name + * @param {Mixed} defaultValue The default value to return if the key lookup does not match + * @return {Mixed} The state data + */ + get : function(name, defaultValue){ + var value = localStorage.getItem(name); + if ( value ){ + value = this.decodeValue(value); + } else { + value = defaultValue; + } + return value; + }, + + /** + * Sets the value for a key + * @param {String} name The key name + * @param {Mixed} value The state data + */ + set : function(name, value){ + if(typeof value == "undefined" || value === null){ + this.clear(name); + } else { + localStorage.setItem(name, this.encodeValue(value)); + } + }, + + /** + * Clears a value from the state + * @param {String} name The key name + */ + clear : function(name){ + localStorage.removeItem(name); + } + +}); \ No newline at end of file