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

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 (312) 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/global/_form.scss +1 -1
  5. package/assets/styles/global/_labeled-input.scss +1 -1
  6. package/assets/styles/themes/_dark.scss +3 -0
  7. package/assets/styles/themes/_light.scss +3 -0
  8. package/assets/styles/vendor/vue-select.scss +1 -1
  9. package/assets/translations/en-us.yaml +404 -64
  10. package/assets/translations/zh-hans.yaml +3 -4
  11. package/cloud-credential/gcp.vue +9 -1
  12. package/components/AppModal.vue +2 -0
  13. package/components/CodeMirror.vue +1 -1
  14. package/components/ConfigMapSettings/Settings.vue +377 -0
  15. package/components/ConfigMapSettings/index.vue +354 -0
  16. package/components/CruResource.vue +1 -2
  17. package/components/DetailText.vue +61 -11
  18. package/components/Drawer/Chrome.vue +116 -0
  19. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +61 -0
  20. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
  21. package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
  22. package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
  23. package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +82 -0
  24. package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
  25. package/components/Drawer/ResourceDetailDrawer/composables.ts +50 -0
  26. package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
  27. package/components/Drawer/ResourceDetailDrawer/index.vue +110 -0
  28. package/components/GrowlManager.vue +16 -15
  29. package/components/IconOrSvg.vue +5 -0
  30. package/components/KeyValueView.vue +1 -1
  31. package/components/LocaleSelector.vue +9 -1
  32. package/components/ProgressBarMulti.vue +1 -0
  33. package/components/PromptModal.vue +6 -1
  34. package/components/RelatedResources.vue +4 -12
  35. package/components/Resource/Detail/Additional.vue +46 -0
  36. package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +1 -1
  37. package/components/Resource/Detail/Metadata/Annotations/index.vue +5 -0
  38. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
  39. package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +37 -254
  40. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +298 -0
  41. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +27 -5
  42. package/components/Resource/Detail/Metadata/KeyValue.vue +25 -17
  43. package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +1 -1
  44. package/components/Resource/Detail/Metadata/Labels/index.vue +4 -0
  45. package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +1 -1
  46. package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +1 -1
  47. package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
  48. package/components/Resource/Detail/Metadata/composables.ts +60 -11
  49. package/components/Resource/Detail/Metadata/index.vue +12 -5
  50. package/components/Resource/Detail/Page.vue +15 -0
  51. package/components/Resource/Detail/ResourceRow.vue +37 -18
  52. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
  53. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
  54. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
  55. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
  56. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
  57. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
  58. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
  59. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
  60. package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
  61. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
  62. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
  63. package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
  64. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
  65. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
  66. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
  67. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
  68. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
  69. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
  70. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
  71. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
  72. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
  73. package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
  74. package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
  75. package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
  76. package/components/Resource/Detail/TitleBar/Title.vue +2 -1
  77. package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +1 -1
  78. package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +1 -1
  79. package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
  80. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +1 -1
  81. package/components/Resource/Detail/TitleBar/composables.ts +44 -0
  82. package/components/Resource/Detail/TitleBar/index.vue +83 -11
  83. package/components/Resource/Detail/composables.ts +45 -0
  84. package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
  85. package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
  86. package/components/ResourceDetail/Masthead/index.vue +65 -0
  87. package/components/ResourceDetail/Masthead/latest.vue +44 -0
  88. package/components/ResourceDetail/__tests__/index.test.ts +26 -5
  89. package/components/ResourceDetail/index.vue +30 -16
  90. package/components/ResourceDetail/legacy.vue +18 -1
  91. package/components/ResourceList/Masthead.vue +6 -0
  92. package/components/ResourceYaml.vue +14 -1
  93. package/components/SlideInPanelManager.vue +46 -7
  94. package/components/StateDot/index.vue +28 -0
  95. package/components/Tabbed/index.vue +11 -15
  96. package/components/Wizard.vue +4 -2
  97. package/components/__tests__/ConfigMapSettings.test.ts +376 -0
  98. package/components/__tests__/GrowlManager.test.ts +0 -25
  99. package/components/auth/login/ldap.vue +1 -1
  100. package/components/fleet/FleetApplications.vue +0 -7
  101. package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
  102. package/components/fleet/FleetClusterTargets/index.vue +455 -0
  103. package/components/fleet/FleetClusters.vue +25 -6
  104. package/components/fleet/FleetGitRepoPaths.vue +476 -0
  105. package/components/fleet/FleetHelmOps.vue +8 -0
  106. package/components/fleet/FleetRepos.vue +1 -6
  107. package/components/fleet/FleetResources.vue +4 -5
  108. package/components/fleet/FleetValuesFrom.vue +295 -0
  109. package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
  110. package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
  111. package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +13 -13
  112. package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
  113. package/components/fleet/dashboard/ResourceCard.vue +1 -0
  114. package/components/fleet/dashboard/ResourceCardSummary.vue +1 -5
  115. package/components/fleet/dashboard/ResourceDetails.vue +8 -10
  116. package/components/fleet/dashboard/ResourcePanel.vue +15 -8
  117. package/components/form/ArrayList.vue +13 -2
  118. package/components/form/ChangePassword.vue +3 -1
  119. package/components/form/Footer.vue +10 -4
  120. package/components/form/KeyValue.vue +81 -43
  121. package/components/form/LabeledSelect.vue +56 -16
  122. package/components/form/Labels.vue +90 -17
  123. package/components/form/MatchExpressions.vue +46 -5
  124. package/components/form/NameNsDescription.vue +1 -1
  125. package/components/form/ResourceSelector.vue +1 -0
  126. package/components/form/ResourceTabs/index.vue +5 -0
  127. package/components/form/SecretSelector.vue +9 -2
  128. package/components/form/Select.vue +57 -19
  129. package/components/form/SimpleSecretSelector.vue +9 -2
  130. package/components/form/Taints.vue +21 -2
  131. package/components/form/UnitInput.vue +8 -0
  132. package/components/form/ValueFromResource.vue +1 -1
  133. package/components/form/__tests__/LabeledSelect.test.ts +8 -4
  134. package/components/form/__tests__/Labels.test.ts +360 -0
  135. package/components/form/__tests__/MatchExpressions.test.ts +16 -13
  136. package/components/form/__tests__/Select.test.ts +5 -2
  137. package/components/formatter/FleetApplicationSource.vue +1 -1
  138. package/components/formatter/WorkloadHealthScale.vue +1 -1
  139. package/components/google/AccountAccess.vue +211 -0
  140. package/components/google/types/gcp.d.ts +136 -0
  141. package/components/google/types/index.d.ts +101 -0
  142. package/components/google/util/__mocks__/gcp.ts +465 -0
  143. package/components/google/util/formatter.ts +82 -0
  144. package/components/google/util/gcp.ts +134 -0
  145. package/components/google/util/index.d.ts +11 -0
  146. package/components/nav/Favorite.vue +1 -1
  147. package/components/nav/Group.vue +70 -47
  148. package/components/nav/Header.vue +5 -1
  149. package/components/nav/NamespaceFilter.vue +13 -1
  150. package/components/nav/NotificationCenter/Notification.vue +510 -0
  151. package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
  152. package/components/nav/NotificationCenter/index.vue +148 -0
  153. package/composables/drawer.ts +26 -0
  154. package/composables/resources.test.ts +63 -0
  155. package/composables/resources.ts +38 -0
  156. package/composables/useIsNewDetailPageEnabled.ts +17 -0
  157. package/config/labels-annotations.js +6 -0
  158. package/config/product/auth.js +16 -1
  159. package/config/product/{cis.js → compliance.js} +23 -26
  160. package/config/product/explorer.js +5 -1
  161. package/config/product/fleet.js +7 -0
  162. package/config/product/settings.js +22 -11
  163. package/config/query-params.js +3 -0
  164. package/config/roles.ts +1 -1
  165. package/config/router/navigation-guards/authentication.js +51 -2
  166. package/config/router/routes.js +27 -31
  167. package/config/settings.ts +21 -3
  168. package/config/store.js +2 -0
  169. package/config/system-namespaces.js +1 -1
  170. package/config/table-headers.js +2 -2
  171. package/config/types.js +15 -6
  172. package/core/plugin.ts +32 -7
  173. package/core/types.ts +18 -1
  174. package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
  175. package/detail/management.cattle.io.fleetworkspace.vue +18 -27
  176. package/detail/management.cattle.io.oidcclient.vue +369 -0
  177. package/detail/node.vue +2 -2
  178. package/detail/pod.vue +2 -2
  179. package/detail/service.vue +10 -1
  180. package/detail/workload/index.vue +8 -2
  181. package/dialog/ExtensionCatalogUninstallDialog.vue +7 -4
  182. package/dialog/GenericPrompt.vue +1 -1
  183. package/dialog/ImportDialog.vue +8 -8
  184. package/dialog/OidcClientSecretDialog.vue +117 -0
  185. package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
  186. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +5 -2
  187. package/edit/autoscaling.horizontalpodautoscaler/index.vue +4 -1
  188. package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
  189. package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
  190. package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
  191. package/edit/configmap.vue +4 -1
  192. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  193. package/edit/fleet.cattle.io.gitrepo.vue +44 -222
  194. package/edit/fleet.cattle.io.helmop.vue +44 -269
  195. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  196. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  197. package/edit/logging-flow/index.vue +1 -0
  198. package/edit/logging.banzaicloud.io.output/index.vue +1 -0
  199. package/edit/management.cattle.io.fleetworkspace.vue +1 -0
  200. package/edit/management.cattle.io.oidcclient.vue +162 -0
  201. package/edit/management.cattle.io.project.vue +4 -1
  202. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  203. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
  204. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  205. package/edit/monitoring.coreos.com.receiver/auth.vue +30 -30
  206. package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
  207. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  208. package/edit/monitoring.coreos.com.route.vue +1 -0
  209. package/edit/namespace.vue +1 -0
  210. package/edit/networking.istio.io.destinationrule/index.vue +4 -1
  211. package/edit/networking.k8s.io.ingress/index.vue +4 -1
  212. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +7 -2
  213. package/edit/networking.k8s.io.networkpolicy/index.vue +6 -2
  214. package/edit/node.vue +1 -0
  215. package/edit/persistentvolume/index.vue +4 -1
  216. package/edit/provisioning.cattle.io.cluster/rke2.vue +418 -382
  217. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +27 -27
  218. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
  219. package/edit/resources.cattle.io.restore.vue +1 -1
  220. package/edit/secret/index.vue +1 -0
  221. package/edit/service.vue +4 -1
  222. package/edit/serviceaccount.vue +4 -1
  223. package/edit/storage.k8s.io.storageclass/index.vue +4 -1
  224. package/edit/workload/index.vue +5 -0
  225. package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
  226. package/list/management.cattle.io.oidcclient.vue +108 -0
  227. package/list/node.vue +2 -0
  228. package/machine-config/amazonec2.vue +3 -24
  229. package/machine-config/components/GCEImage.vue +374 -0
  230. package/machine-config/google.vue +617 -0
  231. package/mixins/__tests__/brand.spec.ts +170 -0
  232. package/mixins/brand.js +16 -17
  233. package/mixins/create-edit-view/index.js +5 -0
  234. package/mixins/resource-fetch-api-pagination.js +16 -0
  235. package/mixins/vue-select-overrides.js +1 -0
  236. package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
  237. package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
  238. package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
  239. package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
  240. package/models/fleet-application.js +8 -79
  241. package/models/fleet.cattle.io.cluster.js +11 -0
  242. package/models/fleet.cattle.io.gitrepo.js +2 -2
  243. package/models/fleet.cattle.io.helmop.js +9 -39
  244. package/models/management.cattle.io.fleetworkspace.js +2 -1
  245. package/models/management.cattle.io.oidcclient.js +18 -0
  246. package/models/management.cattle.io.registration.js +3 -0
  247. package/models/provisioning.cattle.io.cluster.js +5 -5
  248. package/models/service.js +4 -0
  249. package/models/workload.js +5 -0
  250. package/package.json +1 -1
  251. package/pages/about.vue +4 -58
  252. package/pages/auth/login.vue +1 -1
  253. package/pages/c/_cluster/apps/charts/AddRepoLink.vue +0 -1
  254. package/pages/c/_cluster/apps/charts/index.vue +285 -81
  255. package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
  256. package/pages/c/_cluster/explorer/index.vue +3 -3
  257. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
  258. package/pages/c/_cluster/fleet/application/create.vue +3 -2
  259. package/pages/c/_cluster/fleet/index.vue +94 -56
  260. package/pages/c/_cluster/fleet/settings/index.vue +229 -0
  261. package/pages/c/_cluster/longhorn/index.vue +5 -2
  262. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
  263. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
  264. package/pages/explorer/resource/detail/configmap.vue +30 -7
  265. package/pages/explorer/resource/detail/secret.vue +50 -0
  266. package/pages/home.vue +9 -55
  267. package/pages/support/index.vue +4 -6
  268. package/plugins/dashboard-store/actions.js +19 -5
  269. package/plugins/dashboard-store/getters.js +4 -0
  270. package/plugins/dashboard-store/resource-class.js +16 -2
  271. package/plugins/steve/steve-pagination-utils.ts +26 -18
  272. package/plugins/steve/subscribe.js +6 -1
  273. package/rancher-components/Banner/Banner.vue +13 -0
  274. package/rancher-components/Form/Checkbox/Checkbox.vue +9 -4
  275. package/rancher-components/Form/LabeledInput/LabeledInput.vue +1 -1
  276. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
  277. package/rancher-components/RcItemCard/RcItemCard.vue +8 -3
  278. package/store/auth.js +2 -0
  279. package/store/catalog.js +23 -1
  280. package/store/growl.js +97 -8
  281. package/store/index.js +6 -0
  282. package/store/notifications.ts +426 -0
  283. package/store/prefs.js +0 -1
  284. package/store/type-map.js +19 -16
  285. package/store/uiplugins.ts +15 -1
  286. package/types/fleet.d.ts +24 -0
  287. package/types/notifications/index.ts +74 -0
  288. package/types/shell/index.d.ts +46 -32
  289. package/types/store/dashboard-store.types.ts +16 -0
  290. package/utils/__tests__/fleet.test.ts +148 -0
  291. package/utils/__tests__/object.test.ts +54 -1
  292. package/utils/__tests__/string.test.ts +273 -1
  293. package/utils/__tests__/time.test.ts +31 -0
  294. package/utils/auth.js +9 -2
  295. package/utils/crypto/encryption.ts +103 -0
  296. package/utils/cspAdaptor.ts +51 -0
  297. package/utils/fleet.ts +54 -65
  298. package/utils/object.js +36 -0
  299. package/utils/pagination-utils.ts +1 -1
  300. package/utils/release-notes.ts +48 -0
  301. package/utils/selector-typed.ts +7 -2
  302. package/utils/string.js +24 -0
  303. package/utils/{time.js → time.ts} +25 -6
  304. package/utils/uiplugins.ts +22 -0
  305. package/utils/validators/formRules/index.ts +3 -0
  306. package/components/Resource/Detail/TitleBar/composable.ts +0 -31
  307. package/config/product/legacy.js +0 -62
  308. package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
  309. package/pages/c/_cluster/legacy/project/_page.vue +0 -57
  310. package/pages/c/_cluster/legacy/project/index.vue +0 -32
  311. package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
  312. /package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +0 -0
@@ -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) => {
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('cluster/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
+ };
@@ -193,3 +193,9 @@ export const SYSTEM_LABELS = [
193
193
  ];
194
194
 
195
195
  export const CLOUD_CREDENTIALS = { EXPIRATION: 'rancher.io/expiration-timestamp' };
196
+
197
+ export const OIDC_CLIENT_SECRET_ANNOTATIONS = {
198
+ CREATE: 'cattle.io/oidc-client-secret-create',
199
+ REGEN: 'cattle.io/oidc-client-secret-regenerate',
200
+ REMOVE: 'cattle.io/oidc-client-secret-remove',
201
+ };
@@ -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
  {
@@ -106,6 +106,10 @@ export function init(store) {
106
106
  POD,
107
107
  ], 'workload');
108
108
 
109
+ setGroupDefaultType('workload', () => {
110
+ return store.getters['features/get'](STEVE_CACHE) ? WORKLOAD_TYPES.DEPLOYMENT : undefined;
111
+ });
112
+
109
113
  weightGroup('cluster', 99, true);
110
114
  weightGroup('workload', 98, true);
111
115
  weightGroup('serviceDiscovery', 96, true);
@@ -160,7 +164,7 @@ export function init(store) {
160
164
  mapGroup(/^(.*\.)?(k3s)\.cattle\.io$/, 'K3s');
161
165
  mapGroup(/^(.*\.)?(helm)\.cattle\.io$/, 'Helm');
162
166
  mapGroup(/^(.*\.)?upgrade\.cattle\.io$/, 'Upgrade Controller');
163
- mapGroup(/^(.*\.)?cis\.cattle\.io$/, 'CIS');
167
+ mapGroup(/^(.*\.)?compliance\.cattle\.io$/, 'Compliance');
164
168
  mapGroup(/^(.*\.)?traefik\.containo\.us$/, 'Træfik');
165
169
  mapGroup(/^(catalog|management|project|ui)\.cattle\.io$/, 'Rancher');
166
170
  mapGroup(/^(.*\.)?istio\.io$/, 'Istio');
@@ -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',
@@ -1,5 +1,5 @@
1
1
  import { DSL } from '@shell/store/type-map';
2
- import { MANAGEMENT, HELM } from '@shell/config/types';
2
+ import { FLEET, MANAGEMENT, HELM } from '@shell/config/types';
3
3
  import {
4
4
  STATE,
5
5
  FEATURE_DESCRIPTION,
@@ -35,7 +35,7 @@ export function init(store) {
35
35
  labelKey: 'advancedSettings.label',
36
36
  name: 'settings',
37
37
  namespaced: false,
38
- weight: 100,
38
+ weight: 101,
39
39
  icon: 'folder',
40
40
  route: {
41
41
  name: 'c-cluster-product-resource',
@@ -51,7 +51,7 @@ export function init(store) {
51
51
  labelKey: 'featureFlags.label',
52
52
  name: 'features',
53
53
  namespaced: false,
54
- weight: 99,
54
+ weight: 100,
55
55
  icon: 'folder',
56
56
  route: {
57
57
  name: 'c-cluster-product-resource',
@@ -64,22 +64,22 @@ export function init(store) {
64
64
 
65
65
  virtualType({
66
66
  ifHaveType: MANAGEMENT.SETTING,
67
- labelKey: 'branding.label',
68
- name: 'brand',
67
+ labelKey: 'banner.settingName',
68
+ name: 'banners',
69
69
  namespaced: false,
70
- weight: 98,
70
+ weight: 99,
71
71
  icon: 'folder',
72
- route: { name: 'c-cluster-settings-brand' }
72
+ route: { name: 'c-cluster-settings-banners' }
73
73
  });
74
74
 
75
75
  virtualType({
76
76
  ifHaveType: MANAGEMENT.SETTING,
77
- labelKey: 'banner.settingName',
78
- name: 'banners',
77
+ labelKey: 'branding.label',
78
+ name: 'brand',
79
79
  namespaced: false,
80
80
  weight: 98,
81
81
  icon: 'folder',
82
- route: { name: 'c-cluster-settings-banners' }
82
+ route: { name: 'c-cluster-settings-brand' }
83
83
  });
84
84
 
85
85
  virtualType({
@@ -102,13 +102,24 @@ export function init(store) {
102
102
  route: { name: 'c-cluster-settings-links' }
103
103
  });
104
104
 
105
+ virtualType({
106
+ ifHaveType: FLEET.GIT_REPO,
107
+ labelKey: 'fleet.settings.label',
108
+ name: 'fleet-settings',
109
+ namespaced: false,
110
+ weight: 95,
111
+ icon: 'folder',
112
+ route: { name: 'c-cluster-settings-fleet' }
113
+ });
114
+
105
115
  basicType([
106
116
  'settings',
107
117
  'features',
108
118
  'brand',
109
119
  'banners',
110
120
  'performance',
111
- 'links'
121
+ 'links',
122
+ 'fleet-settings'
112
123
  ]);
113
124
 
114
125
  configureType(MANAGEMENT.SETTING, {
@@ -79,3 +79,6 @@ export const CLOUD_CREDENTIAL = 'cloud';
79
79
  // NAMESPACE/PROJECT
80
80
  export const PROJECT_ID = 'projectId';
81
81
  export const FLAT_VIEW = 'flatView';
82
+
83
+ // RANCHER OIDC CLIENT
84
+ export const RANCHER_AS_OIDC_QUERY_PARAMS = ['scope', 'client_id', 'redirect_uri', 'response_type'];
package/config/roles.ts CHANGED
@@ -264,7 +264,7 @@ export const SCOPED_RESOURCES = {
264
264
  'Jobs',
265
265
  ]
266
266
  },
267
- 'cis.cattle.io': {
267
+ 'compliance.cattle.io': {
268
268
  resources: [
269
269
  'ClusterScans',
270
270
  'ClusterScanReports'