@rancher/shell 1.2.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (689) hide show
  1. package/assets/data/aws-regions.json +9 -0
  2. package/assets/images/vendor/openid.svg +18 -0
  3. package/assets/styles/app.scss +1 -2
  4. package/assets/styles/fonts/_icons.scss +3 -3
  5. package/assets/styles/global/_columns.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +1 -0
  7. package/assets/styles/global/_layout.scss +99 -0
  8. package/assets/styles/themes/_csp.scss +2 -2
  9. package/assets/styles/themes/_dark.scss +8 -2
  10. package/assets/styles/themes/_light.scss +2 -1
  11. package/assets/styles/themes/_suse.scss +1 -1
  12. package/assets/styles/vendor/vue-select.scss +5 -0
  13. package/assets/translations/en-us.yaml +299 -63
  14. package/assets/translations/zh-hans.yaml +7 -31
  15. package/babel.config.js +8 -2
  16. package/chart/__tests__/S3.test.ts +9 -2
  17. package/chart/gatekeeper.vue +2 -11
  18. package/chart/istio.vue +1 -10
  19. package/chart/logging/index.vue +2 -11
  20. package/chart/monitoring/alerting/index.vue +7 -21
  21. package/chart/monitoring/grafana/index.vue +61 -2
  22. package/chart/monitoring/index.vue +52 -26
  23. package/chart/monitoring/prometheus/index.vue +39 -45
  24. package/chart/rancher-backup/S3.vue +11 -9
  25. package/chart/rancher-backup/index.vue +18 -15
  26. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  27. package/cloud-credential/azure.vue +4 -17
  28. package/cloud-credential/generic.vue +18 -9
  29. package/cloud-credential/harvester.vue +11 -3
  30. package/components/AppModal.vue +167 -0
  31. package/components/AssignTo.vue +7 -4
  32. package/components/AsyncButton.vue +27 -5
  33. package/components/BackLink.vue +4 -4
  34. package/components/BannerGraphic.vue +1 -0
  35. package/components/BrandImage.vue +47 -1
  36. package/components/Carousel.vue +15 -8
  37. package/components/Certificates.vue +161 -0
  38. package/components/ClusterBadge.vue +12 -3
  39. package/components/ClusterIconMenu.vue +55 -12
  40. package/components/ClusterProviderIcon.vue +14 -3
  41. package/components/CodeMirror.vue +111 -17
  42. package/components/CommunityLinks.vue +12 -8
  43. package/components/CopyCode.vue +6 -2
  44. package/components/CopyToClipboard.vue +2 -1
  45. package/components/CopyToClipboardText.vue +14 -9
  46. package/components/CreateDriver.vue +81 -0
  47. package/components/CruResource.vue +52 -27
  48. package/components/DetailTop.vue +2 -2
  49. package/components/Dialog.vue +6 -5
  50. package/components/DisableAuthProviderModal.vue +14 -8
  51. package/components/DraggableZone.vue +2 -2
  52. package/components/EtcdInfoBanner.vue +5 -5
  53. package/components/ExplorerMembers.vue +3 -3
  54. package/components/ExplorerProjectsNamespaces.vue +31 -7
  55. package/components/FixedBanner.vue +48 -36
  56. package/components/GlobalRoleBindings.vue +26 -0
  57. package/components/IconOrSvg.vue +1 -1
  58. package/components/Import.vue +10 -6
  59. package/components/Inactivity.vue +1 -5
  60. package/components/KeyValueView.vue +14 -10
  61. package/components/Markdown.vue +16 -12
  62. package/components/MessageLink.vue +2 -2
  63. package/components/ModalWithCard.vue +5 -8
  64. package/components/MoveModal.vue +35 -33
  65. package/components/PodSecurityAdmission.vue +3 -3
  66. package/components/PromptChangePassword.vue +33 -33
  67. package/components/PromptModal.vue +11 -21
  68. package/components/PromptRemove.vue +11 -17
  69. package/components/PromptRestore.vue +18 -16
  70. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  71. package/components/Questions/__tests__/Float.test.ts +9 -19
  72. package/components/Questions/__tests__/Int.test.ts +9 -19
  73. package/components/Questions/__tests__/String.test.ts +9 -19
  74. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  75. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  76. package/components/Questions/index.vue +19 -3
  77. package/components/ResourceCancelModal.vue +34 -29
  78. package/components/ResourceDetail/Masthead.vue +48 -16
  79. package/components/ResourceDetail/index.vue +6 -4
  80. package/components/ResourceList/Masthead.vue +10 -9
  81. package/components/ResourceList/index.vue +65 -14
  82. package/components/ResourceTable.vue +87 -21
  83. package/components/ResourceYaml.vue +35 -5
  84. package/components/SelectIconGrid.vue +3 -3
  85. package/components/SideNav.vue +50 -94
  86. package/components/SingleClusterInfo.vue +4 -4
  87. package/components/SortableTable/THead.vue +33 -21
  88. package/components/SortableTable/filtering.js +9 -1
  89. package/components/SortableTable/grouping.js +8 -1
  90. package/components/SortableTable/index.vue +143 -44
  91. package/components/SortableTable/paging.js +36 -7
  92. package/components/SortableTable/selection.js +2 -1
  93. package/components/SortableTable/sorting.js +24 -7
  94. package/components/StatusTable.vue +5 -1
  95. package/components/Tabbed/index.vue +18 -1
  96. package/components/TableDataUserIcon.vue +47 -0
  97. package/components/TypeDescription.vue +1 -0
  98. package/components/Wizard.vue +1 -0
  99. package/components/YamlEditor.vue +1 -0
  100. package/components/__tests__/AppModal.test.ts +98 -0
  101. package/components/__tests__/AsyncButton.test.ts +1 -3
  102. package/components/__tests__/BackLink.test.ts +1 -1
  103. package/components/__tests__/ButtonGroup.test.ts +3 -6
  104. package/components/__tests__/Carousel.test.ts +43 -0
  105. package/components/__tests__/Certificates.test.ts +29 -0
  106. package/components/__tests__/CodeMirror.test.ts +87 -0
  107. package/components/__tests__/CopyCode.test.ts +5 -4
  108. package/components/__tests__/CruResource.test.ts +10 -9
  109. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  110. package/components/__tests__/FixedBanner.test.ts +5 -20
  111. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  112. package/components/__tests__/TabTitle.test.ts +129 -0
  113. package/components/auth/AzureWarning.vue +2 -2
  114. package/components/auth/RoleDetailEdit.vue +10 -0
  115. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  116. package/components/auth/login/oidc.vue +7 -1
  117. package/components/fleet/FleetBundles.vue +5 -11
  118. package/components/fleet/FleetClusters.vue +9 -9
  119. package/components/fleet/FleetIntro.vue +11 -17
  120. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  121. package/components/fleet/FleetRepos.vue +63 -27
  122. package/components/fleet/FleetResources.vue +6 -1
  123. package/components/fleet/FleetStatus.vue +3 -3
  124. package/components/fleet/FleetSummary.vue +35 -30
  125. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  126. package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
  127. package/components/form/ArrayList.vue +22 -18
  128. package/components/form/ArrayListSelect.vue +5 -0
  129. package/components/form/BannerSettings.vue +3 -0
  130. package/components/form/ClusterAppearance.vue +132 -0
  131. package/components/form/ColorInput.vue +1 -0
  132. package/components/form/Error.vue +3 -3
  133. package/components/form/FileSelector.vue +1 -0
  134. package/components/form/Footer.vue +2 -2
  135. package/components/form/GitPicker.vue +83 -38
  136. package/components/form/KeyValue.vue +69 -48
  137. package/components/form/LabeledSelect.vue +145 -41
  138. package/components/form/Labels.vue +3 -1
  139. package/components/form/NameNsDescription.vue +26 -9
  140. package/components/form/Password.vue +3 -1
  141. package/components/form/ResourceLabeledSelect.vue +187 -0
  142. package/components/form/ResourceTabs/index.vue +31 -15
  143. package/components/form/SecretSelector.vue +93 -18
  144. package/components/form/SelectOrCreateAuthSecret.vue +132 -59
  145. package/components/form/SimpleSecretSelector.vue +88 -28
  146. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  147. package/components/form/__tests__/KeyValue.test.ts +120 -11
  148. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  149. package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +25 -15
  150. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  151. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  152. package/components/formatter/AppSummaryGraph.vue +2 -2
  153. package/components/formatter/Checked.vue +11 -3
  154. package/components/formatter/CloudCredPublicData.vue +30 -0
  155. package/components/formatter/ClusterLink.vue +2 -2
  156. package/components/formatter/ClusterProvider.vue +1 -18
  157. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  158. package/components/formatter/FleetSummaryGraph.vue +25 -12
  159. package/components/formatter/ImagePercentageBar.vue +0 -4
  160. package/components/formatter/IngressTarget.vue +18 -7
  161. package/components/formatter/Link.vue +2 -2
  162. package/components/formatter/LinkDetail.vue +2 -2
  163. package/components/formatter/LinkDetailImage.vue +2 -2
  164. package/components/formatter/LinkName.vue +2 -2
  165. package/components/formatter/LiveDuration.vue +1 -1
  166. package/components/formatter/PercentageBar.vue +1 -1
  167. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  168. package/components/formatter/SecretType.vue +2 -2
  169. package/components/formatter/VirtualServiceGateways.vue +2 -2
  170. package/components/formatter/WorkloadDetailEndpoints.vue +12 -22
  171. package/components/formatter/__tests__/Checked.test.ts +19 -0
  172. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  173. package/components/formatter/__tests__/WorkloadDetailEndpoints.test.ts +81 -0
  174. package/components/nav/Group.vue +9 -7
  175. package/components/nav/Header.vue +84 -45
  176. package/components/nav/Jump.vue +19 -9
  177. package/components/nav/NamespaceFilter.vue +8 -1
  178. package/components/nav/TopLevelMenu.vue +391 -132
  179. package/components/nav/Type.vue +71 -106
  180. package/components/nav/WindowManager/ContainerLogs.vue +120 -19
  181. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  182. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  183. package/components/nav/WindowManager/index.vue +11 -10
  184. package/components/nav/__tests__/TopLevelMenu.test.ts +400 -6
  185. package/components/nav/__tests__/Type.test.ts +322 -97
  186. package/components/nuxt/nuxt-child.js +9 -78
  187. package/components/nuxt/nuxt-error.vue +1 -1
  188. package/components/nuxt/nuxt-link.client.js +13 -95
  189. package/{layouts → components/templates}/blank.vue +1 -1
  190. package/{layouts → components/templates}/default.vue +11 -101
  191. package/{layouts → components/templates}/error.vue +13 -26
  192. package/{layouts → components/templates}/home.vue +4 -1
  193. package/{layouts → components/templates}/plain.vue +4 -1
  194. package/{layouts → components/templates}/standalone.vue +1 -5
  195. package/{layouts → components/templates}/unauthenticated.vue +2 -3
  196. package/composables/useCompactInput.test.ts +36 -0
  197. package/composables/useCompactInput.ts +20 -0
  198. package/composables/useLabeledFormElement.test.ts +135 -0
  199. package/composables/useLabeledFormElement.ts +138 -0
  200. package/config/harvester-manager-types.js +2 -0
  201. package/config/home-links.js +2 -1
  202. package/config/labels-annotations.js +2 -1
  203. package/config/middleware.js +0 -6
  204. package/config/pagination-table-headers.js +57 -0
  205. package/config/pod-security-admission.ts +1 -1
  206. package/config/private-label.js +21 -1
  207. package/config/product/auth.js +1 -0
  208. package/config/product/explorer.js +166 -45
  209. package/config/product/fleet.js +6 -1
  210. package/config/product/legacy.js +2 -11
  211. package/config/product/manager.js +51 -25
  212. package/config/query-params.js +2 -0
  213. package/config/roles.ts +23 -0
  214. package/config/router/index.js +23 -0
  215. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  216. package/config/router/navigation-guards/authentication.js +63 -0
  217. package/config/router/navigation-guards/index.js +15 -0
  218. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  219. package/config/router/routes.js +487 -0
  220. package/config/settings.ts +31 -2
  221. package/config/store.js +8 -4
  222. package/config/system-namespaces.js +3 -0
  223. package/config/table-headers.js +66 -1
  224. package/config/types.js +35 -20
  225. package/config/uiplugins.js +10 -5
  226. package/core/plugin-helpers.js +4 -6
  227. package/core/plugin-routes.ts +56 -114
  228. package/core/plugin.ts +18 -11
  229. package/core/plugins-loader.js +7 -9
  230. package/core/plugins.js +289 -285
  231. package/core/types-provisioning.ts +7 -0
  232. package/creators/app/files/.eslintignore +0 -2
  233. package/creators/app/files/.gitlab-ci.yml +14 -0
  234. package/creators/app/files/.vscode/settings.json +0 -1
  235. package/creators/app/init +19 -0
  236. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  237. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  238. package/creators/pkg/init +32 -0
  239. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +77 -0
  240. package/detail/__tests__/service.test.ts +62 -0
  241. package/detail/catalog.cattle.io.app.vue +1 -1
  242. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  243. package/detail/fleet.cattle.io.bundle.vue +1 -1
  244. package/detail/fleet.cattle.io.cluster.vue +11 -1
  245. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  246. package/detail/namespace.vue +2 -2
  247. package/detail/networking.k8s.io.ingress.vue +52 -19
  248. package/detail/node.vue +22 -3
  249. package/detail/provisioning.cattle.io.cluster.vue +27 -9
  250. package/detail/service.vue +1 -1
  251. package/detail/workload/index.vue +1 -0
  252. package/dialog/AddCustomBadgeDialog.vue +318 -161
  253. package/dialog/DeactivateDriverDialog.vue +118 -0
  254. package/dialog/RollbackWorkloadDialog.vue +2 -2
  255. package/dialog/RotateCertificatesDialog.vue +0 -21
  256. package/dialog/ScaleMachineDownDialog.vue +34 -17
  257. package/directives/clean-html.js +15 -0
  258. package/directives/clean-tooltip.js +32 -0
  259. package/directives/focus.js +41 -0
  260. package/directives/int-number.js +21 -0
  261. package/directives/positive-int-number.js +19 -0
  262. package/directives/trim-whitespace.js +19 -0
  263. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  264. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  265. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  266. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  267. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  268. package/edit/__tests__/nodeDriver.test.ts +107 -0
  269. package/edit/__tests__/service.test.ts +85 -0
  270. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  271. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  272. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  273. package/edit/auth/__tests__/azuread.test.ts +241 -0
  274. package/edit/auth/__tests__/oidc.test.ts +137 -0
  275. package/edit/auth/azuread.vue +133 -31
  276. package/edit/auth/github.vue +5 -17
  277. package/edit/auth/googleoauth.vue +6 -23
  278. package/edit/auth/ldap/index.vue +5 -17
  279. package/edit/auth/oidc.vue +143 -42
  280. package/edit/auth/saml.vue +5 -14
  281. package/edit/catalog.cattle.io.clusterrepo.vue +177 -9
  282. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  283. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  284. package/edit/cloudcredential.vue +28 -4
  285. package/edit/configmap.vue +10 -4
  286. package/edit/fleet.cattle.io.gitrepo.vue +3 -1
  287. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  288. package/edit/kontainerDriver.vue +65 -0
  289. package/edit/logging-flow/Match.vue +10 -9
  290. package/edit/logging-flow/index.vue +4 -19
  291. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  292. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  293. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  294. package/edit/management.cattle.io.project.vue +3 -53
  295. package/edit/management.cattle.io.setting.vue +52 -2
  296. package/edit/management.cattle.io.user.vue +2 -1
  297. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  298. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  299. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +1 -1
  300. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -2
  301. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +1 -1
  302. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +15 -3
  303. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +4 -1
  304. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  305. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  306. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  307. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  308. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  309. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  310. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +46 -7
  311. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +1 -1
  312. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  313. package/edit/nodeDriver.vue +65 -0
  314. package/edit/persistentvolume/index.vue +2 -2
  315. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +33 -16
  316. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +276 -0
  317. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  318. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +3 -0
  319. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  320. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  321. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  322. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +77 -13
  323. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +391 -0
  324. package/edit/provisioning.cattle.io.cluster/import.vue +4 -4
  325. package/edit/provisioning.cattle.io.cluster/index.vue +126 -51
  326. package/edit/provisioning.cattle.io.cluster/rke2.vue +325 -791
  327. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  328. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +217 -0
  329. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +123 -129
  330. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  331. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  332. package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +1 -0
  333. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  334. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +190 -0
  335. package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +3 -0
  336. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +148 -0
  337. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  338. package/edit/resources.cattle.io.backup.vue +139 -124
  339. package/edit/resources.cattle.io.restore.vue +146 -126
  340. package/edit/service.vue +13 -0
  341. package/edit/serviceaccount.vue +46 -4
  342. package/edit/token.vue +1 -0
  343. package/edit/workload/Upgrading.vue +3 -2
  344. package/edit/workload/__tests__/Job.test.ts +1 -3
  345. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  346. package/edit/workload/index.vue +2 -1
  347. package/edit/workload/mixins/workload.js +35 -2
  348. package/edit/workload/storage/emptyDir.vue +2 -2
  349. package/initialize/App.vue +75 -0
  350. package/initialize/app-extended.js +128 -0
  351. package/initialize/entry-helpers.js +549 -0
  352. package/initialize/entry.js +32 -0
  353. package/initialize/install-components.js +23 -0
  354. package/initialize/install-directives.js +59 -0
  355. package/initialize/install-plugins.js +123 -0
  356. package/list/__tests__/workload.test.ts +1 -1
  357. package/list/catalog.cattle.io.app.vue +1 -0
  358. package/list/cis.cattle.io.clusterscan.vue +16 -10
  359. package/list/group.principal.vue +2 -2
  360. package/list/management.cattle.io.feature.vue +12 -14
  361. package/list/management.cattle.io.setting.vue +1 -0
  362. package/list/management.cattle.io.user.vue +13 -4
  363. package/list/networking.k8s.io.ingress.vue +36 -0
  364. package/list/node.vue +212 -73
  365. package/list/provisioning.cattle.io.cluster.vue +17 -4
  366. package/list/ui.cattle.io.navlink.vue +2 -2
  367. package/list/workload.vue +22 -0
  368. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  369. package/machine-config/__tests__/vmwarevsphere.test.ts +1 -3
  370. package/machine-config/amazonec2.vue +1 -1
  371. package/machine-config/azure.vue +2 -1
  372. package/machine-config/generic.vue +11 -15
  373. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  374. package/machine-config/vmwarevsphere.vue +31 -27
  375. package/middleware/authenticated.js +23 -380
  376. package/mixins/__tests__/chart.test.ts +48 -6
  377. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  378. package/mixins/auth-config.js +5 -9
  379. package/mixins/brand.js +102 -96
  380. package/mixins/chart.js +27 -13
  381. package/mixins/create-edit-view/index.js +2 -2
  382. package/mixins/fetch.client.js +42 -48
  383. package/mixins/labeled-form-element.ts +27 -2
  384. package/mixins/page-actions.js +7 -5
  385. package/mixins/resource-fetch-api-pagination.js +304 -0
  386. package/mixins/resource-fetch-namespaced.js +1 -1
  387. package/mixins/resource-fetch.js +46 -5
  388. package/models/__tests__/cluster.test.ts +44 -0
  389. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  390. package/models/__tests__/management.cattle.io.cluster.test.ts +23 -0
  391. package/models/__tests__/management.cattle.io.node.ts +85 -0
  392. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  393. package/models/__tests__/namespace.test.ts +49 -9
  394. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +241 -0
  395. package/models/__tests__/schema.tests.ts +24 -0
  396. package/models/__tests__/secret.test.ts +37 -0
  397. package/models/__tests__/steve-schema.test.ts +73 -0
  398. package/models/__tests__/storage.k8s.io.storageclass.test.ts +22 -0
  399. package/models/__tests__/workload.test.ts +91 -0
  400. package/models/catalog.cattle.io.app.js +8 -0
  401. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  402. package/models/catalog.cattle.io.uiplugin.js +7 -8
  403. package/models/cis.cattle.io.clusterscan.js +29 -8
  404. package/models/cloudcredential.js +9 -1
  405. package/models/cluster/node.js +8 -4
  406. package/models/cluster/schema.js +6 -0
  407. package/models/cluster.js +33 -0
  408. package/models/cluster.x-k8s.io.machine.js +1 -1
  409. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  410. package/models/driver.js +62 -0
  411. package/models/fleet.cattle.io.cluster.js +27 -11
  412. package/models/fleet.cattle.io.gitrepo.js +66 -13
  413. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  414. package/models/kontainerdriver.js +68 -0
  415. package/models/management/schema.js +6 -0
  416. package/models/management.cattle.io.authconfig.js +3 -2
  417. package/models/management.cattle.io.cluster.js +16 -7
  418. package/models/management.cattle.io.globalrole.js +2 -0
  419. package/models/management.cattle.io.kontainerdriver.js +1 -0
  420. package/models/management.cattle.io.node.js +18 -14
  421. package/models/management.cattle.io.nodepool.js +17 -0
  422. package/models/management.cattle.io.project.js +0 -36
  423. package/models/management.cattle.io.setting.js +11 -7
  424. package/models/management.cattle.io.user.js +2 -2
  425. package/models/monitoring.coreos.com.receiver.js +3 -1
  426. package/models/monitoring.coreos.com.route.js +1 -1
  427. package/models/namespace.js +1 -1
  428. package/models/networking.k8s.io.ingress.js +2 -1
  429. package/models/nodedriver.js +68 -0
  430. package/models/pod.js +20 -0
  431. package/models/provisioning.cattle.io.cluster.js +125 -10
  432. package/models/schema.js +28 -7
  433. package/models/secret.js +126 -18
  434. package/models/service.js +2 -0
  435. package/models/steve-schema.ts +254 -0
  436. package/models/storage.k8s.io.storageclass.js +1 -1
  437. package/models/workload.js +17 -0
  438. package/models/workload.service.js +18 -0
  439. package/package.json +17 -14
  440. package/pages/about.vue +12 -6
  441. package/pages/account/create-key.vue +0 -1
  442. package/pages/account/index.vue +7 -3
  443. package/pages/auth/login.vue +106 -103
  444. package/pages/auth/logout.vue +2 -4
  445. package/pages/auth/setup.vue +92 -66
  446. package/pages/auth/verify.vue +30 -24
  447. package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +2 -17
  448. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  449. package/pages/c/_cluster/apps/charts/index.vue +99 -69
  450. package/pages/c/_cluster/apps/charts/install.helpers.js +2 -13
  451. package/pages/c/_cluster/apps/charts/install.vue +9 -9
  452. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  453. package/pages/c/_cluster/auth/config/index.vue +15 -9
  454. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  455. package/pages/c/_cluster/ecm/index.vue +0 -2
  456. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  457. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  458. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  459. package/pages/c/_cluster/explorer/index.vue +253 -91
  460. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  461. package/pages/c/_cluster/explorer/tools/index.vue +10 -6
  462. package/pages/c/_cluster/fleet/index.vue +89 -94
  463. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  464. package/pages/c/_cluster/longhorn/index.vue +52 -17
  465. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  466. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  467. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  468. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +94 -0
  469. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  470. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  471. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +63 -0
  472. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  473. package/pages/c/_cluster/manager/pages/_page.vue +4 -5
  474. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  475. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  476. package/pages/c/_cluster/neuvector/index.vue +1 -0
  477. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  478. package/pages/c/_cluster/settings/banners.vue +86 -10
  479. package/pages/c/_cluster/settings/brand.vue +261 -38
  480. package/pages/c/_cluster/settings/index.vue +4 -6
  481. package/pages/c/_cluster/settings/links.vue +3 -2
  482. package/pages/c/_cluster/settings/performance.vue +71 -3
  483. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  484. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +12 -8
  485. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  486. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  487. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  488. package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
  489. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  490. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  491. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  492. package/pages/c/_cluster/uiplugins/index.vue +38 -54
  493. package/pages/diagnostic.vue +2 -2
  494. package/pages/fail-whale.vue +103 -42
  495. package/pages/home.vue +81 -24
  496. package/pages/prefs.vue +8 -4
  497. package/pages/support/index.vue +14 -10
  498. package/pkg/auto-import.js +1 -1
  499. package/plugins/axios.js +0 -36
  500. package/plugins/back-button.js +3 -5
  501. package/plugins/clean-html-directive.js +5 -30
  502. package/plugins/clean-html.js +53 -0
  503. package/plugins/clean-tooltip-directive.js +6 -31
  504. package/plugins/codemirror-loader.js +1 -1
  505. package/plugins/codemirror.js +41 -9
  506. package/plugins/dashboard-store/__tests__/mutations.test.ts +389 -0
  507. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  508. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  509. package/plugins/dashboard-store/actions.js +132 -25
  510. package/plugins/dashboard-store/classify.js +1 -18
  511. package/plugins/dashboard-store/getters.js +154 -44
  512. package/plugins/dashboard-store/index.js +0 -111
  513. package/plugins/dashboard-store/mutations.js +150 -52
  514. package/plugins/dashboard-store/resource-class.js +77 -127
  515. package/plugins/directives.js +6 -39
  516. package/plugins/ember-cookie.js +13 -0
  517. package/plugins/global-formatters.js +26 -5
  518. package/plugins/i18n.js +89 -55
  519. package/plugins/int-number.js +6 -20
  520. package/plugins/plugin.js +3 -3
  521. package/plugins/positive-int-number.js +6 -17
  522. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +81 -10
  523. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  524. package/plugins/steve/__tests__/resource-utils.test.ts +159 -0
  525. package/plugins/steve/__tests__/steve-class.test.ts +59 -0
  526. package/plugins/steve/__tests__/subscribe.spec.ts +4 -1
  527. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  528. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  529. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  530. package/plugins/steve/actions.js +3 -38
  531. package/plugins/steve/getters.js +164 -61
  532. package/plugins/steve/hybrid-class.js +5 -1
  533. package/plugins/steve/mutations.js +24 -3
  534. package/plugins/steve/norman-class.js +142 -2
  535. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  536. package/plugins/steve/resource-utils.ts +38 -0
  537. package/plugins/steve/schema.d.ts +22 -0
  538. package/plugins/steve/steve-class.js +22 -0
  539. package/plugins/steve/steve-pagination-utils.ts +368 -0
  540. package/plugins/steve/subscribe.js +17 -76
  541. package/plugins/trim-whitespace.js +6 -34
  542. package/plugins/vue-js-modal.js +1 -1
  543. package/public/index.html +1 -0
  544. package/rancher-components/Form/LabeledInput/LabeledInput.vue +13 -8
  545. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  546. package/rancher-components/components/Banner/Banner.test.ts +1 -5
  547. package/rancher-components/components/Banner/Banner.vue +2 -2
  548. package/rancher-components/components/Card/Card.vue +4 -4
  549. package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
  550. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  551. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +57 -24
  552. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
  553. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  554. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  555. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  556. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  557. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  558. package/rancher-components/components/StringList/StringList.test.ts +270 -0
  559. package/rancher-components/components/StringList/StringList.vue +65 -26
  560. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +69 -0
  561. package/scripts/clean +1 -1
  562. package/scripts/extension/bundle +19 -7
  563. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  564. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  565. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  566. package/scripts/extension/helm/package/Dockerfile +1 -1
  567. package/scripts/extension/helm/scripts/package +11 -3
  568. package/scripts/extension/helm/scripts/patch +27 -0
  569. package/scripts/extension/parse-tag-name +4 -4
  570. package/scripts/extension/publish +25 -14
  571. package/scripts/publish-shell.sh +11 -1
  572. package/scripts/serve-pkgs +0 -2
  573. package/scripts/test-plugins-build.sh +87 -11
  574. package/scripts/vue-migrate.js +683 -0
  575. package/server/har-file.js +183 -0
  576. package/store/__tests__/catalog.test.ts +224 -0
  577. package/store/__tests__/type-map.test.ts +1122 -0
  578. package/store/auth.js +23 -4
  579. package/store/aws.js +53 -6
  580. package/store/catalog.js +22 -6
  581. package/store/cru-resource.ts +26 -0
  582. package/store/customisation.js +35 -0
  583. package/store/features.js +7 -4
  584. package/store/i18n.js +11 -0
  585. package/store/index.js +139 -48
  586. package/store/plugins.js +8 -4
  587. package/store/prefs.js +33 -38
  588. package/store/type-map.js +288 -213
  589. package/store/type-map.utils.ts +226 -0
  590. package/tsconfig.json +34 -9
  591. package/tsconfig.paths.json +21 -0
  592. package/types/components/labeledSelect.ts +50 -0
  593. package/types/resources/settings.d.ts +32 -0
  594. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  595. package/types/shell/index.d.ts +1042 -767
  596. package/types/store/dashboard-store.types.ts +42 -0
  597. package/types/store/pagination.types.ts +457 -0
  598. package/types/store/type-map.ts +30 -0
  599. package/types/store/vuex.d.ts +9 -0
  600. package/types/vue-shim.d.ts +51 -0
  601. package/utils/__tests__/cluster.test.ts +20 -18
  602. package/utils/__tests__/create-yaml.test.ts +359 -2
  603. package/utils/__tests__/kontainer.test.ts +92 -0
  604. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  605. package/utils/alertmanagerconfig.js +19 -0
  606. package/utils/array.ts +40 -1
  607. package/utils/async.ts +2 -0
  608. package/utils/auth.js +152 -4
  609. package/utils/axios.js +2 -21
  610. package/utils/azure.js +24 -0
  611. package/utils/banners.js +103 -0
  612. package/utils/clipboard.js +5 -0
  613. package/utils/cluster.js +1 -1
  614. package/utils/config.js +4 -0
  615. package/utils/create-yaml.js +59 -28
  616. package/utils/custom-validators.js +0 -2
  617. package/utils/error.js +41 -1
  618. package/utils/formatter.js +5 -3
  619. package/utils/git.ts +1 -1
  620. package/utils/install-redirect.js +1 -1
  621. package/utils/kontainer.ts +186 -0
  622. package/utils/object.js +24 -0
  623. package/utils/pagination-utils.ts +154 -0
  624. package/utils/pod-security-admission.ts +1 -1
  625. package/utils/router.js +86 -0
  626. package/utils/settings.ts +46 -0
  627. package/utils/time.js +2 -1
  628. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  629. package/utils/url.ts +1 -1
  630. package/utils/validators/formRules/__tests__/index.test.ts +70 -4
  631. package/utils/validators/formRules/index.ts +15 -9
  632. package/utils/validators/index.js +1 -0
  633. package/utils/validators/setting.js +6 -10
  634. package/vue.config.js +377 -401
  635. package/.DS_Store +0 -0
  636. package/assets/images/providers/aks-black.svg +0 -28
  637. package/assets/images/providers/aks.svg +0 -31
  638. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  639. package/components/ChartPsp.vue +0 -76
  640. package/components/EventsTable.vue +0 -67
  641. package/components/TabbedLinks/index.vue +0 -94
  642. package/components/__tests__/ChartPsp.test.ts +0 -75
  643. package/components/formatter/__tests__/ClusterProvider.test.ts +0 -28
  644. package/components/nuxt/nuxt-link.server.js +0 -16
  645. package/components/nuxt/nuxt.js +0 -101
  646. package/config/router.js +0 -408
  647. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -237
  648. package/initialize/App.js +0 -198
  649. package/initialize/client.js +0 -875
  650. package/initialize/index.js +0 -364
  651. package/initialize/layouts.ts +0 -26
  652. package/middleware/i18n.js +0 -10
  653. package/middleware/unauthenticated.js +0 -22
  654. package/mixins/fetch.server.js +0 -73
  655. package/pages/c/_cluster/apps/index.vue +0 -17
  656. package/pages/c/_cluster/auth/index.vue +0 -19
  657. package/pages/c/_cluster/index.vue +0 -17
  658. package/pages/c/_cluster/legacy/index.vue +0 -22
  659. package/pages/c/_cluster/manager/index.vue +0 -22
  660. package/pages/c/_cluster/mcapps/index.vue +0 -21
  661. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  662. package/pages/c/index.vue +0 -9
  663. package/pages/rio/mesh.vue +0 -508
  664. package/plugins/dashboard-store/__tests__/mutations.spec.ts +0 -406
  665. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  666. package/plugins/portal-vue.js +0 -4
  667. package/plugins/portal.js +0 -4
  668. package/plugins/resize.js +0 -5
  669. package/plugins/shortkey.js +0 -4
  670. package/plugins/tooltip.js +0 -4
  671. package/plugins/transitions.js +0 -4
  672. package/plugins/v-select.js +0 -4
  673. package/plugins/vue-clipboard2.js +0 -4
  674. package/rancher-components/components/BadgeState/BadgeState.spec.ts +0 -12
  675. package/tsconfig.default.json +0 -46
  676. package/utils/group.js +0 -70
  677. package/utils/nuxt.js +0 -659
  678. package/utils/router.scrollBehavior.js +0 -80
  679. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  680. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  681. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  682. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  683. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  684. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  685. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  686. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  687. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
  688. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  689. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
@@ -0,0 +1,22 @@
1
+
2
+ export interface SchemaAttributeColumn {
3
+ description: string,
4
+ field: string,
5
+ format: string,
6
+ name: string,
7
+ priority: number,
8
+ type: string,
9
+ }
10
+
11
+ export interface SchemaAttribute {
12
+ columns: SchemaAttributeColumn[],
13
+ namespaced: boolean
14
+ }
15
+
16
+ /**
17
+ * At some point this will be properly typed, until then...
18
+ */
19
+ export interface Schema {
20
+ id: string,
21
+ attributes: SchemaAttribute
22
+ }
@@ -1,5 +1,17 @@
1
1
  import { DESCRIPTION } from '@shell/config/labels-annotations';
2
2
  import HybridModel from './hybrid-class';
3
+ import { NEVER_ADD } from '@shell/utils/create-yaml';
4
+ import { deleteProperty } from '@shell/utils/object';
5
+
6
+ // Some fields that are removed for YAML (NEVER_ADD) are required via API
7
+ const STEVE_ADD = [
8
+ 'metadata.resourceVersion',
9
+ 'metadata.fields',
10
+ 'metadata.clusterName',
11
+ 'metadata.deletionGracePeriodSeconds',
12
+ 'metadata.generateName',
13
+ ];
14
+ const STEVE_NEVER_SAVE = NEVER_ADD.filter((na) => !STEVE_ADD.includes(na));
3
15
 
4
16
  export default class SteveModel extends HybridModel {
5
17
  get name() {
@@ -28,4 +40,14 @@ export default class SteveModel extends HybridModel {
28
40
 
29
41
  this._description = value;
30
42
  }
43
+
44
+ cleanForSave(data, forNew) {
45
+ const val = super.cleanForSave(data);
46
+
47
+ for (const field of STEVE_NEVER_SAVE) {
48
+ deleteProperty(val, field);
49
+ }
50
+
51
+ return val;
52
+ }
31
53
  }
@@ -0,0 +1,368 @@
1
+ import { ActionFindPageArgs } from '@shell/types/store/dashboard-store.types';
2
+ import { PaginationParam, PaginationFilterField, PaginationParamProjectOrNamespace, PaginationParamFilter } from '@shell/types/store/pagination.types';
3
+ import { NAMESPACE_FILTER_ALL_SYSTEM, NAMESPACE_FILTER_ALL_USER, NAMESPACE_FILTER_P_FULL_PREFIX } from '@shell/utils/namespace-filter';
4
+ import Namespace from '@shell/models/namespace';
5
+ import { uniq } from '@shell/utils/array';
6
+ import {
7
+ CONFIG_MAP, MANAGEMENT, NAMESPACE, NODE, POD
8
+ } from '@shell/config/types';
9
+ import { Schema } from 'plugins/steve/schema';
10
+
11
+ class NamespaceProjectFilters {
12
+ /**
13
+ * User needs all resources.... except if there's some settings which should remove resources in specific circumstances
14
+ */
15
+ protected handlePrefAndSettingFilter(allNamespaces: Namespace[], showDynamicRancherNamespaces: boolean, productHidesSystemNamespaces: boolean): PaginationParamFilter[] {
16
+ // These are AND'd together
17
+ // Not ns 1 AND ns 2
18
+ return allNamespaces.reduce((res, ns) => {
19
+ // Links to ns.isObscure and covers things like `c-`, `user-`, etc (see OBSCURE_NAMESPACE_PREFIX)
20
+ const hideObscure = showDynamicRancherNamespaces ? false : ns.isObscure;
21
+ // Links to ns.isSystem and covers things like ns with system annotation, hardcoded list, etc
22
+ const hideSystem = productHidesSystemNamespaces ? ns.isSystem : false;
23
+
24
+ if (hideObscure || hideSystem) {
25
+ res.push(PaginationParamFilter.createSingleField({
26
+ field: 'metadata.namespace', value: ns.name, equals: false
27
+ }));
28
+ }
29
+
30
+ return res;
31
+ }, [] as PaginationParamFilter[]);
32
+ }
33
+
34
+ /**
35
+ * User needs either all user resources... or all system
36
+ *
37
+ * System resources revolve around the namespace's isSystem property
38
+ *
39
+ * Users resources are those not in system namespaces
40
+ */
41
+ protected handleSystemOrUserFilter(allNamespaces: Namespace[], isAllSystem: boolean, isAllUser: boolean) {
42
+ const allSystem = allNamespaces.filter((ns) => ns.isSystem);
43
+
44
+ // > Neither of these use projectsOrNamespaces to avoid scenarios where the local cluster provides a namespace which has
45
+ // > a matching project... which could lead to results in the user project resource being included in the system filter
46
+ if (isAllSystem) {
47
+ // return resources in system ns 1 OR in system ns 2 ...
48
+ // &filter=metadata.namespace=system ns 1,metadata.namespace=system ns 2
49
+ return [PaginationParamFilter.createMultipleFields(
50
+ allSystem.map(
51
+ (ns) => new PaginationFilterField({ field: 'metadata.namespace', value: ns.name })
52
+ )
53
+ )];
54
+ } else { // if isAllUser
55
+ // return resources not in system ns 1 AND not in system ns 2 ...
56
+ // &filter=metadata.namespace!=system ns 1&filter=metadata.namespace!=system ns 2
57
+ return allSystem.map((ns) => PaginationParamFilter.createSingleField({
58
+ field: 'metadata.namespace', value: ns.name, equals: false
59
+ }));
60
+ }
61
+ }
62
+
63
+ /**
64
+ * User needs resources in a set of projects or namespaces
65
+ */
66
+ protected handleSelectionFilter(neu: string[], isLocalCluster: boolean) {
67
+ // User has one or more projects or namespaces. We can pass this straight through to projectsornamespaces
68
+
69
+ // return resources in project 1 OR namespace 2
70
+ // &projectsornamespaces=project 1,namespace 2
71
+ const projectsOrNamespaces = [
72
+ new PaginationParamProjectOrNamespace({ projectOrNamespace: neu })
73
+ ];
74
+
75
+ if (isLocalCluster) {
76
+ // > As per `handleSystemOrUserFilter` above, we need to be careful of the local cluster where there's namespaces related to projects with the same id
77
+ // > In this case
78
+ // - We're including resources in the project and it's related namespace (via projectsornamespaces)
79
+ // - We're also then excluding resources in the related namespace (via below `filter`)
80
+
81
+ // Exclude resources NOT in projects namespace 1 AND not in projects namespace 2
82
+ // &filter=metadata.namespace!=pn1&filter=metadata.namespace!=pn2
83
+ return {
84
+ projectsOrNamespaces,
85
+ filters: neu
86
+ .filter((selection) => selection.startsWith(NAMESPACE_FILTER_P_FULL_PREFIX))
87
+ .map((projects) => PaginationParamFilter.createSingleField({
88
+ field: 'metadata.namespace', value: projects.replace(NAMESPACE_FILTER_P_FULL_PREFIX, ''), equals: false
89
+ }))
90
+ };
91
+ }
92
+
93
+ return { projectsOrNamespaces, filters: [] };
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Helper functions for steve pagination
99
+ */
100
+ class StevePaginationUtils extends NamespaceProjectFilters {
101
+ /**
102
+ * Filtering with the vai cache supports specific fields
103
+ * 1) Those listed here
104
+ * 2) Those references in the schema's attributes.fields list (which is used by generic lists)
105
+ */
106
+ static VALID_FIELDS: { [type: string]: { field: string, startsWith?: boolean }[]} = {
107
+ '': [// all types
108
+ { field: 'metadata.name' },
109
+ { field: 'metadata.namespace' },
110
+ // { field: 'id' }, // Pending API support
111
+ // { field: 'metadata.state.name' }, // Pending API support
112
+ { field: 'metadata.creationTimestamp' },
113
+ ],
114
+ [NODE]: [
115
+ { field: 'status.nodeInfo.kubeletVersion' },
116
+ { field: 'status.nodeInfo.operatingSystem' },
117
+ ],
118
+ [POD]: [
119
+ { field: 'spec.containers.image' },
120
+ { field: 'spec.nodeName' },
121
+ ],
122
+ [MANAGEMENT.NODE]: [
123
+ { field: 'status.nodeName' },
124
+ ],
125
+ [CONFIG_MAP]: [
126
+ { field: 'metadata.labels[harvesterhci.io/cloud-init-template]' }
127
+ ],
128
+ [NAMESPACE]: [
129
+ { field: 'metadata.labels[field.cattle.io/projectId]' }
130
+ ]
131
+ }
132
+
133
+ private convertArrayPath(path: string): string {
134
+ if (path.startsWith('metadata.fields.')) {
135
+ return `metadata.fields[${ path.substring(16) }]`;
136
+ }
137
+
138
+ return path;
139
+ }
140
+
141
+ public createSortForPagination(sortByPath: string): string {
142
+ return this.convertArrayPath(sortByPath);
143
+ }
144
+
145
+ /**
146
+ * Given the selection of projects or namespaces come up with `filter` and `projectsornamespace` query params
147
+ */
148
+ public createParamsFromNsFilter({
149
+ allNamespaces,
150
+ selection,
151
+ isAllNamespaces,
152
+ isLocalCluster,
153
+ showDynamicRancherNamespaces,
154
+ productHidesSystemNamespaces,
155
+ }: {
156
+ allNamespaces: Namespace[],
157
+ selection: string[],
158
+ /**
159
+ * There is no user provided filter
160
+ */
161
+ isAllNamespaces: boolean,
162
+ /**
163
+ * Weird things be happening if the target cluster is local / upstream. Uses this to check what cluster we're in
164
+ */
165
+ isLocalCluster: boolean,
166
+ /**
167
+ * Links to ns.isObscure and covers things like `c-`, `user-`, etc (see OBSCURE_NAMESPACE_PREFIX)
168
+ */
169
+ showDynamicRancherNamespaces: boolean,
170
+ /**
171
+ * Links to ns.isSystem and covers things like ns with system annotation, hardcoded list, etc
172
+ */
173
+ productHidesSystemNamespaces: boolean,
174
+ }): {
175
+ projectsOrNamespaces: PaginationParamProjectOrNamespace[],
176
+ filters: PaginationParamFilter[]
177
+ } {
178
+ // Hold up, why are we doing yet another way to convert the user's project / namespace filter to a set of something?
179
+ // - When doing this for local pagination `getActiveNamespaces` provides a full list of applicable namespaces.
180
+ // Lists then filter resource locally using those namespaces
181
+ // - Pagination cannot take this approach of 'gimme all resources in these namespaces' primarily for the 'Only User Namespaces' case
182
+ // - User could have 2k namespaces. This would result in 2k+ namespaces added to the url (namespace=1,namespace=2,namespace=3, etc)
183
+ // - Instead we do
184
+ // - All but not given settings - Gimme resources NOT in system or obscure namespaces
185
+ // - Only System Namespaces - Gimme resources in the system namespaces (which shouldn't be many namespaces)
186
+ // - Only User Namespaces - Gimme resources NOT in system namespaces
187
+ // - User selection - Gimme resources in specific Projects or Namespaces
188
+ if (isAllNamespaces && (showDynamicRancherNamespaces && !productHidesSystemNamespaces)) {
189
+ // No-op. Everything is returned
190
+ return {
191
+ projectsOrNamespaces: [],
192
+ filters: []
193
+ };
194
+ }
195
+
196
+ // used to return resources in / not in projects/namespaces (entries are checked in both types)
197
+ // &projectsornamespaces=project 1,namespace 2
198
+ let projectsOrNamespaces: PaginationParamProjectOrNamespace[] = [];
199
+ // used to return resources in / not in namespaces
200
+ // &filter=metadata.namespace=abc
201
+ let filters: PaginationParamFilter[] = [];
202
+
203
+ if (!showDynamicRancherNamespaces || productHidesSystemNamespaces) {
204
+ // We need to hide dynamic namespaces ('c-', 'p-', etc) OR system namespaces
205
+ filters = this.handlePrefAndSettingFilter(allNamespaces, showDynamicRancherNamespaces, productHidesSystemNamespaces);
206
+ }
207
+
208
+ const isAllSystem = selection[0] === NAMESPACE_FILTER_ALL_SYSTEM;
209
+ const isAllUser = selection[0] === NAMESPACE_FILTER_ALL_USER;
210
+
211
+ if (selection.length === 1 && (isAllSystem || isAllUser)) {
212
+ // Filter by resources either in or not in system namespaces
213
+ filters.push(...this.handleSystemOrUserFilter(allNamespaces, isAllSystem, isAllUser ));
214
+ } else {
215
+ // User has one or more projects or namespaces
216
+ const res = this.handleSelectionFilter(selection, isLocalCluster);
217
+
218
+ projectsOrNamespaces = res.projectsOrNamespaces;
219
+ filters.push(...res.filters);
220
+ }
221
+
222
+ return {
223
+ projectsOrNamespaces,
224
+ filters
225
+ };
226
+ }
227
+
228
+ public createParamsForPagination(schema: Schema, opt: ActionFindPageArgs): string | undefined {
229
+ if (!opt.pagination) {
230
+ return;
231
+ }
232
+
233
+ const params: string[] = [];
234
+ const namespaceParam = this.convertPaginationParams(schema, opt.pagination.projectsOrNamespaces);
235
+
236
+ if (namespaceParam) {
237
+ params.push(namespaceParam);
238
+ }
239
+
240
+ if (opt.pagination.page) {
241
+ params.push(`page=${ opt.pagination.page }`);
242
+ }
243
+
244
+ if (opt.pagination.pageSize) {
245
+ params.push(`pagesize=${ opt.pagination.pageSize }`);
246
+ }
247
+
248
+ if (opt.pagination.sort?.length) {
249
+ const validateFields = {
250
+ checked: new Array<string>(),
251
+ invalid: new Array<string>(),
252
+ };
253
+
254
+ const joined = opt.pagination.sort
255
+ .map((s) => {
256
+ this.validateField(validateFields, schema, s.field);
257
+
258
+ return `${ s.asc ? '' : '-' }${ this.convertArrayPath(s.field) }`;
259
+ })
260
+ .join(',');
261
+
262
+ params.push(`sort=${ joined }`);
263
+
264
+ if (validateFields.invalid.length) {
265
+ console.warn(`Pagination API does not support sorting '${ schema.id }' by the requested fields: ${ uniq(validateFields.invalid).join(', ') }`); // eslint-disable-line no-console
266
+ }
267
+ }
268
+
269
+ if (opt.pagination.filters?.length) {
270
+ const filters = this.convertPaginationParams(schema, opt.pagination.filters);
271
+
272
+ if (filters) {
273
+ params.push(filters);
274
+ }
275
+ }
276
+
277
+ // Note - There is a `limit` property that is by default 100,000. This can be disabled by using `limit=-1`,
278
+ // but we shouldn't be fetching any pages big enough to exceed the default
279
+
280
+ return params.join('&');
281
+ }
282
+
283
+ /**
284
+ * Check if the API supports filtering by this field
285
+ */
286
+ private validateField(state: { checked: string[], invalid: string[]}, schema: Schema, field?: string) {
287
+ if (!field) {
288
+ return; // no field, so not invalid
289
+ }
290
+
291
+ if (state.checked.includes(field)) {
292
+ return; // already checked, exit early
293
+ }
294
+
295
+ state.checked.push(field);
296
+
297
+ // First check in our hardcoded list of supported filters
298
+ if ([
299
+ StevePaginationUtils.VALID_FIELDS[''], // Global
300
+ StevePaginationUtils.VALID_FIELDS[schema.id], // Type specific
301
+ ].find((fields) => fields?.find((f) => {
302
+ if (f.startsWith) {
303
+ if (field.startsWith(f.field)) {
304
+ return true;
305
+ }
306
+ } else {
307
+ return field === f.field;
308
+ }
309
+ }))) {
310
+ return;
311
+ }
312
+
313
+ // Then check in schema (the api automatically supports these)
314
+ if (!!schema?.attributes.columns.find(
315
+ // This isn't the most performant, but the string is tiny
316
+ (at) => at.field.replace('$.', '').replace('[', '.').replace(']', '') === field
317
+ )) {
318
+ return;
319
+ }
320
+
321
+ state.invalid.push(field);
322
+ }
323
+
324
+ /**
325
+ * Convert our {@link PaginationParam} definition of params to a set of url params
326
+ */
327
+ private convertPaginationParams(schema: Schema, filters: PaginationParam[] = []): string {
328
+ const validateFields = {
329
+ checked: new Array<string>(),
330
+ invalid: new Array<string>(),
331
+ };
332
+ const filterStrings = filters
333
+ .filter((filter) => !!filter.fields.length)
334
+ .map((filter) => {
335
+ const joined = filter.fields
336
+ .map((field) => {
337
+ if (field.field) {
338
+ // Check if the API supports filtering by this field
339
+ this.validateField(validateFields, schema, field.field);
340
+
341
+ const exactPartial = field.exact ? `'${ field.value }'` : field.value;
342
+
343
+ return `${ this.convertArrayPath(field.field) }${ field.equals ? '=' : '!=' }${ exactPartial }`;
344
+ }
345
+
346
+ return field.value;
347
+ })
348
+ .join(','); // This means OR
349
+
350
+ return `${ filter.param }${ filter.equals ? '=' : '!=' }${ joined }`;
351
+ });
352
+ const unique = filterStrings.reduce((res, s) => {
353
+ res[s] = true;
354
+
355
+ return res;
356
+ }, { } as {[filterString: string] : boolean });
357
+
358
+ const res = Object.keys(unique).join('&'); // This means AND
359
+
360
+ if (validateFields.invalid.length) {
361
+ console.warn(`Pagination API does not support filtering '${ schema.id }' by the requested fields: ${ uniq(validateFields.invalid).join(', ') }`); // eslint-disable-line no-console
362
+ }
363
+
364
+ return res;
365
+ }
366
+ }
367
+
368
+ export default new StevePaginationUtils();
@@ -32,8 +32,9 @@ import { escapeHtml } from '@shell/utils/string';
32
32
  import { keyForSubscribe } from '@shell/plugins/steve/resourceWatcher';
33
33
  import { waitFor } from '@shell/utils/async';
34
34
  import { WORKER_MODES } from './worker';
35
- import pAndNFiltering from '@shell/utils/projectAndNamespaceFiltering.utils';
35
+ import acceptOrRejectSocketMessage from './accept-or-reject-socket-message';
36
36
  import { BLANK_CLUSTER, STORE } from '@shell/store/store-types.js';
37
+ import paginationUtils from '@shell/utils/pagination-utils';
37
38
 
38
39
  // minimum length of time a disconnect notification is shown
39
40
  const MINIMUM_TIME_NOTIFIED = 3000;
@@ -131,7 +132,7 @@ export async function createWorker(store, ctx) {
131
132
  }
132
133
  },
133
134
  batchChanges: (batch) => {
134
- dispatch('batchChanges', namespaceHandler.validateBatchChange(ctx, batch));
135
+ dispatch('batchChanges', acceptOrRejectSocketMessage.validateBatchChange(ctx, batch));
135
136
  },
136
137
  dispatch: (msg) => {
137
138
  dispatch(`ws.${ msg.name }`, msg);
@@ -205,66 +206,6 @@ export function equivalentWatch(a, b) {
205
206
  return true;
206
207
  }
207
208
 
208
- /**
209
- * Sockets will not be able to subscribe to more than one namespace. If this is requested we pretend to handle it
210
- * - Changes to all resources are monitored (no namespace provided in sub)
211
- * - We ignore any events not from a required namespace (we have the conversion of project --> namespaces already)
212
- */
213
- const namespaceHandler = {
214
- /**
215
- * Note - namespace can be a list of projects or namespaces
216
- */
217
- subscribeNamespace: (namespace) => {
218
- if (pAndNFiltering.isApplicable({ namespaced: namespace }) && namespace.length) {
219
- return undefined; // AKA sub to everything
220
- }
221
-
222
- return namespace;
223
- },
224
-
225
- validChange: ({ getters, rootGetters }, type, data) => {
226
- const haveNamespace = getters.haveNamespace(type);
227
-
228
- if (haveNamespace?.length) {
229
- const namespaces = rootGetters.activeNamespaceCache;
230
-
231
- if (!namespaces[data.metadata.namespace]) {
232
- return false;
233
- }
234
- }
235
-
236
- return true;
237
- },
238
-
239
- validateBatchChange: ({ getters, rootGetters }, batch) => {
240
- const namespaces = rootGetters.activeNamespaceCache;
241
-
242
- Object.entries(batch).forEach(([type, entries]) => {
243
- const haveNamespace = getters.haveNamespace(type);
244
-
245
- if (!haveNamespace?.length) {
246
- return;
247
- }
248
-
249
- const schema = getters.schemaFor(type);
250
-
251
- if (!schema?.attributes?.namespaced) {
252
- return;
253
- }
254
-
255
- Object.keys(entries).forEach((id) => {
256
- const namespace = id.split('/')[0];
257
-
258
- if (!namespace || !namespaces[namespace]) {
259
- delete entries[id];
260
- }
261
- });
262
- });
263
-
264
- return batch;
265
- }
266
- };
267
-
268
209
  function queueChange({ getters, state, rootGetters }, { data, revision }, load, label) {
269
210
  const type = getters.normalizeType(data.type);
270
211
 
@@ -278,7 +219,7 @@ function queueChange({ getters, state, rootGetters }, { data, revision }, load,
278
219
 
279
220
  // console.log(`${ label } Event [${ state.config.namespace }]`, data.type, data.id); // eslint-disable-line no-console
280
221
 
281
- if (!namespaceHandler.validChange({ getters, rootGetters }, type, data)) {
222
+ if (!acceptOrRejectSocketMessage.validChange({ getters, rootGetters }, type, data)) {
282
223
  return;
283
224
  }
284
225
 
@@ -333,10 +274,6 @@ const sharedActions = {
333
274
 
334
275
  commit('setWantSocket', true);
335
276
 
336
- if ( process.server ) {
337
- return;
338
- }
339
-
340
277
  state.debugSocket && console.info(`Subscribe [${ getters.storeName }]`); // eslint-disable-line no-console
341
278
 
342
279
  const url = `${ state.config.baseUrl }/subscribe`;
@@ -426,7 +363,7 @@ const sharedActions = {
426
363
  type, selector, id, revision, namespace, stop, force
427
364
  } = params;
428
365
 
429
- namespace = namespaceHandler.subscribeNamespace(namespace);
366
+ namespace = acceptOrRejectSocketMessage.subscribeNamespace(namespace);
430
367
  type = getters.normalizeType(type);
431
368
 
432
369
  if (rootGetters['type-map/isSpoofed'](type)) {
@@ -466,7 +403,13 @@ const sharedActions = {
466
403
  return;
467
404
  }
468
405
 
469
- if ( typeof revision === 'undefined' ) {
406
+ // isSteveCacheEnabled check is temporary and will be removed once Part 3 of https://github.com/rancher/dashboard/pull/10349 is resolved by backend
407
+ // Steve cache backed api does not return a revision, so `revision` here is always undefined
408
+ // Which means we find a revision within a resource itself and use it in the watch
409
+ // That revision is probably too old and results in a watch error
410
+ // Watch errors mean we make a http request to get latest revision (which is still missing) and try to re-watch with it...
411
+ // etc
412
+ if (typeof revision === 'undefined' && !paginationUtils.isSteveCacheEnabled({ rootGetters })) {
470
413
  revision = getters.nextResourceVersion(type, id);
471
414
  }
472
415
 
@@ -513,7 +456,7 @@ const sharedActions = {
513
456
  const { commit, getters, dispatch } = ctx;
514
457
 
515
458
  if (getters['schemaFor'](type)) {
516
- namespace = namespaceHandler.subscribeNamespace(namespace);
459
+ namespace = acceptOrRejectSocketMessage.subscribeNamespace(namespace);
517
460
 
518
461
  const obj = {
519
462
  type,
@@ -610,7 +553,7 @@ const defaultActions = {
610
553
  },
611
554
 
612
555
  rehydrateSubscribe({ state, dispatch }) {
613
- if ( process.client && state.wantSocket && !state.socket ) {
556
+ if ( state.wantSocket && !state.socket ) {
614
557
  dispatch('subscribe');
615
558
  }
616
559
  },
@@ -741,11 +684,9 @@ const defaultActions = {
741
684
  }
742
685
 
743
686
  // Try resending any frames that were attempted to be sent while the socket was down, once.
744
- if ( !process.server ) {
745
- for ( const obj of state.pendingFrames.slice() ) {
746
- commit('dequeuePendingFrame', obj);
747
- dispatch('sendImmediate', obj);
748
- }
687
+ for ( const obj of state.pendingFrames.slice() ) {
688
+ commit('dequeuePendingFrame', obj);
689
+ dispatch('sendImmediate', obj);
749
690
  }
750
691
  },
751
692
 
@@ -1,37 +1,9 @@
1
1
  import Vue from 'vue';
2
+ import trimWhitespaceDirective from '@shell/directives/trim-whitespace';
2
3
 
3
- export function trimWhitespace(el, dir) {
4
- for (const node of el.childNodes) {
5
- if (node.nodeType === Node.TEXT_NODE ) {
6
- const trimmed = node.data.trim();
4
+ export default trimWhitespaceDirective;
5
+ /* eslint-disable-next-line no-console */
6
+ console.warn(`Importing trimWhitespaceDirective from plugins has been deprecated, use shell/directives/trim-whitespace.js instead.
7
+ Make sure to invoke it using Vue.directive('trim-whitespace', trimWhitespaceDirective ) to maintain compatibility.`);
7
8
 
8
- if ( trimmed === '') {
9
- node.remove();
10
- } else if ( trimmed !== node.data ) {
11
- node.data = trimmed;
12
- }
13
- }
14
- }
15
- }
16
-
17
- export function trimWhitespaceSsr(el, dir) {
18
- // This causes server<->client dom mismatches sometimes... gave up for now.
19
- /*
20
- for ( const node of (el.children || []) ) {
21
- if ( node.text ) {
22
- const trimmed = node.text.trim();
23
-
24
- if ( trimmed !== node.text ) {
25
- node.text = trimmed;
26
- }
27
- } else if ( node.children ) {
28
- trimWhitespaceSsr(node);
29
- }
30
- }
31
- */
32
- }
33
-
34
- Vue.directive('trim-whitespace', {
35
- inserted: trimWhitespace,
36
- componentUpdated: trimWhitespace
37
- });
9
+ Vue.directive('trim-whitespace', trimWhitespaceDirective );
@@ -1,4 +1,4 @@
1
1
  import Vue from 'vue';
2
- import VModal from 'vue-js-modal/dist/ssr.index';
2
+ import VModal from 'vue-js-modal';
3
3
 
4
4
  Vue.use(VModal);
package/public/index.html CHANGED
@@ -67,6 +67,7 @@
67
67
  <i class="initial-load-spinner"></i>
68
68
  </div>
69
69
  </div>
70
+ <div id="modals"><!--Portal content here--></div>
70
71
  </body>
71
72
 
72
73
  </html>
@@ -355,15 +355,20 @@ export default defineComponent({
355
355
  :hover="hoverTooltip"
356
356
  :value="validationMessage"
357
357
  />
358
- <label
359
- v-if="cronHint"
360
- class="cron-label"
361
- >{{ cronHint }}</label>
362
- <label
363
- v-if="subLabel"
364
- v-clean-html="subLabel"
358
+ <div
359
+ v-if="cronHint || subLabel"
365
360
  class="sub-label"
366
- />
361
+ >
362
+ <div
363
+ v-if="cronHint"
364
+ >
365
+ {{ cronHint }}
366
+ </div>
367
+ <div
368
+ v-if="subLabel"
369
+ v-clean-html="subLabel"
370
+ />
371
+ </div>
367
372
  </div>
368
373
  </template>
369
374
  <style scoped lang="scss">