Adding a listener mechanism for updated preferences.
Theme updates are now propagated to all user sessions. Change-Id: If0e3f417294ee503c1186710c614d813b7cbd88e
Showing
2 changed files
with
31 additions
and
10 deletions
| ... | @@ -24,7 +24,7 @@ | ... | @@ -24,7 +24,7 @@ |
| 24 | var $log, fs, wss; | 24 | var $log, fs, wss; |
| 25 | 25 | ||
| 26 | // internal state | 26 | // internal state |
| 27 | - var cache = {}; | 27 | + var cache = {}, listeners = []; |
| 28 | 28 | ||
| 29 | // returns the preference by the specified name | 29 | // returns the preference by the specified name |
| 30 | function getPrefs(name, defaults) { | 30 | function getPrefs(name, defaults) { |
| ... | @@ -56,7 +56,16 @@ | ... | @@ -56,7 +56,16 @@ |
| 56 | 56 | ||
| 57 | function updatePrefs(data) { | 57 | function updatePrefs(data) { |
| 58 | $log.info('User properties updated'); | 58 | $log.info('User properties updated'); |
| 59 | - cache[data.key] = data.value; | 59 | + cache = data; |
| 60 | + listeners.forEach(function (l) { l(); }); | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + function addListener(listener) { | ||
| 64 | + listeners.push(listener); | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | + function removeListener(listener) { | ||
| 68 | + listeners = listeners.filter(function(obj) { return obj === listener; }); | ||
| 60 | } | 69 | } |
| 61 | 70 | ||
| 62 | angular.module('onosUtil') | 71 | angular.module('onosUtil') |
| ... | @@ -75,7 +84,9 @@ | ... | @@ -75,7 +84,9 @@ |
| 75 | return { | 84 | return { |
| 76 | getPrefs: getPrefs, | 85 | getPrefs: getPrefs, |
| 77 | asNumbers: asNumbers, | 86 | asNumbers: asNumbers, |
| 78 | - setPrefs: setPrefs | 87 | + setPrefs: setPrefs, |
| 88 | + addListener: addListener, | ||
| 89 | + removeListener: removeListener | ||
| 79 | }; | 90 | }; |
| 80 | }]); | 91 | }]); |
| 81 | 92 | ... | ... |
| ... | @@ -24,6 +24,7 @@ | ... | @@ -24,6 +24,7 @@ |
| 24 | 24 | ||
| 25 | var themes = ['light', 'dark'], | 25 | var themes = ['light', 'dark'], |
| 26 | themeStr = themes.join(' '), | 26 | themeStr = themes.join(' '), |
| 27 | + currentTheme, | ||
| 27 | thidx, | 28 | thidx, |
| 28 | listeners = {}, | 29 | listeners = {}, |
| 29 | nextListenerId = 1; | 30 | nextListenerId = 1; |
| ... | @@ -42,8 +43,7 @@ | ... | @@ -42,8 +43,7 @@ |
| 42 | if (force || idx > -1 && idx !== thidx) { | 43 | if (force || idx > -1 && idx !== thidx) { |
| 43 | thidx = idx; | 44 | thidx = idx; |
| 44 | ps.setPrefs('theme', { idx: thidx }); | 45 | ps.setPrefs('theme', { idx: thidx }); |
| 45 | - updateBodyClass(); | 46 | + applyTheme(); |
| 46 | - themeEvent('set'); | ||
| 47 | } | 47 | } |
| 48 | } | 48 | } |
| 49 | 49 | ||
| ... | @@ -51,15 +51,24 @@ | ... | @@ -51,15 +51,24 @@ |
| 51 | var i = thidx + 1; | 51 | var i = thidx + 1; |
| 52 | thidx = (i===themes.length) ? 0 : i; | 52 | thidx = (i===themes.length) ? 0 : i; |
| 53 | ps.setPrefs('theme', { idx: thidx }); | 53 | ps.setPrefs('theme', { idx: thidx }); |
| 54 | - updateBodyClass(); | 54 | + applyTheme('toggle'); |
| 55 | - themeEvent('toggle'); | ||
| 56 | return getTheme(); | 55 | return getTheme(); |
| 57 | } | 56 | } |
| 58 | 57 | ||
| 58 | + function applyTheme(evt) { | ||
| 59 | + thidx = ps.getPrefs('theme', { idx: thidx }).idx; | ||
| 60 | + if (currentTheme != thidx) { | ||
| 61 | + $log.info('Applying theme:', thidx); | ||
| 62 | + updateBodyClass(); | ||
| 63 | + themeEvent(evt || 'set'); | ||
| 64 | + } | ||
| 65 | + } | ||
| 66 | + | ||
| 59 | function updateBodyClass() { | 67 | function updateBodyClass() { |
| 60 | var body = d3.select('body'); | 68 | var body = d3.select('body'); |
| 61 | body.classed(themeStr, false); | 69 | body.classed(themeStr, false); |
| 62 | body.classed(getTheme(), true); | 70 | body.classed(getTheme(), true); |
| 71 | + currentTheme = thidx; | ||
| 63 | } | 72 | } |
| 64 | 73 | ||
| 65 | function themeEvent(w) { | 74 | function themeEvent(w) { |
| ... | @@ -67,9 +76,8 @@ | ... | @@ -67,9 +76,8 @@ |
| 67 | m = 'Theme-Change-('+w+'): ' + t; | 76 | m = 'Theme-Change-('+w+'): ' + t; |
| 68 | $log.debug(m); | 77 | $log.debug(m); |
| 69 | angular.forEach(listeners, function(value) { | 78 | angular.forEach(listeners, function(value) { |
| 70 | - value.cb( | 79 | + value.cb({ |
| 71 | - { | 80 | + event: 'themeChange', |
| 72 | - event: 'themeChange', | ||
| 73 | value: t | 81 | value: t |
| 74 | } | 82 | } |
| 75 | ); | 83 | ); |
| ... | @@ -105,6 +113,8 @@ | ... | @@ -105,6 +113,8 @@ |
| 105 | fs = _fs_; | 113 | fs = _fs_; |
| 106 | ps = _ps_; | 114 | ps = _ps_; |
| 107 | 115 | ||
| 116 | + ps.addListener(applyTheme); | ||
| 117 | + | ||
| 108 | return { | 118 | return { |
| 109 | init: init, | 119 | init: init, |
| 110 | theme: function (x) { | 120 | theme: function (x) { | ... | ... |
-
Please register or login to post a comment