Unified · Split
| @@ -67,7 +67,7 @@ · 66 unmodified lines | |||
| 67 | true | 67 | true |
| 68 | dataCallback: (data) -> | 68 | dataCallback: (data) -> |
| 69 | try | 69 | try |
| 70 | $.extend(data.user ||= {}, app.settings.settings) | 70 | $.extend(data.user ||= {}, app.settings.dump()) |
| 71 | data.user.lastIDBTransaction = app.lastIDBTransaction if app.lastIDBTransaction | 71 | data.user.lastIDBTransaction = app.lastIDBTransaction if app.lastIDBTransaction |
| 72 | data | 72 | data |
| 73 | .install() | 73 | .install() |
| @@ -170,10 +170,10 @@ · 96 unmodified lines | |||
| 170 | 170 | ||
| 171 | showTip: (tip) -> | 171 | showTip: (tip) -> |
| 172 | return if @isSingleDoc() | 172 | return if @isSingleDoc() |
| 173 | tips = @settings.get('tips') || [] | 173 | tips = @settings.getTips() |
| 174 | if tips.indexOf(tip) is -1 | 174 | if tips.indexOf(tip) is -1 |
| 175 | tips.push(tip) | 175 | tips.push(tip) |
| 176 | @settings.set('tips', tips) | 176 | @settings.setTips(tips) |
| 177 | new app.views.Tip(tip) | 177 | new app.views.Tip(tip) |
| 178 | return | 178 | return |
| 179 | 179 | ||
| @@ -1,101 +1,88 @@ | |||
| 1 | class app.Settings | 1 | class app.Settings |
| 2 | SETTINGS_KEY = 'settings' | ||
| 3 | DOCS_KEY = 'docs' | 2 | DOCS_KEY = 'docs' |
| 4 | DARK_KEY = 'dark' | 3 | DARK_KEY = 'dark' |
| 5 | LAYOUT_KEY = 'layout' | 4 | LAYOUT_KEY = 'layout' |
| 6 | SIZE_KEY = 'size' | 5 | SIZE_KEY = 'size' |
| 6 | TIPS_KEY = 'tips' | ||
| 7 | 7 | ||
| 8 | @defaults: | 8 | @defaults: |
| 9 | count: 0 | 9 | count: 0 |
| 10 | hideDisabled: false | 10 | hideDisabled: false |
| 11 | hideIntro: false | 11 | hideIntro: false |
| 12 | news: 0 | 12 | news: 0 |
| 13 | autoUpdate: true | 13 | manualUpdate: false |
| 14 | schema: 1 | 14 | schema: 1 |
| 15 | 15 | ||
| 16 | constructor: (@store) -> | 16 | constructor: (legacyStore) -> |
| 17 | @create() unless @settings = @store.get(SETTINGS_KEY) | 17 | @store = new CookieStore |
| 18 | 18 | @importLegacyValues(legacyStore) | |
| 19 | create: -> | 19 | |
| 20 | @settings = $.extend({}, @constructor.defaults) | 20 | importLegacyValues: (legacyStore) -> |
| 21 | @applyLegacyValues @settings | 21 | return unless settings = legacyStore.get('settings') |
| 22 | @save() | 22 | for key, value of settings |
| 23 | return | 23 | if key == 'autoUpdate' |
| 24 | 24 | key = 'manualUpdate' | |
| 25 | applyLegacyValues: (settings) -> | 25 | value = !value |
| 26 | for key, v of settings when (value = @store.get(key))? | 26 | else if key == 'tips' |
| 27 | settings[key] = value | 27 | value = value.join('/') |
| 28 | @store.del(key) | 28 | @store.set(key, value) |
| 29 | legacyStore.del('settings') | ||
| 29 | return | 30 | return |
| 30 | 31 | ||
| 31 | save: -> | ||
| 32 | @store.set SETTINGS_KEY, @settings | ||
| 33 | |||
| 34 | set: (key, value) -> | 32 | set: (key, value) -> |
| 35 | @settings[key] = value | 33 | @store.set(key, value) |
| 36 | @save() | 34 | return |
| 37 | 35 | ||
| 38 | get: (key) -> | 36 | get: (key) -> |
| 39 | @settings[key] ? @constructor.defaults[key] | 37 | @store.get(key) ? @constructor.defaults[key] |
| 40 | 38 | ||
| 41 | hasDocs: -> | 39 | hasDocs: -> |
| 42 | try !!Cookies.get DOCS_KEY | 40 | try !!@store.get(DOCS_KEY) |
| 43 | 41 | ||
| 44 | getDocs: -> | 42 | getDocs: -> |
| 45 | try | 43 | @store.get(DOCS_KEY)?.split('/') or app.config.default_docs |
| 46 | Cookies.get(DOCS_KEY)?.split('/') or app.config.default_docs | ||
| 47 | catch | ||
| 48 | app.config.default_docs | ||
| 49 | 44 | ||
| 50 | setDocs: (docs) -> | 45 | setDocs: (docs) -> |
| 51 | try | 46 | @store.set DOCS_KEY, docs.join('/') |
| 52 | Cookies.set DOCS_KEY, docs.join('/'), path: '/', expires: 1e8 | 47 | return |
| 53 | catch | 48 | |
| 49 | getTips: -> | ||
| 50 | @store.get(TIPS_KEY)?.split('/') or [] | ||
| 51 | |||
| 52 | setTips: (tips) -> | ||
| 53 | @store.set TIPS_KEY, tips.join('/') | ||
| 54 | return | 54 | return |
| 55 | 55 | ||
| 56 | setDark: (value) -> | 56 | setDark: (value) -> |
| 57 | try | 57 | @store.set DARK_KEY, !!value |
| 58 | if value | ||
| 59 | Cookies.set DARK_KEY, '1', path: '/', expires: 1e8 | ||
| 60 | else | ||
| 61 | Cookies.expire DARK_KEY | ||
| 62 | catch | ||
| 63 | return | 58 | return |
| 64 | 59 | ||
| 65 | setLayout: (name, enable) -> | 60 | setLayout: (name, enable) -> |
| 66 | try | 61 | layout = (@store.get(LAYOUT_KEY) || '').split(' ') |
| 67 | layout = (Cookies.get(LAYOUT_KEY) || '').split(' ') | 62 | $.arrayDelete(layout, '') |
| 68 | $.arrayDelete(layout, '') | 63 | |
| 69 | 64 | if enable | |
| 70 | if enable | 65 | layout.push(name) if layout.indexOf(name) is -1 |
| 71 | layout.push(name) if layout.indexOf(name) is -1 | 66 | else |
| 72 | else | 67 | $.arrayDelete(layout, name) |
| 73 | $.arrayDelete(layout, name) | 68 | |
| 74 | 69 | if layout.length > 0 | |
| 75 | if layout.length > 0 | 70 | @store.set LAYOUT_KEY, layout.join(' ') |
| 76 | Cookies.set LAYOUT_KEY, layout.join(' '), path: '/', expires: 1e8 | 71 | else |
| 77 | else | 72 | @store.del LAYOUT_KEY |
| 78 | Cookies.expire LAYOUT_KEY | ||
| 79 | catch | ||
| 80 | return | 73 | return |
| 81 | 74 | ||
| 82 | hasLayout: (name) -> | 75 | hasLayout: (name) -> |
| 83 | try | 76 | layout = (@store.get(LAYOUT_KEY) || '').split(' ') |
| 84 | layout = (Cookies.get(LAYOUT_KEY) || '').split(' ') | 77 | layout.indexOf(name) isnt -1 |
| 85 | layout.indexOf(name) isnt -1 | ||
| 86 | catch | ||
| 87 | false | ||
| 88 | 78 | ||
| 89 | setSize: (value) -> | 79 | setSize: (value) -> |
| 90 | try | 80 | @store.set SIZE_KEY, value |
| 91 | Cookies.set SIZE_KEY, value, path: '/', expires: 1e8 | ||
| 92 | catch | ||
| 93 | return | 81 | return |
| 94 | 82 | ||
| 83 | dump: -> | ||
| 84 | @store.dump() | ||
| 85 | |||
| 95 | reset: -> | 86 | reset: -> |
| 96 | try Cookies.expire DOCS_KEY | 87 | @store.reset() |
| 97 | try Cookies.expire DARK_KEY | ||
| 98 | try Cookies.expire LAYOUT_KEY | ||
| 99 | try Cookies.expire SIZE_KEY | ||
| 100 | try @store.del(SETTINGS_KEY) | ||
| 101 | return | 88 | return |
| @@ -22,7 +22,7 @@ class app.UpdateChecker · 21 unmodified lines | |||
| 22 | return | 22 | return |
| 23 | 23 | ||
| 24 | checkDocs: -> | 24 | checkDocs: -> |
| 25 | if app.settings.get('autoUpdate') | 25 | unless app.settings.get('manualUpdate') |
| 26 | app.docs.updateInBackground() | 26 | app.docs.updateInBackground() |
| 27 | else | 27 | else |
| 28 | app.docs.checkForUpdates (i) => @onDocsUpdateReady() if i > 0 | 28 | app.docs.checkForUpdates (i) => @onDocsUpdateReady() if i > 0 |
| @@ -0,0 +1,40 @@ | |||
| 1 | class @CookieStore | ||
| 2 | INT = /^\d+$/ | ||
| 3 | |||
| 4 | get: (key) -> | ||
| 5 | try | ||
| 6 | value = Cookies.get(key) | ||
| 7 | value = parseInt(value, 10) if value? and INT.test(value) | ||
| 8 | value | ||
| 9 | catch | ||
| 10 | |||
| 11 | set: (key, value) -> | ||
| 12 | if value == false | ||
| 13 | return @del(key) | ||
| 14 | else if value == true | ||
| 15 | value = 1 | ||
| 16 | |||
| 17 | try | ||
| 18 | Cookies.set(key, '' + value, path: '/', expires: 1e8) | ||
| 19 | true | ||
| 20 | catch | ||
| 21 | |||
| 22 | del: (key) -> | ||
| 23 | try | ||
| 24 | Cookies.expire(key) | ||
| 25 | true | ||
| 26 | catch | ||
| 27 | |||
| 28 | reset: -> | ||
| 29 | try | ||
| 30 | for cookie in document.cookie.split(/;\s?/) | ||
| 31 | Cookies.expire(cookie.split('=')[0]) | ||
| 32 | return | ||
| 33 | catch | ||
| 34 | |||
| 35 | dump: -> | ||
| 36 | result = {} | ||
| 37 | for cookie in document.cookie.split(/;\s?/) | ||
| 38 | cookie = cookie.split('=') | ||
| 39 | result[cookie[0]] = cookie[1] | ||
| 40 | result | ||
| @@ -6,7 +6,7 @@ app.templates.offlinePage = (docs) -> """ · 5 unmodified lines | |||
| 6 | <a class="_docs-link" data-action-all="install">Install all</a><a class="_docs-link" data-action-all="update"><strong>Update all</strong></a><a class="_docs-link" data-action-all="uninstall">Uninstall all</a> | 6 | <a class="_docs-link" data-action-all="install">Install all</a><a class="_docs-link" data-action-all="update"><strong>Update all</strong></a><a class="_docs-link" data-action-all="uninstall">Uninstall all</a> |
| 7 | </div> | 7 | </div> |
| 8 | <label class="_docs-label"> | 8 | <label class="_docs-label"> |
| 9 | <input type="checkbox" name="autoUpdate" value="1" #{if app.settings.get('autoUpdate') then 'checked' else ''}> | 9 | <input type="checkbox" name="autoUpdate" value="1" #{if app.settings.get('manualUpdate') then '' else 'checked'}> |
| 10 | Check for and install updates automatically | 10 | Check for and install updates automatically |
| 11 | </label> | 11 | </label> |
| 12 | </div> | 12 | </div> |
| @@ -81,5 +81,5 @@ class app.views.OfflinePage extends app.View · 80 unmodified lines | |||
| 81 | 81 | ||
| 82 | onChange: (event) -> | 82 | onChange: (event) -> |
| 83 | if event.target.name is 'autoUpdate' | 83 | if event.target.name is 'autoUpdate' |
| 84 | app.settings.set 'autoUpdate', !!event.target.checked | 84 | app.settings.set 'manualUpdate', !event.target.checked |
| 85 | return | 85 | return |
| @@ -46,10 +46,9 @@ class app.views.DocList extends app.View · 45 unmodified lines | |||
| 46 | return | 46 | return |
| 47 | 47 | ||
| 48 | renderDisabledList: -> | 48 | renderDisabledList: -> |
| 49 | if (hidden = app.settings.get 'hideDisabled') is true | 49 | if app.settings.get('hideDisabled') |
| 50 | @removeDisabledList() | 50 | @removeDisabledList() |
| 51 | else | 51 | else |
| 52 | app.settings.set 'hideDisabled', false unless hidden is false | ||
| 53 | @appendDisabledList() | 52 | @appendDisabledList() |
| 54 | return | 53 | return |
| 55 | 54 | ||