@rancher/shell 3.0.5-rc.5 → 3.0.5-rc.7

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 (361) hide show
  1. package/assets/data/aws-regions.json +1 -0
  2. package/assets/images/key.svg +17 -0
  3. package/assets/styles/base/_spacing.scss +2 -2
  4. package/assets/styles/base/_variables.scss +17 -11
  5. package/assets/styles/global/_form.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +1 -1
  7. package/assets/styles/themes/_dark.scss +5 -0
  8. package/assets/styles/themes/_light.scss +11 -2
  9. package/assets/styles/vendor/vue-select.scss +1 -1
  10. package/assets/translations/en-us.yaml +426 -64
  11. package/assets/translations/zh-hans.yaml +3 -4
  12. package/cloud-credential/gcp.vue +9 -1
  13. package/components/AppModal.vue +2 -0
  14. package/components/CodeMirror.vue +2 -2
  15. package/components/ConfigMapSettings/Settings.vue +377 -0
  16. package/components/ConfigMapSettings/index.vue +354 -0
  17. package/components/CruResource.vue +1 -2
  18. package/components/DetailText.vue +61 -11
  19. package/components/Drawer/Chrome.vue +115 -0
  20. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +61 -0
  21. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
  22. package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
  23. package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
  24. package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +106 -0
  25. package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
  26. package/components/Drawer/ResourceDetailDrawer/composables.ts +53 -0
  27. package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
  28. package/components/Drawer/ResourceDetailDrawer/index.vue +111 -0
  29. package/components/GrowlManager.vue +16 -15
  30. package/components/IconOrSvg.vue +5 -0
  31. package/components/KeyValueView.vue +1 -1
  32. package/components/Loading.vue +1 -1
  33. package/components/LocaleSelector.vue +9 -1
  34. package/components/PaginatedResourceTable.vue +46 -1
  35. package/components/ProgressBarMulti.vue +1 -0
  36. package/components/PromptModal.vue +6 -1
  37. package/components/PromptRestore.vue +22 -44
  38. package/components/RelatedResources.vue +4 -12
  39. package/components/Resource/Detail/Additional.vue +46 -0
  40. package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +1 -1
  41. package/components/Resource/Detail/Metadata/Annotations/index.vue +5 -0
  42. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
  43. package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +47 -256
  44. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +317 -0
  45. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +34 -5
  46. package/components/Resource/Detail/Metadata/KeyValue.vue +32 -22
  47. package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +1 -1
  48. package/components/Resource/Detail/Metadata/Labels/index.vue +4 -0
  49. package/components/Resource/Detail/Metadata/Rectangle.vue +3 -1
  50. package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +1 -1
  51. package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +1 -1
  52. package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
  53. package/components/Resource/Detail/Metadata/composables.ts +60 -11
  54. package/components/Resource/Detail/Metadata/index.vue +12 -5
  55. package/components/Resource/Detail/Page.vue +15 -0
  56. package/components/Resource/Detail/ResourceRow.vue +37 -18
  57. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
  58. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
  59. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
  60. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
  61. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
  62. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
  63. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
  64. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
  65. package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
  66. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
  67. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
  68. package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
  69. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
  70. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
  71. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
  72. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
  73. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
  74. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
  75. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
  76. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
  77. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
  78. package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
  79. package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
  80. package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
  81. package/components/Resource/Detail/SpacedRow.vue +1 -1
  82. package/components/Resource/Detail/TitleBar/Title.vue +2 -1
  83. package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +1 -1
  84. package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +1 -1
  85. package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
  86. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +1 -1
  87. package/components/Resource/Detail/TitleBar/composables.ts +45 -0
  88. package/components/Resource/Detail/TitleBar/index.vue +85 -13
  89. package/components/Resource/Detail/composables.ts +45 -0
  90. package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
  91. package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
  92. package/components/ResourceDetail/Masthead/index.vue +65 -0
  93. package/components/ResourceDetail/Masthead/latest.vue +44 -0
  94. package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +1 -1
  95. package/components/ResourceDetail/__tests__/index.test.ts +26 -5
  96. package/components/ResourceDetail/index.vue +33 -17
  97. package/components/ResourceDetail/legacy.vue +18 -1
  98. package/components/ResourceList/Masthead.vue +6 -0
  99. package/components/ResourceList/index.vue +1 -0
  100. package/components/ResourceTable.vue +6 -1
  101. package/components/ResourceYaml.vue +15 -2
  102. package/components/RichTranslation.vue +106 -0
  103. package/components/SlideInPanelManager.vue +46 -11
  104. package/components/SortableTable/index.vue +1 -1
  105. package/components/SortableTable/selection.js +0 -1
  106. package/components/StateDot/index.vue +28 -0
  107. package/components/Tabbed/index.vue +17 -16
  108. package/components/Wizard.vue +4 -2
  109. package/components/__tests__/ConfigMapSettings.test.ts +376 -0
  110. package/components/__tests__/GrowlManager.test.ts +0 -25
  111. package/components/__tests__/PromptRestore.test.ts +1 -65
  112. package/components/__tests__/RichTranslation.test.ts +115 -0
  113. package/components/auth/login/ldap.vue +1 -1
  114. package/components/fleet/FleetApplications.vue +0 -7
  115. package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
  116. package/components/fleet/FleetClusterTargets/index.vue +455 -0
  117. package/components/fleet/FleetClusters.vue +25 -6
  118. package/components/fleet/FleetGitRepoPaths.vue +476 -0
  119. package/components/fleet/FleetHelmOps.vue +8 -0
  120. package/components/fleet/FleetRepos.vue +1 -6
  121. package/components/fleet/FleetResources.vue +4 -5
  122. package/components/fleet/FleetValuesFrom.vue +295 -0
  123. package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
  124. package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
  125. package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +13 -13
  126. package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
  127. package/components/fleet/dashboard/ResourceCard.vue +1 -0
  128. package/components/fleet/dashboard/ResourceCardSummary.vue +1 -5
  129. package/components/fleet/dashboard/ResourceDetails.vue +8 -10
  130. package/components/fleet/dashboard/ResourcePanel.vue +17 -9
  131. package/components/form/ArrayList.vue +13 -2
  132. package/components/form/ChangePassword.vue +3 -1
  133. package/components/form/FileImageSelector.vue +1 -1
  134. package/components/form/Footer.vue +10 -4
  135. package/components/form/KeyValue.vue +81 -43
  136. package/components/form/LabeledSelect.vue +56 -16
  137. package/components/form/Labels.vue +90 -17
  138. package/components/form/MatchExpressions.vue +46 -5
  139. package/components/form/NameNsDescription.vue +2 -1
  140. package/components/form/Networking.vue +24 -19
  141. package/components/form/ResourceLabeledSelect.vue +4 -3
  142. package/components/form/ResourceSelector.vue +1 -0
  143. package/components/form/ResourceTabs/index.vue +5 -0
  144. package/components/form/SecretSelector.vue +9 -2
  145. package/components/form/Select.vue +57 -19
  146. package/components/form/SelectOrCreateAuthSecret.vue +6 -3
  147. package/components/form/SimpleSecretSelector.vue +9 -2
  148. package/components/form/Taints.vue +21 -2
  149. package/components/form/UnitInput.vue +8 -0
  150. package/components/form/ValueFromResource.vue +1 -1
  151. package/components/form/__tests__/LabeledSelect.test.ts +8 -4
  152. package/components/form/__tests__/Labels.test.ts +360 -0
  153. package/components/form/__tests__/MatchExpressions.test.ts +16 -13
  154. package/components/form/__tests__/Networking.test.ts +116 -0
  155. package/components/form/__tests__/Select.test.ts +5 -2
  156. package/components/formatter/FleetApplicationSource.vue +1 -1
  157. package/components/formatter/PodImages.vue +1 -1
  158. package/components/formatter/WorkloadHealthScale.vue +1 -1
  159. package/components/formatter/__tests__/LiveDate.test.ts +10 -2
  160. package/components/google/AccountAccess.vue +209 -0
  161. package/components/google/types/gcp.d.ts +136 -0
  162. package/components/google/types/index.d.ts +101 -0
  163. package/components/google/util/__mocks__/gcp.ts +465 -0
  164. package/components/google/util/formatter.ts +82 -0
  165. package/components/google/util/gcp.ts +134 -0
  166. package/components/google/util/index.d.ts +11 -0
  167. package/components/nav/Favorite.vue +1 -1
  168. package/components/nav/Group.vue +71 -45
  169. package/components/nav/Header.vue +5 -1
  170. package/components/nav/NamespaceFilter.vue +13 -1
  171. package/components/nav/NotificationCenter/Notification.vue +510 -0
  172. package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
  173. package/components/nav/NotificationCenter/index.vue +148 -0
  174. package/composables/drawer.ts +26 -0
  175. package/composables/resources.test.ts +63 -0
  176. package/composables/resources.ts +38 -0
  177. package/composables/useIsNewDetailPageEnabled.ts +17 -0
  178. package/config/labels-annotations.js +8 -0
  179. package/config/pagination-table-headers.js +8 -1
  180. package/config/product/auth.js +16 -1
  181. package/config/product/{cis.js → compliance.js} +23 -26
  182. package/config/product/explorer.js +32 -3
  183. package/config/product/fleet.js +7 -0
  184. package/config/product/manager.js +0 -1
  185. package/config/product/settings.js +22 -11
  186. package/config/query-params.js +13 -0
  187. package/config/roles.ts +1 -1
  188. package/config/router/navigation-guards/authentication.js +51 -2
  189. package/config/router/routes.js +47 -31
  190. package/config/settings.ts +21 -3
  191. package/config/store.js +2 -0
  192. package/config/system-namespaces.js +1 -1
  193. package/config/table-headers.js +32 -3
  194. package/config/types.js +16 -7
  195. package/config/version.js +1 -1
  196. package/core/plugin.ts +32 -7
  197. package/core/types.ts +18 -1
  198. package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
  199. package/detail/management.cattle.io.fleetworkspace.vue +18 -27
  200. package/detail/management.cattle.io.oidcclient.vue +369 -0
  201. package/detail/node.vue +2 -2
  202. package/detail/pod.vue +2 -2
  203. package/detail/provisioning.cattle.io.cluster.vue +3 -47
  204. package/detail/service.vue +10 -1
  205. package/detail/workload/index.vue +8 -2
  206. package/dialog/ExtensionCatalogUninstallDialog.vue +7 -4
  207. package/dialog/GenericPrompt.vue +1 -1
  208. package/dialog/ImportDialog.vue +8 -8
  209. package/dialog/OidcClientSecretDialog.vue +117 -0
  210. package/dialog/RotateEncryptionKeyDialog.vue +10 -30
  211. package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
  212. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +5 -2
  213. package/edit/auth/ldap/__tests__/config.test.ts +14 -0
  214. package/edit/auth/ldap/config.vue +24 -0
  215. package/edit/autoscaling.horizontalpodautoscaler/index.vue +4 -1
  216. package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
  217. package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
  218. package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
  219. package/edit/configmap.vue +8 -2
  220. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  221. package/edit/fleet.cattle.io.gitrepo.vue +44 -222
  222. package/edit/fleet.cattle.io.helmop.vue +44 -269
  223. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  224. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  225. package/edit/logging-flow/index.vue +1 -0
  226. package/edit/logging.banzaicloud.io.output/index.vue +1 -0
  227. package/edit/management.cattle.io.fleetworkspace.vue +1 -0
  228. package/edit/management.cattle.io.oidcclient.vue +162 -0
  229. package/edit/management.cattle.io.project.vue +4 -1
  230. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  231. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
  232. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  233. package/edit/monitoring.coreos.com.receiver/auth.vue +30 -30
  234. package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
  235. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  236. package/edit/monitoring.coreos.com.route.vue +1 -0
  237. package/edit/namespace.vue +1 -0
  238. package/edit/networking.istio.io.destinationrule/index.vue +4 -1
  239. package/edit/networking.k8s.io.ingress/Certificate.vue +12 -12
  240. package/edit/networking.k8s.io.ingress/__tests__/Certificate.test.ts +165 -0
  241. package/edit/networking.k8s.io.ingress/index.vue +4 -1
  242. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +7 -2
  243. package/edit/networking.k8s.io.networkpolicy/index.vue +6 -2
  244. package/edit/node.vue +1 -0
  245. package/edit/persistentvolume/index.vue +4 -1
  246. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +3 -2
  247. package/edit/provisioning.cattle.io.cluster/rke2.vue +516 -426
  248. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +48 -39
  249. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
  250. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +2 -2
  251. package/edit/resources.cattle.io.restore.vue +1 -1
  252. package/edit/secret/basic.vue +1 -0
  253. package/edit/secret/index.vue +127 -15
  254. package/edit/service.vue +4 -1
  255. package/edit/serviceaccount.vue +4 -1
  256. package/edit/storage.k8s.io.storageclass/index.vue +4 -1
  257. package/edit/workload/index.vue +5 -0
  258. package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
  259. package/list/management.cattle.io.oidcclient.vue +108 -0
  260. package/list/node.vue +2 -0
  261. package/list/projectsecret.vue +345 -0
  262. package/list/secret.vue +109 -0
  263. package/machine-config/amazonec2.vue +3 -24
  264. package/machine-config/components/GCEImage.vue +374 -0
  265. package/machine-config/google.vue +617 -0
  266. package/mixins/__tests__/brand.spec.ts +170 -0
  267. package/mixins/brand.js +16 -17
  268. package/mixins/create-edit-view/impl.js +10 -1
  269. package/mixins/create-edit-view/index.js +5 -0
  270. package/mixins/resource-fetch-api-pagination.js +24 -8
  271. package/mixins/resource-fetch.js +3 -1
  272. package/mixins/vue-select-overrides.js +1 -0
  273. package/models/cluster.x-k8s.io.machinedeployment.js +11 -2
  274. package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
  275. package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
  276. package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
  277. package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
  278. package/models/fleet-application.js +8 -79
  279. package/models/fleet.cattle.io.cluster.js +13 -2
  280. package/models/fleet.cattle.io.gitrepo.js +2 -2
  281. package/models/fleet.cattle.io.helmop.js +9 -39
  282. package/models/management.cattle.io.fleetworkspace.js +2 -1
  283. package/models/management.cattle.io.oidcclient.js +18 -0
  284. package/models/management.cattle.io.registration.js +3 -0
  285. package/models/provisioning.cattle.io.cluster.js +29 -33
  286. package/models/secret.js +157 -2
  287. package/models/service.js +4 -0
  288. package/models/workload.js +5 -0
  289. package/package.json +2 -2
  290. package/pages/about.vue +4 -58
  291. package/pages/auth/login.vue +1 -1
  292. package/pages/c/_cluster/apps/charts/AddRepoLink.vue +0 -1
  293. package/pages/c/_cluster/apps/charts/index.vue +296 -81
  294. package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
  295. package/pages/c/_cluster/explorer/index.vue +3 -3
  296. package/pages/c/_cluster/explorer/projectsecret.vue +34 -0
  297. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
  298. package/pages/c/_cluster/fleet/application/create.vue +3 -2
  299. package/pages/c/_cluster/fleet/index.vue +94 -57
  300. package/pages/c/_cluster/fleet/settings/index.vue +229 -0
  301. package/pages/c/_cluster/longhorn/index.vue +5 -2
  302. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
  303. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
  304. package/pages/explorer/resource/detail/configmap.vue +30 -7
  305. package/pages/explorer/resource/detail/projectsecret.vue +9 -0
  306. package/pages/explorer/resource/detail/secret.vue +63 -0
  307. package/pages/home.vue +9 -55
  308. package/pages/support/index.vue +4 -6
  309. package/plugins/dashboard-store/__tests__/normalize.test.ts +223 -0
  310. package/plugins/dashboard-store/__tests__/resource-class.test.ts +191 -0
  311. package/plugins/dashboard-store/__tests__/utils/normalize-usecases.ts +1526 -0
  312. package/plugins/dashboard-store/actions.js +19 -5
  313. package/plugins/dashboard-store/getters.js +4 -0
  314. package/plugins/dashboard-store/normalize.js +29 -17
  315. package/plugins/dashboard-store/resource-class.js +68 -19
  316. package/plugins/steve/steve-pagination-utils.ts +38 -19
  317. package/plugins/steve/subscribe.js +6 -1
  318. package/rancher-components/Banner/Banner.vue +13 -0
  319. package/rancher-components/Form/Checkbox/Checkbox.vue +9 -4
  320. package/rancher-components/Form/LabeledInput/LabeledInput.vue +1 -1
  321. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
  322. package/rancher-components/RcItemCard/RcItemCard.vue +8 -3
  323. package/store/auth.js +2 -0
  324. package/store/catalog.js +23 -1
  325. package/store/growl.js +97 -8
  326. package/store/index.js +6 -0
  327. package/store/notifications.ts +426 -0
  328. package/store/prefs.js +0 -1
  329. package/store/type-map.js +19 -16
  330. package/store/uiplugins.ts +15 -1
  331. package/types/fleet.d.ts +24 -0
  332. package/types/kube/kube-api.ts +12 -0
  333. package/types/notifications/index.ts +74 -0
  334. package/types/shell/index.d.ts +661 -589
  335. package/types/store/dashboard-store.types.ts +16 -0
  336. package/types/store/pagination.types.ts +16 -6
  337. package/utils/__tests__/create-yaml.test.ts +235 -0
  338. package/utils/__tests__/fleet.test.ts +148 -0
  339. package/utils/__tests__/object.test.ts +54 -1
  340. package/utils/__tests__/string.test.ts +273 -1
  341. package/utils/__tests__/time.test.ts +31 -0
  342. package/utils/auth.js +9 -2
  343. package/utils/create-yaml.js +103 -9
  344. package/utils/crypto/encryption.ts +103 -0
  345. package/utils/cspAdaptor.ts +51 -0
  346. package/utils/fleet.ts +54 -65
  347. package/utils/object.js +36 -0
  348. package/utils/pagination-utils.ts +19 -1
  349. package/utils/release-notes.ts +48 -0
  350. package/utils/selector-typed.ts +7 -2
  351. package/utils/string.js +24 -0
  352. package/utils/{time.js → time.ts} +25 -6
  353. package/utils/uiplugins.ts +22 -0
  354. package/utils/validators/formRules/index.ts +3 -0
  355. package/components/Resource/Detail/TitleBar/composable.ts +0 -31
  356. package/config/product/legacy.js +0 -62
  357. package/models/etcdbackup.js +0 -45
  358. package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
  359. package/pages/c/_cluster/legacy/project/_page.vue +0 -57
  360. package/pages/c/_cluster/legacy/project/index.vue +0 -32
  361. package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
@@ -0,0 +1,148 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ computed,
4
+ ref,
5
+ } from 'vue';
6
+ import { useStore } from 'vuex';
7
+ import Notification from './Notification.vue';
8
+ import NotificationHeader from './NotificationHeader.vue';
9
+ import {
10
+ RcDropdown,
11
+ RcDropdownSeparator,
12
+ RcDropdownTrigger
13
+ } from '@components/RcDropdown';
14
+
15
+ const store = useStore();
16
+ const allNotifications = computed(() => store.getters['notifications/all']);
17
+ const unreadLevelClass = computed(() => {
18
+ return store.getters['notifications/unreadCount'] === 0 ? '' : 'unread';
19
+ });
20
+
21
+ // There may be more notifications than we can show on screen, so the popover needs to scroll
22
+ const scroller = ref<HTMLElement>();
23
+
24
+ // Close all of the open growls when the notification center is shown, so that they do not overlap
25
+ const open = (opened: boolean) => {
26
+ if (opened) {
27
+ store.dispatch('growl/clear');
28
+ }
29
+ };
30
+ </script>
31
+
32
+ <template>
33
+ <rc-dropdown
34
+ :aria-label="t('nav.notifications.label')"
35
+ @update:open="open"
36
+ >
37
+ <rc-dropdown-trigger
38
+ tertiary
39
+ data-testid="notifications-center"
40
+ :aria-label="t('nav.notifications.button.label')"
41
+ >
42
+ <div class="level-indicator">
43
+ <i class="icon icon-lg icon-notify-bell" />
44
+ <div
45
+ :data-testid="`notifications-center-status${ unreadLevelClass }`"
46
+ class="trigger-level"
47
+ :class="unreadLevelClass"
48
+ />
49
+ </div>
50
+ </rc-dropdown-trigger>
51
+ <template #dropdownCollection>
52
+ <div
53
+ data-testid="notifications-center-panel"
54
+ class="notification-dropdown"
55
+ >
56
+ <NotificationHeader class="header" />
57
+ <div
58
+ v-if="allNotifications.length === 0"
59
+ class="no-notifications"
60
+ >
61
+ <div class="hands">
62
+ &#x1F64C;
63
+ </div>
64
+ <div>
65
+ {{ t('notificationCenter.caughtUp', {}, true) }}
66
+ </div>
67
+ </div>
68
+ <div
69
+ ref="scroller"
70
+ class="scroll-container"
71
+ >
72
+ <template
73
+ v-for="(a, index) in allNotifications"
74
+ :key="a.id"
75
+ >
76
+ <rc-dropdown-separator
77
+ v-if="index > 0"
78
+ class="notification-separator"
79
+ />
80
+ <Notification :item="a" />
81
+ </template>
82
+ </div>
83
+ </div>
84
+ </template>
85
+ </rc-dropdown>
86
+ </template>
87
+
88
+ <style lang="scss" scoped>
89
+ .notification-dropdown {
90
+ display: flex;
91
+ overflow: hidden;
92
+ flex-direction: column;
93
+
94
+ .header {
95
+ flex: 0;
96
+ }
97
+
98
+ .scroll-container {
99
+ overflow: auto;
100
+ max-height: 80vh;
101
+ padding: 3px 0; // Need padding at top and bottom in order to show the focus border for the notification
102
+ }
103
+ }
104
+
105
+ .notification-separator {
106
+ margin: 0 3px;
107
+ width: auto;
108
+ }
109
+
110
+ .no-notifications {
111
+ text-align: center;
112
+ min-width: 340px;
113
+ margin: 40px 16px;
114
+
115
+ .hands {
116
+ font-size: 53px;
117
+ padding-top: 0;
118
+ }
119
+
120
+ > div {
121
+ padding-top: 16px;
122
+ }
123
+ }
124
+
125
+ .level-indicator {
126
+ display: flex;
127
+ position: relative;
128
+ height: 20px;
129
+ width: 18px;
130
+
131
+ .trigger-level {
132
+ position: absolute;
133
+ right: -6px;
134
+ top: -4px;
135
+ border-radius: 50%;
136
+ height: 8px;
137
+ width: 8px;
138
+ background-color: var(--primary);
139
+ transition: opacity 0.5s ease-in-out;
140
+ opacity: 0;
141
+
142
+ &.unread {
143
+ opacity: 1;
144
+ background-color: var(--error);
145
+ }
146
+ }
147
+ }
148
+ </style>
@@ -0,0 +1,26 @@
1
+ import { Component } from 'vue';
2
+ import { useStore } from 'vuex';
3
+
4
+ export const useDrawer = () => {
5
+ const store = useStore();
6
+
7
+ const open = (component: Component, returnFocusSelector: string, options?: Record<string, any>) => {
8
+ store.commit('slideInPanel/open', {
9
+ component,
10
+ componentProps: {
11
+ ...(options || {}),
12
+ triggerFocusTrap: true,
13
+ returnFocusSelector
14
+ }
15
+ });
16
+ };
17
+
18
+ const close = () => {
19
+ store.commit('slideInPanel/close');
20
+ };
21
+
22
+ return {
23
+ open,
24
+ close
25
+ };
26
+ };
@@ -0,0 +1,63 @@
1
+ import { useResourceIdentifiers, useFetchResourceWithId } from '@shell/composables/resources';
2
+
3
+ const mockStore: any = {
4
+ getters: { 'cluster/schemaFor': jest.fn(() => ({ id: 'test-schema' })) },
5
+ dispatch: jest.fn()
6
+ };
7
+ const mockRoute: any = {
8
+ params: {
9
+ cluster: 'test-cluster',
10
+ namespace: 'test-namespace',
11
+ id: 'test-id',
12
+ },
13
+ };
14
+
15
+ jest.mock('vuex', () => ({ useStore: () => mockStore }));
16
+ jest.mock('vue-router', () => ({ useRoute: () => mockRoute }));
17
+
18
+ describe('resources', () => {
19
+ describe('useResourceIdentifiers', () => {
20
+ it('should return the correct value for a route with a namespace', async() => {
21
+ const { clusterId, id, schema } = useResourceIdentifiers('test-type');
22
+
23
+ expect(clusterId).toBe('test-cluster');
24
+ expect(id).toBe('test-namespace/test-id');
25
+ expect(schema).toStrictEqual({ id: 'test-schema' });
26
+ });
27
+
28
+ it('should return the correct value for a route without a namespace', async() => {
29
+ mockRoute.params.namespace = undefined;
30
+ const { clusterId, id, schema } = useResourceIdentifiers('test-type');
31
+
32
+ expect(clusterId).toBe('test-cluster');
33
+ expect(id).toBe('test-id');
34
+ expect(schema).toStrictEqual({ id: 'test-schema' });
35
+ });
36
+ });
37
+
38
+ describe('useFetchResourceWithId', () => {
39
+ it('should return the correct value given the correct arguments are passed to the dispatch method', async() => {
40
+ mockStore.dispatch.mockImplementation(() => Promise.resolve({ id: 'test-resource' }));
41
+ const resource = await useFetchResourceWithId('test-type', 'test-id');
42
+
43
+ expect(mockStore.dispatch).toHaveBeenCalledWith('cluster/find', { type: 'test-type', id: 'test-id' });
44
+ expect(resource).toStrictEqual({ id: 'test-resource' });
45
+ });
46
+
47
+ it('should dispatch a loadingError if a 404 occurs', async() => {
48
+ // eslint-disable-next-line prefer-promise-reject-errors
49
+ mockStore.dispatch.mockImplementationOnce(() => Promise.reject({ status: 404 }));
50
+ await useFetchResourceWithId('test-type', 'test-id');
51
+
52
+ expect(mockStore.dispatch).toHaveBeenCalledWith('loadingError', new Error('nav.failWhale.resourceIdNotFound-{"resource":"test-type","fqid":"test-id"}'));
53
+ });
54
+
55
+ it('should dispatch a loadingError if a 403 occurs', async() => {
56
+ // eslint-disable-next-line prefer-promise-reject-errors
57
+ mockStore.dispatch.mockImplementationOnce(() => Promise.reject({ status: 403 }));
58
+ await useFetchResourceWithId('test-type', 'test-id');
59
+
60
+ expect(mockStore.dispatch).toHaveBeenCalledWith('loadingError', new Error('nav.failWhale.resourceIdNotFound-{"resource":"test-type","fqid":"test-id"}'));
61
+ });
62
+ });
63
+ });
@@ -0,0 +1,38 @@
1
+ import { useI18n } from '@shell/composables/useI18n';
2
+ import { computed, Ref, toValue } from 'vue';
3
+ import { useRoute } from 'vue-router';
4
+ import { useStore } from 'vuex';
5
+
6
+ type ResourceType = string | Ref<string>;
7
+ type IdType = string | Ref<string>;
8
+
9
+ export const useResourceIdentifiers = (type: ResourceType) => {
10
+ const route = useRoute();
11
+ const store = useStore();
12
+
13
+ const typeValue = toValue(type);
14
+
15
+ const id = computed(() => route.params.namespace ? `${ route.params.namespace }/${ route.params.id }` : `${ route.params.id }`);
16
+ const schema = computed(() => store.getters['cluster/schemaFor'](typeValue));
17
+ const clusterId = computed(() => route.params.cluster as string);
18
+
19
+ return {
20
+ clusterId: clusterId.value, id: id.value, schema: schema.value
21
+ };
22
+ };
23
+
24
+ export const useFetchResourceWithId = async(type: ResourceType, id: IdType, inStore = 'cluster') => {
25
+ const store = useStore();
26
+ const i18n = useI18n(store);
27
+
28
+ const typeValue = toValue(type);
29
+ const idValue = toValue(id);
30
+
31
+ try {
32
+ return await store.dispatch(`${ inStore }/find`, { type: typeValue, id: idValue });
33
+ } catch (ex: any) {
34
+ if (ex.status === 404 || ex.status === 403) {
35
+ store.dispatch('loadingError', new Error(i18n.t('nav.failWhale.resourceIdNotFound', { resource: type, fqid: id }, true)));
36
+ }
37
+ }
38
+ };
@@ -0,0 +1,17 @@
1
+ import { useRoute } from 'vue-router';
2
+ import { LEGACY } from '@shell/config/query-params';
3
+ import { computed } from 'vue';
4
+
5
+ const enabledByDefault = true;
6
+
7
+ export const useIsNewDetailPageEnabled = () => {
8
+ const route = useRoute();
9
+
10
+ return computed(() => {
11
+ if (enabledByDefault) {
12
+ return route?.query?.[LEGACY] !== 'true';
13
+ }
14
+
15
+ return route?.query?.[LEGACY] === 'false';
16
+ });
17
+ };
@@ -17,6 +17,8 @@ export const AZURE_MIGRATED = 'auth.cattle.io/azuread-endpoint-migrated';
17
17
  export const WORKSPACE_ANNOTATION = 'objectset.rio.cattle.io/id';
18
18
  export const NODE_ARCHITECTURE = 'kubernetes.io/arch';
19
19
  export const IMPORTED_CLUSTER_VERSION_MANAGEMENT = 'rancher.io/imported-cluster-version-management';
20
+ export const UI_PROJECT_SECRET = 'management.cattle.io/project-scoped-secret';
21
+ export const UI_PROJECT_SECRET_COPY = 'management.cattle.io/project-scoped-secret-copy';
20
22
 
21
23
  export const KUBERNETES = {
22
24
  SERVICE_ACCOUNT_UID: 'kubernetes.io/service-account.uid',
@@ -193,3 +195,9 @@ export const SYSTEM_LABELS = [
193
195
  ];
194
196
 
195
197
  export const CLOUD_CREDENTIALS = { EXPIRATION: 'rancher.io/expiration-timestamp' };
198
+
199
+ export const OIDC_CLIENT_SECRET_ANNOTATIONS = {
200
+ CREATE: 'cattle.io/oidc-client-secret-create',
201
+ REGEN: 'cattle.io/oidc-client-secret-regenerate',
202
+ REMOVE: 'cattle.io/oidc-client-secret-remove',
203
+ };
@@ -1,7 +1,9 @@
1
+ import { UI_PROJECT_SECRET_COPY } from '@shell/config/labels-annotations';
1
2
  import {
2
3
  STATE, NAME as NAME_COL, NAMESPACE as NAMESPACE_COL, AGE, OBJECT,
3
4
  EVENT_LAST_SEEN_TIME,
4
- EVENT_TYPE
5
+ EVENT_TYPE,
6
+ SECRET_CLONE
5
7
  } from '@shell/config/table-headers';
6
8
 
7
9
  // This file contains table headers
@@ -78,3 +80,8 @@ export const STEVE_LIST_GROUPS = [{
78
80
  tooltipKey: 'resourceTable.groupBy.namespace',
79
81
  groupLabelKey: 'groupByLabel',
80
82
  }];
83
+
84
+ export const STEVE_SECRET_CLONE = {
85
+ ...SECRET_CLONE,
86
+ sort: `metadata.annotations[${ UI_PROJECT_SECRET_COPY }]`,
87
+ };
@@ -62,8 +62,19 @@ export function init(store) {
62
62
  }
63
63
  }
64
64
  });
65
+
65
66
  configureType(MANAGEMENT.USER, { showListMasthead: false });
66
67
 
68
+ configureType(MANAGEMENT.OIDC_CLIENT, {
69
+ listCreateButtonLabelKey: 'oidcclient.listViewCreate',
70
+ isCreatable: true,
71
+ isEditable: true,
72
+ isRemovable: true,
73
+ showAge: true,
74
+ showState: true,
75
+ canYaml: true,
76
+ });
77
+
67
78
  spoofedType({
68
79
  labelKey: 'typeLabel."group.principal"',
69
80
  type: NORMAN.SPOOFED.GROUP_PRINCIPAL,
@@ -132,6 +143,7 @@ export function init(store) {
132
143
  }));
133
144
  }
134
145
  });
146
+
135
147
  configureType(NORMAN.SPOOFED.GROUP_PRINCIPAL, {
136
148
  isCreatable: false,
137
149
  showAge: false,
@@ -139,9 +151,11 @@ export function init(store) {
139
151
  isRemovable: false,
140
152
  showListMasthead: false,
141
153
  });
154
+
142
155
  // Use labelFor... so lookup succeeds with .'s in path.... and end result is 'trimmed' as per other entries
143
156
  mapType(NORMAN.SPOOFED.GROUP_PRINCIPAL, store.getters['type-map/labelFor']({ id: NORMAN.SPOOFED.GROUP_PRINCIPAL }, 2));
144
157
  weightType(NORMAN.SPOOFED.GROUP_PRINCIPAL, 101, true);
158
+ weightType(MANAGEMENT.OIDC_CLIENT, 90, true);
145
159
 
146
160
  virtualType({
147
161
  labelKey: 'auth.roleTemplate',
@@ -181,7 +195,8 @@ export function init(store) {
181
195
  'config',
182
196
  USERS_VIRTUAL_TYPE,
183
197
  NORMAN.SPOOFED.GROUP_PRINCIPAL,
184
- ROLES_VIRTUAL_TYPE
198
+ ROLES_VIRTUAL_TYPE,
199
+ MANAGEMENT.OIDC_CLIENT
185
200
  ]);
186
201
 
187
202
  headers(NORMAN.SPOOFED.GROUP_PRINCIPAL, [
@@ -1,9 +1,9 @@
1
1
  import { DSL } from '@shell/store/type-map';
2
- import { CIS } from '@shell/config/types';
2
+ import { COMPLIANCE } from '@shell/config/types';
3
3
  import { STATE, NAME as NAME_HEADER, AGE } from '@shell/config/table-headers';
4
4
 
5
- export const NAME = 'cis';
6
- export const CHART_NAME = 'rancher-cis-benchmark';
5
+ export const NAME = 'compliance';
6
+ export const CHART_NAME = 'rancher-compliance';
7
7
 
8
8
  export function init(store) {
9
9
  const {
@@ -14,24 +14,21 @@ export function init(store) {
14
14
  headers
15
15
  } = DSL(store, NAME);
16
16
 
17
- product({
18
- ifHaveGroup: /^(.*\.)*cis\.cattle\.io$/,
19
- icon: 'cis',
20
- });
17
+ product({ ifHaveGroup: /^(.*\.)*compliance\.cattle\.io$/ });
21
18
 
22
- weightType(CIS.CLUSTER_SCAN, 3, true);
23
- weightType(CIS.CLUSTER_SCAN_PROFILE, 2, true);
24
- weightType(CIS.BENCHMARK, 1, true);
19
+ weightType(COMPLIANCE.CLUSTER_SCAN, 3, true);
20
+ weightType(COMPLIANCE.CLUSTER_SCAN_PROFILE, 2, true);
21
+ weightType(COMPLIANCE.BENCHMARK, 1, true);
25
22
 
26
23
  basicType([
27
- 'cis.cattle.io.clusterscan',
28
- 'cis.cattle.io.clusterscanprofile',
29
- 'cis.cattle.io.clusterscanbenchmark',
24
+ 'compliance.cattle.io.clusterscan',
25
+ 'compliance.cattle.io.clusterscanprofile',
26
+ 'compliance.cattle.io.clusterscanbenchmark',
30
27
  ]);
31
28
 
32
- configureType(CIS.CLUSTER_SCAN, { canYaml: false, showAge: false });
29
+ configureType(COMPLIANCE.CLUSTER_SCAN, { canYaml: false, showAge: false });
33
30
 
34
- headers(CIS.CLUSTER_SCAN, [
31
+ headers(COMPLIANCE.CLUSTER_SCAN, [
35
32
  STATE,
36
33
  NAME_HEADER,
37
34
  {
@@ -44,7 +41,7 @@ export function init(store) {
44
41
  },
45
42
  {
46
43
  name: 'total',
47
- labelKey: 'cis.scan.total',
44
+ labelKey: 'compliance.scan.total',
48
45
  value: 'status.summary.total',
49
46
  formatter: 'ScanResult'
50
47
 
@@ -52,34 +49,34 @@ export function init(store) {
52
49
  {
53
50
  name: 'pass',
54
51
  value: 'status.summary.pass',
55
- labelKey: 'cis.scan.pass',
52
+ labelKey: 'compliance.scan.pass',
56
53
  formatter: 'ScanResult'
57
54
 
58
55
  },
59
56
  {
60
57
  name: 'fail',
61
- labelKey: 'cis.scan.fail',
58
+ labelKey: 'compliance.scan.fail',
62
59
  value: 'status.summary.fail',
63
60
  formatter: 'ScanResult'
64
61
 
65
62
  },
66
63
  {
67
64
  name: 'warn',
68
- labelKey: 'cis.scan.warn',
65
+ labelKey: 'compliance.scan.warn',
69
66
  value: 'status.summary.warn',
70
67
  formatter: 'ScanResult'
71
68
 
72
69
  },
73
70
  {
74
71
  name: 'skip',
75
- labelKey: 'cis.scan.skip',
72
+ labelKey: 'compliance.scan.skip',
76
73
  value: 'status.summary.skip',
77
74
  formatter: 'ScanResult'
78
75
 
79
76
  },
80
77
  {
81
78
  name: 'notApplicable',
82
- labelKey: 'cis.scan.notApplicable',
79
+ labelKey: 'compliance.scan.notApplicable',
83
80
  value: 'status.summary.notApplicable',
84
81
  formatter: 'ScanResult'
85
82
 
@@ -107,12 +104,12 @@ export function init(store) {
107
104
  },
108
105
  ]);
109
106
 
110
- headers(CIS.CLUSTER_SCAN_PROFILE, [
107
+ headers(COMPLIANCE.CLUSTER_SCAN_PROFILE, [
111
108
  STATE,
112
109
  NAME_HEADER,
113
110
  {
114
111
  name: 'benchmarkVersion',
115
- labelKey: 'cis.benchmarkVersion',
112
+ labelKey: 'compliance.benchmarkVersion',
116
113
  value: 'spec.benchmarkVersion',
117
114
  formatter: 'Link',
118
115
  formatterOpts: { options: { internal: true }, urlKey: 'benchmarkVersionLink' },
@@ -120,18 +117,18 @@ export function init(store) {
120
117
  },
121
118
  {
122
119
  name: 'skippedTests',
123
- labelKey: 'cis.testsSkipped',
120
+ labelKey: 'compliance.testsSkipped',
124
121
  value: 'numberTestsSkipped',
125
122
  sort: ['numberTestsSkipped']
126
123
  }
127
124
  ]);
128
125
 
129
- headers(CIS.BENCHMARK, [
126
+ headers(COMPLIANCE.BENCHMARK, [
130
127
  STATE,
131
128
  NAME_HEADER,
132
129
  {
133
130
  name: 'clusterProvider',
134
- labelKey: 'cis.clusterProvider',
131
+ labelKey: 'compliance.clusterProvider',
135
132
  value: 'spec.clusterProvider',
136
133
  },
137
134
  {
@@ -21,7 +21,7 @@ import {
21
21
  HPA_REFERENCE, MIN_REPLICA, MAX_REPLICA, CURRENT_REPLICA,
22
22
  ACCESS_KEY, DESCRIPTION, EXPIRES, EXPIRY_STATE, LAST_USED, SUB_TYPE, AGE_NORMAN, SCOPE_NORMAN, PERSISTENT_VOLUME_CLAIM, RECLAIM_POLICY, PV_REASON, WORKLOAD_HEALTH_SCALE, POD_RESTARTS,
23
23
  DURATION, MESSAGE, REASON, EVENT_TYPE, OBJECT, ROLE, ROLES, VERSION, INTERNAL_EXTERNAL_IP, KUBE_NODE_OS, CPU, RAM, SECRET_DATA,
24
- EVENT_LAST_SEEN_TIME
24
+ EVENT_LAST_SEEN_TIME,
25
25
  } from '@shell/config/table-headers';
26
26
 
27
27
  import { DSL } from '@shell/store/type-map';
@@ -94,6 +94,7 @@ export function init(store) {
94
94
  PVC,
95
95
  STORAGE_CLASS,
96
96
  SECRET,
97
+ VIRTUAL_TYPES.PROJECT_SECRETS,
97
98
  CONFIG_MAP
98
99
  ], 'storage');
99
100
  basicType([
@@ -106,6 +107,10 @@ export function init(store) {
106
107
  POD,
107
108
  ], 'workload');
108
109
 
110
+ setGroupDefaultType('workload', () => {
111
+ return store.getters['features/get'](STEVE_CACHE) ? WORKLOAD_TYPES.DEPLOYMENT : undefined;
112
+ });
113
+
109
114
  weightGroup('cluster', 99, true);
110
115
  weightGroup('workload', 98, true);
111
116
  weightGroup('serviceDiscovery', 96, true);
@@ -160,7 +165,7 @@ export function init(store) {
160
165
  mapGroup(/^(.*\.)?(k3s)\.cattle\.io$/, 'K3s');
161
166
  mapGroup(/^(.*\.)?(helm)\.cattle\.io$/, 'Helm');
162
167
  mapGroup(/^(.*\.)?upgrade\.cattle\.io$/, 'Upgrade Controller');
163
- mapGroup(/^(.*\.)?cis\.cattle\.io$/, 'CIS');
168
+ mapGroup(/^(.*\.)?compliance\.cattle\.io$/, 'Compliance');
164
169
  mapGroup(/^(.*\.)?traefik\.containo\.us$/, 'Træfik');
165
170
  mapGroup(/^(catalog|management|project|ui)\.cattle\.io$/, 'Rancher');
166
171
  mapGroup(/^(.*\.)?istio\.io$/, 'Istio');
@@ -183,7 +188,12 @@ export function init(store) {
183
188
  configureType(NORMAN.CLUSTER_ROLE_TEMPLATE_BINDING, { depaginate: dePaginateNormanBindings });
184
189
  configureType(NORMAN.PROJECT_ROLE_TEMPLATE_BINDING, { depaginate: dePaginateNormanBindings });
185
190
  configureType(SNAPSHOT, { depaginate: true });
186
- configureType(NORMAN.ETCD_BACKUP, { depaginate: true });
191
+
192
+ configureType(SECRET, { showListMasthead: false });
193
+ weightType(SECRET, 1, false);
194
+
195
+ configureType(VIRTUAL_TYPES.PROJECT_SECRETS, { showListMasthead: false });
196
+ weightType(VIRTUAL_TYPES.PROJECT_SECRETS, 2, false);
187
197
 
188
198
  configureType(EVENT, { limit: 500 });
189
199
  weightType(EVENT, -1, true);
@@ -620,6 +630,25 @@ export function init(store) {
620
630
  exact: true,
621
631
  });
622
632
 
633
+ virtualType({
634
+ label: store.getters['i18n/t'](`typeLabel.${ VIRTUAL_TYPES.PROJECT_SECRETS }`, { count: 2 }),
635
+ group: 'storage',
636
+ icon: 'globe',
637
+ namespaced: false,
638
+ ifRancherCluster: true,
639
+ name: VIRTUAL_TYPES.PROJECT_SECRETS,
640
+ weight: -1,
641
+ route: {
642
+ name: 'c-cluster-product-resource',
643
+ params: { resource: VIRTUAL_TYPES.PROJECT_SECRETS }
644
+ },
645
+ exact: true,
646
+ ifHaveType: [{
647
+ store: 'management',
648
+ type: SECRET
649
+ }],
650
+ });
651
+
623
652
  // Ignore these types as they are managed through the settings product
624
653
  ignoreType(MANAGEMENT.FEATURE);
625
654
  ignoreType(MANAGEMENT.SETTING);
@@ -115,6 +115,13 @@ export function init(store) {
115
115
  sort: 'counts.gitRepos',
116
116
  formatter: 'Number',
117
117
  },
118
+ {
119
+ name: 'helmOps',
120
+ labelKey: 'tableHeaders.helmOps',
121
+ value: 'counts.helmOps',
122
+ sort: 'counts.helmOps',
123
+ formatter: 'Number',
124
+ },
118
125
  {
119
126
  name: 'clusters',
120
127
  labelKey: 'tableHeaders.clusters',
@@ -67,7 +67,6 @@ export function init(store) {
67
67
  ]);
68
68
 
69
69
  configureType(SNAPSHOT, { depaginate: true });
70
- configureType(NORMAN.ETCD_BACKUP, { depaginate: true });
71
70
 
72
71
  configureType(CAPI.RANCHER_CLUSTER, {
73
72
  showListMasthead: false, namespaced: false, alias: [HCI.CLUSTER]