@rancher/shell 0.5.3 → 2.0.0

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 (581) hide show
  1. package/assets/data/aws-regions.json +9 -0
  2. package/assets/images/vendor/openid.svg +18 -0
  3. package/assets/styles/app.scss +1 -2
  4. package/assets/styles/fonts/_icons.scss +3 -3
  5. package/assets/styles/global/_columns.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +2 -0
  7. package/assets/styles/themes/_csp.scss +2 -2
  8. package/assets/styles/themes/_dark.scss +8 -2
  9. package/assets/styles/themes/_light.scss +2 -1
  10. package/assets/styles/themes/_suse.scss +1 -1
  11. package/assets/styles/vendor/vue-select.scss +5 -0
  12. package/assets/translations/en-us.yaml +296 -58
  13. package/assets/translations/zh-hans.yaml +5 -27
  14. package/babel.config.js +1 -1
  15. package/chart/__tests__/S3.test.ts +9 -2
  16. package/chart/monitoring/grafana/index.vue +6 -2
  17. package/chart/monitoring/prometheus/index.vue +2 -2
  18. package/chart/rancher-backup/S3.vue +11 -9
  19. package/chart/rancher-backup/index.vue +15 -5
  20. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  21. package/cloud-credential/generic.vue +18 -9
  22. package/cloud-credential/harvester.vue +11 -3
  23. package/components/AppModal.vue +167 -0
  24. package/components/AssignTo.vue +7 -4
  25. package/components/AsyncButton.vue +18 -5
  26. package/components/BackLink.vue +4 -4
  27. package/components/BannerGraphic.vue +1 -0
  28. package/components/BrandImage.vue +47 -1
  29. package/components/Carousel.vue +14 -8
  30. package/components/Certificates.vue +8 -11
  31. package/components/ClusterBadge.vue +12 -3
  32. package/components/ClusterIconMenu.vue +44 -16
  33. package/components/ClusterProviderIcon.vue +14 -3
  34. package/components/CodeMirror.vue +73 -38
  35. package/components/CommunityLinks.vue +12 -8
  36. package/components/CreateDriver.vue +81 -0
  37. package/components/CruResource.vue +51 -27
  38. package/components/DetailTop.vue +2 -2
  39. package/components/Dialog.vue +6 -5
  40. package/components/DisableAuthProviderModal.vue +14 -8
  41. package/components/DraggableZone.vue +2 -2
  42. package/components/ExplorerMembers.vue +3 -3
  43. package/components/ExplorerProjectsNamespaces.vue +6 -6
  44. package/components/FixedBanner.vue +47 -36
  45. package/components/GlobalRoleBindings.vue +26 -0
  46. package/components/Import.vue +10 -6
  47. package/components/Inactivity.vue +1 -5
  48. package/components/KeyValueView.vue +14 -10
  49. package/components/MessageLink.vue +2 -2
  50. package/components/ModalWithCard.vue +5 -8
  51. package/components/MoveModal.vue +35 -33
  52. package/components/PodSecurityAdmission.vue +3 -3
  53. package/components/PromptChangePassword.vue +33 -33
  54. package/components/PromptModal.vue +11 -21
  55. package/components/PromptRemove.vue +11 -17
  56. package/components/PromptRestore.vue +18 -16
  57. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  58. package/components/Questions/__tests__/Float.test.ts +9 -19
  59. package/components/Questions/__tests__/Int.test.ts +9 -19
  60. package/components/Questions/__tests__/String.test.ts +9 -19
  61. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  62. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  63. package/components/Questions/index.vue +18 -2
  64. package/components/ResourceCancelModal.vue +34 -29
  65. package/components/ResourceDetail/Masthead.vue +23 -7
  66. package/components/ResourceDetail/index.vue +5 -0
  67. package/components/ResourceList/Masthead.vue +28 -10
  68. package/components/ResourceList/index.vue +65 -14
  69. package/components/ResourceTable.vue +73 -19
  70. package/components/ResourceYaml.vue +1 -0
  71. package/components/SelectIconGrid.vue +3 -3
  72. package/components/SideNav.vue +15 -37
  73. package/components/SingleClusterInfo.vue +4 -4
  74. package/components/SortableTable/THead.vue +26 -12
  75. package/components/SortableTable/filtering.js +9 -1
  76. package/components/SortableTable/grouping.js +8 -1
  77. package/components/SortableTable/index.vue +142 -42
  78. package/components/SortableTable/paging.js +36 -7
  79. package/components/SortableTable/selection.js +2 -1
  80. package/components/SortableTable/sorting.js +24 -7
  81. package/components/TabTitle.vue +84 -0
  82. package/components/Tabbed/index.vue +6 -1
  83. package/components/TableDataUserIcon.vue +47 -0
  84. package/components/TypeDescription.vue +1 -0
  85. package/components/Wizard.vue +1 -0
  86. package/components/__tests__/AppModal.test.ts +98 -0
  87. package/components/__tests__/AsyncButton.test.ts +1 -3
  88. package/components/__tests__/BackLink.test.ts +1 -1
  89. package/components/__tests__/ButtonGroup.test.ts +3 -6
  90. package/components/__tests__/Carousel.test.ts +43 -0
  91. package/components/__tests__/Certificates.test.ts +29 -0
  92. package/components/__tests__/{CodeMirror.spec.ts → CodeMirror.test.ts} +5 -17
  93. package/components/__tests__/CruResource.test.ts +10 -9
  94. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  95. package/components/__tests__/FixedBanner.test.ts +5 -20
  96. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  97. package/components/__tests__/TabTitle.test.ts +129 -0
  98. package/components/auth/AzureWarning.vue +2 -2
  99. package/components/auth/RoleDetailEdit.vue +10 -0
  100. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  101. package/components/auth/login/oidc.vue +7 -1
  102. package/components/fleet/FleetClusters.vue +9 -9
  103. package/components/fleet/FleetIntro.vue +11 -17
  104. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  105. package/components/fleet/FleetRepos.vue +1 -0
  106. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  107. package/components/form/ArrayList.vue +30 -19
  108. package/components/form/ArrayListSelect.vue +9 -4
  109. package/components/form/ClusterAppearance.vue +132 -0
  110. package/components/form/ColorInput.vue +1 -0
  111. package/components/form/Error.vue +3 -3
  112. package/components/form/Footer.vue +2 -2
  113. package/components/form/GitPicker.vue +83 -38
  114. package/components/form/KeyValue.vue +67 -48
  115. package/components/form/LabeledSelect.vue +143 -43
  116. package/components/form/Labels.vue +3 -1
  117. package/components/form/NameNsDescription.vue +26 -9
  118. package/components/form/ResourceLabeledSelect.vue +187 -0
  119. package/components/form/ResourceTabs/index.vue +31 -15
  120. package/components/form/SecretSelector.vue +93 -18
  121. package/components/form/Select.vue +1 -1
  122. package/components/form/SelectOrCreateAuthSecret.vue +135 -62
  123. package/components/form/SimpleSecretSelector.vue +88 -28
  124. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  125. package/components/form/__tests__/KeyValue.test.ts +121 -12
  126. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  127. package/components/form/__tests__/NameNsDescription.test.ts +25 -15
  128. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  129. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  130. package/components/formatter/AppSummaryGraph.vue +2 -2
  131. package/components/formatter/CloudCredPublicData.vue +30 -0
  132. package/components/formatter/ClusterLink.vue +2 -2
  133. package/components/formatter/FleetSummaryGraph.vue +2 -1
  134. package/components/formatter/ImagePercentageBar.vue +0 -4
  135. package/components/formatter/IngressTarget.vue +18 -7
  136. package/components/formatter/Link.vue +2 -2
  137. package/components/formatter/LinkDetail.vue +2 -2
  138. package/components/formatter/LinkDetailImage.vue +2 -2
  139. package/components/formatter/LinkName.vue +2 -2
  140. package/components/formatter/LiveDate.vue +16 -0
  141. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  142. package/components/formatter/SecretType.vue +2 -2
  143. package/components/formatter/VirtualServiceGateways.vue +2 -2
  144. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  145. package/components/nav/Group.vue +7 -5
  146. package/components/nav/Header.vue +82 -43
  147. package/components/nav/NamespaceFilter.vue +8 -1
  148. package/components/nav/TopLevelMenu.vue +336 -125
  149. package/components/nav/Type.vue +58 -102
  150. package/components/nav/__tests__/TopLevelMenu.test.ts +370 -9
  151. package/components/nav/__tests__/Type.test.ts +321 -126
  152. package/components/nuxt/nuxt-child.js +0 -5
  153. package/components/nuxt/nuxt-error.vue +1 -1
  154. package/components/nuxt/nuxt-link.client.js +13 -95
  155. package/components/templates/default.vue +3 -3
  156. package/components/templates/error.vue +6 -10
  157. package/components/templates/standalone.vue +0 -4
  158. package/components/templates/unauthenticated.vue +1 -2
  159. package/components/user.retention/user-retention-header.vue +34 -0
  160. package/composables/useCompactInput.test.ts +36 -0
  161. package/composables/useCompactInput.ts +2 -2
  162. package/composables/useI18n.ts +26 -0
  163. package/composables/useLabeledFormElement.test.ts +135 -0
  164. package/composables/useStore.ts +16 -0
  165. package/config/home-links.js +32 -1
  166. package/config/labels-annotations.js +2 -1
  167. package/config/middleware.js +0 -6
  168. package/config/pagination-table-headers.js +57 -0
  169. package/config/pod-security-admission.ts +1 -1
  170. package/config/private-label.js +1 -3
  171. package/config/product/auth.js +1 -0
  172. package/config/product/explorer.js +167 -46
  173. package/config/product/legacy.js +3 -95
  174. package/config/product/manager.js +44 -11
  175. package/config/query-params.js +1 -0
  176. package/config/roles.ts +23 -0
  177. package/config/router/index.js +23 -0
  178. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  179. package/config/router/navigation-guards/authentication.js +63 -0
  180. package/config/router/navigation-guards/index.js +15 -0
  181. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  182. package/config/router/routes.js +487 -0
  183. package/config/settings.ts +38 -2
  184. package/config/store.js +7 -3
  185. package/config/table-headers.js +46 -1
  186. package/config/types.js +36 -16
  187. package/config/uiplugins.js +10 -5
  188. package/core/plugin-helpers.js +1 -1
  189. package/core/plugin.ts +2 -1
  190. package/core/plugins.js +289 -282
  191. package/creators/app/files/.eslintignore +0 -2
  192. package/creators/app/files/.vscode/settings.json +0 -1
  193. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  194. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  195. package/creators/pkg/init +32 -0
  196. package/detail/__tests__/service.test.ts +62 -0
  197. package/detail/catalog.cattle.io.app.vue +1 -1
  198. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  199. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  200. package/detail/namespace.vue +2 -2
  201. package/detail/networking.k8s.io.ingress.vue +52 -19
  202. package/detail/node.vue +20 -43
  203. package/detail/pod.vue +1 -68
  204. package/detail/provisioning.cattle.io.cluster.vue +2 -1
  205. package/detail/service.vue +1 -1
  206. package/detail/workload/index.vue +2 -15
  207. package/dialog/AddCustomBadgeDialog.vue +318 -161
  208. package/dialog/DeactivateDriverDialog.vue +118 -0
  209. package/dialog/RollbackWorkloadDialog.vue +2 -2
  210. package/dialog/RotateCertificatesDialog.vue +0 -21
  211. package/directives/clean-html.js +15 -0
  212. package/directives/clean-tooltip.js +32 -0
  213. package/directives/focus.js +41 -0
  214. package/directives/int-number.js +21 -0
  215. package/directives/positive-int-number.js +19 -0
  216. package/directives/trim-whitespace.js +19 -0
  217. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  218. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  219. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  220. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  221. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  222. package/edit/__tests__/nodeDriver.test.ts +107 -0
  223. package/edit/__tests__/service.test.ts +1 -5
  224. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  225. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  226. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  227. package/edit/auth/__tests__/azuread.test.ts +241 -0
  228. package/edit/auth/__tests__/oidc.test.ts +137 -0
  229. package/edit/auth/azuread.vue +133 -31
  230. package/edit/auth/github.vue +5 -17
  231. package/edit/auth/googleoauth.vue +5 -18
  232. package/edit/auth/ldap/index.vue +5 -17
  233. package/edit/auth/oidc.vue +143 -42
  234. package/edit/auth/saml.vue +5 -14
  235. package/edit/catalog.cattle.io.clusterrepo.vue +175 -20
  236. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  237. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  238. package/edit/cloudcredential.vue +26 -4
  239. package/edit/configmap.vue +10 -4
  240. package/edit/fleet.cattle.io.gitrepo.vue +7 -4
  241. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  242. package/edit/kontainerDriver.vue +65 -0
  243. package/edit/logging-flow/Match.vue +10 -9
  244. package/edit/logging-flow/index.vue +4 -19
  245. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  246. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  247. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  248. package/edit/management.cattle.io.project.vue +2 -1
  249. package/edit/management.cattle.io.setting.vue +20 -0
  250. package/edit/management.cattle.io.user.vue +2 -1
  251. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  252. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  253. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +1 -0
  254. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +3 -0
  255. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +2 -0
  256. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  257. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  258. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  259. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  260. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  261. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  262. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +45 -6
  263. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/selectors.test.ts +1 -1
  264. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  265. package/edit/nodeDriver.vue +65 -0
  266. package/edit/persistentvolume/index.vue +2 -2
  267. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +18 -9
  268. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +165 -1
  269. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +1 -1
  270. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +0 -3
  271. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  272. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +70 -12
  273. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +5 -0
  274. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  275. package/edit/provisioning.cattle.io.cluster/index.vue +21 -15
  276. package/edit/provisioning.cattle.io.cluster/rke2.vue +185 -114
  277. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +67 -7
  278. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +19 -6
  279. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  280. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +7 -0
  281. package/edit/provisioning.cattle.io.cluster/tabs/etcd/S3Config.vue +1 -0
  282. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +1 -0
  283. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +3 -0
  284. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +1 -0
  285. package/edit/resources.cattle.io.backup.vue +139 -124
  286. package/edit/resources.cattle.io.restore.vue +146 -126
  287. package/edit/service.vue +1 -0
  288. package/edit/serviceaccount.vue +46 -4
  289. package/edit/workload/__tests__/Job.test.ts +1 -3
  290. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  291. package/edit/workload/mixins/workload.js +34 -1
  292. package/edit/workload/storage/emptyDir.vue +2 -2
  293. package/initialize/App.vue +75 -0
  294. package/initialize/app-extended.js +128 -0
  295. package/initialize/entry-helpers.js +549 -0
  296. package/initialize/entry.js +32 -0
  297. package/initialize/install-components.js +23 -0
  298. package/initialize/install-directives.js +59 -0
  299. package/initialize/install-plugins.js +123 -0
  300. package/list/__tests__/workload.test.ts +1 -1
  301. package/list/cis.cattle.io.clusterscan.vue +16 -10
  302. package/list/group.principal.vue +2 -2
  303. package/list/management.cattle.io.feature.vue +11 -7
  304. package/list/management.cattle.io.user.vue +36 -3
  305. package/list/networking.k8s.io.ingress.vue +36 -0
  306. package/list/node.vue +211 -73
  307. package/list/provisioning.cattle.io.cluster.vue +17 -4
  308. package/list/ui.cattle.io.navlink.vue +2 -2
  309. package/list/workload.vue +22 -0
  310. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  311. package/machine-config/__tests__/vmwarevsphere.test.ts +162 -59
  312. package/machine-config/amazonec2.vue +1 -1
  313. package/machine-config/azure.vue +38 -21
  314. package/machine-config/generic.vue +11 -15
  315. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  316. package/machine-config/vmwarevsphere.vue +20 -11
  317. package/middleware/authenticated.js +9 -361
  318. package/mixins/__tests__/chart.test.ts +48 -6
  319. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  320. package/mixins/auth-config.js +3 -2
  321. package/mixins/brand.js +75 -57
  322. package/mixins/chart.js +27 -13
  323. package/mixins/create-edit-view/index.js +2 -2
  324. package/mixins/fetch.client.js +42 -48
  325. package/mixins/labeled-form-element.ts +21 -1
  326. package/mixins/page-actions.js +7 -5
  327. package/mixins/resource-fetch-api-pagination.js +304 -0
  328. package/mixins/resource-fetch-namespaced.js +1 -1
  329. package/mixins/resource-fetch.js +46 -5
  330. package/models/__tests__/cluster.test.ts +44 -0
  331. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  332. package/models/__tests__/schema.tests.ts +24 -0
  333. package/models/__tests__/steve-schema.test.ts +73 -0
  334. package/models/__tests__/workload.test.ts +1 -1
  335. package/models/catalog.cattle.io.app.js +8 -0
  336. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  337. package/models/catalog.cattle.io.uiplugin.js +7 -8
  338. package/models/cis.cattle.io.clusterscan.js +29 -8
  339. package/models/cloudcredential.js +9 -1
  340. package/models/cluster/node.js +4 -0
  341. package/models/cluster/schema.js +6 -0
  342. package/models/cluster.js +33 -0
  343. package/models/driver.js +62 -0
  344. package/models/fleet.cattle.io.cluster.js +23 -11
  345. package/models/fleet.cattle.io.gitrepo.js +10 -0
  346. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  347. package/models/kontainerdriver.js +68 -0
  348. package/models/management/schema.js +6 -0
  349. package/models/management.cattle.io.authconfig.js +3 -2
  350. package/models/management.cattle.io.cluster.js +5 -4
  351. package/models/management.cattle.io.globalrole.js +2 -0
  352. package/models/management.cattle.io.user.js +67 -2
  353. package/models/monitoring.coreos.com.receiver.js +3 -1
  354. package/models/monitoring.coreos.com.route.js +1 -1
  355. package/models/networking.k8s.io.ingress.js +2 -1
  356. package/models/nodedriver.js +68 -0
  357. package/models/provisioning.cattle.io.cluster.js +34 -1
  358. package/models/schema.js +28 -7
  359. package/models/service.js +2 -0
  360. package/models/steve-schema.ts +254 -0
  361. package/models/workload.js +1 -0
  362. package/package.json +6 -5
  363. package/pages/about.vue +12 -5
  364. package/pages/account/index.vue +7 -2
  365. package/pages/auth/login.vue +106 -102
  366. package/pages/auth/logout.vue +2 -2
  367. package/pages/auth/setup.vue +57 -64
  368. package/pages/auth/verify.vue +17 -17
  369. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  370. package/pages/c/_cluster/apps/charts/index.vue +37 -13
  371. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  372. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  373. package/pages/c/_cluster/auth/config/index.vue +15 -9
  374. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  375. package/pages/c/_cluster/auth/user.retention/index.vue +384 -0
  376. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  377. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  378. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  379. package/pages/c/_cluster/explorer/index.vue +231 -72
  380. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  381. package/pages/c/_cluster/explorer/tools/index.vue +12 -176
  382. package/pages/c/_cluster/fleet/index.vue +88 -93
  383. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  384. package/pages/c/_cluster/longhorn/index.vue +52 -17
  385. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  386. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  387. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  388. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +94 -0
  389. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  390. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  391. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +63 -0
  392. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  393. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  394. package/pages/c/_cluster/monitoring/index.vue +1 -17
  395. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  396. package/pages/c/_cluster/neuvector/index.vue +1 -0
  397. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  398. package/pages/c/_cluster/settings/banners.vue +86 -8
  399. package/pages/c/_cluster/settings/brand.vue +258 -36
  400. package/pages/c/_cluster/settings/index.vue +4 -4
  401. package/pages/c/_cluster/settings/links.vue +5 -3
  402. package/pages/c/_cluster/settings/performance.vue +71 -2
  403. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  404. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +10 -7
  405. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  406. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  407. package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
  408. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  409. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  410. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  411. package/pages/c/_cluster/uiplugins/index.vue +38 -52
  412. package/pages/diagnostic.vue +1 -0
  413. package/pages/fail-whale.vue +103 -41
  414. package/pages/home.vue +81 -24
  415. package/pages/prefs.vue +8 -3
  416. package/pages/support/index.vue +12 -2
  417. package/plugins/clean-html-directive.js +5 -12
  418. package/plugins/clean-tooltip-directive.js +6 -31
  419. package/plugins/codemirror.js +0 -9
  420. package/plugins/dashboard-store/__tests__/mutations.test.ts +296 -313
  421. package/plugins/dashboard-store/actions.js +140 -32
  422. package/plugins/dashboard-store/getters.js +86 -39
  423. package/plugins/dashboard-store/index.js +0 -99
  424. package/plugins/dashboard-store/mutations.js +150 -48
  425. package/plugins/dashboard-store/resource-class.js +14 -109
  426. package/plugins/directives.js +6 -39
  427. package/plugins/ember-cookie.js +13 -0
  428. package/plugins/global-formatters.js +26 -5
  429. package/plugins/i18n.js +90 -56
  430. package/plugins/int-number.js +6 -20
  431. package/plugins/plugin.js +3 -3
  432. package/plugins/positive-int-number.js +6 -17
  433. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +124 -31
  434. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  435. package/plugins/steve/__tests__/subscribe.spec.ts +109 -0
  436. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  437. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  438. package/plugins/steve/actions.js +0 -1
  439. package/plugins/steve/getters.js +183 -63
  440. package/plugins/steve/hybrid-class.js +5 -1
  441. package/plugins/steve/mutations.js +29 -5
  442. package/plugins/steve/norman-class.js +123 -2
  443. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  444. package/plugins/steve/schema.d.ts +22 -0
  445. package/plugins/steve/steve-pagination-utils.ts +368 -0
  446. package/plugins/steve/subscribe.js +37 -75
  447. package/plugins/trim-whitespace.js +6 -34
  448. package/plugins/vue-js-modal.js +1 -1
  449. package/public/index.html +1 -0
  450. package/rancher-components/Accordion/Accordion.vue +3 -2
  451. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  452. package/rancher-components/Banner/Banner.test.ts +1 -5
  453. package/rancher-components/Banner/Banner.vue +2 -2
  454. package/rancher-components/Card/Card.vue +4 -4
  455. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  456. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  457. package/rancher-components/Form/LabeledInput/LabeledInput.vue +66 -30
  458. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  459. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  460. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  461. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  462. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  463. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  464. package/rancher-components/StringList/StringList.vue +8 -8
  465. package/rancher-components/components/Accordion/Accordion.vue +3 -2
  466. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  467. package/rancher-components/components/Banner/Banner.test.ts +1 -5
  468. package/rancher-components/components/Banner/Banner.vue +2 -2
  469. package/rancher-components/components/Card/Card.vue +4 -4
  470. package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
  471. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  472. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +66 -30
  473. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
  474. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  475. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  476. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  477. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  478. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  479. package/rancher-components/components/StringList/StringList.vue +8 -8
  480. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +27 -8
  481. package/scripts/clean +1 -1
  482. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  483. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  484. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  485. package/scripts/extension/helm/package/Dockerfile +1 -1
  486. package/scripts/extension/helm/scripts/patch +27 -0
  487. package/scripts/extension/publish +6 -6
  488. package/scripts/serve-pkgs +0 -2
  489. package/scripts/test-plugins-build.sh +6 -6
  490. package/scripts/vue-migrate.js +683 -0
  491. package/store/__tests__/catalog.test.ts +224 -0
  492. package/store/auth.js +23 -4
  493. package/store/aws.js +53 -6
  494. package/store/catalog.js +21 -5
  495. package/store/cru-resource.ts +26 -0
  496. package/store/customisation.js +35 -0
  497. package/store/features.js +6 -4
  498. package/store/index.js +132 -39
  499. package/store/plugins.js +8 -4
  500. package/store/type-map.js +143 -143
  501. package/store/type-map.utils.ts +226 -0
  502. package/tsconfig.json +0 -1
  503. package/tsconfig.paths.json +4 -1
  504. package/types/components/labeledSelect.ts +50 -0
  505. package/types/resources/settings.d.ts +32 -0
  506. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  507. package/types/shell/index.d.ts +996 -782
  508. package/types/store/dashboard-store.types.ts +42 -0
  509. package/types/store/pagination.types.ts +457 -0
  510. package/types/store/type-map.ts +30 -0
  511. package/types/store/vuex.d.ts +9 -0
  512. package/types/vue-shim.d.ts +51 -0
  513. package/utils/__tests__/cluster.test.ts +20 -18
  514. package/utils/__tests__/create-yaml.test.ts +359 -2
  515. package/utils/__tests__/kontainer.test.ts +92 -0
  516. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  517. package/utils/alertmanagerconfig.js +19 -0
  518. package/utils/array.ts +40 -1
  519. package/utils/async.ts +2 -0
  520. package/utils/auth.js +152 -4
  521. package/utils/axios.js +2 -2
  522. package/utils/banners.js +103 -0
  523. package/utils/cluster.js +1 -1
  524. package/utils/config.js +4 -0
  525. package/utils/create-yaml.js +54 -27
  526. package/utils/error.js +25 -0
  527. package/utils/formatter.js +5 -3
  528. package/utils/git.ts +1 -1
  529. package/utils/install-redirect.js +1 -1
  530. package/utils/kontainer.ts +186 -0
  531. package/utils/monitoring.js +2 -37
  532. package/utils/pagination-utils.ts +154 -0
  533. package/utils/pod-security-admission.ts +1 -1
  534. package/utils/router.js +86 -0
  535. package/utils/settings.ts +46 -0
  536. package/utils/socket.js +1 -0
  537. package/utils/time.js +1 -0
  538. package/utils/title.ts +3 -0
  539. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  540. package/utils/validators/formRules/__tests__/index.test.ts +21 -0
  541. package/utils/validators/formRules/index.ts +3 -0
  542. package/utils/validators/index.js +1 -0
  543. package/vue.config.js +376 -421
  544. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  545. package/chart/monitoring/steps/uninstall-v1.vue +0 -135
  546. package/components/EventsTable.vue +0 -67
  547. package/components/TabbedLinks/index.vue +0 -94
  548. package/components/nuxt/nuxt-link.server.js +0 -16
  549. package/components/nuxt/nuxt.js +0 -101
  550. package/config/router.js +0 -425
  551. package/initialize/App.js +0 -152
  552. package/initialize/client.js +0 -734
  553. package/initialize/index.js +0 -287
  554. package/middleware/i18n.js +0 -10
  555. package/middleware/unauthenticated.js +0 -22
  556. package/mixins/v1-workload-metrics.js +0 -43
  557. package/pages/c/_cluster/apps/index.vue +0 -15
  558. package/pages/c/_cluster/auth/index.vue +0 -17
  559. package/pages/c/_cluster/index.vue +0 -15
  560. package/pages/c/_cluster/legacy/index.vue +0 -22
  561. package/pages/c/_cluster/manager/index.vue +0 -22
  562. package/pages/c/_cluster/mcapps/index.vue +0 -21
  563. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  564. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  565. package/plugins/index.js +0 -11
  566. package/plugins/portal-vue.js +0 -4
  567. package/plugins/portal.js +0 -4
  568. package/plugins/resize.js +0 -5
  569. package/plugins/shortkey.js +0 -4
  570. package/plugins/tooltip.js +0 -4
  571. package/plugins/v-select.js +0 -4
  572. package/utils/group.js +0 -70
  573. package/utils/nuxt.js +0 -638
  574. package/utils/router.scrollBehavior.js +0 -78
  575. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  576. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  577. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  578. /package/plugins/steve/__tests__/{steve-class.spec.ts → steve-class.test.ts} +0 -0
  579. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  580. /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  581. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
@@ -366,7 +366,6 @@ authConfig:
366
366
  unrestricted: 允许所有用户访问
367
367
  allowedPrincipalIds:
368
368
  title: 授权的用户和用户组
369
- associatedWarning: '注意:你认证的 {provider} 用户将作为你当前登录的 {vendor} 用户(<code>{username}</code>)的替代登录方式。此 {vendor} 用户的所有全局权限、项目和集群角色绑定也将应用到 {provider} 用户。'
370
369
  github:
371
370
  clientId:
372
371
  label: 客户端 ID
@@ -1668,7 +1667,7 @@ cluster:
1668
1667
  banner:
1669
1668
  warning: '此集群包含此表单不完全支持的 machineSelectorConfig。使用 YAML 编辑器管理完整配置。'
1670
1669
  os: '你正在将 {newOS} worker 节点添加到具有一个或多个 {existingOS} worker 节点的集群。你可能需要升级或删除某些已安装的应用。'
1671
- rke2-k3-reprovisioning: '更改集群配置可能导致节点重新配置。详情请参见 <a target="blank" href="{docsBase}/cluster-provisioning/rke-clusters/behavior-differences-between-rke1-and-rke2/" target="_blank" rel="noopener nofollow">文档</a>。'
1670
+ rke2-k3-reprovisioning: '更改集群配置可能导致节点重新配置。详情请参见 <a target="blank" href="{docsBase}/how-to-guides/new-user-guides/launch-kubernetes-with-rancher/rke1-vs-rke2-differences#cluster-api" target="_blank" rel="noopener nofollow">文档</a>。'
1672
1671
  desiredNodeGroupWarning: 没有可用于运行 Cluster Agent 的节点。要让集群变为 Active 状态,至少需要有 1 个可用的节点。
1673
1672
  haveArgInfo: 所选 Kubernetes 版本的配置信息不可用。此屏幕中可用的选项将受到限制,你可能需要使用 YAML 编辑器。
1674
1673
  rkeTemplateUpgrade: 模板修订版 {name} 可用于升级
@@ -2313,7 +2312,6 @@ glance:
2313
2312
  version: Kubernetes 版本
2314
2313
  monitoringDashboard: 监控仪表板
2315
2314
  installMonitoring: 安装 Monitoring
2316
- v1MonitoringInstalled: 已安装 Monitoring V1
2317
2315
  clusterInfo: 集群信息
2318
2316
  eventsTable: 完整事件列表
2319
2317
 
@@ -2793,7 +2791,7 @@ logging:
2793
2791
  dockerRootDirectory: Docker 根目录
2794
2792
  systemdLogPath: systemd 日志路径
2795
2793
  tooltip: '某些 Kubernetes 发行版在 <code>journald</code>中记录日志。你需要定义<code>systemdLogPath</code> 以收集日志。默认路径是<code>/run/log/journal</code>,但某些 Linux 发行版不默认使用该路径。'
2796
- url: '<a href="https://ranchermanager.docs.rancher.com/v2.8/integrations-in-rancher/logging/logging-helm-chart-options" target="_blank" rel="noopener nofollow noreferrer">了解更多</a>'
2794
+ url: '<a href="{docsBase}/integrations-in-rancher/logging/logging-helm-chart-options" target="_blank" rel="noopener nofollow noreferrer">了解更多</a>'
2797
2795
  default: /run/log/journal
2798
2796
  elasticsearch:
2799
2797
  host: 主机
@@ -3062,7 +3060,7 @@ members:
3062
3060
  clusterMembers: 集群成员
3063
3061
  clusterAndProject: 集群和项目成员
3064
3062
  createActionLabel: 添加
3065
- clusterMemebership: 集群成员
3063
+ clusterMembership: 集群成员
3066
3064
  projectMembership: 项目成员
3067
3065
  clusterPermissions:
3068
3066
  noDescription: 已创建用户 - 没有描述
@@ -3290,15 +3288,6 @@ monitoring:
3290
3288
  bearerTokenSecret: 持有者令牌密文
3291
3289
  basicAuthUsername: 具有基本认证用户名的密文
3292
3290
  basicAuthPassword: 具有基本认证密码的密文
3293
- installSteps:
3294
- uninstallV1:
3295
- stepTitle: 卸载 V1
3296
- stepSubtext: 卸载旧版 Monitoring
3297
- warning1: 已部署 Monitoring V1。你需要先卸载 Monitoring V1 才能安装 Monitoring V2。
3298
- warning2: <a target="blank" href="{docsBase}/monitoring-alerting/guides/migrating/" target='_blank' rel='noopener nofollow'>了解迁移到 Monitoring V2 的步骤</a>。
3299
- promptDescription: <div class="mt-20 mb-20">你正在尝试卸载 Monitoring V1。请确保你已阅读迁移步骤。</div>
3300
- success1: Monitoring V1 已成功卸载。
3301
- success2: 点击下一步继续
3302
3291
  tabs:
3303
3292
  alerting: 告警
3304
3293
  general: 通用
@@ -6964,7 +6953,7 @@ podAffinity:
6964
6953
  keyValue:
6965
6954
  keyPlaceholder: 例如:foo
6966
6955
  valuePlaceholder: 例如:bar
6967
- protip: '把多行 <em>key=value</em> 或 <em>key: value</em> 键值对复制到各字段中,以便批量输入'
6956
+ protip: '把多行 <em>key=value</em> 或 <em>key:value</em> 键值对复制到各字段中,以便批量输入'
6968
6957
 
6969
6958
  registryMirror:
6970
6959
  header: Mirror
@@ -7115,7 +7104,7 @@ performance:
7115
7104
  checkboxLabel: 禁用 WebSocket 通知
7116
7105
  gc:
7117
7106
  label: 资源垃圾回收
7118
- description: UI 将在本地缓存 kuberentes 资源,避免这些资源被重新抓取。在某些情况下,这可能会导致浏览器中存储了大量数据。你可以启用此设置进行定期删除。
7107
+ description: UI 将在本地缓存 Kubernetes 资源,避免这些资源被重新抓取。在某些情况下,这可能会导致浏览器中存储了大量数据。你可以启用此设置进行定期删除。
7119
7108
  checkboxLabel: 启用垃圾回收
7120
7109
  whenRun:
7121
7110
  description: 垃圾回收运行的时候更新
@@ -7339,17 +7328,6 @@ embedding:
7339
7328
  retry: 重试
7340
7329
  unavailable: Cluster Manager UI 不可用
7341
7330
 
7342
- v1ClusterTools:
7343
- monitoring:
7344
- label: Monitoring(旧版)
7345
- description: '旧版 Monitoring V1。自 Rancher 2.5.0 起,我们已弃用 Monitoring V1。了解<a target="blank" href="{docsBase}/monitoring-alerting/guides/migrating/">迁移到 Monitoring V2 的步骤</a>。'
7346
- logging:
7347
- label: Logging(旧版)
7348
- description: '旧版 Logging V1。自 Rancher 2.5.0 起,我们已弃用 Logging V1。了解<a target="blank" href="{docsBase}/logging/migrating/">迁移到 Logging V2 的步骤</a>。'
7349
- istio:
7350
- label: Istio(旧版)
7351
- description: '旧版 Istio V1。自 Rancher 2.5.0 起,我们已弃用 Istio V1.5。了解<a target="blank" href="{docsBase}/istio/#migrate-from-previous-istio-version">迁移到最新版本</a> 的更多信息。'
7352
-
7353
7331
  legacy:
7354
7332
  alerts: 告警
7355
7333
  apps: 应用
package/babel.config.js CHANGED
@@ -18,7 +18,7 @@ module.exports = function(api) {
18
18
  }
19
19
  };
20
20
 
21
- const plugins = [];
21
+ const plugins = ['@babel/plugin-transform-nullish-coalescing-operator'];
22
22
 
23
23
  if (process.env.NODE_ENV === 'test') {
24
24
  plugins.push('transform-require-context');
@@ -9,8 +9,15 @@ const localVue = createLocalVue();
9
9
  localVue.use(Vuex);
10
10
 
11
11
  describe('rancher-backup: S3', () => {
12
- const mockStore = { getters: { 'i18n/t': (text: string) => text, t: (text: string) => text } };
13
- const wrapper = mount(S3, { mocks: { $store: mockStore } });
12
+ const mockStore = {
13
+ getters: {
14
+ 'i18n/t': (text: string) => text,
15
+ t: (text: string) => text,
16
+ 'cluster/all': () => [],
17
+ 'cluster/paginationEnabled': () => false
18
+ }
19
+ };
20
+ const wrapper = mount(S3, { mocks: { $store: mockStore, $fetchState: { pending: false } } });
14
21
 
15
22
  it('should emit invalid when form is not filled', () => {
16
23
  expect(wrapper.emitted('valid')).toHaveLength(1);
@@ -5,6 +5,7 @@ import LabeledSelect from '@shell/components/form/LabeledSelect';
5
5
  import KeyValue from '@shell/components/form/KeyValue';
6
6
  import ArrayList from '@shell/components/form/ArrayList';
7
7
  import StorageClassSelector from '@shell/chart/monitoring/StorageClassSelector';
8
+ import { DEFAULT_GRAFANA_STORAGE_SIZE } from '@shell/config/types';
8
9
 
9
10
  export default {
10
11
  components: {
@@ -139,7 +140,7 @@ export default {
139
140
  newValsOut = {
140
141
  accessModes: null,
141
142
  storageClassName: null,
142
- size: '10Gi',
143
+ size: DEFAULT_GRAFANA_STORAGE_SIZE,
143
144
  subPath: null,
144
145
  type: 'pvc',
145
146
  annotations: null,
@@ -151,7 +152,7 @@ export default {
151
152
  newValsOut = {
152
153
  accessModes: null,
153
154
  storageClassName: null,
154
- size: '10Gi',
155
+ size: DEFAULT_GRAFANA_STORAGE_SIZE,
155
156
  subPath: null,
156
157
  type: 'statefulset',
157
158
  enabled: true,
@@ -236,6 +237,7 @@ export default {
236
237
  :labels="persistentStorageTypeLabels"
237
238
  :mode="mode"
238
239
  :options="persistentStorageTypes"
240
+ data-testid="radio-group-input-grafana-storage"
239
241
  />
240
242
  </div>
241
243
  </div>
@@ -259,6 +261,7 @@ export default {
259
261
  v-model="value.grafana.persistence.size"
260
262
  :label="t('monitoring.grafana.storage.size')"
261
263
  :mode="mode"
264
+ data-testid="grafana-storage-pvc-size"
262
265
  />
263
266
  </div>
264
267
  <div class="col span-6">
@@ -325,6 +328,7 @@ export default {
325
328
  v-model="value.grafana.persistence.size"
326
329
  :label="t('monitoring.grafana.storage.size')"
327
330
  :mode="mode"
331
+ data-testid="grafana-storage-statefulset-size"
328
332
  />
329
333
  </div>
330
334
  <div class="col span-6">
@@ -197,12 +197,12 @@ export default {
197
197
  :key="wl.id"
198
198
  class="mt-10"
199
199
  >
200
- <nuxt-link
200
+ <router-link
201
201
  :to="wl.link"
202
202
  class="btn role-tertiary"
203
203
  >
204
204
  {{ wl.label }}
205
- </nuxt-link>
205
+ </router-link>
206
206
  </div>
207
207
  </template>
208
208
  </Banner>
@@ -2,15 +2,16 @@
2
2
  import { LabeledInput } from '@components/Form/LabeledInput';
3
3
  import { Checkbox } from '@components/Form/Checkbox';
4
4
  import FileSelector from '@shell/components/form/FileSelector';
5
- import LabeledSelect from '@shell/components/form/LabeledSelect';
5
+ import ResourceLabeledSelect from '@shell/components/form/ResourceLabeledSelect';
6
6
  import { mapGetters } from 'vuex';
7
+ import { SECRET } from '@shell/config/types';
7
8
 
8
9
  export default {
9
10
  components: {
10
11
  LabeledInput,
11
12
  Checkbox,
12
13
  FileSelector,
13
- LabeledSelect,
14
+ ResourceLabeledSelect,
14
15
  },
15
16
 
16
17
  props: {
@@ -25,10 +26,10 @@ export default {
25
26
  default: 'create'
26
27
  },
27
28
 
28
- secrets: {
29
- type: Array,
30
- default: () => []
31
- }
29
+ },
30
+
31
+ data() {
32
+ return { SECRET };
32
33
  },
33
34
 
34
35
  mounted() {
@@ -44,6 +45,7 @@ export default {
44
45
  this.$emit('valid', this.valid);
45
46
  }
46
47
  },
48
+
47
49
  computed: {
48
50
  credentialSecret: {
49
51
  get() {
@@ -75,7 +77,7 @@ export default {
75
77
  // eslint-disable-next-line no-console
76
78
  console.warn(e);
77
79
  }
78
- }
80
+ },
79
81
  },
80
82
 
81
83
  created() {
@@ -92,13 +94,13 @@ export default {
92
94
  <div>
93
95
  <div class="row mb-10">
94
96
  <div class="col span-6">
95
- <LabeledSelect
97
+ <ResourceLabeledSelect
96
98
  v-model="credentialSecret"
97
99
  :get-option-label="opt=>opt.metadata.name || ''"
98
100
  option-key="id"
99
101
  :mode="mode"
100
- :options="secrets"
101
102
  :label="t('backupRestoreOperator.s3.credentialSecretName')"
103
+ :resource-type="SECRET"
102
104
  />
103
105
  </div>
104
106
  <div class="col span-6">
@@ -7,7 +7,7 @@ import { LabeledInput } from '@components/Form/LabeledInput';
7
7
  import { Banner } from '@components/Banner';
8
8
  import { get } from '@shell/utils/object';
9
9
  import { allHash } from '@shell/utils/promise';
10
- import { STORAGE_CLASS, SECRET, PV } from '@shell/config/types';
10
+ import { STORAGE_CLASS, PV } from '@shell/config/types';
11
11
  import { mapGetters } from 'vuex';
12
12
  import { STORAGE } from '@shell/config/labels-annotations';
13
13
 
@@ -41,10 +41,8 @@ export default {
41
41
  const hash = await allHash({
42
42
  storageClasses: this.$store.dispatch('cluster/findAll', { type: STORAGE_CLASS }),
43
43
  persistentVolumes: this.$store.dispatch('cluster/findAll', { type: PV }),
44
- secrets: this.$store.dispatch('cluster/findAll', { type: SECRET }),
45
44
  });
46
45
 
47
- this.secrets = hash.secrets;
48
46
  this.storageClasses = hash.storageClasses;
49
47
  this.persistentVolumes = hash.persistentVolumes;
50
48
 
@@ -89,10 +87,23 @@ export default {
89
87
 
90
88
  watch: {
91
89
  storageSource(neu) {
90
+ if (!this.value.persistence) {
91
+ this.value.persistence = {};
92
+ }
93
+ if (!this.value.s3) {
94
+ this.value.s3 = {};
95
+ }
92
96
  switch (neu) {
93
97
  case 'pickSC':
94
98
  this.value.persistence.enabled = true;
95
99
  this.value.s3.enabled = false;
100
+ if (this.value.persistence.storageClass) {
101
+ const matchedStorageClass = this.storageClasses.find((sc) => sc.id === this.value.persistence.storageClass);
102
+
103
+ if (matchedStorageClass) {
104
+ this.storageClass = matchedStorageClass;
105
+ }
106
+ }
96
107
  if (this.defaultStorageClass && (!this.value.persistence.storageClass || this.value.persistence.storageClass === '-' )) {
97
108
  this.value.persistence.storageClass = this.defaultStorageClass.id;
98
109
  this.storageClass = this.defaultStorageClass;
@@ -155,7 +166,7 @@ export default {
155
166
  },
156
167
  updatePageValid(update) {
157
168
  this.$emit('valid', update);
158
- }
169
+ },
159
170
  },
160
171
  get
161
172
  };
@@ -182,7 +193,6 @@ export default {
182
193
  <S3
183
194
  v-if="storageSource==='s3'"
184
195
  :value="value.s3"
185
- :secrets="secrets"
186
196
  :mode="mode"
187
197
  @valid="updatePageValid($event)"
188
198
  />
@@ -0,0 +1,18 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import HarvesterCloudCreds from '@shell/cloud-credential/harvester.vue';
3
+
4
+ const mockStore = { getters: { 'i18n/t': jest.fn() } };
5
+
6
+ describe('cloud credentials: Harvester', () => {
7
+ const wrapper = mount(HarvesterCloudCreds, {
8
+ propsData: { value: {} },
9
+ mocks: { $store: mockStore }
10
+ });
11
+
12
+ it('should display the warning banner for token expiration', async() => {
13
+ const warningBanner = wrapper.find('[data-testid="harvester-token-expiration-warning-banner"]');
14
+
15
+ expect(warningBanner.exists()).toBe(true);
16
+ expect(warningBanner.isVisible()).toBe(true);
17
+ });
18
+ });
@@ -3,10 +3,13 @@ import CreateEditView from '@shell/mixins/create-edit-view';
3
3
  import KeyValue from '@shell/components/form/KeyValue';
4
4
  import { Banner } from '@components/Banner';
5
5
  import { simplify, iffyFields, likelyFields } from '@shell/store/plugins';
6
+ import Loading from '@shell/components/Loading';
6
7
 
7
8
  export default {
8
- components: { KeyValue, Banner },
9
- mixins: [CreateEditView],
9
+ components: {
10
+ KeyValue, Banner, Loading
11
+ },
12
+ mixins: [CreateEditView],
10
13
 
11
14
  props: {
12
15
  driverName: {
@@ -15,19 +18,19 @@ export default {
15
18
  }
16
19
  },
17
20
 
18
- data() {
21
+ async fetch() {
19
22
  let keyOptions = [];
20
23
 
21
- const normanType = this.$store.getters['plugins/credentialFieldForDriver'](this.driverName);
22
- const normanSchema = this.$store.getters['rancher/schemaFor'](`${ normanType }credentialconfig`);
24
+ const { normanSchema } = this;
23
25
 
24
26
  if ( normanSchema?.resourceFields ) {
25
27
  keyOptions = Object.keys(normanSchema.resourceFields);
26
28
  } else {
27
- keyOptions = this.$store.getters['plugins/fieldNamesForDriver'](this.driverName);
29
+ keyOptions = await this.$store.getters['plugins/fieldNamesForDriver'](this.driverName);
28
30
  }
29
31
 
30
- // Prepopulate empty values for keys that sound like they're cloud-credential-ey
32
+ this.keyOptions = keyOptions;
33
+
31
34
  const keys = [];
32
35
 
33
36
  for ( const k of keyOptions ) {
@@ -43,11 +46,16 @@ export default {
43
46
  this.value.setData(k, '');
44
47
  }
45
48
  }
49
+ },
50
+
51
+ data() {
52
+ const normanType = this.$store.getters['plugins/credentialFieldForDriver'](this.driverName);
53
+ const normanSchema = this.$store.getters['rancher/schemaFor'](`${ normanType }credentialconfig`);
46
54
 
47
55
  return {
48
56
  hasSupport: !!normanSchema,
49
- keyOptions,
50
57
  errors: null,
58
+ normanSchema,
51
59
  };
52
60
  },
53
61
 
@@ -67,7 +75,8 @@ export default {
67
75
  </script>
68
76
 
69
77
  <template>
70
- <div>
78
+ <Loading v-if="$fetchState.pending" />
79
+ <div v-else>
71
80
  <Banner
72
81
  v-if="!hasSupport"
73
82
  color="info"
@@ -1,12 +1,13 @@
1
1
  <script>
2
2
  import CreateEditView from '@shell/mixins/create-edit-view';
3
3
  import LabeledSelect from '@shell/components/form/LabeledSelect';
4
+ import { Banner } from '@components/Banner';
4
5
 
5
6
  import { get, set } from '@shell/utils/object';
6
7
  import { MANAGEMENT, VIRTUAL_HARVESTER_PROVIDER } from '@shell/config/types';
7
8
 
8
9
  export default {
9
- components: { LabeledSelect },
10
+ components: { LabeledSelect, Banner },
10
11
  mixins: [CreateEditView],
11
12
 
12
13
  async fetch() {
@@ -47,11 +48,11 @@ export default {
47
48
 
48
49
  const currentCluster = this.$store.getters['management/all'](MANAGEMENT.CLUSTER).find((x) => x.id === neu);
49
50
 
50
- this.$nuxt.$loading.start();
51
+ window.$globalApp.$loading.start();
51
52
 
52
53
  const kubeconfigContent = await currentCluster.generateKubeConfig();
53
54
 
54
- this.$nuxt.$loading.finish();
55
+ window.$globalApp.$loading.finish();
55
56
 
56
57
  this.value.setData('kubeconfigContent', kubeconfigContent);
57
58
  },
@@ -97,6 +98,13 @@ export default {
97
98
 
98
99
  <template>
99
100
  <div>
101
+ <div class="row mb-10">
102
+ <Banner
103
+ color="warning"
104
+ label-key="cluster.credential.harvester.tokenExpirationWarning"
105
+ data-testid="harvester-token-expiration-warning-banner"
106
+ />
107
+ </div>
100
108
  <div class="row mb-10">
101
109
  <div
102
110
  class="col span-6"
@@ -0,0 +1,167 @@
1
+ <script lang="ts">
2
+ import { defineComponent } from 'vue';
3
+
4
+ export default defineComponent({
5
+ name: 'AppModal',
6
+ inheritAttrs: false,
7
+ props: {
8
+ /**
9
+ * If set to false, it will not be possible to close modal by clicking on
10
+ * the background or by pressing Esc key.
11
+ */
12
+ clickToClose: {
13
+ type: Boolean,
14
+ default: true,
15
+ },
16
+ /**
17
+ * Width in pixels or percents (50, "50px", "50%").
18
+ *
19
+ * Supported string values are <number>% and <number>px
20
+ */
21
+ width: {
22
+ type: [Number, String],
23
+ default: 600,
24
+ validator(value) {
25
+ if (typeof value === 'number') {
26
+ return value > 0;
27
+ }
28
+
29
+ if (typeof value === 'string') {
30
+ return /^(0*(?:[1-9][0-9]*|0)\.?\d*)+(px|%)$/.test(value);
31
+ }
32
+
33
+ return false;
34
+ }
35
+ },
36
+ /**
37
+ * List of class that will be applied to the modal window
38
+ */
39
+ customClass: {
40
+ type: String,
41
+ default: '',
42
+ },
43
+ /**
44
+ * Style that will be applied to the modal window
45
+ */
46
+ styles: {
47
+ type: String,
48
+ default: '',
49
+ },
50
+ /**
51
+ * Name of the modal
52
+ */
53
+ name: {
54
+ type: String,
55
+ default: '',
56
+ }
57
+ },
58
+ computed: {
59
+ modalWidth(): string {
60
+ const uom = typeof (this.width) === 'number' ? 'px' : '';
61
+
62
+ return `${ this.width }${ uom }`;
63
+ },
64
+ stylesPropToObj(): object {
65
+ return this.styles.split(';')
66
+ .map((line) => line.trim().split(':'))
67
+ .reduce((lines, [key, val]) => {
68
+ return {
69
+ ...lines,
70
+ [key]: val
71
+ };
72
+ }, { });
73
+ },
74
+ modalStyles(): object {
75
+ return {
76
+ width: this.modalWidth,
77
+ ...this.stylesPropToObj,
78
+ };
79
+ }
80
+ },
81
+ mounted() {
82
+ document.addEventListener('keydown', this.handleEscapeKey);
83
+ },
84
+ beforeDestroy() {
85
+ document.removeEventListener('keydown', this.handleEscapeKey);
86
+ },
87
+ methods: {
88
+ handleClickOutside(event: MouseEvent) {
89
+ if (
90
+ this.clickToClose &&
91
+ this.$refs.modalRef &&
92
+ !(this.$refs.modalRef as HTMLElement).contains(event.target as Node)
93
+ ) {
94
+ this.$emit('close');
95
+ }
96
+ },
97
+ handleEscapeKey(event: KeyboardEvent) {
98
+ if (this.clickToClose && event.key === 'Escape') {
99
+ this.$emit('close');
100
+ }
101
+ }
102
+ }
103
+ });
104
+ </script>
105
+
106
+ <template>
107
+ <mounting-portal
108
+ mountTo="#modals"
109
+ name="source"
110
+ append
111
+ >
112
+ <transition
113
+ name="modal-fade"
114
+ appear
115
+ >
116
+ <div
117
+ class="modal-overlay"
118
+ :data-modal="name"
119
+ @click="handleClickOutside"
120
+ >
121
+ <div
122
+ v-bind="$attrs"
123
+ ref="modalRef"
124
+ :class="customClass"
125
+ class="modal-container"
126
+ :style="modalStyles"
127
+ @click.stop
128
+ >
129
+ <slot><!--Empty content--></slot>
130
+ </div>
131
+ </div>
132
+ </transition>
133
+ </mounting-portal>
134
+ </template>
135
+
136
+ <style lang="scss">
137
+ .modal-overlay {
138
+ position: absolute;
139
+ top: 0;
140
+ left: 0;
141
+ width: 100vw;
142
+ height: 100vh;
143
+ background-color: var(--overlay-bg);
144
+ display: flex;
145
+ justify-content: center;
146
+ align-items: center;
147
+ z-index: 20;
148
+
149
+ .modal-container {
150
+ background-color: var(--modal-bg);
151
+ border-radius: var(--border-radius);
152
+ max-height: 95vh;
153
+ overflow: auto;
154
+ border: 2px solid var(--modal-border);
155
+ }
156
+ }
157
+
158
+ .modal-fade-enter-active,
159
+ .modal-fade-leave-active {
160
+ transition: opacity 200ms;
161
+ }
162
+
163
+ .modal-fade-enter,
164
+ .modal-fade-leave-to {
165
+ opacity: 0;
166
+ }
167
+ </style>
@@ -25,6 +25,7 @@ export default {
25
25
  moveTo: this.workspace,
26
26
  loaded: false,
27
27
  allWorkspaces: [],
28
+ showModal: false,
28
29
  };
29
30
  },
30
31
 
@@ -51,9 +52,9 @@ export default {
51
52
  this.allWorkspaces = await this.$store.dispatch('management/findAll', { type: FLEET.WORKSPACE });
52
53
  this.moveTo = this.workspace;
53
54
  this.loaded = true;
54
- this.$modal.show('assignTo');
55
+ this.showModal = true;
55
56
  } else {
56
- this.$modal.hide('assignTo');
57
+ this.showModal = false;
57
58
  }
58
59
  }
59
60
  },
@@ -105,12 +106,14 @@ export default {
105
106
  </script>
106
107
 
107
108
  <template>
108
- <modal
109
+ <app-modal
110
+ v-if="showModal"
109
111
  class="assign-modal"
110
112
  name="assignTo"
111
113
  styles="background-color: var(--nav-bg); border-radius: var(--border-radius); max-height: 100vh;"
112
114
  height="auto"
113
115
  :scrollable="true"
116
+ @close="close"
114
117
  >
115
118
  <Card
116
119
  v-if="loaded"
@@ -165,7 +168,7 @@ export default {
165
168
  />
166
169
  </div>
167
170
  </Card>
168
- </modal>
171
+ </app-modal>
169
172
  </template>
170
173
 
171
174
  <style lang='scss'>