diff --git a/assets/javascripts/app/app.coffee b/assets/javascripts/app/app.coffee
index a6dab394..ad53265d 100644
--- a/assets/javascripts/app/app.coffee
+++ b/assets/javascripts/app/app.coffee
@@ -67,7 +67,7 @@
true
dataCallback: (data) ->
try
- $.extend(data.user ||= {}, app.settings.settings)
+ $.extend(data.user ||= {}, app.settings.dump())
data.user.lastIDBTransaction = app.lastIDBTransaction if app.lastIDBTransaction
data
.install()
@@ -170,10 +170,10 @@
showTip: (tip) ->
return if @isSingleDoc()
- tips = @settings.get('tips') || []
+ tips = @settings.getTips()
if tips.indexOf(tip) is -1
tips.push(tip)
- @settings.set('tips', tips)
+ @settings.setTips(tips)
new app.views.Tip(tip)
return
diff --git a/assets/javascripts/app/settings.coffee b/assets/javascripts/app/settings.coffee
index 23c74a2a..a2aad287 100644
--- a/assets/javascripts/app/settings.coffee
+++ b/assets/javascripts/app/settings.coffee
@@ -1,101 +1,88 @@
class app.Settings
- SETTINGS_KEY = 'settings'
DOCS_KEY = 'docs'
DARK_KEY = 'dark'
LAYOUT_KEY = 'layout'
SIZE_KEY = 'size'
+ TIPS_KEY = 'tips'
@defaults:
count: 0
hideDisabled: false
hideIntro: false
news: 0
- autoUpdate: true
+ manualUpdate: false
schema: 1
- constructor: (@store) ->
- @create() unless @settings = @store.get(SETTINGS_KEY)
-
- create: ->
- @settings = $.extend({}, @constructor.defaults)
- @applyLegacyValues @settings
- @save()
- return
-
- applyLegacyValues: (settings) ->
- for key, v of settings when (value = @store.get(key))?
- settings[key] = value
- @store.del(key)
+ constructor: (legacyStore) ->
+ @store = new CookieStore
+ @importLegacyValues(legacyStore)
+
+ importLegacyValues: (legacyStore) ->
+ return unless settings = legacyStore.get('settings')
+ for key, value of settings
+ if key == 'autoUpdate'
+ key = 'manualUpdate'
+ value = !value
+ else if key == 'tips'
+ value = value.join('/')
+ @store.set(key, value)
+ legacyStore.del('settings')
return
- save: ->
- @store.set SETTINGS_KEY, @settings
-
set: (key, value) ->
- @settings[key] = value
- @save()
+ @store.set(key, value)
+ return
get: (key) ->
- @settings[key] ? @constructor.defaults[key]
+ @store.get(key) ? @constructor.defaults[key]
hasDocs: ->
- try !!Cookies.get DOCS_KEY
+ try !!@store.get(DOCS_KEY)
getDocs: ->
- try
- Cookies.get(DOCS_KEY)?.split('/') or app.config.default_docs
- catch
- app.config.default_docs
+ @store.get(DOCS_KEY)?.split('/') or app.config.default_docs
setDocs: (docs) ->
- try
- Cookies.set DOCS_KEY, docs.join('/'), path: '/', expires: 1e8
- catch
+ @store.set DOCS_KEY, docs.join('/')
+ return
+
+ getTips: ->
+ @store.get(TIPS_KEY)?.split('/') or []
+
+ setTips: (tips) ->
+ @store.set TIPS_KEY, tips.join('/')
return
setDark: (value) ->
- try
- if value
- Cookies.set DARK_KEY, '1', path: '/', expires: 1e8
- else
- Cookies.expire DARK_KEY
- catch
+ @store.set DARK_KEY, !!value
return
setLayout: (name, enable) ->
- try
- layout = (Cookies.get(LAYOUT_KEY) || '').split(' ')
- $.arrayDelete(layout, '')
-
- if enable
- layout.push(name) if layout.indexOf(name) is -1
- else
- $.arrayDelete(layout, name)
-
- if layout.length > 0
- Cookies.set LAYOUT_KEY, layout.join(' '), path: '/', expires: 1e8
- else
- Cookies.expire LAYOUT_KEY
- catch
+ layout = (@store.get(LAYOUT_KEY) || '').split(' ')
+ $.arrayDelete(layout, '')
+
+ if enable
+ layout.push(name) if layout.indexOf(name) is -1
+ else
+ $.arrayDelete(layout, name)
+
+ if layout.length > 0
+ @store.set LAYOUT_KEY, layout.join(' ')
+ else
+ @store.del LAYOUT_KEY
return
hasLayout: (name) ->
- try
- layout = (Cookies.get(LAYOUT_KEY) || '').split(' ')
- layout.indexOf(name) isnt -1
- catch
- false
+ layout = (@store.get(LAYOUT_KEY) || '').split(' ')
+ layout.indexOf(name) isnt -1
setSize: (value) ->
- try
- Cookies.set SIZE_KEY, value, path: '/', expires: 1e8
- catch
+ @store.set SIZE_KEY, value
return
+ dump: ->
+ @store.dump()
+
reset: ->
- try Cookies.expire DOCS_KEY
- try Cookies.expire DARK_KEY
- try Cookies.expire LAYOUT_KEY
- try Cookies.expire SIZE_KEY
- try @store.del(SETTINGS_KEY)
+ @store.reset()
return
diff --git a/assets/javascripts/app/update_checker.coffee b/assets/javascripts/app/update_checker.coffee
index e7af516e..444661f9 100644
--- a/assets/javascripts/app/update_checker.coffee
+++ b/assets/javascripts/app/update_checker.coffee
@@ -22,7 +22,7 @@ class app.UpdateChecker
return
checkDocs: ->
- if app.settings.get('autoUpdate')
+ unless app.settings.get('manualUpdate')
app.docs.updateInBackground()
else
app.docs.checkForUpdates (i) => @onDocsUpdateReady() if i > 0
diff --git a/assets/javascripts/lib/cookie_store.coffee b/assets/javascripts/lib/cookie_store.coffee
new file mode 100644
index 00000000..041035f3
--- /dev/null
+++ b/assets/javascripts/lib/cookie_store.coffee
@@ -0,0 +1,40 @@
+class @CookieStore
+ INT = /^\d+$/
+
+ get: (key) ->
+ try
+ value = Cookies.get(key)
+ value = parseInt(value, 10) if value? and INT.test(value)
+ value
+ catch
+
+ set: (key, value) ->
+ if value == false
+ return @del(key)
+ else if value == true
+ value = 1
+
+ try
+ Cookies.set(key, '' + value, path: '/', expires: 1e8)
+ true
+ catch
+
+ del: (key) ->
+ try
+ Cookies.expire(key)
+ true
+ catch
+
+ reset: ->
+ try
+ for cookie in document.cookie.split(/;\s?/)
+ Cookies.expire(cookie.split('=')[0])
+ return
+ catch
+
+ dump: ->
+ result = {}
+ for cookie in document.cookie.split(/;\s?/)
+ cookie = cookie.split('=')
+ result[cookie[0]] = cookie[1]
+ result
diff --git a/assets/javascripts/templates/pages/offline_tmpl.coffee b/assets/javascripts/templates/pages/offline_tmpl.coffee
index e5bf670f..c65cc1dc 100644
--- a/assets/javascripts/templates/pages/offline_tmpl.coffee
+++ b/assets/javascripts/templates/pages/offline_tmpl.coffee
@@ -6,7 +6,7 @@ app.templates.offlinePage = (docs) -> """
Install allUpdate allUninstall all
diff --git a/assets/javascripts/views/content/offline_page.coffee b/assets/javascripts/views/content/offline_page.coffee
index 5556a1e6..f93fe54e 100644
--- a/assets/javascripts/views/content/offline_page.coffee
+++ b/assets/javascripts/views/content/offline_page.coffee
@@ -81,5 +81,5 @@ class app.views.OfflinePage extends app.View
onChange: (event) ->
if event.target.name is 'autoUpdate'
- app.settings.set 'autoUpdate', !!event.target.checked
+ app.settings.set 'manualUpdate', !event.target.checked
return
diff --git a/assets/javascripts/views/sidebar/doc_list.coffee b/assets/javascripts/views/sidebar/doc_list.coffee
index 6d4acb72..77338c7c 100644
--- a/assets/javascripts/views/sidebar/doc_list.coffee
+++ b/assets/javascripts/views/sidebar/doc_list.coffee
@@ -46,10 +46,9 @@ class app.views.DocList extends app.View
return
renderDisabledList: ->
- if (hidden = app.settings.get 'hideDisabled') is true
+ if app.settings.get('hideDisabled')
@removeDisabledList()
else
- app.settings.set 'hideDisabled', false unless hidden is false
@appendDisabledList()
return