@rancher/shell 0.5.3 → 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 (581) 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 +2 -0
  7. package/assets/styles/themes/_csp.scss +2 -2
  8. package/assets/styles/themes/_dark.scss +8 -2
  9. package/assets/styles/themes/_light.scss +2 -1
  10. package/assets/styles/themes/_suse.scss +1 -1
  11. package/assets/styles/vendor/vue-select.scss +5 -0
  12. package/assets/translations/en-us.yaml +296 -58
  13. package/assets/translations/zh-hans.yaml +5 -27
  14. package/babel.config.js +1 -1
  15. package/chart/__tests__/S3.test.ts +9 -2
  16. package/chart/monitoring/grafana/index.vue +6 -2
  17. package/chart/monitoring/prometheus/index.vue +2 -2
  18. package/chart/rancher-backup/S3.vue +11 -9
  19. package/chart/rancher-backup/index.vue +15 -5
  20. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  21. package/cloud-credential/generic.vue +18 -9
  22. package/cloud-credential/harvester.vue +11 -3
  23. package/components/AppModal.vue +167 -0
  24. package/components/AssignTo.vue +7 -4
  25. package/components/AsyncButton.vue +18 -5
  26. package/components/BackLink.vue +4 -4
  27. package/components/BannerGraphic.vue +1 -0
  28. package/components/BrandImage.vue +47 -1
  29. package/components/Carousel.vue +14 -8
  30. package/components/Certificates.vue +8 -11
  31. package/components/ClusterBadge.vue +12 -3
  32. package/components/ClusterIconMenu.vue +44 -16
  33. package/components/ClusterProviderIcon.vue +14 -3
  34. package/components/CodeMirror.vue +73 -38
  35. package/components/CommunityLinks.vue +12 -8
  36. package/components/CreateDriver.vue +81 -0
  37. package/components/CruResource.vue +51 -27
  38. package/components/DetailTop.vue +2 -2
  39. package/components/Dialog.vue +6 -5
  40. package/components/DisableAuthProviderModal.vue +14 -8
  41. package/components/DraggableZone.vue +2 -2
  42. package/components/ExplorerMembers.vue +3 -3
  43. package/components/ExplorerProjectsNamespaces.vue +6 -6
  44. package/components/FixedBanner.vue +47 -36
  45. package/components/GlobalRoleBindings.vue +26 -0
  46. package/components/Import.vue +10 -6
  47. package/components/Inactivity.vue +1 -5
  48. package/components/KeyValueView.vue +14 -10
  49. package/components/MessageLink.vue +2 -2
  50. package/components/ModalWithCard.vue +5 -8
  51. package/components/MoveModal.vue +35 -33
  52. package/components/PodSecurityAdmission.vue +3 -3
  53. package/components/PromptChangePassword.vue +33 -33
  54. package/components/PromptModal.vue +11 -21
  55. package/components/PromptRemove.vue +11 -17
  56. package/components/PromptRestore.vue +18 -16
  57. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  58. package/components/Questions/__tests__/Float.test.ts +9 -19
  59. package/components/Questions/__tests__/Int.test.ts +9 -19
  60. package/components/Questions/__tests__/String.test.ts +9 -19
  61. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  62. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  63. package/components/Questions/index.vue +18 -2
  64. package/components/ResourceCancelModal.vue +34 -29
  65. package/components/ResourceDetail/Masthead.vue +23 -7
  66. package/components/ResourceDetail/index.vue +5 -0
  67. package/components/ResourceList/Masthead.vue +28 -10
  68. package/components/ResourceList/index.vue +65 -14
  69. package/components/ResourceTable.vue +73 -19
  70. package/components/ResourceYaml.vue +1 -0
  71. package/components/SelectIconGrid.vue +3 -3
  72. package/components/SideNav.vue +15 -37
  73. package/components/SingleClusterInfo.vue +4 -4
  74. package/components/SortableTable/THead.vue +26 -12
  75. package/components/SortableTable/filtering.js +9 -1
  76. package/components/SortableTable/grouping.js +8 -1
  77. package/components/SortableTable/index.vue +142 -42
  78. package/components/SortableTable/paging.js +36 -7
  79. package/components/SortableTable/selection.js +2 -1
  80. package/components/SortableTable/sorting.js +24 -7
  81. package/components/TabTitle.vue +84 -0
  82. package/components/Tabbed/index.vue +6 -1
  83. package/components/TableDataUserIcon.vue +47 -0
  84. package/components/TypeDescription.vue +1 -0
  85. package/components/Wizard.vue +1 -0
  86. package/components/__tests__/AppModal.test.ts +98 -0
  87. package/components/__tests__/AsyncButton.test.ts +1 -3
  88. package/components/__tests__/BackLink.test.ts +1 -1
  89. package/components/__tests__/ButtonGroup.test.ts +3 -6
  90. package/components/__tests__/Carousel.test.ts +43 -0
  91. package/components/__tests__/Certificates.test.ts +29 -0
  92. package/components/__tests__/{CodeMirror.spec.ts → CodeMirror.test.ts} +5 -17
  93. package/components/__tests__/CruResource.test.ts +10 -9
  94. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  95. package/components/__tests__/FixedBanner.test.ts +5 -20
  96. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  97. package/components/__tests__/TabTitle.test.ts +129 -0
  98. package/components/auth/AzureWarning.vue +2 -2
  99. package/components/auth/RoleDetailEdit.vue +10 -0
  100. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  101. package/components/auth/login/oidc.vue +7 -1
  102. package/components/fleet/FleetClusters.vue +9 -9
  103. package/components/fleet/FleetIntro.vue +11 -17
  104. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  105. package/components/fleet/FleetRepos.vue +1 -0
  106. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  107. package/components/form/ArrayList.vue +30 -19
  108. package/components/form/ArrayListSelect.vue +9 -4
  109. package/components/form/ClusterAppearance.vue +132 -0
  110. package/components/form/ColorInput.vue +1 -0
  111. package/components/form/Error.vue +3 -3
  112. package/components/form/Footer.vue +2 -2
  113. package/components/form/GitPicker.vue +83 -38
  114. package/components/form/KeyValue.vue +67 -48
  115. package/components/form/LabeledSelect.vue +143 -43
  116. package/components/form/Labels.vue +3 -1
  117. package/components/form/NameNsDescription.vue +26 -9
  118. package/components/form/ResourceLabeledSelect.vue +187 -0
  119. package/components/form/ResourceTabs/index.vue +31 -15
  120. package/components/form/SecretSelector.vue +93 -18
  121. package/components/form/Select.vue +1 -1
  122. package/components/form/SelectOrCreateAuthSecret.vue +135 -62
  123. package/components/form/SimpleSecretSelector.vue +88 -28
  124. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  125. package/components/form/__tests__/KeyValue.test.ts +121 -12
  126. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  127. package/components/form/__tests__/NameNsDescription.test.ts +25 -15
  128. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  129. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  130. package/components/formatter/AppSummaryGraph.vue +2 -2
  131. package/components/formatter/CloudCredPublicData.vue +30 -0
  132. package/components/formatter/ClusterLink.vue +2 -2
  133. package/components/formatter/FleetSummaryGraph.vue +2 -1
  134. package/components/formatter/ImagePercentageBar.vue +0 -4
  135. package/components/formatter/IngressTarget.vue +18 -7
  136. package/components/formatter/Link.vue +2 -2
  137. package/components/formatter/LinkDetail.vue +2 -2
  138. package/components/formatter/LinkDetailImage.vue +2 -2
  139. package/components/formatter/LinkName.vue +2 -2
  140. package/components/formatter/LiveDate.vue +16 -0
  141. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  142. package/components/formatter/SecretType.vue +2 -2
  143. package/components/formatter/VirtualServiceGateways.vue +2 -2
  144. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  145. package/components/nav/Group.vue +7 -5
  146. package/components/nav/Header.vue +82 -43
  147. package/components/nav/NamespaceFilter.vue +8 -1
  148. package/components/nav/TopLevelMenu.vue +336 -125
  149. package/components/nav/Type.vue +58 -102
  150. package/components/nav/__tests__/TopLevelMenu.test.ts +370 -9
  151. package/components/nav/__tests__/Type.test.ts +321 -126
  152. package/components/nuxt/nuxt-child.js +0 -5
  153. package/components/nuxt/nuxt-error.vue +1 -1
  154. package/components/nuxt/nuxt-link.client.js +13 -95
  155. package/components/templates/default.vue +3 -3
  156. package/components/templates/error.vue +6 -10
  157. package/components/templates/standalone.vue +0 -4
  158. package/components/templates/unauthenticated.vue +1 -2
  159. package/components/user.retention/user-retention-header.vue +34 -0
  160. package/composables/useCompactInput.test.ts +36 -0
  161. package/composables/useCompactInput.ts +2 -2
  162. package/composables/useI18n.ts +26 -0
  163. package/composables/useLabeledFormElement.test.ts +135 -0
  164. package/composables/useStore.ts +16 -0
  165. package/config/home-links.js +32 -1
  166. package/config/labels-annotations.js +2 -1
  167. package/config/middleware.js +0 -6
  168. package/config/pagination-table-headers.js +57 -0
  169. package/config/pod-security-admission.ts +1 -1
  170. package/config/private-label.js +1 -3
  171. package/config/product/auth.js +1 -0
  172. package/config/product/explorer.js +167 -46
  173. package/config/product/legacy.js +3 -95
  174. package/config/product/manager.js +44 -11
  175. package/config/query-params.js +1 -0
  176. package/config/roles.ts +23 -0
  177. package/config/router/index.js +23 -0
  178. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  179. package/config/router/navigation-guards/authentication.js +63 -0
  180. package/config/router/navigation-guards/index.js +15 -0
  181. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  182. package/config/router/routes.js +487 -0
  183. package/config/settings.ts +38 -2
  184. package/config/store.js +7 -3
  185. package/config/table-headers.js +46 -1
  186. package/config/types.js +36 -16
  187. package/config/uiplugins.js +10 -5
  188. package/core/plugin-helpers.js +1 -1
  189. package/core/plugin.ts +2 -1
  190. package/core/plugins.js +289 -282
  191. package/creators/app/files/.eslintignore +0 -2
  192. package/creators/app/files/.vscode/settings.json +0 -1
  193. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  194. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  195. package/creators/pkg/init +32 -0
  196. package/detail/__tests__/service.test.ts +62 -0
  197. package/detail/catalog.cattle.io.app.vue +1 -1
  198. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  199. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  200. package/detail/namespace.vue +2 -2
  201. package/detail/networking.k8s.io.ingress.vue +52 -19
  202. package/detail/node.vue +20 -43
  203. package/detail/pod.vue +1 -68
  204. package/detail/provisioning.cattle.io.cluster.vue +2 -1
  205. package/detail/service.vue +1 -1
  206. package/detail/workload/index.vue +2 -15
  207. package/dialog/AddCustomBadgeDialog.vue +318 -161
  208. package/dialog/DeactivateDriverDialog.vue +118 -0
  209. package/dialog/RollbackWorkloadDialog.vue +2 -2
  210. package/dialog/RotateCertificatesDialog.vue +0 -21
  211. package/directives/clean-html.js +15 -0
  212. package/directives/clean-tooltip.js +32 -0
  213. package/directives/focus.js +41 -0
  214. package/directives/int-number.js +21 -0
  215. package/directives/positive-int-number.js +19 -0
  216. package/directives/trim-whitespace.js +19 -0
  217. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  218. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  219. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  220. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  221. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  222. package/edit/__tests__/nodeDriver.test.ts +107 -0
  223. package/edit/__tests__/service.test.ts +1 -5
  224. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  225. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  226. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  227. package/edit/auth/__tests__/azuread.test.ts +241 -0
  228. package/edit/auth/__tests__/oidc.test.ts +137 -0
  229. package/edit/auth/azuread.vue +133 -31
  230. package/edit/auth/github.vue +5 -17
  231. package/edit/auth/googleoauth.vue +5 -18
  232. package/edit/auth/ldap/index.vue +5 -17
  233. package/edit/auth/oidc.vue +143 -42
  234. package/edit/auth/saml.vue +5 -14
  235. package/edit/catalog.cattle.io.clusterrepo.vue +175 -20
  236. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  237. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  238. package/edit/cloudcredential.vue +26 -4
  239. package/edit/configmap.vue +10 -4
  240. package/edit/fleet.cattle.io.gitrepo.vue +7 -4
  241. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  242. package/edit/kontainerDriver.vue +65 -0
  243. package/edit/logging-flow/Match.vue +10 -9
  244. package/edit/logging-flow/index.vue +4 -19
  245. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  246. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  247. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  248. package/edit/management.cattle.io.project.vue +2 -1
  249. package/edit/management.cattle.io.setting.vue +20 -0
  250. package/edit/management.cattle.io.user.vue +2 -1
  251. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  252. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  253. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +1 -0
  254. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +3 -0
  255. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +2 -0
  256. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  257. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  258. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  259. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  260. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  261. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  262. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +45 -6
  263. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/selectors.test.ts +1 -1
  264. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  265. package/edit/nodeDriver.vue +65 -0
  266. package/edit/persistentvolume/index.vue +2 -2
  267. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +18 -9
  268. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +165 -1
  269. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +1 -1
  270. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +0 -3
  271. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  272. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +70 -12
  273. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +5 -0
  274. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  275. package/edit/provisioning.cattle.io.cluster/index.vue +21 -15
  276. package/edit/provisioning.cattle.io.cluster/rke2.vue +185 -114
  277. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +67 -7
  278. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +19 -6
  279. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  280. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +7 -0
  281. package/edit/provisioning.cattle.io.cluster/tabs/etcd/S3Config.vue +1 -0
  282. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +1 -0
  283. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +3 -0
  284. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +1 -0
  285. package/edit/resources.cattle.io.backup.vue +139 -124
  286. package/edit/resources.cattle.io.restore.vue +146 -126
  287. package/edit/service.vue +1 -0
  288. package/edit/serviceaccount.vue +46 -4
  289. package/edit/workload/__tests__/Job.test.ts +1 -3
  290. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  291. package/edit/workload/mixins/workload.js +34 -1
  292. package/edit/workload/storage/emptyDir.vue +2 -2
  293. package/initialize/App.vue +75 -0
  294. package/initialize/app-extended.js +128 -0
  295. package/initialize/entry-helpers.js +549 -0
  296. package/initialize/entry.js +32 -0
  297. package/initialize/install-components.js +23 -0
  298. package/initialize/install-directives.js +59 -0
  299. package/initialize/install-plugins.js +123 -0
  300. package/list/__tests__/workload.test.ts +1 -1
  301. package/list/cis.cattle.io.clusterscan.vue +16 -10
  302. package/list/group.principal.vue +2 -2
  303. package/list/management.cattle.io.feature.vue +11 -7
  304. package/list/management.cattle.io.user.vue +36 -3
  305. package/list/networking.k8s.io.ingress.vue +36 -0
  306. package/list/node.vue +211 -73
  307. package/list/provisioning.cattle.io.cluster.vue +17 -4
  308. package/list/ui.cattle.io.navlink.vue +2 -2
  309. package/list/workload.vue +22 -0
  310. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  311. package/machine-config/__tests__/vmwarevsphere.test.ts +162 -59
  312. package/machine-config/amazonec2.vue +1 -1
  313. package/machine-config/azure.vue +38 -21
  314. package/machine-config/generic.vue +11 -15
  315. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  316. package/machine-config/vmwarevsphere.vue +20 -11
  317. package/middleware/authenticated.js +9 -361
  318. package/mixins/__tests__/chart.test.ts +48 -6
  319. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  320. package/mixins/auth-config.js +3 -2
  321. package/mixins/brand.js +75 -57
  322. package/mixins/chart.js +27 -13
  323. package/mixins/create-edit-view/index.js +2 -2
  324. package/mixins/fetch.client.js +42 -48
  325. package/mixins/labeled-form-element.ts +21 -1
  326. package/mixins/page-actions.js +7 -5
  327. package/mixins/resource-fetch-api-pagination.js +304 -0
  328. package/mixins/resource-fetch-namespaced.js +1 -1
  329. package/mixins/resource-fetch.js +46 -5
  330. package/models/__tests__/cluster.test.ts +44 -0
  331. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  332. package/models/__tests__/schema.tests.ts +24 -0
  333. package/models/__tests__/steve-schema.test.ts +73 -0
  334. package/models/__tests__/workload.test.ts +1 -1
  335. package/models/catalog.cattle.io.app.js +8 -0
  336. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  337. package/models/catalog.cattle.io.uiplugin.js +7 -8
  338. package/models/cis.cattle.io.clusterscan.js +29 -8
  339. package/models/cloudcredential.js +9 -1
  340. package/models/cluster/node.js +4 -0
  341. package/models/cluster/schema.js +6 -0
  342. package/models/cluster.js +33 -0
  343. package/models/driver.js +62 -0
  344. package/models/fleet.cattle.io.cluster.js +23 -11
  345. package/models/fleet.cattle.io.gitrepo.js +10 -0
  346. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  347. package/models/kontainerdriver.js +68 -0
  348. package/models/management/schema.js +6 -0
  349. package/models/management.cattle.io.authconfig.js +3 -2
  350. package/models/management.cattle.io.cluster.js +5 -4
  351. package/models/management.cattle.io.globalrole.js +2 -0
  352. package/models/management.cattle.io.user.js +67 -2
  353. package/models/monitoring.coreos.com.receiver.js +3 -1
  354. package/models/monitoring.coreos.com.route.js +1 -1
  355. package/models/networking.k8s.io.ingress.js +2 -1
  356. package/models/nodedriver.js +68 -0
  357. package/models/provisioning.cattle.io.cluster.js +34 -1
  358. package/models/schema.js +28 -7
  359. package/models/service.js +2 -0
  360. package/models/steve-schema.ts +254 -0
  361. package/models/workload.js +1 -0
  362. package/package.json +6 -5
  363. package/pages/about.vue +12 -5
  364. package/pages/account/index.vue +7 -2
  365. package/pages/auth/login.vue +106 -102
  366. package/pages/auth/logout.vue +2 -2
  367. package/pages/auth/setup.vue +57 -64
  368. package/pages/auth/verify.vue +17 -17
  369. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  370. package/pages/c/_cluster/apps/charts/index.vue +37 -13
  371. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  372. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  373. package/pages/c/_cluster/auth/config/index.vue +15 -9
  374. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  375. package/pages/c/_cluster/auth/user.retention/index.vue +384 -0
  376. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  377. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  378. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  379. package/pages/c/_cluster/explorer/index.vue +231 -72
  380. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  381. package/pages/c/_cluster/explorer/tools/index.vue +12 -176
  382. package/pages/c/_cluster/fleet/index.vue +88 -93
  383. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  384. package/pages/c/_cluster/longhorn/index.vue +52 -17
  385. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  386. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  387. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  388. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +94 -0
  389. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  390. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  391. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +63 -0
  392. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  393. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  394. package/pages/c/_cluster/monitoring/index.vue +1 -17
  395. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  396. package/pages/c/_cluster/neuvector/index.vue +1 -0
  397. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  398. package/pages/c/_cluster/settings/banners.vue +86 -8
  399. package/pages/c/_cluster/settings/brand.vue +258 -36
  400. package/pages/c/_cluster/settings/index.vue +4 -4
  401. package/pages/c/_cluster/settings/links.vue +5 -3
  402. package/pages/c/_cluster/settings/performance.vue +71 -2
  403. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  404. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +10 -7
  405. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  406. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  407. package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
  408. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  409. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  410. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  411. package/pages/c/_cluster/uiplugins/index.vue +38 -52
  412. package/pages/diagnostic.vue +1 -0
  413. package/pages/fail-whale.vue +103 -41
  414. package/pages/home.vue +81 -24
  415. package/pages/prefs.vue +8 -3
  416. package/pages/support/index.vue +12 -2
  417. package/plugins/clean-html-directive.js +5 -12
  418. package/plugins/clean-tooltip-directive.js +6 -31
  419. package/plugins/codemirror.js +0 -9
  420. package/plugins/dashboard-store/__tests__/mutations.test.ts +296 -313
  421. package/plugins/dashboard-store/actions.js +140 -32
  422. package/plugins/dashboard-store/getters.js +86 -39
  423. package/plugins/dashboard-store/index.js +0 -99
  424. package/plugins/dashboard-store/mutations.js +150 -48
  425. package/plugins/dashboard-store/resource-class.js +14 -109
  426. package/plugins/directives.js +6 -39
  427. package/plugins/ember-cookie.js +13 -0
  428. package/plugins/global-formatters.js +26 -5
  429. package/plugins/i18n.js +90 -56
  430. package/plugins/int-number.js +6 -20
  431. package/plugins/plugin.js +3 -3
  432. package/plugins/positive-int-number.js +6 -17
  433. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +124 -31
  434. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  435. package/plugins/steve/__tests__/subscribe.spec.ts +109 -0
  436. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  437. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  438. package/plugins/steve/actions.js +0 -1
  439. package/plugins/steve/getters.js +183 -63
  440. package/plugins/steve/hybrid-class.js +5 -1
  441. package/plugins/steve/mutations.js +29 -5
  442. package/plugins/steve/norman-class.js +123 -2
  443. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  444. package/plugins/steve/schema.d.ts +22 -0
  445. package/plugins/steve/steve-pagination-utils.ts +368 -0
  446. package/plugins/steve/subscribe.js +37 -75
  447. package/plugins/trim-whitespace.js +6 -34
  448. package/plugins/vue-js-modal.js +1 -1
  449. package/public/index.html +1 -0
  450. package/rancher-components/Accordion/Accordion.vue +3 -2
  451. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  452. package/rancher-components/Banner/Banner.test.ts +1 -5
  453. package/rancher-components/Banner/Banner.vue +2 -2
  454. package/rancher-components/Card/Card.vue +4 -4
  455. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  456. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  457. package/rancher-components/Form/LabeledInput/LabeledInput.vue +66 -30
  458. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  459. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  460. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  461. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  462. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  463. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  464. package/rancher-components/StringList/StringList.vue +8 -8
  465. package/rancher-components/components/Accordion/Accordion.vue +3 -2
  466. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  467. package/rancher-components/components/Banner/Banner.test.ts +1 -5
  468. package/rancher-components/components/Banner/Banner.vue +2 -2
  469. package/rancher-components/components/Card/Card.vue +4 -4
  470. package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
  471. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  472. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +66 -30
  473. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
  474. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  475. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  476. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  477. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  478. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  479. package/rancher-components/components/StringList/StringList.vue +8 -8
  480. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +27 -8
  481. package/scripts/clean +1 -1
  482. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  483. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  484. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  485. package/scripts/extension/helm/package/Dockerfile +1 -1
  486. package/scripts/extension/helm/scripts/patch +27 -0
  487. package/scripts/extension/publish +6 -6
  488. package/scripts/serve-pkgs +0 -2
  489. package/scripts/test-plugins-build.sh +6 -6
  490. package/scripts/vue-migrate.js +683 -0
  491. package/store/__tests__/catalog.test.ts +224 -0
  492. package/store/auth.js +23 -4
  493. package/store/aws.js +53 -6
  494. package/store/catalog.js +21 -5
  495. package/store/cru-resource.ts +26 -0
  496. package/store/customisation.js +35 -0
  497. package/store/features.js +6 -4
  498. package/store/index.js +132 -39
  499. package/store/plugins.js +8 -4
  500. package/store/type-map.js +143 -143
  501. package/store/type-map.utils.ts +226 -0
  502. package/tsconfig.json +0 -1
  503. package/tsconfig.paths.json +4 -1
  504. package/types/components/labeledSelect.ts +50 -0
  505. package/types/resources/settings.d.ts +32 -0
  506. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  507. package/types/shell/index.d.ts +996 -782
  508. package/types/store/dashboard-store.types.ts +42 -0
  509. package/types/store/pagination.types.ts +457 -0
  510. package/types/store/type-map.ts +30 -0
  511. package/types/store/vuex.d.ts +9 -0
  512. package/types/vue-shim.d.ts +51 -0
  513. package/utils/__tests__/cluster.test.ts +20 -18
  514. package/utils/__tests__/create-yaml.test.ts +359 -2
  515. package/utils/__tests__/kontainer.test.ts +92 -0
  516. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  517. package/utils/alertmanagerconfig.js +19 -0
  518. package/utils/array.ts +40 -1
  519. package/utils/async.ts +2 -0
  520. package/utils/auth.js +152 -4
  521. package/utils/axios.js +2 -2
  522. package/utils/banners.js +103 -0
  523. package/utils/cluster.js +1 -1
  524. package/utils/config.js +4 -0
  525. package/utils/create-yaml.js +54 -27
  526. package/utils/error.js +25 -0
  527. package/utils/formatter.js +5 -3
  528. package/utils/git.ts +1 -1
  529. package/utils/install-redirect.js +1 -1
  530. package/utils/kontainer.ts +186 -0
  531. package/utils/monitoring.js +2 -37
  532. package/utils/pagination-utils.ts +154 -0
  533. package/utils/pod-security-admission.ts +1 -1
  534. package/utils/router.js +86 -0
  535. package/utils/settings.ts +46 -0
  536. package/utils/socket.js +1 -0
  537. package/utils/time.js +1 -0
  538. package/utils/title.ts +3 -0
  539. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  540. package/utils/validators/formRules/__tests__/index.test.ts +21 -0
  541. package/utils/validators/formRules/index.ts +3 -0
  542. package/utils/validators/index.js +1 -0
  543. package/vue.config.js +376 -421
  544. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  545. package/chart/monitoring/steps/uninstall-v1.vue +0 -135
  546. package/components/EventsTable.vue +0 -67
  547. package/components/TabbedLinks/index.vue +0 -94
  548. package/components/nuxt/nuxt-link.server.js +0 -16
  549. package/components/nuxt/nuxt.js +0 -101
  550. package/config/router.js +0 -425
  551. package/initialize/App.js +0 -152
  552. package/initialize/client.js +0 -734
  553. package/initialize/index.js +0 -287
  554. package/middleware/i18n.js +0 -10
  555. package/middleware/unauthenticated.js +0 -22
  556. package/mixins/v1-workload-metrics.js +0 -43
  557. package/pages/c/_cluster/apps/index.vue +0 -15
  558. package/pages/c/_cluster/auth/index.vue +0 -17
  559. package/pages/c/_cluster/index.vue +0 -15
  560. package/pages/c/_cluster/legacy/index.vue +0 -22
  561. package/pages/c/_cluster/manager/index.vue +0 -22
  562. package/pages/c/_cluster/mcapps/index.vue +0 -21
  563. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  564. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  565. package/plugins/index.js +0 -11
  566. package/plugins/portal-vue.js +0 -4
  567. package/plugins/portal.js +0 -4
  568. package/plugins/resize.js +0 -5
  569. package/plugins/shortkey.js +0 -4
  570. package/plugins/tooltip.js +0 -4
  571. package/plugins/v-select.js +0 -4
  572. package/utils/group.js +0 -70
  573. package/utils/nuxt.js +0 -638
  574. package/utils/router.scrollBehavior.js +0 -78
  575. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  576. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  577. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  578. /package/plugins/steve/__tests__/{steve-class.spec.ts → steve-class.test.ts} +0 -0
  579. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  580. /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  581. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
@@ -12,6 +12,9 @@ import {
12
12
  } from '@shell/config/query-params';
13
13
  import { ExtensionPoint, PanelLocation } from '@shell/core/types';
14
14
  import ExtensionPanel from '@shell/components/ExtensionPanel';
15
+ import TabTitle from '@shell/components/TabTitle';
16
+
17
+ // i18n-uses resourceDetail.header.*
15
18
 
16
19
  /**
17
20
  * Resource Detail Masthead component.
@@ -23,7 +26,7 @@ export default {
23
26
  name: 'MastheadResourceDetail',
24
27
 
25
28
  components: {
26
- BadgeState, Banner, ButtonGroup, ExtensionPanel
29
+ BadgeState, Banner, ButtonGroup, ExtensionPanel, TabTitle
27
30
  },
28
31
  props: {
29
32
  value: {
@@ -412,12 +415,24 @@ export default {
412
415
  <div class="title">
413
416
  <div class="primaryheader">
414
417
  <h1>
415
- <nuxt-link
418
+ <TabTitle
419
+ v-if="isCreate"
420
+ :showChild="false"
421
+ >
422
+ {{ parent.displayName }}
423
+ </TabTitle>
424
+ <TabTitle
425
+ v-else
426
+ :showChild="false"
427
+ >
428
+ {{ displayName }}
429
+ </TabTitle>
430
+ <router-link
416
431
  v-if="location"
417
432
  :to="location"
418
433
  >
419
434
  {{ parent.displayName }}:
420
- </nuxt-link>
435
+ </router-link>
421
436
  <span v-else>{{ parent.displayName }}:</span>
422
437
  <span v-if="value.detailPageHeaderActionOverride && value.detailPageHeaderActionOverride(realMode)">{{ value.detailPageHeaderActionOverride(realMode) }}</span>
423
438
  <t
@@ -448,16 +463,17 @@ export default {
448
463
  v-if="!isCreate"
449
464
  class="subheader"
450
465
  >
451
- <span v-if="isNamespace && project">{{ t("resourceDetail.masthead.project") }}: <nuxt-link :to="project.detailLocation">{{ project.nameDisplay }}</nuxt-link></span>
452
- <span v-else-if="isWorkspace">{{ t("resourceDetail.masthead.workspace") }}: <nuxt-link :to="workspaceLocation">{{ namespace }}</nuxt-link></span>
466
+ <span v-if="isNamespace && project">{{ t("resourceDetail.masthead.project") }}: <router-link :to="project.detailLocation">{{ project.nameDisplay }}</router-link></span>
467
+ <span v-else-if="isWorkspace">{{ t("resourceDetail.masthead.workspace") }}: <router-link :to="workspaceLocation">{{ namespace }}</router-link></span>
453
468
  <span v-else-if="namespace && !hasMultipleNamespaces">
454
469
  {{ t("resourceDetail.masthead.namespace") }}:
455
- <nuxt-link
470
+ <router-link
456
471
  v-if="!hideNamespaceLocation"
457
472
  :to="namespaceLocation"
473
+ data-testid="masthead-subheader-namespace"
458
474
  >
459
475
  {{ namespace }}
460
- </nuxt-link>
476
+ </router-link>
461
477
  <span v-else>
462
478
  {{ namespace }}
463
479
  </span>
@@ -155,6 +155,11 @@ export default {
155
155
  }
156
156
 
157
157
  if ( as === _YAML ) {
158
+ if (schema?.fetchResourceFields) {
159
+ // fetch resourceFields for createYaml
160
+ await schema.fetchResourceFields();
161
+ }
162
+
158
163
  yaml = createYaml(schemas, resource, data);
159
164
  }
160
165
  } else {
@@ -5,6 +5,7 @@ import TypeDescription from '@shell/components/TypeDescription';
5
5
  import { get } from '@shell/utils/object';
6
6
  import { AS, _YAML } from '@shell/config/query-params';
7
7
  import ResourceLoadingIndicator from './ResourceLoadingIndicator';
8
+ import TabTitle from '@shell/components/TabTitle';
8
9
 
9
10
  /**
10
11
  * Resource List Masthead component.
@@ -17,6 +18,7 @@ export default {
17
18
  Favorite,
18
19
  TypeDescription,
19
20
  ResourceLoadingIndicator,
21
+ TabTitle
20
22
  },
21
23
  props: {
22
24
  resource: {
@@ -102,7 +104,7 @@ export default {
102
104
 
103
105
  computed: {
104
106
  get,
105
- ...mapGetters(['isExplorer']),
107
+ ...mapGetters(['isExplorer', 'currentCluster']),
106
108
 
107
109
  resourceName() {
108
110
  if (this.schema) {
@@ -156,20 +158,19 @@ export default {
156
158
 
157
159
  _createButtonlabel() {
158
160
  return this.createButtonLabel || this.t('resourceList.head.create');
159
- }
160
-
161
- },
161
+ },
162
+ }
162
163
  };
163
164
  </script>
164
165
 
165
166
  <template>
166
- <header>
167
+ <header class="with-subheader">
167
168
  <slot name="typeDescription">
168
169
  <TypeDescription :resource="resource" />
169
170
  </slot>
170
171
  <div class="title">
171
172
  <h1 class="m-0">
172
- {{ _typeDisplay }} <Favorite
173
+ <TabTitle>{{ _typeDisplay }}</TabTitle> <Favorite
173
174
  v-if="isExplorer"
174
175
  :resource="favoriteResource || resource"
175
176
  />
@@ -180,28 +181,33 @@ export default {
180
181
  :indeterminate="loadIndeterminate"
181
182
  />
182
183
  </div>
184
+ <div class="sub-header">
185
+ <slot name="subHeader">
186
+ <!--Slot content-->
187
+ </slot>
188
+ </div>
183
189
  <div class="actions-container">
184
190
  <slot name="actions">
185
191
  <div class="actions">
186
192
  <slot name="extraActions" />
187
193
 
188
194
  <slot name="createButton">
189
- <n-link
195
+ <router-link
190
196
  v-if="hasEditComponent && _isCreatable"
191
197
  :to="_createLocation"
192
198
  class="btn role-primary"
193
199
  :data-testid="componentTestid+'-create'"
194
200
  >
195
201
  {{ _createButtonlabel }}
196
- </n-link>
197
- <n-link
202
+ </router-link>
203
+ <router-link
198
204
  v-else-if="_isYamlCreatable"
199
205
  :to="_yamlCreateLocation"
200
206
  class="btn role-primary"
201
207
  :data-testid="componentTestid+'-create-yaml'"
202
208
  >
203
209
  {{ t("resourceList.head.createFromYaml") }}
204
- </n-link>
210
+ </router-link>
205
211
  </slot>
206
212
  </div>
207
213
  </slot>
@@ -221,4 +227,16 @@ export default {
221
227
  header {
222
228
  margin-bottom: 20px;
223
229
  }
230
+
231
+ header.with-subheader {
232
+ grid-template-areas:
233
+ 'type-banner type-banner'
234
+ 'title actions'
235
+ 'sub-header sub-header'
236
+ 'state-banner state-banner';
237
+ }
238
+
239
+ .sub-header {
240
+ grid-area: sub-header;
241
+ }
224
242
  </style>
@@ -45,7 +45,7 @@ export default {
45
45
  const schema = this.schema;
46
46
 
47
47
  if ( this.hasListComponent ) {
48
- // If you provide your own list then call its asyncData
48
+ // If you provide your own list then call its fetch
49
49
  const importer = this.listComponent;
50
50
  const component = (await importer())?.default;
51
51
 
@@ -55,7 +55,7 @@ export default {
55
55
 
56
56
  // If your list page has a fetch then it's responsible for populating rows itself
57
57
  if ( component?.fetch ) {
58
- this.hasFetch = true;
58
+ this.componentWillFetch = true;
59
59
  }
60
60
 
61
61
  // If the custom component supports it, ask it what resources it loads, so we can
@@ -68,15 +68,15 @@ export default {
68
68
  }
69
69
  }
70
70
 
71
- if ( !this.hasFetch ) {
71
+ if ( !this.componentWillFetch ) {
72
72
  if ( !schema ) {
73
73
  store.dispatch('loadingError', new Error(this.t('nav.failWhale.resourceListNotFound', { resource }, true)));
74
74
 
75
75
  return;
76
76
  }
77
77
 
78
- // See comment for `namespaceFilterRequired` watcher, skip fetch if we don't have a valid NS
79
- if (!this.namespaceFilterRequired) {
78
+ // See comment for `namespaceFilter` and `pagination` watchers, skip fetch if we're not ready yet... and something is going to call fetch later on
79
+ if (!this.namespaceFilterRequired && (!this.canPaginate || this.refreshFlag)) {
80
80
  await this.$fetchType(resource);
81
81
  }
82
82
  }
@@ -103,7 +103,11 @@ export default {
103
103
  extensionType: ExtensionPoint.PANEL,
104
104
  extensionLocation: PanelLocation.RESOURCE_LIST,
105
105
  loadResources: [resource], // List of resources that will be loaded, this could be many (`Workloads`)
106
- hasFetch: false,
106
+ /**
107
+ * Will the custom component handle the fetch of resources....
108
+ * or will this instance fetch resources
109
+ */
110
+ componentWillFetch: false,
107
111
  // manual refresh
108
112
  manualRefreshInit: false,
109
113
  watch: false,
@@ -113,7 +117,7 @@ export default {
113
117
  // incremental loading
114
118
  loadIndeterminate: false,
115
119
  // query param for simple filtering
116
- useQueryParamsForSimpleFiltering: true
120
+ useQueryParamsForSimpleFiltering: true,
117
121
  };
118
122
  },
119
123
 
@@ -124,7 +128,7 @@ export default {
124
128
  return [];
125
129
  }
126
130
 
127
- return this.$store.getters['type-map/headersFor'](this.schema);
131
+ return this.$store.getters['type-map/headersFor'](this.schema, this.canPaginate);
128
132
  },
129
133
 
130
134
  groupBy() {
@@ -138,6 +142,7 @@ export default {
138
142
  },
139
143
 
140
144
  watch: {
145
+
141
146
  /**
142
147
  * When a NS filter is required and the user selects a different one, kick off a new set of API requests
143
148
  *
@@ -148,14 +153,46 @@ export default {
148
153
  * This covers case 1
149
154
  */
150
155
  namespaceFilter(neu, old) {
151
- if (sameContents(neu, old)) {
152
- return;
156
+ if (neu && !this.componentWillFetch) {
157
+ if (sameContents(neu, old)) {
158
+ return;
159
+ }
160
+
161
+ this.$fetchType(this.resource);
153
162
  }
163
+ },
154
164
 
155
- if (neu && !this.hasFetch) {
165
+ /**
166
+ * When a pagination is required and the user changes page / sort / filter, kick off a new set of API requests
167
+ *
168
+ * ResourceList has two modes
169
+ * 1) ResourceList component handles API request to fetch resources
170
+ * 2) Custom list component handles API request to fetch resources
171
+ *
172
+ * This covers case 1
173
+ */
174
+ pagination(neu, old) {
175
+ if (neu && !this.componentWillFetch && !this.paginationEqual(neu, old)) {
156
176
  this.$fetchType(this.resource);
157
177
  }
158
- }
178
+ },
179
+
180
+ /**
181
+ * Monitor the rows to ensure deleting the last entry in a server-side paginated page doesn't
182
+ * result in an empty page
183
+ */
184
+ rows(neu) {
185
+ if (!this.pagination) {
186
+ return;
187
+ }
188
+
189
+ if (this.pagination.page > 1 && neu.length === 0) {
190
+ this.setPagination({
191
+ ...this.pagination,
192
+ page: this.pagination.page - 1
193
+ });
194
+ }
195
+ },
159
196
  },
160
197
 
161
198
  created() {
@@ -184,6 +221,16 @@ export default {
184
221
  {{ t('resourceList.nsFiltering') }}
185
222
  </template>
186
223
  </IconMessage>
224
+ <IconMessage
225
+ v-else-if="paginationNsFilterRequired"
226
+ :vertical="true"
227
+ :subtle="false"
228
+ icon="icon-filter_alt"
229
+ >
230
+ <template #message>
231
+ {{ t('resourceList.nsFilteringGeneric') }}
232
+ </template>
233
+ </IconMessage>
187
234
  <div v-else>
188
235
  <Masthead
189
236
  v-if="showMasthead"
@@ -217,6 +264,7 @@ export default {
217
264
  v-else
218
265
  :schema="schema"
219
266
  :rows="rows"
267
+ :alt-loading="canPaginate"
220
268
  :loading="loading"
221
269
  :headers="headers"
222
270
  :group-by="groupBy"
@@ -225,11 +273,14 @@ export default {
225
273
  :adv-filter-prevent-filtering-labels="advFilterPreventFilteringLabels"
226
274
  :use-query-params-for-simple-filtering="useQueryParamsForSimpleFiltering"
227
275
  :force-update-live-and-delayed="forceUpdateLiveAndDelayed"
276
+ :external-pagination-enabled="canPaginate"
277
+ :external-pagination-result="paginationResult"
278
+ @pagination-changed="paginationChanged"
228
279
  />
229
280
  </div>
230
281
  </template>
231
282
 
232
- <style lang="scss" scoped>
283
+ <style lang="scss" scoped>
233
284
  .header {
234
285
  position: relative;
235
286
  }
@@ -245,4 +296,4 @@ export default {
245
296
  top: 10px;
246
297
  right: 10px;
247
298
  }
248
- </style>
299
+ </style>
@@ -59,6 +59,11 @@ export default {
59
59
  required: false
60
60
  },
61
61
 
62
+ altLoading: {
63
+ type: Boolean,
64
+ required: false
65
+ },
66
+
62
67
  keyField: {
63
68
  // Field that is unique for each row.
64
69
  type: String,
@@ -166,6 +171,16 @@ export default {
166
171
  forceUpdateLiveAndDelayed: {
167
172
  type: Number,
168
173
  default: 0
174
+ },
175
+
176
+ externalPaginationEnabled: {
177
+ type: Boolean,
178
+ default: false
179
+ },
180
+
181
+ externalPaginationResult: {
182
+ type: Object,
183
+ default: null
169
184
  }
170
185
  },
171
186
 
@@ -184,24 +199,31 @@ export default {
184
199
  },
185
200
 
186
201
  data() {
187
- const options = this.$store.getters[`type-map/optionsFor`](this.schema);
188
- const listGroups = options?.listGroups || [];
189
- const listGroupMapped = listGroups.reduce((acc, grp) => {
190
- acc[grp.value] = grp;
191
-
192
- return acc;
193
- }, {});
194
-
195
202
  // Confirm which store we're in, if schema isn't available we're probably showing a list with different types
196
203
  const inStore = this.schema?.id ? this.$store.getters['currentStore'](this.schema.id) : undefined;
197
204
 
198
- return {
199
- listGroups, listGroupMapped, inStore
200
- };
205
+ return { inStore };
201
206
  },
202
207
 
203
208
  computed: {
209
+ options() {
210
+ return this.$store.getters[`type-map/optionsFor`](this.schema, this.externalPaginationEnabled);
211
+ },
212
+
213
+ _listGroupMapped() {
214
+ return this.options?.listGroups?.reduce((acc, grp) => {
215
+ acc[grp.value] = grp;
216
+
217
+ return acc;
218
+ }, {});
219
+ },
220
+
221
+ _mandatorySort() {
222
+ return this.options?.listMandatorySort;
223
+ },
224
+
204
225
  ...mapGetters(['currentProduct']),
226
+
205
227
  isNamespaced() {
206
228
  if ( this.namespaced !== null ) {
207
229
  return this.namespaced;
@@ -236,7 +258,7 @@ export default {
236
258
  if ( this.headers ) {
237
259
  headers = this.headers.slice();
238
260
  } else {
239
- headers = this.$store.getters['type-map/headersFor'](this.schema);
261
+ headers = this.$store.getters['type-map/headersFor'](this.schema, this.externalPaginationEnabled);
240
262
  }
241
263
 
242
264
  // add custom table columns provided by the extensions ExtensionPoint.TABLE_COL hook
@@ -283,7 +305,7 @@ export default {
283
305
  }
284
306
 
285
307
  // If we are grouping by a custom group, it may specify that we hide a specific column
286
- const custom = this.listGroupMapped[this.group];
308
+ const custom = this._listGroupMapped?.[this.group];
287
309
 
288
310
  if (custom?.hideColumn) {
289
311
  const idx = headers.findIndex((header) => header.name === custom.hideColumn);
@@ -296,6 +318,9 @@ export default {
296
318
  return headers;
297
319
  },
298
320
 
321
+ /**
322
+ * Take rows and filter out entries given the namespace filter
323
+ */
299
324
  filteredRows() {
300
325
  const isAll = this.$store.getters['isAllNamespaces'];
301
326
 
@@ -303,6 +328,7 @@ export default {
303
328
  if (
304
329
  !this.isNamespaced || // Resource type isn't namespaced
305
330
  this.ignoreFilter || // Component owner strictly states no filtering
331
+ this.externalPaginationEnabled ||
306
332
  (isAll && !this.currentProduct?.hideSystemResources) || // Need all
307
333
  (this.inStore ? this.$store.getters[`${ this.inStore }/haveNamespace`](this.schema.id)?.length : false)// Store reports type has namespace filter, so rows already contain the correctly filtered resources
308
334
  ) {
@@ -344,7 +370,14 @@ export default {
344
370
  const exists = this.groupOptions.find((g) => g.value === this._group);
345
371
 
346
372
  if (!exists) {
347
- return DEFAULT_GROUP;
373
+ // Attempt to find the default option in available options...
374
+ // if not use the first value in the options collection...
375
+ // and if not that just fall back to the default
376
+ if (this.groupOptions.find((g) => g.value === DEFAULT_GROUP)) {
377
+ return DEFAULT_GROUP;
378
+ }
379
+
380
+ return this.groupOptions[0]?.value || DEFAULT_GROUP;
348
381
  }
349
382
 
350
383
  return this._group;
@@ -357,7 +390,7 @@ export default {
357
390
  showGrouping() {
358
391
  if ( this.groupable === null ) {
359
392
  const namespaceGroupable = this.$store.getters['isMultipleNamespaces'] && this.isNamespaced;
360
- const customGroupable = this.listGroups.length > 0;
393
+ const customGroupable = !!this.options?.listGroups?.length;
361
394
 
362
395
  return namespaceGroupable || customGroupable;
363
396
  }
@@ -367,16 +400,19 @@ export default {
367
400
 
368
401
  computedGroupBy() {
369
402
  if ( this.groupBy ) {
403
+ // This probably comes from the type-map config for the resource (see ResourceList)
370
404
  return this.groupBy;
371
405
  }
372
406
 
373
407
  if ( this.group === 'namespace' && this.showGrouping ) {
408
+ // This switches to group rows by a key which is the label for the group (??)
374
409
  return 'groupByLabel';
375
410
  }
376
411
 
377
- const custom = this.listGroupMapped[this.group];
412
+ const custom = this._listGroupMapped?.[this.group];
378
413
 
379
- if (custom && custom.field) {
414
+ if (custom?.field) {
415
+ // Override the normal filtering
380
416
  return custom.field;
381
417
  }
382
418
 
@@ -384,6 +420,12 @@ export default {
384
420
  },
385
421
 
386
422
  groupOptions() {
423
+ // Ignore the defaults below, we have an override set of groups
424
+ // REPLACE (instead of SUPPLEMENT) defaults with listGroups (given listGroupsWillOverride is true)
425
+ if (this.options?.listGroupsWillOverride && !!this.options?.listGroups?.length) {
426
+ return this.options?.listGroups;
427
+ }
428
+
387
429
  const standard = [
388
430
  {
389
431
  tooltipKey: 'resourceTable.groupBy.none',
@@ -397,7 +439,12 @@ export default {
397
439
  },
398
440
  ];
399
441
 
400
- return standard.concat(this.listGroups);
442
+ // SUPPLEMENT (instead of REPLACE) defaults with listGroups (given listGroupsWillOverride is false)
443
+ if (!!this.options?.listGroups?.length) {
444
+ return standard.concat(this.options.listGroups);
445
+ }
446
+
447
+ return standard;
401
448
  },
402
449
 
403
450
  parsedPagingParams() {
@@ -417,6 +464,7 @@ export default {
417
464
  pluralLabel: this.$store.getters['type-map/labelFor'](this.schema, 99),
418
465
  };
419
466
  },
467
+
420
468
  },
421
469
 
422
470
  methods: {
@@ -478,7 +526,7 @@ export default {
478
526
  this.keyAction('detail');
479
527
  }
480
528
  }
481
- }
529
+ },
482
530
  };
483
531
  </script>
484
532
 
@@ -489,6 +537,7 @@ export default {
489
537
  :headers="_headers"
490
538
  :rows="filteredRows"
491
539
  :loading="loading"
540
+ :alt-loading="altLoading"
492
541
  :group-by="computedGroupBy"
493
542
  :group="group"
494
543
  :group-options="groupOptions"
@@ -508,8 +557,12 @@ export default {
508
557
  :sort-generation-fn="safeSortGenerationFn"
509
558
  :use-query-params-for-simple-filtering="useQueryParamsForSimpleFiltering"
510
559
  :force-update-live-and-delayed="forceUpdateLiveAndDelayed"
560
+ :external-pagination-enabled="externalPaginationEnabled"
561
+ :external-pagination-result="externalPaginationResult"
562
+ :mandatory-sort="_mandatorySort"
511
563
  @clickedActionButton="handleActionButtonClick"
512
564
  @group-value-change="group = $event"
565
+
513
566
  v-on="$listeners"
514
567
  >
515
568
  <template
@@ -517,6 +570,7 @@ export default {
517
570
  #header-middle
518
571
  >
519
572
  <slot name="more-header-middle" />
573
+
520
574
  <ButtonGroup
521
575
  v-model="group"
522
576
  :options="groupOptions"
@@ -362,6 +362,7 @@ export default {
362
362
  :yamlPreview="preview"
363
363
  :yamlSave="save"
364
364
  :yamlUnpreview="unpreview"
365
+ :canDiff="canDiff"
365
366
  >
366
367
  <Footer
367
368
  v-if="showFooter"
@@ -98,7 +98,7 @@ export default {
98
98
  v-if="rows.length"
99
99
  class="grid"
100
100
  >
101
- <div
101
+ <component
102
102
  :is="asLink ? 'a' : 'div'"
103
103
  v-for="(r, idx) in rows"
104
104
  :key="get(r, keyField)"
@@ -106,7 +106,7 @@ export default {
106
106
  :target="get(r, targetField)"
107
107
  :rel="rel"
108
108
  class="item"
109
- :data-testid="componentTestid + '-' + idx"
109
+ :data-testid="componentTestid + '-' + get(r, nameField)"
110
110
  :class="{
111
111
  'has-description': !!get(r, descriptionField),
112
112
  'has-side-label': !!get(r, sideLabelField), [colorFor(r, idx)]: true, disabled: get(r, disabledField) === true
@@ -154,7 +154,7 @@ export default {
154
154
  >
155
155
  {{ get(r, descriptionField) }}
156
156
  </div>
157
- </div>
157
+ </component>
158
158
  </div>
159
159
  <div
160
160
  v-else