@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
@@ -29,30 +29,17 @@ import { getParent } from '@shell/utils/dom';
29
29
  // NOTE: This is populated by a plugin (formatters.js) to avoid issues with plugins
30
30
  export const FORMATTERS = {};
31
31
 
32
- export const COLUMN_BREAKPOINTS = {
33
- /**
34
- * Only show column if at tablet width or wider
35
- */
36
- TABLET: 'tablet',
37
- /**
38
- * Only show column if at laptop width or wider
39
- */
40
- LAPTOP: 'laptop',
41
- /**
42
- * Only show column if at desktop width or wider
43
- */
44
- DESKTOP: 'desktop'
45
- };
46
-
47
32
  // @TODO:
48
33
  // Fixed header/scrolling
49
34
 
50
35
  // Data Flow:
51
36
  // rows prop
52
- // -> arrangedRows (sorting.js)
53
- // -> filteredRows (filtering.js)
54
- // -> pagedRows (paging.js)
55
- // -> groupedRows (grouping.js)
37
+ // --> sorting.js arrangedRows
38
+ // --> filtering.js handleFiltering()
39
+ // --> filtering.js filteredRows
40
+ // --> paging.js pageRows
41
+ // --> grouping.js groupedRows
42
+ // --> index.vue displayedRows
56
43
 
57
44
  export default {
58
45
  name: 'SortableTable',
@@ -100,6 +87,16 @@ export default {
100
87
  required: false
101
88
  },
102
89
 
90
+ /**
91
+ * Alt Loading - True: Always show table rows and obscure them when `loading`. Intended for use with server-side pagination.
92
+ *
93
+ * Alt Loading - False: Hide the table rows when `loading`. Intended when all resources are provided up front.
94
+ */
95
+ altLoading: {
96
+ type: Boolean,
97
+ required: false
98
+ },
99
+
103
100
  groupBy: {
104
101
  // Field to group rows by, row[groupBy] must be something that can be a map key
105
102
  type: String,
@@ -164,6 +161,11 @@ export default {
164
161
  default: false,
165
162
  },
166
163
 
164
+ subRowsDescription: {
165
+ type: Boolean,
166
+ default: true,
167
+ },
168
+
167
169
  subExpandable: {
168
170
  type: Boolean,
169
171
  default: false,
@@ -266,7 +268,7 @@ export default {
266
268
  */
267
269
  noDataKey: {
268
270
  type: String,
269
- default: 'sortableTable.noData'
271
+ default: 'sortableTable.noData' // i18n-uses sortableTable.noData
270
272
  },
271
273
 
272
274
  /**
@@ -282,6 +284,14 @@ export default {
282
284
  default: null,
283
285
  },
284
286
 
287
+ /**
288
+ * The list will always be sorted by these regardless of what the user has selected
289
+ */
290
+ mandatorySort: {
291
+ type: Array,
292
+ default: null,
293
+ },
294
+
285
295
  /**
286
296
  * Allows you to link to a custom detail page for data that
287
297
  * doesn't have a class model. For example, a receiver configuration
@@ -313,6 +323,22 @@ export default {
313
323
  forceUpdateLiveAndDelayed: {
314
324
  type: Number,
315
325
  default: 0
326
+ },
327
+
328
+ /**
329
+ * True if pagination is executed outside of the component
330
+ */
331
+ externalPaginationEnabled: {
332
+ type: Boolean,
333
+ default: false
334
+ },
335
+
336
+ /**
337
+ * If `externalPaginationEnabled` is true this will be used as the current page
338
+ */
339
+ externalPaginationResult: {
340
+ type: Object,
341
+ default: null
316
342
  }
317
343
  },
318
344
 
@@ -327,12 +353,18 @@ export default {
327
353
  }
328
354
 
329
355
  return {
330
- currentPhase: ASYNC_BUTTON_STATES.WAITING,
331
- expanded: {},
356
+ refreshButtonPhase: ASYNC_BUTTON_STATES.WAITING,
357
+ expanded: {},
332
358
  searchQuery,
333
359
  eventualSearchQuery,
334
- actionOfInterest: null,
335
- loadingDelay: false,
360
+ subMatches: null,
361
+ actionOfInterest: null,
362
+ loadingDelay: false,
363
+ debouncedPaginationChanged: null,
364
+ /**
365
+ * The is the bool the DOM uses to show loading state. it's proxied from `loading` to avoid blipping the indicator (see usages)
366
+ */
367
+ isLoading: false,
336
368
  };
337
369
  },
338
370
 
@@ -346,12 +378,14 @@ export default {
346
378
 
347
379
  this._onScroll = this.onScroll.bind(this);
348
380
  $main?.addEventListener('scroll', this._onScroll);
381
+
382
+ this.debouncedPaginationChanged();
349
383
  },
350
384
 
351
385
  beforeDestroy() {
352
- clearTimeout(this.loadingDelayTimer);
353
386
  clearTimeout(this._scrollTimer);
354
387
  clearTimeout(this._loadingDelayTimer);
388
+ clearTimeout(this._altLoadingDelayTimer);
355
389
  clearTimeout(this._liveColumnsTimer);
356
390
  clearTimeout(this._delayedColumnsTimer);
357
391
  clearTimeout(this.manualRefreshTimer);
@@ -383,21 +417,27 @@ export default {
383
417
  descending(neu, old) {
384
418
  this.watcherUpdateLiveAndDelayed(neu, old);
385
419
  },
420
+
386
421
  searchQuery(neu, old) {
387
422
  this.watcherUpdateLiveAndDelayed(neu, old);
388
423
  },
424
+
389
425
  sortFields(neu, old) {
390
426
  this.watcherUpdateLiveAndDelayed(neu, old);
391
427
  },
428
+
392
429
  groupBy(neu, old) {
393
430
  this.watcherUpdateLiveAndDelayed(neu, old);
394
431
  },
432
+
395
433
  namespaces(neu, old) {
396
434
  this.watcherUpdateLiveAndDelayed(neu, old);
397
435
  },
436
+
398
437
  page(neu, old) {
399
438
  this.watcherUpdateLiveAndDelayed(neu, old);
400
439
  },
440
+
401
441
  forceUpdateLiveAndDelayed(neu, old) {
402
442
  this.watcherUpdateLiveAndDelayed(neu, old);
403
443
  },
@@ -418,17 +458,40 @@ export default {
418
458
  manualRefreshLoadingFinished: {
419
459
  handler(neu, old) {
420
460
  // this is merely to update the manual refresh button status
421
- this.currentPhase = !neu ? ASYNC_BUTTON_STATES.WAITING : ASYNC_BUTTON_STATES.ACTION;
461
+ this.refreshButtonPhase = !neu ? ASYNC_BUTTON_STATES.WAITING : ASYNC_BUTTON_STATES.ACTION;
422
462
  if (neu && neu !== old) {
423
463
  this.$nextTick(() => this.updateLiveAndDelayed());
424
464
  }
425
465
  },
426
466
  immediate: true
427
- }
467
+ },
468
+
469
+ loading: {
470
+ handler(neu, old) {
471
+ // Always ensure the Refresh button phase aligns with loading state (to ensure external phase changes which can then reset the internal phase changed by click)
472
+ this.refreshButtonPhase = neu ? ASYNC_BUTTON_STATES.WAITING : ASYNC_BUTTON_STATES.ACTION;
473
+
474
+ if (this.altLoading) {
475
+ // Delay setting the actual loading indicator. This should avoid flashing up the indicator if the API responds quickly
476
+ if (neu) {
477
+ this._altLoadingDelayTimer = setTimeout(() => {
478
+ this.isLoading = true;
479
+ }, 200); // this should be higher than the targetted quick response
480
+ } else {
481
+ clearTimeout(this._altLoadingDelayTimer);
482
+ this.isLoading = false;
483
+ }
484
+ } else {
485
+ this.isLoading = neu;
486
+ }
487
+ },
488
+ immediate: true
489
+ },
428
490
  },
429
491
 
430
492
  created() {
431
493
  this.debouncedRefreshTableData = debounce(this.refreshTableData, 500);
494
+ this.debouncedPaginationChanged = debounce(this.paginationChanged, 50);
432
495
  },
433
496
 
434
497
  computed: {
@@ -439,11 +502,16 @@ export default {
439
502
  },
440
503
 
441
504
  initalLoad() {
442
- return !!(!this.loading && !this._didinit && this.rows?.length);
505
+ return !!(!this.isLoading && !this._didinit && this.rows?.length);
443
506
  },
444
507
 
445
508
  manualRefreshLoadingFinished() {
446
- return !!(!this.loading && this._didinit && this.rows?.length && !this.isManualRefreshLoading);
509
+ const res = !!(!this.isLoading && this._didinit && this.rows?.length && !this.isManualRefreshLoading);
510
+
511
+ // Always ensure the Refresh button phase aligns with loading state (regardless of if manualRefreshLoadingFinished has changed or not)
512
+ this.refreshButtonPhase = !res || this.loading ? ASYNC_BUTTON_STATES.WAITING : ASYNC_BUTTON_STATES.ACTION;
513
+
514
+ return res;
447
515
  },
448
516
 
449
517
  fullColspan() {
@@ -543,6 +611,7 @@ export default {
543
611
  'body-dividers': this.bodyDividers,
544
612
  'overflow-y': this.overflowY,
545
613
  'overflow-x': this.overflowX,
614
+ 'alt-loading': this.altLoading && this.isLoading
546
615
  };
547
616
  },
548
617
 
@@ -771,6 +840,12 @@ export default {
771
840
  // console.warn(`Performance: Table valueFor: ${ col.name } ${ col.value }`); // eslint-disable-line no-console
772
841
 
773
842
  const expr = col.value || col.name;
843
+
844
+ if (!expr) {
845
+ console.error('No path has been defined for this column, unable to get value of cell', col); // eslint-disable-line no-console
846
+
847
+ return '';
848
+ }
774
849
  const out = get(row, expr);
775
850
 
776
851
  if ( out === null || out === undefined ) {
@@ -879,7 +954,7 @@ export default {
879
954
 
880
955
  showSubRow(row, keyField) {
881
956
  const hasInjectedSubRows = this.subRows && (!this.subExpandable || this.expanded[get(row, keyField)]);
882
- const hasStateDescription = row.stateDescription;
957
+ const hasStateDescription = this.subRowsDescription && row.stateDescription;
883
958
 
884
959
  return hasInjectedSubRows || hasStateDescription;
885
960
  },
@@ -898,6 +973,23 @@ export default {
898
973
  event,
899
974
  targetElement: this.$refs[`actionButton${ i }`][0],
900
975
  });
976
+ },
977
+
978
+ paginationChanged() {
979
+ if (!this.externalPaginationEnabled) {
980
+ return;
981
+ }
982
+
983
+ this.$emit('pagination-changed', {
984
+ page: this.page,
985
+ perPage: this.perPage,
986
+ filter: {
987
+ searchFields: this.searchFields,
988
+ searchQuery: this.searchQuery
989
+ },
990
+ sort: this.sortFields,
991
+ descending: this.descending
992
+ });
901
993
  }
902
994
  }
903
995
  };
@@ -1026,10 +1118,9 @@ export default {
1026
1118
  <slot name="header-right" />
1027
1119
  <AsyncButton
1028
1120
  v-if="isTooManyItemsToAutoUpdate"
1029
- v-clean-tooltip="t('performance.manualRefresh.buttonTooltip')"
1030
1121
  class="manual-refresh"
1031
- mode="refresh"
1032
- :current-phase="currentPhase"
1122
+ mode="manual-refresh"
1123
+ :current-phase="refreshButtonPhase"
1033
1124
  @click="debouncedRefreshTableData"
1034
1125
  />
1035
1126
  <div
@@ -1122,7 +1213,7 @@ export default {
1122
1213
  :default-sort-by="_defaultSortBy"
1123
1214
  :descending="descending"
1124
1215
  :no-rows="noRows"
1125
- :loading="loading && !loadingDelay"
1216
+ :loading="isLoading && !loadingDelay"
1126
1217
  :no-results="noResults"
1127
1218
  @on-toggle-all="onToggleAll"
1128
1219
  @on-sort-change="changeSort"
@@ -1132,9 +1223,9 @@ export default {
1132
1223
  />
1133
1224
 
1134
1225
  <!-- Don't display anything if we're loading and the delay has yet to pass -->
1135
- <div v-if="loading && !loadingDelay" />
1226
+ <div v-if="isLoading && !loadingDelay" />
1136
1227
 
1137
- <tbody v-else-if="loading">
1228
+ <tbody v-else-if="isLoading && !altLoading">
1138
1229
  <slot name="loading">
1139
1230
  <tr>
1140
1231
  <td :colspan="fullColspan">
@@ -1379,7 +1470,8 @@ export default {
1379
1470
  <button
1380
1471
  type="button"
1381
1472
  class="btn btn-sm role-multi-action"
1382
- :disabled="page == 1"
1473
+ data-testid="pagination-first"
1474
+ :disabled="page == 1 || loading"
1383
1475
  @click="goToPage('first')"
1384
1476
  >
1385
1477
  <i class="icon icon-chevron-beginning" />
@@ -1387,7 +1479,8 @@ export default {
1387
1479
  <button
1388
1480
  type="button"
1389
1481
  class="btn btn-sm role-multi-action"
1390
- :disabled="page == 1"
1482
+ data-testid="pagination-prev"
1483
+ :disabled="page == 1 || loading"
1391
1484
  @click="goToPage('prev')"
1392
1485
  >
1393
1486
  <i class="icon icon-chevron-left" />
@@ -1398,7 +1491,8 @@ export default {
1398
1491
  <button
1399
1492
  type="button"
1400
1493
  class="btn btn-sm role-multi-action"
1401
- :disabled="page == totalPages"
1494
+ data-testid="pagination-next"
1495
+ :disabled="page == totalPages || loading"
1402
1496
  @click="goToPage('next')"
1403
1497
  >
1404
1498
  <i class="icon icon-chevron-right" />
@@ -1406,7 +1500,8 @@ export default {
1406
1500
  <button
1407
1501
  type="button"
1408
1502
  class="btn btn-sm role-multi-action"
1409
- :disabled="page == totalPages"
1503
+ data-testid="pagination-last"
1504
+ :disabled="page == totalPages || loading"
1410
1505
  @click="goToPage('last')"
1411
1506
  >
1412
1507
  <i class="icon icon-chevron-end" />
@@ -1444,7 +1539,11 @@ export default {
1444
1539
  </div>
1445
1540
  </template>
1446
1541
 
1447
- <style lang="scss" scoped>
1542
+ <style lang="scss" scoped>
1543
+ .sortable-table.alt-loading {
1544
+ opacity: 0.5;
1545
+ pointer-events: none;
1546
+ }
1448
1547
 
1449
1548
  .manual-refresh {
1450
1549
  height: 40px;
@@ -1608,9 +1707,9 @@ export default {
1608
1707
  margin-left: 10px;
1609
1708
  min-width: 180px;
1610
1709
  }
1611
- </style>
1710
+ </style>
1612
1711
 
1613
- <style lang="scss">
1712
+ <style lang="scss">
1614
1713
  //
1615
1714
  // Important: Almost all selectors in here need to be ">"-ed together so they
1616
1715
  // apply only to the current table, not one nested inside another table.
@@ -1942,4 +2041,4 @@ export default {
1942
2041
  min-width: 200px;
1943
2042
  }
1944
2043
  }
1945
- </style>
2044
+ </style>
@@ -2,27 +2,45 @@ import { ROWS_PER_PAGE } from '@shell/store/prefs';
2
2
 
3
3
  export default {
4
4
  computed: {
5
+ totalRows() {
6
+ if (this.externalPaginationEnabled) {
7
+ return this.externalPaginationResult?.count || 0;
8
+ }
9
+
10
+ return this.filteredRows.length;
11
+ },
12
+
5
13
  indexFrom() {
6
14
  return Math.max(0, 1 + this.perPage * (this.page - 1));
7
15
  },
8
16
 
9
17
  indexTo() {
10
- return Math.min(this.filteredRows.length, this.indexFrom + this.perPage - 1);
18
+ return Math.min(this.totalRows, this.indexFrom + this.perPage - 1);
11
19
  },
12
20
 
13
21
  totalPages() {
14
- return Math.ceil(this.filteredRows.length / this.perPage );
22
+ return Math.ceil(this.totalRows / this.perPage );
15
23
  },
16
24
 
17
25
  showPaging() {
18
- return !this.loading && this.paging && this.totalPages > 1;
26
+ if (!this.paging) {
27
+ return false;
28
+ }
29
+
30
+ const havePages = this.totalPages > 1;
31
+
32
+ if (this.altLoading) {
33
+ return havePages;
34
+ }
35
+
36
+ return !this.loading && havePages;
19
37
  },
20
38
 
21
39
  pagingDisplay() {
22
40
  const opt = {
23
41
  ...(this.pagingParams || {}),
24
42
 
25
- count: this.filteredRows.length,
43
+ count: this.totalRows,
26
44
  pages: this.totalPages,
27
45
  from: this.indexFrom,
28
46
  to: this.indexTo,
@@ -32,7 +50,9 @@ export default {
32
50
  },
33
51
 
34
52
  pagedRows() {
35
- if ( this.paging ) {
53
+ if (this.externalPaginationEnabled) {
54
+ return this.rows;
55
+ } else if ( this.paging ) {
36
56
  return this.filteredRows.slice(this.indexFrom - 1, this.indexTo);
37
57
  } else {
38
58
  return this.filteredRows;
@@ -51,12 +71,21 @@ export default {
51
71
  // Go to the last page if we end up "past" the last page because the table changed
52
72
 
53
73
  const from = this.indexFrom;
54
- const last = this.filteredRows.length;
74
+ const last = this.totalRows;
55
75
 
56
76
  if ( this.totalPages > 0 && this.page > 1 && from > last ) {
57
77
  this.setPage(this.totalPages);
58
78
  }
59
- }
79
+ },
80
+
81
+ page() {
82
+ this.debouncedPaginationChanged();
83
+ },
84
+
85
+ perPage() {
86
+ this.debouncedPaginationChanged();
87
+ },
88
+
60
89
  },
61
90
 
62
91
  methods: {
@@ -46,9 +46,10 @@ export default {
46
46
  // NOTE: The logic here could be simplified and made more performant
47
47
  bulkActionsForSelection() {
48
48
  let disableAll = false;
49
+
49
50
  // pagedRows is all rows in the current page
50
51
  const all = this.pagedRows;
51
- const allRows = this.arrangedRows;
52
+ const allRows = this.arrangedRows || all;
52
53
  let selected = this.selectedRows;
53
54
 
54
55
  // Nothing is selected
@@ -1,5 +1,12 @@
1
1
  import { sortBy } from '@shell/utils/sort';
2
- import { addObject } from '@shell/utils/array';
2
+ import { uniq } from '@shell/utils/array';
3
+
4
+ /**
5
+ * Always sort by something, this is the best guess on properties
6
+ *
7
+ * Can be overriden
8
+ */
9
+ const DEFAULT_MANDATORY_SORT = ['nameSort', 'id'];
3
10
 
4
11
  export default {
5
12
  computed: {
@@ -21,15 +28,15 @@ export default {
21
28
  fromColumn = [fromColumn];
22
29
  }
23
30
 
24
- const out = [...fromGroup, ...fromColumn];
25
-
26
- addObject(out, 'nameSort');
27
- addObject(out, 'id');
28
-
29
- return out;
31
+ // return the sorting based on grouping, user selection and fallback
32
+ return uniq([...fromGroup, ...fromColumn].concat(...(this.mandatorySort || DEFAULT_MANDATORY_SORT)));
30
33
  },
31
34
 
32
35
  arrangedRows() {
36
+ if (this.externalPaginationEnabled) {
37
+ return;
38
+ }
39
+
33
40
  let key;
34
41
 
35
42
  if ( this.sortGenerationFn ) {
@@ -101,4 +108,14 @@ export default {
101
108
  this.setPage(1);
102
109
  },
103
110
  },
111
+
112
+ watch: {
113
+ sortFields() {
114
+ this.debouncedPaginationChanged();
115
+ },
116
+
117
+ descending() {
118
+ this.debouncedPaginationChanged();
119
+ }
120
+ }
104
121
  };
@@ -3,6 +3,8 @@ import {
3
3
  LAST_UPDATED, TYPE, REASON, MESSAGE, STATUS
4
4
  } from '@shell/config/table-headers';
5
5
  import SortableTable from '@shell/components/SortableTable';
6
+ import { copyTextToClipboard } from '@shell/utils/clipboard';
7
+ import { exceptionToErrorsArray } from '@shell/utils/error';
6
8
  export default {
7
9
  components: { SortableTable },
8
10
  props: {
@@ -31,12 +33,14 @@ export default {
31
33
  $event.stopPropagation();
32
34
  $event.preventDefault();
33
35
 
34
- this.$copyText(this.$slots.default[0].text).then(() => {
36
+ copyTextToClipboard(this.$slots.default[0].text).then(() => {
35
37
  this.copied = true;
36
38
 
37
39
  setTimeout(() => {
38
40
  this.copied = false;
39
41
  }, 2000);
42
+ }).catch((e) => {
43
+ this.$emit('error', exceptionToErrorsArray(e));
40
44
  });
41
45
  },
42
46
  }
@@ -19,6 +19,11 @@ export default {
19
19
  default: false
20
20
  },
21
21
 
22
+ hideSingleTab: {
23
+ type: Boolean,
24
+ default: false
25
+ },
26
+
22
27
  showTabsAddRemove: {
23
28
  type: Boolean,
24
29
  default: false
@@ -86,6 +91,11 @@ export default {
86
91
  sortedTabs() {
87
92
  return sortBy(this.tabs, ['weight:desc', 'labelDisplay', 'name']);
88
93
  },
94
+
95
+ // hide tabs based on tab count IF flag is active
96
+ hideTabs() {
97
+ return this.hideSingleTab && this.sortedTabs.length === 1;
98
+ }
89
99
  },
90
100
 
91
101
  watch: {
@@ -223,13 +233,18 @@ export default {
223
233
  </script>
224
234
 
225
235
  <template>
226
- <div :class="{'side-tabs': !!sideTabs, 'tabs-only': tabsOnly }">
236
+ <div
237
+ :class="{'side-tabs': !!sideTabs, 'tabs-only': tabsOnly }"
238
+ data-testid="tabbed"
239
+ >
227
240
  <ul
241
+ v-if="!hideTabs"
228
242
  ref="tablist"
229
243
  role="tablist"
230
244
  class="tabs"
231
245
  :class="{'clearfix':!sideTabs, 'vertical': sideTabs, 'horizontal': !sideTabs}"
232
246
  tabindex="0"
247
+ data-testid="tabbed-block"
233
248
  @keydown.right.prevent="selectNext(1)"
234
249
  @keydown.left.prevent="selectNext(-1)"
235
250
  @keydown.down.prevent="selectNext(1)"
@@ -279,6 +294,7 @@ export default {
279
294
  <button
280
295
  type="button"
281
296
  class="btn bg-transparent"
297
+ data-testid="tab-list-add"
282
298
  @click="tabAddClicked"
283
299
  >
284
300
  <i class="icon icon-plus" />
@@ -287,6 +303,7 @@ export default {
287
303
  type="button"
288
304
  class="btn bg-transparent"
289
305
  :disabled="!sortedTabs.length"
306
+ data-testid="tab-list-remove"
290
307
  @click="tabRemoveClicked"
291
308
  >
292
309
  <i class="icon icon-minus" />
@@ -0,0 +1,47 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue';
3
+
4
+ import { ucFirst } from '@shell/utils/string';
5
+
6
+ const props = defineProps<{
7
+ userState: string,
8
+ isActive: boolean
9
+ }>();
10
+
11
+ const iconClass = computed(() => {
12
+ const userIcon = `icon-user-${ props.isActive ? 'check' : 'xmark' }`;
13
+ const iconColor = `icon-color-${ props.isActive ? 'green' : 'red' }`;
14
+
15
+ return {
16
+ icon: true,
17
+ 'icon-lg': true,
18
+ [userIcon]: true,
19
+ [iconColor]: true,
20
+ };
21
+ });
22
+ </script>
23
+
24
+ <template>
25
+ <div class="icon-center">
26
+ <i
27
+ v-tooltip="ucFirst(userState)"
28
+ :class="iconClass"
29
+ />
30
+ </div>
31
+ </template>
32
+
33
+ <style lang="scss" scoped>
34
+ .icon-center {
35
+ display: flex;
36
+ flex-direction: row;
37
+ justify-content: center;
38
+ }
39
+
40
+ .icon-color-green {
41
+ color: var(--success);
42
+ }
43
+
44
+ .icon-color-red {
45
+ color: var(--error);
46
+ }
47
+ </style>
@@ -25,6 +25,7 @@ export default {
25
25
  if (this.resource === CATALOG.CLUSTER_REPO) {
26
26
  key = !this.currentCluster || this.currentCluster.isLocal ? 'typeDescription."catalog.cattle.io.clusterrepo.local"' : 'typeDescription."catalog.cattle.io.clusterrepo"';
27
27
  } else {
28
+ // i18n-uses typeDescription.*
28
29
  key = `typeDescription."${ this.resource }"`;
29
30
  }
30
31
 
@@ -18,6 +18,7 @@ Wizard will emit these events:
18
18
  finish
19
19
  */
20
20
 
21
+ // i18n-uses wizard.next, wizard.edit, wizard.create, wizard.view, wizard.finish
21
22
  export default {
22
23
  name: 'Wizard',
23
24
 
@@ -229,6 +229,7 @@ export default {
229
229
  :class="{fill: true, scrolling: scrolling}"
230
230
  :value="curValue"
231
231
  :options="codeMirrorOptions"
232
+ :showKeyMapBox="true"
232
233
  :data-testid="componentTestid + '-code-mirror'"
233
234
  @onInput="onInput"
234
235
  @onReady="onReady"