@rancher/shell 1.2.0 → 2.0.0

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 (689) hide show
  1. package/assets/data/aws-regions.json +9 -0
  2. package/assets/images/vendor/openid.svg +18 -0
  3. package/assets/styles/app.scss +1 -2
  4. package/assets/styles/fonts/_icons.scss +3 -3
  5. package/assets/styles/global/_columns.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +1 -0
  7. package/assets/styles/global/_layout.scss +99 -0
  8. package/assets/styles/themes/_csp.scss +2 -2
  9. package/assets/styles/themes/_dark.scss +8 -2
  10. package/assets/styles/themes/_light.scss +2 -1
  11. package/assets/styles/themes/_suse.scss +1 -1
  12. package/assets/styles/vendor/vue-select.scss +5 -0
  13. package/assets/translations/en-us.yaml +299 -63
  14. package/assets/translations/zh-hans.yaml +7 -31
  15. package/babel.config.js +8 -2
  16. package/chart/__tests__/S3.test.ts +9 -2
  17. package/chart/gatekeeper.vue +2 -11
  18. package/chart/istio.vue +1 -10
  19. package/chart/logging/index.vue +2 -11
  20. package/chart/monitoring/alerting/index.vue +7 -21
  21. package/chart/monitoring/grafana/index.vue +61 -2
  22. package/chart/monitoring/index.vue +52 -26
  23. package/chart/monitoring/prometheus/index.vue +39 -45
  24. package/chart/rancher-backup/S3.vue +11 -9
  25. package/chart/rancher-backup/index.vue +18 -15
  26. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  27. package/cloud-credential/azure.vue +4 -17
  28. package/cloud-credential/generic.vue +18 -9
  29. package/cloud-credential/harvester.vue +11 -3
  30. package/components/AppModal.vue +167 -0
  31. package/components/AssignTo.vue +7 -4
  32. package/components/AsyncButton.vue +27 -5
  33. package/components/BackLink.vue +4 -4
  34. package/components/BannerGraphic.vue +1 -0
  35. package/components/BrandImage.vue +47 -1
  36. package/components/Carousel.vue +15 -8
  37. package/components/Certificates.vue +161 -0
  38. package/components/ClusterBadge.vue +12 -3
  39. package/components/ClusterIconMenu.vue +55 -12
  40. package/components/ClusterProviderIcon.vue +14 -3
  41. package/components/CodeMirror.vue +111 -17
  42. package/components/CommunityLinks.vue +12 -8
  43. package/components/CopyCode.vue +6 -2
  44. package/components/CopyToClipboard.vue +2 -1
  45. package/components/CopyToClipboardText.vue +14 -9
  46. package/components/CreateDriver.vue +81 -0
  47. package/components/CruResource.vue +52 -27
  48. package/components/DetailTop.vue +2 -2
  49. package/components/Dialog.vue +6 -5
  50. package/components/DisableAuthProviderModal.vue +14 -8
  51. package/components/DraggableZone.vue +2 -2
  52. package/components/EtcdInfoBanner.vue +5 -5
  53. package/components/ExplorerMembers.vue +3 -3
  54. package/components/ExplorerProjectsNamespaces.vue +31 -7
  55. package/components/FixedBanner.vue +48 -36
  56. package/components/GlobalRoleBindings.vue +26 -0
  57. package/components/IconOrSvg.vue +1 -1
  58. package/components/Import.vue +10 -6
  59. package/components/Inactivity.vue +1 -5
  60. package/components/KeyValueView.vue +14 -10
  61. package/components/Markdown.vue +16 -12
  62. package/components/MessageLink.vue +2 -2
  63. package/components/ModalWithCard.vue +5 -8
  64. package/components/MoveModal.vue +35 -33
  65. package/components/PodSecurityAdmission.vue +3 -3
  66. package/components/PromptChangePassword.vue +33 -33
  67. package/components/PromptModal.vue +11 -21
  68. package/components/PromptRemove.vue +11 -17
  69. package/components/PromptRestore.vue +18 -16
  70. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  71. package/components/Questions/__tests__/Float.test.ts +9 -19
  72. package/components/Questions/__tests__/Int.test.ts +9 -19
  73. package/components/Questions/__tests__/String.test.ts +9 -19
  74. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  75. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  76. package/components/Questions/index.vue +19 -3
  77. package/components/ResourceCancelModal.vue +34 -29
  78. package/components/ResourceDetail/Masthead.vue +48 -16
  79. package/components/ResourceDetail/index.vue +6 -4
  80. package/components/ResourceList/Masthead.vue +10 -9
  81. package/components/ResourceList/index.vue +65 -14
  82. package/components/ResourceTable.vue +87 -21
  83. package/components/ResourceYaml.vue +35 -5
  84. package/components/SelectIconGrid.vue +3 -3
  85. package/components/SideNav.vue +50 -94
  86. package/components/SingleClusterInfo.vue +4 -4
  87. package/components/SortableTable/THead.vue +33 -21
  88. package/components/SortableTable/filtering.js +9 -1
  89. package/components/SortableTable/grouping.js +8 -1
  90. package/components/SortableTable/index.vue +143 -44
  91. package/components/SortableTable/paging.js +36 -7
  92. package/components/SortableTable/selection.js +2 -1
  93. package/components/SortableTable/sorting.js +24 -7
  94. package/components/StatusTable.vue +5 -1
  95. package/components/Tabbed/index.vue +18 -1
  96. package/components/TableDataUserIcon.vue +47 -0
  97. package/components/TypeDescription.vue +1 -0
  98. package/components/Wizard.vue +1 -0
  99. package/components/YamlEditor.vue +1 -0
  100. package/components/__tests__/AppModal.test.ts +98 -0
  101. package/components/__tests__/AsyncButton.test.ts +1 -3
  102. package/components/__tests__/BackLink.test.ts +1 -1
  103. package/components/__tests__/ButtonGroup.test.ts +3 -6
  104. package/components/__tests__/Carousel.test.ts +43 -0
  105. package/components/__tests__/Certificates.test.ts +29 -0
  106. package/components/__tests__/CodeMirror.test.ts +87 -0
  107. package/components/__tests__/CopyCode.test.ts +5 -4
  108. package/components/__tests__/CruResource.test.ts +10 -9
  109. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  110. package/components/__tests__/FixedBanner.test.ts +5 -20
  111. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  112. package/components/__tests__/TabTitle.test.ts +129 -0
  113. package/components/auth/AzureWarning.vue +2 -2
  114. package/components/auth/RoleDetailEdit.vue +10 -0
  115. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  116. package/components/auth/login/oidc.vue +7 -1
  117. package/components/fleet/FleetBundles.vue +5 -11
  118. package/components/fleet/FleetClusters.vue +9 -9
  119. package/components/fleet/FleetIntro.vue +11 -17
  120. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  121. package/components/fleet/FleetRepos.vue +63 -27
  122. package/components/fleet/FleetResources.vue +6 -1
  123. package/components/fleet/FleetStatus.vue +3 -3
  124. package/components/fleet/FleetSummary.vue +35 -30
  125. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  126. package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
  127. package/components/form/ArrayList.vue +22 -18
  128. package/components/form/ArrayListSelect.vue +5 -0
  129. package/components/form/BannerSettings.vue +3 -0
  130. package/components/form/ClusterAppearance.vue +132 -0
  131. package/components/form/ColorInput.vue +1 -0
  132. package/components/form/Error.vue +3 -3
  133. package/components/form/FileSelector.vue +1 -0
  134. package/components/form/Footer.vue +2 -2
  135. package/components/form/GitPicker.vue +83 -38
  136. package/components/form/KeyValue.vue +69 -48
  137. package/components/form/LabeledSelect.vue +145 -41
  138. package/components/form/Labels.vue +3 -1
  139. package/components/form/NameNsDescription.vue +26 -9
  140. package/components/form/Password.vue +3 -1
  141. package/components/form/ResourceLabeledSelect.vue +187 -0
  142. package/components/form/ResourceTabs/index.vue +31 -15
  143. package/components/form/SecretSelector.vue +93 -18
  144. package/components/form/SelectOrCreateAuthSecret.vue +132 -59
  145. package/components/form/SimpleSecretSelector.vue +88 -28
  146. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  147. package/components/form/__tests__/KeyValue.test.ts +120 -11
  148. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  149. package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +25 -15
  150. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  151. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  152. package/components/formatter/AppSummaryGraph.vue +2 -2
  153. package/components/formatter/Checked.vue +11 -3
  154. package/components/formatter/CloudCredPublicData.vue +30 -0
  155. package/components/formatter/ClusterLink.vue +2 -2
  156. package/components/formatter/ClusterProvider.vue +1 -18
  157. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  158. package/components/formatter/FleetSummaryGraph.vue +25 -12
  159. package/components/formatter/ImagePercentageBar.vue +0 -4
  160. package/components/formatter/IngressTarget.vue +18 -7
  161. package/components/formatter/Link.vue +2 -2
  162. package/components/formatter/LinkDetail.vue +2 -2
  163. package/components/formatter/LinkDetailImage.vue +2 -2
  164. package/components/formatter/LinkName.vue +2 -2
  165. package/components/formatter/LiveDuration.vue +1 -1
  166. package/components/formatter/PercentageBar.vue +1 -1
  167. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  168. package/components/formatter/SecretType.vue +2 -2
  169. package/components/formatter/VirtualServiceGateways.vue +2 -2
  170. package/components/formatter/WorkloadDetailEndpoints.vue +12 -22
  171. package/components/formatter/__tests__/Checked.test.ts +19 -0
  172. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  173. package/components/formatter/__tests__/WorkloadDetailEndpoints.test.ts +81 -0
  174. package/components/nav/Group.vue +9 -7
  175. package/components/nav/Header.vue +84 -45
  176. package/components/nav/Jump.vue +19 -9
  177. package/components/nav/NamespaceFilter.vue +8 -1
  178. package/components/nav/TopLevelMenu.vue +391 -132
  179. package/components/nav/Type.vue +71 -106
  180. package/components/nav/WindowManager/ContainerLogs.vue +120 -19
  181. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  182. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  183. package/components/nav/WindowManager/index.vue +11 -10
  184. package/components/nav/__tests__/TopLevelMenu.test.ts +400 -6
  185. package/components/nav/__tests__/Type.test.ts +322 -97
  186. package/components/nuxt/nuxt-child.js +9 -78
  187. package/components/nuxt/nuxt-error.vue +1 -1
  188. package/components/nuxt/nuxt-link.client.js +13 -95
  189. package/{layouts → components/templates}/blank.vue +1 -1
  190. package/{layouts → components/templates}/default.vue +11 -101
  191. package/{layouts → components/templates}/error.vue +13 -26
  192. package/{layouts → components/templates}/home.vue +4 -1
  193. package/{layouts → components/templates}/plain.vue +4 -1
  194. package/{layouts → components/templates}/standalone.vue +1 -5
  195. package/{layouts → components/templates}/unauthenticated.vue +2 -3
  196. package/composables/useCompactInput.test.ts +36 -0
  197. package/composables/useCompactInput.ts +20 -0
  198. package/composables/useLabeledFormElement.test.ts +135 -0
  199. package/composables/useLabeledFormElement.ts +138 -0
  200. package/config/harvester-manager-types.js +2 -0
  201. package/config/home-links.js +2 -1
  202. package/config/labels-annotations.js +2 -1
  203. package/config/middleware.js +0 -6
  204. package/config/pagination-table-headers.js +57 -0
  205. package/config/pod-security-admission.ts +1 -1
  206. package/config/private-label.js +21 -1
  207. package/config/product/auth.js +1 -0
  208. package/config/product/explorer.js +166 -45
  209. package/config/product/fleet.js +6 -1
  210. package/config/product/legacy.js +2 -11
  211. package/config/product/manager.js +51 -25
  212. package/config/query-params.js +2 -0
  213. package/config/roles.ts +23 -0
  214. package/config/router/index.js +23 -0
  215. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  216. package/config/router/navigation-guards/authentication.js +63 -0
  217. package/config/router/navigation-guards/index.js +15 -0
  218. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  219. package/config/router/routes.js +487 -0
  220. package/config/settings.ts +31 -2
  221. package/config/store.js +8 -4
  222. package/config/system-namespaces.js +3 -0
  223. package/config/table-headers.js +66 -1
  224. package/config/types.js +35 -20
  225. package/config/uiplugins.js +10 -5
  226. package/core/plugin-helpers.js +4 -6
  227. package/core/plugin-routes.ts +56 -114
  228. package/core/plugin.ts +18 -11
  229. package/core/plugins-loader.js +7 -9
  230. package/core/plugins.js +289 -285
  231. package/core/types-provisioning.ts +7 -0
  232. package/creators/app/files/.eslintignore +0 -2
  233. package/creators/app/files/.gitlab-ci.yml +14 -0
  234. package/creators/app/files/.vscode/settings.json +0 -1
  235. package/creators/app/init +19 -0
  236. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  237. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  238. package/creators/pkg/init +32 -0
  239. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +77 -0
  240. package/detail/__tests__/service.test.ts +62 -0
  241. package/detail/catalog.cattle.io.app.vue +1 -1
  242. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  243. package/detail/fleet.cattle.io.bundle.vue +1 -1
  244. package/detail/fleet.cattle.io.cluster.vue +11 -1
  245. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  246. package/detail/namespace.vue +2 -2
  247. package/detail/networking.k8s.io.ingress.vue +52 -19
  248. package/detail/node.vue +22 -3
  249. package/detail/provisioning.cattle.io.cluster.vue +27 -9
  250. package/detail/service.vue +1 -1
  251. package/detail/workload/index.vue +1 -0
  252. package/dialog/AddCustomBadgeDialog.vue +318 -161
  253. package/dialog/DeactivateDriverDialog.vue +118 -0
  254. package/dialog/RollbackWorkloadDialog.vue +2 -2
  255. package/dialog/RotateCertificatesDialog.vue +0 -21
  256. package/dialog/ScaleMachineDownDialog.vue +34 -17
  257. package/directives/clean-html.js +15 -0
  258. package/directives/clean-tooltip.js +32 -0
  259. package/directives/focus.js +41 -0
  260. package/directives/int-number.js +21 -0
  261. package/directives/positive-int-number.js +19 -0
  262. package/directives/trim-whitespace.js +19 -0
  263. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  264. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  265. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  266. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  267. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  268. package/edit/__tests__/nodeDriver.test.ts +107 -0
  269. package/edit/__tests__/service.test.ts +85 -0
  270. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  271. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  272. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  273. package/edit/auth/__tests__/azuread.test.ts +241 -0
  274. package/edit/auth/__tests__/oidc.test.ts +137 -0
  275. package/edit/auth/azuread.vue +133 -31
  276. package/edit/auth/github.vue +5 -17
  277. package/edit/auth/googleoauth.vue +6 -23
  278. package/edit/auth/ldap/index.vue +5 -17
  279. package/edit/auth/oidc.vue +143 -42
  280. package/edit/auth/saml.vue +5 -14
  281. package/edit/catalog.cattle.io.clusterrepo.vue +177 -9
  282. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  283. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  284. package/edit/cloudcredential.vue +28 -4
  285. package/edit/configmap.vue +10 -4
  286. package/edit/fleet.cattle.io.gitrepo.vue +3 -1
  287. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  288. package/edit/kontainerDriver.vue +65 -0
  289. package/edit/logging-flow/Match.vue +10 -9
  290. package/edit/logging-flow/index.vue +4 -19
  291. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  292. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  293. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  294. package/edit/management.cattle.io.project.vue +3 -53
  295. package/edit/management.cattle.io.setting.vue +52 -2
  296. package/edit/management.cattle.io.user.vue +2 -1
  297. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  298. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  299. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +1 -1
  300. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -2
  301. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +1 -1
  302. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +15 -3
  303. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +4 -1
  304. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  305. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  306. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  307. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  308. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  309. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  310. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +46 -7
  311. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +1 -1
  312. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  313. package/edit/nodeDriver.vue +65 -0
  314. package/edit/persistentvolume/index.vue +2 -2
  315. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +33 -16
  316. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +276 -0
  317. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  318. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +3 -0
  319. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  320. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  321. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  322. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +77 -13
  323. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +391 -0
  324. package/edit/provisioning.cattle.io.cluster/import.vue +4 -4
  325. package/edit/provisioning.cattle.io.cluster/index.vue +126 -51
  326. package/edit/provisioning.cattle.io.cluster/rke2.vue +325 -791
  327. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  328. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +217 -0
  329. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +123 -129
  330. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  331. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  332. package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +1 -0
  333. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  334. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +190 -0
  335. package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +3 -0
  336. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +148 -0
  337. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  338. package/edit/resources.cattle.io.backup.vue +139 -124
  339. package/edit/resources.cattle.io.restore.vue +146 -126
  340. package/edit/service.vue +13 -0
  341. package/edit/serviceaccount.vue +46 -4
  342. package/edit/token.vue +1 -0
  343. package/edit/workload/Upgrading.vue +3 -2
  344. package/edit/workload/__tests__/Job.test.ts +1 -3
  345. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  346. package/edit/workload/index.vue +2 -1
  347. package/edit/workload/mixins/workload.js +35 -2
  348. package/edit/workload/storage/emptyDir.vue +2 -2
  349. package/initialize/App.vue +75 -0
  350. package/initialize/app-extended.js +128 -0
  351. package/initialize/entry-helpers.js +549 -0
  352. package/initialize/entry.js +32 -0
  353. package/initialize/install-components.js +23 -0
  354. package/initialize/install-directives.js +59 -0
  355. package/initialize/install-plugins.js +123 -0
  356. package/list/__tests__/workload.test.ts +1 -1
  357. package/list/catalog.cattle.io.app.vue +1 -0
  358. package/list/cis.cattle.io.clusterscan.vue +16 -10
  359. package/list/group.principal.vue +2 -2
  360. package/list/management.cattle.io.feature.vue +12 -14
  361. package/list/management.cattle.io.setting.vue +1 -0
  362. package/list/management.cattle.io.user.vue +13 -4
  363. package/list/networking.k8s.io.ingress.vue +36 -0
  364. package/list/node.vue +212 -73
  365. package/list/provisioning.cattle.io.cluster.vue +17 -4
  366. package/list/ui.cattle.io.navlink.vue +2 -2
  367. package/list/workload.vue +22 -0
  368. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  369. package/machine-config/__tests__/vmwarevsphere.test.ts +1 -3
  370. package/machine-config/amazonec2.vue +1 -1
  371. package/machine-config/azure.vue +2 -1
  372. package/machine-config/generic.vue +11 -15
  373. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  374. package/machine-config/vmwarevsphere.vue +31 -27
  375. package/middleware/authenticated.js +23 -380
  376. package/mixins/__tests__/chart.test.ts +48 -6
  377. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  378. package/mixins/auth-config.js +5 -9
  379. package/mixins/brand.js +102 -96
  380. package/mixins/chart.js +27 -13
  381. package/mixins/create-edit-view/index.js +2 -2
  382. package/mixins/fetch.client.js +42 -48
  383. package/mixins/labeled-form-element.ts +27 -2
  384. package/mixins/page-actions.js +7 -5
  385. package/mixins/resource-fetch-api-pagination.js +304 -0
  386. package/mixins/resource-fetch-namespaced.js +1 -1
  387. package/mixins/resource-fetch.js +46 -5
  388. package/models/__tests__/cluster.test.ts +44 -0
  389. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  390. package/models/__tests__/management.cattle.io.cluster.test.ts +23 -0
  391. package/models/__tests__/management.cattle.io.node.ts +85 -0
  392. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  393. package/models/__tests__/namespace.test.ts +49 -9
  394. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +241 -0
  395. package/models/__tests__/schema.tests.ts +24 -0
  396. package/models/__tests__/secret.test.ts +37 -0
  397. package/models/__tests__/steve-schema.test.ts +73 -0
  398. package/models/__tests__/storage.k8s.io.storageclass.test.ts +22 -0
  399. package/models/__tests__/workload.test.ts +91 -0
  400. package/models/catalog.cattle.io.app.js +8 -0
  401. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  402. package/models/catalog.cattle.io.uiplugin.js +7 -8
  403. package/models/cis.cattle.io.clusterscan.js +29 -8
  404. package/models/cloudcredential.js +9 -1
  405. package/models/cluster/node.js +8 -4
  406. package/models/cluster/schema.js +6 -0
  407. package/models/cluster.js +33 -0
  408. package/models/cluster.x-k8s.io.machine.js +1 -1
  409. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  410. package/models/driver.js +62 -0
  411. package/models/fleet.cattle.io.cluster.js +27 -11
  412. package/models/fleet.cattle.io.gitrepo.js +66 -13
  413. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  414. package/models/kontainerdriver.js +68 -0
  415. package/models/management/schema.js +6 -0
  416. package/models/management.cattle.io.authconfig.js +3 -2
  417. package/models/management.cattle.io.cluster.js +16 -7
  418. package/models/management.cattle.io.globalrole.js +2 -0
  419. package/models/management.cattle.io.kontainerdriver.js +1 -0
  420. package/models/management.cattle.io.node.js +18 -14
  421. package/models/management.cattle.io.nodepool.js +17 -0
  422. package/models/management.cattle.io.project.js +0 -36
  423. package/models/management.cattle.io.setting.js +11 -7
  424. package/models/management.cattle.io.user.js +2 -2
  425. package/models/monitoring.coreos.com.receiver.js +3 -1
  426. package/models/monitoring.coreos.com.route.js +1 -1
  427. package/models/namespace.js +1 -1
  428. package/models/networking.k8s.io.ingress.js +2 -1
  429. package/models/nodedriver.js +68 -0
  430. package/models/pod.js +20 -0
  431. package/models/provisioning.cattle.io.cluster.js +125 -10
  432. package/models/schema.js +28 -7
  433. package/models/secret.js +126 -18
  434. package/models/service.js +2 -0
  435. package/models/steve-schema.ts +254 -0
  436. package/models/storage.k8s.io.storageclass.js +1 -1
  437. package/models/workload.js +17 -0
  438. package/models/workload.service.js +18 -0
  439. package/package.json +17 -14
  440. package/pages/about.vue +12 -6
  441. package/pages/account/create-key.vue +0 -1
  442. package/pages/account/index.vue +7 -3
  443. package/pages/auth/login.vue +106 -103
  444. package/pages/auth/logout.vue +2 -4
  445. package/pages/auth/setup.vue +92 -66
  446. package/pages/auth/verify.vue +30 -24
  447. package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +2 -17
  448. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  449. package/pages/c/_cluster/apps/charts/index.vue +99 -69
  450. package/pages/c/_cluster/apps/charts/install.helpers.js +2 -13
  451. package/pages/c/_cluster/apps/charts/install.vue +9 -9
  452. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  453. package/pages/c/_cluster/auth/config/index.vue +15 -9
  454. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  455. package/pages/c/_cluster/ecm/index.vue +0 -2
  456. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  457. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  458. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  459. package/pages/c/_cluster/explorer/index.vue +253 -91
  460. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  461. package/pages/c/_cluster/explorer/tools/index.vue +10 -6
  462. package/pages/c/_cluster/fleet/index.vue +89 -94
  463. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  464. package/pages/c/_cluster/longhorn/index.vue +52 -17
  465. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  466. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  467. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  468. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +94 -0
  469. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  470. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  471. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +63 -0
  472. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  473. package/pages/c/_cluster/manager/pages/_page.vue +4 -5
  474. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  475. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  476. package/pages/c/_cluster/neuvector/index.vue +1 -0
  477. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  478. package/pages/c/_cluster/settings/banners.vue +86 -10
  479. package/pages/c/_cluster/settings/brand.vue +261 -38
  480. package/pages/c/_cluster/settings/index.vue +4 -6
  481. package/pages/c/_cluster/settings/links.vue +3 -2
  482. package/pages/c/_cluster/settings/performance.vue +71 -3
  483. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  484. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +12 -8
  485. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  486. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  487. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  488. package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
  489. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  490. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  491. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  492. package/pages/c/_cluster/uiplugins/index.vue +38 -54
  493. package/pages/diagnostic.vue +2 -2
  494. package/pages/fail-whale.vue +103 -42
  495. package/pages/home.vue +81 -24
  496. package/pages/prefs.vue +8 -4
  497. package/pages/support/index.vue +14 -10
  498. package/pkg/auto-import.js +1 -1
  499. package/plugins/axios.js +0 -36
  500. package/plugins/back-button.js +3 -5
  501. package/plugins/clean-html-directive.js +5 -30
  502. package/plugins/clean-html.js +53 -0
  503. package/plugins/clean-tooltip-directive.js +6 -31
  504. package/plugins/codemirror-loader.js +1 -1
  505. package/plugins/codemirror.js +41 -9
  506. package/plugins/dashboard-store/__tests__/mutations.test.ts +389 -0
  507. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  508. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  509. package/plugins/dashboard-store/actions.js +132 -25
  510. package/plugins/dashboard-store/classify.js +1 -18
  511. package/plugins/dashboard-store/getters.js +154 -44
  512. package/plugins/dashboard-store/index.js +0 -111
  513. package/plugins/dashboard-store/mutations.js +150 -52
  514. package/plugins/dashboard-store/resource-class.js +77 -127
  515. package/plugins/directives.js +6 -39
  516. package/plugins/ember-cookie.js +13 -0
  517. package/plugins/global-formatters.js +26 -5
  518. package/plugins/i18n.js +89 -55
  519. package/plugins/int-number.js +6 -20
  520. package/plugins/plugin.js +3 -3
  521. package/plugins/positive-int-number.js +6 -17
  522. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +81 -10
  523. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  524. package/plugins/steve/__tests__/resource-utils.test.ts +159 -0
  525. package/plugins/steve/__tests__/steve-class.test.ts +59 -0
  526. package/plugins/steve/__tests__/subscribe.spec.ts +4 -1
  527. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  528. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  529. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  530. package/plugins/steve/actions.js +3 -38
  531. package/plugins/steve/getters.js +164 -61
  532. package/plugins/steve/hybrid-class.js +5 -1
  533. package/plugins/steve/mutations.js +24 -3
  534. package/plugins/steve/norman-class.js +142 -2
  535. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  536. package/plugins/steve/resource-utils.ts +38 -0
  537. package/plugins/steve/schema.d.ts +22 -0
  538. package/plugins/steve/steve-class.js +22 -0
  539. package/plugins/steve/steve-pagination-utils.ts +368 -0
  540. package/plugins/steve/subscribe.js +17 -76
  541. package/plugins/trim-whitespace.js +6 -34
  542. package/plugins/vue-js-modal.js +1 -1
  543. package/public/index.html +1 -0
  544. package/rancher-components/Form/LabeledInput/LabeledInput.vue +13 -8
  545. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  546. package/rancher-components/components/Banner/Banner.test.ts +1 -5
  547. package/rancher-components/components/Banner/Banner.vue +2 -2
  548. package/rancher-components/components/Card/Card.vue +4 -4
  549. package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
  550. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  551. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +57 -24
  552. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
  553. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  554. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  555. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  556. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  557. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  558. package/rancher-components/components/StringList/StringList.test.ts +270 -0
  559. package/rancher-components/components/StringList/StringList.vue +65 -26
  560. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +69 -0
  561. package/scripts/clean +1 -1
  562. package/scripts/extension/bundle +19 -7
  563. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  564. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  565. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  566. package/scripts/extension/helm/package/Dockerfile +1 -1
  567. package/scripts/extension/helm/scripts/package +11 -3
  568. package/scripts/extension/helm/scripts/patch +27 -0
  569. package/scripts/extension/parse-tag-name +4 -4
  570. package/scripts/extension/publish +25 -14
  571. package/scripts/publish-shell.sh +11 -1
  572. package/scripts/serve-pkgs +0 -2
  573. package/scripts/test-plugins-build.sh +87 -11
  574. package/scripts/vue-migrate.js +683 -0
  575. package/server/har-file.js +183 -0
  576. package/store/__tests__/catalog.test.ts +224 -0
  577. package/store/__tests__/type-map.test.ts +1122 -0
  578. package/store/auth.js +23 -4
  579. package/store/aws.js +53 -6
  580. package/store/catalog.js +22 -6
  581. package/store/cru-resource.ts +26 -0
  582. package/store/customisation.js +35 -0
  583. package/store/features.js +7 -4
  584. package/store/i18n.js +11 -0
  585. package/store/index.js +139 -48
  586. package/store/plugins.js +8 -4
  587. package/store/prefs.js +33 -38
  588. package/store/type-map.js +288 -213
  589. package/store/type-map.utils.ts +226 -0
  590. package/tsconfig.json +34 -9
  591. package/tsconfig.paths.json +21 -0
  592. package/types/components/labeledSelect.ts +50 -0
  593. package/types/resources/settings.d.ts +32 -0
  594. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  595. package/types/shell/index.d.ts +1042 -767
  596. package/types/store/dashboard-store.types.ts +42 -0
  597. package/types/store/pagination.types.ts +457 -0
  598. package/types/store/type-map.ts +30 -0
  599. package/types/store/vuex.d.ts +9 -0
  600. package/types/vue-shim.d.ts +51 -0
  601. package/utils/__tests__/cluster.test.ts +20 -18
  602. package/utils/__tests__/create-yaml.test.ts +359 -2
  603. package/utils/__tests__/kontainer.test.ts +92 -0
  604. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  605. package/utils/alertmanagerconfig.js +19 -0
  606. package/utils/array.ts +40 -1
  607. package/utils/async.ts +2 -0
  608. package/utils/auth.js +152 -4
  609. package/utils/axios.js +2 -21
  610. package/utils/azure.js +24 -0
  611. package/utils/banners.js +103 -0
  612. package/utils/clipboard.js +5 -0
  613. package/utils/cluster.js +1 -1
  614. package/utils/config.js +4 -0
  615. package/utils/create-yaml.js +59 -28
  616. package/utils/custom-validators.js +0 -2
  617. package/utils/error.js +41 -1
  618. package/utils/formatter.js +5 -3
  619. package/utils/git.ts +1 -1
  620. package/utils/install-redirect.js +1 -1
  621. package/utils/kontainer.ts +186 -0
  622. package/utils/object.js +24 -0
  623. package/utils/pagination-utils.ts +154 -0
  624. package/utils/pod-security-admission.ts +1 -1
  625. package/utils/router.js +86 -0
  626. package/utils/settings.ts +46 -0
  627. package/utils/time.js +2 -1
  628. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  629. package/utils/url.ts +1 -1
  630. package/utils/validators/formRules/__tests__/index.test.ts +70 -4
  631. package/utils/validators/formRules/index.ts +15 -9
  632. package/utils/validators/index.js +1 -0
  633. package/utils/validators/setting.js +6 -10
  634. package/vue.config.js +377 -401
  635. package/.DS_Store +0 -0
  636. package/assets/images/providers/aks-black.svg +0 -28
  637. package/assets/images/providers/aks.svg +0 -31
  638. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  639. package/components/ChartPsp.vue +0 -76
  640. package/components/EventsTable.vue +0 -67
  641. package/components/TabbedLinks/index.vue +0 -94
  642. package/components/__tests__/ChartPsp.test.ts +0 -75
  643. package/components/formatter/__tests__/ClusterProvider.test.ts +0 -28
  644. package/components/nuxt/nuxt-link.server.js +0 -16
  645. package/components/nuxt/nuxt.js +0 -101
  646. package/config/router.js +0 -408
  647. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -237
  648. package/initialize/App.js +0 -198
  649. package/initialize/client.js +0 -875
  650. package/initialize/index.js +0 -364
  651. package/initialize/layouts.ts +0 -26
  652. package/middleware/i18n.js +0 -10
  653. package/middleware/unauthenticated.js +0 -22
  654. package/mixins/fetch.server.js +0 -73
  655. package/pages/c/_cluster/apps/index.vue +0 -17
  656. package/pages/c/_cluster/auth/index.vue +0 -19
  657. package/pages/c/_cluster/index.vue +0 -17
  658. package/pages/c/_cluster/legacy/index.vue +0 -22
  659. package/pages/c/_cluster/manager/index.vue +0 -22
  660. package/pages/c/_cluster/mcapps/index.vue +0 -21
  661. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  662. package/pages/c/index.vue +0 -9
  663. package/pages/rio/mesh.vue +0 -508
  664. package/plugins/dashboard-store/__tests__/mutations.spec.ts +0 -406
  665. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  666. package/plugins/portal-vue.js +0 -4
  667. package/plugins/portal.js +0 -4
  668. package/plugins/resize.js +0 -5
  669. package/plugins/shortkey.js +0 -4
  670. package/plugins/tooltip.js +0 -4
  671. package/plugins/transitions.js +0 -4
  672. package/plugins/v-select.js +0 -4
  673. package/plugins/vue-clipboard2.js +0 -4
  674. package/rancher-components/components/BadgeState/BadgeState.spec.ts +0 -12
  675. package/tsconfig.default.json +0 -46
  676. package/utils/group.js +0 -70
  677. package/utils/nuxt.js +0 -659
  678. package/utils/router.scrollBehavior.js +0 -80
  679. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  680. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  681. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  682. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  683. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  684. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  685. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  686. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  687. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
  688. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  689. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
@@ -0,0 +1,304 @@
1
+ import { NAMESPACE_FILTER_NAMESPACED_YES, NAMESPACE_FILTER_NAMESPACED_NO, NAMESPACE_FILTER_ALL } from '@shell/utils/namespace-filter';
2
+ import { NAMESPACE } from '@shell/config/types';
3
+ import { ALL_NAMESPACES } from '@shell/store/prefs';
4
+ import { mapGetters } from 'vuex';
5
+ import { ResourceListComponentName } from '../components/ResourceList/resource-list.config';
6
+ import paginationUtils from '@shell/utils/pagination-utils';
7
+ import debounce from 'lodash/debounce';
8
+ import { PaginationParamFilter, PaginationFilterField, PaginationArgs } from '@shell/types/store/pagination.types';
9
+ import stevePaginationUtils from '@shell/plugins/steve/steve-pagination-utils';
10
+
11
+ /**
12
+ * Companion mixin used with `resource-fetch` for `ResourceList` to determine if the user needs to filter the list by a single namespace
13
+ */
14
+ export default {
15
+
16
+ data() {
17
+ return {
18
+ forceUpdateLiveAndDelayed: 0,
19
+ /**
20
+ * This of type `OptPagination`
21
+ */
22
+ pPagination: null,
23
+ // Avoid scenarios where namespace is updated just before other pagination changes come in
24
+ debouncedSetPagination: debounce(this.setPagination, 50),
25
+
26
+ /**
27
+ * Apply these additional filters given the ns / project header selection
28
+ */
29
+ requestFilters: {
30
+ filters: [],
31
+ projectsOrNamespaces: [],
32
+ },
33
+ };
34
+ },
35
+
36
+ methods: {
37
+ /**
38
+ * @param {PaginationArgs} pagination
39
+ */
40
+ setPagination(pagination) {
41
+ if (pagination) {
42
+ this.pPagination = pagination;
43
+ }
44
+ },
45
+
46
+ paginationChanged(event) {
47
+ const searchFilters = event.filter.searchQuery ? event.filter.searchFields.map((field) => new PaginationFilterField({
48
+ field,
49
+ value: event.filter.searchQuery,
50
+ exact: false,
51
+ })) : [];
52
+
53
+ const pagination = new PaginationArgs({
54
+ page: event.page,
55
+ pageSize: event.perPage,
56
+ sort: event.sort?.map((field) => ({
57
+ field,
58
+ asc: !event.descending
59
+ })),
60
+ projectsOrNamespaces: this.requestFilters.projectsOrNamespaces,
61
+ filters: [
62
+ new PaginationParamFilter({ fields: searchFilters }),
63
+ ...this.requestFilters.filters, // Apply the additional filters. these aren't from the user but from ns filtering
64
+ ]
65
+ });
66
+
67
+ this.debouncedSetPagination(pagination);
68
+ },
69
+
70
+ namespaceFilterChanged(neu) {
71
+ if (!this.canPaginate || !this.schema?.attributes?.namespaced) {
72
+ return;
73
+ }
74
+
75
+ const {
76
+ projectsOrNamespaces,
77
+ filters
78
+ } = stevePaginationUtils.createParamsFromNsFilter({
79
+ allNamespaces: this.$store.getters[`${ this.currentProduct?.inStore }/all`](NAMESPACE),
80
+ selection: neu,
81
+ isAllNamespaces: this.isAllNamespaces,
82
+ isLocalCluster: this.$store.getters['currentCluster'].isLocal,
83
+ showDynamicRancherNamespaces: this.showDynamicRancherNamespaces,
84
+ productHidesSystemNamespaces: this.productHidesSystemNamespaces,
85
+ });
86
+
87
+ this.requestFilters.filters = filters;
88
+ this.requestFilters.projectsOrNamespaces = projectsOrNamespaces;
89
+
90
+ // Kick off a change
91
+ if (this.pPagination) {
92
+ this.debouncedSetPagination({ ...this.pPagination });
93
+ }
94
+ },
95
+
96
+ /**
97
+ * @param {PaginationArgs} neu
98
+ * @param {PaginationArgs} old
99
+ */
100
+ paginationEqual(neu, old) {
101
+ if (!neu.page) {
102
+ // Not valid, count as not equal
103
+ return false;
104
+ }
105
+
106
+ if (paginationUtils.paginationEqual(neu, old)) {
107
+ return true;
108
+ }
109
+
110
+ return false;
111
+ }
112
+ },
113
+
114
+ computed: {
115
+ ...mapGetters(['currentProduct', 'isAllNamespaces']),
116
+
117
+ /**
118
+ * Why is this a specific getter and not not in mapGetters?
119
+ *
120
+ * Adding it to mapGetters means the kubewarden unit tests fail as they don't mock it....
121
+ */
122
+ namespaceFilters() {
123
+ return this.$store.getters['namespaceFilters'];
124
+ },
125
+
126
+ /**
127
+ * Does the user need to update the filter to supply valid options?
128
+ */
129
+ paginationNsFilterRequired() {
130
+ return this.canPaginate && !this.__validPaginationNsFilter;
131
+ },
132
+
133
+ /**
134
+ * Check if the Project/Namespace filter from the header contains a valid ns / project filter
135
+ */
136
+ __validPaginationNsFilter() {
137
+ return paginationUtils.validateNsProjectFilters(this.namespaceFilters);
138
+ },
139
+
140
+ /**
141
+ * ResourceList imports resource-fetch --> this mixin
142
+ * When there is no custom list this is fine (ResourceList with mixins --> ResourceTable)
143
+ * When there is a custom list there are two instances of this mixin (ResourceList with mixins --> CustomList with mixins --> ResourceTable)
144
+ * - In this scenario, reduce churn by exiting earlier if mixin is from parent ResourceList and leave work for CustomList mixins
145
+ */
146
+ isResourceList() {
147
+ return !!this.hasListComponent;
148
+ },
149
+
150
+ /**
151
+ * Is Pagination supported and has the table supplied pagination settings from the table?
152
+ */
153
+ pagination() {
154
+ if (this.isResourceList) {
155
+ return;
156
+ }
157
+
158
+ return this.canPaginate ? this.pPagination : '';
159
+ },
160
+
161
+ /**
162
+ * Should this list be paginated via API?
163
+ */
164
+ canPaginate() {
165
+ if (this.isResourceList) {
166
+ return;
167
+ }
168
+
169
+ return this.resource && this.$store.getters[`${ this.currentProduct?.inStore }/paginationEnabled`]?.(this.resource.id || this.resource);
170
+ },
171
+
172
+ paginationResult() {
173
+ if (this.isResourceList || !this.canPaginate) {
174
+ return;
175
+ }
176
+
177
+ return this.havePaginated?.result;
178
+ },
179
+
180
+ havePaginated() {
181
+ if (this.isResourceList) {
182
+ return;
183
+ }
184
+
185
+ return this.$store.getters[`${ this.currentProduct?.inStore }/havePage`](this.resource);
186
+ },
187
+
188
+ /**
189
+ * Links to ns.isSystem and covers things like ns with system annotation, hardcoded list, etc
190
+ */
191
+ productHidesSystemNamespaces() {
192
+ return this.currentProduct?.hideSystemResources;
193
+ },
194
+
195
+ /**
196
+ * Links to ns.isObscure and covers things like `c-`, `user-`, etc (see OBSCURE_NAMESPACE_PREFIX)
197
+ */
198
+ showDynamicRancherNamespaces() {
199
+ return this.$store.getters['prefs/get'](ALL_NAMESPACES);
200
+ }
201
+ },
202
+
203
+ watch: {
204
+ /**
205
+ * Monitor the rows to ensure deleting the last entry in a server-side paginated page doesn't
206
+ * result in an empty page
207
+ */
208
+ rows(neu) {
209
+ if (!this.canPaginate || !this.pagination || this.isResourceList) {
210
+ return;
211
+ }
212
+
213
+ if (this.pagination.page > 1 && neu.length === 0) {
214
+ this.setPagination({
215
+ ...this.pagination,
216
+ page: this.pagination.page - 1
217
+ });
218
+ }
219
+ },
220
+
221
+ namespaceFilters: {
222
+ immediate: true,
223
+ async handler(neu, old) {
224
+ if (!this.canPaginate || !this.schema?.attributes?.namespaced) {
225
+ return;
226
+ }
227
+
228
+ if (this.isResourceList) {
229
+ return;
230
+ }
231
+
232
+ // Transitioning from no ns filters to no ns filters should be avoided
233
+ const neuEmpty = !neu || neu.length === 0 || neu[0] === NAMESPACE_FILTER_ALL;
234
+ const oldEmpty = !old || old.length === 0 || old[0] === NAMESPACE_FILTER_ALL;
235
+
236
+ if (neuEmpty && oldEmpty) {
237
+ const allButHidingSystemResources = this.isAllNamespaces && (!this.showDynamicRancherNamespaces || this.productHidesSystemNamespaces);
238
+
239
+ // If we're showing all... and not hiding system or obscure ns then don't go through filter process
240
+ if (!allButHidingSystemResources) {
241
+ return;
242
+ }
243
+ }
244
+
245
+ // Transitioning to a ns filter that doesn't affect the list should be avoided
246
+ if (neu.length === 1) {
247
+ if ([NAMESPACE_FILTER_NAMESPACED_YES, NAMESPACE_FILTER_NAMESPACED_NO].includes(neu[0])) {
248
+ return;
249
+ }
250
+ }
251
+
252
+ this.namespaceFilterChanged(neu);
253
+ }
254
+ },
255
+
256
+ /**
257
+ * When a pagination is required and the user changes page / sort / filter, kick off a new set of API requests
258
+ *
259
+ * @param {StorePaginationResult} neu
260
+ * @param {StorePaginationResult} old
261
+ */
262
+ async pagination(neu, old) {
263
+ if (!this.canPaginate) {
264
+ return;
265
+ }
266
+
267
+ // ResourceList has two modes
268
+ // 1) ResourceList component handles API request to fetch resources
269
+ // 2) Custom list component handles API request to fetch resources
270
+ //
271
+ // This covers case 2, so ignore case 1
272
+ if (this.isResourceList) {
273
+ return;
274
+ }
275
+
276
+ if (neu && this.$options.name !== ResourceListComponentName && !!this.$fetch && !this.paginationEqual(neu, old)) {
277
+ await this.$fetch(false);
278
+ // Ensure any live/delayed columns get updated
279
+ this.forceUpdateLiveAndDelayed = new Date().getTime();
280
+ }
281
+ },
282
+
283
+ /**
284
+ * If the pagination result has changed fetch secondary resources
285
+ *
286
+ * Lists should implement fetchPageSecondaryResources to fetch them
287
+ *
288
+ * @param {StorePaginationResult} neu
289
+ * @param {StorePaginationResult} old
290
+ */
291
+ async paginationResult(neu, old) {
292
+ if (!this.fetchPageSecondaryResources || !neu ) { // || neu.timestamp === old?.timestamp
293
+ return;
294
+ }
295
+
296
+ if (neu.timestamp === old?.timestamp) {
297
+ // This occurs when the user returns to the page... and pagination hasn't actually changed
298
+ return;
299
+ }
300
+
301
+ await this.fetchPageSecondaryResources();
302
+ }
303
+ },
304
+ };
@@ -1,7 +1,7 @@
1
1
  import { NAMESPACE_FILTER_NS_PREFIX, NAMESPACE_FILTER_P_PREFIX } from '@shell/utils/namespace-filter';
2
2
  import { mapGetters } from 'vuex';
3
3
  import { ResourceListComponentName } from '../components/ResourceList/resource-list.config';
4
- import pAndNFiltering from '@shell/utils/projectAndNamespaceFiltering.utils';
4
+ import pAndNFiltering from '@shell/plugins/steve/projectAndNamespaceFiltering.utils';
5
5
 
6
6
  /**
7
7
  * Companion mixin used with `resource-fetch` for `ResourceList` to determine if the user needs to filter the list by a single namespace
@@ -1,14 +1,19 @@
1
+ import Vue from 'vue';
1
2
  import { mapGetters } from 'vuex';
2
3
  import { COUNT, MANAGEMENT } from '@shell/config/types';
3
4
  import { SETTING, DEFAULT_PERF_SETTING } from '@shell/config/settings';
4
5
  import ResourceFetchNamespaced from '@shell/mixins/resource-fetch-namespaced';
6
+ import ResourceFetchApiPagination from '@shell/mixins/resource-fetch-api-pagination';
5
7
 
6
8
  // Number of pages to fetch when loading incrementally
7
9
  const PAGES = 4;
8
10
 
9
11
  export default {
10
12
 
11
- mixins: [ResourceFetchNamespaced],
13
+ mixins: [
14
+ ResourceFetchNamespaced,
15
+ ResourceFetchApiPagination
16
+ ],
12
17
 
13
18
  data() {
14
19
  // fetching the settings related to manual refresh from global settings
@@ -38,8 +43,10 @@ export default {
38
43
  // incremental loading vars
39
44
  incremental: false,
40
45
  fetchedResourceType: [],
46
+ paginating: null,
41
47
  };
42
48
  },
49
+
43
50
  beforeDestroy() {
44
51
  // make sure this only runs once, for the initialized instance
45
52
  if (this.init) {
@@ -64,17 +71,26 @@ export default {
64
71
  }
65
72
  },
66
73
  loading() {
74
+ if (this.canPaginate) {
75
+ return this.paginating;
76
+ }
77
+
67
78
  return this.rows.length ? false : this.$fetchState.pending;
68
79
  },
69
80
  },
81
+
70
82
  watch: {
71
- refreshFlag(neu) {
83
+ async refreshFlag(neu) {
72
84
  // this is where the data assignment will trigger the update of the list view...
73
85
  if (this.init && neu) {
74
- this.$fetch();
86
+ await this.$fetch();
87
+ if (this.canPaginate && this.fetchPageSecondaryResources) {
88
+ this.fetchPageSecondaryResources(true);
89
+ }
75
90
  }
76
91
  }
77
92
  },
93
+
78
94
  methods: {
79
95
  // this defines all the flags needed for the mechanism
80
96
  // to work. They should be defined based on the main list view
@@ -109,6 +125,31 @@ export default {
109
125
  });
110
126
  }
111
127
 
128
+ const schema = this.$store.getters[`${ currStore }/schemaFor`](type);
129
+
130
+ if (this.canPaginate) {
131
+ if (!this.pagination) {
132
+ // This is the initial fetchType made when resource lists are created...
133
+ // when pagination is enabled we want to wait for the correct set of initial pagination settings to make the call
134
+ return;
135
+ }
136
+ const opt = {
137
+ hasManualRefresh: this.hasManualRefresh,
138
+ pagination: { ...this.pagination },
139
+ force: this.paginating !== null // Fix for manual refresh (before ripped out).
140
+ };
141
+
142
+ Vue.set(this, 'paginating', true);
143
+
144
+ const that = this;
145
+
146
+ return this.$store.dispatch(`${ currStore }/findPage`, {
147
+ type,
148
+ opt
149
+ })
150
+ .finally(() => Vue.set(that, 'paginating', false));
151
+ }
152
+
112
153
  let incremental = 0;
113
154
 
114
155
  if (this.incremental) {
@@ -124,8 +165,6 @@ export default {
124
165
  hasManualRefresh: this.hasManualRefresh
125
166
  };
126
167
 
127
- const schema = this.$store.getters[`${ currStore }/schemaFor`](type);
128
-
129
168
  if (schema?.attributes?.namespaced) { // Is this specific resource namespaced (could be primary or secondary resource)?
130
169
  opt.namespaced = this.namespaceFilter; // namespaceFilter will only be populated if applicable for primary resource
131
170
  }
@@ -181,6 +220,8 @@ export default {
181
220
  if (manualDataRefreshEnabled && resourceCount >= manualDataRefreshThreshold) {
182
221
  watch = false;
183
222
  isTooManyItemsToAutoUpdate = true;
223
+ } else if (this.canPaginate) {
224
+ isTooManyItemsToAutoUpdate = true;
184
225
  }
185
226
 
186
227
  // incremental loading check
@@ -0,0 +1,44 @@
1
+ import NormanCluster from '@shell/models/cluster';
2
+
3
+ describe('class NormanCluster', () => {
4
+ const t = jest.fn(() => 'abc');
5
+ const ctx = { rootGetters: { 'i18n/t': t }, dispatch: jest.fn() };
6
+
7
+ it('should return empty arrays of system labels and system annotations if cluster labels and annotations are undefined', () => {
8
+ const cluster = new NormanCluster({}, ctx);
9
+
10
+ expect(cluster.systemLabels).toStrictEqual([]);
11
+ expect(cluster.systemAnnotations).toStrictEqual([]);
12
+ });
13
+
14
+ it('should list all the cluster\'s annotation keys that contain coreos.com, cattle.io, k3s.io, kubernetes.io, or k3s.io', () => {
15
+ const testAnnotations = ['cattle.io/test', 'coreos.com', 'test.cattle.io/something', 'kubernetes.io/test'];
16
+ const cluster = new NormanCluster({
17
+ annotations: {
18
+ 'cattle.io/test': 'abc',
19
+ 'coreos.com': 'abc',
20
+ 'k3s.io/test': 'abc',
21
+ 'test.cattle.io/something': 'abc',
22
+ 'kubernetes.io/test': 'abc',
23
+ 'other-label': 'abc'
24
+ }
25
+ }, ctx);
26
+
27
+ expect(testAnnotations.find((annotation) => !cluster.systemAnnotations.includes(annotation))).toBeUndefined();
28
+ });
29
+
30
+ it('should list all the cluster\'s label keys that contain io.cattle.lifecycle, kubernetes.io, cattle.io, or k3s.io', () => {
31
+ const testLabels = ['cattle.io/test', 'test.io.cattle.lifecycle', 'test.kubernetes.io/test', 'k3s.io/test'];
32
+ const cluster = new NormanCluster({
33
+ labels: {
34
+ 'cattle.io/test': 'abc',
35
+ 'test.io.cattle.lifecycle': 'abc',
36
+ 'k3s.io/test': 'abc',
37
+ 'test.kubernetes.io/test': 'abc',
38
+ 'other-label': 'abc'
39
+ }
40
+ }, ctx);
41
+
42
+ expect(testLabels.find((label) => !cluster.systemLabels.includes(label))).toBeUndefined();
43
+ });
44
+ });
@@ -0,0 +1,36 @@
1
+ import FleetCluster from '@shell/models/fleet.cattle.io.cluster';
2
+
3
+ describe('class FleetCluster', () => {
4
+ it('should provide bundleInfo if correct data is present', () => {
5
+ const fleetCluster = new FleetCluster({
6
+ metadata: {},
7
+ spec: {},
8
+ status: { display: { readyBundles: '0/1' } },
9
+ });
10
+
11
+ expect(fleetCluster.bundleInfo.ready).toBe(0);
12
+ expect(fleetCluster.bundleInfo.total).toBe(1);
13
+ expect(Object.getOwnPropertyNames(fleetCluster.bundleInfo)).not.toContain('noValidData');
14
+ });
15
+ describe('should provide bundleInfo with error', () => {
16
+ it.each([
17
+ [''],
18
+ ['/'],
19
+ ['1/'],
20
+ ['/1'],
21
+ ['1/1/2'],
22
+ ['a/1'],
23
+ ['a/b'],
24
+ ['any-string'],
25
+ ['any-string1/string2']
26
+ ])('with multiple scenarios of wrongful "readyBundles" data', (readyBundles) => {
27
+ const fleetCluster = new FleetCluster({
28
+ metadata: {},
29
+ spec: {},
30
+ status: { display: { readyBundles } },
31
+ });
32
+
33
+ expect(Object.getOwnPropertyNames(fleetCluster.bundleInfo)).toContain('noValidData');
34
+ });
35
+ });
36
+ });
@@ -0,0 +1,23 @@
1
+ import MgmtCluster from '@shell/models/management.cattle.io.cluster';
2
+
3
+ jest.mock('@shell/utils/clipboard', () => {
4
+ return { copyTextToClipboard: jest.fn(() => Promise.resolve({})) };
5
+ });
6
+
7
+ describe('class MgmtCluster', () => {
8
+ describe('provisioner', () => {
9
+ const testCases = [
10
+ [{ provider: 'rke', driver: 'imported' }, 'rke'],
11
+ [{ provider: 'k3s', driver: 'K3S' }, 'k3s'],
12
+ [{ provider: 'aks', driver: 'AKS' }, 'aks'],
13
+ [{}, 'imported'],
14
+ ];
15
+
16
+ it.each(testCases)('should return provisioner value properly based on the props data', (clusterData: Object, expected: String) => {
17
+ const cluster = new MgmtCluster({ status: clusterData });
18
+
19
+ expect(cluster.provisioner).toBe(expected);
20
+ }
21
+ );
22
+ });
23
+ });
@@ -93,4 +93,89 @@ describe('class MgmtNode', () => {
93
93
  resetMocks();
94
94
  });
95
95
  });
96
+
97
+ describe('canScaleDown', () => {
98
+ const mgmtClusterId = 'test';
99
+ const nodeId = 'test/id';
100
+ const specs = {
101
+ worker: {
102
+ worker: true, etcd: false, controlPlane: false
103
+ },
104
+ etcd: {
105
+ worker: false, etcd: true, controlPlane: false
106
+ },
107
+ controlPlane: {
108
+ worker: false, etcd: false, controlPlane: true
109
+ },
110
+ etcdAndControlPlane: {
111
+ worker: false, etcd: true, controlPlane: true
112
+ },
113
+ all: {
114
+ worker: true, etcd: true, controlPlane: true
115
+ }
116
+ };
117
+
118
+ const workerNode = {
119
+ id: '01',
120
+ isWorker: true,
121
+ isControlPlane: false,
122
+ isEtcd: false
123
+ };
124
+ const etcdNode = {
125
+ id: '02',
126
+ isWorker: false,
127
+ isControlPlane: false,
128
+ isEtcd: true
129
+ };
130
+ const controlPlaneNode = {
131
+ id: '03',
132
+ isWorker: false,
133
+ isControlPlane: true,
134
+ isEtcd: false
135
+ };
136
+ const etcdAndControlPlaneNode = {
137
+ id: '03',
138
+ isWorker: false,
139
+ isControlPlane: true,
140
+ isEtcd: true
141
+ };
142
+ const allNode = {
143
+ id: '04',
144
+ isWorker: true,
145
+ isControlPlane: true,
146
+ isEtcd: true
147
+ };
148
+
149
+ const baseCtx = {
150
+ rootGetters: {
151
+ 'rancher/byId': () => ({ actions: { scaledown: 'scaledown' } }),
152
+ 'i18n/t': t
153
+ }
154
+ };
155
+
156
+ it.each([
157
+ [{ spec: specs.worker, nodes: [workerNode] }, true],
158
+ [{ spec: specs.etcd, nodes: [etcdNode, etcdNode, controlPlaneNode] }, true],
159
+ [{ spec: specs.etcdAndControlPlane, nodes: [etcdAndControlPlaneNode, etcdAndControlPlaneNode] }, true],
160
+ [{ spec: specs.etcdAndControlPlane, nodes: [etcdAndControlPlaneNode] }, false],
161
+ [{ spec: specs.all, nodes: [allNode] }, false],
162
+ [{ spec: specs.all, nodes: [allNode, allNode] }, true],
163
+ ])('should return canScaleDown properly', (data, expected) => {
164
+ const { spec, nodes } = data;
165
+ const mgmtNode = new MgmtNode({
166
+ spec,
167
+ id: nodeId
168
+ }, {
169
+ ...baseCtx,
170
+ getters: {
171
+ all: () => [{
172
+ mgmtClusterId,
173
+ nodes
174
+ }]
175
+ }
176
+ });
177
+
178
+ expect(mgmtNode.canScaleDown).toStrictEqual(expected);
179
+ });
180
+ });
96
181
  });
@@ -0,0 +1,83 @@
1
+ import MgmtNodePool from '@shell/models/management.cattle.io.nodepool';
2
+
3
+ describe('class MgmtNodePool', () => {
4
+ describe('canScaleDownPool', () => {
5
+ const mgmtClusterId = 'test';
6
+ const nodeId = 'test/id';
7
+ const specs = {
8
+ worker: {
9
+ worker: true, etcd: false, controlPlane: false
10
+ },
11
+ etcd: {
12
+ worker: false, etcd: true, controlPlane: false
13
+ },
14
+ controlPlane: {
15
+ worker: false, etcd: false, controlPlane: true
16
+ },
17
+ etcdAndControlPlane: {
18
+ worker: false, etcd: true, controlPlane: true
19
+ },
20
+ all: {
21
+ worker: true, etcd: true, controlPlane: true
22
+ }
23
+ };
24
+
25
+ const workerNode = {
26
+ id: '01',
27
+ isWorker: true,
28
+ isControlPlane: false,
29
+ isEtcd: false
30
+ };
31
+ const etcdNode = {
32
+ id: '02',
33
+ isWorker: false,
34
+ isControlPlane: false,
35
+ isEtcd: true
36
+ };
37
+ const controlPlaneNode = {
38
+ id: '03',
39
+ isWorker: false,
40
+ isControlPlane: true,
41
+ isEtcd: false
42
+ };
43
+ const etcdAndControlPlaneNode = {
44
+ id: '03',
45
+ isWorker: false,
46
+ isControlPlane: true,
47
+ isEtcd: true
48
+ };
49
+ const allNode = {
50
+ id: '04',
51
+ isWorker: true,
52
+ isControlPlane: true,
53
+ isEtcd: true
54
+ };
55
+
56
+ const baseCtx = { rootGetters: { 'rancher/byId': () => ({ actions: { scaledown: 'scaledown' } }) } };
57
+
58
+ it.each([
59
+ [{ spec: specs.worker, nodes: [workerNode] }, true],
60
+ [{ spec: specs.etcd, nodes: [etcdNode, etcdNode, controlPlaneNode] }, true],
61
+ [{ spec: specs.etcdAndControlPlane, nodes: [etcdAndControlPlaneNode, etcdAndControlPlaneNode] }, true],
62
+ [{ spec: specs.etcdAndControlPlane, nodes: [etcdAndControlPlaneNode] }, false],
63
+ [{ spec: specs.all, nodes: [allNode] }, false],
64
+ [{ spec: specs.all, nodes: [allNode, allNode] }, true],
65
+ ])('should return canScaleDownPool properly', (data, expected) => {
66
+ const { spec, nodes } = data;
67
+ const mgmtNode = new MgmtNodePool({
68
+ spec,
69
+ id: nodeId
70
+ }, {
71
+ ...baseCtx,
72
+ getters: {
73
+ all: () => [{
74
+ mgmtClusterId,
75
+ nodes
76
+ }]
77
+ }
78
+ });
79
+
80
+ expect(mgmtNode.canScaleDownPool()).toStrictEqual(expected);
81
+ });
82
+ });
83
+ });