From 947e514bc62f583d1d3929029e818fe2182bd486 Mon Sep 17 00:00:00 2001 From: Spencer Date: Wed, 4 Apr 2018 18:08:47 -0700 Subject: [PATCH] [6.x] [uiSettingsClient] support overriding local defaults (#17559) (#17569) * [uiSettingsClient] support overriding local defaults * [chrome] remove injected uiSettings value --- src/ui/public/chrome/api/angular.js | 1 - .../ui_settings_client.test.js.snap | 75 +++++++++++++++++++ .../ui_settings/public/ui_settings_client.js | 28 +++++++ .../public/ui_settings_client.test.js | 74 ++++++++++++++++++ 4 files changed, 177 insertions(+), 1 deletion(-) diff --git a/src/ui/public/chrome/api/angular.js b/src/ui/public/chrome/api/angular.js index 360cb0dd4474..459e84610263 100644 --- a/src/ui/public/chrome/api/angular.js +++ b/src/ui/public/chrome/api/angular.js @@ -24,7 +24,6 @@ export function initAngularApi(chrome, internals) { .value('buildNum', internals.buildNum) .value('buildSha', internals.buildSha) .value('serverName', internals.serverName) - .value('uiSettings', internals.uiSettings) .value('sessionId', Date.now()) .value('chrome', chrome) .value('esUrl', (function () { diff --git a/src/ui/ui_settings/public/__snapshots__/ui_settings_client.test.js.snap b/src/ui/ui_settings/public/__snapshots__/ui_settings_client.test.js.snap index 572f38789927..be47e62229fe 100644 --- a/src/ui/ui_settings/public/__snapshots__/ui_settings_client.test.js.snap +++ b/src/ui/ui_settings/public/__snapshots__/ui_settings_client.test.js.snap @@ -20,6 +20,81 @@ You can use \`config.get(\\"throwableProperty\\", defaultValue)\`, which will ju \`defaultValue\` when the key is unrecognized." `; +exports[`#overrideLocalDefault key has no user value calls subscriber with new and previous value: single subscriber call 1`] = ` +Array [ + Array [ + Object { + "key": "dateFormat", + "newValue": "bar", + "oldValue": "Browser", + }, + ], +] +`; + +exports[`#overrideLocalDefault key has no user value synchonously modifies the default value returned by get(): get after override 1`] = `"bar"`; + +exports[`#overrideLocalDefault key has no user value synchonously modifies the default value returned by get(): get before override 1`] = `"Browser"`; + +exports[`#overrideLocalDefault key has no user value synchonously modifies the value returned by getAll(): getAll after override 1`] = ` +Object { + "dateFormat": Object { + "value": "bar", + }, +} +`; + +exports[`#overrideLocalDefault key has no user value synchonously modifies the value returned by getAll(): getAll before override 1`] = ` +Object { + "dateFormat": Object { + "value": "Browser", + }, +} +`; + +exports[`#overrideLocalDefault key with user value does not modify the return value of get: get after override 1`] = `"foo"`; + +exports[`#overrideLocalDefault key with user value does not modify the return value of get: get before override 1`] = `"foo"`; + +exports[`#overrideLocalDefault key with user value is included in the return value of getAll: getAll after override 1`] = ` +Object { + "dateFormat": Object { + "userValue": "foo", + "value": "bar", + }, +} +`; + +exports[`#overrideLocalDefault key with user value is included in the return value of getAll: getAll before override 1`] = ` +Object { + "dateFormat": Object { + "userValue": "foo", + "value": "Browser", + }, +} +`; + +exports[`#overrideLocalDefault key with user value returns default override when setting removed: get after override 1`] = `"bar"`; + +exports[`#overrideLocalDefault key with user value returns default override when setting removed: get before override 1`] = `"foo"`; + +exports[`#overrideLocalDefault key with user value returns default override when setting removed: getAll after override 1`] = ` +Object { + "dateFormat": Object { + "value": "bar", + }, +} +`; + +exports[`#overrideLocalDefault key with user value returns default override when setting removed: getAll before override 1`] = ` +Object { + "dateFormat": Object { + "userValue": "foo", + "value": "bar", + }, +} +`; + exports[`#subscribe calls handler with { key, newValue, oldValue } when config changes 1`] = ` Array [ Array [ diff --git a/src/ui/ui_settings/public/ui_settings_client.js b/src/ui/ui_settings/public/ui_settings_client.js index bf13db332570..90b1db114450 100644 --- a/src/ui/ui_settings/public/ui_settings_client.js +++ b/src/ui/ui_settings/public/ui_settings_client.js @@ -83,6 +83,30 @@ You can use \`config.get("${key}", defaultValue)\`, which will just return return this.isDeclared(key) && !('value' in this._cache[key]); } + overrideLocalDefault(key, newDefault) { + // capture the previous value + const prevDefault = this._defaults[key] + ? this._defaults[key].value + : undefined; + + // update defaults map + this._defaults[key] = { + ...this._defaults[key] || {}, + value: newDefault + }; + + // update cached default value + this._cache[key] = { + ...this._cache[key] || {}, + value: newDefault + }; + + // don't broadcast change if userValue was already overriding the default + if (this._cache[key].userValue == null) { + this._broadcastUpdate(key, newDefault, prevDefault); + } + } + subscribe(observer) { this._updateObservers.add(observer); @@ -139,6 +163,10 @@ You can use \`config.get("${key}", defaultValue)\`, which will just return } } + this._broadcastUpdate(key, newValue, oldValue); + } + + _broadcastUpdate(key, newValue, oldValue) { this._notify.log(`config change: ${key}: ${oldValue} -> ${newValue}`); for (const observer of this._updateObservers) { diff --git a/src/ui/ui_settings/public/ui_settings_client.test.js b/src/ui/ui_settings/public/ui_settings_client.test.js index cb93e0d92fbe..b557d5a2c66c 100644 --- a/src/ui/ui_settings/public/ui_settings_client.test.js +++ b/src/ui/ui_settings/public/ui_settings_client.test.js @@ -201,3 +201,77 @@ describe('#subscribe', () => { expect(handler).not.toHaveBeenCalled(); }); }); + +describe('#overrideLocalDefault', () => { + describe('key has no user value', () => { + it('synchonously modifies the default value returned by get()', () => { + const { config } = setup(); + + expect(config.get('dateFormat')).toMatchSnapshot('get before override'); + config.overrideLocalDefault('dateFormat', 'bar'); + expect(config.get('dateFormat')).toMatchSnapshot('get after override'); + }); + + it('synchonously modifies the value returned by getAll()', () => { + const { config } = setup(); + + expect(config.getAll()).toMatchSnapshot('getAll before override'); + config.overrideLocalDefault('dateFormat', 'bar'); + expect(config.getAll()).toMatchSnapshot('getAll after override'); + }); + + it('calls subscriber with new and previous value', () => { + const handler = jest.fn(); + const { config } = setup(); + + config.subscribe(handler); + config.overrideLocalDefault('dateFormat', 'bar'); + expect(handler.mock.calls).toMatchSnapshot('single subscriber call'); + }); + }); + + describe('key with user value', () => { + it('does not modify the return value of get', () => { + const { config } = setup(); + + config.set('dateFormat', 'foo'); + expect(config.get('dateFormat')).toMatchSnapshot('get before override'); + config.overrideLocalDefault('dateFormat', 'bar'); + expect(config.get('dateFormat')).toMatchSnapshot('get after override'); + }); + + it('is included in the return value of getAll', () => { + const { config } = setup(); + + config.set('dateFormat', 'foo'); + expect(config.getAll()).toMatchSnapshot('getAll before override'); + config.overrideLocalDefault('dateFormat', 'bar'); + expect(config.getAll()).toMatchSnapshot('getAll after override'); + }); + + it('does not call subscriber', () => { + const handler = jest.fn(); + const { config } = setup(); + + config.set('dateFormat', 'foo'); + config.subscribe(handler); + config.overrideLocalDefault('dateFormat', 'bar'); + expect(handler).not.toHaveBeenCalled(); + }); + + it('returns default override when setting removed', () => { + const { config } = setup(); + + config.set('dateFormat', 'foo'); + config.overrideLocalDefault('dateFormat', 'bar'); + + expect(config.get('dateFormat')).toMatchSnapshot('get before override'); + expect(config.getAll()).toMatchSnapshot('getAll before override'); + + config.remove('dateFormat'); + + expect(config.get('dateFormat')).toMatchSnapshot('get after override'); + expect(config.getAll()).toMatchSnapshot('getAll after override'); + }); + }); +});