dashboard-shell-shell 3.0.2-test.20250913 → 3.0.5-test.2

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 (628) hide show
  1. package/assets/data/aws-regions.json +3 -0
  2. package/assets/icons/demo.css:Zone.Identifier +0 -0
  3. package/assets/icons/demo_index.html:Zone.Identifier +0 -0
  4. package/assets/icons/iconfont.css:Zone.Identifier +0 -0
  5. package/assets/icons/iconfont.js:Zone.Identifier +0 -0
  6. package/assets/icons/iconfont.json:Zone.Identifier +0 -0
  7. package/assets/icons/iconfont.ttf:Zone.Identifier +0 -0
  8. package/assets/icons/iconfont.woff2:Zone.Identifier +0 -0
  9. package/assets/icons/iconfont.woff:Zone.Identifier +0 -0
  10. package/assets/images/icons/document.svg +3 -0
  11. package/assets/images/key.svg +17 -0
  12. package/assets/images/providers/sks.svg +1 -0
  13. package/assets/images/vendor/cognito.svg +1 -0
  14. package/assets/styles/app.scss +3 -0
  15. package/assets/styles/base/_basic.scss +10 -0
  16. package/assets/styles/base/_spacing.scss +29 -0
  17. package/assets/styles/base/_variables.scss +16 -10
  18. package/assets/styles/global/_labeled-input.scss +1 -1
  19. package/assets/styles/global/_layout.scss +1 -1
  20. package/assets/styles/themes/_dark.scss +30 -0
  21. package/assets/styles/themes/_light.scss +80 -2
  22. package/assets/translations/en-us.yaml +822 -105
  23. package/assets/translations/zh-hans.yaml +13 -3
  24. package/chart/__tests__/S3.test.ts +2 -1
  25. package/chart/monitoring/index.vue +1 -1
  26. package/cloud-credential/gcp.vue +9 -1
  27. package/components/ActionMenuShell.vue +3 -7
  28. package/components/AppModal.vue +9 -28
  29. package/components/AsyncButton.vue +2 -0
  30. package/components/BrandImage.vue +0 -21
  31. package/components/Certificates.vue +5 -0
  32. package/components/CodeMirror.vue +3 -3
  33. package/components/CommunityLinks.vue +3 -58
  34. package/components/ConfigMapSettings/Settings.vue +377 -0
  35. package/components/ConfigMapSettings/index.vue +354 -0
  36. package/components/CruResource.vue +103 -16
  37. package/components/DetailText.vue +61 -11
  38. package/components/Drawer/Chrome.vue +115 -0
  39. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +61 -0
  40. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
  41. package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
  42. package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
  43. package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +106 -0
  44. package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
  45. package/components/Drawer/ResourceDetailDrawer/composables.ts +53 -0
  46. package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
  47. package/components/Drawer/ResourceDetailDrawer/index.vue +123 -0
  48. package/components/ExplorerProjectsNamespaces.vue +46 -29
  49. package/components/FilterPanel.vue +156 -0
  50. package/components/FixedBanner.vue +19 -5
  51. package/components/{fleet/ForceDirectedTreeChart/index.vue → ForceDirectedTreeChart.vue} +47 -41
  52. package/components/GrowlManager.vue +16 -15
  53. package/components/IconOrSvg.vue +19 -35
  54. package/components/KeyValueView.vue +1 -1
  55. package/components/LandingPagePreference.vue +2 -0
  56. package/components/Loading.vue +1 -1
  57. package/components/LocaleSelector.vue +10 -2
  58. package/components/PaginatedResourceTable.vue +53 -1
  59. package/components/ProgressBarMulti.vue +1 -0
  60. package/components/PromptModal.vue +38 -7
  61. package/components/PromptRemove.vue +5 -1
  62. package/components/PromptRestore.vue +22 -44
  63. package/components/RelatedResources.vue +4 -12
  64. package/components/Resource/Detail/Additional.vue +46 -0
  65. package/components/Resource/Detail/Card/PodsCard/Bubble.vue +13 -0
  66. package/components/Resource/Detail/Card/PodsCard/composable.ts +30 -0
  67. package/components/Resource/Detail/Card/PodsCard/index.vue +118 -0
  68. package/components/Resource/Detail/Card/ResourceUsageCard/composable.ts +51 -0
  69. package/components/Resource/Detail/Card/ResourceUsageCard/index.vue +79 -0
  70. package/components/Resource/Detail/Card/Scaler.vue +89 -0
  71. package/components/Resource/Detail/Card/StateCard/composables.ts +112 -0
  72. package/components/Resource/Detail/Card/StateCard/index.vue +39 -0
  73. package/components/Resource/Detail/Card/VerticalGap.vue +11 -0
  74. package/components/Resource/Detail/Card/__tests__/Card.test.ts +36 -0
  75. package/components/Resource/Detail/Card/__tests__/PodsCard.test.ts +84 -0
  76. package/components/Resource/Detail/Card/__tests__/ResourceUsageCard.test.ts +72 -0
  77. package/components/Resource/Detail/Card/__tests__/Scaler.test.ts +87 -0
  78. package/components/Resource/Detail/Card/__tests__/StateCard.test.ts +53 -0
  79. package/components/Resource/Detail/Card/__tests__/VerticalGap.test.ts +14 -0
  80. package/components/Resource/Detail/Card/__tests__/index.test.ts +36 -0
  81. package/components/Resource/Detail/Card/index.vue +56 -0
  82. package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +19 -0
  83. package/components/Resource/Detail/Metadata/Annotations/composable.ts +12 -0
  84. package/components/Resource/Detail/Metadata/Annotations/index.vue +31 -0
  85. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
  86. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/index.test.ts +103 -0
  87. package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +72 -0
  88. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +317 -0
  89. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +140 -0
  90. package/components/Resource/Detail/Metadata/KeyValue.vue +140 -0
  91. package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +18 -0
  92. package/components/Resource/Detail/Metadata/Labels/composable.ts +12 -0
  93. package/components/Resource/Detail/Metadata/Labels/index.vue +31 -0
  94. package/components/Resource/Detail/Metadata/Rectangle.vue +34 -0
  95. package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +107 -0
  96. package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +24 -0
  97. package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
  98. package/components/Resource/Detail/Metadata/__tests__/index.test.ts +91 -0
  99. package/components/Resource/Detail/Metadata/composables.ts +81 -0
  100. package/components/Resource/Detail/Metadata/index.vue +88 -0
  101. package/components/Resource/Detail/Page.vue +37 -0
  102. package/components/Resource/Detail/PercentageBar.vue +40 -0
  103. package/components/Resource/Detail/ResourceRow.vue +138 -0
  104. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
  105. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
  106. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
  107. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
  108. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
  109. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
  110. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
  111. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
  112. package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
  113. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
  114. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
  115. package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
  116. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
  117. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
  118. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
  119. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
  120. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
  121. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
  122. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
  123. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
  124. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
  125. package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
  126. package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
  127. package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
  128. package/components/Resource/Detail/SpacedRow.vue +14 -0
  129. package/components/Resource/Detail/StatusBar.vue +59 -0
  130. package/components/Resource/Detail/StatusRow.vue +61 -0
  131. package/components/Resource/Detail/TitleBar/Title.vue +14 -0
  132. package/components/Resource/Detail/TitleBar/Top.vue +14 -0
  133. package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +17 -0
  134. package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +17 -0
  135. package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
  136. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +142 -0
  137. package/components/Resource/Detail/TitleBar/composables.ts +46 -0
  138. package/components/Resource/Detail/TitleBar/index.vue +204 -0
  139. package/components/Resource/Detail/Top/index.vue +34 -0
  140. package/components/Resource/Detail/__tests__/Page.test.ts +32 -0
  141. package/components/Resource/Detail/composables.ts +45 -0
  142. package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
  143. package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
  144. package/components/ResourceDetail/Masthead/index.vue +65 -0
  145. package/components/ResourceDetail/Masthead/latest.vue +44 -0
  146. package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +0 -1
  147. package/components/ResourceDetail/__tests__/index.test.ts +135 -0
  148. package/components/ResourceDetail/index.vue +75 -575
  149. package/components/ResourceDetail/legacy.vue +564 -0
  150. package/components/ResourceList/Masthead.vue +69 -20
  151. package/components/ResourceList/index.vue +3 -2
  152. package/components/ResourceTable.vue +59 -85
  153. package/components/ResourceYaml.vue +15 -2
  154. package/components/RichTranslation.vue +106 -0
  155. package/components/SlideInPanelManager.vue +116 -14
  156. package/components/SortableTable/index.vue +10 -2
  157. package/components/SortableTable/paging.js +15 -16
  158. package/components/SortableTable/selection.js +22 -10
  159. package/components/StateDot/index.vue +28 -0
  160. package/components/StatusBadge.vue +6 -4
  161. package/components/SubtleLink.vue +25 -0
  162. package/components/Tabbed/index.vue +38 -22
  163. package/components/Wizard.vue +16 -3
  164. package/components/YamlEditor.vue +1 -2
  165. package/components/__tests__/AsyncButton.test.ts +39 -0
  166. package/components/__tests__/ConfigMapSettings.test.ts +376 -0
  167. package/components/__tests__/CruResource.test.ts +63 -0
  168. package/components/__tests__/FilterPanel.test.ts +81 -0
  169. package/components/__tests__/GrowlManager.test.ts +0 -25
  170. package/components/__tests__/PromptModal.test.ts +146 -0
  171. package/components/__tests__/PromptRestore.test.ts +1 -65
  172. package/components/__tests__/RichTranslation.test.ts +115 -0
  173. package/components/auth/AuthBanner.vue +15 -14
  174. package/components/auth/Principal.vue +0 -1
  175. package/components/auth/RoleDetailEdit.vue +44 -4
  176. package/components/auth/login/ldap.vue +2 -2
  177. package/components/auth/login/oidc.vue +6 -1
  178. package/components/fleet/FleetApplications.vue +174 -0
  179. package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
  180. package/components/fleet/FleetClusterTargets/index.vue +455 -0
  181. package/components/fleet/FleetClusters.vue +25 -6
  182. package/components/fleet/FleetGitRepoPaths.vue +476 -0
  183. package/components/fleet/FleetHelmOps.vue +123 -0
  184. package/components/fleet/FleetIntro.vue +58 -28
  185. package/components/fleet/FleetNoWorkspaces.vue +5 -1
  186. package/components/fleet/FleetOCIStorageSecret.vue +171 -0
  187. package/components/fleet/FleetRepos.vue +37 -80
  188. package/components/fleet/FleetResources.vue +69 -27
  189. package/components/fleet/FleetSummary.vue +26 -51
  190. package/components/fleet/FleetValuesFrom.vue +295 -0
  191. package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
  192. package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
  193. package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +213 -0
  194. package/components/fleet/__tests__/FleetSummary.test.ts +39 -39
  195. package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
  196. package/components/fleet/dashboard/Empty.vue +73 -0
  197. package/components/fleet/dashboard/ResourceCard.vue +184 -0
  198. package/components/fleet/dashboard/ResourceCardSummary.vue +195 -0
  199. package/components/fleet/dashboard/ResourceDetails.vue +194 -0
  200. package/components/fleet/dashboard/ResourcePanel.vue +384 -0
  201. package/components/form/ArrayList.vue +144 -116
  202. package/components/form/BannerSettings.vue +117 -50
  203. package/components/form/ChangePassword.vue +3 -1
  204. package/components/form/ColorInput.vue +35 -6
  205. package/components/form/FileImageSelector.vue +1 -1
  206. package/components/form/Footer.vue +10 -4
  207. package/components/form/KeyValue.vue +92 -51
  208. package/components/form/LabeledSelect.vue +72 -54
  209. package/components/form/Labels.vue +91 -21
  210. package/components/form/MatchExpressions.vue +56 -9
  211. package/components/form/NameNsDescription.vue +12 -8
  212. package/components/form/Networking.vue +24 -19
  213. package/components/form/NotificationSettings.vue +15 -1
  214. package/components/form/ResourceLabeledSelect.vue +22 -8
  215. package/components/form/ResourceSelector.vue +27 -23
  216. package/components/form/ResourceTabs/index.vue +7 -1
  217. package/components/form/SSHKnownHosts/index.vue +14 -11
  218. package/components/form/SecretSelector.vue +18 -2
  219. package/components/form/Select.vue +57 -26
  220. package/components/form/SelectOrCreateAuthSecret.vue +6 -3
  221. package/components/form/SimpleSecretSelector.vue +17 -4
  222. package/components/form/Taints.vue +21 -2
  223. package/components/form/UnitInput.vue +21 -0
  224. package/components/form/ValueFromResource.vue +31 -19
  225. package/components/form/__tests__/ArrayList.test.ts +32 -0
  226. package/components/form/__tests__/ColorInput.test.ts +35 -0
  227. package/components/form/__tests__/KeyValue.test.ts +36 -0
  228. package/components/form/__tests__/LabeledSelect.test.ts +79 -2
  229. package/components/form/__tests__/Labels.test.ts +360 -0
  230. package/components/form/__tests__/MatchExpressions.test.ts +16 -13
  231. package/components/form/__tests__/Networking.test.ts +116 -0
  232. package/components/form/__tests__/SSHKnownHosts.test.ts +11 -2
  233. package/components/form/__tests__/Select.test.ts +37 -1
  234. package/components/form/__tests__/UnitInput.test.ts +23 -1
  235. package/components/form/labeled-select-utils/labeled-select-pagination.ts +3 -38
  236. package/components/formatter/ClusterLink.vue +5 -8
  237. package/components/formatter/Description.vue +30 -0
  238. package/components/formatter/FleetApplicationClustersReady.vue +77 -0
  239. package/components/formatter/FleetApplicationSource.vue +79 -0
  240. package/components/formatter/FleetSummaryGraph.vue +7 -0
  241. package/components/formatter/PodImages.vue +1 -1
  242. package/components/formatter/WorkloadHealthScale.vue +1 -1
  243. package/components/formatter/__tests__/ClusterLink.test.ts +2 -32
  244. package/components/formatter/__tests__/LiveDate.test.ts +10 -2
  245. package/components/google/AccountAccess.vue +209 -0
  246. package/components/google/types/gcp.d.ts +136 -0
  247. package/components/google/types/index.d.ts +101 -0
  248. package/components/google/util/__mocks__/gcp.ts +465 -0
  249. package/components/google/util/formatter.ts +82 -0
  250. package/components/google/util/gcp.ts +134 -0
  251. package/components/google/util/index.d.ts +11 -0
  252. package/components/nav/Favorite.vue +1 -1
  253. package/components/nav/Group.vue +5 -0
  254. package/components/nav/Header.vue +24 -38
  255. package/components/nav/NamespaceFilter.vue +141 -84
  256. package/components/nav/NotificationCenter/Notification.vue +484 -0
  257. package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
  258. package/components/nav/NotificationCenter/index.vue +148 -0
  259. package/components/nav/TopLevelMenu.helper.ts +55 -34
  260. package/components/nav/TopLevelMenu.vue +11 -0
  261. package/components/nav/Type.vue +4 -1
  262. package/components/nav/WindowManager/ContainerLogs.vue +87 -61
  263. package/components/nav/WindowManager/ContainerLogsActions.vue +76 -0
  264. package/components/nav/WindowManager/index.vue +3 -2
  265. package/components/templates/default.vue +0 -3
  266. package/components/templates/plain.vue +0 -3
  267. package/composables/drawer.ts +26 -0
  268. package/composables/focusTrap.ts +3 -3
  269. package/composables/resources.test.ts +63 -0
  270. package/composables/resources.ts +38 -0
  271. package/composables/useI18n.ts +12 -11
  272. package/composables/useIsNewDetailPageEnabled.ts +17 -0
  273. package/config/labels-annotations.js +22 -11
  274. package/config/pagination-table-headers.js +8 -1
  275. package/config/private-label.js +0 -1
  276. package/config/product/auth.js +20 -3
  277. package/config/product/{cis.js → compliance.js} +23 -26
  278. package/config/product/explorer.js +49 -17
  279. package/config/product/fleet.js +77 -17
  280. package/config/product/manager.js +1 -29
  281. package/config/product/settings.js +23 -11
  282. package/config/query-params.js +16 -1
  283. package/config/roles.ts +2 -1
  284. package/config/router/navigation-guards/authentication.js +51 -2
  285. package/config/router/navigation-guards/index.js +5 -67
  286. package/config/router/routes.js +65 -31
  287. package/config/secret.ts +15 -0
  288. package/config/settings.ts +33 -16
  289. package/config/store.js +2 -0
  290. package/config/system-namespaces.js +1 -1
  291. package/config/table-headers.js +91 -30
  292. package/config/types.js +18 -7
  293. package/config/version.js +1 -1
  294. package/core/plugin-helpers.ts +3 -2
  295. package/core/plugin.ts +32 -7
  296. package/core/types.ts +25 -7
  297. package/detail/catalog.cattle.io.app.vue +5 -1
  298. package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
  299. package/detail/fleet.cattle.io.bundle.vue +70 -6
  300. package/detail/fleet.cattle.io.cluster.vue +28 -15
  301. package/detail/fleet.cattle.io.gitrepo.vue +11 -2
  302. package/detail/fleet.cattle.io.helmop.vue +157 -0
  303. package/detail/management.cattle.io.fleetworkspace.vue +18 -27
  304. package/detail/management.cattle.io.oidcclient.vue +369 -0
  305. package/detail/namespace.vue +0 -3
  306. package/detail/node.vue +20 -16
  307. package/detail/pod.vue +2 -2
  308. package/detail/provisioning.cattle.io.cluster.vue +16 -50
  309. package/detail/service.vue +10 -2
  310. package/detail/workload/index.vue +48 -39
  311. package/dialog/AddCustomBadgeDialog.vue +0 -1
  312. package/{pages/c/_cluster/uiplugins/AddExtensionRepos.vue → dialog/AddExtensionReposDialog.vue} +72 -42
  313. package/dialog/AddonConfigConfirmationDialog.vue +1 -1
  314. package/dialog/AssignToDialog.vue +176 -0
  315. package/dialog/ChangePasswordDialog.vue +106 -0
  316. package/{pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue → dialog/DeveloperLoadExtensionDialog.vue} +74 -71
  317. package/dialog/DisableAuthProviderDialog.vue +101 -0
  318. package/dialog/DrainNode.vue +1 -1
  319. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue → dialog/ExtensionCatalogInstallDialog.vue} +100 -88
  320. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue → dialog/ExtensionCatalogUninstallDialog.vue} +87 -66
  321. package/dialog/FeatureFlagListDialog.vue +288 -0
  322. package/dialog/ForceMachineRemoveDialog.vue +1 -1
  323. package/dialog/GenericPrompt.vue +1 -1
  324. package/dialog/HelmOpForceUpdateDialog.vue +132 -0
  325. package/{components/Import.vue → dialog/ImportDialog.vue} +8 -13
  326. package/{pages/c/_cluster/uiplugins/InstallDialog.vue → dialog/InstallExtensionDialog.vue} +124 -106
  327. package/{components/form/SSHKnownHosts → dialog}/KnownHostsEditDialog.vue +52 -62
  328. package/dialog/MoveNamespaceDialog.vue +157 -0
  329. package/dialog/OidcClientSecretDialog.vue +117 -0
  330. package/dialog/RedeployWorkloadDialog.vue +164 -0
  331. package/dialog/RotateEncryptionKeyDialog.vue +10 -30
  332. package/dialog/ScalePoolDownDialog.vue +1 -1
  333. package/{components/nav/Jump.vue → dialog/SearchDialog.vue} +34 -14
  334. package/{pages/c/_cluster/uiplugins/UninstallDialog.vue → dialog/UninstallExtensionDialog.vue} +67 -58
  335. package/dialog/WechatDialog.vue +57 -0
  336. package/{components/form/SSHKnownHosts → dialog}/__tests__/KnownHostsEditDialog.test.ts +15 -34
  337. package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
  338. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +60 -68
  339. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
  340. package/edit/__tests__/service.test.ts +2 -1
  341. package/edit/auth/ldap/__tests__/config.test.ts +14 -0
  342. package/edit/auth/ldap/config.vue +24 -0
  343. package/edit/auth/oidc.vue +159 -93
  344. package/edit/autoscaling.horizontalpodautoscaler/index.vue +4 -1
  345. package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
  346. package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
  347. package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
  348. package/edit/configmap.vue +8 -2
  349. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  350. package/edit/fleet.cattle.io.gitrepo.vue +70 -256
  351. package/edit/fleet.cattle.io.helmop.vue +786 -0
  352. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  353. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  354. package/edit/logging-flow/index.vue +1 -0
  355. package/edit/logging.banzaicloud.io.output/index.vue +2 -1
  356. package/edit/logging.banzaicloud.io.output/providers/awsElasticsearch.vue +5 -6
  357. package/edit/management.cattle.io.fleetworkspace.vue +44 -10
  358. package/edit/management.cattle.io.oidcclient.vue +162 -0
  359. package/edit/management.cattle.io.project.vue +4 -1
  360. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  361. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
  362. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  363. package/edit/monitoring.coreos.com.receiver/auth.vue +3 -3
  364. package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
  365. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  366. package/edit/monitoring.coreos.com.route.vue +1 -0
  367. package/edit/namespace.vue +2 -4
  368. package/edit/networking.istio.io.destinationrule/index.vue +4 -1
  369. package/edit/networking.k8s.io.ingress/Certificate.vue +11 -3
  370. package/edit/networking.k8s.io.ingress/__tests__/Certificate.test.ts +37 -0
  371. package/edit/networking.k8s.io.ingress/index.vue +4 -1
  372. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +3 -14
  373. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +57 -62
  374. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +10 -16
  375. package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.test.ts +72 -41
  376. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/mock.json +17 -1
  377. package/edit/networking.k8s.io.networkpolicy/index.vue +23 -31
  378. package/edit/node.vue +1 -0
  379. package/edit/persistentvolume/index.vue +4 -1
  380. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +26 -12
  381. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +69 -2
  382. package/edit/provisioning.cattle.io.cluster/__tests__/utils/rke2-test-data.ts +58 -0
  383. package/edit/provisioning.cattle.io.cluster/index.vue +21 -73
  384. package/edit/provisioning.cattle.io.cluster/rke2.vue +535 -428
  385. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +48 -39
  386. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +5 -3
  387. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
  388. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +2 -2
  389. package/edit/resources.cattle.io.restore.vue +1 -1
  390. package/edit/secret/basic.vue +1 -0
  391. package/edit/secret/index.vue +127 -15
  392. package/edit/service.vue +17 -29
  393. package/edit/serviceaccount.vue +4 -1
  394. package/edit/storage.k8s.io.storageclass/index.vue +4 -1
  395. package/edit/workload/index.vue +11 -15
  396. package/edit/workload/mixins/workload.js +0 -2
  397. package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
  398. package/list/fleet.cattle.io.gitrepo.vue +1 -1
  399. package/list/fleet.cattle.io.helmop.vue +108 -0
  400. package/list/harvesterhci.io.management.cluster.vue +0 -17
  401. package/list/management.cattle.io.feature.vue +4 -288
  402. package/list/management.cattle.io.oidcclient.vue +108 -0
  403. package/list/management.cattle.io.user.vue +13 -20
  404. package/list/namespace.vue +6 -2
  405. package/list/node.vue +2 -0
  406. package/list/projectsecret.vue +345 -0
  407. package/list/secret.vue +109 -0
  408. package/list/workload.vue +6 -2
  409. package/machine-config/__tests__/vmwarevsphere.test.ts +5 -7
  410. package/machine-config/amazonec2.vue +3 -24
  411. package/machine-config/components/GCEImage.vue +374 -0
  412. package/machine-config/google.vue +617 -0
  413. package/machine-config/vmwarevsphere.vue +7 -17
  414. package/mixins/__tests__/brand.spec.ts +170 -0
  415. package/mixins/auth-config.js +8 -1
  416. package/mixins/brand.js +16 -17
  417. package/mixins/create-edit-view/impl.js +10 -1
  418. package/mixins/create-edit-view/index.js +5 -0
  419. package/mixins/preset.js +100 -0
  420. package/mixins/resource-fetch-api-pagination.js +73 -44
  421. package/mixins/resource-fetch.js +18 -8
  422. package/mixins/resource-table-watch.js +45 -0
  423. package/mixins/vue-select-overrides.js +1 -4
  424. package/models/__tests__/chart.test.ts +296 -0
  425. package/models/__tests__/fleet.cattle.io.gitrepo.test.ts +1 -1
  426. package/models/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
  427. package/models/__tests__/node.test.ts +7 -63
  428. package/models/__tests__/workload.test.ts +1 -0
  429. package/models/chart.js +157 -2
  430. package/models/cluster/node.js +2 -1
  431. package/models/cluster.js +32 -2
  432. package/models/cluster.x-k8s.io.machinedeployment.js +11 -2
  433. package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
  434. package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
  435. package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
  436. package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
  437. package/models/fleet-application.js +297 -0
  438. package/models/fleet.cattle.io.bundle.js +9 -8
  439. package/models/fleet.cattle.io.cluster.js +21 -4
  440. package/models/fleet.cattle.io.gitrepo.js +46 -382
  441. package/models/fleet.cattle.io.helmop.js +202 -0
  442. package/models/management.cattle.io.authconfig.js +1 -0
  443. package/models/management.cattle.io.cluster.js +0 -20
  444. package/models/management.cattle.io.feature.js +7 -1
  445. package/models/management.cattle.io.fleetworkspace.js +14 -1
  446. package/models/management.cattle.io.node.js +7 -22
  447. package/models/management.cattle.io.nodepool.js +12 -0
  448. package/models/management.cattle.io.oidcclient.js +18 -0
  449. package/models/management.cattle.io.registration.js +3 -0
  450. package/models/management.cattle.io.setting.js +0 -1
  451. package/models/namespace.js +12 -1
  452. package/models/provisioning.cattle.io.cluster.js +60 -97
  453. package/models/secret.js +157 -2
  454. package/models/service.js +28 -9
  455. package/models/storage.k8s.io.storageclass.js +2 -2
  456. package/models/workload.js +91 -51
  457. package/package.json +6 -5
  458. package/pages/about.vue +17 -61
  459. package/pages/account/index.vue +9 -1
  460. package/pages/auth/login.vue +2 -3
  461. package/pages/auth/verify.vue +13 -1
  462. package/pages/c/_cluster/apps/charts/AddRepoLink.vue +36 -0
  463. package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +80 -0
  464. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +57 -0
  465. package/pages/c/_cluster/apps/charts/StatusLabel.vue +33 -0
  466. package/pages/c/_cluster/apps/charts/index.vue +501 -468
  467. package/pages/c/_cluster/apps/charts/install.vue +0 -1
  468. package/pages/c/_cluster/auth/roles/index.vue +19 -48
  469. package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
  470. package/pages/c/_cluster/explorer/EventsTable.vue +1 -1
  471. package/pages/c/_cluster/explorer/index.vue +14 -3
  472. package/pages/c/_cluster/explorer/projectsecret.vue +34 -0
  473. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
  474. package/pages/c/_cluster/fleet/__tests__/index.test.ts +720 -0
  475. package/pages/c/_cluster/fleet/application/_resource/_id.vue +14 -0
  476. package/pages/c/_cluster/fleet/application/_resource/create.vue +14 -0
  477. package/pages/c/_cluster/fleet/application/create.vue +341 -0
  478. package/pages/c/_cluster/fleet/application/index.vue +139 -0
  479. package/pages/c/_cluster/fleet/graph/config.js +277 -0
  480. package/pages/c/_cluster/fleet/index.vue +866 -328
  481. package/pages/c/_cluster/fleet/settings/index.vue +229 -0
  482. package/pages/c/_cluster/longhorn/index.vue +5 -2
  483. package/pages/c/_cluster/settings/banners.vue +56 -2
  484. package/pages/c/_cluster/settings/brand.vue +2 -1
  485. package/pages/c/_cluster/settings/performance.vue +7 -26
  486. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
  487. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
  488. package/pages/c/_cluster/uiplugins/__tests__/AddExtensionRepos.test.ts +4 -7
  489. package/pages/c/_cluster/uiplugins/index.vue +98 -55
  490. package/pages/explorer/resource/detail/configmap.vue +42 -0
  491. package/pages/explorer/resource/detail/projectsecret.vue +9 -0
  492. package/pages/explorer/resource/detail/secret.vue +63 -0
  493. package/pages/home.vue +8 -104
  494. package/pages/prefs.vue +0 -1
  495. package/pages/support/index.vue +4 -6
  496. package/plugins/clean-html.js +2 -0
  497. package/plugins/dashboard-store/__tests__/actions.test.ts +4 -1
  498. package/plugins/dashboard-store/__tests__/normalize.test.ts +223 -0
  499. package/plugins/dashboard-store/__tests__/resource-class.test.ts +191 -0
  500. package/plugins/dashboard-store/__tests__/utils/normalize-usecases.ts +1526 -0
  501. package/plugins/dashboard-store/actions.js +212 -55
  502. package/plugins/dashboard-store/getters.js +112 -24
  503. package/plugins/dashboard-store/mutations.js +61 -12
  504. package/plugins/dashboard-store/normalize.js +29 -19
  505. package/plugins/dashboard-store/resource-class.js +132 -49
  506. package/plugins/steve/__tests__/getters.test.ts +19 -12
  507. package/plugins/steve/__tests__/steve-class.test.ts +1 -0
  508. package/plugins/steve/__tests__/subscribe.spec.ts +324 -1
  509. package/plugins/steve/actions.js +37 -24
  510. package/plugins/steve/getters.js +47 -12
  511. package/plugins/steve/resourceWatcher.js +10 -3
  512. package/plugins/steve/steve-class.js +5 -0
  513. package/plugins/steve/steve-pagination-utils.ts +225 -43
  514. package/plugins/steve/subscribe.js +418 -53
  515. package/plugins/steve/worker/web-worker.advanced.js +5 -1
  516. package/rancher-components/Banner/Banner.test.ts +51 -3
  517. package/rancher-components/Banner/Banner.vue +37 -6
  518. package/rancher-components/Form/Checkbox/Checkbox.test.ts +59 -1
  519. package/rancher-components/Form/Checkbox/Checkbox.vue +27 -9
  520. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +51 -0
  521. package/rancher-components/Form/LabeledInput/LabeledInput.vue +21 -3
  522. package/rancher-components/Form/Radio/RadioButton.test.ts +36 -1
  523. package/rancher-components/Form/Radio/RadioButton.vue +21 -5
  524. package/rancher-components/Form/Radio/RadioGroup.test.ts +60 -0
  525. package/rancher-components/Form/Radio/RadioGroup.vue +81 -38
  526. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +4 -0
  527. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +22 -1
  528. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
  529. package/rancher-components/RcButton/RcButton.vue +1 -1
  530. package/rancher-components/RcDropdown/RcDropdown.test.ts +98 -0
  531. package/rancher-components/RcDropdown/RcDropdown.vue +6 -0
  532. package/rancher-components/RcDropdown/RcDropdownItem.vue +8 -55
  533. package/rancher-components/RcDropdown/RcDropdownItemCheckbox.vue +69 -0
  534. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +93 -0
  535. package/rancher-components/RcDropdown/RcDropdownMenu.vue +7 -8
  536. package/rancher-components/RcDropdown/index.ts +2 -0
  537. package/rancher-components/RcDropdown/useDropdownContext.ts +21 -0
  538. package/rancher-components/RcDropdown/useDropdownItem.ts +92 -0
  539. package/rancher-components/RcItemCard/RcItemCard.test.ts +189 -0
  540. package/rancher-components/RcItemCard/RcItemCard.vue +430 -0
  541. package/rancher-components/RcItemCard/RcItemCardAction.vue +24 -0
  542. package/rancher-components/RcItemCard/index.ts +2 -0
  543. package/rancher-components/StringList/StringList.vue +1 -1
  544. package/scripts/extension/publish +1 -1
  545. package/static/loading-indicator.html +1 -1
  546. package/store/action-menu.js +26 -56
  547. package/store/auth.js +3 -0
  548. package/store/catalog.js +85 -25
  549. package/store/features.js +0 -1
  550. package/store/growl.js +97 -8
  551. package/store/i18n.js +1 -1
  552. package/store/index.js +44 -14
  553. package/store/notifications.ts +426 -0
  554. package/store/prefs.js +2 -8
  555. package/store/slideInPanel.ts +6 -0
  556. package/store/type-map.js +34 -17
  557. package/store/type-map.utils.ts +49 -6
  558. package/store/uiplugins.ts +15 -1
  559. package/types/fleet.d.ts +60 -1
  560. package/types/kube/kube-api.ts +34 -0
  561. package/types/notifications/index.ts +74 -0
  562. package/types/resources/fleet.d.ts +43 -0
  563. package/types/resources/pod-security-admission.ts +36 -0
  564. package/types/resources/settings.d.ts +107 -0
  565. package/types/resources/userPreferences.d.ts +13 -0
  566. package/types/shell/index.d.ts +971 -745
  567. package/types/store/dashboard-store.types.ts +57 -4
  568. package/types/store/pagination.types.ts +41 -9
  569. package/types/store/subscribe.types.ts +50 -0
  570. package/utils/__mocks__/tabbable.js +13 -0
  571. package/utils/__tests__/back-off.test.ts +354 -0
  572. package/utils/__tests__/create-yaml.test.ts +235 -0
  573. package/utils/__tests__/fleet.test.ts +148 -0
  574. package/utils/__tests__/kontainer.test.ts +19 -0
  575. package/utils/__tests__/object.test.ts +54 -1
  576. package/utils/__tests__/string.test.ts +273 -1
  577. package/utils/__tests__/time.test.ts +31 -0
  578. package/utils/auth.js +41 -6
  579. package/utils/back-off.ts +176 -0
  580. package/utils/cluster.js +24 -20
  581. package/utils/create-yaml.js +103 -9
  582. package/utils/crypto/encryption.ts +103 -0
  583. package/utils/cspAdaptor.ts +51 -0
  584. package/utils/error.js +0 -5
  585. package/utils/fleet-types.ts +0 -0
  586. package/utils/fleet.ts +204 -74
  587. package/utils/grafana.js +1 -0
  588. package/utils/kontainer.ts +3 -5
  589. package/utils/object.js +36 -12
  590. package/utils/pagination-utils.ts +50 -3
  591. package/utils/pagination-wrapper.ts +132 -50
  592. package/utils/perf-setting.utils.ts +28 -0
  593. package/utils/release-notes.ts +48 -0
  594. package/utils/selector-typed.ts +210 -0
  595. package/utils/selector.js +29 -6
  596. package/utils/settings.ts +4 -1
  597. package/utils/string.js +24 -0
  598. package/utils/style.ts +39 -0
  599. package/utils/{time.js → time.ts} +25 -6
  600. package/utils/uiplugins.ts +41 -8
  601. package/utils/v-sphere.ts +5 -1
  602. package/utils/validators/formRules/__tests__/index.test.ts +76 -6
  603. package/utils/validators/formRules/index.ts +99 -4
  604. package/utils/window.js +11 -7
  605. package/.DS_Store +0 -0
  606. package/components/AssignTo.vue +0 -199
  607. package/components/DisableAuthProviderModal.vue +0 -115
  608. package/components/MoveModal.vue +0 -167
  609. package/components/PromptChangePassword.vue +0 -123
  610. package/components/ResourceList/Masthead-btn.vue +0 -225
  611. package/components/__tests__/ApplicationCard.test.ts +0 -27
  612. package/components/cards/ApplicationCard.vue +0 -145
  613. package/components/fleet/FleetBundleResources.vue +0 -86
  614. package/components/fleet/ForceDirectedTreeChart/chartIcons.js +0 -17
  615. package/components/formatter/RKETemplateName.vue +0 -37
  616. package/config/product/legacy.js +0 -62
  617. package/config/secret.js +0 -14
  618. package/dialog/SaveAsRKETemplateDialog.vue +0 -139
  619. package/models/etcdbackup.js +0 -45
  620. package/pages/auth copy/login.vue +0 -595
  621. package/pages/auth copy/logout.vue +0 -47
  622. package/pages/auth copy/setup.vue +0 -523
  623. package/pages/auth copy/verify.vue +0 -203
  624. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +0 -249
  625. package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
  626. package/pages/c/_cluster/legacy/project/_page.vue +0 -57
  627. package/pages/c/_cluster/legacy/project/index.vue +0 -32
  628. package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
@@ -1,15 +1,27 @@
1
1
  <script lang="ts" setup>
2
- import { computed } from 'vue';
2
+ import { computed, onBeforeUnmount, watch } from 'vue';
3
3
  import { useStore } from 'vuex';
4
+ import {
5
+ DEFAULT_FOCUS_TRAP_OPTS,
6
+ useWatcherBasedSetupFocusTrapWithDestroyIncluded
7
+ } from '@shell/composables/focusTrap';
8
+ import { isEqual } from 'lodash';
9
+ import { useRouter } from 'vue-router';
4
10
 
5
11
  const HEADER_HEIGHT = 55;
6
12
 
7
13
  const store = useStore();
8
14
  const isOpen = computed(() => store.getters['slideInPanel/isOpen']);
15
+ const isClosing = computed(() => store.getters['slideInPanel/isClosing']);
9
16
  const currentComponent = computed(() => store.getters['slideInPanel/component']);
10
17
  const currentProps = computed(() => store.getters['slideInPanel/componentProps']);
11
18
 
12
19
  const panelTop = computed(() => {
20
+ // Some components like the ResourceDetailDrawer are designed to take up the full height of the viewport so we want to be able to specify the top.
21
+ if (currentProps?.value?.top) {
22
+ return currentProps?.value?.top;
23
+ }
24
+
13
25
  const banner = document.getElementById('banner-header');
14
26
  let height = HEADER_HEIGHT;
15
27
 
@@ -20,11 +32,92 @@ const panelTop = computed(() => {
20
32
  return `${ height }px`;
21
33
  });
22
34
 
23
- const panelHeight = computed(() => `calc(100vh - ${ panelTop?.value })`);
35
+ // Some components like the ResourceDetailDrawer are designed to take up the full height of the viewport so we want to be able to specify the height.
36
+ const panelHeight = computed(() => (currentProps?.value?.height) ? (currentProps?.value?.height) : `calc(100vh - ${ panelTop?.value })`);
24
37
  const panelWidth = computed(() => currentProps?.value?.width || '33%');
25
38
  const panelRight = computed(() => (isOpen?.value ? '0' : `-${ panelWidth?.value }`));
26
39
 
27
- const panelTitle = computed(() => currentProps?.value?.title || 'Details');
40
+ const showHeader = computed(() => currentProps?.value?.showHeader ?? true);
41
+ const panelTitle = showHeader.value ? computed(() => currentProps?.value?.title || 'Details') : null;
42
+ const closeOnRouteChange = computed(() => {
43
+ const propsCloseOnRouteChange = currentProps?.value.closeOnRouteChange;
44
+
45
+ if (!propsCloseOnRouteChange) {
46
+ return ['name', 'params', 'hash', 'query'];
47
+ }
48
+
49
+ return propsCloseOnRouteChange;
50
+ });
51
+ const router = useRouter();
52
+
53
+ watch(
54
+ /**
55
+ * trigger focus trap
56
+ */
57
+ () => currentProps?.value?.triggerFocusTrap,
58
+ (neu) => {
59
+ if (neu) {
60
+ const opts = {
61
+ ...DEFAULT_FOCUS_TRAP_OPTS,
62
+ /**
63
+ * will return focus to the first iterable node of this container select
64
+ */
65
+ setReturnFocus: () => {
66
+ const returnFocusSelector = currentProps?.value?.returnFocusSelector;
67
+
68
+ if (returnFocusSelector && !document.querySelector(returnFocusSelector)) {
69
+ console.warn('SlideInPanelManager: cannot find elem with "returnFocusSelector", returning focus to main view'); // eslint-disable-line no-console
70
+
71
+ return '.dashboard-root';
72
+ }
73
+
74
+ return returnFocusSelector || '.dashboard-root';
75
+ }
76
+ };
77
+
78
+ useWatcherBasedSetupFocusTrapWithDestroyIncluded(
79
+ () => {
80
+ if (currentProps?.value?.focusTrapWatcherBasedVariable) {
81
+ return currentProps.value.focusTrapWatcherBasedVariable;
82
+ }
83
+
84
+ return isOpen?.value && !isClosing?.value;
85
+ },
86
+ '#slide-in-panel-manager',
87
+ opts,
88
+ false
89
+ );
90
+ }
91
+ }
92
+ );
93
+
94
+ watch(
95
+ () => router?.currentRoute?.value,
96
+ (newValue, oldValue) => {
97
+ if (!isOpen?.value) {
98
+ return;
99
+ }
100
+
101
+ if (closeOnRouteChange.value.includes('name') && !isEqual(newValue?.name, oldValue?.name)) {
102
+ closePanel();
103
+ }
104
+
105
+ if (closeOnRouteChange.value.includes('params') && !isEqual(newValue?.params, oldValue?.params)) {
106
+ closePanel();
107
+ }
108
+
109
+ if (closeOnRouteChange.value.includes('hash') && !isEqual(newValue?.hash, oldValue?.hash)) {
110
+ closePanel();
111
+ }
112
+
113
+ if (closeOnRouteChange.value.includes('query') && !isEqual(newValue?.query, oldValue?.query)) {
114
+ closePanel();
115
+ }
116
+ },
117
+ { deep: true }
118
+ );
119
+
120
+ onBeforeUnmount(closePanel);
28
121
 
29
122
  function closePanel() {
30
123
  store.commit('slideInPanel/close');
@@ -33,7 +126,10 @@ function closePanel() {
33
126
 
34
127
  <template>
35
128
  <Teleport to="#slides">
36
- <div id="slide-in-panel-manager">
129
+ <div
130
+ id="slide-in-panel-manager"
131
+ @keydown.escape="closePanel"
132
+ >
37
133
  <div
38
134
  v-show="isOpen"
39
135
  data-testid="slide-in-glass"
@@ -41,20 +137,27 @@ function closePanel() {
41
137
  :class="{ 'slide-in-glass-open': isOpen }"
42
138
  @click="closePanel"
43
139
  />
44
- <div
140
+ <aside
45
141
  class="slide-in"
46
142
  :class="{ 'slide-in-open': isOpen }"
47
- :style="{ width: panelWidth, right: panelRight, top: panelTop, height: panelHeight }"
143
+ :style="{
144
+ width: panelWidth,
145
+ right: panelRight,
146
+ top: panelTop,
147
+ height: panelHeight,
148
+ }"
48
149
  >
49
- <div class="header">
150
+ <div
151
+ v-if="showHeader"
152
+ class="header"
153
+ >
50
154
  <div class="title">
51
155
  {{ panelTitle }}
52
156
  </div>
53
157
  <i
54
158
  class="icon icon-close"
55
159
  data-testid="slide-in-close"
56
- :trigger-focus-trap="true"
57
- tabindex="0"
160
+ :tabindex="isOpen ? 0 : -1"
58
161
  @click="closePanel"
59
162
  />
60
163
  </div>
@@ -67,7 +170,7 @@ function closePanel() {
67
170
  class="dynamic-panel-content"
68
171
  />
69
172
  </div>
70
- </div>
173
+ </aside>
71
174
  </div>
72
175
  </Teleport>
73
176
  </template>
@@ -80,12 +183,11 @@ function closePanel() {
80
183
  left: 0;
81
184
  height: 100vh;
82
185
  width: 100vw;
186
+ z-index: z-index('slide-in');
83
187
  }
84
188
  .slide-in-glass-open {
85
- background-color: var(--body-bg);
189
+ background: var(--overlay-bg);
86
190
  display: block;
87
- opacity: 0.5;
88
- z-index: 1000;
89
191
  }
90
192
 
91
193
  .slide-in {
@@ -93,10 +195,10 @@ function closePanel() {
93
195
  flex-direction: column;
94
196
  position: fixed;
95
197
  top: 0;
96
- z-index: 2000;
97
198
  transition: right 0.5s ease;
98
199
  border-left: 1px solid var(--border);
99
200
  background-color: var(--body-bg);
201
+ z-index: calc(z-index('slide-in') + 1);
100
202
  }
101
203
 
102
204
  .slide-in-open {
@@ -27,8 +27,6 @@ import ButtonMultiAction from '@shell/components/ButtonMultiAction.vue';
27
27
  import ActionMenu from '@shell/components/ActionMenuShell.vue';
28
28
  import { useRuntimeFlag } from '@shell/composables/useRuntimeFlag';
29
29
  import ActionDropdownShell from '@shell/components/ActionDropdownShell.vue';
30
- import { harvesterhci2cloud, cloud2harvesterhci } from '@shell/utils/router'
31
- import MastheadBtn from '@shell/components/ResourceList/Masthead-btn.vue'
32
30
 
33
31
  // Uncomment for table performance debugging
34
32
  // import tableDebug from './debug';
@@ -383,6 +381,16 @@ export default {
383
381
  type: String,
384
382
  default: ''
385
383
  },
384
+
385
+ /**
386
+ * Usually the manual refresh button is controlled via isTooManyItemsToAutoUpdate
387
+ *
388
+ * However this is singular on page. In some places there's more than one...
389
+ */
390
+ hideManualRefreshButton: {
391
+ type: Boolean,
392
+ default: false
393
+ },
386
394
  isBanner: {
387
395
  // Show isBanner input to filter rows
388
396
  type: Boolean,
@@ -51,6 +51,21 @@ export default {
51
51
  return this.$store.getters['i18n/t'](this.pagingLabel, opt);
52
52
  },
53
53
 
54
+ perPage() {
55
+ let out = this.rowsPerPage || 0;
56
+
57
+ if ( out <= 0 ) {
58
+ out = parseInt(this.$store.getters['prefs/get'](ROWS_PER_PAGE), 10) || 0;
59
+ }
60
+
61
+ // This should ideally never happen, but the preference value could be invalid, so return something...
62
+ if ( out <= 0 ) {
63
+ out = 10;
64
+ }
65
+
66
+ return out;
67
+ },
68
+
54
69
  pagedRows() {
55
70
  if (this.externalPaginationEnabled) {
56
71
  return this.rows;
@@ -91,22 +106,6 @@ export default {
91
106
  },
92
107
 
93
108
  methods: {
94
- // getPerPage() {
95
- // // perPage can not change while the list is displayed
96
- // let out = this.rowsPerPage || 0;
97
-
98
- // if ( out <= 0 ) {
99
- // out = parseInt(this.$store.getters['prefs/get'](ROWS_PER_PAGE), 10) || 0;
100
- // }
101
-
102
- // // This should ideally never happen, but the preference value could be invalid, so return something...
103
- // if ( out <= 0 ) {
104
- // out = 10;
105
- // }
106
-
107
- // return out;
108
- // },
109
-
110
109
 
111
110
  setgetPerPage(num) {
112
111
  this.setPage(1);
@@ -127,25 +127,38 @@ export default {
127
127
  },
128
128
 
129
129
  watch: {
130
- // On page change
130
+ /**
131
+ * Handle changes to the page (SSP enabled)
132
+ */
133
+ externalPaginationResult() {
134
+ // Handle changes to the page (SSP enabled)
135
+ this.pageChanged(this.pagedRows);
136
+ },
137
+
138
+ /**
139
+ * Handle changes to the page (SSP disabled)
140
+ */
131
141
  pagedRows() {
132
- // When the table contents changes:
133
- // - Remove items that are in the selection but no longer in the table.
142
+ this.pageChanged(this.pagedRows);
143
+ }
144
+ },
134
145
 
135
- const content = this.pagedRows;
146
+ methods: {
147
+ /**
148
+ * Remove items that are in the selection but no longer in the table.
149
+ */
150
+ pageChanged(page) {
136
151
  const toRemove = [];
137
152
 
138
153
  for (const node of this.selectedRows) {
139
- if (!content.includes(node) ) {
154
+ if (!page.includes(node) ) {
140
155
  toRemove.push(node);
141
156
  }
142
157
  }
143
158
 
144
159
  this.update([], toRemove);
145
- }
146
- },
160
+ },
147
161
 
148
- methods: {
149
162
  onToggleAll(value) {
150
163
  if ( value ) {
151
164
  this.update(this.pagedRows, []);
@@ -331,7 +344,6 @@ export default {
331
344
  return;
332
345
  }
333
346
 
334
- e.preventDefault();
335
347
  e.stopPropagation();
336
348
 
337
349
  this.prevNode = node;
@@ -531,7 +543,7 @@ export default {
531
543
  },
532
544
 
533
545
  clearSelection() {
534
- this.update([], this.selectedRows);
546
+ this.update([], [...this.selectedRows]);
535
547
  },
536
548
 
537
549
  }
@@ -0,0 +1,28 @@
1
+ <script setup lang="ts">
2
+ import { StateColor, stateColorCssVar } from '@shell/utils/style';
3
+ import { computed } from 'vue';
4
+
5
+ interface Props {
6
+ color: StateColor;
7
+ size?: string;
8
+ }
9
+
10
+ const props = withDefaults(defineProps<Props>(), { size: '8px' });
11
+ const backgroundColor = computed(() => stateColorCssVar(props.color));
12
+ </script>
13
+
14
+ <template>
15
+ <span class="state-dot" />
16
+ </template>
17
+
18
+ <style lang="scss" scoped>
19
+ .state-dot {
20
+ display: inline-block;
21
+
22
+ width: v-bind('props.size');
23
+ height: v-bind('props.size');
24
+
25
+ border-radius: 50%;
26
+ background-color: v-bind('backgroundColor');
27
+ }
28
+ </style>
@@ -19,11 +19,13 @@ const STATUS = {
19
19
  }
20
20
  };
21
21
 
22
+ export interface Props {
23
+ status?: 'success' | 'warning' | 'info' | 'error',
24
+ label?: string
25
+ }
26
+
22
27
  withDefaults(
23
- defineProps<{
24
- status?: 'success' | 'warning' | 'info' | 'error',
25
- label?: string
26
- }>(),
28
+ defineProps<Props>(),
27
29
  {
28
30
  status: 'success',
29
31
  label: '',
@@ -0,0 +1,25 @@
1
+ <script setup lang="ts">
2
+ import { RouterLink, RouteLocationRaw } from 'vue-router';
3
+
4
+ export interface Props {
5
+ to: RouteLocationRaw;
6
+ }
7
+
8
+ const { to } = defineProps<Props>();
9
+ </script>
10
+
11
+ <template>
12
+ <RouterLink
13
+ class="subtle-link"
14
+ :to="to"
15
+ >
16
+ <slot name="default" />
17
+ </RouterLink>
18
+ </template>
19
+
20
+ <style lang="scss" scoped>
21
+ .subtle-link {
22
+ text-decoration: underline;
23
+ color: var(--body-text);
24
+ }
25
+ </style>
@@ -61,6 +61,24 @@ export default {
61
61
  tabsOnly: {
62
62
  type: Boolean,
63
63
  default: false,
64
+ },
65
+
66
+ resource: {
67
+ type: Object,
68
+ default: () => {}
69
+ },
70
+
71
+ showExtensionTabs: {
72
+ type: Boolean,
73
+ default: true,
74
+ },
75
+ /**
76
+ * Inherited global identifier prefix for tests
77
+ * Define a term based on the parent component to avoid conflicts on multiple components
78
+ */
79
+ componentTestid: {
80
+ type: String,
81
+ default: 'tabbed'
64
82
  }
65
83
  },
66
84
 
@@ -87,7 +105,7 @@ export default {
87
105
  },
88
106
 
89
107
  data() {
90
- const extensionTabs = getApplicableExtensionEnhancements(this, ExtensionPoint.TAB, TabLocation.RESOURCE_DETAIL, this.$route, this, this.extensionParams) || [];
108
+ const extensionTabs = this.showExtensionTabs ? getApplicableExtensionEnhancements(this, ExtensionPoint.TAB, TabLocation.RESOURCE_DETAIL, this.$route, this, this.extensionParams) || [] : [];
91
109
 
92
110
  const parsedExtTabs = extensionTabs.map((item) => {
93
111
  return {
@@ -140,17 +158,10 @@ export default {
140
158
  this.select(activeTab.name);
141
159
  }
142
160
  },
143
- },
144
-
145
- mounted() {
146
- if ( this.useHash ) {
147
- window.addEventListener('hashchange', this.hashChange);
148
- }
149
- },
150
-
151
- unmounted() {
152
- if ( this.useHash ) {
153
- window.removeEventListener('hashchange', this.hashChange);
161
+ '$route.hash'() {
162
+ if ( this.useHash ) {
163
+ this.hashChange();
164
+ }
154
165
  }
155
166
  },
156
167
 
@@ -159,7 +170,7 @@ export default {
159
170
  return tab.displayAlertIcon || (tab.error && !tab.active);
160
171
  },
161
172
  hashChange() {
162
- if (!this.scrollOnChange) {
173
+ if (this.scrollOnChange) {
163
174
  const scrollable = document.getElementsByTagName('main')[0];
164
175
 
165
176
  if (scrollable) {
@@ -177,8 +188,9 @@ export default {
177
188
  select(name/* , event */) {
178
189
  const { sortedTabs } = this;
179
190
 
180
- const selected = this.find(name);
181
- const hashName = `#${ name }`;
191
+ const cleanName = name.replace('#', '');
192
+ const selected = this.find(cleanName);
193
+ const hashName = `#${ cleanName }`;
182
194
 
183
195
  if ( !selected || selected.disabled) {
184
196
  return;
@@ -250,7 +262,7 @@ export default {
250
262
  <template>
251
263
  <div
252
264
  :class="{'side-tabs': !!sideTabs, 'tabs-only': tabsOnly }"
253
- data-testid="tabbed"
265
+ :data-testid="componentTestid"
254
266
  >
255
267
  <ul
256
268
  v-if="!hideTabs"
@@ -258,7 +270,7 @@ export default {
258
270
  role="tablist"
259
271
  class="tabs"
260
272
  :class="{'clearfix':!sideTabs, 'vertical': sideTabs, 'horizontal': !sideTabs}"
261
- data-testid="tabbed-block"
273
+ :data-testid="`${componentTestid}-block`"
262
274
  tabindex="0"
263
275
  @keydown.right.prevent="selectNext(1)"
264
276
  @keydown.left.prevent="selectNext(-1)"
@@ -278,7 +290,7 @@ export default {
278
290
  >
279
291
  <a
280
292
  :data-testid="`btn-${tab.name}`"
281
- :aria-controls="'#' + tab.name"
293
+ :aria-controls="tab.name"
282
294
  :aria-selected="tab.active"
283
295
  :aria-label="tab.labelDisplay || ''"
284
296
  role="tab"
@@ -313,6 +325,7 @@ export default {
313
325
  type="button"
314
326
  class="btn bg-transparent"
315
327
  data-testid="tab-list-add"
328
+ :aria-label="t('tabs.addItem')"
316
329
  @click="tabAddClicked"
317
330
  >
318
331
  <i class="icon icon-plus" />
@@ -322,6 +335,7 @@ export default {
322
335
  class="btn bg-transparent"
323
336
  :disabled="!sortedTabs.length"
324
337
  data-testid="tab-list-remove"
338
+ :aria-label="t('tabs.removeItem')"
325
339
  @click="tabRemoveClicked"
326
340
  >
327
341
  <i class="icon icon-minus" />
@@ -355,6 +369,7 @@ export default {
355
369
  >
356
370
  <component
357
371
  :is="tab.component"
372
+ :resource="resource"
358
373
  />
359
374
  </Tab>
360
375
  </div>
@@ -368,12 +383,13 @@ export default {
368
383
  padding: 0;
369
384
 
370
385
  &.horizontal {
371
- border-bottom: solid 1px var(--border);
386
+ border: solid thin var(--border);
387
+ border-bottom: 0;
372
388
  display: flex;
373
389
  flex-direction: row;
374
390
 
375
391
  + .tab-container {
376
- // border: solid thin var(--border);
392
+ border: solid thin var(--border);
377
393
  }
378
394
 
379
395
  .tab.active {
@@ -442,7 +458,7 @@ export default {
442
458
  }
443
459
 
444
460
  .tab-container {
445
- padding: 20px 0;
461
+ padding: 20px;
446
462
 
447
463
  &.no-content {
448
464
  padding: 0 0 3px 0;
@@ -498,7 +514,7 @@ margin: 0px -20px;
498
514
  // }
499
515
  & .tab {
500
516
  /* width: 100%; */
501
- min-width: 130px !important;
517
+ min-width: 120px;
502
518
  height: 36px;
503
519
  /* border-top: solid 5px transparent; */
504
520
  display: flex;
@@ -1,5 +1,5 @@
1
1
  <script>
2
-
2
+ import { _CREATE, _VIEW } from '@shell/config/query-params';
3
3
  import AsyncButton from '@shell/components/AsyncButton';
4
4
  import { Banner } from '@components/Banner';
5
5
  import Loading from '@shell/components/Loading';
@@ -56,6 +56,11 @@ export default {
56
56
  required: true
57
57
  },
58
58
 
59
+ mode: {
60
+ type: String,
61
+ default: _CREATE
62
+ },
63
+
59
64
  // Initial step to show when Wizard loads.
60
65
  initStepIndex: {
61
66
  type: Number,
@@ -121,6 +126,11 @@ export default {
121
126
  },
122
127
 
123
128
  computed: {
129
+
130
+ isView() {
131
+ return this.mode === _VIEW;
132
+ },
133
+
124
134
  errorStrings() {
125
135
  return ( this.errors || [] ).map((x) => stringify(x));
126
136
  },
@@ -351,7 +361,7 @@ export default {
351
361
  role="presentation"
352
362
  >
353
363
  <span
354
- :aria-controls="'step' + idx+1"
364
+ :aria-controls="'step-container-' + step.name"
355
365
  :aria-selected="step.name === activeStep.name"
356
366
  role="tab"
357
367
  class="controls"
@@ -366,7 +376,7 @@ export default {
366
376
  </span>
367
377
  </span>
368
378
  </li>
369
- <div
379
+ <li
370
380
  v-if="idx!==visibleSteps.length-1"
371
381
  :key="step.name"
372
382
  class="divider"
@@ -387,7 +397,9 @@ export default {
387
397
  >
388
398
  <div
389
399
  v-if="step.name === activeStep.name || step.hidden"
400
+ :id="'step-container-' + step.name"
390
401
  :key="step.name"
402
+ role="tabpanel"
391
403
  class="step-container__step"
392
404
  :class="{'hide': step.name !== activeStep.name && step.hidden}"
393
405
  >
@@ -461,6 +473,7 @@ export default {
461
473
  :finish="finish"
462
474
  >
463
475
  <AsyncButton
476
+ v-if="!isView"
464
477
  :disabled="!activeStep.ready"
465
478
  :mode="finishMode"
466
479
  @click="finish"
@@ -203,7 +203,7 @@ export default {
203
203
 
204
204
  updateValue(value) {
205
205
  this.curValue = value;
206
- this.$refs.cm.updateValue(value);
206
+ this.$refs.cm?.updateValue(value);
207
207
  }
208
208
  }
209
209
  };
@@ -235,7 +235,6 @@ export default {
235
235
  >{{ t('generic.split') }}</button>
236
236
  </span>
237
237
  </div>
238
-
239
238
  <CodeMirror
240
239
  v-if="showCodeEditor"
241
240
  ref="cm"
@@ -145,4 +145,43 @@ describe('component: AsyncButton', () => {
145
145
  expect(spyDone).toHaveBeenCalledWith('cancelled');
146
146
  expect(wrapper.vm.phase).toBe(ASYNC_BUTTON_STATES.ACTION);
147
147
  });
148
+
149
+ it('a11y: adding ARIA props should correctly fill out the appropriate fields on the component', () => {
150
+ const mockExists = jest.fn().mockReturnValue(true);
151
+ const mockT = jest.fn().mockReturnValue('some-string');
152
+ const ariaLabel = 'some-aria-label';
153
+ const ariaLabelledBy = 'some-aria-labelledby';
154
+
155
+ const wrapper: VueWrapper<InstanceType<typeof AsyncButton>> = mount(AsyncButton, {
156
+ props: { icon: 'some-icon', disabled: true },
157
+ attrs: { 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy },
158
+ global: {
159
+ mocks: {
160
+ $store: {
161
+ getters: {
162
+ 'i18n/exists': mockExists,
163
+ 'i18n/t': mockT
164
+ }
165
+ },
166
+ }
167
+ },
168
+ });
169
+
170
+ const item = wrapper.find('button');
171
+
172
+ const itemRole = item.attributes('role');
173
+ const itemAriaLabel = item.attributes('aria-label');
174
+ const itemAriaLabelledBy = item.attributes('aria-labelledby');
175
+ const itemAriaDisabled = item.attributes('aria-disabled');
176
+
177
+ // let's check some attributes passing...
178
+ expect(itemAriaLabel).toBe(ariaLabel);
179
+ expect(itemAriaLabelledBy).toBe(ariaLabelledBy);
180
+
181
+ // rest of the checks
182
+ expect(itemRole).toBe('button');
183
+ expect(itemAriaDisabled).toBe('true');
184
+ expect(item.find('span[data-testid="async-btn-display-label"]').attributes('id')).toBe(wrapper.vm.describedbyId);
185
+ expect(item.find('i').attributes('alt')).toBeDefined();
186
+ });
148
187
  });