@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
@@ -67,18 +67,19 @@ export default {
67
67
  const shellShortcut = '(Ctrl+`)';
68
68
 
69
69
  return {
70
- authInfo: {},
71
- show: false,
72
- showTooltip: false,
73
- isUserMenuOpen: false,
74
- isPageActionMenuOpen: false,
75
- kubeConfigCopying: false,
70
+ authInfo: {},
71
+ show: false,
72
+ showTooltip: false,
73
+ isUserMenuOpen: false,
74
+ isPageActionMenuOpen: false,
75
+ kubeConfigCopying: false,
76
76
  searchShortcut,
77
77
  shellShortcut,
78
78
  LOGGED_OUT,
79
- navHeaderRight: null,
80
- extensionHeaderActions: getApplicableExtensionEnhancements(this, ExtensionPoint.ACTION, ActionLocation.HEADER, this.$route),
81
- ctx: this
79
+ navHeaderRight: null,
80
+ extensionHeaderActions: getApplicableExtensionEnhancements(this, ExtensionPoint.ACTION, ActionLocation.HEADER, this.$route),
81
+ extensionActionsEnabled: {},
82
+ ctx: this
82
83
  };
83
84
  },
84
85
 
@@ -96,7 +97,6 @@ export default {
96
97
  'isSingleProduct',
97
98
  'isRancherInHarvester',
98
99
  'showTopLevelMenu',
99
- 'isMultiCluster',
100
100
  'showWorkspaceSwitcher'
101
101
  ]),
102
102
 
@@ -252,6 +252,7 @@ export default {
252
252
  handler(neu) {
253
253
  if (neu) {
254
254
  this.extensionHeaderActions = getApplicableExtensionEnhancements(this, ExtensionPoint.ACTION, ActionLocation.HEADER, neu);
255
+ this.updateExtensionActionsEnabled();
255
256
 
256
257
  this.navHeaderRight = this.$plugin?.getDynamic('component', 'NavHeaderRight');
257
258
  }
@@ -368,7 +369,7 @@ export default {
368
369
  });
369
370
  },
370
371
 
371
- handleExtensionAction(action, event) {
372
+ async handleExtensionAction(action, event) {
372
373
  const fn = action.invoke;
373
374
  const opts = {
374
375
  event,
@@ -377,7 +378,7 @@ export default {
377
378
  product: this.currentProduct.name,
378
379
  cluster: this.currentCluster,
379
380
  };
380
- const enabled = action.enabled ? action.enabled.apply(this, [this.ctx]) : true;
381
+ const enabled = await this.isActionEnabled(action);
381
382
 
382
383
  if (fn && enabled) {
383
384
  fn.apply(this, [opts, [], { $route: this.$route }]);
@@ -393,7 +394,25 @@ export default {
393
394
  }
394
395
 
395
396
  return null;
396
- }
397
+ },
398
+
399
+ async updateExtensionActionsEnabled() {
400
+ for (const [i, action] of this.extensionHeaderActions.entries()) {
401
+ this.extensionActionsEnabled[i] = await this.isActionEnabled(action);
402
+ }
403
+ },
404
+
405
+ async isActionEnabled(action) {
406
+ if (action.enabled === undefined) {
407
+ return true;
408
+ }
409
+
410
+ if (typeof action.enabled === 'function') {
411
+ return await action.enabled(this.ctx);
412
+ }
413
+
414
+ return action.enabled;
415
+ },
397
416
  }
398
417
  };
399
418
  </script>
@@ -404,7 +423,7 @@ export default {
404
423
  data-testid="header"
405
424
  >
406
425
  <div>
407
- <TopLevelMenu v-if="isRancherInHarvester || isMultiCluster || !isSingleProduct" />
426
+ <TopLevelMenu v-if="showTopLevelMenu" />
408
427
  </div>
409
428
 
410
429
  <div
@@ -475,7 +494,7 @@ export default {
475
494
  :alt="t('branding.logos.label')"
476
495
  />
477
496
  <div
478
- v-if="!currentCluster"
497
+ v-if="!currentCluster && !$route.path.startsWith('/c/')"
479
498
  class="simple-title"
480
499
  >
481
500
  <BrandImage
@@ -642,7 +661,7 @@ export default {
642
661
  :key="`${action.label}${i}`"
643
662
  v-clean-tooltip="handleExtensionTooltip(action)"
644
663
  v-shortkey="action.shortcutKey"
645
- :disabled="action.enabled ? !action.enabled(ctx) : false"
664
+ :disabled="!extensionActionsEnabled[i]"
646
665
  type="button"
647
666
  class="btn header-btn role-tertiary"
648
667
  :data-testid="`extension-header-action-${ action.labelKey || action.label }`"
@@ -837,11 +856,13 @@ export default {
837
856
 
838
857
  .product-name {
839
858
  font-size: 16px;
859
+ font-family: var(--title-font-family, unset); // Use the var if set, otherwise unset and use the font defined by the parent
840
860
  }
841
861
 
842
862
  .side-menu-logo {
843
863
  align-items: center;
844
864
  display: flex;
865
+ height: 55px;
845
866
  margin-right: 8px;
846
867
  max-width: 200px;
847
868
  padding: 12px 0;
@@ -673,9 +673,16 @@ export default {
673
673
  },
674
674
 
675
675
  removeOption(ns, event) {
676
- this.selectOption(ns);
677
676
  event.preventDefault();
678
677
  event.stopPropagation();
678
+
679
+ this.selectOption(ns);
680
+
681
+ if (event.type !== 'keydown' || this.value.length !== 0) {
682
+ return;
683
+ }
684
+
685
+ this.$refs.namespaceFilterInput.focus();
679
686
  },
680
687
 
681
688
  defaultOption() {
@@ -782,6 +789,7 @@ export default {
782
789
  ghost
783
790
  class="ns-chip-button"
784
791
  :data-testid="`namespaces-values-close-${j}`"
792
+ :aria-label="t('namespaceFilter.removeNamespace', { name: ns.label })"
785
793
  @click="removeOption(ns, $event)"
786
794
  @keydown.enter.space.stop="removeOption(ns, $event)"
787
795
  @mousedown="handleValueMouseDown(ns, $event)"
@@ -951,6 +959,10 @@ export default {
951
959
  display: inline-block;
952
960
  border-radius: var(--border-radius);
953
961
 
962
+ &:focus, &.focused {
963
+ @include focus-outline;
964
+ }
965
+
954
966
  .ns-glass {
955
967
  top: 0;
956
968
  bottom: 0;
@@ -13,7 +13,8 @@ import {
13
13
  } from '@components/RcDropdown';
14
14
 
15
15
  const store = useStore();
16
- const allNotifications = computed(() => store.getters['notifications/all']);
16
+ // We don't want any hidden notifications showing in the notification center (these are shown elsewhere, e.g. home page dynamic content announcements)
17
+ const allNotifications = computed(() => store.getters['notifications/visible']);
17
18
  const unreadLevelClass = computed(() => {
18
19
  return store.getters['notifications/unreadCount'] === 0 ? '' : 'unread';
19
20
  });
@@ -28,6 +28,7 @@ interface UpdateArgs {
28
28
  searchTerm: string,
29
29
  pinnedIds: string[],
30
30
  unPinnedMax?: number,
31
+ forceWatch?: boolean
31
32
  }
32
33
 
33
34
  type MgmtCluster = {
@@ -192,9 +193,12 @@ export class TopLevelMenuHelperPagination extends BaseTopLevelMenuHelper impleme
192
193
  this.clustersOthersWrapper = new PaginationWrapper({
193
194
  $store,
194
195
  id: 'tlm-unpinned-clusters',
195
- onChange: async() => {
196
+ onChange: async({ forceWatch }) => {
196
197
  if (this.args) {
197
- await this.update(this.args);
198
+ await this.update({
199
+ ...this.args,
200
+ forceWatch
201
+ });
198
202
  }
199
203
  },
200
204
  enabledFor: {
@@ -210,9 +214,12 @@ export class TopLevelMenuHelperPagination extends BaseTopLevelMenuHelper impleme
210
214
  this.provClusterWrapper = new PaginationWrapper({
211
215
  $store,
212
216
  id: 'tlm-prov-clusters',
213
- onChange: async() => {
217
+ onChange: async({ forceWatch }) => {
214
218
  if (this.args) {
215
- await this.update(this.args);
219
+ await this.update({
220
+ ...this.args,
221
+ forceWatch
222
+ });
216
223
  }
217
224
  },
218
225
  enabledFor: {
@@ -244,7 +251,7 @@ export class TopLevelMenuHelperPagination extends BaseTopLevelMenuHelper impleme
244
251
  pinned: MgmtCluster[],
245
252
  notPinned: MgmtCluster[]
246
253
  } = await allHash(promises) as any;
247
- const provClusters = await this.updateProvCluster(res.notPinned, res.pinned);
254
+ const provClusters = await this.updateProvCluster(res.notPinned, res.pinned, args.forceWatch || false);
248
255
  const provClustersByMgmtId = provClusters.reduce((res: { [mgmtId: string]: ProvCluster}, provCluster: ProvCluster) => {
249
256
  if (provCluster.mgmtClusterId) {
250
257
  res[provCluster.mgmtClusterId] = provCluster;
@@ -340,6 +347,7 @@ export class TopLevelMenuHelperPagination extends BaseTopLevelMenuHelper impleme
340
347
  }
341
348
 
342
349
  return this.clustersPinnedWrapper.request({
350
+ forceWatch: args.forceWatch,
343
351
  pagination: {
344
352
  filters: this.constructParams({
345
353
  pinnedIds: args.pinnedIds,
@@ -357,6 +365,7 @@ export class TopLevelMenuHelperPagination extends BaseTopLevelMenuHelper impleme
357
365
  */
358
366
  private async updateOthers(args: UpdateArgs): Promise<MgmtCluster[]> {
359
367
  return this.clustersOthersWrapper.request({
368
+ forceWatch: args.forceWatch,
360
369
  pagination: {
361
370
  filters: this.constructParams({
362
371
  searchTerm: args.searchTerm,
@@ -375,8 +384,9 @@ export class TopLevelMenuHelperPagination extends BaseTopLevelMenuHelper impleme
375
384
  /**
376
385
  * Find all provisioning clusters associated with the displayed mgmt clusters
377
386
  */
378
- private async updateProvCluster(notPinned: MgmtCluster[], pinned: MgmtCluster[]): Promise<ProvCluster[]> {
387
+ private async updateProvCluster(notPinned: MgmtCluster[], pinned: MgmtCluster[], forceWatch: boolean): Promise<ProvCluster[]> {
379
388
  return this.provClusterWrapper.request({
389
+ forceWatch,
380
390
  pagination: {
381
391
  filters: [
382
392
  PaginationParamFilter.createMultipleFields(
@@ -975,6 +975,8 @@ export default {
975
975
  $option-height: $icon-size + $option-padding + $option-padding;
976
976
 
977
977
  .side-menu {
978
+ font-family: var(--title-font-family, unset); // Use the var if set, otherwise unset and use the font defined by the parent
979
+
978
980
  .menu {
979
981
  position: absolute;
980
982
  width: $app-bar-collapsed-width;
@@ -1086,7 +1088,7 @@ export default {
1086
1088
  align-items: center;
1087
1089
  cursor: pointer;
1088
1090
  display: flex;
1089
- color: var(--link);
1091
+ color: var(--on-tertiary, var(--link));
1090
1092
  font-size: 14px;
1091
1093
  height: $option-height;
1092
1094
  white-space: nowrap;
@@ -1177,7 +1179,7 @@ export default {
1177
1179
  .rancher-provider-icon,
1178
1180
  svg {
1179
1181
  margin-right: 16px;
1180
- fill: var(--link);
1182
+ fill: var(--on-tertiary, var(--link));
1181
1183
  }
1182
1184
 
1183
1185
  .top-menu-icon {
@@ -1,105 +1,71 @@
1
- <script lang="ts">
2
- import { defineComponent } from 'vue';
3
- import { mapState } from 'vuex';
1
+ <script setup lang="ts">
2
+ import { onMounted } from 'vue';
4
3
  import { BOTTOM, CENTER, LEFT, RIGHT } from '@shell/utils/position';
5
-
6
- type Zone = null | typeof CENTER | typeof RIGHT | typeof BOTTOM | typeof LEFT;
7
-
8
- export interface Drag {
9
- active: boolean;
10
- zone: Zone;
11
- }
12
-
13
- interface Data {
14
- drag: Drag;
15
- }
16
-
17
- export default defineComponent({
18
- data(): Data {
19
- return {
20
- drag: {
21
- active: false,
22
- zone: CENTER,
23
- },
24
- };
25
- },
26
-
27
- computed: {
28
-
29
- ...mapState('wm', ['userPin']),
30
-
31
- pin: {
32
- get(): Zone {
33
- return this.userPin;
34
- },
35
-
36
- set(pin: Zone) {
37
- if (pin === CENTER) {
38
- return;
39
- }
40
- window.localStorage.setItem('wm-pin', pin as string);
41
- this.$store.commit('wm/setUserPin', pin);
42
- },
43
- },
44
-
45
- },
46
-
47
- methods: {
48
-
49
- onDragStart() {
50
- this.drag.active = true;
51
- },
52
-
53
- onDragOver(event: DragEvent, zone: Zone) {
54
- this.drag.zone = zone;
55
- if (zone !== CENTER) {
56
- event.preventDefault();
57
- }
58
- },
59
-
60
- onDragEnd() {
61
- this.pin = this.drag.zone;
62
- this.drag = {
63
- active: false,
64
- zone: CENTER,
65
- };
66
- },
67
-
68
- }
4
+ import useDragHandler from './composables/useDragHandler';
5
+ import { Z_INDEX } from './constants';
6
+
7
+ /**
8
+ * This component is responsible for rendering the pin area used during tab dragging.
9
+ *
10
+ * Behavior:
11
+ * - Enable drag areas for each position (left, right, bottom, center) when dragging is active.
12
+ * - Highlights the area where the tab can be pinned.
13
+ * - Uses z-index variables to ensure proper layering of drag areas.
14
+ */
15
+
16
+ const {
17
+ dragOverPositionsActive, pin, pinArea, lockedPositions, onDragPositionOver
18
+ } = useDragHandler();
19
+
20
+ onMounted(() => {
21
+ Object.keys(Z_INDEX).forEach((key) => {
22
+ document.documentElement.style.setProperty(
23
+ `--drag-area-${ key.toLowerCase().replaceAll('_', '-') }-z-index`, (Z_INDEX as any)[key].toString()
24
+ );
25
+ });
69
26
  });
70
27
  </script>
71
28
 
72
29
  <template>
73
- <div v-if="drag.active">
30
+ <div
31
+ v-if="dragOverPositionsActive"
32
+ class="pin-area-container"
33
+ >
74
34
  <span
75
- v-if="drag.zone != pin"
35
+ v-if="pinArea != pin"
76
36
  class="pin-effect-area"
77
- :class="drag.zone"
37
+ :class="pinArea"
78
38
  />
79
39
  <span
80
40
  class="drag-area center"
81
- @dragover="onDragOver($event, 'center')"
41
+ @dragover="onDragPositionOver($event, CENTER)"
82
42
  />
83
43
  <span
44
+ v-if="!lockedPositions.includes(RIGHT)"
84
45
  class="drag-area right"
85
- @dragover="onDragOver($event, 'right')"
46
+ @dragover="onDragPositionOver($event, RIGHT)"
86
47
  />
87
48
  <span
88
- class="drag-area bottom"
89
- @dragover="onDragOver($event, 'bottom')"
49
+ v-if="!lockedPositions.includes(LEFT)"
50
+ class="drag-area left"
51
+ @dragover="onDragPositionOver($event, LEFT)"
90
52
  />
91
53
  <span
92
- class="drag-area left"
93
- @dragover="onDragOver($event, 'left')"
54
+ v-if="!lockedPositions.includes(BOTTOM)"
55
+ class="drag-area bottom"
56
+ @dragover="onDragPositionOver($event, BOTTOM)"
94
57
  />
95
58
  </div>
96
59
  </template>
97
60
 
98
61
  <style lang='scss' scoped>
62
+ .pin-area-container {
63
+ display: contents;
64
+ }
99
65
 
100
66
  .pin-effect-area {
101
67
  position: absolute;
102
- z-index: 997;
68
+ z-index: var(--drag-area-pin-effect-z-index);
103
69
  width: 0;
104
70
  height: 0;
105
71
  border-style: hidden;
@@ -142,10 +108,8 @@ export default defineComponent({
142
108
  }
143
109
  }
144
110
 
145
- // ToDo make height and width as input variable
146
111
  .drag-area {
147
112
  position: absolute;
148
- z-index: 999;
149
113
  width: 0;
150
114
  height: 0;
151
115
  opacity: 0;
@@ -155,7 +119,7 @@ export default defineComponent({
155
119
  right: 0;
156
120
  width: 100%;
157
121
  height: 100%;
158
- z-index: 998;
122
+ z-index: var(--drag-area-center-z-index);
159
123
  }
160
124
 
161
125
  &.right {
@@ -163,6 +127,7 @@ export default defineComponent({
163
127
  right: 0;
164
128
  width: 300px;
165
129
  height: 100%;
130
+ z-index: var(--drag-area-right-z-index);
166
131
  }
167
132
 
168
133
  &.left {
@@ -170,12 +135,14 @@ export default defineComponent({
170
135
  left: 0;
171
136
  width: 300px;
172
137
  height: 100%;
138
+ z-index: var(--drag-area-left-z-index);
173
139
  }
174
140
 
175
141
  &.bottom {
176
142
  bottom: 0;
177
143
  height: 270px;
178
144
  width: 100%;
145
+ z-index: var(--drag-area-bottom-z-index);
179
146
  }
180
147
  }
181
148
  </style>
@@ -0,0 +1,70 @@
1
+ import {
2
+ ref,
3
+ markRaw,
4
+ } from 'vue';
5
+ import { useStore } from 'vuex';
6
+
7
+ const warn = (msg: string, ...args: any[]) => {
8
+ console.warn(`[wm] ${ msg } ${ args?.reduce((acc, v) => `${ acc } '${ v }'`, '') }`); /* eslint-disable-line no-console */
9
+ };
10
+
11
+ /**
12
+ * This composable is responsible for loading the tabs body components.
13
+ *
14
+ * - It supports loading components from Rancher extensions as well as from the TypeMap (defined in shell/components/Window directory).
15
+ * - The component is cached after the first load to optimize performance.
16
+ *
17
+ * Loading a component from extension:
18
+ *
19
+ * // Register the component in the extension index file:
20
+ * plugin.register('component', 'TestComponent', defineAsyncComponent(() => import('./pages/TestComponent.vue')));
21
+ *
22
+ * // Use the component in a tab by specifying its name and extensionId:
23
+ * store.dispatch('wm/open', {
24
+ * id: PRODUCT_NAME,
25
+ * extensionId: PRODUCT_NAME,
26
+ * label: 'Label',
27
+ * component: 'TestComponent',
28
+ * position: 'bottom',
29
+ * layouts: [
30
+ * Layout.default,
31
+ * Layout.home
32
+ * ],
33
+ * showHeader: false,
34
+ * }, { root: true });
35
+ *
36
+ */
37
+
38
+ export default () => {
39
+ const store = useStore();
40
+
41
+ const components = ref<any>({});
42
+
43
+ function loadComponent(tab: { component?: string, extensionId?: string }) {
44
+ const { component: name, extensionId } = tab || {};
45
+
46
+ if (!name) {
47
+ warn('component name not provided');
48
+
49
+ return null;
50
+ }
51
+
52
+ if (!components.value[name]) {
53
+ if (!!extensionId) {
54
+ warn(`loading component from extension`, name, extensionId);
55
+ components.value[name] = markRaw((store as any).$extension?.getDynamic('component', name));
56
+ } else if (store.getters['type-map/hasCustomWindowComponent'](name)) {
57
+ warn(`loading component from TypeMap`, name);
58
+ components.value[name] = markRaw(store.getters['type-map/importWindowComponent'](name));
59
+ }
60
+ }
61
+
62
+ if (!components.value[name]) {
63
+ warn(`component not found for`, name);
64
+ }
65
+
66
+ return components.value[name];
67
+ }
68
+
69
+ return { loadComponent };
70
+ };
@@ -0,0 +1,105 @@
1
+ import { computed } from 'vue';
2
+ import debounce from 'lodash/debounce';
3
+ import { useStore } from 'vuex';
4
+ import { BOTTOM, LEFT, RIGHT } from '@shell/utils/position';
5
+ import { Position } from '@shell/types/window-manager';
6
+ import { CSS_KEY } from '../constants';
7
+
8
+ /**
9
+ * This composable is responsible for handling the dimensions of the window manager panels.
10
+ */
11
+ export default (props: { position: Position }) => {
12
+ const store = useStore();
13
+
14
+ const height = computed({
15
+ get() {
16
+ const panelHeight = store.state.wm.panelHeight[props.position];
17
+
18
+ if (panelHeight) {
19
+ return panelHeight;
20
+ }
21
+
22
+ const windowHeight = window.innerHeight;
23
+ let height = panelHeight ? parseInt(panelHeight, 10) : 0;
24
+
25
+ if ( !height ) {
26
+ height = Math.round(windowHeight / 2);
27
+ }
28
+ height = Math.min(height, 3 * windowHeight / 4);
29
+
30
+ setDimensions({ height });
31
+
32
+ return height;
33
+ },
34
+
35
+ set(height) {
36
+ setDimensions({ height });
37
+ },
38
+ });
39
+
40
+ const width = computed({
41
+ get() {
42
+ const panelWidth = store.state.wm.panelWidth[props.position];
43
+
44
+ if (panelWidth) {
45
+ return panelWidth;
46
+ }
47
+
48
+ const windowWidth = window.innerWidth;
49
+ let width = panelWidth ? parseInt(panelWidth, 10) : 0;
50
+
51
+ if (!width) {
52
+ width = Math.round(windowWidth / 8);
53
+ }
54
+ width = Math.min(width, 3 * windowWidth / 4);
55
+
56
+ setDimensions({ width });
57
+
58
+ return width;
59
+ },
60
+ set(width) {
61
+ setDimensions({ width });
62
+ }
63
+ });
64
+
65
+ function openPanel(position: Position) {
66
+ setCssVariable(position, position === BOTTOM ? height.value : width.value);
67
+ }
68
+
69
+ function closePanel(position: Position) {
70
+ setCssVariable(position, 0);
71
+ }
72
+
73
+ function setDimensions(args: { width?: number, height?: number } = {}) {
74
+ const h = Number(args.height || height.value) || 0;
75
+ const w = Number(args.width || width.value) || 0;
76
+
77
+ switch (props.position) {
78
+ case RIGHT:
79
+ case LEFT:
80
+ setCssVariable(props.position, w);
81
+ debouncedSetPanelWidth(props.position, w);
82
+ break;
83
+ case BOTTOM:
84
+ setCssVariable(BOTTOM, h);
85
+ debouncedSetPanelHeight(props.position, h);
86
+ break;
87
+ }
88
+ }
89
+
90
+ const debouncedSetPanelWidth = debounce((position, width) => {
91
+ store.commit('wm/setPanelWidth', { position, width });
92
+ }, 250);
93
+
94
+ const debouncedSetPanelHeight = debounce((position, height) => {
95
+ store.commit('wm/setPanelHeight', { position, height });
96
+ }, 250);
97
+
98
+ function setCssVariable(position: Position, value: number) {
99
+ document.documentElement.style.setProperty(CSS_KEY[position as keyof typeof CSS_KEY], `${ value }px`);
100
+ }
101
+
102
+ return {
103
+ width, height, setDimensions, openPanel, closePanel,
104
+ };
105
+ };