diff --git a/assets/styles/base/_basic.scss b/assets/styles/base/_basic.scss index 8310cf0d17..4b37dfa49f 100644 --- a/assets/styles/base/_basic.scss +++ b/assets/styles/base/_basic.scss @@ -75,9 +75,7 @@ BUTTON, .checkbox-custom, .radio-custom { &:focus, &.focused { - outline: none; - box-shadow: 0 0 0 var(--outline-width) var(--outline); - background: var(--input-focus-bg) } + @include form-focus } } A { diff --git a/assets/styles/base/_mixins.scss b/assets/styles/base/_mixins.scss index 7525b76364..93c0d3bfc0 100755 --- a/assets/styles/base/_mixins.scss +++ b/assets/styles/base/_mixins.scss @@ -155,4 +155,11 @@ } } } +} + +@mixin form-focus { + // Focus for form like elements (not to be confused with basic :focus style) + outline: none; + box-shadow: 0 0 0 var(--outline-width) var(--outline); + background: var(--input-focus-bg) } \ No newline at end of file diff --git a/assets/styles/global/_cards.scss b/assets/styles/global/_cards.scss index c76850fe9d..238173528e 100644 --- a/assets/styles/global/_cards.scss +++ b/assets/styles/global/_cards.scss @@ -4,6 +4,7 @@ width: 100%; .link-container { + position: relative; background-color: var(--input-bg); border-radius: var(--border-radius); border: solid 1px var(--input-border); @@ -25,6 +26,20 @@ > * { opacity: .3; } + + .disabled-msg{ + position:absolute; + color: var(--error); + z-index: z-index('hoverOverContent'); + opacity: 1; + top: 0px; + bottom: 0px; + left: 0px; + right: 0px; + display: flex; + justify-content: center; + align-items: flex-end; + } } &:hover:not(.disabled) { diff --git a/assets/translations/en-us.yaml b/assets/translations/en-us.yaml index cc0d77c079..6e3e3a9410 100644 --- a/assets/translations/en-us.yaml +++ b/assets/translations/en-us.yaml @@ -138,49 +138,146 @@ account: authConfig: accessMode: - label: Configure who should be able to login and use {vendor} - unrestricted: "Allow any valid user" - restricted: "Allow members of clusters and projects, plus authorized users & groups" - required: "Restrict access to only the auhorized users & groups" + label: 'Configure who should be able to login and use {vendor}' + required: Restrict access to only the auhorized users & groups + restricted: 'Allow members of clusters and projects, plus authorized users & groups' + unrestricted: Allow any valid user allowedPrincipalIds: title: Authorized Users & Groups - associatedWarning: "Note: The {provider} user you authenticate as will be associated as an alternate way to login to the {vendor} user you are currently logged in as ({username})." - stateBanner: - enabled: "{provider} is currently enabled." - disabled: "{provider} is currently disabled." + associatedWarning: 'Note: The {provider} user you authenticate as will be associated as an alternate way to login to the {vendor} user you are currently logged in as ({username}).' github: - target: - label: Which version of GitHub do you want to use? - public: Public GitHub.com - private: A private installation of GitHub Enterprise - host: - label: GitHub Enterprise Host - placeholder: e.g. github.mycompany.example clientId: label: Client ID clientSecret: label: Client Secret form: + app: + label: Application name + value: 'Anything you like, e.g. My {vendor}' + calllback: + label: Authorization callback URL + description: + label: Description + value: 'Optional, can be left blank' + homepage: + label: Homepage URL + instruction: 'Fill in the form with these values:' prefix: |-
  • Click here to go to GitHub application settings in a new window.
  • Click on the "OAuth Apps" tab.
  • Click the "New OAuth App" button.
  • - instruction: "Fill in the form with these values:" - app: - label: Application name - value: Anything you like, e.g. My {vendor} - homepage: - label: Homepage URL - description: - label: Description - value: Optional, can be left blank - calllback: - label: Authorization callback URL suffix: |-
  • Click "Register application"
  • Copy and paste the Client ID and Client Secret of your newly created OAuth app into the fields below
  • - - + host: + label: GitHub Enterprise Host + placeholder: e.g. github.mycompany.example + target: + label: Which version of GitHub do you want to use? + private: A private installation of GitHub Enterprise + public: Public GitHub.com + googleoauth: + adminEmail: Admin Email + domain: Domain + oauthCredentials: + label: OAuth Credentials + tip: The OAuth Credentials JSON can be found in the Google API developers console. + serviceAccountCredentials: + label: Service Account Credentials + tip: The Service Account Credentials JSON can be found in the service accounts section of the Google API developers console. + steps: + 1: + title: 'Step One: For standard Google, click here to go applications settings in a new window' + body: |- + + 2: + title: 'Step Two: Navigate to the "Credentials" tab to create your OAuth client ID' + body: |- + + 3: + title: 'Step Three: Create Service Account credentials' + body: |- + Follow this guide to:
    + + ldap: + freeipa: Configure a FreeIPA server + activedirectory: Configure an Active Directory account + openldap: Configure an OpenLDAP server + defaultLoginDomain: Default Login Domain + cert: Certificate + disabledStatusBitmask: Disabled Status Bitmask + groupDNAttribute: Group DN Attribute + groupMemberMappingAttribute: Group Member Mapping Attribute + groupMemberUserAttribute: Group Member User Attribute + groupSearchBase: + label: Group Search Base + placeholder: 'ou=groups,dc=mycompany,dc=com' + hostname: Hostname/IP + loginAttribute: Login Attribute + nameAttribute: Name Attribute + nestedGroupMembership: + label: Nested Group Membership + options: + direct: Search only direct group memberships + nested: Search direct and nested group memberships + objectClass: Object Class + password: Password + port: Port + customizeSchema: Customize Schema + users: Users + groups: Groups + searchAttribute: Search Attribute + searchFilter: Search Filter + serverConnectionTimeout: Server Connection Timeout + serviceAccountDN: Service Account Distinguished Name + serviceAccountPassword: Service Account Password + serviceAccountInfo: Rancher needs a service account that has read-only access to all of the domains that will be able to login, so that we can determine what groups a user is a member of when they make a request with an API key. + starttls: + label: Start TLS + tip: Upgrades non-encrypted connections by wrapping with TLS during the connection process. Can not be used in conjunction with TLS. + tls: TLS + userEnabledAttribute: User Enabled Attribute + userMemberAttribute: User Member Attribute + userSearchBase: + label: User Search Base + placeholder: 'e.g. ou=users,dc=mycompany,dc=com' + username: Username + usernameAttribute: Username Attribute + saml: + UID: UID Field + adfs: Configure an AD FS account + api: Rancher API Host + cert: Certificate + displayName: Display Name Field + groups: Groups Field + key: Private Key + keycloak: Configure a Keycloak account + metadata: Metadata XML + okta: Configure an Okta account + ping: Configure a Ping account + shibboleth: Congiure a Shibboleth account + showLdap: Configure an OpenLDAP Server + userName: User Name Field + stateBanner: + disabled: '{provider} is currently disabled.' + enabled: '{provider} is currently enabled.' + testAndEnable: Test and Enable Authentication @@ -263,48 +360,45 @@ asyncButton: backupRestoreOperator: backupFilename: Backup Filename - deployment: - rancherNamespace: Rancher ResourceSet Namespace - storage: - tip: Configure a storage location where all backups are saved by default. You will have the option to override this with each backup, but will be limited to using an S3-compatible object store. - storageClass: - label: Storage Class - persistentVolume: - label: Persistent Volume - label: Default Storage Location - options: - none: No default storage location - s3: Use an S3-compatible object store - defaultStorageClass: 'Use the default storage class ({name})' - pickSC: Use an existing storage class - pickPV: Use an existing persistent volume - warning: This {type} does not have its reclaim policy set to "Retain". Your backups may be lost if the volume is changed or becomes unbound. - size: Size - prune: - label: Prune - tip: Delete the resources managed by Rancher that are not present in the backup. (Recommended) - encryption: Encryption - encryptionConfigName: - label: Encryption Config Secret - backuptip: Any secret in the cattle-resource-system namespace that has an encryption-provider-config.yaml key.
    The contents of this file are necessary to perform a restore from this backup, and are not stored by Rancher Backup. - restoretip: If the backup was performed with encryption enabled, a secret containing the same encryption-provider-config should be used during restore. - options: - none: Store the contents of the backup unencrypted - secret: Encrypt backups using an Encryption Config Secret (Recommended) - warning: The contents of this file are necessary to perform a restore from this backup, and are not stored by Rancher Backup. deleteTimeout: label: Delete Timeout tip: Seconds to wait for a resource delete to succeed before removing finalizers to force deletion. - resourceSetName: Resource Set - schedule: - label: Schedule - placeholder: e.g. @midnight or 0 0 * * * + deployment: + rancherNamespace: Rancher ResourceSet Namespace + size: Size + storage: + label: Default Storage Location + options: + defaultStorageClass: 'Use the default storage class ({name})' + none: No default storage location + pickPV: Use an existing persistent volume + pickSC: Use an existing storage class + s3: Use an S3-compatible object store + persistentVolume: + label: Persistent Volume + storageClass: + label: Storage Class + tip: 'Configure a storage location where all backups are saved by default. You will have the option to override this with each backup, but will be limited to using an S3-compatible object store.' + warning: 'This {type} does not have its reclaim policy set to "Retain". Your backups may be lost if the volume is changed or becomes unbound.' + encryption: Encryption + encryptionConfigName: + backuptip: 'Any secret in the cattle-resource-system namespace that has an encryption-provider-config.yaml key.
    The contents of this file are necessary to perform a restore from this backup, and are not stored by Rancher Backup.' + label: Encryption Config Secret options: - disabled: One-Time Backup - enabled: Recurring Backups + none: Store the contents of the backup unencrypted + secret: 'Encrypt backups using an Encryption Config Secret (Recommended)' + restoretip: 'If the backup was performed with encryption enabled, a secret containing the same encryption-provider-config should be used during restore.' + warning: 'The contents of this file are necessary to perform a restore from this backup, and are not stored by Rancher Backup.' + lastBackup: Last Backup + nextBackup: Next Backup + noResourceSet: You must define a ResourceSet in this namespace to create a backup CR. + prune: + label: Prune + tip: Delete the resources managed by Rancher that are not present in the backup. (Recommended) + resourceSetName: Resource Set restoreFrom: - existing: An existing backup config default: The default storage target + existing: An existing backup config s3: An S3-compatible object store retentionCount: label: Retention Count @@ -314,24 +408,30 @@ backupRestoreOperator: other { Files } } s3: + bucketName: Bucket Name + credentialSecretName: Credential Secret + endpoint: Endpoint + endpointCA: Endpoint CA + folder: Folder + insecureTLSSkipVerify: Skip TLS Verifications + region: Region + storageLocation: Storage Location titles: backupLocation: Backup Source location: Storage Location s3: S3 - credentialSecretName: Credential Secret - storageLocation: Storage Location - endpoint: Endpoint - endpointCA: Endpoint CA - bucketName: Bucket Name - region: Region - folder: Folder - insecureTLSSkipVerify: Skip TLS Verifications + schedule: + label: Schedule + options: + disabled: One-Time Backup + enabled: Recurring Backups + placeholder: e.g. @midnight or 0 0 * * * storageSource: - useDefault: Use the default storage location configured during installation configureS3: Use an S3-compatible object store useBackup: Use the s3 location specified on the Backup CR + useDefault: Use the default storage location configured during installation targetBackup: Target Backup - noResourceSet: 'You must define a ResourceSet in this namespace to create a backup CR.' + catalog: @@ -807,6 +907,7 @@ istio: jaeger: label: Jaeger description: Monitor and Troubleshoot microservices-based distributed systems. + disabled: '{app} is not installed' cni: Enabled CNI customOverlayFile: label: Custom Overlay File @@ -843,7 +944,7 @@ logging: noOutputsBanner: There are no cluster outputs in the selected namespace. flow: clusterOutputs: - doesntExistTooltip: This cluster output doesn't exist + doesntExistTooltip: This cluster output doesn't exist label: Cluster Outputs matches: label: Matches @@ -1089,7 +1190,7 @@ monitoring: className: Storage Class Name existingClaim: Use Existing Claim finalizers: PVC Finalizers - label: Persistent Storage for Grafana + label: Grafana Storage mode: Access Mode selector: Selector size: Size @@ -1250,6 +1351,8 @@ namespace: project: label: Project resources: Resources + enableAutoInjection: Enable Istio Auto Injection + disableAutoInjection: Disable Istio Auto Injection namespaceFilter: selected: @@ -1340,6 +1443,35 @@ prefs: hideDesc: label: Hide All Type Description Boxes +accountAndKeys: + title: Account and API Keys + account: + title: Account + name: Name + username: Username + change: Change Password + keys: + title: API Keys + +changePassword: + title: Change Password + cancel: Cancel + keys: Delete all existing API keys + generatePassword: Generate a random password + newGeneratedPassword: Suggest a password + currentPassword: Current Password + userGen: + newPassword: New Password + confirmPassword: Confirm Password + randomGen: + copy: Copy to Clipboard + generated: Generated Password + errors: + missmatchedPassword: Passwords do not match + failedToChange: Failed to change password + failedDeleteKey: Failed to delete key + failedDeleteKeys: Failed to delete keys + principal: loading: Loading… error: Unable to fetch principal info @@ -1639,8 +1771,15 @@ servicesPage: ports: label: Ports selectors: - helpText: "If no selector is created, manual endpoints must be made." + helpText: "" label: Selectors + matchingPods: + matchesSome: |- + {matched, plural, + =0 {Matches 0 of {total, number} pods. If no selector is created, manual endpoints must be made.} + =1 {Matches 1 of {total, number} pods: "{sample}"} + other {Matches {matched, number} of {total, number} existing pods, including "{sample}"} + } serviceTypes: clusterIp: abbrv: IP @@ -2592,6 +2731,9 @@ action: view: View Config viewInApi: View in API viewYaml: View YAML + show: Show + hide: Hide + copy: Copy unit: sec: secs diff --git a/chart/rancher-backup/index.vue b/chart/rancher-backup/index.vue index 8a023fd807..219e3e85be 100644 --- a/chart/rancher-backup/index.vue +++ b/chart/rancher-backup/index.vue @@ -98,7 +98,6 @@ export default { watch: { storageSource(neu) { - this.reclaimWarning = false; switch (neu) { case 'pickSC': this.value.persistence.enabled = true; @@ -107,12 +106,16 @@ export default { this.value.persistence.storageClass = this.defaultStorageClass?.id; this.storageClass = this.defaultStorageClass; } + if (this.storageClass?.reclaimPolicy === 'Delete') { + this.reclaimWarning = true; + } delete this.value.persistence.volumeName; break; case 'pickPV': this.value.persistence.enabled = true; this.value.s3.enabled = false; this.value.persistence.storageClass = '-'; + this.reclaimWarning = false; break; case 's3': this.value.persistence.enabled = false; diff --git a/components/PromptChangePassword.vue b/components/PromptChangePassword.vue new file mode 100644 index 0000000000..2006a249d3 --- /dev/null +++ b/components/PromptChangePassword.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/components/Questions/index.vue b/components/Questions/index.vue index 135b34149a..545745942f 100644 --- a/components/Questions/index.vue +++ b/components/Questions/index.vue @@ -192,7 +192,7 @@ export default { groups() { const map = {}; const defaultGroup = 'Questions'; - let weight = 1; + let weight = this.shownQuestions.length; for ( const q of this.shownQuestions ) { if ( q.group ) { @@ -202,7 +202,7 @@ export default { map[normalized] = { name: q.group || defaultGroup, questions: [], - weight: weight++, + weight: weight--, }; } diff --git a/components/SortableTable/selectionStore.js b/components/SortableTable/selectionStore.js index 49c39ebe6f..8502311ad3 100644 --- a/components/SortableTable/selectionStore.js +++ b/components/SortableTable/selectionStore.js @@ -82,7 +82,7 @@ export const getters = { bulkAction.enabled = state.tableSelected.length > 0 && actionEnabledForSomeSelected; }); - return out; + return out.sort((a, b) => (b.weight || 0) - (a.weight || 0)); }, options(state = stateSchema) { diff --git a/components/form/ChangePassword.vue b/components/form/ChangePassword.vue new file mode 100644 index 0000000000..919f2e5f67 --- /dev/null +++ b/components/form/ChangePassword.vue @@ -0,0 +1,266 @@ + + + + + diff --git a/components/form/LabeledInput.vue b/components/form/LabeledInput.vue index 2a8935ba73..51fbca496e 100644 --- a/components/form/LabeledInput.vue +++ b/components/form/LabeledInput.vue @@ -80,6 +80,7 @@ export default { }, onBlur() { + this.$emit('blur'); this.onBlurLabeled(); }, diff --git a/components/form/Password.vue b/components/form/Password.vue new file mode 100644 index 0000000000..8eb5af6387 --- /dev/null +++ b/components/form/Password.vue @@ -0,0 +1,117 @@ + + + + + diff --git a/components/form/RadioGroup.vue b/components/form/RadioGroup.vue index b1e3ff462f..9856af3aaf 100644 --- a/components/form/RadioGroup.vue +++ b/components/form/RadioGroup.vue @@ -170,7 +170,7 @@ export default { position: relative; } - .row { + &.row { display: flex; .radio-container { margin-right: 10px; diff --git a/components/formatter/LiveDate.vue b/components/formatter/LiveDate.vue index 2a98381e92..8bc98bada1 100644 --- a/components/formatter/LiveDate.vue +++ b/components/formatter/LiveDate.vue @@ -20,7 +20,7 @@ export default { addPrefix: { type: Boolean, - default: true + default: false }, suffix: { diff --git a/components/nav/Header.vue b/components/nav/Header.vue index 05c6499d8d..913898d3f3 100644 --- a/components/nav/Header.vue +++ b/components/nav/Header.vue @@ -81,22 +81,22 @@ export default { -
    +
    -
    +
    -