@rancher/shell 3.0.4 → 3.0.5-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. package/assets/images/providers/sks.svg +1 -0
  2. package/assets/styles/base/_basic.scss +6 -0
  3. package/assets/styles/base/_helpers.scss +4 -0
  4. package/assets/styles/base/_variables.scss +1 -0
  5. package/assets/styles/global/_button.scss +1 -0
  6. package/assets/translations/en-us.yaml +65 -15
  7. package/assets/translations/zh-hans.yaml +4 -3
  8. package/chart/monitoring/index.vue +3 -1
  9. package/cloud-credential/aws.vue +2 -0
  10. package/components/ActionDropdownShell.vue +71 -0
  11. package/components/AppModal.vue +18 -4
  12. package/components/AsyncButton.vue +24 -7
  13. package/components/BannerGraphic.vue +1 -0
  14. package/components/CommunityLinks.vue +4 -59
  15. package/components/CopyToClipboardText.vue +2 -1
  16. package/components/CruResource.vue +6 -1
  17. package/components/DetailText.vue +5 -0
  18. package/components/ExplorerMembers.vue +1 -1
  19. package/components/ExplorerProjectsNamespaces.vue +68 -18
  20. package/components/GlobalRoleBindings.vue +5 -1
  21. package/components/GrowlManager.vue +1 -0
  22. package/components/LandingPagePreference.vue +7 -3
  23. package/components/LocaleSelector.vue +39 -95
  24. package/components/ModalManager.vue +55 -0
  25. package/components/ModalWithCard.vue +1 -0
  26. package/components/PromptModal.vue +47 -8
  27. package/components/PromptRemove.vue +1 -0
  28. package/components/PromptRestore.vue +1 -0
  29. package/components/ResourceCancelModal.vue +1 -0
  30. package/components/ResourceDetail/Masthead.vue +38 -12
  31. package/components/ResourceDetail/__tests__/Masthead.test.ts +5 -1
  32. package/components/ResourceDetail/index.vue +47 -12
  33. package/components/ResourceTable.vue +54 -19
  34. package/components/SideNav.vue +5 -1
  35. package/components/SlideInPanelManager.vue +126 -0
  36. package/components/SortableTable/THead.vue +5 -2
  37. package/components/SortableTable/actions.js +1 -1
  38. package/components/SortableTable/index.vue +64 -51
  39. package/components/SortableTable/paging.js +16 -19
  40. package/components/SortableTable/selection.js +0 -11
  41. package/components/Wizard.vue +2 -2
  42. package/components/__tests__/AsyncButton.test.ts +2 -2
  43. package/components/__tests__/ModalManager.spec.ts +176 -0
  44. package/components/__tests__/PromptModal.test.ts +148 -0
  45. package/components/__tests__/SlideInPanelManager.spec.ts +166 -0
  46. package/components/auth/AuthBanner.vue +13 -11
  47. package/components/auth/Principal.vue +1 -0
  48. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  49. package/components/auth/login/ldap.vue +1 -1
  50. package/components/fleet/FleetResources.vue +21 -6
  51. package/components/form/ArrayList.vue +76 -60
  52. package/components/form/BannerSettings.vue +17 -2
  53. package/components/form/ColorInput.vue +35 -6
  54. package/components/form/Command.vue +6 -15
  55. package/components/form/EnvVars.vue +16 -8
  56. package/components/form/HealthCheck.vue +3 -3
  57. package/components/form/HookOption.vue +11 -16
  58. package/components/form/LabeledSelect.vue +18 -22
  59. package/components/form/LifecycleHooks.vue +3 -3
  60. package/components/form/MatchExpressions.vue +14 -8
  61. package/components/form/NameNsDescription.vue +128 -104
  62. package/components/form/Networking.vue +20 -12
  63. package/components/form/NodeAffinity.vue +31 -23
  64. package/components/form/NodeScheduling.vue +13 -3
  65. package/components/form/NotificationSettings.vue +15 -1
  66. package/components/form/Password.vue +1 -0
  67. package/components/form/PodAffinity.vue +43 -43
  68. package/components/form/Probe.vue +68 -66
  69. package/components/form/ResourceQuota/Project.vue +5 -1
  70. package/components/form/ResourceSelector.vue +7 -9
  71. package/components/form/SSHKnownHosts/__tests__/KnownHostsEditDialog.test.ts +16 -24
  72. package/components/form/SSHKnownHosts/index.vue +30 -13
  73. package/components/form/Security.vue +54 -56
  74. package/components/form/Select.vue +32 -21
  75. package/components/form/ShellInput.vue +5 -1
  76. package/components/form/Tolerations.vue +5 -1
  77. package/components/form/ValueFromResource.vue +134 -121
  78. package/components/form/WorkloadPorts.vue +18 -18
  79. package/components/form/__tests__/ArrayList.test.ts +5 -2
  80. package/components/form/__tests__/ColorInput.test.ts +35 -0
  81. package/components/form/__tests__/LabeledSelect.test.ts +40 -0
  82. package/components/form/__tests__/MatchExpressions.test.ts +12 -12
  83. package/components/form/__tests__/NameNsDescription.test.ts +115 -14
  84. package/components/form/__tests__/Probe.test.ts +12 -8
  85. package/components/form/__tests__/SSHKnownHosts.test.ts +22 -2
  86. package/components/form/__tests__/Select.test.ts +37 -0
  87. package/components/formatter/InternalExternalIP.vue +2 -0
  88. package/components/formatter/SecretData.vue +20 -7
  89. package/components/nav/Group.vue +27 -5
  90. package/components/nav/Header.vue +17 -43
  91. package/components/nav/NamespaceFilter.vue +134 -86
  92. package/components/nav/TopLevelMenu.vue +4 -5
  93. package/components/nav/Type.vue +12 -1
  94. package/components/nav/WindowManager/ContainerLogs.vue +87 -61
  95. package/components/nav/WindowManager/ContainerLogsActions.vue +76 -0
  96. package/components/templates/blank.vue +4 -1
  97. package/components/templates/default.vue +8 -3
  98. package/components/templates/home.vue +10 -1
  99. package/components/templates/plain.vue +10 -4
  100. package/composables/focusTrap.ts +12 -4
  101. package/composables/useRuntimeFlag.ts +29 -0
  102. package/config/router/routes.js +20 -13
  103. package/config/store.js +4 -0
  104. package/config/uiplugins.js +5 -1
  105. package/core/types.ts +12 -6
  106. package/detail/catalog.cattle.io.app.vue +6 -1
  107. package/detail/fleet.cattle.io.bundle.vue +70 -6
  108. package/detail/fleet.cattle.io.gitrepo.vue +1 -1
  109. package/detail/namespace.vue +0 -3
  110. package/detail/node.vue +17 -13
  111. package/detail/provisioning.cattle.io.cluster.vue +72 -6
  112. package/dialog/AddCustomBadgeDialog.vue +1 -1
  113. package/{pages/c/_cluster/uiplugins/AddExtensionRepos.vue → dialog/AddExtensionReposDialog.vue} +72 -42
  114. package/{components/AssignTo.vue → dialog/AssignToDialog.vue} +71 -80
  115. package/dialog/ChangePasswordDialog.vue +106 -0
  116. package/dialog/DeactivateDriverDialog.vue +1 -0
  117. package/{pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue → dialog/DeveloperLoadExtensionDialog.vue} +74 -71
  118. package/dialog/DisableAuthProviderDialog.vue +101 -0
  119. package/dialog/DrainNode.vue +1 -1
  120. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue → dialog/ExtensionCatalogInstallDialog.vue} +100 -88
  121. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue → dialog/ExtensionCatalogUninstallDialog.vue} +69 -57
  122. package/dialog/FeatureFlagListDialog.vue +288 -0
  123. package/dialog/ForceMachineRemoveDialog.vue +5 -2
  124. package/{components/Import.vue → dialog/ImportDialog.vue} +0 -5
  125. package/{pages/c/_cluster/uiplugins/InstallDialog.vue → dialog/InstallExtensionDialog.vue} +124 -106
  126. package/{components/form/SSHKnownHosts → dialog}/KnownHostsEditDialog.vue +52 -59
  127. package/dialog/MoveNamespaceDialog.vue +157 -0
  128. package/dialog/ScalePoolDownDialog.vue +1 -1
  129. package/{components/nav/Jump.vue → dialog/SearchDialog.vue} +34 -14
  130. package/{pages/c/_cluster/uiplugins/UninstallDialog.vue → dialog/UninstallExtensionDialog.vue} +67 -58
  131. package/dialog/WechatDialog.vue +57 -0
  132. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +16 -3
  133. package/edit/auth/__tests__/oidc.test.ts +152 -109
  134. package/edit/auth/azuread.vue +2 -1
  135. package/edit/auth/github.vue +1 -1
  136. package/edit/auth/googleoauth.vue +5 -1
  137. package/edit/auth/ldap/index.vue +1 -1
  138. package/edit/auth/oidc.vue +38 -5
  139. package/edit/auth/saml.vue +1 -1
  140. package/edit/cloudcredential.vue +24 -9
  141. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +40 -9
  142. package/edit/management.cattle.io.user.vue +28 -3
  143. package/edit/namespace.vue +1 -4
  144. package/edit/networking.k8s.io.ingress/IngressClass.vue +7 -3
  145. package/edit/networking.k8s.io.ingress/__tests__/IngressClass.test.ts +58 -0
  146. package/edit/persistentvolume/__tests__/persistentvolume.test.ts +14 -2
  147. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +4 -1
  148. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +26 -9
  149. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +8 -8
  150. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +26 -12
  151. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +66 -0
  152. package/edit/provisioning.cattle.io.cluster/__tests__/utils/rke2-test-data.ts +58 -0
  153. package/edit/provisioning.cattle.io.cluster/rke2.vue +49 -41
  154. package/edit/provisioning.cattle.io.cluster/tabs/AgentConfiguration.vue +6 -1
  155. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +5 -3
  156. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +33 -2
  157. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +2 -2
  158. package/edit/token.vue +2 -0
  159. package/edit/workload/index.vue +1 -0
  160. package/edit/workload/mixins/workload.js +0 -2
  161. package/initialize/install-plugins.js +2 -1
  162. package/list/harvesterhci.io.management.cluster.vue +4 -1
  163. package/list/management.cattle.io.feature.vue +4 -287
  164. package/list/provisioning.cattle.io.cluster.vue +20 -12
  165. package/machine-config/azure.vue +16 -4
  166. package/mixins/vue-select-overrides.js +0 -4
  167. package/models/__tests__/namespace.test.ts +25 -1
  168. package/models/cloudcredential.js +5 -0
  169. package/models/fleet.cattle.io.cluster.js +8 -2
  170. package/models/fleet.cattle.io.gitrepo.js +8 -34
  171. package/models/kontainerdriver.js +6 -3
  172. package/models/management.cattle.io.feature.js +7 -1
  173. package/models/management.cattle.io.node.js +3 -3
  174. package/models/namespace.js +11 -6
  175. package/models/nodedriver.js +6 -3
  176. package/models/workload.js +4 -1
  177. package/package.json +3 -3
  178. package/pages/about.vue +13 -3
  179. package/pages/account/index.vue +16 -6
  180. package/pages/auth/login.vue +18 -7
  181. package/pages/auth/logout.vue +4 -1
  182. package/pages/auth/setup.vue +2 -0
  183. package/pages/auth/verify.vue +13 -8
  184. package/pages/c/_cluster/apps/charts/chart.vue +1 -1
  185. package/pages/c/_cluster/apps/charts/install.vue +26 -26
  186. package/pages/c/_cluster/auth/config/index.vue +10 -12
  187. package/pages/c/_cluster/explorer/EventsTable.vue +38 -33
  188. package/pages/c/_cluster/explorer/index.vue +17 -15
  189. package/pages/c/_cluster/istio/index.vue +2 -2
  190. package/pages/c/_cluster/longhorn/index.vue +1 -1
  191. package/pages/c/_cluster/monitoring/index.vue +1 -1
  192. package/pages/c/_cluster/monitoring/monitor/_namespace/_id.vue +4 -2
  193. package/pages/c/_cluster/monitoring/monitor/create.vue +4 -2
  194. package/pages/c/_cluster/monitoring/route-receiver/_id.vue +4 -2
  195. package/pages/c/_cluster/monitoring/route-receiver/create.vue +5 -2
  196. package/pages/c/_cluster/neuvector/index.vue +1 -1
  197. package/pages/c/_cluster/settings/banners.vue +4 -3
  198. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +8 -10
  199. package/pages/c/_cluster/uiplugins/__tests__/AddExtensionRepos.test.ts +4 -7
  200. package/pages/c/_cluster/uiplugins/index.vue +98 -55
  201. package/pages/diagnostic.vue +59 -11
  202. package/pages/fail-whale.vue +14 -8
  203. package/pages/home.vue +24 -18
  204. package/pages/prefs.vue +7 -6
  205. package/pages/support/index.vue +4 -1
  206. package/plugins/internal-api/index.ts +37 -0
  207. package/plugins/internal-api/shared/base-api.ts +13 -0
  208. package/plugins/internal-api/shell/shell.api.ts +108 -0
  209. package/plugins/steve/actions.js +0 -12
  210. package/public/index.html +1 -0
  211. package/rancher-components/Card/Card.vue +1 -1
  212. package/rancher-components/Form/Checkbox/Checkbox.test.ts +59 -1
  213. package/rancher-components/Form/Checkbox/Checkbox.vue +27 -3
  214. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +47 -0
  215. package/rancher-components/Form/LabeledInput/LabeledInput.vue +20 -2
  216. package/rancher-components/Form/Radio/RadioButton.test.ts +36 -1
  217. package/rancher-components/Form/Radio/RadioButton.vue +20 -4
  218. package/rancher-components/Form/Radio/RadioGroup.test.ts +60 -0
  219. package/rancher-components/Form/Radio/RadioGroup.vue +52 -10
  220. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.test.ts +17 -0
  221. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +5 -0
  222. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +10 -1
  223. package/rancher-components/RcButton/RcButton.vue +2 -1
  224. package/rancher-components/RcButton/types.ts +1 -0
  225. package/rancher-components/RcDropdown/RcDropdown.vue +18 -6
  226. package/rancher-components/RcDropdown/RcDropdownItem.vue +3 -56
  227. package/rancher-components/RcDropdown/RcDropdownItemCheckbox.vue +68 -0
  228. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +92 -0
  229. package/rancher-components/RcDropdown/RcDropdownTrigger.vue +10 -0
  230. package/rancher-components/RcDropdown/index.ts +2 -0
  231. package/rancher-components/RcDropdown/useDropdownCollection.ts +8 -0
  232. package/rancher-components/RcDropdown/useDropdownContext.ts +9 -3
  233. package/rancher-components/RcDropdown/useDropdownItem.ts +63 -0
  234. package/scripts/extension/bundle +20 -0
  235. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -1
  236. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  237. package/scripts/extension/helmpatch +44 -31
  238. package/scripts/extension/publish +12 -12
  239. package/scripts/typegen.sh +2 -4
  240. package/server/har-file.js +25 -3
  241. package/store/action-menu.js +26 -56
  242. package/store/features.js +2 -1
  243. package/store/index.js +5 -0
  244. package/store/modal.ts +71 -0
  245. package/store/slideInPanel.ts +47 -0
  246. package/store/type-map.js +12 -1
  247. package/store/type-map.utils.ts +4 -4
  248. package/types/global-vue.d.ts +5 -0
  249. package/types/internal-api/shell/growl.d.ts +25 -0
  250. package/types/internal-api/shell/modal.d.ts +77 -0
  251. package/types/internal-api/shell/slideIn.d.ts +15 -0
  252. package/types/resources/fleet.d.ts +0 -14
  253. package/types/shell/index.d.ts +43 -24
  254. package/types/vue-shim.d.ts +4 -1
  255. package/utils/__mocks__/tabbable.js +13 -0
  256. package/utils/__tests__/object.test.ts +38 -4
  257. package/utils/cluster.js +35 -0
  258. package/utils/fleet.ts +15 -73
  259. package/utils/object.js +48 -5
  260. package/utils/validators/formRules/__tests__/index.test.ts +10 -1
  261. package/utils/validators/formRules/index.ts +27 -3
  262. package/utils/validators/machine-pool.ts +20 -0
  263. package/components/DisableAuthProviderModal.vue +0 -114
  264. package/components/MoveModal.vue +0 -166
  265. package/components/PromptChangePassword.vue +0 -123
  266. package/components/fleet/FleetBundleResources.vue +0 -86
  267. package/components/formatter/ExtensionCache.vue +0 -74
  268. package/components/formatter/Port.vue +0 -24
  269. package/components/formatter/SecretType.vue +0 -41
  270. package/types/vue-shim.d +0 -20
@@ -5,7 +5,6 @@ import {
5
5
  import { ISTIO, MANAGEMENT } from '@shell/config/types';
6
6
 
7
7
  import { get, set } from '@shell/utils/object';
8
- import { escapeHtml } from '@shell/utils/string';
9
8
  import { insertAt, isArray } from '@shell/utils/array';
10
9
  import SteveModel from '@shell/plugins/steve/steve-class';
11
10
  import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
@@ -74,7 +73,13 @@ export default class Namespace extends SteveModel {
74
73
  }
75
74
 
76
75
  move(resources = this) {
77
- this.$dispatch('promptMove', resources);
76
+ this.$dispatch('promptModal', {
77
+ component: 'MoveNamespaceDialog',
78
+ resources: !Array.isArray(resources) ? [resources] : resources,
79
+ modalWidth: '440',
80
+ height: 'auto',
81
+ styles: 'max-height: 100vh;'
82
+ });
78
83
  }
79
84
 
80
85
  get isSystem() {
@@ -124,11 +129,11 @@ export default class Namespace extends SteveModel {
124
129
  return project;
125
130
  }
126
131
 
127
- get groupByLabel() {
128
- const name = this.project?.nameDisplay;
132
+ get groupById() {
133
+ const projectId = this.project?.id;
129
134
 
130
- if ( name ) {
131
- return this.$rootGetters['i18n/t']('resourceTable.groupLabel.project', { name: escapeHtml(name) });
135
+ if ( projectId ) {
136
+ return projectId;
132
137
  } else {
133
138
  return this.$rootGetters['i18n/t']('resourceTable.groupLabel.notInAProject');
134
139
  }
@@ -80,14 +80,17 @@ export default class NodeDriver extends Driver {
80
80
  return this.$dispatch('rancher/request', {
81
81
  url: `v3/nodeDrivers/${ escape(this.id) }?action=activate`,
82
82
  method: 'post',
83
- }, { root: true });
83
+ }, { root: true }).catch((err) => {
84
+ this.$dispatch('growl/fromError', { title: this.t('drivers.error.activate', { name: this.nameDisplay }), err }, { root: true });
85
+ });
84
86
  }
85
87
 
86
88
  async activateBulk(resources) {
87
89
  await Promise.all(resources.map((resource) => this.$dispatch('rancher/request', {
88
90
  url: `v3/nodeDrivers/${ escape(resource.id) }?action=activate`,
89
91
  method: 'post',
90
- }, { root: true }
91
- )));
92
+ }, { root: true }).catch((err) => {
93
+ this.$dispatch('growl/fromError', { title: this.t('drivers.error.activate', { name: resource.nameDisplay }), err }, { root: true });
94
+ })));
92
95
  }
93
96
  }
@@ -34,7 +34,10 @@ export default class Workload extends WorkloadService {
34
34
  enabled: !!this.links.update,
35
35
  });
36
36
 
37
- if (type !== WORKLOAD_TYPES.JOB && type !== WORKLOAD_TYPES.CRON_JOB) {
37
+ if (type !== WORKLOAD_TYPES.JOB &&
38
+ type !== WORKLOAD_TYPES.CRON_JOB &&
39
+ type !== WORKLOAD_TYPES.REPLICA_SET
40
+ ) {
38
41
  insertAt(out, 0, {
39
42
  action: 'toggleRollbackModal',
40
43
  label: this.t('action.rollback'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rancher/shell",
3
- "version": "3.0.4",
3
+ "version": "3.0.5-rc.2",
4
4
  "description": "Rancher Dashboard Shell",
5
5
  "repository": "https://github.com/rancherlabs/dashboard",
6
6
  "license": "Apache-2.0",
@@ -75,7 +75,7 @@
75
75
  "dayjs": "1.8.29",
76
76
  "defu": "5.0.1",
77
77
  "diff2html": "3.4.24",
78
- "dompurify": "2.5.4",
78
+ "dompurify": "3.2.5",
79
79
  "element-matches": "^0.1.2",
80
80
  "entities": "4.5.0",
81
81
  "eslint-config-standard": "16.0.3",
@@ -105,7 +105,7 @@
105
105
  "js-yaml-loader": "1.2.2",
106
106
  "js-yaml": "4.1.0",
107
107
  "jsdiff": "1.1.1",
108
- "jsonpath-plus": "10.0.7",
108
+ "jsonpath-plus": "10.3.0",
109
109
  "jsrsasign": "11.0.0",
110
110
  "jszip": "3.8.0",
111
111
  "lodash": "4.17.21",
package/pages/about.vue CHANGED
@@ -8,10 +8,12 @@ import { getVendor } from '@shell/config/private-label';
8
8
  import { downloadFile } from '@shell/utils/download';
9
9
  import { mapGetters } from 'vuex';
10
10
  import TabTitle from '@shell/components/TabTitle';
11
+ import { PanelLocation, ExtensionPoint } from '@shell/core/types';
12
+ import ExtensionPanel from '@shell/components/ExtensionPanel';
11
13
 
12
14
  export default {
13
15
  components: {
14
- BackLink, Loading, TabTitle
16
+ BackLink, ExtensionPanel, Loading, TabTitle
15
17
  },
16
18
  mixins: [BackRoute],
17
19
  async fetch() {
@@ -19,8 +21,10 @@ export default {
19
21
  },
20
22
  data() {
21
23
  return {
22
- dashboardVersion: this.$config.dashboardVersion,
23
- settings: null,
24
+ extensionType: ExtensionPoint.PANEL,
25
+ extensionLocation: PanelLocation.ABOUT_TOP,
26
+ dashboardVersion: this.$config.dashboardVersion,
27
+ settings: null,
24
28
  SETTING
25
29
  };
26
30
  },
@@ -115,6 +119,12 @@ export default {
115
119
  {{ t('about.diagnostic.title') }}
116
120
  </router-link>
117
121
  </div>
122
+ <!-- Extensions area -->
123
+ <ExtensionPanel
124
+ :resource="{}"
125
+ :type="extensionType"
126
+ :location="extensionLocation"
127
+ />
118
128
  <h3>{{ t('about.versions.title') }}</h3>
119
129
  <table>
120
130
  <thead>
@@ -1,6 +1,5 @@
1
1
  <script>
2
2
  import BackLink from '@shell/components/BackLink';
3
- import PromptChangePassword from '@shell/components/PromptChangePassword';
4
3
  import { MANAGEMENT, NORMAN } from '@shell/config/types';
5
4
  import { SETTING } from '@shell/config/settings';
6
5
  import Loading from '@shell/components/Loading';
@@ -17,7 +16,7 @@ const API_ENDPOINT = '/v3';
17
16
 
18
17
  export default {
19
18
  components: {
20
- CopyToClipboardText, BackLink, Banner, PromptChangePassword, Loading, ResourceTable, Principal, TabTitle
19
+ CopyToClipboardText, BackLink, Banner, Loading, ResourceTable, Principal, TabTitle
21
20
  },
22
21
  mixins: [BackRoute],
23
22
  async fetch() {
@@ -136,6 +135,15 @@ export default {
136
135
 
137
136
  return false;
138
137
  },
138
+ showChangePasswordDialog() {
139
+ this.$store.dispatch('management/promptModal', {
140
+ component: 'ChangePasswordDialog',
141
+ testId: 'change-password__modal',
142
+ customClass: 'change-password-modal',
143
+ modalWidth: '500',
144
+ height: '465'
145
+ });
146
+ }
139
147
  }
140
148
  };
141
149
  </script>
@@ -165,21 +173,23 @@ export default {
165
173
  type="button"
166
174
  class="btn role-primary"
167
175
  data-testid="account_change_password"
168
- @click="$refs.promptChangePassword.show(true)"
176
+ @click="showChangePasswordDialog"
169
177
  >
170
178
  {{ t("accountAndKeys.account.change") }}
171
179
  </button>
172
180
  </div>
173
181
  </div>
174
- <PromptChangePassword ref="promptChangePassword" />
175
182
 
176
- <hr>
183
+ <hr role="none">
177
184
  <div class="keys-header">
178
185
  <div>
179
186
  <h2 v-t="'accountAndKeys.apiKeys.title'" />
180
187
  <div class="api-url">
181
188
  <span>{{ t("accountAndKeys.apiKeys.apiEndpoint") }}</span>
182
- <CopyToClipboardText :text="apiUrl" />
189
+ <CopyToClipboardText
190
+ :aria-label="t('accountAndKeys.apiKeys.copyApiEnpoint')"
191
+ :text="apiUrl"
192
+ />
183
193
  </div>
184
194
  </div>
185
195
  <button
@@ -31,19 +31,18 @@ import {
31
31
  import loadPlugins from '@shell/plugins/plugin';
32
32
  import Loading from '@shell/components/Loading';
33
33
  import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
34
+ import TabTitle from '@shell/components/TabTitle.vue';
34
35
 
35
36
  export default {
36
37
  name: 'Login',
37
38
  components: {
38
- LabeledInput, AsyncButton, Checkbox, BrandImage, Banner, InfoBox, CopyCode, Password, LocaleSelector, Loading
39
+ LabeledInput, AsyncButton, Checkbox, BrandImage, Banner, InfoBox, CopyCode, Password, LocaleSelector, Loading, TabTitle
39
40
  },
40
41
 
41
42
  data() {
42
- const username = this.$cookies.get(USERNAME, { parseJSON: false }) || '';
43
-
44
43
  return {
45
- username,
46
- remember: !!username,
44
+ username: '',
45
+ remember: false,
47
46
  password: '',
48
47
 
49
48
  timedOut: this.$route.query[TIMED_OUT] === _FLAGGED,
@@ -135,6 +134,11 @@ export default {
135
134
  },
136
135
 
137
136
  async fetch() {
137
+ const username = this.$cookies.get(USERNAME, { parseJSON: false }) || '';
138
+
139
+ this.username = username;
140
+ this.remember = !!username;
141
+
138
142
  const { firstLoginSetting } = await this.loadInitialSettings();
139
143
  const { value } = await this.$store.dispatch('management/find', { type: MANAGEMENT.SETTING, id: SETTING.BANNERS });
140
144
  const drivers = await this.$store.dispatch('auth/getAuthProviders');
@@ -311,10 +315,16 @@ export default {
311
315
  v-if="$fetchState.pending"
312
316
  mode="relative"
313
317
  />
314
- <main
318
+ <div
315
319
  v-else
316
320
  class="main-layout login"
317
321
  >
322
+ <TabTitle
323
+ :show-child="false"
324
+ :breadcrumb="false"
325
+ >
326
+ {{ `${vendor} - ${t('login.login')}` }}
327
+ </TabTitle>
318
328
  <div class="row gutless mb-20">
319
329
  <div class="col span-6 p-20">
320
330
  <p class="text-center">
@@ -509,9 +519,10 @@ export default {
509
519
  class="col span-6 landscape"
510
520
  data-testid="login-landscape__img"
511
521
  file-name="login-landscape.svg"
522
+ :alt="t('login.landscapeAlt')"
512
523
  />
513
524
  </div>
514
- </main>
525
+ </div>
515
526
  </template>
516
527
 
517
528
  <style lang="scss" scoped>
@@ -28,7 +28,10 @@ export default {
28
28
  </script>
29
29
 
30
30
  <template>
31
- <main class="main-layout">
31
+ <main
32
+ class="main-layout"
33
+ :aria-label="t('layouts.logout')"
34
+ >
32
35
  <div>
33
36
  <h1 v-t="'logout.message'" />
34
37
  </div>
@@ -331,6 +331,7 @@ export default {
331
331
  style="padding: 0 0 0 12px;"
332
332
  >
333
333
  <CopyToClipboard
334
+ :aria-label="t('setup.copyRandom')"
334
335
  :text="password"
335
336
  class="btn-sm"
336
337
  />
@@ -361,6 +362,7 @@ export default {
361
362
  <hr
362
363
  v-if="mustChangePassword"
363
364
  class="mt-20 mb-20"
365
+ role="none"
364
366
  >
365
367
  <p>
366
368
  <t
@@ -129,6 +129,13 @@ export default {
129
129
  },
130
130
 
131
131
  data() {
132
+ return {
133
+ testing: null,
134
+ isSlo: null,
135
+ };
136
+ },
137
+
138
+ created() {
132
139
  const stateJSON = this.$route.query[GITHUB_NONCE] || '';
133
140
 
134
141
  let parsed = {};
@@ -140,13 +147,8 @@ export default {
140
147
 
141
148
  const { test } = parsed;
142
149
 
143
- // Is Single Log Out
144
- const isSlo = this.$route.query[IS_SLO] === _FLAGGED;
145
-
146
- return {
147
- testing: test,
148
- isSlo
149
- };
150
+ this.testing = test;
151
+ this.isSlo = this.$route.query[IS_SLO] === _FLAGGED;
150
152
  },
151
153
 
152
154
  mounted() {
@@ -182,7 +184,10 @@ export default {
182
184
  </script>
183
185
 
184
186
  <template>
185
- <main class="main-layout">
187
+ <main
188
+ class="main-layout"
189
+ :aria-label="t('layouts.verify')"
190
+ >
186
191
  <h1 class="text-center mt-50">
187
192
  <span v-if="testing">
188
193
  Testing Configuration&hellip;
@@ -69,7 +69,7 @@ export default {
69
69
  return {
70
70
  id: m.name,
71
71
  text: m.name,
72
- url: `mailto:${ m.email }`
72
+ url: m.email ? `mailto:${ m.email }` : m.url
73
73
  };
74
74
  });
75
75
  },
@@ -32,7 +32,9 @@ import {
32
32
  import { CATALOG as CATALOG_ANNOTATIONS, PROJECT } from '@shell/config/labels-annotations';
33
33
 
34
34
  import { exceptionToErrorsArray } from '@shell/utils/error';
35
- import { clone, diff, get, set } from '@shell/utils/object';
35
+ import {
36
+ clone, diff, get, mergeWithReplace, set
37
+ } from '@shell/utils/object';
36
38
  import { ignoreVariables } from './install.helpers';
37
39
  import { findBy, insertAt } from '@shell/utils/array';
38
40
  import { saferDump } from '@shell/utils/create-yaml';
@@ -45,6 +47,22 @@ const VALUES_STATE = {
45
47
  DIFF: 'DIFF'
46
48
  };
47
49
 
50
+ /**
51
+ * Helm CLI options that are not persisted on the back end,
52
+ * but are used for the final install/upgrade operation.
53
+ */
54
+ const defaultCmdOpts = {
55
+ cleanupOnFail: false,
56
+ crds: true,
57
+ hooks: true,
58
+ force: false,
59
+ resetValues: false,
60
+ openApi: true,
61
+ wait: true,
62
+ timeout: 600,
63
+ historyMax: 5,
64
+ };
65
+
48
66
  function isPlainLayout(query) {
49
67
  return Object.keys(query).includes(HIDE_SIDE_NAV);
50
68
  }
@@ -312,15 +330,11 @@ export default {
312
330
  */
313
331
  this.removeGlobalValuesFrom(userValues);
314
332
 
315
- /*
316
- The merge() method is used to merge two or more objects
317
- starting with the left-most to the right-most to create a
318
- parent mapping object. When two keys are the same, the
319
- generated object will have value for the rightmost key.
320
- In this case, any values in userValues override any
321
- matching values in versionInfo.
322
- */
323
- this.chartValues = merge(merge({}, this.versionInfo?.values || {}), userValues);
333
+ this.chartValues = mergeWithReplace(
334
+ merge({}, this.versionInfo?.values || {}),
335
+ userValues,
336
+ { replaceObjectProps: true }
337
+ );
324
338
 
325
339
  if (this.showCustomRegistry) {
326
340
  /**
@@ -359,20 +373,6 @@ export default {
359
373
  },
360
374
 
361
375
  data() {
362
- /* Helm CLI options that are not persisted on the back end,
363
- but are used for the final install/upgrade operation. */
364
- const defaultCmdOpts = {
365
- cleanupOnFail: false,
366
- crds: true,
367
- hooks: true,
368
- force: false,
369
- resetValues: false,
370
- openApi: true,
371
- wait: true,
372
- timeout: 600,
373
- historyMax: 5,
374
- };
375
-
376
376
  return {
377
377
  defaultRegistrySetting: '',
378
378
  customRegistrySetting: '',
@@ -1386,7 +1386,7 @@ export default {
1386
1386
  >
1387
1387
  <template v-slot:option="opt">
1388
1388
  <template v-if="opt.kind === 'divider'">
1389
- <hr>
1389
+ <hr role="none">
1390
1390
  </template>
1391
1391
  <template v-else-if="opt.kind === 'label'">
1392
1392
  <b style="position: relative; left: -2.5px;">{{ opt.label }}</b>
@@ -1858,7 +1858,7 @@ export default {
1858
1858
  }
1859
1859
 
1860
1860
  .namespace-create-banner {
1861
- margin-bottom: 70px;
1861
+ margin-bottom: calc($footer-height + 10px);
1862
1862
  }
1863
1863
  }
1864
1864
  &__values {
@@ -7,6 +7,8 @@ import { authProvidersInfo } from '@shell/utils/auth';
7
7
  import { Banner } from '@components/Banner';
8
8
  import Loading from '@shell/components/Loading';
9
9
 
10
+ const resource = MANAGEMENT.AUTH_CONFIG;
11
+
10
12
  export default {
11
13
  components: {
12
14
  SelectIconGrid, Banner, Loading
@@ -24,19 +26,7 @@ export default {
24
26
  },
25
27
 
26
28
  data() {
27
- const resource = MANAGEMENT.AUTH_CONFIG;
28
- const getters = this.$store.getters;
29
- const inStore = getters['currentStore'](resource);
30
- const hasListComponent = getters['type-map/hasCustomList'](resource);
31
- const hasEditComponent = getters['type-map/hasCustomEdit'](resource);
32
- const schema = getters[`${ inStore }/schemaFor`](resource);
33
-
34
29
  return {
35
- resource,
36
- schema,
37
- hasListComponent,
38
- hasEditComponent,
39
-
40
30
  // Provided by fetch later
41
31
  enabled: false,
42
32
  nonLocal: null,
@@ -60,6 +50,14 @@ export default {
60
50
  }
61
51
  };
62
52
  },
53
+
54
+ inStore() {
55
+ return this.$store.getters['currentStore'](resource);
56
+ },
57
+
58
+ schema() {
59
+ return this.$store.getters[`${ this.inStore }/schemaFor`](resource);
60
+ }
63
61
  },
64
62
 
65
63
  methods: {
@@ -7,32 +7,48 @@ import { STEVE_EVENT_OBJECT, STEVE_NAME_COL } from '@shell/config/pagination-tab
7
7
  import { headerFromSchemaColString } from '@shell/store/type-map.utils';
8
8
  import { NAME as EXPLORER } from '@shell/config/product/explorer';
9
9
 
10
+ const reason = {
11
+ ...REASON,
12
+ ...{ canBeVariable: true },
13
+ width: 130,
14
+ };
15
+
16
+ const eventHeaders = [
17
+ reason,
18
+ OBJECT,
19
+ MESSAGE,
20
+ NAME, {
21
+ name: 'date',
22
+ label: 'Date',
23
+ labelKey: 'clusterIndexPage.sections.events.date.label',
24
+ value: 'timestamp',
25
+ sort: 'timestamp:desc',
26
+ formatter: 'Date',
27
+ width: 220,
28
+ defaultSort: true,
29
+ },
30
+ ];
31
+
10
32
  export default {
11
33
  components: { PaginatedResourceTable },
12
34
 
13
35
  data() {
14
- const reason = {
15
- ...REASON,
16
- ...{ canBeVariable: true },
17
- width: 130,
36
+ return {
37
+ schema: null,
38
+ events: [],
39
+ eventHeaders,
40
+ paginationHeaders: null,
41
+ allEventsLink: {
42
+ name: 'c-cluster-product-resource',
43
+ params: {
44
+ product: EXPLORER,
45
+ resource: EVENT,
46
+ }
47
+ }
18
48
  };
49
+ },
19
50
 
20
- const eventHeaders = [
21
- reason,
22
- OBJECT,
23
- MESSAGE,
24
- NAME, {
25
- name: 'date',
26
- label: 'Date',
27
- labelKey: 'clusterIndexPage.sections.events.date.label',
28
- value: 'timestamp',
29
- sort: 'timestamp:desc',
30
- formatter: 'Date',
31
- width: 220,
32
- defaultSort: true,
33
- },
34
- ];
35
-
51
+ beforeMount() {
36
52
  const schema = this.$store.getters['cluster/schemaFor'](EVENT);
37
53
 
38
54
  const paginationHeaders = schema ? [
@@ -51,19 +67,8 @@ export default {
51
67
  headerFromSchemaColString('Count', schema, this.$store.getters, true),
52
68
  ] : [];
53
69
 
54
- return {
55
- schema,
56
- events: [],
57
- eventHeaders,
58
- paginationHeaders,
59
- allEventsLink: {
60
- name: 'c-cluster-product-resource',
61
- params: {
62
- product: EXPLORER,
63
- resource: EVENT,
64
- }
65
- }
66
- };
70
+ this.schema = schema;
71
+ this.paginationHeaders = paginationHeaders;
67
72
  },
68
73
 
69
74
  mounted() {
@@ -63,6 +63,19 @@ const CLUSTER_COMPONENTS = [
63
63
  'controller-manager',
64
64
  ];
65
65
 
66
+ const nodeHeaders = [
67
+ STATE,
68
+ NAME,
69
+ ROLES,
70
+ ];
71
+
72
+ const clusterServiceIcons = {
73
+ [STATES_ENUM.IN_PROGRESS]: 'icon-spinner icon-spin',
74
+ [STATES_ENUM.HEALTHY]: 'icon-checkmark',
75
+ [STATES_ENUM.WARNING]: 'icon-warning',
76
+ [STATES_ENUM.UNHEALTHY]: 'icon-warning',
77
+ };
78
+
66
79
  export default {
67
80
  name: 'ClusterExplorerIndexPage',
68
81
 
@@ -118,20 +131,6 @@ export default {
118
131
  },
119
132
 
120
133
  data() {
121
- const clusterCounts = this.$store.getters[`cluster/all`](COUNT);
122
- const nodeHeaders = [
123
- STATE,
124
- NAME,
125
- ROLES,
126
- ];
127
-
128
- const clusterServiceIcons = {
129
- [STATES_ENUM.IN_PROGRESS]: 'icon-spinner icon-spin',
130
- [STATES_ENUM.HEALTHY]: 'icon-checkmark',
131
- [STATES_ENUM.WARNING]: 'icon-warning',
132
- [STATES_ENUM.UNHEALTHY]: 'icon-warning',
133
- };
134
-
135
134
  return {
136
135
  nodeHeaders,
137
136
  constraints: [],
@@ -152,7 +151,6 @@ export default {
152
151
  ETCD_METRICS_DETAIL_URL,
153
152
  ETCD_METRICS_SUMMARY_URL,
154
153
  STATES_ENUM,
155
- clusterCounts,
156
154
  selectedTab: 'cluster-events',
157
155
  extensionCards: getApplicableExtensionEnhancements(this, ExtensionPoint.CARD, CardLocation.CLUSTER_DASHBOARD_CARD, this.$route),
158
156
  canViewEvents: !!this.$store.getters['cluster/schemaFor'](EVENT),
@@ -188,6 +186,10 @@ export default {
188
186
  ...mapGetters(['currentCluster']),
189
187
  ...monitoringStatus(),
190
188
 
189
+ clusterCounts() {
190
+ return this.$store.getters[`cluster/all`](COUNT);
191
+ },
192
+
191
193
  nodes() {
192
194
  return this.$store.getters['cluster/all'](NODE);
193
195
  },
@@ -95,7 +95,7 @@ export default {
95
95
  <t k="istio.links.kiali.label" />
96
96
  <i class="icon icon-external-link pull-right" />
97
97
  </a>
98
- <hr>
98
+ <hr role="none">
99
99
  <div class="description">
100
100
  <span v-clean-html="t('istio.links.kiali.description', {link: monitoringUrl}, true)" />
101
101
  </div>
@@ -131,7 +131,7 @@ export default {
131
131
  <t k="istio.links.jaeger.label" />
132
132
  <i class="icon icon-external-link pull-right" />
133
133
  </a>
134
- <hr>
134
+ <hr role="none">
135
135
  <div class="description">
136
136
  <span v-clean-html="t('istio.links.jaeger.description', true)" />
137
137
  </div>
@@ -84,7 +84,7 @@ export default {
84
84
  <div class="link-content">
85
85
  <t :k="fel.label" />
86
86
  <i class="icon icon-external-link pull-right" />
87
- <hr>
87
+ <hr role="none">
88
88
  <div class="description"><t :k="fel.description" /></div>
89
89
  </div>
90
90
  </a>
@@ -172,7 +172,7 @@ export default {
172
172
  <i class="icon icon-external-link" />
173
173
  </div>
174
174
  </div>
175
- <hr>
175
+ <hr role="none">
176
176
  <div class="description">
177
177
  <span>
178
178
  <t :k="fel.description" />