@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
@@ -8,11 +8,11 @@ import { normalizeType } from './normalize';
8
8
  import garbageCollect from '@shell/utils/gc/gc';
9
9
  import { addSchemaIndexFields } from '@shell/plugins/steve/schema.utils';
10
10
  import { addParam } from '@shell/utils/url';
11
+ import { conditionalDepaginate } from '@shell/store/type-map.utils';
11
12
 
12
13
  export const _ALL = 'all';
13
14
  export const _MERGE = 'merge';
14
15
  export const _MULTI = 'multi';
15
- export const _ALL_IF_AUTHED = 'allIfAuthed';
16
16
  export const _NONE = 'none';
17
17
 
18
18
  const SCHEMA_CHECK_RETRIES = 15;
@@ -124,7 +124,7 @@ export default {
124
124
  }
125
125
  });
126
126
  } else {
127
- // We have everything!
127
+ // We have everything!
128
128
  if (opt.hasManualRefresh) {
129
129
  dispatch('resource-fetch/updateManualRefreshIsLoading', false, { root: true });
130
130
  }
@@ -143,6 +143,11 @@ export default {
143
143
  }
144
144
  },
145
145
 
146
+ /**
147
+ *
148
+ * @param {*} ctx
149
+ * @param { {type: string, opt: ActionFindPageArgs} } opt
150
+ */
146
151
  async findAll(ctx, { type, opt }) {
147
152
  const {
148
153
  getters, commit, dispatch, rootGetters
@@ -156,16 +161,22 @@ export default {
156
161
  }
157
162
 
158
163
  // No need to request the resources if we have them already
159
- if ( opt.force !== true && (getters['haveAll'](type) || getters['haveAllNamespace'](type, opt.namespaced))) {
160
- const args = {
161
- type,
162
- revision: '',
163
- // watchNamespace - used sometimes when we haven't fetched the results of a single namespace
164
- // namespaced - used when we have fetched the result of a single namespace (see https://github.com/rancher/dashboard/pull/7329/files)
165
- namespace: opt.watchNamespace || opt.namespaced
166
- };
167
-
164
+ if (
165
+ !opt.force &&
166
+ (
167
+ getters['haveAll'](type) ||
168
+ getters['haveAllNamespace'](type, opt.namespaced)
169
+ )
170
+ ) {
168
171
  if (opt.watch !== false ) {
172
+ const args = {
173
+ type,
174
+ revision: '',
175
+ // watchNamespace - used sometimes when we haven't fetched the results of a single namespace
176
+ // namespaced - used when we have fetched the result of a single namespace (see https://github.com/rancher/dashboard/pull/7329/files)
177
+ namespace: opt.watchNamespace || opt.namespaced
178
+ };
179
+
169
180
  dispatch('watch', args);
170
181
  }
171
182
 
@@ -176,14 +187,6 @@ export default {
176
187
 
177
188
  if ( opt.load === false || opt.load === _NONE ) {
178
189
  load = _NONE;
179
- } else if ( opt.load === _ALL_IF_AUTHED ) {
180
- const header = rootGetters['auth/fromHeader'];
181
-
182
- if ( `${ header }` === 'true' || `${ header }` === 'none' ) {
183
- load = _ALL;
184
- } else {
185
- load = _MULTI;
186
- }
187
190
  }
188
191
 
189
192
  const typeOptions = rootGetters['type-map/optionsFor'](type);
@@ -192,7 +195,7 @@ export default {
192
195
  opt = opt || {};
193
196
  opt.url = getters.urlFor(type, null, opt);
194
197
  opt.stream = opt.stream !== false && load !== _NONE;
195
- opt.depaginate = typeOptions?.depaginate;
198
+ opt.depaginate = conditionalDepaginate(typeOptions?.depaginate, { ctx, args: { type, opt } });
196
199
 
197
200
  let skipHaveAll = false;
198
201
 
@@ -200,6 +203,8 @@ export default {
200
203
  // on for a limit of 100, to quickly show data
201
204
  // another one with 1st page of the subset of the resource we are fetching
202
205
  // the default is 4 pages, but it can be changed on mixin/resource-fetch.js
206
+ let pageFetchOpts;
207
+
203
208
  if (opt.incremental) {
204
209
  commit('incrementLoadCounter', type);
205
210
 
@@ -207,7 +212,7 @@ export default {
207
212
  dispatch('resource-fetch/updateManualRefreshIsLoading', true, { root: true });
208
213
  }
209
214
 
210
- const pageFetchOpts = {
215
+ pageFetchOpts = {
211
216
  ...opt,
212
217
  url: addParam(opt.url, 'limit', `${ opt.incremental }`),
213
218
  };
@@ -223,8 +228,6 @@ export default {
223
228
  if (opt.force) {
224
229
  commit('forgetType', type);
225
230
  }
226
-
227
- dispatch('loadDataPage', { type, opt: pageFetchOpts });
228
231
  }
229
232
 
230
233
  let streamStarted = false;
@@ -313,12 +316,25 @@ export default {
313
316
  commit('loadAll', {
314
317
  ctx,
315
318
  type,
316
- data: out.data,
317
- revision: out.revision,
319
+ data: out.data,
320
+ revision: out.revision,
318
321
  skipHaveAll,
319
- namespace: opt.namespaced
322
+ namespace: opt.namespaced,
323
+ pagination: opt.pagination ? {
324
+ request: opt.pagination,
325
+ result: {
326
+ count: out.count,
327
+ pages: out.pages,
328
+ timestamp: new Date().getTime()
329
+ }
330
+ } : undefined,
320
331
  });
321
332
  }
333
+
334
+ if (opt.incremental) {
335
+ // This needs to come after the loadAll (which resets state) so supplements via loadDataPage aren't lost
336
+ dispatch('loadDataPage', { type, opt: pageFetchOpts });
337
+ }
322
338
  }
323
339
 
324
340
  // ToDo: SM if we start a "bigger" watch (such as watch without a namespace vs a watch with a namespace), we should stop the stop the "smaller" watch so we don't have duplicate events coming back
@@ -345,6 +361,81 @@ export default {
345
361
  return all;
346
362
  },
347
363
 
364
+ /**
365
+ *
366
+ * @param {*} ctx
367
+ * @param { {type: string, opt: FindPageOpt} } opt
368
+ */
369
+ async findPage(ctx, { type, opt }) {
370
+ const { getters, commit, dispatch } = ctx;
371
+
372
+ opt = opt || {};
373
+
374
+ if (!opt.pagination) {
375
+ console.error('Attempting to find a page for a resource but no pagination settings supplied', type); // eslint-disable-line no-console
376
+
377
+ return;
378
+ }
379
+
380
+ type = getters.normalizeType(type);
381
+
382
+ if ( !getters.typeRegistered(type) ) {
383
+ commit('registerType', type);
384
+ }
385
+
386
+ // No need to request the resources if we have them already
387
+ if (!opt.force && getters['havePaginatedPage'](type, opt)) {
388
+ return findAllGetter(getters, type, opt);
389
+ }
390
+
391
+ console.log(`Find Page: [${ ctx.state.config.namespace }] ${ type }. Page: ${ opt.pagination.page }. Size: ${ opt.pagination.pageSize }`); // eslint-disable-line no-console
392
+ opt = opt || {};
393
+ opt.url = getters.urlFor(type, null, opt);
394
+
395
+ let out;
396
+
397
+ try {
398
+ if (opt.hasManualRefresh) {
399
+ dispatch('resource-fetch/updateManualRefreshIsLoading', true, { root: true });
400
+ }
401
+
402
+ out = await dispatch('request', { opt, type });
403
+ } catch (e) {
404
+ if (opt.hasManualRefresh) {
405
+ dispatch('resource-fetch/updateManualRefreshIsLoading', false, { root: true });
406
+ }
407
+
408
+ return Promise.reject(e);
409
+ }
410
+
411
+ commit('loadPage', {
412
+ ctx,
413
+ type,
414
+ data: out.data,
415
+ pagination: opt.pagination ? {
416
+ request: {
417
+ namespace: opt.namespaced,
418
+ pagination: opt.pagination
419
+ },
420
+ result: {
421
+ count: out.count,
422
+ pages: out.pages,
423
+ timestamp: new Date().getTime()
424
+ }
425
+ } : undefined,
426
+ });
427
+
428
+ const all = findAllGetter(getters, type, opt);
429
+
430
+ if (opt.hasManualRefresh) {
431
+ dispatch('resource-fetch/updateManualRefreshIsLoading', false, { root: true });
432
+ }
433
+
434
+ garbageCollect.gcUpdateLastAccessed(ctx, type);
435
+
436
+ return all;
437
+ },
438
+
348
439
  async findMatching(ctx, {
349
440
  type,
350
441
  selector,
@@ -371,7 +462,7 @@ export default {
371
462
  opt = opt || {};
372
463
  opt.labelSelector = selector;
373
464
  opt.url = getters.urlFor(type, null, opt);
374
- opt.depaginate = typeOptions?.depaginate;
465
+ opt.depaginate = conditionalDepaginate(typeOptions?.depaginate, { ctx, args: { type, opt } });
375
466
 
376
467
  const res = await dispatch('request', { opt, type });
377
468
 
@@ -443,8 +534,13 @@ export default {
443
534
  const watchMsg = {
444
535
  type,
445
536
  id,
446
- revision: res?.metadata?.resourceVersion,
447
- force: opt.forceWatch === true,
537
+ // Although not used by sockets, we need this for when resyncWatch calls find... which needs namespace to construct the url
538
+ namespace: opt.namespaced,
539
+ // Override the revision. Used in cases where we need to avoid using the resource's own revision which would be `too old`.
540
+ // For the above case opt.revision will be `null`. If left as `undefined` the subscribe mechanism will try to determine a revision
541
+ // from resources in store (which would be this one, with the too old revision)
542
+ revision: typeof opt.revision !== 'undefined' ? opt.revision : res?.metadata?.resourceVersion,
543
+ force: opt.forceWatch === true,
448
544
  };
449
545
 
450
546
  const idx = id.indexOf('/');
@@ -543,8 +639,18 @@ export default {
543
639
  return data.map((d) => classify(ctx, d));
544
640
  },
545
641
 
546
- createPopulated(ctx, userData) {
547
- const data = ctx.getters['defaultFor'](userData.type);
642
+ async createPopulated(ctx, userData) {
643
+ let data = null;
644
+
645
+ const schema = ctx.getters['schemaFor'](userData.type);
646
+
647
+ if (schema) {
648
+ if (schema.fetchResourceFields) {
649
+ // fetch resourceFields for createYaml
650
+ await schema.fetchResourceFields();
651
+ }
652
+ data = ctx.getters['defaultFor'](userData.type, schema);
653
+ }
548
654
 
549
655
  merge(data, userData);
550
656
 
@@ -613,7 +719,9 @@ export default {
613
719
  let schema = null;
614
720
 
615
721
  while (!schema && tries > 0) {
616
- schema = getters['schemaFor'](type);
722
+ // Schemas may not have been loaded, so don't error out if they are not loaded yet
723
+ // the wait here will wait for schemas to load and then for the desired schema to be available
724
+ schema = getters['schemaFor'](type, false, false);
617
725
 
618
726
  if (!schema) {
619
727
  if (tries === RETRY_LOG) {
@@ -3,21 +3,22 @@ import { SCHEMA, COUNT } from '@shell/config/types';
3
3
 
4
4
  import { matches } from '@shell/utils/selector';
5
5
  import { typeMunge, typeRef, SIMPLE_TYPES } from '@shell/utils/create-yaml';
6
- import { splitObjectPath } from '@shell/utils/string';
7
- import { parseType } from '@shell/models/schema';
8
6
  import Resource from '@shell/plugins/dashboard-store/resource-class';
9
7
  import mutations from './mutations';
10
8
  import { keyFieldFor, normalizeType } from './normalize';
11
9
  import { lookup } from './model-loader';
12
10
  import garbageCollect from '@shell/utils/gc/gc';
11
+ import paginationUtils from '@shell/utils/pagination-utils';
13
12
 
14
13
  export const urlFor = (state, getters) => (type, id, opt) => {
15
14
  opt = opt || {};
16
15
  type = getters.normalizeType(type);
17
16
  let url = opt.url;
18
17
 
18
+ let schema;
19
+
19
20
  if ( !url ) {
20
- const schema = getters.schemaFor(type);
21
+ schema = getters.schemaFor(type);
21
22
 
22
23
  if ( !schema ) {
23
24
  throw new Error(`Unknown schema for type: ${ type }`);
@@ -40,7 +41,7 @@ export const urlFor = (state, getters) => (type, id, opt) => {
40
41
  url = `${ baseUrl }/${ url }`;
41
42
  }
42
43
 
43
- url = getters.urlOptions(url, opt);
44
+ url = getters.urlOptions(url, opt, schema);
44
45
 
45
46
  return url;
46
47
  };
@@ -70,6 +71,9 @@ function matchingCounts(typeObj, namespaces) {
70
71
 
71
72
  export default {
72
73
 
74
+ /**
75
+ * Get all entries in the store. This might not mean all entries of this type
76
+ */
73
77
  all: (state, getters, rootState) => (type) => {
74
78
  type = getters.normalizeType(type);
75
79
 
@@ -122,30 +126,13 @@ export default {
122
126
  }
123
127
  },
124
128
 
129
+ /**
130
+ * Checks a schema for the given path
131
+ *
132
+ * Given that schema are primarily a rancher thing most logic is in the `steve` store
133
+ */
125
134
  pathExistsInSchema: (state, getters) => (type, path) => {
126
- let schema = getters.schemaFor(type);
127
- const parts = splitObjectPath(path);
128
-
129
- while ( parts.length ) {
130
- const key = parts.shift();
131
-
132
- type = schema.resourceFields?.[key]?.type;
133
-
134
- if ( !type ) {
135
- return false;
136
- }
137
-
138
- if ( parts.length ) {
139
- type = parseType(type).pop(); // Get the main part of array[map[something]] => something
140
- schema = getters.schemaFor(type);
141
-
142
- if ( !schema ) {
143
- return false;
144
- }
145
- }
146
- }
147
-
148
- return true;
135
+ return false;
149
136
  },
150
137
 
151
138
  // @TODO resolve difference between this and schemaFor and have only one of them.
@@ -216,17 +203,28 @@ export default {
216
203
  return out;
217
204
  },
218
205
 
219
- defaultFor: (state, getters) => (type) => {
220
- const schema = getters['schemaFor'](type);
206
+ defaultFor: (state, getters) => (type, rootSchema, schemaDefinitions = null) => {
207
+ let resourceFields;
221
208
 
222
- if ( !schema ) {
223
- return null;
209
+ if (!schemaDefinitions) {
210
+ // Depth 0. Get the schemaDefinitions that will contain the child schema resourceFields for recursive calls
211
+
212
+ schemaDefinitions = rootSchema.schemaDefinitions || {}; // norman...
213
+ resourceFields = rootSchema.resourceFields || {};
214
+ } else {
215
+ if (rootSchema.requiresResourceFields) {
216
+ resourceFields = schemaDefinitions[type]?.resourceFields || {};
217
+ } else {
218
+ const schema = getters['schemaFor'](type);
219
+
220
+ resourceFields = schema?.resourceFields || {};
221
+ }
224
222
  }
225
223
 
226
224
  const out = {};
227
225
 
228
- for ( const key in schema.resourceFields ) {
229
- const field = schema.resourceFields[key];
226
+ for ( const key in resourceFields ) {
227
+ const field = resourceFields[key];
230
228
 
231
229
  if ( !field ) {
232
230
  // Not much to do here...
@@ -234,12 +232,12 @@ export default {
234
232
  }
235
233
 
236
234
  const type = typeMunge(field.type);
237
- const mapOf = typeRef('map', type);
238
- const arrayOf = typeRef('array', type);
235
+ const mapOf = typeRef('map', type, field);
236
+ const arrayOf = typeRef('array', type, field);
239
237
  const referenceTo = typeRef('reference', type);
240
238
 
241
239
  if ( mapOf || type === 'map' || type === 'json' ) {
242
- out[key] = getters.defaultFor(type);
240
+ out[key] = getters.defaultFor(type, rootSchema, schemaDefinitions);
243
241
  } else if ( arrayOf || type === 'array' ) {
244
242
  out[key] = [];
245
243
  } else if ( referenceTo ) {
@@ -251,7 +249,7 @@ export default {
251
249
  out[key] = field['default'];
252
250
  }
253
251
  } else {
254
- out[key] = getters.defaultFor(type);
252
+ out[key] = getters.defaultFor(type, rootSchema, schemaDefinitions);
255
253
  }
256
254
  }
257
255
 
@@ -302,12 +300,39 @@ export default {
302
300
  return false;
303
301
  },
304
302
 
303
+ havePaginatedPage: (state, getters) => (type, opt) => {
304
+ if (!opt.pagination) {
305
+ return false;
306
+ }
307
+
308
+ type = getters.normalizeType(type);
309
+ const entry = state.types[type];
310
+
311
+ if ( entry?.havePage ) {
312
+ const { namespace: aNamespace = undefined, pagination: aPagination } = entry.havePage.request;
313
+ const { namespace: bNamespace = undefined, pagination: bPagination } = {
314
+ namespace: opt.namespaced,
315
+ pagination: opt.pagination
316
+ };
317
+
318
+ return entry.havePage && aNamespace === bNamespace && paginationUtils.paginationEqual(aPagination, bPagination);
319
+ }
320
+
321
+ return false;
322
+ },
323
+
305
324
  haveNamespace: (state, getters) => (type) => {
306
325
  type = getters.normalizeType(type);
307
326
 
308
327
  return state.types[type]?.haveNamespace || null;
309
328
  },
310
329
 
330
+ havePage: (state, getters) => (type) => {
331
+ type = getters.normalizeType(type);
332
+
333
+ return state.types[type]?.havePage || null;
334
+ },
335
+
311
336
  haveSelector: (state, getters) => (type, selector) => {
312
337
  type = getters.normalizeType(type);
313
338
  const entry = state.types[type];
@@ -329,7 +354,7 @@ export default {
329
354
 
330
355
  urlFor,
331
356
 
332
- urlOptions: () => (url, opt) => {
357
+ urlOptions: () => (url, opt, schema) => {
333
358
  return url;
334
359
  },
335
360
 
@@ -375,6 +400,10 @@ export default {
375
400
  *
376
401
  * This takes into account if the type is namespaced.
377
402
  *
403
+ * Used in currently two places
404
+ * - Type
405
+ * - getTree
406
+ *
378
407
  * @param typeObj see inners for properties. must have at least `name` (resource type)
379
408
  *
380
409
  */
@@ -391,6 +420,7 @@ export default {
391
420
  const counts = getters.all(COUNT)?.[0]?.counts || {};
392
421
  const count = counts[type];
393
422
 
423
+ // This object aligns with `Type.vue` `type`
394
424
  _typeObj = {
395
425
  count: count ? count.summary.count || 0 : null,
396
426
  byNamespace: count ? count.namespaces : {},
@@ -399,9 +429,26 @@ export default {
399
429
  };
400
430
  }
401
431
 
402
- const namespaces = Object.keys(rootGetters.activeNamespaceCache || {});
432
+ const namespaces = _typeObj?.namespaced ? Object.keys(rootGetters.activeNamespaceCache || {}) : [];
403
433
 
404
434
  return matchingCounts(_typeObj, namespaces.length ? namespaces : null);
405
435
  },
406
436
 
437
+ generation: (state, getters) => (type) => {
438
+ type = getters.normalizeType(type);
439
+ const entry = state.types[type];
440
+
441
+ if ( entry ) {
442
+ return entry.generation;
443
+ }
444
+
445
+ return undefined;
446
+ },
447
+
448
+ paginationEnabled: (state, getters, rootState, rootGetters) => (type = null) => {
449
+ const store = state.config.namespace;
450
+ const resource = type ? { id: type } : null;
451
+
452
+ return paginationUtils.isEnabled({ rootGetters }, { store, resource });
453
+ }
407
454
  };
@@ -1,7 +1,3 @@
1
- import Vue from 'vue';
2
-
3
- import { isArray } from '@shell/utils/array';
4
- import { classify } from '@shell/plugins/dashboard-store/classify';
5
1
  import actions from './actions';
6
2
  import getters from './getters';
7
3
  import mutations from './mutations';
@@ -37,7 +33,6 @@ export default (vuexModule, config, init) => {
37
33
  store.commit(`${ namespace }/applyConfig`, config);
38
34
 
39
35
  const module = store._modules.root._children[namespace];
40
- const fromServer = window.__NUXT__;
41
36
 
42
37
  const ctx = new Proxy(module.context, {
43
38
  get(obj, key) {
@@ -52,99 +47,5 @@ export default (vuexModule, config, init) => {
52
47
  if (init) {
53
48
  init(store, ctx);
54
49
  }
55
-
56
- // Turn all the objects in the store from the server into proxies
57
- const state = fromServer?.state?.[namespace];
58
-
59
- if ( state ) {
60
- Object.keys(state.types).forEach((type) => {
61
- const keyField = store.getters[`${ namespace }/keyFieldForType`](type);
62
- const cache = state.types[type];
63
- const map = new Map();
64
-
65
- for ( let i = 0 ; i < cache.list.length ; i++ ) {
66
- const proxy = classify(ctx, cache.list[i]);
67
-
68
- cache.list[i] = proxy;
69
- map.set(proxy[keyField], proxy);
70
- }
71
-
72
- Vue.set(cache, 'map', map);
73
- Vue.set(state.types, type, state.types[type]);
74
- });
75
- }
76
-
77
- // Turn all the objects in data from the server into the object from the store;
78
- if ( state && fromServer?.data ) {
79
- fromServer.data = recurse(fromServer.data);
80
- }
81
-
82
- if ( state && fromServer?.fetch ) {
83
- fromServer.fetch = recurse(fromServer.fetch);
84
- }
85
-
86
- function recurse(obj, parent, key) {
87
- if ( isArray(obj) ) {
88
- const rehydrateKey = `__rehydrateAll__${ key }`;
89
-
90
- if ( parent && key && parent[rehydrateKey] ) {
91
- const [ns, type] = parent[rehydrateKey].split('/', 2);
92
-
93
- if ( ns === namespace ) {
94
- // Don't delete the key, so that all the stores go through this path,
95
- // and then do nothing if they are not for this namespace,
96
- // instead of doing the else obj.map()
97
- // and breaking the "live" reference to the cache.list array
98
- // delete parent[rehydrateKey];
99
-
100
- const cache = state.types[type];
101
-
102
- if ( cache ) {
103
- return cache.list;
104
- }
105
- }
106
- } else {
107
- return obj.map((x) => recurse(x));
108
- }
109
- } else if ( obj && typeof obj === 'object' ) {
110
- if ( obj.__rehydrate ) {
111
- if ( obj.__rehydrate !== namespace ) {
112
- // Ignore types that are for another vuex namespace
113
- return obj;
114
- }
115
-
116
- const type = obj.type;
117
- const cache = state.types[type];
118
-
119
- if ( cache && !obj.__clone ) {
120
- const map = cache.map;
121
- const keyField = store.getters[`${ namespace }/keyFieldForType`](type);
122
- const entry = map.get(obj[keyField]);
123
-
124
- // Map the object to the same instance in the store if possible
125
- if ( entry ) {
126
- return entry;
127
- }
128
- }
129
-
130
- // Or just return a proxied object
131
- delete obj.__rehydrate;
132
-
133
- return classify(ctx, obj);
134
- } else {
135
- for ( const k of Object.keys(obj) ) {
136
- if ( k.startsWith('__rehydrateAll__') ) {
137
- continue;
138
- }
139
-
140
- if ( isArray(obj[k]) || typeof obj[k] === 'object' ) {
141
- obj[k] = recurse(obj[k], obj, k);
142
- }
143
- }
144
- }
145
- }
146
-
147
- return obj;
148
- }
149
50
  };
150
51
  };