@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
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 66 57" fill="#fff" fill-rule="evenodd" stroke="#000" stroke-linecap="round" stroke-linejoin="round"><use xlink:href="#A" x=".5" y=".5"/><symbol id="A" overflow="visible"><path d="M32 0L0 55.426h4.44L32 7.963v7.8L9.033 55.426h4.593L32 23.733v7.962l-13.78 23.73h4.593L32 39.656v7.8l-4.593 7.962H64z" stroke="none" fill="#da291c" fill-rule="nonzero"/></symbol></svg>
@@ -144,3 +144,9 @@ HR.vertical {
144
144
  .force-wrap { @include force-wrap }
145
145
  .bordered-section { @include bordered-section }
146
146
  .section-divider { @include section-divider }
147
+
148
+ fieldset {
149
+ border: 0;
150
+ padding: 0;
151
+ margin-inline: 0;
152
+ }
@@ -131,6 +131,10 @@ $spacing-property-map: (
131
131
  color: var(--input-label);
132
132
  }
133
133
 
134
+ .text-no-break {
135
+ white-space: nowrap;
136
+ }
137
+
134
138
  .hide {
135
139
  display: none !important;
136
140
  }
@@ -8,6 +8,7 @@ $min-width: 75% !default;
8
8
  $input-height: 61px;
9
9
  $unlabeled-input-height: 40px;
10
10
  $unlabaled-select-padding: 3px 0;
11
+ $footer-height: 60px;
11
12
 
12
13
  $input-padding-lg: 18px;
13
14
  $input-padding-sm: 10px;
@@ -215,6 +215,7 @@ fieldset[disabled] .btn {
215
215
  }
216
216
  }
217
217
 
218
+ .btn-disabled,
218
219
  .btn[disabled] {
219
220
  // Ensure disabled button's border remains as-is, otherwise button appears vertically shorter than others in group
220
221
  border: inherit;
@@ -144,6 +144,7 @@ nav:
144
144
  localClusterIcon: Local Cluster icon
145
145
  clusterProvIcon: Cluster {cluster} provider icon
146
146
  topLevelMenu: Main menu
147
+ sideNav: Secondary menu
147
148
  homePage: Home page navigation menu
148
149
  cluster: Cluster menu item
149
150
  harvesterCluster: Harvester cluster menu item
@@ -158,6 +159,7 @@ nav:
158
159
  alt:
159
160
  mainMenuIcon: Main menu icon
160
161
  mainMenuRancherLogo: Main menu Rancher logo
162
+ userAvatar: User avatar image
161
163
  expandCollapseAppBar: Expand/Collapse the Application Bar
162
164
  harvesterDashboard: Harvester Dashboard
163
165
  backToRancher: Cluster Manager
@@ -236,9 +238,10 @@ nav:
236
238
  clusters: clusters
237
239
  ariaLabel: Filter clusters on main menu
238
240
  resourceSearch:
239
- label: Resource Search
240
- toolTip: Resource Search {key}
241
- placeholder: Type to search for a resource...
241
+ label: Resource Type Search
242
+ prompt: Search for a Kubernetes Resource/Custom Resource type
243
+ toolTip: Resource Type Search {key}
244
+ placeholder: Type to search for a resource type...
242
245
  filteringDescription: Using this input will immediately filter the results in the list below
243
246
  header:
244
247
  setLoginPage: Set as login page
@@ -319,6 +322,15 @@ suffix:
319
322
  ##############################
320
323
  # Components & Pages
321
324
  ##############################
325
+ layouts:
326
+ home: home layout
327
+ plain: plain layout
328
+ default: default layout
329
+ blank: blank layout
330
+ unauthenticated: unauthenticated layout
331
+ logout: logout layout
332
+ verify: verify layout
333
+
322
334
  windowmanager:
323
335
  closeTab: Close tab {tabId}
324
336
  about:
@@ -379,11 +391,15 @@ accountAndKeys:
379
391
  title: API Keys
380
392
  notAllowed: You do not have permission to manage API Keys
381
393
  apiEndpoint: "API Endpoint:"
394
+ copyApiEnpoint: Copy API Endpoint to clipboard
382
395
  add:
383
396
  description:
384
397
  label: Description
385
398
  placeholder: Optionally enter a description to help you identify this API Key
386
399
  label: Create API Key
400
+ ariaLabel:
401
+ expiration: Expiration duration - number input
402
+ expirationUnits: Expiration unit - time unit
387
403
  expiry:
388
404
  label: Automatically expire
389
405
  options:
@@ -483,6 +499,9 @@ authConfig:
483
499
  4: 'Under Scopes for Google APIs, enable "email", "profile", and "openid".'
484
500
  5: 'Click on "Save".'
485
501
  topPrivateDomain: 'Top private domain of:'
502
+ ariaLabel:
503
+ hostname: Copy Hostname to clipboard
504
+ serverUrl: Copy Server URL to clipboard
486
505
  2:
487
506
  title: 'Navigate to the "Credentials" tab to create your OAuth client ID'
488
507
  body:
@@ -491,6 +510,8 @@ authConfig:
491
510
  3: 'Authorized redirect URIs:'
492
511
  4: 'Click "Create", and then click on the "Download JSON" button.'
493
512
  5: 'Upload the downloaded JSON file in the OAuth credentials box.'
513
+ ariaLabel:
514
+ serverUrlVerify: Copy Server Auth Verfication URL to clipboard
494
515
  3:
495
516
  title: 'Create Service Account credentials'
496
517
  introduction: 'Follow <a href="{docsBase}/how-to-guides/new-user-guides/authentication-permissions-and-global-configuration/authentication-config/configure-google-oauth#3-creating-service-account-credentials" target="_blank" rel="noopener noreferrer nofollow">this</a> guide to:'
@@ -624,6 +645,7 @@ authConfig:
624
645
  reply:
625
646
  info: 'Azure AD requires a whitelisted URL for your Rancher server before beginning this setup. Please ensure that the following URL is set in the Reply URL section of your Azure Portal. Please note that it may take up to 5 minutes for the whitelisted URL to propagate.'
626
647
  label: Reply URL
648
+ ariaLabel: Copy Reply URL to clipboard
627
649
  updateEndpoint:
628
650
  button: Update Endpoint
629
651
  banner:
@@ -656,7 +678,7 @@ authConfig:
656
678
  scope:
657
679
  label: Scopes
658
680
  placeholder: openid
659
- protip: The <code>openid</code> scope is required. If you are using custom scopes, ensure that it is included.
681
+ protip: The <code>openid</code>, <code>profile</code>, and <code>email</code> scopes are required and cannot be removed.
660
682
  cert:
661
683
  label: Certificate
662
684
  placeholder: Paste in the certificate, starting with -----BEGIN CERTIFICATE-----
@@ -851,13 +873,13 @@ asyncButton:
851
873
  success: Generated
852
874
  waiting: Generating&hellip;
853
875
 
854
- backupRestoreOperator:
876
+ backupRestoreOperator:
855
877
  backup:
856
878
  label: Resource Set
857
879
  description: The Resource Set determines which resources the backup-restore-operator collects in a backup
858
880
  enableEncryptionWarning: 'Enabling encryption is highly recommended when using <b><i>Full Rancher backup resource set</i></b>, otherwise sensitive information will be backed up as plain-text. <a target="_blank" rel="noopener noreferrer nofollow" href="https://ranchermanager.docs.rancher.com/reference-guides/backup-restore-configuration/backup-configuration#resourcesets">Read more</a>.'
859
881
  missingResourceSetWarning: The <b><i>{resourceSet}</i></b> resource set doesn't exist, it's possible it has been deleted. Please select a different option.
860
- resourceSetOptions:
882
+ resourceSetOptions:
861
883
  'rancher-resource-set-basic': 'Basic Rancher backup resource set'
862
884
  'rancher-resource-set-full': 'Full Rancher backup resource set'
863
885
  custom: Custom
@@ -1345,7 +1367,7 @@ cluster:
1345
1367
  registrationCommand:
1346
1368
  label: Registration Command
1347
1369
  linuxDetail: Run this command on each of the existing Linux machines you want to register.
1348
- windowsDetail: Run this command in PowerShell on each of the existing Windows machines you want to register.
1370
+ windowsDetail: Run this command in PowerShell on each of the existing Windows machines you want to register.
1349
1371
  windowsWorkersOnly: <b>Windows nodes can only be workers.</b>
1350
1372
  windowsNotReady: The cluster must be up and running with Linux etcd, control plane, and worker nodes before the registration command for adding Windows workers will display.<br /> <br /><b>Windows nodes can only be workers.</b>
1351
1373
  windowsWarning: Workload pods, including some deployed by Rancher charts, will be scheduled on both Linux and Windows nodes by default. Edit NodeSelector in the chart to direct them to be placed onto a compatible node.
@@ -1863,11 +1885,11 @@ cluster:
1863
1885
  subGroups:
1864
1886
  podAffinityAnti: Pod Affinity/Anti-Affinity
1865
1887
  nodeAffinity: Node Affinity
1866
- schedulingCustomization:
1888
+ schedulingCustomization:
1867
1889
  label: Prevent Rancher cluster agent pod eviction
1868
1890
  description: This ensures that the cluster agent pod is not evicted due to node pressure, resource constraints or scheduler policies.
1869
1891
  banner: This feature has been enabled with settings that are different from the global default settings.
1870
- innerCheckbox: Apply global settings for Priority Class and Pod Disruption Budget
1892
+ innerCheckbox: Apply global settings for Priority Class and Pod Disruption Budget
1871
1893
  banners:
1872
1894
  advanced: These are advanced configuration options. Generally, they should be left as-is.
1873
1895
  tolerations: Additional Pod Tolerations will be added to the default Tolerations applied by Rancher.
@@ -2036,6 +2058,7 @@ cluster:
2036
2058
  docker: Docker
2037
2059
  eks: Amazon EKS
2038
2060
  exoscale: Exoscale
2061
+ sks: Exoscale SKS
2039
2062
  gcp: Google
2040
2063
  google: Google GCE
2041
2064
  googlegke: Google GKE
@@ -2097,7 +2120,8 @@ cluster:
2097
2120
  title: Save Machine Configurations
2098
2121
  body: Machine Configurations define how machines in Pools are deployed.<br><br> They will be saved upfront to ensure valid Cluster YAML can be saved.
2099
2122
  snapshots:
2100
- suffix: Snapshots
2123
+ suffix: Snapshots per node
2124
+ s3Suffix: Snapshots
2101
2125
  systemService:
2102
2126
  rke2-coredns: 'CoreDNS'
2103
2127
  rke2-ingress-nginx: 'NGINX Ingress'
@@ -2193,7 +2217,7 @@ cluster:
2193
2217
  snapshotScheduleCron:
2194
2218
  label: Cron Schedule
2195
2219
  snapshotRetention:
2196
- label: Snapshot retention count
2220
+ label: Snapshot retention count
2197
2221
  tooltip: Each backup records 1 snapshot per etcd node. If you specify 3 snapshots and you have 3 etcd nodes you will only retain 1 full backup.
2198
2222
  exportMetric:
2199
2223
  label: Metrics
@@ -2398,8 +2422,11 @@ drivers:
2398
2422
  =1 { {warningDrivers} Resources in the corresponding provider will not be automatically removed.}
2399
2423
  other { {warningDrivers} Resources in the corresponding providers will not be automatically removed.}
2400
2424
  }
2425
+ error:
2426
+ activate: Failed to activate { name } driver
2401
2427
 
2402
2428
  detailText:
2429
+ copyAriaLabel: Copy {item} value to clipboard
2403
2430
  collapse: Hide
2404
2431
  binary: '<Binary Data: {n, number} bytes>'
2405
2432
  empty: '<Empty>'
@@ -2731,6 +2758,7 @@ clusterBadge:
2731
2758
  iconText: Icon Text
2732
2759
  buttonAction: Apply
2733
2760
  badgeBgColor: Badge background color
2761
+ badgeBgColorInput: Badge background color selector input
2734
2762
  badgeTextColor: Badge text color
2735
2763
  badgeAsIcon: Use custom badge
2736
2764
  maxCharsTooltip: Overwrites the default cluster name abbreviation.
@@ -2930,6 +2958,8 @@ ingress:
2930
2958
 
2931
2959
  internalExternalIP:
2932
2960
  none: None
2961
+ copyInternalIp: Copy internal IP address to clipboard
2962
+ copyExternalIp: Copy external IP address to clipboard
2933
2963
 
2934
2964
  istio:
2935
2965
  links:
@@ -3137,6 +3167,7 @@ labels:
3137
3167
  hide: Hide System Labels and Annotations
3138
3168
  annotations:
3139
3169
  title: Annotations
3170
+ singular: Annotation
3140
3171
 
3141
3172
  labelSelect:
3142
3173
  noOptions:
@@ -3150,6 +3181,8 @@ labeledSelect:
3150
3181
  pressEnter: Press enter to add "{input}"
3151
3182
 
3152
3183
  landing:
3184
+ bannerImage: Homepage banner image
3185
+ homepage: Homepage
3153
3186
  clusters:
3154
3187
  title: Clusters
3155
3188
  provider: Provider
@@ -3473,8 +3506,10 @@ neuvector:
3473
3506
  na: Resource Unavailable
3474
3507
 
3475
3508
  login:
3509
+ login: Login
3476
3510
  howdy: Howdy!
3477
3511
  welcome: Welcome to {vendor}
3512
+ landscapeAlt: Landscape image
3478
3513
  loggedOut: You have been logged out.
3479
3514
  loggedOutFromSso: You've been logged out of Rancher, however you may still be logged in to your single sign-on identity provider.
3480
3515
  loggedOutFromSlo: You've been logged out of Rancher and from your single sign-on identity provider.
@@ -3911,6 +3946,10 @@ namespaceFilter:
3911
3946
  one {1 item selected}
3912
3947
  other {{total} items selected}
3913
3948
  }
3949
+ input: Filter namespace options
3950
+ button:
3951
+ clear: Remove applied namespace filters
3952
+ clearFilter: Clear namespace options filter
3914
3953
 
3915
3954
  namespaceList:
3916
3955
  selectLabel: Namespace
@@ -4711,6 +4750,7 @@ prefs:
4711
4750
  allNamespaces: Show dynamic Namespaces managed by Rancher (not intended for editing or deletion)
4712
4751
  themeShortcut: Enable Dark/Light Theme keyboard shortcut toggle (shift+T)
4713
4752
  pluginDeveloper: Enable Extension developer features
4753
+ pluginDeveloperTooltip: Enables the ability to perform a developer load of UI extensions
4714
4754
  hideDesc:
4715
4755
  label: Hide Type Description banners above resource lists
4716
4756
  helm:
@@ -4727,6 +4767,8 @@ principal:
4727
4767
  name: Name
4728
4768
  loginName: Username
4729
4769
  type: Type
4770
+ alt:
4771
+ avatar: User avatar image
4730
4772
 
4731
4773
  probe:
4732
4774
  checkInterval:
@@ -4879,6 +4921,7 @@ promptForceRemove:
4879
4921
  modalTitle: Are you sure?
4880
4922
  removeWarning: "There was an issue with deleting underlying infrastructure. If you proceed with this action, the Machine <b>{nameToMatch}</b> will be deleted from Rancher only. It's highly recommended to manually delete any referenced infrastructure."
4881
4923
  forceDelete: Force Delete
4924
+ ariaLabel: Copy Machine name to clipboard
4882
4925
  confirmName: "Enter in the pool name below to confirm:"
4883
4926
  podRemoveWarning: "Force deleting pods does not wait for confirmation that the pod's processes have been terminated. This may result in <strong>data corruption or inconsistencies</strong>"
4884
4927
 
@@ -5105,6 +5148,8 @@ rbac:
5105
5148
  label: Login Access
5106
5149
  clustertemplaterevisions-create:
5107
5150
  label: Create RKE Template Revisions
5151
+ errors:
5152
+ escalation: You cannot assign Global Permissions that are higher than your own. Please verify the permissions you are attempting to assign.
5108
5153
 
5109
5154
  resourceDetail:
5110
5155
  detailTop:
@@ -5181,6 +5226,7 @@ resourceTable:
5181
5226
  role: Group by Role
5182
5227
  cluster: Group by Cluster
5183
5228
  device: Group by Device
5229
+ pool: Group by Pool
5184
5230
  groupLabel:
5185
5231
  cluster: "<span>Cluster:</span> {name}"
5186
5232
  notInACluster: Not in a Cluster
@@ -5490,6 +5536,7 @@ setup:
5490
5536
  setPassword: The first order of business is to set a strong password for the default <code>{username}</code> user. We suggest using this random one generated just for you, but enter your own if you like.
5491
5537
  useManual: Set a specific password to use
5492
5538
  useRandom: Use a randomly generated password
5539
+ copyRandom: Copy random password to clipboard
5493
5540
  welcome: Welcome to {vendor}!
5494
5541
 
5495
5542
  sortableTable:
@@ -7537,6 +7584,9 @@ typeLabel:
7537
7584
  }
7538
7585
 
7539
7586
  action:
7587
+ ariaLabel:
7588
+ hidePass: Hide {area}
7589
+ showPass: Reveal {area}
7540
7590
  clone: Clone
7541
7591
  disable: Disable
7542
7592
  download: Download YAML
@@ -7788,9 +7838,9 @@ performance:
7788
7838
  banner:
7789
7839
  label: Fixed Banners
7790
7840
  settingName: Banners
7791
- headerBanner: Header Banner
7792
- footerBanner: Footer Banner
7793
- loginScreenBanner: Login Screen Banner
7841
+ bannerHeader: Header Banner
7842
+ bannerFooter: Footer Banner
7843
+ bannerConsent: Login Screen Banner
7794
7844
  text: Text
7795
7845
  buttonText: Accept Button Text
7796
7846
  textColor: Text Color
@@ -7941,12 +7991,12 @@ customLinks:
7941
7991
  commercialSupport: Commercial Support
7942
7992
  appCo: SUSE Application Collection
7943
7993
 
7944
-
7945
7994
  ##############################
7946
7995
  ### Support Page
7947
7996
  ##############################
7948
7997
 
7949
7998
  support:
7999
+ bannerImage: Support page banner image
7950
8000
  community:
7951
8001
  title: SUSE Rancher provides world-class support
7952
8002
  linksTitle: Community Support
@@ -1773,6 +1773,7 @@ cluster:
1773
1773
  docker: Docker
1774
1774
  eks: Amazon EKS
1775
1775
  exoscale: Exoscale
1776
+ sks: Exoscale SKS
1776
1777
  gcp: Google
1777
1778
  google: Google GCE
1778
1779
  googlegke: Google GKE
@@ -7131,9 +7132,9 @@ performance:
7131
7132
  banner:
7132
7133
  label: 固定横幅
7133
7134
  settingName: 横幅
7134
- headerBanner: 标题横幅
7135
- footerBanner: 页脚横幅
7136
- loginScreenBanner: 登录屏幕横幅
7135
+ bannerHeader: 标题横幅
7136
+ bannerFooter: 页脚横幅
7137
+ bannerConsent: 登录屏幕横幅
7137
7138
  text: 文本
7138
7139
  buttonText: 同意按钮文本
7139
7140
  textColor: 文本颜色
@@ -72,7 +72,9 @@ export default {
72
72
  const { existing = false } = this.$attrs;
73
73
 
74
74
  // If needed, fetch all the workloads that have prometheus operator like containers
75
- this.workloadTypes = !existing ? Object.values(WORKLOAD_TYPES) : [];
75
+ const { CRON_JOB, ...validWorkloads } = WORKLOAD_TYPES;
76
+
77
+ this.workloadTypes = !existing ? Object.values(validWorkloads) : [];
76
78
 
77
79
  this.workloadTypes.forEach((type) => {
78
80
  // We'll use a filter to fetch the results. Atm there's no neat way to differentiate between ALL results and JUST filtered
@@ -78,6 +78,7 @@ export default {
78
78
  :rules="fvGetAndReportPathRules('decodedData.accessKey')"
79
79
  :mode="mode"
80
80
  :required="true"
81
+ data-testid="access-key"
81
82
  @update:value="$emit('valueChanged', 'accessKey', $event)"
82
83
  />
83
84
  <LabeledInput
@@ -89,6 +90,7 @@ export default {
89
90
  :rules="fvGetAndReportPathRules('decodedData.secretKey')"
90
91
  :mode="mode"
91
92
  :required="true"
93
+ data-testid="secret-key"
92
94
  @update:value="$emit('valueChanged', 'secretKey', $event)"
93
95
  />
94
96
  <LabeledSelect
@@ -0,0 +1,71 @@
1
+ <script setup lang="ts">
2
+ import { RcDropdown, RcDropdownTrigger, RcDropdownItem } from '@components/RcDropdown';
3
+ type HiddenAction = {
4
+ action: string;
5
+ enabled: boolean;
6
+ icon: string;
7
+ label: string;
8
+ bulkable: boolean;
9
+ bulkAction: string;
10
+ allEnabled: boolean;
11
+ anyEnabled: boolean;
12
+ }
13
+
14
+ defineProps<{
15
+ disabled: boolean,
16
+ hiddenActions: HiddenAction[],
17
+ actionTooltip: unknown,
18
+ }>();
19
+
20
+ const emit = defineEmits(['click', 'mouseover', 'mouseleave']);
21
+
22
+ const applyTableAction = (act: HiddenAction, args: unknown, event: Event) => {
23
+ emit('click', act, args, event);
24
+ };
25
+
26
+ const setBulkActionOfInterest = (act: HiddenAction | null, event: 'mouseover' | 'mouseleave' = 'mouseover') => {
27
+ emit(event, act);
28
+ };
29
+ </script>
30
+
31
+ <template>
32
+ <rc-dropdown
33
+ :distance="14"
34
+ placement="bottom"
35
+ >
36
+ <rc-dropdown-trigger
37
+ class="bulk-actions-dropdown"
38
+ :disabled="disabled"
39
+ >
40
+ <template #before>
41
+ <i class="icon icon-gear" />
42
+ </template>
43
+ <span>{{ t('sortableTable.bulkActions.collapsed.label') }}</span>
44
+ <template #after>
45
+ <i class="ml-10 icon icon-chevron-down" />
46
+ </template>
47
+ </rc-dropdown-trigger>
48
+ <template #dropdownCollection>
49
+ <rc-dropdown-item
50
+ v-for="(act, i) in hiddenActions"
51
+ :key="i"
52
+ v-clean-tooltip="{
53
+ content: actionTooltip,
54
+ placement: 'right'
55
+ }"
56
+ :disabled="!act.enabled"
57
+ @click="applyTableAction(act, null, $event)"
58
+ @mouseover="setBulkActionOfInterest(act)"
59
+ @mouseleave="setBulkActionOfInterest(null, 'mouseleave')"
60
+ >
61
+ <template #before>
62
+ <i
63
+ v-if="act.icon"
64
+ :class="act.icon"
65
+ />
66
+ </template>
67
+ <span v-clean-html="act.label" />
68
+ </rc-dropdown-item>
69
+ </template>
70
+ </rc-dropdown>
71
+ </template>
@@ -1,6 +1,10 @@
1
1
  <script lang="ts">
2
- import { defineComponent } from 'vue';
3
- import { DEFAULT_FOCUS_TRAP_OPTS, useBasicSetupFocusTrap, getFirstFocusableElement } from '@shell/composables/focusTrap';
2
+ import { defineComponent, ref } from 'vue';
3
+ import {
4
+ DEFAULT_FOCUS_TRAP_OPTS,
5
+ getFirstFocusableElement,
6
+ useWatcherBasedSetupFocusTrapWithDestroyIncluded
7
+ } from '@shell/composables/focusTrap';
4
8
 
5
9
  export const DEFAULT_ITERABLE_NODE_SELECTOR = 'body;';
6
10
 
@@ -80,6 +84,13 @@ export default defineComponent({
80
84
  returnFocusFirstIterableNodeSelector: {
81
85
  type: String,
82
86
  default: DEFAULT_ITERABLE_NODE_SELECTOR,
87
+ },
88
+ /**
89
+ * watcher-based focus trap variable to watch
90
+ */
91
+ focusTrapWatcherBasedVariable: {
92
+ type: Boolean,
93
+ default: undefined,
83
94
  }
84
95
  },
85
96
  computed: {
@@ -107,7 +118,7 @@ export default defineComponent({
107
118
  width: this.modalWidth,
108
119
  ...this.stylesPropToObj,
109
120
  };
110
- },
121
+ }
111
122
  },
112
123
  setup(props) {
113
124
  if (props.triggerFocusTrap) {
@@ -131,7 +142,10 @@ export default defineComponent({
131
142
  };
132
143
  }
133
144
 
134
- useBasicSetupFocusTrap('#modal-container-element', opts);
145
+ // prop used to immediately trigger the focus trap when a proper watch variable is not required
146
+ const autoTriggerFocusTrapWatcher = ref(true);
147
+
148
+ useWatcherBasedSetupFocusTrapWithDestroyIncluded(() => props.focusTrapWatcherBasedVariable ?? autoTriggerFocusTrapWatcher, '#modal-container-element', opts, true);
135
149
  }
136
150
  },
137
151
  mounted() {
@@ -11,6 +11,7 @@ export const ASYNC_BUTTON_STATES = {
11
11
 
12
12
  const TEXT = 'text';
13
13
  const TOOLTIP = 'tooltip';
14
+ const DISABLED_CLASS_STYLE = 'btn-disabled';
14
15
 
15
16
  export type AsyncButtonCallback = (success: boolean) => void;
16
17
 
@@ -152,9 +153,29 @@ export default defineComponent({
152
153
  out[`btn-${ this.size }`] = true;
153
154
  }
154
155
 
156
+ // while we are waiting for the async button to get
157
+ // it's callback we want to the button to appear as disabled
158
+ // but not being actually disabled as need it to be
159
+ // able to return the keyboard navigation focus back to it
160
+ // which can't be done while actually disabled, as per
161
+ // https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/#focusabilityofdisabledcontrols
162
+ if (this.phase === ASYNC_BUTTON_STATES.WAITING) {
163
+ out[DISABLED_CLASS_STYLE] = true;
164
+ }
165
+
166
+ // used to assist e2e testing mostly when waiting for button to return
167
+ // to it's normal state/phase
168
+ if (this.phase === ASYNC_BUTTON_STATES.ACTION) {
169
+ out['ready-for-action'] = true;
170
+ }
171
+
155
172
  return out;
156
173
  },
157
174
 
175
+ appearsDisabled(): boolean {
176
+ return this.disabled || this.phase === ASYNC_BUTTON_STATES.WAITING;
177
+ },
178
+
158
179
  displayIcon(): string {
159
180
  const exists = this.$store.getters['i18n/exists'];
160
181
  const t = this.$store.getters['i18n/t'];
@@ -204,10 +225,6 @@ export default defineComponent({
204
225
  return this.phase === ASYNC_BUTTON_STATES.WAITING;
205
226
  },
206
227
 
207
- isDisabled(): boolean {
208
- return this.disabled || this.phase === ASYNC_BUTTON_STATES.WAITING;
209
- },
210
-
211
228
  isManualRefresh() {
212
229
  return this.mode === 'manual-refresh';
213
230
  },
@@ -232,7 +249,7 @@ export default defineComponent({
232
249
 
233
250
  methods: {
234
251
  clicked() {
235
- if ( this.isDisabled ) {
252
+ if ( this.appearsDisabled ) {
236
253
  return;
237
254
  }
238
255
 
@@ -283,8 +300,8 @@ export default defineComponent({
283
300
  :class="classes"
284
301
  :name="name"
285
302
  :type="type"
286
- :disabled="isDisabled"
287
- :aria-disabled="isDisabled"
303
+ :disabled="disabled"
304
+ :aria-disabled="appearsDisabled"
288
305
  :tab-index="tabIndex"
289
306
  :data-testid="componentTestid + '-async-button'"
290
307
  @click="clicked"
@@ -36,6 +36,7 @@ export default {
36
36
  data-testid="banner-brand__img"
37
37
  file-name="banner.svg"
38
38
  :draggable="false"
39
+ :alt="t('landing.bannerImage')"
39
40
  />
40
41
  </div>
41
42
  <div