@rancher/shell 3.0.7 → 3.0.8-rc.10

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 (375) hide show
  1. package/assets/brand/suse/banner.svg +1 -0
  2. package/assets/brand/suse/dark/banner.svg +1 -0
  3. package/assets/brand/suse/dark/login-landscape.svg +1 -0
  4. package/assets/brand/suse/dark/rancher-logo.svg +1 -1
  5. package/assets/brand/suse/favicon.png +0 -0
  6. package/assets/brand/suse/login-landscape.svg +1 -0
  7. package/assets/brand/suse/metadata.json +11 -1
  8. package/assets/brand/suse/rancher-logo.svg +1 -1
  9. package/assets/fonts/suse/suse-v2-latin-300.woff +0 -0
  10. package/assets/fonts/suse/suse-v2-latin-300.woff2 +0 -0
  11. package/assets/fonts/suse/suse-v2-latin-600.woff +0 -0
  12. package/assets/fonts/suse/suse-v2-latin-600.woff2 +0 -0
  13. package/assets/fonts/suse/suse-v2-latin-700.woff +0 -0
  14. package/assets/fonts/suse/suse-v2-latin-700.woff2 +0 -0
  15. package/assets/fonts/suse/suse-v2-latin-800.woff +0 -0
  16. package/assets/fonts/suse/suse-v2-latin-800.woff2 +0 -0
  17. package/assets/fonts/suse/suse-v2-latin-regular.woff +0 -0
  18. package/assets/fonts/suse/suse-v2-latin-regular.woff2 +0 -0
  19. package/assets/images/content/README.md +5 -0
  20. package/assets/images/content/cloud-native.svg +84 -0
  21. package/assets/images/content/dark/cloud-native.svg +21 -0
  22. package/assets/images/content/dark/shield.svg +59 -0
  23. package/assets/images/content/dark/suse.svg +10 -0
  24. package/assets/images/content/shield.svg +59 -0
  25. package/assets/images/content/suse.svg +10 -0
  26. package/assets/images/vendor/githubapp.svg +13 -0
  27. package/assets/styles/base/_typography.scss +2 -1
  28. package/assets/styles/fonts/_fontstack.scss +53 -1
  29. package/assets/styles/global/_cards.scss +0 -3
  30. package/assets/styles/global/_layout.scss +21 -35
  31. package/assets/styles/themes/_dark.scss +1 -1
  32. package/assets/styles/themes/_light.scss +1 -1
  33. package/assets/styles/themes/_modern.scss +16 -8
  34. package/assets/styles/themes/_suse.scss +116 -24
  35. package/assets/translations/en-us.yaml +185 -21
  36. package/assets/translations/zh-hans.yaml +0 -4
  37. package/components/AutoscalerCard.vue +113 -0
  38. package/components/AutoscalerTab.vue +94 -0
  39. package/components/BackLink.vue +8 -0
  40. package/components/BannerGraphic.vue +36 -21
  41. package/components/BrandImage.vue +17 -6
  42. package/components/ClusterIconMenu.vue +1 -1
  43. package/components/ClusterProviderIcon.vue +1 -1
  44. package/components/Cron/CronExpressionEditor.vue +1 -1
  45. package/components/Cron/CronExpressionEditorModal.vue +1 -1
  46. package/components/Drawer/Chrome.vue +2 -6
  47. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +4 -9
  48. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +3 -8
  49. package/components/Drawer/ResourceDetailDrawer/composables.ts +3 -4
  50. package/components/Drawer/ResourceDetailDrawer/index.vue +4 -9
  51. package/components/Drawer/ResourceDetailDrawer/types.ts +17 -0
  52. package/components/Drawer/types.ts +3 -0
  53. package/components/DynamicContent/DynamicContentBanner.vue +102 -0
  54. package/components/DynamicContent/DynamicContentCloseButton.vue +42 -0
  55. package/components/DynamicContent/DynamicContentIcon.vue +132 -0
  56. package/components/DynamicContent/DynamicContentPanel.vue +112 -0
  57. package/components/DynamicContent/content.ts +78 -0
  58. package/components/EmberPage.vue +1 -1
  59. package/components/IconOrSvg.vue +2 -2
  60. package/components/Inactivity.vue +222 -106
  61. package/components/InstallHelmCharts.vue +2 -2
  62. package/components/PaginatedResourceTable.vue +2 -6
  63. package/components/PopoverCard.vue +192 -0
  64. package/components/Questions/__tests__/index.test.ts +159 -0
  65. package/components/Resource/Detail/CopyToClipboard.vue +4 -1
  66. package/components/Resource/Detail/FetchLoader/composables.ts +18 -4
  67. package/components/Resource/Detail/Metadata/Annotations/index.vue +2 -2
  68. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +1 -1
  69. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +4 -0
  70. package/components/Resource/Detail/Metadata/KeyValueRow.vue +1 -1
  71. package/components/Resource/Detail/Metadata/Labels/index.vue +2 -2
  72. package/components/Resource/Detail/Metadata/composables.ts +9 -9
  73. package/components/Resource/Detail/Metadata/index.vue +3 -3
  74. package/components/Resource/Detail/ResourcePopover/ResourcePopoverCard.vue +2 -19
  75. package/components/Resource/Detail/ResourcePopover/__tests__/ResourcePopoverCard.test.ts +0 -29
  76. package/components/Resource/Detail/ResourcePopover/__tests__/index.test.ts +132 -150
  77. package/components/Resource/Detail/ResourcePopover/index.vue +54 -159
  78. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +0 -2
  79. package/components/Resource/Detail/TitleBar/composables.ts +2 -1
  80. package/components/Resource/Detail/TitleBar/index.vue +10 -6
  81. package/components/Resource/Detail/composables.ts +12 -0
  82. package/components/ResourceDetail/Masthead/latest.vue +29 -0
  83. package/components/ResourceDetail/index.vue +5 -2
  84. package/components/ResourceList/Masthead.vue +1 -1
  85. package/components/SortableTable/index.vue +18 -2
  86. package/components/Tabbed/__tests__/index.test.ts +86 -0
  87. package/components/{nav/WindowManager → Window}/ContainerLogs.vue +1 -1
  88. package/components/{nav/WindowManager → Window}/ContainerLogsActions.vue +1 -0
  89. package/components/{nav/WindowManager → Window}/__tests__/ContainerLogs.test.ts +1 -1
  90. package/components/{nav/WindowManager → Window}/__tests__/ContainerShell.test.ts +2 -2
  91. package/components/__tests__/AutoscalerCard.test.ts +154 -0
  92. package/components/__tests__/AutoscalerTab.test.ts +125 -0
  93. package/components/__tests__/PopoverCard.test.ts +204 -0
  94. package/components/auth/SelectPrincipal.vue +24 -6
  95. package/components/auth/__tests__/SelectPrincipal.test.ts +119 -0
  96. package/components/fleet/FleetConfigMapSelector.vue +117 -0
  97. package/components/fleet/FleetSecretSelector.vue +127 -0
  98. package/components/fleet/__tests__/FleetConfigMapSelector.test.ts +125 -0
  99. package/components/fleet/__tests__/FleetSecretSelector.test.ts +82 -0
  100. package/components/form/FileImageSelector.vue +13 -4
  101. package/components/form/FileSelector.vue +11 -2
  102. package/components/form/ResourceLabeledSelect.vue +1 -0
  103. package/components/form/__tests__/ResourceLabeledSelect.test.ts +90 -0
  104. package/components/formatter/Autoscaler.vue +97 -0
  105. package/components/formatter/InternalExternalIP.vue +198 -24
  106. package/components/formatter/__tests__/Autoscaler.test.ts +156 -0
  107. package/components/formatter/__tests__/InternalExternalIP.test.ts +133 -0
  108. package/components/google/util/__tests__/formatter.test.ts +47 -0
  109. package/components/google/util/formatter.ts +5 -2
  110. package/components/nav/Group.vue +12 -3
  111. package/components/nav/Header.vue +37 -16
  112. package/components/nav/NamespaceFilter.vue +13 -1
  113. package/components/nav/NotificationCenter/index.vue +2 -1
  114. package/components/nav/TopLevelMenu.helper.ts +16 -6
  115. package/components/nav/TopLevelMenu.vue +4 -2
  116. package/components/{DraggableZone.vue → nav/WindowManager/PinArea.vue} +47 -80
  117. package/components/nav/WindowManager/composables/useComponentsMount.ts +70 -0
  118. package/components/nav/WindowManager/composables/useDimensionsHandler.ts +105 -0
  119. package/components/nav/WindowManager/composables/useDragHandler.ts +99 -0
  120. package/components/nav/WindowManager/composables/usePanelHandler.ts +72 -0
  121. package/components/nav/WindowManager/composables/usePanelsHandler.ts +14 -0
  122. package/components/nav/WindowManager/composables/useResizeHandler.ts +167 -0
  123. package/components/nav/WindowManager/composables/useTabsHandler.ts +51 -0
  124. package/components/nav/WindowManager/constants.ts +23 -0
  125. package/components/nav/WindowManager/index.vue +61 -575
  126. package/components/nav/WindowManager/panels/HorizontalPanel.vue +265 -0
  127. package/components/nav/WindowManager/panels/TabBodyContainer.vue +39 -0
  128. package/components/nav/WindowManager/panels/VerticalPanel.vue +308 -0
  129. package/components/templates/default.vue +4 -40
  130. package/components/templates/home.vue +31 -5
  131. package/components/templates/plain.vue +30 -4
  132. package/components/templates/standalone.vue +1 -1
  133. package/composables/useI18n.ts +10 -1
  134. package/composables/useInterval.ts +15 -0
  135. package/config/__test__/uiplugins.test.ts +309 -0
  136. package/config/labels-annotations.js +9 -1
  137. package/config/product/auth.js +1 -0
  138. package/config/product/explorer.js +3 -1
  139. package/config/product/manager.js +20 -9
  140. package/config/query-params.js +1 -0
  141. package/config/router/routes.js +10 -2
  142. package/config/settings.ts +10 -2
  143. package/config/store.js +4 -2
  144. package/config/table-headers.js +8 -0
  145. package/config/types.js +11 -0
  146. package/config/uiplugins.js +46 -2
  147. package/config/version.js +1 -1
  148. package/core/__test__/extension-manager-impl.test.js +236 -0
  149. package/core/extension-manager-impl.js +23 -6
  150. package/core/plugin-helpers.ts +2 -0
  151. package/core/types-provisioning.ts +4 -1
  152. package/detail/pod.vue +1 -0
  153. package/detail/provisioning.cattle.io.cluster.vue +13 -1
  154. package/dialog/AddonConfigConfirmationDialog.vue +45 -1
  155. package/dialog/DeveloperLoadExtensionDialog.vue +12 -3
  156. package/dialog/RollbackWorkloadDialog.vue +2 -5
  157. package/directives/ui-context.ts +103 -0
  158. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +52 -11
  159. package/edit/auth/AuthProviderWarningBanners.vue +14 -1
  160. package/edit/auth/__tests__/oidc.test.ts +26 -0
  161. package/edit/auth/github-app-steps.vue +97 -0
  162. package/edit/auth/github-steps.vue +75 -0
  163. package/edit/auth/github.vue +99 -65
  164. package/edit/auth/oidc.vue +5 -1
  165. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -0
  166. package/edit/cloudcredential.vue +1 -1
  167. package/edit/configmap.vue +1 -0
  168. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  169. package/edit/fleet.cattle.io.gitrepo.vue +0 -10
  170. package/edit/fleet.cattle.io.helmop.vue +51 -2
  171. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  172. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  173. package/edit/logging-flow/index.vue +1 -0
  174. package/edit/logging.banzaicloud.io.output/index.vue +1 -0
  175. package/edit/management.cattle.io.fleetworkspace.vue +1 -1
  176. package/edit/management.cattle.io.project.vue +1 -0
  177. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +4 -1
  178. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +2 -1
  179. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  180. package/edit/monitoring.coreos.com.receiver/index.vue +2 -1
  181. package/edit/monitoring.coreos.com.route.vue +1 -1
  182. package/edit/namespace.vue +1 -0
  183. package/edit/networking.istio.io.destinationrule/index.vue +1 -0
  184. package/edit/networking.k8s.io.ingress/index.vue +1 -0
  185. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +15 -5
  186. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +1 -0
  187. package/edit/networking.k8s.io.networkpolicy/index.vue +1 -0
  188. package/edit/node.vue +1 -0
  189. package/edit/persistentvolume/index.vue +27 -22
  190. package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +13 -14
  191. package/edit/persistentvolume/plugins/azureDisk.vue +49 -48
  192. package/edit/persistentvolume/plugins/azureFile.vue +15 -14
  193. package/edit/persistentvolume/plugins/cephfs.vue +15 -14
  194. package/edit/persistentvolume/plugins/cinder.vue +15 -14
  195. package/edit/persistentvolume/plugins/csi.vue +18 -16
  196. package/edit/persistentvolume/plugins/fc.vue +13 -14
  197. package/edit/persistentvolume/plugins/flexVolume.vue +15 -14
  198. package/edit/persistentvolume/plugins/flocker.vue +1 -3
  199. package/edit/persistentvolume/plugins/gcePersistentDisk.vue +13 -14
  200. package/edit/persistentvolume/plugins/glusterfs.vue +15 -14
  201. package/edit/persistentvolume/plugins/hostPath.vue +40 -39
  202. package/edit/persistentvolume/plugins/iscsi.vue +13 -14
  203. package/edit/persistentvolume/plugins/local.vue +1 -3
  204. package/edit/persistentvolume/plugins/longhorn.vue +23 -22
  205. package/edit/persistentvolume/plugins/nfs.vue +15 -14
  206. package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -14
  207. package/edit/persistentvolume/plugins/portworxVolume.vue +15 -14
  208. package/edit/persistentvolume/plugins/quobyte.vue +15 -14
  209. package/edit/persistentvolume/plugins/rbd.vue +15 -14
  210. package/edit/persistentvolume/plugins/scaleIO.vue +15 -14
  211. package/edit/persistentvolume/plugins/storageos.vue +15 -14
  212. package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -3
  213. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +32 -5
  214. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +35 -0
  215. package/edit/provisioning.cattle.io.cluster/__tests__/Networking.test.ts +155 -0
  216. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +11 -9
  217. package/edit/provisioning.cattle.io.cluster/index.vue +25 -15
  218. package/edit/provisioning.cattle.io.cluster/rke2.vue +98 -17
  219. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +28 -2
  220. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +107 -5
  221. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +92 -4
  222. package/edit/secret/index.vue +1 -1
  223. package/edit/service.vue +9 -4
  224. package/edit/serviceaccount.vue +1 -0
  225. package/edit/storage.k8s.io.storageclass/index.vue +1 -0
  226. package/edit/workload/index.vue +2 -1
  227. package/edit/workload/mixins/workload.js +1 -1
  228. package/initialize/App.vue +4 -4
  229. package/initialize/install-directives.js +2 -0
  230. package/initialize/install-plugins.js +19 -2
  231. package/list/projectsecret.vue +1 -1
  232. package/list/provisioning.cattle.io.cluster.vue +15 -2
  233. package/machine-config/amazonec2.vue +42 -135
  234. package/machine-config/azure.vue +1 -1
  235. package/machine-config/components/EC2Networking.vue +490 -0
  236. package/machine-config/components/__tests__/EC2Networking.test.ts +148 -0
  237. package/machine-config/components/__tests__/utils/vpcSubnetMockData.js +294 -0
  238. package/machine-config/digitalocean.vue +11 -0
  239. package/machine-config/google.vue +1 -1
  240. package/mixins/__tests__/brand.spec.ts +2 -2
  241. package/mixins/__tests__/chart.test.ts +21 -0
  242. package/mixins/brand.js +1 -7
  243. package/mixins/chart.js +8 -2
  244. package/mixins/create-edit-view/index.js +5 -0
  245. package/models/__tests__/chart.test.ts +49 -12
  246. package/models/__tests__/compliance.cattle.io.clusterscanprofile.spec.js +30 -0
  247. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +112 -5
  248. package/models/catalog.cattle.io.app.js +1 -1
  249. package/models/chart.js +28 -14
  250. package/models/cluster/node.js +13 -6
  251. package/models/cluster.x-k8s.io.machine.js +10 -20
  252. package/models/cluster.x-k8s.io.machinedeployment.js +5 -1
  253. package/models/compliance.cattle.io.clusterscanprofile.js +1 -1
  254. package/models/management.cattle.io.authconfig.js +1 -0
  255. package/models/management.cattle.io.cluster.js +21 -3
  256. package/models/management.cattle.io.kontainerdriver.js +1 -0
  257. package/models/provisioning.cattle.io.cluster.js +249 -33
  258. package/package.json +6 -5
  259. package/pages/auth/login.vue +43 -4
  260. package/pages/auth/verify.vue +1 -1
  261. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +3 -2
  262. package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +135 -0
  263. package/pages/c/_cluster/apps/charts/chart.vue +35 -17
  264. package/pages/c/_cluster/apps/charts/index.vue +11 -13
  265. package/pages/c/_cluster/apps/charts/install.vue +1 -1
  266. package/pages/c/_cluster/explorer/EventsTable.vue +89 -3
  267. package/pages/c/_cluster/explorer/index.vue +8 -6
  268. package/pages/c/_cluster/explorer/tools/index.vue +3 -3
  269. package/pages/c/_cluster/manager/hostedprovider/index.vue +220 -0
  270. package/pages/c/_cluster/settings/brand.vue +1 -1
  271. package/pages/c/_cluster/settings/performance.vue +12 -25
  272. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +7 -0
  273. package/pages/c/_cluster/uiplugins/catalogs.vue +147 -0
  274. package/pages/c/_cluster/uiplugins/index.vue +126 -184
  275. package/pages/home.vue +327 -16
  276. package/pkg/dynamic-importer.lib.js +4 -0
  277. package/plugins/axios.js +2 -1
  278. package/plugins/dashboard-client-init.js +3 -0
  279. package/plugins/dashboard-store/actions.js +1 -1
  280. package/plugins/dashboard-store/getters.js +18 -1
  281. package/plugins/dashboard-store/resource-class.js +21 -6
  282. package/plugins/dynamic-content.js +13 -0
  283. package/plugins/i18n.js +8 -0
  284. package/plugins/steve/__tests__/steve-pagination-utils.test.ts +333 -0
  285. package/plugins/steve/steve-pagination-utils.ts +41 -22
  286. package/plugins/steve/subscribe.js +17 -9
  287. package/plugins/subscribe-events.ts +4 -2
  288. package/rancher-components/Form/Checkbox/Checkbox.vue +1 -1
  289. package/rancher-components/Pill/RcStatusBadge/RcStatusBadge.vue +6 -34
  290. package/rancher-components/Pill/RcStatusBadge/index.ts +0 -1
  291. package/rancher-components/Pill/RcStatusBadge/types.ts +1 -1
  292. package/rancher-components/Pill/RcStatusIndicator/RcStatusIndicator.vue +5 -28
  293. package/rancher-components/Pill/RcStatusIndicator/types.ts +2 -1
  294. package/rancher-components/Pill/types.ts +0 -1
  295. package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -0
  296. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +5 -1
  297. package/rancher-components/RcIcon/RcIcon.test.ts +51 -0
  298. package/rancher-components/RcIcon/RcIcon.vue +46 -0
  299. package/rancher-components/RcIcon/index.ts +1 -0
  300. package/rancher-components/RcIcon/types.ts +160 -0
  301. package/rancher-components/utils/status.test.ts +67 -0
  302. package/rancher-components/utils/status.ts +77 -0
  303. package/scripts/extension/publish +1 -1
  304. package/scripts/typegen.sh +1 -0
  305. package/store/action-menu.js +8 -0
  306. package/store/auth.js +11 -6
  307. package/store/aws.js +8 -6
  308. package/store/catalog.js +6 -0
  309. package/store/features.js +2 -0
  310. package/store/index.js +45 -20
  311. package/store/notifications.ts +51 -4
  312. package/store/plugins.js +7 -3
  313. package/store/prefs.js +12 -6
  314. package/store/type-map.js +3 -3
  315. package/store/ui-context.ts +86 -0
  316. package/store/wm.ts +244 -0
  317. package/types/kube/kube-api.ts +2 -1
  318. package/types/notifications/index.ts +27 -3
  319. package/types/rancher/index.d.ts +1 -0
  320. package/types/resources/settings.d.ts +29 -7
  321. package/types/shell/index.d.ts +138 -4
  322. package/types/store/__tests__/pagination.types.spec.ts +137 -0
  323. package/types/store/pagination.types.ts +157 -9
  324. package/types/store/subscribe-events.types.ts +8 -1
  325. package/types/store/subscribe.types.ts +1 -0
  326. package/types/window-manager.ts +24 -0
  327. package/utils/__tests__/cluster.test.ts +379 -1
  328. package/utils/__tests__/object.test.ts +19 -0
  329. package/utils/__tests__/provider.test.ts +98 -0
  330. package/utils/__tests__/selector-typed.test.ts +263 -0
  331. package/utils/__tests__/version.test.ts +19 -1
  332. package/utils/autoscaler-utils.ts +7 -0
  333. package/utils/back-off.ts +3 -3
  334. package/utils/brand.ts +29 -0
  335. package/utils/chart.js +18 -0
  336. package/utils/cluster.js +157 -3
  337. package/utils/color.js +1 -1
  338. package/utils/dynamic-content/__tests__/announcement.test.ts +498 -0
  339. package/utils/dynamic-content/__tests__/config.test.ts +187 -0
  340. package/utils/dynamic-content/__tests__/index.test.ts +390 -0
  341. package/utils/dynamic-content/__tests__/info.test.ts +275 -0
  342. package/utils/dynamic-content/__tests__/new-release.test.ts +216 -0
  343. package/utils/dynamic-content/__tests__/support-notice.test.ts +262 -0
  344. package/utils/dynamic-content/__tests__/util.test.ts +235 -0
  345. package/utils/dynamic-content/announcement.ts +142 -0
  346. package/utils/dynamic-content/config.ts +55 -0
  347. package/utils/dynamic-content/example.json +40 -0
  348. package/utils/dynamic-content/index.ts +277 -0
  349. package/utils/dynamic-content/info.ts +261 -0
  350. package/utils/dynamic-content/new-release.ts +126 -0
  351. package/utils/dynamic-content/notification-handler.ts +48 -0
  352. package/utils/dynamic-content/support-notice.ts +169 -0
  353. package/utils/dynamic-content/types.d.ts +153 -0
  354. package/utils/dynamic-content/util.ts +122 -0
  355. package/utils/dynamic-importer.js +2 -2
  356. package/utils/favicon.js +4 -4
  357. package/utils/inactivity.ts +104 -0
  358. package/utils/object.js +20 -2
  359. package/utils/pagination-utils.ts +19 -4
  360. package/utils/pagination-wrapper.ts +12 -8
  361. package/utils/provider.ts +14 -0
  362. package/utils/release-notes.ts +1 -1
  363. package/utils/scroll.js +7 -0
  364. package/utils/selector-typed.ts +6 -2
  365. package/utils/settings.ts +15 -0
  366. package/utils/validators/machine-pool.ts +13 -3
  367. package/utils/version.js +15 -0
  368. package/assets/images/icons/document.svg +0 -3
  369. package/plugins/nuxt-client-init.js +0 -3
  370. package/store/wm.js +0 -95
  371. /package/components/{nav/WindowManager → Window}/ChartReadme.vue +0 -0
  372. /package/components/{nav/WindowManager → Window}/ContainerShell.vue +0 -0
  373. /package/components/{nav/WindowManager → Window}/KubectlShell.vue +0 -0
  374. /package/components/{nav/WindowManager → Window}/MachineSsh.vue +0 -0
  375. /package/components/{nav/WindowManager → Window}/Window.vue +0 -0
package/store/index.js CHANGED
@@ -2,7 +2,7 @@ import { BACK_TO } from '@shell/config/local-storage';
2
2
  import { setBrand, setVendor } from '@shell/config/private-label';
3
3
  import { NAME as EXPLORER } from '@shell/config/product/explorer';
4
4
  import {
5
- LOGGED_OUT, IS_SSO, IS_SLO, TIMED_OUT, UPGRADED, _FLAGGED
5
+ LOGGED_OUT, IS_SSO, IS_SLO, TIMED_OUT, UPGRADED, _FLAGGED, IS_SESSION_IDLE
6
6
  } from '@shell/config/query-params';
7
7
  import { SETTING } from '@shell/config/settings';
8
8
  import {
@@ -41,6 +41,7 @@ import { markRaw } from 'vue';
41
41
  import paginationUtils from '@shell/utils/pagination-utils';
42
42
  import { addReleaseNotesNotification } from '@shell/utils/release-notes';
43
43
  import sideNavService from '@shell/components/nav/TopLevelMenu.helper';
44
+ import { fetchAndProcessDynamicContent } from '@shell/utils/dynamic-content';
44
45
 
45
46
  // Disables strict mode for all store instances to prevent warning about changing state outside of mutations
46
47
  // because it's more efficient to do that sometimes.
@@ -262,7 +263,7 @@ export const state = () => {
262
263
  $route: markRaw({}),
263
264
  $plugin: markRaw({}),
264
265
  showWorkspaceSwitcher: true,
265
-
266
+ localCluster: null,
266
267
  };
267
268
  };
268
269
 
@@ -271,10 +272,20 @@ export const getters = {
271
272
  return state.clusterReady === true;
272
273
  },
273
274
 
275
+ /**
276
+ * Cache of the mgmt cluster fetched at start up
277
+ *
278
+ * We cannot rely on the store to cache this as the store may contain a page without the local cluster
279
+ */
280
+ localCluster(state) {
281
+ return state.localCluster;
282
+ },
283
+
274
284
  isMultiCluster(state, getters) {
275
- const clusters = getters['management/all'](MANAGEMENT.CLUSTER);
285
+ const clusterCount = getters['management/all'](COUNT)?.[0]?.counts?.[MANAGEMENT.CLUSTER]?.summary?.count || 0;
286
+ const localCluster = getters['localCluster'];
276
287
 
277
- if (clusters.length === 1 && clusters[0].metadata?.name === 'local') {
288
+ if (clusterCount === 1 && !!localCluster) {
278
289
  return false;
279
290
  } else {
280
291
  return true;
@@ -591,10 +602,9 @@ export const getters = {
591
602
  },
592
603
 
593
604
  isStandaloneHarvester(state, getters) {
594
- const clusters = getters['management/all'](MANAGEMENT.CLUSTER);
595
- const cluster = clusters.find((c) => c.id === 'local') || {};
605
+ const localCluster = getters['localCluster'];
596
606
 
597
- return getters['isSingleProduct'] && cluster.isHarvester && !getters['isRancherInHarvester'];
607
+ return getters['isSingleProduct'] && localCluster?.isHarvester && !getters['isRancherInHarvester'];
598
608
  },
599
609
 
600
610
  showTopLevelMenu(getters) {
@@ -639,9 +649,10 @@ export const mutations = {
639
649
  clearPageActionHandler(state) {
640
650
  state.pageActionHandler = null;
641
651
  },
642
- managementChanged(state, { ready, isRancher }) {
652
+ managementChanged(state, { ready, isRancher, localCluster }) {
643
653
  state.managementReady = ready;
644
654
  state.isRancher = isRancher;
655
+ state.localCluster = localCluster;
645
656
  },
646
657
  clusterReady(state, ready) {
647
658
  state.clusterReady = ready;
@@ -845,11 +856,21 @@ export const actions = {
845
856
 
846
857
  res = await allHash(promises);
847
858
 
859
+ let localCluster = null;
860
+
848
861
  if (!res[MANAGEMENT.SETTING] || !paginateClusters({ rootGetters, state })) {
849
862
  // This introduces a synchronous request, however we need settings to determine if SSP is enabled
850
- // Eventually it will be removed when SSP is always on
851
- res[MANAGEMENT.CLUSTER] = await dispatch('management/findAll', { type: MANAGEMENT.CLUSTER, opt: { watch: false } });
863
+ await dispatch('management/findAll', { type: MANAGEMENT.CLUSTER, opt: { watch: false } });
852
864
  toWatch.push(MANAGEMENT.CLUSTER);
865
+
866
+ localCluster = getters['management/byId'](MANAGEMENT.CLUSTER, 'local');
867
+ } else {
868
+ try {
869
+ localCluster = await dispatch('management/find', {
870
+ type: MANAGEMENT.CLUSTER, id: 'local', opt: { watch: false }
871
+ });
872
+ } catch (e) { // we don't care about errors, specifically 404s
873
+ }
853
874
  }
854
875
 
855
876
  // See comment above. Now that we have feature flags we can watch resources
@@ -857,11 +878,7 @@ export const actions = {
857
878
  dispatch('management/watch', { type });
858
879
  });
859
880
 
860
- const isMultiCluster = getters['isMultiCluster'];
861
-
862
881
  // If the local cluster is a Harvester cluster and 'rancher-manager-support' is true, it means that the embedded Rancher is being used.
863
- const localCluster = res[MANAGEMENT.CLUSTER]?.find((c) => c.id === 'local');
864
-
865
882
  if (localCluster?.isHarvester) {
866
883
  const harvesterSetting = await dispatch('cluster/findAll', { type: HCI.SETTING, opt: { url: `/v1/harvester/${ HCI.SETTING }s` } });
867
884
  const rancherManagerSupport = harvesterSetting.find((setting) => setting.id === 'rancher-manager-support');
@@ -890,6 +907,8 @@ export const actions = {
890
907
  // Add the notification for the release notes
891
908
  if (isRancher) {
892
909
  await addReleaseNotesNotification(dispatch, getters);
910
+
911
+ fetchAndProcessDynamicContent(dispatch, getters, this.$axios);
893
912
  }
894
913
 
895
914
  if (systemNamespaces) {
@@ -901,6 +920,7 @@ export const actions = {
901
920
  commit('managementChanged', {
902
921
  ready: true,
903
922
  isRancher,
923
+ localCluster
904
924
  });
905
925
 
906
926
  if ( res[FLEET.WORKSPACE] ) {
@@ -911,6 +931,8 @@ export const actions = {
911
931
  });
912
932
  }
913
933
 
934
+ const isMultiCluster = getters['isMultiCluster'];
935
+
914
936
  console.log(`Done loading management; isRancher=${ isRancher }; isMultiCluster=${ isMultiCluster }`); // eslint-disable-line no-console
915
937
  },
916
938
 
@@ -1168,7 +1190,7 @@ export const actions = {
1168
1190
  }
1169
1191
  },
1170
1192
 
1171
- async onLogout(store) {
1193
+ async onLogout(store, options = {}) {
1172
1194
  const { dispatch, commit, state } = store;
1173
1195
 
1174
1196
  store.dispatch('gcStopIntervals');
@@ -1210,7 +1232,10 @@ export const actions = {
1210
1232
  window.localStorage.setItem(BACK_TO, window.location.href);
1211
1233
  }
1212
1234
 
1213
- let QUERY = (LOGGED_OUT in route.query) ? LOGGED_OUT : TIMED_OUT;
1235
+ let QUERY = (LOGGED_OUT in route.query) || options.sessionIdle ? LOGGED_OUT : TIMED_OUT;
1236
+
1237
+ // adds IS_SESSION_IDLE query param to login route if logout came from a session idle (check auth/logout action)
1238
+ QUERY += options.sessionIdle ? `&${ IS_SESSION_IDLE }` : '';
1214
1239
 
1215
1240
  // adds IS_SSO query param to login route if logout came with an auth provider enabled
1216
1241
  QUERY += (IS_SSO in route.query) ? `&${ IS_SSO }` : '';
@@ -1226,10 +1251,10 @@ export const actions = {
1226
1251
  }
1227
1252
  },
1228
1253
 
1229
- nuxtClientInit({ dispatch, commit, rootState }, nuxt) {
1230
- commit('setRouter', nuxt.app.router);
1231
- commit('setRoute', nuxt.route);
1232
- commit('setPlugin', nuxt.app.$plugin);
1254
+ dashboardClientInit({ dispatch, commit, rootState }, context) {
1255
+ commit('setRouter', context.app.router);
1256
+ commit('setRoute', context.route);
1257
+ commit('setPlugin', context.app.$plugin);
1233
1258
 
1234
1259
  dispatch('management/rehydrateSubscribe');
1235
1260
  dispatch('cluster/rehydrateSubscribe');
@@ -1,6 +1,12 @@
1
1
  import { md5 } from '@shell/utils/crypto';
2
2
  import { randomStr } from '@shell/utils/string';
3
- import { EncryptedNotification, Notification, StoredNotification } from '@shell/types/notifications';
3
+ import {
4
+ EncryptedNotification,
5
+ Notification,
6
+ NotificationLevel,
7
+ NotificationHandlerExtensionName,
8
+ StoredNotification
9
+ } from '@shell/types/notifications';
4
10
  import { encrypt, decrypt, deriveKey } from '@shell/utils/crypto/encryption';
5
11
 
6
12
  /**
@@ -65,6 +71,9 @@ async function saveEncryptedNotification(getters: any, notification: Notificatio
65
71
  level: notification.level,
66
72
  primaryAction: notification.primaryAction,
67
73
  secondaryAction: notification.secondaryAction,
74
+ preference: notification.preference,
75
+ handlerName: notification.handlerName,
76
+ data: notification.data,
68
77
  };
69
78
 
70
79
  const localStorageKey = getters['localStorageKey'];
@@ -108,15 +117,23 @@ export const getters = {
108
117
  return state.notifications;
109
118
  },
110
119
 
120
+ visible: (state: NotificationsStore) => {
121
+ return state.notifications.filter((n) => n.level !== NotificationLevel.Hidden);
122
+ },
123
+
124
+ hidden: (state: NotificationsStore) => {
125
+ return state.notifications.filter((n) => n.level === NotificationLevel.Hidden);
126
+ },
127
+
111
128
  item: (state: NotificationsStore) => {
112
129
  return (id: string) => {
113
130
  return state.notifications.find((i) => i.id === id);
114
131
  };
115
132
  },
116
133
 
117
- // Count of unread notifications
134
+ // Count of unread notifications - only considers visible notifications
118
135
  unreadCount: (state: NotificationsStore) => {
119
- return state.notifications.filter((n) => !n.read).length;
136
+ return state.notifications.filter((n) => !n.read && n.level !== NotificationLevel.Hidden).length;
120
137
  },
121
138
 
122
139
  /**
@@ -192,9 +209,10 @@ export const mutations = {
192
209
  syncIndex(state);
193
210
  },
194
211
 
212
+ // Only mark visible notifications as read via mark all
195
213
  markAllRead(state: NotificationsStore) {
196
214
  state.notifications.forEach((notification) => {
197
- if (!notification.read) {
215
+ if (!notification.read && notification.level !== NotificationLevel.Hidden) {
198
216
  notification.read = true;
199
217
  }
200
218
  });
@@ -252,6 +270,20 @@ export const mutations = {
252
270
  },
253
271
  };
254
272
 
273
+ async function callNotifyHandler({ $extension }: any, notification: Notification, read: boolean) {
274
+ if (notification?.handlerName) {
275
+ const handler = $extension.getDynamic(NotificationHandlerExtensionName, notification.handlerName);
276
+
277
+ if (handler) {
278
+ try {
279
+ await handler.onReadUpdated(notification, read);
280
+ } catch (e) {
281
+ console.error('Error invoking notification handler', e); // eslint-disable-line no-console
282
+ }
283
+ }
284
+ }
285
+ }
286
+
255
287
  export const actions = {
256
288
  async add( { commit, dispatch, getters }: any, notification: Notification) {
257
289
  // We encrypt the notification on add - this is the only time we will encrypt it
@@ -295,6 +327,10 @@ export const actions = {
295
327
  if (notification?.preference) {
296
328
  await dispatch('prefs/set', notification.preference, { root: true });
297
329
  }
330
+
331
+ if (notification?.handlerName) {
332
+ await callNotifyHandler({ $extension: (this as any).$extension }, notification, true);
333
+ }
298
334
  },
299
335
 
300
336
  async markUnread({ commit, dispatch, getters }: any, id: string) {
@@ -309,6 +345,10 @@ export const actions = {
309
345
  value: notification.preference.unsetValue || '',
310
346
  }, { root: true });
311
347
  }
348
+
349
+ if (notification?.handlerName) {
350
+ await callNotifyHandler({ $extension: (this as any).$extension }, notification, false);
351
+ }
312
352
  },
313
353
 
314
354
  async markAllRead({ commit, dispatch, getters }: any) {
@@ -321,6 +361,13 @@ export const actions = {
321
361
  for (let i = 0; i < withPreference.length; i++) {
322
362
  await dispatch('prefs/set', withPreference[i].preference, { root: true });
323
363
  }
364
+
365
+ // For all notifications that have a handler, call the handler
366
+ const withHandler = getters.all.filter((n: Notification) => !!n.handlerName);
367
+
368
+ for (let i = 0; i < withHandler.length; i++) {
369
+ await callNotifyHandler({ $extension: (this as any).$extension }, withHandler[i], true);
370
+ }
324
371
  },
325
372
 
326
373
  remove({ commit, getters }: any, id: string) {
package/store/plugins.js CHANGED
@@ -43,7 +43,6 @@ export const rke1Supports = [
43
43
  // Map a credential driver name to a component name
44
44
  // e.g. ec2 and eks both use the 'aws' driver to share the same pool of creds.
45
45
  const driverMap = {
46
- aks: 'azure',
47
46
  amazonec2: 'aws',
48
47
  amazoneks: 'aws',
49
48
  amazonelasticcontainerservice: 'aws',
@@ -62,6 +61,9 @@ const driverToFieldMap = {
62
61
  aws: 'amazonec2',
63
62
  gcp: 'google',
64
63
  oracle: 'oci',
64
+ aks: 'azure',
65
+ eks: 'amazonec2',
66
+ gke: 'google'
65
67
  };
66
68
 
67
69
  // Machine driver fields that are probably a credential field
@@ -107,8 +109,10 @@ const driverToCloudProviderMap = {
107
109
  linode: '', // Show restricted options
108
110
  vmwarevsphere: 'rancher-vsphere',
109
111
  ovhcloudpubliccloud: '',
110
-
111
- custom: undefined // Show all options
112
+ aks: 'azure',
113
+ eks: 'aws',
114
+ gke: 'google',
115
+ custom: undefined // Show all options
112
116
  };
113
117
 
114
118
  // Dynamically loaded drivers can call this eventually to register their options
package/store/prefs.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { SETTING } from '@shell/config/settings';
2
2
  import { MANAGEMENT, STEVE } from '@shell/config/types';
3
3
  import { clone } from '@shell/utils/object';
4
+ import { getBrandMeta } from '@shell/utils/brand';
4
5
 
5
6
  const definitions = {};
6
7
  /**
@@ -114,6 +115,13 @@ export const PROVISIONER = create('provisioner', _RKE2, { options: [_RKE1, _RKE2
114
115
  export const MENU_MAX_CLUSTERS = 10;
115
116
  // Prompt for confirm when scaling down node pool in GUI and save the pref
116
117
  export const SCALE_POOL_PROMPT = create('scale-pool-prompt', null, { parseJSON });
118
+
119
+ // Dynamic content
120
+ export const READ_NEW_RELEASE = create('read-new-release', '', { parseJSON });
121
+ export const READ_SUPPORT_NOTICE = create('read-support-notice', '', { parseJSON });
122
+ export const READ_UPCOMING_SUPPORT_NOTICE = create('read-upcoming-support-notice', '', { parseJSON });
123
+ export const READ_ANNOUNCEMENTS = create('read-announcements', '', { parseJSON });
124
+
117
125
  // --------------------
118
126
 
119
127
  const cookiePrefix = 'R_';
@@ -515,16 +523,14 @@ export const actions = {
515
523
  setBrandStyle({ rootState, rootGetters }, dark = false) {
516
524
  if (rootState.managementReady) {
517
525
  try {
518
- const brandSetting = rootGetters['management/byId'](MANAGEMENT.SETTING, SETTING.BRAND);
519
-
520
- if (brandSetting && brandSetting.value && brandSetting.value !== '') {
521
- const brand = brandSetting.value;
526
+ const brandSetting = rootGetters['management/brand'];
522
527
 
523
- const brandMeta = require(`~shell/assets/brand/${ brand }/metadata.json`);
528
+ if (brandSetting !== '') {
529
+ const brandMeta = getBrandMeta(brandSetting);
524
530
  const hasStylesheet = brandMeta.hasStylesheet === 'true';
525
531
 
526
532
  if (hasStylesheet) {
527
- document.body.classList.add(brand);
533
+ document.body.classList.add(brandMeta);
528
534
  } else {
529
535
  // TODO option apply color at runtime
530
536
  }
package/store/type-map.js CHANGED
@@ -1895,7 +1895,7 @@ function ifHave(getters, option) {
1895
1895
  case IF_HAVE.NOT_V1_ISTIO: {
1896
1896
  return !isV1Istio(getters);
1897
1897
  }
1898
- case IF_HAVE.MULTI_CLUSTER: {
1898
+ case IF_HAVE.MULTI_CLUSTER: { // Used by harvester extension
1899
1899
  return getters.isMultiCluster;
1900
1900
  }
1901
1901
  case IF_HAVE.NEUVECTOR_NAMESPACE: {
@@ -1904,10 +1904,10 @@ function ifHave(getters, option) {
1904
1904
  case IF_HAVE.ADMIN: {
1905
1905
  return isAdminUser(getters);
1906
1906
  }
1907
- case IF_HAVE.MCM_DISABLED: {
1907
+ case IF_HAVE.MCM_DISABLED: { // There's a general MCM ff, this is conflating it with a harvester concept
1908
1908
  return !getters['isRancherInHarvester'];
1909
1909
  }
1910
- case IF_HAVE.NOT_STANDALONE_HARVESTER: {
1910
+ case IF_HAVE.NOT_STANDALONE_HARVESTER: { // Not used by harvester extension...
1911
1911
  return !getters['isStandaloneHarvester'];
1912
1912
  }
1913
1913
  default:
@@ -0,0 +1,86 @@
1
+ interface Context {
2
+ tag: string;
3
+ value: any;
4
+ hookId?: string;
5
+ description?: string;
6
+ icon?: string;
7
+ }
8
+
9
+ interface Element {
10
+ id: number;
11
+ context: Context
12
+ }
13
+
14
+ interface State {
15
+ idCounter: number;
16
+ elements: Record<string, Element>;
17
+ }
18
+
19
+ export const state = function(): State {
20
+ return {
21
+ idCounter: 0,
22
+ elements: {}
23
+ };
24
+ };
25
+
26
+ export const getters = {
27
+ all: (state: State) => {
28
+ return Object.values(state.elements)
29
+ .map((e) => e.context)
30
+ .sort((a, b) => (a.tag || '').localeCompare(b.tag || '') || 0);
31
+ },
32
+ };
33
+
34
+ export const mutations = {
35
+ add(state: State, element: Element) {
36
+ state.elements[element.id] = element;
37
+ },
38
+
39
+ update(state: State, element: Element) {
40
+ const existingElement = state.elements[element.id];
41
+
42
+ if (existingElement) {
43
+ existingElement.context = element.context;
44
+ }
45
+ },
46
+
47
+ remove(state: State, element: Element) {
48
+ delete state.elements[element.id];
49
+ }
50
+ };
51
+
52
+ let id = null;
53
+
54
+ export const actions = {
55
+ add({ commit, state }: { commit: Function, state: State }, context: Context) {
56
+ if (context?.value === undefined || !context?.tag) {
57
+ throw new Error(`[ui-context] context {{${ JSON.stringify(context) }}} is not valid`);
58
+ }
59
+
60
+ id = `ctx-${ state.idCounter++ }`;
61
+
62
+ commit('add', { id, context });
63
+
64
+ return id;
65
+ },
66
+
67
+ update({ commit, state }: { commit: Function, state: State }, element: Element) {
68
+ const old = state.elements[element.id];
69
+
70
+ if (!old) {
71
+ throw new Error(`[ui-context] element with id {{${ element.id }}} not found`);
72
+ }
73
+
74
+ commit('update', element);
75
+ },
76
+
77
+ remove({ commit, state }: { commit: Function, state: State }, id: number) {
78
+ const element = state.elements[id];
79
+
80
+ if (!element) {
81
+ throw new Error(`[ui-context] element with id {{${ id }}} not found`);
82
+ }
83
+
84
+ commit('remove', element);
85
+ }
86
+ };