diff --git a/app/components/input-edit-password/component.js b/app/components/input-edit-password/component.js
index 6ee931910..3c69cc2d3 100644
--- a/app/components/input-edit-password/component.js
+++ b/app/components/input-edit-password/component.js
@@ -4,6 +4,7 @@ import { get, set, computed, observer } from '@ember/object';
import { inject as service } from '@ember/service';
import { later, run } from '@ember/runloop';
import { randomStr } from 'shared/utils/util';
+import { resolve, all } from 'rsvp';
const CHANGE = 'change';
const SET = 'set';
@@ -16,17 +17,19 @@ export default Component.extend({
access: service(),
layout,
- showCurrent: true,
- generate: false,
- setOrChange: CHANGE,
- editLabel: 'modalEditPassword.actionButton',
- currentPassword: null,
- user: null,
+ showCurrent: true,
+ generate: false,
+ setOrChange: CHANGE,
+ editLabel: 'modalEditPassword.actionButton',
+ currentPassword: null,
+ user: null,
+ showDeleteTokens: false,
- confirmBlurred: false,
- serverErrors: null,
- password: null,
- confirm: null,
+ confirmBlurred: false,
+ serverErrors: null,
+ password: null,
+ confirm: null,
+ deleteTokens: false,
didReceiveAttrs() {
if ( get(this, 'generate') ) {
@@ -69,16 +72,31 @@ export default Component.extend({
promise = user.doAction('setpassword', { newPassword: neu.trim(), });
}
- return promise.then(() => get(this, 'access').loadMe()
- .then(() => {
- get(this, 'complete')(true);
- later(this, () => {
- if ( this.isDestroyed || this.isDestroying ) {
- return;
- }
- cb(true);
- }, 1000);
- })).catch((err) => {
+ return promise.then(() => get(this, 'access').loadMe().then(() => {
+ if ( get(this, 'deleteTokens') ) {
+ return get(this, 'globalStore').findAll('token').then((tokens) => {
+ const promises = [];
+
+ tokens.forEach((token) => {
+ if ( !token.current ) {
+ promises.push(token.delete());
+ }
+ });
+
+ return all(promises);
+ });
+ } else {
+ return resolve();
+ }
+ }).then(() => {
+ get(this, 'complete')(true);
+ later(this, () => {
+ if ( this.isDestroyed || this.isDestroying ) {
+ return;
+ }
+ cb(true);
+ }, 1000);
+ })).catch((err) => {
set(this, 'serverErrors', [err.message]);
get(this, 'complete')(false);
cb(false);
diff --git a/app/components/input-edit-password/template.hbs b/app/components/input-edit-password/template.hbs
index f4871f1dd..fe6368d6b 100644
--- a/app/components/input-edit-password/template.hbs
+++ b/app/components/input-edit-password/template.hbs
@@ -7,6 +7,10 @@
style="display: none;"
/>
+ {{#if showDeleteTokens}}
+
+ {{/if}}
+
{{#if showCurrent}}
diff --git a/app/components/modal-edit-password/template.hbs b/app/components/modal-edit-password/template.hbs
index f7062693c..950a5380d 100644
--- a/app/components/modal-edit-password/template.hbs
+++ b/app/components/modal-edit-password/template.hbs
@@ -7,6 +7,7 @@
{{input-edit-password
complete=(action "complete")
showCurrent=true
+ showDeleteTokens=true
cancel=(action "cancel")
editButton='modalEditPassword.actionButton'
user=user
diff --git a/lib/shared/addon/components/cluster-driver/driver-rke/template.hbs b/lib/shared/addon/components/cluster-driver/driver-rke/template.hbs
index 70bbd2c87..6beb0b673 100644
--- a/lib/shared/addon/components/cluster-driver/driver-rke/template.hbs
+++ b/lib/shared/addon/components/cluster-driver/driver-rke/template.hbs
@@ -165,6 +165,7 @@
@value={{config.kubernetesVersion}}
@versions={{versionChoices}}
@clusterTemplateQuestions={{clusterTemplateQuestions}}
+ @showNotAllowed=true
/>
diff --git a/lib/shared/addon/components/form-versions/component.js b/lib/shared/addon/components/form-versions/component.js
index 2a1332746..68a9180f0 100644
--- a/lib/shared/addon/components/form-versions/component.js
+++ b/lib/shared/addon/components/form-versions/component.js
@@ -23,6 +23,7 @@ export default Component.extend({
disabled: false,
value: null,
mode: 'new',
+ showNotAllowed: false,
editing: equal('mode', 'edit'),
isView: equal('mode', 'view'),
@@ -135,11 +136,13 @@ export default Component.extend({
};
}
} else {
+ const suffix = ( this.showNotAllowed ? 'formVersions.notallowed' : 'formVersions.unsupported' );
+
if (gt(version, coerceVersion(maxVersion))) {
if (overrideMatch && !isEmpty(overrideMatch.satisfies)) {
out = {
disabled: true,
- label: `${ label } ${ this.intl.t('formVersions.unsupported') }`,
+ label: `${ label } ${ this.intl.t(suffix) }`,
value: v
};
} else {
@@ -152,7 +155,7 @@ export default Component.extend({
} else if (lt(version, coerceVersion(maxVersion))) {
out = {
disabled: true,
- label: `${ label } ${ this.intl.t('formVersions.unsupported') }`,
+ label: `${ label } ${ this.intl.t(suffix) }`,
value: v
};
}
diff --git a/package.json b/package.json
index 0b5d16806..b0968cd2c 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ui",
- "version": "2.3.2",
+ "version": "2.3.3",
"private": true,
"repository": "https://github.com/rancher/ui",
"license": "Apache-2.0",
diff --git a/translations/en-us.yaml b/translations/en-us.yaml
index 5a90d2a09..92c8c400f 100644
--- a/translations/en-us.yaml
+++ b/translations/en-us.yaml
@@ -5579,7 +5579,8 @@ formVersions:
experimental: "(experimental)"
dotx: "Latest {minor} (allows patch version upgrades)"
downgrade: "(can't downgrade)"
- unsupported: "(not allowed by template)"
+ notallowed: "(not allowed by template)"
+ unsupported: "(unsupported)"
formIstioHost:
prompt: Select a host...
@@ -6154,6 +6155,7 @@ modalEditPassword:
mode:
generate: 'Use a new randomly generated password:'
manual: 'Set a specific password to use:'
+ deleteTokens: Delete all existing API keys
modalFeedback:
header: Welcome to {appName}!