backport of commit 6fa423e3f3e0bde47686fd4bfc6dd2b37031afa4 (#21046)
Co-authored-by: Angel Garbarino <Monkeychip@users.noreply.github.com>
This commit is contained in:
parent
d8c82657e4
commit
3a4286e713
|
@ -31,15 +31,21 @@ export default class LicenseBanners extends Component {
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super(...arguments);
|
super(...arguments);
|
||||||
// do not dismiss any banners if the user has updated their version
|
// reset and show a previously dismissed license banner if:
|
||||||
const dismissedBanner = localStorage.getItem(`dismiss-license-banner-${this.currentVersion}`); // returns either warning or expired
|
// the version has been updated or the license has been updated (indicated by a change in the expiry date).
|
||||||
this.updateDismissType(dismissedBanner);
|
const bannerType = localStorage.getItem(this.dismissedBannerKey); // returns either warning or expired
|
||||||
|
|
||||||
|
this.updateDismissType(bannerType);
|
||||||
}
|
}
|
||||||
|
|
||||||
get currentVersion() {
|
get currentVersion() {
|
||||||
return this.version.version;
|
return this.version.version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get dismissedBannerKey() {
|
||||||
|
return `dismiss-license-banner-${this.currentVersion}-${this.args.expiry}`;
|
||||||
|
}
|
||||||
|
|
||||||
get licenseExpired() {
|
get licenseExpired() {
|
||||||
if (!this.args.expiry) return false;
|
if (!this.args.expiry) return false;
|
||||||
return isAfter(timestamp.now(), new Date(this.args.expiry));
|
return isAfter(timestamp.now(), new Date(this.args.expiry));
|
||||||
|
@ -54,9 +60,9 @@ export default class LicenseBanners extends Component {
|
||||||
@action
|
@action
|
||||||
dismissBanner(dismissAction) {
|
dismissBanner(dismissAction) {
|
||||||
// if a client's version changed their old localStorage key will still exists.
|
// if a client's version changed their old localStorage key will still exists.
|
||||||
localStorage.cleanUpStorage('dismiss-license-banner', `dismiss-license-banner-${this.currentVersion}`);
|
localStorage.cleanupStorage('dismiss-license-banner', this.dismissedBannerKey);
|
||||||
// updates localStorage and then updates the template by calling updateDismissType
|
// updates localStorage and then updates the template by calling updateDismissType
|
||||||
localStorage.setItem(`dismiss-license-banner-${this.currentVersion}`, dismissAction);
|
localStorage.setItem(this.dismissedBannerKey, dismissAction);
|
||||||
this.updateDismissType(dismissAction);
|
this.updateDismissType(dismissAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ export default {
|
||||||
return Object.keys(window.localStorage);
|
return Object.keys(window.localStorage);
|
||||||
},
|
},
|
||||||
|
|
||||||
cleanUpStorage(string, keyToKeep) {
|
cleanupStorage(string, keyToKeep) {
|
||||||
if (!string) return;
|
if (!string) return;
|
||||||
const relevantKeys = this.keys().filter((str) => str.startsWith(string));
|
const relevantKeys = this.keys().filter((str) => str.startsWith(string));
|
||||||
relevantKeys?.forEach((key) => {
|
relevantKeys?.forEach((key) => {
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
<Sidebar::Nav::Cluster />
|
<Sidebar::Nav::Cluster />
|
||||||
|
{{! Only show license banners for Enterprise }}
|
||||||
|
{{#if this.activeCluster.version.isEnterprise}}
|
||||||
<LicenseBanners
|
<LicenseBanners
|
||||||
@expiry={{this.activeCluster.licenseExpiry}}
|
@expiry={{this.activeCluster.licenseExpiry}}
|
||||||
@autoloaded={{eq this.activeCluster.licenseState "autoloaded"}}
|
@autoloaded={{eq this.activeCluster.licenseState "autoloaded"}}
|
||||||
/>
|
/>
|
||||||
|
{{/if}}
|
||||||
<div class="global-flash">
|
<div class="global-flash">
|
||||||
{{#each this.flashMessages.queue as |flash|}}
|
{{#each this.flashMessages.queue as |flash|}}
|
||||||
<FlashMessage data-test-flash-message={{true}} @flash={{flash}} as |customComponent flash close|>
|
<FlashMessage data-test-flash-message={{true}} @flash={{flash}} as |customComponent flash close|>
|
||||||
|
|
|
@ -25,6 +25,7 @@ module('Integration | Component | license-banners', function (hooks) {
|
||||||
this.yesterday = subDays(mockNow, 1);
|
this.yesterday = subDays(mockNow, 1);
|
||||||
this.nextMonth = addDays(mockNow, 30);
|
this.nextMonth = addDays(mockNow, 30);
|
||||||
this.outside30 = addDays(mockNow, 32);
|
this.outside30 = addDays(mockNow, 32);
|
||||||
|
this.tomorrow = addDays(mockNow, 1);
|
||||||
this.version = this.owner.lookup('service:version');
|
this.version = this.owner.lookup('service:version');
|
||||||
this.version.version = '1.13.1+ent';
|
this.version.version = '1.13.1+ent';
|
||||||
});
|
});
|
||||||
|
@ -64,58 +65,89 @@ module('Integration | Component | license-banners', function (hooks) {
|
||||||
test('it does not render the expired banner if it has been dismissed', async function (assert) {
|
test('it does not render the expired banner if it has been dismissed', async function (assert) {
|
||||||
assert.expect(3);
|
assert.expect(3);
|
||||||
this.set('expiry', formatRFC3339(this.yesterday));
|
this.set('expiry', formatRFC3339(this.yesterday));
|
||||||
|
const key = `dismiss-license-banner-${this.version.version}-${this.expiry}`;
|
||||||
await render(hbs`<LicenseBanners @expiry={{this.expiry}} />`);
|
await render(hbs`<LicenseBanners @expiry={{this.expiry}} />`);
|
||||||
await click('[data-test-dismiss-expired]');
|
await click('[data-test-dismiss-expired]');
|
||||||
assert.dom('[data-test-license-banner-expired]').doesNotExist('Expired license banner does not render');
|
assert.dom('[data-test-license-banner-expired]').doesNotExist('Expired license banner does not render');
|
||||||
|
|
||||||
await render(hbs`<LicenseBanners @expiry={{this.expiry}} />`);
|
await render(hbs`<LicenseBanners @expiry={{this.expiry}} />`);
|
||||||
const localStorageResult = JSON.parse(localStorage.getItem(`dismiss-license-banner-1.13.1+ent`));
|
const localStorageResult = JSON.parse(localStorage.getItem(key));
|
||||||
assert.strictEqual(localStorageResult, 'expired');
|
assert.strictEqual(localStorageResult, 'expired');
|
||||||
assert
|
assert
|
||||||
.dom('[data-test-license-banner-expired]')
|
.dom('[data-test-license-banner-expired]')
|
||||||
.doesNotExist('The expired banner still does not render after a re-render.');
|
.doesNotExist('The expired banner still does not render after a re-render.');
|
||||||
localStorage.removeItem(`dismiss-license-banner-1.13.1+ent`);
|
localStorage.removeItem(key);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('it does not render the warning banner if it has been dismissed', async function (assert) {
|
test('it does not render the warning banner if it has been dismissed', async function (assert) {
|
||||||
assert.expect(3);
|
assert.expect(3);
|
||||||
this.set('expiry', formatRFC3339(this.nextMonth));
|
this.set('expiry', formatRFC3339(this.nextMonth));
|
||||||
|
const key = `dismiss-license-banner-${this.version.version}-${this.expiry}`;
|
||||||
await render(hbs`<LicenseBanners @expiry={{this.expiry}} />`);
|
await render(hbs`<LicenseBanners @expiry={{this.expiry}} />`);
|
||||||
await click('[data-test-dismiss-warning]');
|
await click('[data-test-dismiss-warning]');
|
||||||
assert.dom('[data-test-license-banner-warning]').doesNotExist('Warning license banner does not render');
|
assert.dom('[data-test-license-banner-warning]').doesNotExist('Warning license banner does not render');
|
||||||
|
|
||||||
await render(hbs`<LicenseBanners @expiry={{this.expiry}} />`);
|
await render(hbs`<LicenseBanners @expiry={{this.expiry}} />`);
|
||||||
const localStorageResult = JSON.parse(localStorage.getItem(`dismiss-license-banner-1.13.1+ent`));
|
const localStorageResult = JSON.parse(localStorage.getItem(key));
|
||||||
assert.strictEqual(localStorageResult, 'warning');
|
assert.strictEqual(localStorageResult, 'warning');
|
||||||
assert
|
assert
|
||||||
.dom('[data-test-license-banner-warning]')
|
.dom('[data-test-license-banner-warning]')
|
||||||
.doesNotExist('The warning banner still does not render after a re-render.');
|
.doesNotExist('The warning banner still does not render after a re-render.');
|
||||||
localStorage.removeItem(`dismiss-license-banner-1.13.1+ent`);
|
localStorage.removeItem(key);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('it renders a banner if the vault license has changed', async function (assert) {
|
test('it renders a banner if the vault license has changed', async function (assert) {
|
||||||
assert.expect(3);
|
assert.expect(3);
|
||||||
this.version.version = '1.12.1+ent';
|
this.version.version = '1.12.1+ent';
|
||||||
this.set('expiry', formatRFC3339(this.nextMonth));
|
this.set('expiry', formatRFC3339(this.nextMonth));
|
||||||
|
const keyOldVersion = `dismiss-license-banner-${this.version.version}-${this.expiry}`;
|
||||||
await render(hbs`<LicenseBanners @expiry={{this.expiry}} />`);
|
await render(hbs`<LicenseBanners @expiry={{this.expiry}} />`);
|
||||||
await click('[data-test-dismiss-warning]');
|
await click('[data-test-dismiss-warning]');
|
||||||
this.version.version = '1.13.1+ent';
|
this.version.version = '1.13.1+ent';
|
||||||
|
const keyNewVersion = `dismiss-license-banner-${this.version.version}-${this.expiry}`;
|
||||||
await render(hbs`<LicenseBanners @expiry={{this.expiry}} />`);
|
await render(hbs`<LicenseBanners @expiry={{this.expiry}} />`);
|
||||||
assert
|
assert
|
||||||
.dom('[data-test-license-banner-warning]')
|
.dom('[data-test-license-banner-warning]')
|
||||||
.exists('The warning banner shows even though we have dismissed it earlier.');
|
.exists('The warning banner shows even though we have dismissed it earlier.');
|
||||||
|
|
||||||
await click('[data-test-dismiss-warning]');
|
await click('[data-test-dismiss-warning]');
|
||||||
const localStorageResultNewVersion = JSON.parse(
|
const localStorageResultNewVersion = JSON.parse(localStorage.getItem(keyNewVersion));
|
||||||
localStorage.getItem(`dismiss-license-banner-1.13.1+ent`)
|
const localStorageResultOldVersion = JSON.parse(localStorage.getItem(keyOldVersion));
|
||||||
);
|
|
||||||
const localStorageResultOldVersion = JSON.parse(
|
|
||||||
localStorage.getItem(`dismiss-license-banner-1.12.1+ent`)
|
|
||||||
);
|
|
||||||
// Check that localStorage was cleaned and no longer contains the old version storage key.
|
// Check that localStorage was cleaned and no longer contains the old version storage key.
|
||||||
assert.strictEqual(localStorageResultOldVersion, null);
|
assert.strictEqual(localStorageResultOldVersion, null, 'local storage was cleared for the old version');
|
||||||
assert.strictEqual(localStorageResultNewVersion, 'warning');
|
assert.strictEqual(
|
||||||
|
localStorageResultNewVersion,
|
||||||
|
'warning',
|
||||||
|
'local storage holds the new version with a warning'
|
||||||
|
);
|
||||||
// If debugging this test remember to clear localStorage if the test was not run to completion.
|
// If debugging this test remember to clear localStorage if the test was not run to completion.
|
||||||
localStorage.removeItem(`dismiss-license-banner-1.13.1+ent`);
|
localStorage.removeItem(keyNewVersion);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('it renders a banner if the vault expiry has changed', async function (assert) {
|
||||||
|
assert.expect(3);
|
||||||
|
this.set('expiry', formatRFC3339(this.tomorrow));
|
||||||
|
const keyOldExpiry = `dismiss-license-banner-${this.version.version}-${this.expiry}`;
|
||||||
|
await render(hbs`<LicenseBanners @expiry={{this.expiry}} />`);
|
||||||
|
await click('[data-test-dismiss-warning]');
|
||||||
|
this.set('expiry', formatRFC3339(this.nextMonth));
|
||||||
|
const keyNewExpiry = `dismiss-license-banner-${this.version.version}-${this.expiry}`;
|
||||||
|
await render(hbs`<LicenseBanners @expiry={{this.expiry}} />`);
|
||||||
|
assert
|
||||||
|
.dom('[data-test-license-banner-warning]')
|
||||||
|
.exists('The warning banner shows even though we have dismissed it earlier.');
|
||||||
|
|
||||||
|
await click('[data-test-dismiss-warning]');
|
||||||
|
const localStorageResultNewExpiry = JSON.parse(localStorage.getItem(keyNewExpiry));
|
||||||
|
const localStorageResultOldExpiry = JSON.parse(localStorage.getItem(keyOldExpiry));
|
||||||
|
// Check that localStorage was cleaned and no longer contains the old version storage key.
|
||||||
|
assert.strictEqual(localStorageResultOldExpiry, null, 'local storage was cleared for the old expiry');
|
||||||
|
assert.strictEqual(
|
||||||
|
localStorageResultNewExpiry,
|
||||||
|
'warning',
|
||||||
|
'local storage holds the new expiry with a warning'
|
||||||
|
);
|
||||||
|
// If debugging this test remember to clear localStorage if the test was not run to completion.
|
||||||
|
localStorage.removeItem(keyNewExpiry);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -17,7 +17,7 @@ module('Unit | lib | local-storage', function (hooks) {
|
||||||
test('it does not error if nothing is in local storage', async function (assert) {
|
test('it does not error if nothing is in local storage', async function (assert) {
|
||||||
assert.expect(1);
|
assert.expect(1);
|
||||||
assert.strictEqual(
|
assert.strictEqual(
|
||||||
LocalStorage.cleanUpStorage('something', 'something-key'),
|
LocalStorage.cleanupStorage('something', 'something-key'),
|
||||||
undefined,
|
undefined,
|
||||||
'returns undefined and does not throw an error when method is called and nothing exist in localStorage.'
|
'returns undefined and does not throw an error when method is called and nothing exist in localStorage.'
|
||||||
);
|
);
|
||||||
|
@ -29,7 +29,7 @@ module('Unit | lib | local-storage', function (hooks) {
|
||||||
LocalStorage.setItem('beep-boop-bop-key', 'beep-boop-bop-value');
|
LocalStorage.setItem('beep-boop-bop-key', 'beep-boop-bop-value');
|
||||||
LocalStorage.setItem('string-key', 'string-key-value');
|
LocalStorage.setItem('string-key', 'string-key-value');
|
||||||
const storageLengthBefore = window.localStorage.length;
|
const storageLengthBefore = window.localStorage.length;
|
||||||
LocalStorage.cleanUpStorage('string', 'string-key');
|
LocalStorage.cleanupStorage('string', 'string-key');
|
||||||
const storageLengthAfter = window.localStorage.length;
|
const storageLengthAfter = window.localStorage.length;
|
||||||
assert.strictEqual(
|
assert.strictEqual(
|
||||||
storageLengthBefore - storageLengthAfter,
|
storageLengthBefore - storageLengthAfter,
|
||||||
|
|
Loading…
Reference in New Issue