dashboard-shell-shell 1.0.121 → 1.0.1000000081

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 (372) hide show
  1. package/.DS_Store +0 -0
  2. package/assets/brand/harvester/favicon.png +0 -0
  3. package/assets/brand/suse/favicon.png +0 -0
  4. package/assets/icons/iconfont.css +19 -3
  5. package/assets/icons/iconfont.js +1 -1
  6. package/assets/icons/iconfont.json +28 -0
  7. package/assets/icons/iconfont.ttf +0 -0
  8. package/assets/icons/iconfont.woff +0 -0
  9. package/assets/icons/iconfont.woff2 +0 -0
  10. package/assets/images/pl/half-logo.svg +2 -23
  11. package/assets/styles/base/_functions.scss +0 -0
  12. package/assets/styles/base/_mixins.scss +0 -0
  13. package/assets/styles/base/_variables.scss +1 -1
  14. package/assets/styles/global/_labeled-input.scss +0 -1
  15. package/assets/styles/global/_layout.scss +1 -1
  16. package/assets/styles/global/_select.scss +4 -2
  17. package/assets/styles/global/_table.scss +5 -0
  18. package/assets/styles/vendor/vue-select.scss +2 -1
  19. package/assets/translations/en-us.yaml +1 -1
  20. package/assets/translations/zh-hans.yaml +25 -15
  21. package/chart/monitoring/index.vue +3 -1
  22. package/chart/monitoring/prometheus/index.vue +13 -10
  23. package/cloud-credential/aws.vue +2 -0
  24. package/components/ActionDropdown.vue +1 -1
  25. package/components/ActionDropdownShell.vue +71 -0
  26. package/components/ActionMenu.vue +2 -2
  27. package/components/ActionMenuShell.vue +3 -0
  28. package/components/AppModal.vue +84 -8
  29. package/components/AssignTo.vue +25 -11
  30. package/components/AsyncButton.vue +24 -7
  31. package/components/BannerGraphic.vue +1 -0
  32. package/components/ButtonDropdown.vue +26 -4
  33. package/components/ButtonGroup.vue +4 -0
  34. package/components/ButtonMultiAction.vue +1 -0
  35. package/components/CodeMirror.vue +19 -6
  36. package/components/CommunityLinks.vue +3 -3
  37. package/components/ConsumptionGauge.vue +24 -5
  38. package/components/CopyToClipboardText.vue +2 -1
  39. package/components/CruResource.vue +13 -7
  40. package/components/CruResourceFooter.vue +2 -2
  41. package/components/DashboardOptions.vue +29 -17
  42. package/components/DetailText.vue +5 -0
  43. package/components/DisableAuthProviderModal.vue +1 -0
  44. package/components/DotState.vue +84 -0
  45. package/components/ExplorerMembers.vue +1 -1
  46. package/components/ExplorerProjectsNamespaces.vue +89 -16
  47. package/components/FixedBanner.vue +19 -12
  48. package/components/GlobalRoleBindings.vue +5 -1
  49. package/components/GrafanaDashboard.vue +4 -4
  50. package/components/GrowlManager.vue +4 -1
  51. package/components/HardwareResourceGauge.vue +39 -3
  52. package/components/InfoBox.vue +3 -3
  53. package/components/InputOrDisplay.vue +28 -2
  54. package/components/LabelValue.vue +20 -1
  55. package/components/LandingPagePreference.vue +5 -3
  56. package/components/LocaleSelector.vue +39 -93
  57. package/components/ModalManager.vue +55 -0
  58. package/components/ModalWithCard.vue +13 -3
  59. package/components/MoveModal.vue +1 -0
  60. package/components/PodSecurityAdmission.vue +1 -1
  61. package/components/PromptChangePassword.vue +1 -1
  62. package/components/PromptModal.vue +16 -3
  63. package/components/PromptRemove.vue +29 -9
  64. package/components/PromptRestore.vue +1 -0
  65. package/components/ResourceCancelModal.vue +1 -0
  66. package/components/ResourceDetail/Masthead.vue +52 -17
  67. package/components/ResourceDetail/__tests__/Masthead.test.ts +5 -1
  68. package/components/ResourceDetail/index.vue +54 -16
  69. package/components/ResourceList/Masthead.vue +9 -4
  70. package/components/ResourceList/index.vue +4 -3
  71. package/components/ResourceTable.vue +1 -0
  72. package/components/SideNav.vue +20 -15
  73. package/components/SlideInPanelManager.vue +126 -0
  74. package/components/SortableTable/THead.vue +10 -4
  75. package/components/SortableTable/actions.js +1 -1
  76. package/components/SortableTable/index.vue +540 -554
  77. package/components/SortableTable/selection.js +2 -13
  78. package/components/StatusBadge.vue +77 -0
  79. package/components/Tabbed/Tab.vue +3 -3
  80. package/components/Tabbed/index.vue +47 -29
  81. package/components/Wizard.vue +2 -2
  82. package/components/YamlEditor.vue +1 -1
  83. package/components/__tests__/AsyncButton.test.ts +2 -2
  84. package/components/__tests__/FixedBanner.test.ts +3 -3
  85. package/components/__tests__/ModalManager.spec.ts +176 -0
  86. package/components/__tests__/SlideInPanelManager.spec.ts +166 -0
  87. package/components/auth/Principal.vue +10 -3
  88. package/components/auth/RoleDetailEdit.vue +1 -1
  89. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  90. package/components/form/ArrayList.vue +123 -85
  91. package/components/form/ArrayListGrouped.vue +10 -2
  92. package/components/form/ArrayListSelect.vue +1 -1
  93. package/components/form/Command.vue +6 -15
  94. package/components/form/EnvVars.vue +16 -8
  95. package/components/form/Footer.vue +10 -7
  96. package/components/form/HealthCheck.vue +3 -3
  97. package/components/form/HookOption.vue +11 -16
  98. package/components/form/InputWithSelect.vue +6 -5
  99. package/components/form/KeyValue.vue +39 -10
  100. package/components/form/LabeledSelect.vue +73 -77
  101. package/components/form/Labels.vue +6 -3
  102. package/components/form/LifecycleHooks.vue +3 -3
  103. package/components/form/MatchExpressions.vue +42 -17
  104. package/components/form/NameNsDescription.vue +163 -116
  105. package/components/form/Networking.vue +20 -12
  106. package/components/form/NodeAffinity.vue +31 -23
  107. package/components/form/NodeScheduling.vue +13 -3
  108. package/components/form/Password.vue +11 -5
  109. package/components/form/PodAffinity.vue +47 -48
  110. package/components/form/Probe.vue +68 -66
  111. package/components/form/ResourceQuota/Namespace.vue +4 -4
  112. package/components/form/ResourceQuota/NamespaceRow.vue +5 -7
  113. package/components/form/ResourceQuota/Project.vue +9 -5
  114. package/components/form/ResourceQuota/ProjectRow.vue +4 -6
  115. package/components/form/ResourceSelector.vue +7 -9
  116. package/components/form/SSHKnownHosts/KnownHostsEditDialog.vue +6 -3
  117. package/components/form/SSHKnownHosts/__tests__/KnownHostsEditDialog.test.ts +12 -1
  118. package/components/form/SSHKnownHosts/index.vue +16 -2
  119. package/components/form/Security.vue +54 -56
  120. package/components/form/Select.vue +44 -7
  121. package/components/form/ShellInput.vue +5 -1
  122. package/components/form/SimpleSecretSelector.vue +29 -9
  123. package/components/form/Tolerations.vue +5 -1
  124. package/components/form/UnitInput.vue +10 -5
  125. package/components/form/ValueFromResource.vue +134 -121
  126. package/components/form/WorkloadPorts.vue +18 -18
  127. package/components/form/__tests__/ArrayList.test.ts +5 -2
  128. package/components/form/__tests__/MatchExpressions.test.ts +12 -12
  129. package/components/form/__tests__/NameNsDescription.test.ts +115 -14
  130. package/components/form/__tests__/Probe.test.ts +12 -8
  131. package/components/form/__tests__/SSHKnownHosts.test.ts +11 -0
  132. package/components/form/__tests__/Select.test.ts +37 -0
  133. package/components/form/__tests__/UnitInput.test.ts +4 -5
  134. package/components/formatter/BadgeStateFormatter.vue +8 -5
  135. package/components/formatter/InternalExternalIP.vue +2 -0
  136. package/components/formatter/LiveDate.vue +3 -3
  137. package/components/formatter/SecretData.vue +20 -7
  138. package/components/nav/Favorite.vue +5 -1
  139. package/components/nav/Group.vue +18 -4
  140. package/components/nav/Header.vue +39 -13
  141. package/components/nav/Jump.vue +7 -0
  142. package/components/nav/NamespaceFilter.vue +21 -11
  143. package/components/nav/Pinned.vue +1 -1
  144. package/components/nav/TopLevelMenu.vue +5 -17
  145. package/components/nav/Type.vue +30 -33
  146. package/components/nav/__tests__/TopLevelMenu.test.ts +0 -40
  147. package/components/rancherResourceDetail/Masthead.vue +769 -0
  148. package/components/rancherResourceDetail/__tests__/Masthead.test.ts +65 -0
  149. package/components/rancherResourceDetail/index.vue +591 -0
  150. package/components/rancherResourceList/Masthead-btn.vue +225 -0
  151. package/components/rancherResourceList/Masthead.vue +375 -0
  152. package/components/rancherResourceList/ResourceLoadingIndicator.vue +140 -0
  153. package/components/rancherResourceList/index.vue +307 -0
  154. package/components/rancherResourceList/resource-list.config.js +7 -0
  155. package/components/rancherResourceTable.vue +783 -0
  156. package/components/rancherSortableTable/THead.vue +561 -0
  157. package/components/rancherSortableTable/actions.js +153 -0
  158. package/components/rancherSortableTable/advanced-filtering.js +272 -0
  159. package/components/rancherSortableTable/debug.js +117 -0
  160. package/components/rancherSortableTable/filtering.js +290 -0
  161. package/components/rancherSortableTable/grouping.js +48 -0
  162. package/components/rancherSortableTable/index.vue +2712 -0
  163. package/components/rancherSortableTable/paging.js +155 -0
  164. package/components/rancherSortableTable/selection.js +629 -0
  165. package/components/rancherSortableTable/sortable-config.ts +4 -0
  166. package/components/rancherSortableTable/sorting.js +129 -0
  167. package/components/templates/blank.vue +4 -1
  168. package/components/templates/default.vue +8 -0
  169. package/components/templates/home.vue +10 -1
  170. package/components/templates/plain.vue +10 -1
  171. package/composables/focusTrap.ts +11 -3
  172. package/composables/useRuntimeFlag.ts +29 -0
  173. package/config/private-label.js +15 -10
  174. package/config/router/routes.js +21 -13
  175. package/config/store.js +4 -0
  176. package/config/table-headers.js +3 -2
  177. package/config/uiplugins.js +5 -1
  178. package/core/plugin-routes.ts +5 -115
  179. package/core/plugins.js +1 -1
  180. package/core/types.ts +23 -2
  181. package/detail/__tests__/autoscaling.horizontalpodautoscaler.test.ts +84 -23
  182. package/detail/autoscaling.horizontalpodautoscaler/index.vue +13 -3
  183. package/detail/provisioning.cattle.io.cluster.vue +72 -6
  184. package/dialog/AddCustomBadgeDialog.vue +1 -0
  185. package/dialog/DeactivateDriverDialog.vue +5 -4
  186. package/dialog/ForceMachineRemoveDialog.vue +6 -3
  187. package/dialog/GitRepoForceUpdateDialog.vue +1 -1
  188. package/dialog/ScalePoolDownDialog.vue +2 -2
  189. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +16 -3
  190. package/edit/auth/__tests__/oidc.test.ts +162 -88
  191. package/edit/auth/azuread.vue +2 -1
  192. package/edit/auth/github.vue +1 -1
  193. package/edit/auth/googleoauth.vue +5 -1
  194. package/edit/auth/ldap/__tests__/config.test.ts +0 -14
  195. package/edit/auth/ldap/config.vue +0 -24
  196. package/edit/auth/ldap/index.vue +1 -1
  197. package/edit/auth/oidc.vue +39 -6
  198. package/edit/auth/saml.vue +1 -1
  199. package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +5 -2
  200. package/edit/cloudcredential.vue +24 -9
  201. package/edit/fleet.cattle.io.clustergroup.vue +5 -3
  202. package/edit/fleet.cattle.io.gitrepo.vue +2 -0
  203. package/edit/logging-flow/Match.vue +1 -1
  204. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +40 -9
  205. package/edit/management.cattle.io.user.vue +28 -3
  206. package/edit/monitoring.coreos.com.alertmanagerconfig/auth.vue +19 -19
  207. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +31 -31
  208. package/edit/monitoring.coreos.com.alertmanagerconfig/routeConfig.vue +36 -12
  209. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +6 -6
  210. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +10 -10
  211. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +4 -4
  212. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +4 -4
  213. package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +1 -1
  214. package/edit/monitoring.coreos.com.receiver/auth.vue +29 -29
  215. package/edit/monitoring.coreos.com.receiver/types/email.vue +6 -6
  216. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +10 -10
  217. package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +5 -5
  218. package/edit/monitoring.coreos.com.receiver/types/slack.vue +4 -4
  219. package/edit/namespace.vue +1 -2
  220. package/edit/networking.k8s.io.ingress/IngressClass.vue +7 -3
  221. package/edit/networking.k8s.io.ingress/RulePath.vue +1 -1
  222. package/edit/networking.k8s.io.ingress/__tests__/IngressClass.test.ts +58 -0
  223. package/edit/persistentvolume/__tests__/persistentvolume.test.ts +14 -2
  224. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +4 -1
  225. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +26 -9
  226. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +8 -10
  227. package/edit/provisioning.cattle.io.cluster/rke2.vue +31 -40
  228. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +5 -2
  229. package/edit/provisioning.cattle.io.cluster/tabs/AgentConfiguration.vue +6 -1
  230. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +33 -2
  231. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +3 -3
  232. package/edit/service.vue +0 -3
  233. package/edit/token.vue +32 -11
  234. package/edit/workload/Job.vue +6 -6
  235. package/edit/workload/__tests__/Job.test.ts +0 -1
  236. package/edit/workload/index.vue +1 -0
  237. package/edit/workload/mixins/workload.js +3 -3
  238. package/initialize/install-plugins.js +2 -1
  239. package/list/harvesterhci.io.management.cluster.vue +4 -1
  240. package/list/management.cattle.io.feature.vue +1 -0
  241. package/list/namespace.vue +3 -1
  242. package/list/provisioning.cattle.io.cluster.vue +20 -12
  243. package/list/workload.vue +7 -6
  244. package/machine-config/__tests__/vmwarevsphere.test.ts +48 -3
  245. package/machine-config/azure.vue +16 -4
  246. package/machine-config/vmwarevsphere.vue +16 -0
  247. package/mixins/resource-fetch.js +2 -1
  248. package/models/__tests__/logging.banzaicloud.io.flow.test.ts +88 -0
  249. package/models/__tests__/namespace.test.ts +25 -1
  250. package/models/cloudcredential.js +5 -0
  251. package/models/kontainerdriver.js +6 -3
  252. package/models/logging.banzaicloud.io.flow.js +2 -1
  253. package/models/management.cattle.io.node.js +3 -3
  254. package/models/management.cattle.io.setting.js +2 -1
  255. package/models/namespace.js +4 -5
  256. package/models/nodedriver.js +6 -3
  257. package/models/storage.k8s.io.storageclass.js +2 -2
  258. package/models/workload.js +4 -1
  259. package/package.json +1 -1
  260. package/pages/about.vue +16 -8
  261. package/pages/account/index.vue +80 -24
  262. package/pages/account/pri.vue +229 -0
  263. package/pages/auth/login.vue +195 -44
  264. package/pages/auth/logout.vue +4 -1
  265. package/pages/auth/setup.vue +144 -19
  266. package/pages/auth/verify.vue +13 -8
  267. package/pages/auth copy/login.vue +595 -0
  268. package/pages/auth copy/logout.vue +47 -0
  269. package/pages/auth copy/setup.vue +523 -0
  270. package/pages/auth copy/verify.vue +203 -0
  271. package/pages/c/_cluster/_product/namespaces.vue +5 -5
  272. package/pages/c/_cluster/apps/charts/chart.vue +1 -1
  273. package/pages/c/_cluster/apps/charts/install.vue +26 -26
  274. package/pages/c/_cluster/auth/config/index.vue +10 -12
  275. package/pages/c/_cluster/explorer/EventsTable.vue +38 -33
  276. package/pages/c/_cluster/explorer/index.vue +17 -15
  277. package/pages/c/_cluster/istio/index.vue +2 -2
  278. package/pages/c/_cluster/longhorn/index.vue +1 -1
  279. package/pages/c/_cluster/monitoring/index.vue +1 -1
  280. package/pages/c/_cluster/monitoring/monitor/_namespace/_id.vue +4 -2
  281. package/pages/c/_cluster/monitoring/monitor/create.vue +4 -2
  282. package/pages/c/_cluster/monitoring/monitor/index.vue +2 -2
  283. package/pages/c/_cluster/monitoring/route-receiver/_id.vue +4 -2
  284. package/pages/c/_cluster/monitoring/route-receiver/create.vue +5 -2
  285. package/pages/c/_cluster/neuvector/index.vue +1 -1
  286. package/pages/c/_cluster/settings/brand.vue +3 -3
  287. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +8 -10
  288. package/pages/diagnostic.vue +59 -11
  289. package/pages/fail-whale.vue +14 -8
  290. package/pages/home.vue +24 -18
  291. package/pages/prefs.vue +9 -7
  292. package/pages/support/index.vue +4 -1
  293. package/pkg/tsconfig.json +9 -9
  294. package/pkg/vue.config.js +1 -1
  295. package/plugins/dashboard-store/normalize.js +3 -1
  296. package/plugins/dashboard-store/resource-class.js +31 -29
  297. package/plugins/internal-api/index.ts +37 -0
  298. package/plugins/internal-api/shared/base-api.ts +13 -0
  299. package/plugins/internal-api/shell/shell.api.ts +108 -0
  300. package/promptRemove/management.cattle.io.fleetworkspace.vue +1 -1
  301. package/promptRemove/management.cattle.io.globalrole.vue +1 -1
  302. package/promptRemove/management.cattle.io.project.vue +2 -2
  303. package/promptRemove/management.cattle.io.roletemplate.vue +1 -1
  304. package/promptRemove/pod.vue +1 -1
  305. package/public/index.html +2 -1
  306. package/rancher-components/BadgeState/BadgeState.vue +5 -1
  307. package/rancher-components/Banner/Banner.vue +8 -2
  308. package/rancher-components/Card/Card.vue +3 -6
  309. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -0
  310. package/rancher-components/Form/LabeledInput/LabeledInput.vue +5 -2
  311. package/rancher-components/Form/Radio/RadioButton.vue +3 -3
  312. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -5
  313. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  314. package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -2
  315. package/rancher-components/RcDropdown/RcDropdownMenu.vue +7 -3
  316. package/rancher-components/RcDropdown/types.ts +1 -0
  317. package/scripts/clean +0 -0
  318. package/scripts/extension/bundle +20 -0
  319. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +2 -2
  320. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -1
  321. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  322. package/scripts/extension/helm/scripts/package +0 -0
  323. package/scripts/extension/helm/scripts/patch +0 -0
  324. package/scripts/extension/helm/scripts/version +0 -0
  325. package/scripts/extension/helmpatch +44 -31
  326. package/scripts/extension/parse-tag-name +0 -0
  327. package/scripts/extension/publish +12 -12
  328. package/scripts/publish-shell.sh +18 -23
  329. package/scripts/serve-pkgs +0 -0
  330. package/scripts/sync-shell-deps +0 -0
  331. package/scripts/test-plugins-build.sh +4 -6
  332. package/scripts/typegen.sh +28 -46
  333. package/server/har-file.js +25 -3
  334. package/static/favicon.ico +0 -0
  335. package/static/favicon.png +0 -0
  336. package/static/loading-indicator.html +2 -2
  337. package/store/aws.js +9 -2
  338. package/store/features.js +2 -1
  339. package/store/i18n.js +3 -3
  340. package/store/modal.ts +71 -0
  341. package/store/slideInPanel.ts +47 -0
  342. package/store/type-map.js +2 -1
  343. package/types/cloud-shell/index.d.ts +11014 -0
  344. package/types/global-vue.d.ts +5 -0
  345. package/types/internal-api/shell/growl.d.ts +25 -0
  346. package/types/internal-api/shell/modal.d.ts +77 -0
  347. package/types/internal-api/shell/slideIn.d.ts +15 -0
  348. package/types/shell/index.d.ts +118 -128
  349. package/types/vue-shim.d.ts +4 -1
  350. package/utils/__tests__/object.test.ts +38 -4
  351. package/utils/__tests__/string.test.ts +2 -2
  352. package/utils/auth.js +1 -0
  353. package/utils/banners.js +0 -45
  354. package/utils/cluster.js +35 -0
  355. package/utils/color.js +9 -8
  356. package/utils/error.js +61 -3
  357. package/utils/errorTranslate.json +450 -30
  358. package/utils/object.js +46 -6
  359. package/utils/router.js +22 -1
  360. package/utils/select.js +26 -3
  361. package/utils/string.js +9 -8
  362. package/utils/title.ts +1 -1
  363. package/utils/validators/machine-pool.ts +20 -0
  364. package/vue.config.js +7 -2
  365. package/components/formatter/ExtensionCache.vue +0 -74
  366. package/components/formatter/Port.vue +0 -24
  367. package/components/formatter/SecretType.vue +0 -41
  368. package/types/resources/fleet.d.ts +0 -57
  369. package/types/resources/pod-security-admission.ts +0 -36
  370. package/types/resources/settings.d.ts +0 -93
  371. package/types/resources/userPreferences.d.ts +0 -13
  372. package/types/vue-shim.d +0 -20
package/core/types.ts CHANGED
@@ -373,6 +373,11 @@ export interface ConfigureTypeOptions {
373
373
  */
374
374
  customRoute?: Object;
375
375
 
376
+ /**
377
+ * Custom options vary pre resource type
378
+ */
379
+ custom?: any;
380
+
376
381
  /**
377
382
  * Leaving these here for completeness but I don't think these should be advertised as useable to plugin creators.
378
383
  */
@@ -471,6 +476,24 @@ export interface DSLReturnType {
471
476
  */
472
477
  virtualType: (options: ConfigureVirtualTypeOptions) => void;
473
478
 
479
+ /**
480
+ * Side menu ordering for grouping of pages
481
+ * @param input Name of the group
482
+ * @param weight Ordering to be applied for the specified group
483
+ * @param forBasic Apply to basic type instead of regular type tree
484
+ * @returns {@link void}
485
+ */
486
+ weightGroup: (input: string, weight: number, forBasic: boolean) => void;
487
+
488
+ /**
489
+ * Side menu ordering for simple pages
490
+ * @param input Name of the page/resource
491
+ * @param weight Ordering to be applied for the specified page/resource
492
+ * @param forBasic Apply to basic type instead of regular type tree
493
+ * @returns {@link void}
494
+ */
495
+ weightType: (input: string, weight: number, forBasic: boolean) => void;
496
+
474
497
  /**
475
498
  * Leaving these here for completeness but I don't think these should be advertised as useable to plugin creators.
476
499
  */
@@ -484,8 +507,6 @@ export interface DSLReturnType {
484
507
  // moveType: (match, group)
485
508
  // setGroupDefaultType: (input, defaultType)
486
509
  // spoofedType: (obj)
487
- // weightGroup: (input, weight, forBasic)
488
- // weightType: (input, weight, forBasic)
489
510
  }
490
511
 
491
512
  /**
@@ -1,4 +1,5 @@
1
1
  import { mount } from '@vue/test-utils';
2
+ import camelCase from 'lodash/camelCase';
2
3
  import HorizontalPodAutoScaler from '@shell/detail/autoscaling.horizontalpodautoscaler/index.vue';
3
4
 
4
5
  describe('view: autoscaling.horizontalpodautoscaler', () => {
@@ -43,7 +44,7 @@ describe('view: autoscaling.horizontalpodautoscaler', () => {
43
44
 
44
45
  };
45
46
 
46
- const value = {
47
+ const valueWithResourceMetrics = {
47
48
  status: {
48
49
  currentMetrics: [
49
50
  {
@@ -100,36 +101,96 @@ describe('view: autoscaling.horizontalpodautoscaler', () => {
100
101
  }
101
102
  }
102
103
  };
104
+ const valueWithOtherMetrics = {
105
+ status: {
106
+ currentMetrics: [
103
107
 
104
- const metricsValue = Object.values(value.spec.metrics);
105
- const currentMetrics = Object.values(value.status.currentMetrics);
108
+ {
109
+ external: {
110
+ metric: { name: 's1-prometheus' },
111
+ current: { averageValue: 50 }
112
+ },
113
+ type: 'External'
106
114
 
107
- const wrapper = mount(HorizontalPodAutoScaler, {
108
- props: { value },
109
- global: { mocks, stubs },
110
- });
115
+ }
116
+ ],
117
+ },
118
+ spec: {
119
+ metrics: [
120
+ {
121
+ external: {
122
+ metric: { name: 's1-prometheus' },
123
+ target: { averageValue: 50, type: 'AverageValue' }
124
+ },
125
+ type: 'External'
126
+ }
127
+ ]
128
+ }
129
+ }
130
+ ;
111
131
 
112
- describe.each(value.spec.metrics)('should display metrics for each resource:', (metric) => {
113
- const name = metric.resource.name;
132
+ describe('with resource metrics:', () => {
133
+ const metricsValue = Object.values(valueWithResourceMetrics.spec.metrics);
134
+ const currentMetrics = Object.values(valueWithResourceMetrics.status.currentMetrics);
114
135
 
115
- it(`${ name }:`, () => {
116
- // Resource metrics
117
- const resourceValue = wrapper.get(`[data-testid="resource-metrics-value-${ name }"]`);
118
- const resourceName = wrapper.get(`[data-testid="resource-metrics-name-${ name }"]`);
119
- const metricValue = metricsValue.find((f) => f.resource.name === name)?.resource;
136
+ const wrapper = mount(HorizontalPodAutoScaler, {
137
+ props: { value: valueWithResourceMetrics },
138
+ global: { mocks, stubs },
139
+ });
120
140
 
121
- // Current Metrics
122
- const averageUtilization = wrapper.get(`[data-testid="current-metrics-Average Utilization-${ name }"]`);
123
- const averageValue = wrapper.get(`[data-testid="current-metrics-Average Value-${ name }"]`);
124
- const currentResource = currentMetrics.find((f) => f.resource.name === name)?.resource.current;
141
+ describe.each(valueWithResourceMetrics.spec.metrics)('should display metrics for each resource:', (metric) => {
142
+ const name = metric.resource.name;
125
143
 
144
+ it(`${ name }:`, () => {
126
145
  // Resource metrics
127
- expect(resourceValue.element.textContent).toBe(`${ metricValue?.target?.averageUtilization }`);
128
- expect(resourceName.element.textContent).toBe(`${ metricValue?.name }`);
146
+ const resourceValue = wrapper.get(`[data-testid="resource-metrics-value-${ name }"]`);
147
+ const resourceName = wrapper.get(`[data-testid="resource-metrics-name-${ name }"]`);
148
+ const metricValue = metricsValue.find((f) => f.resource.name === name)?.resource;
149
+
150
+ // Current Metrics
151
+ const averageUtilization = wrapper.get(`[data-testid="current-metrics-Average Utilization-${ name }"]`);
152
+ const averageValue = wrapper.get(`[data-testid="current-metrics-Average Value-${ name }"]`);
153
+ const currentResource = currentMetrics.find((f) => f.resource.name === name)?.resource.current;
154
+
155
+ // Resource metrics
156
+ expect(resourceValue.element.textContent).toBe(`${ metricValue?.target?.averageUtilization }`);
157
+ expect(resourceName.element.textContent).toBe(`${ metricValue?.name }`);
158
+
159
+ // Current Metrics
160
+ expect(averageUtilization.element.textContent).toBe(`${ currentResource?.averageUtilization }`);
161
+ expect(averageValue.element.textContent).toBe(`${ currentResource?.averageValue }`);
162
+ });
163
+ });
164
+ });
165
+
166
+ describe('with other metrics:', () => {
167
+ const currentMetrics = Object.values(valueWithOtherMetrics.status.currentMetrics);
168
+
169
+ const wrapper = mount(HorizontalPodAutoScaler, {
170
+ props: { value: valueWithOtherMetrics },
171
+ global: { mocks, stubs },
172
+ });
173
+
174
+ describe.each(valueWithOtherMetrics.spec.metrics)('should display metrics for each resource:', (metric) => {
175
+ const metricType = camelCase(metric.type);
176
+ const name = metric[metricType as keyof typeof metric].metric.name;
177
+
178
+ it(`${ name }:`, () => {
179
+ // Resource metrics
180
+ const resourceValue = wrapper.get(`[data-testid="resource-metrics-value-${ name }"]`);
181
+ const metricValue = metric[metricType as keyof typeof metric];
182
+
183
+ // Current Metrics
184
+ const averageValue = wrapper.get(`[data-testid="current-metrics-Average Value-${ name }"]`);
185
+ const currentMatch = currentMetrics.find((f) => f[metricType as keyof typeof metric]?.metric.name === name);
186
+ const currentValue = currentMatch[metricType as keyof typeof metric]?.current;
187
+
188
+ // Resource metrics
189
+ expect(resourceValue.element.textContent).toBe(`${ metricValue?.target?.averageValue }`);
129
190
 
130
- // Current Metrics
131
- expect(averageUtilization.element.textContent).toBe(`${ currentResource?.averageUtilization }`);
132
- expect(averageValue.element.textContent).toBe(`${ currentResource?.averageValue }`);
191
+ // Current Metrics
192
+ expect(averageValue.element.textContent).toBe(`${ currentValue?.averageValue }`);
193
+ });
133
194
  });
134
195
  });
135
196
  });
@@ -43,11 +43,21 @@ export default {
43
43
  } = this.value;
44
44
 
45
45
  return metrics.map((metric) => {
46
+ const currentMetricsKVs = [];
47
+ let currentMatch;
48
+ const metricType = camelCase(metric.type);
46
49
  const metricValue = get(metric, camelCase(metric.type));
47
50
  const targetType = metricValue?.target?.type;
48
- const currentMatch = findBy(currentMetrics, 'resource.name', metric.resource.name);
51
+
52
+ // The format is different between 'Resource' metrics and others.
53
+ // See for examples: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/#appendix-horizontal-pod-autoscaler-status-conditions
54
+ if (metricType !== 'resource') {
55
+ currentMatch = findBy(currentMetrics, `${ metricType }.metric.name`, metricValue.metric.name);
56
+ } else {
57
+ currentMatch = findBy(currentMetrics, 'resource.name', metric.resource.name);
58
+ }
59
+
49
60
  const current = currentMatch ? get(currentMatch, `${ camelCase(metric.type) }.current`) : null;
50
- const currentMetricsKVs = [];
51
61
 
52
62
  if (current) {
53
63
  keys(current).forEach((k) => {
@@ -67,7 +77,7 @@ export default {
67
77
  objectApiVersion: metricValue?.describedObject?.apiVersion ?? null,
68
78
  objectKind: metricValue?.describedObject?.kind ?? null,
69
79
  objectName: metricValue?.describedObject?.name ?? null,
70
- resourceName: metricValue?.name ?? null,
80
+ resourceName: metricValue?.name || metricValue?.metric?.name || null,
71
81
  currentMetrics: currentMetricsKVs,
72
82
  },
73
83
  };
@@ -215,6 +215,41 @@ export default {
215
215
  },
216
216
 
217
217
  data() {
218
+ const noneGroupOption = {
219
+ tooltipKey: 'resourceTable.groupBy.none',
220
+ icon: 'icon-list-flat',
221
+ value: 'none',
222
+ };
223
+ const poolColumn = {
224
+ name: 'pool',
225
+ labelKey: 'cluster.machinePool.name.label',
226
+ value: 'spec.nodePoolName',
227
+ getValue: (row) => row.spec.nodePoolName,
228
+ sort: ['spec.nodePoolName'],
229
+ };
230
+ const poolGroupOption = {
231
+ tooltipKey: 'resourceTable.groupBy.pool',
232
+ icon: 'icon-cluster',
233
+ hideColumn: poolColumn.name,
234
+ value: 'spec.nodePoolName',
235
+ field: 'spec.nodePoolName'
236
+ };
237
+
238
+ const machineColumn = {
239
+ name: 'pool',
240
+ labelKey: 'cluster.machinePool.name.label',
241
+ value: 'pool.nameDisplay',
242
+ getValue: (row) => row.pool.nameDisplay,
243
+ sort: ['pool.nameDisplay'],
244
+ };
245
+ const machineGroupOption = {
246
+ tooltipKey: 'resourceTable.groupBy.pool',
247
+ icon: 'icon-cluster',
248
+ hideColumn: machineColumn.name,
249
+ value: 'poolId',
250
+ field: 'poolId'
251
+ };
252
+
218
253
  return {
219
254
 
220
255
  allMachines: [],
@@ -250,7 +285,25 @@ export default {
250
285
  conditions: true, // in ResourceTabs
251
286
  },
252
287
 
253
- showWindowsWarning: false
288
+ showWindowsWarning: false,
289
+
290
+ machineColumn,
291
+ poolColumn,
292
+
293
+ noneGroupOption,
294
+
295
+ machineGroupOption,
296
+ machineGroupOptions: [
297
+ noneGroupOption,
298
+ machineGroupOption
299
+ ],
300
+
301
+ poolGroupOption,
302
+ poolGroupOptions: [
303
+ noneGroupOption,
304
+ poolGroupOption,
305
+ ]
306
+
254
307
  };
255
308
  },
256
309
 
@@ -416,7 +469,7 @@ export default {
416
469
  },
417
470
 
418
471
  machineHeaders() {
419
- return [
472
+ const headers = [
420
473
  STATE,
421
474
  NAME_COL,
422
475
  {
@@ -433,10 +486,16 @@ export default {
433
486
  ROLES,
434
487
  AGE,
435
488
  ];
489
+
490
+ if (!this.value.isCustom) {
491
+ headers.splice(3, 0, this.machineColumn);
492
+ }
493
+
494
+ return headers;
436
495
  },
437
496
 
438
497
  mgmtNodeSchemaHeaders() {
439
- return [
498
+ const headers = [
440
499
  STATE, NAME_COL,
441
500
  {
442
501
  name: 'node-name',
@@ -452,6 +511,12 @@ export default {
452
511
  ROLES,
453
512
  AGE
454
513
  ];
514
+
515
+ if (!this.value.isCustom) {
516
+ headers.splice(3, 0, this.poolColumn);
517
+ }
518
+
519
+ return headers;
455
520
  },
456
521
 
457
522
  rke1Snapshots() {
@@ -772,11 +837,11 @@ export default {
772
837
  :schema="machineSchema"
773
838
  :headers="machineHeaders"
774
839
  default-sort-by="name"
775
- :group-by="value.isCustom ? null : 'poolId'"
776
840
  group-ref="pool"
841
+ :group-default="machineGroupOption.value"
777
842
  :group-sort="['pool.nameDisplay']"
843
+ :group-options="value.isCustom ? [noneGroupOption] : machineGroupOptions"
778
844
  :sort-generation-fn="machineSortGenerationFn"
779
- :hide-grouping-controls="true"
780
845
  >
781
846
  <template #main-row:isFake="{fullColspan}">
782
847
  <tr class="main-row">
@@ -859,9 +924,10 @@ export default {
859
924
  :schema="mgmtNodeSchema"
860
925
  :headers="mgmtNodeSchemaHeaders"
861
926
  :rows="nodes"
862
- :group-by="value.isCustom ? null : 'spec.nodePoolName'"
863
927
  group-ref="pool"
928
+ :group-default="poolGroupOption.value"
864
929
  :group-sort="['pool.nameDisplay']"
930
+ :group-options="value.isCustom ? [noneGroupOption] : poolGroupOptions"
865
931
  :sort-generation-fn="nodeSortGenerationFn"
866
932
  :hide-grouping-controls="true"
867
933
  >
@@ -296,6 +296,7 @@ export default {
296
296
  v-model:value="badgeBgColor"
297
297
  :disabled="!badgeColorPicker"
298
298
  :default-value="badgeBgColor"
299
+ :aria-label="t('clusterBadge.modal.badgeBgColorInput')"
299
300
  />
300
301
  </div>
301
302
  </div>
@@ -31,12 +31,12 @@ export default {
31
31
  },
32
32
  computed: {
33
33
  formattedText() {
34
- const namesSliced = this.drivers.map((obj) => obj.nameDisplay);
35
- const count = namesSliced.length;
36
- const remaining = namesSliced.length > 5 ? namesSliced.length - 5 : 0;
34
+ const driverNames = this.drivers.map((obj) => obj.nameDisplay);
35
+ const count = driverNames.length;
36
+ const remaining = driverNames.length > 5 ? driverNames.length - 5 : 0;
37
37
 
38
38
  const plusMore = this.t('drivers.deactivate.andOthers', { count: remaining });
39
- const names = resourceNames(namesSliced, this.t, { plusMore, endString: false });
39
+ const names = resourceNames(driverNames, plusMore, this.t, false);
40
40
  const warningDrivers = this.t('drivers.deactivate.warningDrivers', { names, count });
41
41
 
42
42
  return this.t('drivers.deactivate.warning', { warningDrivers, count });
@@ -91,6 +91,7 @@ export default {
91
91
  :key="i"
92
92
  color="error"
93
93
  :label="err"
94
+ data-testid="deactivate-driver-error-banner"
94
95
  />
95
96
  </div>
96
97
  </template>
@@ -88,16 +88,19 @@ export default {
88
88
  {{ t('promptForceRemove.confirmName') }}
89
89
  </div>
90
90
  <div class="mb-10">
91
- <CopyToClipboardText :text="nameToMatch" />
91
+ <CopyToClipboardText
92
+ :aria-label="t('promptForceRemove.ariaLabel')"
93
+ :text="nameToMatch"
94
+ />
92
95
  </div>
93
96
  <input
94
97
  id="confirm"
95
98
  v-model="confirmName"
96
99
  type="text"
97
100
  >
98
- <div class="text-info mt-20">
101
+ <!-- <div class="text-info mt-20">
99
102
  {{ protip }}
100
- </div>
103
+ </div> -->
101
104
  <Banner
102
105
  v-for="(error, i) in errors"
103
106
  :key="i"
@@ -84,7 +84,7 @@ export default {
84
84
  <template #body>
85
85
  <div class="mb-20">
86
86
  {{ t('fleet.gitRepo.actions.forceUpdate.promptNames') }} <span
87
- v-clean-html="resourceNames(names, t)"
87
+ v-clean-html="resourceNames(names, null, t)"
88
88
  class="body"
89
89
  />
90
90
  </div>
@@ -91,9 +91,9 @@ export default {
91
91
  @update:value="update()"
92
92
  />
93
93
  </div>
94
- <div class="text-info mt-20">
94
+ <!-- <div class="text-info mt-20">
95
95
  {{ protip }}
96
- </div>
96
+ </div> -->
97
97
  </div>
98
98
  </template>
99
99
  <template #actions>
@@ -2,14 +2,23 @@ import { mount } from '@vue/test-utils';
2
2
  import FormValidation from '@shell/mixins/form-validation';
3
3
  import Monitoring from '@shell/edit/monitoring.coreos.com.prometheusrule/index.vue';
4
4
  import { _EDIT } from '@shell/config/query-params';
5
+ import { createStore } from 'vuex';
5
6
 
6
7
  describe('edit: management.cattle.io.setting should', () => {
7
8
  const MOCKED_ERRORS = ['error1', 'error2', 'error3', 'error4', 'error5'];
8
9
  const ERROR_BANNER_SELECTOR = '[data-testid="banner-close"]';
10
+ const store = createStore({
11
+ getters: {
12
+ namespaces: () => () => ({}),
13
+ currentStore: () => () => 'current_store',
14
+ 'current_store/schemaFor': () => jest.fn()
15
+ }
16
+ });
9
17
  const requiredSetup = () => ({
10
18
  // Remove all these mocks after migration to Vue 2.7/3 due mixin logic
11
19
  global: {
12
- mocks: {
20
+ provide: { store },
21
+ mocks: {
13
22
  $store: {
14
23
  dispatch: jest.fn(),
15
24
  getters: {
@@ -35,8 +44,12 @@ describe('edit: management.cattle.io.setting should', () => {
35
44
  canYaml: false,
36
45
  mode: _EDIT,
37
46
  resource: {},
38
- value: { value: 'anything' },
39
- name: ''
47
+ value: {
48
+ setAnnotation: jest.fn(),
49
+ value: 'anything',
50
+ metadata: {},
51
+ },
52
+ name: ''
40
53
  },
41
54
  ...requiredSetup()
42
55
  });