@rancher/shell 1.2.3 → 2.0.1

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 (699) 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 +315 -64
  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/AlertTable.vue +17 -7
  31. package/components/AppModal.vue +167 -0
  32. package/components/AssignTo.vue +7 -4
  33. package/components/AsyncButton.vue +27 -5
  34. package/components/BackLink.vue +4 -4
  35. package/components/BannerGraphic.vue +1 -0
  36. package/components/BrandImage.vue +47 -1
  37. package/components/Carousel.vue +15 -8
  38. package/components/Certificates.vue +161 -0
  39. package/components/ClusterBadge.vue +12 -3
  40. package/components/ClusterIconMenu.vue +55 -12
  41. package/components/ClusterProviderIcon.vue +14 -3
  42. package/components/CodeMirror.vue +111 -17
  43. package/components/CommunityLinks.vue +12 -8
  44. package/components/CopyCode.vue +6 -2
  45. package/components/CopyToClipboard.vue +2 -1
  46. package/components/CopyToClipboardText.vue +14 -9
  47. package/components/CreateDriver.vue +81 -0
  48. package/components/CruResource.vue +52 -27
  49. package/components/DetailTop.vue +2 -2
  50. package/components/Dialog.vue +6 -5
  51. package/components/DisableAuthProviderModal.vue +14 -8
  52. package/components/DraggableZone.vue +2 -2
  53. package/components/EtcdInfoBanner.vue +5 -5
  54. package/components/ExplorerMembers.vue +3 -3
  55. package/components/ExplorerProjectsNamespaces.vue +31 -7
  56. package/components/FixedBanner.vue +48 -36
  57. package/components/GlobalRoleBindings.vue +26 -0
  58. package/components/GrafanaDashboard.vue +6 -4
  59. package/components/IconOrSvg.vue +1 -1
  60. package/components/Import.vue +10 -6
  61. package/components/Inactivity.vue +1 -5
  62. package/components/KeyValueView.vue +14 -10
  63. package/components/Markdown.vue +16 -12
  64. package/components/MessageLink.vue +2 -2
  65. package/components/ModalWithCard.vue +5 -8
  66. package/components/MoveModal.vue +35 -33
  67. package/components/PodSecurityAdmission.vue +3 -3
  68. package/components/PromptChangePassword.vue +33 -33
  69. package/components/PromptModal.vue +11 -21
  70. package/components/PromptRemove.vue +12 -17
  71. package/components/PromptRestore.vue +18 -16
  72. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  73. package/components/Questions/__tests__/Float.test.ts +9 -19
  74. package/components/Questions/__tests__/Int.test.ts +9 -19
  75. package/components/Questions/__tests__/String.test.ts +9 -19
  76. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  77. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  78. package/components/Questions/index.vue +19 -3
  79. package/components/ResourceCancelModal.vue +34 -29
  80. package/components/ResourceDetail/Masthead.vue +48 -16
  81. package/components/ResourceDetail/index.vue +6 -4
  82. package/components/ResourceList/Masthead.vue +10 -9
  83. package/components/ResourceList/index.vue +65 -14
  84. package/components/ResourceTable.vue +87 -21
  85. package/components/ResourceYaml.vue +35 -5
  86. package/components/SelectIconGrid.vue +3 -3
  87. package/components/SideNav.vue +50 -94
  88. package/components/SingleClusterInfo.vue +4 -4
  89. package/components/SortableTable/THead.vue +33 -21
  90. package/components/SortableTable/filtering.js +9 -1
  91. package/components/SortableTable/grouping.js +8 -1
  92. package/components/SortableTable/index.vue +143 -44
  93. package/components/SortableTable/paging.js +36 -7
  94. package/components/SortableTable/selection.js +2 -1
  95. package/components/SortableTable/sorting.js +24 -7
  96. package/components/StatusTable.vue +5 -1
  97. package/components/Tabbed/index.vue +18 -1
  98. package/components/TableDataUserIcon.vue +47 -0
  99. package/components/TypeDescription.vue +1 -0
  100. package/components/Wizard.vue +1 -0
  101. package/components/YamlEditor.vue +1 -0
  102. package/components/__tests__/AppModal.test.ts +98 -0
  103. package/components/__tests__/AsyncButton.test.ts +1 -3
  104. package/components/__tests__/BackLink.test.ts +1 -1
  105. package/components/__tests__/ButtonGroup.test.ts +3 -6
  106. package/components/__tests__/Carousel.test.ts +43 -0
  107. package/components/__tests__/Certificates.test.ts +29 -0
  108. package/components/__tests__/CodeMirror.test.ts +87 -0
  109. package/components/__tests__/CopyCode.test.ts +5 -4
  110. package/components/__tests__/CruResource.test.ts +10 -9
  111. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  112. package/components/__tests__/FixedBanner.test.ts +5 -20
  113. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  114. package/components/__tests__/TabTitle.test.ts +129 -0
  115. package/components/auth/AzureWarning.vue +2 -2
  116. package/components/auth/RoleDetailEdit.vue +10 -0
  117. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  118. package/components/auth/login/oidc.vue +7 -1
  119. package/components/fleet/FleetBundles.vue +5 -11
  120. package/components/fleet/FleetClusters.vue +9 -9
  121. package/components/fleet/FleetIntro.vue +11 -17
  122. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  123. package/components/fleet/FleetRepos.vue +63 -27
  124. package/components/fleet/FleetResources.vue +6 -1
  125. package/components/fleet/FleetStatus.vue +3 -3
  126. package/components/fleet/FleetSummary.vue +35 -30
  127. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  128. package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
  129. package/components/form/ArrayList.vue +22 -18
  130. package/components/form/ArrayListSelect.vue +5 -0
  131. package/components/form/BannerSettings.vue +3 -0
  132. package/components/form/ClusterAppearance.vue +132 -0
  133. package/components/form/ColorInput.vue +1 -0
  134. package/components/form/Error.vue +3 -3
  135. package/components/form/FileSelector.vue +1 -0
  136. package/components/form/Footer.vue +2 -2
  137. package/components/form/GitPicker.vue +83 -38
  138. package/components/form/KeyValue.vue +70 -48
  139. package/components/form/LabeledSelect.vue +145 -41
  140. package/components/form/Labels.vue +3 -1
  141. package/components/form/NameNsDescription.vue +26 -9
  142. package/components/form/Password.vue +3 -1
  143. package/components/form/ResourceLabeledSelect.vue +187 -0
  144. package/components/form/ResourceTabs/index.vue +31 -15
  145. package/components/form/SecretSelector.vue +93 -18
  146. package/components/form/SelectOrCreateAuthSecret.vue +132 -59
  147. package/components/form/SimpleSecretSelector.vue +88 -28
  148. package/components/form/Taints.vue +13 -7
  149. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  150. package/components/form/__tests__/KeyValue.test.ts +120 -11
  151. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  152. package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +25 -15
  153. package/components/form/__tests__/Taints.test.ts +70 -0
  154. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  155. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  156. package/components/formatter/AppSummaryGraph.vue +2 -2
  157. package/components/formatter/Checked.vue +11 -3
  158. package/components/formatter/CloudCredPublicData.vue +30 -0
  159. package/components/formatter/ClusterLink.vue +2 -2
  160. package/components/formatter/ClusterProvider.vue +1 -18
  161. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  162. package/components/formatter/FleetSummaryGraph.vue +25 -12
  163. package/components/formatter/ImagePercentageBar.vue +0 -4
  164. package/components/formatter/IngressTarget.vue +18 -7
  165. package/components/formatter/Link.vue +2 -2
  166. package/components/formatter/LinkDetail.vue +2 -2
  167. package/components/formatter/LinkDetailImage.vue +2 -2
  168. package/components/formatter/LinkName.vue +2 -2
  169. package/components/formatter/LiveDuration.vue +1 -1
  170. package/components/formatter/PercentageBar.vue +1 -1
  171. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  172. package/components/formatter/SecretType.vue +2 -2
  173. package/components/formatter/VirtualServiceGateways.vue +2 -2
  174. package/components/formatter/WorkloadDetailEndpoints.vue +12 -22
  175. package/components/formatter/__tests__/Checked.test.ts +19 -0
  176. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  177. package/components/formatter/__tests__/WorkloadDetailEndpoints.test.ts +81 -0
  178. package/components/nav/Group.vue +9 -7
  179. package/components/nav/Header.vue +85 -46
  180. package/components/nav/Jump.vue +19 -9
  181. package/components/nav/NamespaceFilter.vue +8 -1
  182. package/components/nav/TopLevelMenu.vue +392 -136
  183. package/components/nav/Type.vue +71 -106
  184. package/components/nav/WindowManager/ContainerLogs.vue +120 -19
  185. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  186. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  187. package/components/nav/WindowManager/index.vue +11 -10
  188. package/components/nav/__tests__/TopLevelMenu.test.ts +400 -6
  189. package/components/nav/__tests__/Type.test.ts +322 -97
  190. package/components/nuxt/nuxt-child.js +9 -78
  191. package/components/nuxt/nuxt-error.vue +1 -1
  192. package/components/nuxt/nuxt-link.client.js +13 -95
  193. package/{layouts → components/templates}/blank.vue +1 -1
  194. package/{layouts → components/templates}/default.vue +11 -101
  195. package/{layouts → components/templates}/error.vue +13 -26
  196. package/{layouts → components/templates}/home.vue +4 -1
  197. package/{layouts → components/templates}/plain.vue +4 -1
  198. package/{layouts → components/templates}/standalone.vue +1 -5
  199. package/{layouts → components/templates}/unauthenticated.vue +2 -3
  200. package/composables/useCompactInput.test.ts +36 -0
  201. package/composables/useCompactInput.ts +20 -0
  202. package/composables/useLabeledFormElement.test.ts +135 -0
  203. package/composables/useLabeledFormElement.ts +138 -0
  204. package/config/harvester-manager-types.js +2 -0
  205. package/config/home-links.js +2 -1
  206. package/config/labels-annotations.js +2 -1
  207. package/config/middleware.js +0 -6
  208. package/config/pagination-table-headers.js +57 -0
  209. package/config/pod-security-admission.ts +1 -1
  210. package/config/private-label.js +21 -1
  211. package/config/product/auth.js +1 -0
  212. package/config/product/explorer.js +166 -45
  213. package/config/product/fleet.js +6 -1
  214. package/config/product/legacy.js +2 -11
  215. package/config/product/manager.js +51 -25
  216. package/config/query-params.js +2 -0
  217. package/config/roles.ts +23 -0
  218. package/config/router/index.js +23 -0
  219. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  220. package/config/router/navigation-guards/authentication.js +63 -0
  221. package/config/router/navigation-guards/i18n.js +13 -0
  222. package/config/router/navigation-guards/index.js +16 -0
  223. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  224. package/config/router/routes.js +487 -0
  225. package/config/settings.ts +31 -2
  226. package/config/store.js +8 -4
  227. package/config/system-namespaces.js +3 -0
  228. package/config/table-headers.js +66 -1
  229. package/config/types.js +35 -20
  230. package/config/uiplugins.js +10 -5
  231. package/core/plugin-helpers.js +4 -6
  232. package/core/plugin-routes.ts +56 -114
  233. package/core/plugin.ts +18 -11
  234. package/core/plugins-loader.js +7 -9
  235. package/core/plugins.js +289 -285
  236. package/core/types-provisioning.ts +7 -0
  237. package/creators/app/app.package.json +2 -1
  238. package/creators/app/files/.eslintignore +0 -2
  239. package/creators/app/files/.gitlab-ci.yml +14 -0
  240. package/creators/app/files/.vscode/settings.json +0 -1
  241. package/creators/app/init +19 -0
  242. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  243. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  244. package/creators/pkg/init +32 -0
  245. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +119 -0
  246. package/detail/__tests__/service.test.ts +62 -0
  247. package/detail/catalog.cattle.io.app.vue +1 -1
  248. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  249. package/detail/fleet.cattle.io.bundle.vue +1 -1
  250. package/detail/fleet.cattle.io.cluster.vue +11 -1
  251. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  252. package/detail/namespace.vue +2 -2
  253. package/detail/networking.k8s.io.ingress.vue +52 -19
  254. package/detail/node.vue +22 -3
  255. package/detail/provisioning.cattle.io.cluster.vue +31 -13
  256. package/detail/service.vue +1 -1
  257. package/detail/workload/index.vue +1 -0
  258. package/dialog/AddCustomBadgeDialog.vue +318 -161
  259. package/dialog/DeactivateDriverDialog.vue +137 -0
  260. package/dialog/RollbackWorkloadDialog.vue +2 -2
  261. package/dialog/RotateCertificatesDialog.vue +0 -21
  262. package/dialog/ScaleMachineDownDialog.vue +34 -17
  263. package/directives/clean-html.js +15 -0
  264. package/directives/clean-tooltip.js +32 -0
  265. package/directives/focus.js +41 -0
  266. package/directives/int-number.js +21 -0
  267. package/directives/positive-int-number.js +19 -0
  268. package/directives/trim-whitespace.js +19 -0
  269. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  270. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  271. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  272. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  273. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  274. package/edit/__tests__/nodeDriver.test.ts +107 -0
  275. package/edit/__tests__/service.test.ts +85 -0
  276. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  277. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  278. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  279. package/edit/auth/__tests__/azuread.test.ts +241 -0
  280. package/edit/auth/__tests__/oidc.test.ts +137 -0
  281. package/edit/auth/azuread.vue +133 -31
  282. package/edit/auth/github.vue +5 -17
  283. package/edit/auth/googleoauth.vue +6 -23
  284. package/edit/auth/ldap/index.vue +5 -17
  285. package/edit/auth/oidc.vue +143 -42
  286. package/edit/auth/saml.vue +5 -14
  287. package/edit/catalog.cattle.io.clusterrepo.vue +177 -9
  288. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  289. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  290. package/edit/cloudcredential.vue +28 -4
  291. package/edit/configmap.vue +10 -4
  292. package/edit/fleet.cattle.io.gitrepo.vue +3 -1
  293. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  294. package/edit/kontainerDriver.vue +65 -0
  295. package/edit/logging-flow/Match.vue +10 -9
  296. package/edit/logging-flow/index.vue +4 -19
  297. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  298. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  299. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  300. package/edit/management.cattle.io.project.vue +3 -53
  301. package/edit/management.cattle.io.setting.vue +52 -2
  302. package/edit/management.cattle.io.user.vue +2 -1
  303. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  304. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  305. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +1 -1
  306. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -2
  307. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +1 -1
  308. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +15 -3
  309. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +4 -1
  310. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  311. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  312. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  313. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  314. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  315. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  316. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +46 -7
  317. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +1 -1
  318. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  319. package/edit/nodeDriver.vue +65 -0
  320. package/edit/persistentvolume/index.vue +2 -2
  321. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +33 -16
  322. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +276 -0
  323. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  324. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +3 -0
  325. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  326. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  327. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  328. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +77 -13
  329. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +391 -0
  330. package/edit/provisioning.cattle.io.cluster/import.vue +4 -4
  331. package/edit/provisioning.cattle.io.cluster/index.vue +126 -51
  332. package/edit/provisioning.cattle.io.cluster/rke2.vue +325 -791
  333. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  334. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +217 -0
  335. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +123 -129
  336. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  337. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  338. package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +1 -0
  339. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  340. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +190 -0
  341. package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +3 -0
  342. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +148 -0
  343. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  344. package/edit/resources.cattle.io.backup.vue +139 -124
  345. package/edit/resources.cattle.io.restore.vue +146 -126
  346. package/edit/service.vue +13 -0
  347. package/edit/serviceaccount.vue +46 -4
  348. package/edit/token.vue +3 -1
  349. package/edit/workload/Upgrading.vue +3 -2
  350. package/edit/workload/__tests__/Job.test.ts +1 -3
  351. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  352. package/edit/workload/index.vue +2 -1
  353. package/edit/workload/mixins/workload.js +35 -2
  354. package/edit/workload/storage/emptyDir.vue +2 -2
  355. package/initialize/App.vue +75 -0
  356. package/initialize/app-extended.js +128 -0
  357. package/initialize/entry-helpers.js +546 -0
  358. package/initialize/entry.js +32 -0
  359. package/initialize/install-components.js +23 -0
  360. package/initialize/install-directives.js +59 -0
  361. package/initialize/install-plugins.js +123 -0
  362. package/list/__tests__/workload.test.ts +1 -1
  363. package/list/catalog.cattle.io.app.vue +1 -0
  364. package/list/cis.cattle.io.clusterscan.vue +16 -10
  365. package/list/group.principal.vue +2 -2
  366. package/list/management.cattle.io.feature.vue +16 -16
  367. package/list/management.cattle.io.setting.vue +1 -0
  368. package/list/management.cattle.io.user.vue +13 -4
  369. package/list/networking.k8s.io.ingress.vue +36 -0
  370. package/list/node.vue +212 -73
  371. package/list/provisioning.cattle.io.cluster.vue +17 -4
  372. package/list/ui.cattle.io.navlink.vue +2 -2
  373. package/list/workload.vue +22 -0
  374. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  375. package/machine-config/__tests__/vmwarevsphere.test.ts +1 -3
  376. package/machine-config/amazonec2.vue +1 -1
  377. package/machine-config/azure.vue +2 -1
  378. package/machine-config/generic.vue +11 -15
  379. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  380. package/machine-config/vmwarevsphere.vue +31 -27
  381. package/middleware/authenticated.js +23 -399
  382. package/mixins/__tests__/chart.test.ts +48 -6
  383. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  384. package/mixins/auth-config.js +5 -9
  385. package/mixins/brand.js +102 -96
  386. package/mixins/chart.js +27 -13
  387. package/mixins/create-edit-view/index.js +2 -2
  388. package/mixins/fetch.client.js +42 -48
  389. package/mixins/labeled-form-element.ts +27 -2
  390. package/mixins/page-actions.js +7 -5
  391. package/mixins/resource-fetch-api-pagination.js +304 -0
  392. package/mixins/resource-fetch-namespaced.js +1 -1
  393. package/mixins/resource-fetch.js +46 -5
  394. package/models/__tests__/cluster.test.ts +44 -0
  395. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  396. package/models/__tests__/management.cattle.io.cluster.test.ts +23 -0
  397. package/models/__tests__/management.cattle.io.node.ts +85 -0
  398. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  399. package/models/__tests__/namespace.test.ts +49 -9
  400. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +241 -0
  401. package/models/__tests__/schema.tests.ts +24 -0
  402. package/models/__tests__/secret.test.ts +37 -0
  403. package/models/__tests__/steve-schema.test.ts +73 -0
  404. package/models/__tests__/storage.k8s.io.storageclass.test.ts +22 -0
  405. package/models/__tests__/workload.test.ts +91 -0
  406. package/models/catalog.cattle.io.app.js +8 -0
  407. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  408. package/models/catalog.cattle.io.uiplugin.js +7 -8
  409. package/models/cis.cattle.io.clusterscan.js +29 -8
  410. package/models/cloudcredential.js +9 -1
  411. package/models/cluster/node.js +8 -4
  412. package/models/cluster/schema.js +6 -0
  413. package/models/cluster.js +33 -0
  414. package/models/cluster.x-k8s.io.machine.js +1 -1
  415. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  416. package/models/driver.js +63 -0
  417. package/models/fleet.cattle.io.cluster.js +27 -11
  418. package/models/fleet.cattle.io.gitrepo.js +66 -13
  419. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  420. package/models/kontainerdriver.js +85 -0
  421. package/models/management/schema.js +6 -0
  422. package/models/management.cattle.io.authconfig.js +3 -2
  423. package/models/management.cattle.io.cluster.js +16 -7
  424. package/models/management.cattle.io.globalrole.js +2 -0
  425. package/models/management.cattle.io.kontainerdriver.js +1 -0
  426. package/models/management.cattle.io.node.js +18 -14
  427. package/models/management.cattle.io.nodepool.js +17 -0
  428. package/models/management.cattle.io.project.js +0 -36
  429. package/models/management.cattle.io.setting.js +11 -7
  430. package/models/management.cattle.io.user.js +2 -2
  431. package/models/monitoring.coreos.com.receiver.js +3 -1
  432. package/models/monitoring.coreos.com.route.js +1 -1
  433. package/models/namespace.js +1 -1
  434. package/models/networking.k8s.io.ingress.js +2 -1
  435. package/models/nodedriver.js +85 -0
  436. package/models/pod.js +20 -0
  437. package/models/provisioning.cattle.io.cluster.js +125 -10
  438. package/models/schema.js +28 -7
  439. package/models/secret.js +126 -18
  440. package/models/service.js +2 -0
  441. package/models/steve-schema.ts +254 -0
  442. package/models/storage.k8s.io.storageclass.js +1 -1
  443. package/models/workload.js +17 -0
  444. package/models/workload.service.js +18 -0
  445. package/package.json +18 -14
  446. package/pages/about.vue +12 -6
  447. package/pages/account/create-key.vue +0 -1
  448. package/pages/account/index.vue +7 -3
  449. package/pages/auth/login.vue +106 -103
  450. package/pages/auth/logout.vue +2 -4
  451. package/pages/auth/setup.vue +92 -66
  452. package/pages/auth/verify.vue +30 -24
  453. package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +2 -17
  454. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  455. package/pages/c/_cluster/apps/charts/index.vue +99 -69
  456. package/pages/c/_cluster/apps/charts/install.helpers.js +2 -13
  457. package/pages/c/_cluster/apps/charts/install.vue +12 -11
  458. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  459. package/pages/c/_cluster/auth/config/index.vue +15 -9
  460. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  461. package/pages/c/_cluster/ecm/index.vue +0 -2
  462. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  463. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  464. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  465. package/pages/c/_cluster/explorer/index.vue +253 -91
  466. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  467. package/pages/c/_cluster/explorer/tools/index.vue +10 -6
  468. package/pages/c/_cluster/fleet/index.vue +89 -94
  469. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  470. package/pages/c/_cluster/longhorn/index.vue +52 -17
  471. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  472. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  473. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  474. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +91 -0
  475. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  476. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  477. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +60 -0
  478. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  479. package/pages/c/_cluster/manager/pages/_page.vue +4 -5
  480. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  481. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  482. package/pages/c/_cluster/neuvector/index.vue +1 -0
  483. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  484. package/pages/c/_cluster/settings/banners.vue +86 -10
  485. package/pages/c/_cluster/settings/brand.vue +261 -38
  486. package/pages/c/_cluster/settings/index.vue +4 -6
  487. package/pages/c/_cluster/settings/links.vue +3 -2
  488. package/pages/c/_cluster/settings/performance.vue +71 -3
  489. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  490. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +12 -8
  491. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  492. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  493. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  494. package/pages/c/_cluster/uiplugins/InstallDialog.vue +55 -19
  495. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  496. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  497. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  498. package/pages/c/_cluster/uiplugins/index.vue +38 -54
  499. package/pages/diagnostic.vue +2 -2
  500. package/pages/fail-whale.vue +103 -42
  501. package/pages/home.vue +81 -24
  502. package/pages/prefs.vue +8 -4
  503. package/pages/support/index.vue +14 -10
  504. package/pkg/auto-import.js +1 -1
  505. package/plugins/axios.js +0 -36
  506. package/plugins/back-button.js +3 -5
  507. package/plugins/clean-html-directive.js +5 -30
  508. package/plugins/clean-html.js +53 -0
  509. package/plugins/clean-tooltip-directive.js +6 -31
  510. package/plugins/codemirror-loader.js +1 -1
  511. package/plugins/codemirror.js +41 -9
  512. package/plugins/dashboard-store/__tests__/mutations.test.ts +389 -0
  513. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  514. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  515. package/plugins/dashboard-store/actions.js +132 -25
  516. package/plugins/dashboard-store/classify.js +1 -18
  517. package/plugins/dashboard-store/getters.js +154 -44
  518. package/plugins/dashboard-store/index.js +0 -111
  519. package/plugins/dashboard-store/mutations.js +150 -52
  520. package/plugins/dashboard-store/resource-class.js +77 -127
  521. package/plugins/directives.js +6 -39
  522. package/plugins/ember-cookie.js +13 -0
  523. package/plugins/global-formatters.js +26 -5
  524. package/plugins/i18n.js +89 -55
  525. package/plugins/int-number.js +6 -20
  526. package/plugins/plugin.js +3 -3
  527. package/plugins/positive-int-number.js +6 -17
  528. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +81 -10
  529. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  530. package/plugins/steve/__tests__/resource-utils.test.ts +159 -0
  531. package/plugins/steve/__tests__/steve-class.test.ts +59 -0
  532. package/plugins/steve/__tests__/subscribe.spec.ts +4 -1
  533. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  534. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  535. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  536. package/plugins/steve/actions.js +3 -38
  537. package/plugins/steve/getters.js +164 -61
  538. package/plugins/steve/hybrid-class.js +5 -1
  539. package/plugins/steve/mutations.js +24 -3
  540. package/plugins/steve/norman-class.js +142 -2
  541. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  542. package/plugins/steve/resource-utils.ts +38 -0
  543. package/plugins/steve/schema.d.ts +22 -0
  544. package/plugins/steve/steve-class.js +22 -0
  545. package/plugins/steve/steve-pagination-utils.ts +368 -0
  546. package/plugins/steve/subscribe.js +17 -76
  547. package/plugins/trim-whitespace.js +6 -34
  548. package/plugins/vue-js-modal.js +1 -1
  549. package/promptRemove/pod.vue +15 -7
  550. package/public/index.html +1 -0
  551. package/rancher-components/Accordion/Accordion.test.ts +45 -0
  552. package/rancher-components/Accordion/Accordion.vue +86 -0
  553. package/rancher-components/Accordion/index.ts +1 -0
  554. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  555. package/rancher-components/Banner/Banner.test.ts +1 -5
  556. package/rancher-components/Banner/Banner.vue +2 -2
  557. package/rancher-components/Card/Card.vue +4 -4
  558. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  559. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  560. package/rancher-components/Form/LabeledInput/LabeledInput.vue +57 -24
  561. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  562. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  563. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  564. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  565. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  566. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  567. package/rancher-components/StringList/StringList.test.ts +270 -0
  568. package/rancher-components/StringList/StringList.vue +65 -26
  569. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +69 -0
  570. package/scripts/clean +1 -1
  571. package/scripts/extension/bundle +19 -7
  572. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  573. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  574. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  575. package/scripts/extension/helm/package/Dockerfile +1 -1
  576. package/scripts/extension/helm/scripts/package +11 -3
  577. package/scripts/extension/helm/scripts/patch +27 -0
  578. package/scripts/extension/parse-tag-name +4 -4
  579. package/scripts/extension/publish +25 -14
  580. package/scripts/publish-shell.sh +11 -1
  581. package/scripts/serve-pkgs +0 -2
  582. package/scripts/test-plugins-build.sh +87 -11
  583. package/scripts/vue-migrate.js +683 -0
  584. package/server/har-file.js +183 -0
  585. package/store/__tests__/catalog.test.ts +224 -0
  586. package/store/__tests__/type-map.test.ts +1122 -0
  587. package/store/auth.js +23 -4
  588. package/store/aws.js +53 -6
  589. package/store/catalog.js +22 -6
  590. package/store/cru-resource.ts +26 -0
  591. package/store/customisation.js +35 -0
  592. package/store/features.js +7 -4
  593. package/store/i18n.js +11 -0
  594. package/store/index.js +140 -49
  595. package/store/plugins.js +8 -4
  596. package/store/prefs.js +33 -38
  597. package/store/type-map.js +288 -213
  598. package/store/type-map.utils.ts +226 -0
  599. package/tsconfig.json +34 -9
  600. package/tsconfig.paths.json +21 -0
  601. package/types/components/labeledSelect.ts +50 -0
  602. package/types/resources/settings.d.ts +32 -0
  603. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  604. package/types/shell/index.d.ts +1045 -770
  605. package/types/store/dashboard-store.types.ts +42 -0
  606. package/types/store/pagination.types.ts +457 -0
  607. package/types/store/type-map.ts +30 -0
  608. package/types/store/vuex.d.ts +9 -0
  609. package/types/vue-shim.d.ts +51 -0
  610. package/utils/__tests__/cluster.test.ts +20 -18
  611. package/utils/__tests__/create-yaml.test.ts +359 -2
  612. package/utils/__tests__/kontainer.test.ts +180 -0
  613. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  614. package/utils/alertmanagerconfig.js +19 -0
  615. package/utils/array.ts +40 -1
  616. package/utils/async.ts +2 -0
  617. package/utils/auth.js +152 -4
  618. package/utils/axios.js +2 -21
  619. package/utils/azure.js +24 -0
  620. package/utils/banners.js +103 -0
  621. package/utils/clipboard.js +5 -0
  622. package/utils/cluster.js +1 -1
  623. package/utils/config.js +4 -0
  624. package/utils/create-yaml.js +59 -28
  625. package/utils/custom-validators.js +0 -2
  626. package/utils/error.js +41 -1
  627. package/utils/formatter.js +5 -3
  628. package/utils/git.ts +1 -1
  629. package/utils/install-redirect.js +1 -1
  630. package/utils/kontainer.ts +190 -0
  631. package/utils/object.js +24 -0
  632. package/utils/pagination-utils.ts +154 -0
  633. package/utils/pod-security-admission.ts +1 -1
  634. package/utils/router.js +86 -0
  635. package/utils/settings.ts +46 -0
  636. package/utils/time.js +2 -1
  637. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  638. package/utils/url.ts +1 -1
  639. package/utils/validators/formRules/__tests__/index.test.ts +70 -4
  640. package/utils/validators/formRules/index.ts +15 -9
  641. package/utils/validators/index.js +1 -0
  642. package/utils/validators/setting.js +6 -10
  643. package/utils/version.js +2 -1
  644. package/vue.config.js +377 -401
  645. package/.DS_Store +0 -0
  646. package/assets/images/providers/aks-black.svg +0 -28
  647. package/assets/images/providers/aks.svg +0 -31
  648. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  649. package/components/ChartPsp.vue +0 -76
  650. package/components/EventsTable.vue +0 -67
  651. package/components/TabbedLinks/index.vue +0 -94
  652. package/components/__tests__/ChartPsp.test.ts +0 -75
  653. package/components/formatter/__tests__/ClusterProvider.test.ts +0 -28
  654. package/components/nuxt/nuxt-link.server.js +0 -16
  655. package/components/nuxt/nuxt.js +0 -101
  656. package/config/router.js +0 -408
  657. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -237
  658. package/initialize/App.js +0 -198
  659. package/initialize/client.js +0 -875
  660. package/initialize/index.js +0 -364
  661. package/initialize/layouts.ts +0 -26
  662. package/middleware/i18n.js +0 -10
  663. package/middleware/unauthenticated.js +0 -22
  664. package/mixins/fetch.server.js +0 -73
  665. package/pages/c/_cluster/apps/index.vue +0 -17
  666. package/pages/c/_cluster/auth/index.vue +0 -19
  667. package/pages/c/_cluster/index.vue +0 -17
  668. package/pages/c/_cluster/legacy/index.vue +0 -22
  669. package/pages/c/_cluster/manager/index.vue +0 -22
  670. package/pages/c/_cluster/mcapps/index.vue +0 -21
  671. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  672. package/pages/c/index.vue +0 -9
  673. package/pages/rio/mesh.vue +0 -508
  674. package/plugins/dashboard-store/__tests__/mutations.spec.ts +0 -406
  675. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  676. package/plugins/portal-vue.js +0 -4
  677. package/plugins/portal.js +0 -4
  678. package/plugins/resize.js +0 -5
  679. package/plugins/shortkey.js +0 -4
  680. package/plugins/tooltip.js +0 -4
  681. package/plugins/transitions.js +0 -4
  682. package/plugins/v-select.js +0 -4
  683. package/plugins/vue-clipboard2.js +0 -4
  684. package/tsconfig.default.json +0 -46
  685. package/utils/group.js +0 -70
  686. package/utils/nuxt.js +0 -659
  687. package/utils/router.scrollBehavior.js +0 -80
  688. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  689. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  690. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  691. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  692. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  693. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  694. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  695. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  696. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
  697. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  698. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  699. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
@@ -1,14 +1,16 @@
1
1
  <script>
2
2
  import LabeledSelect from '@shell/components/form/LabeledSelect';
3
+ import ResourceLabeledSelect from '@shell/components/form/ResourceLabeledSelect';
3
4
  import { SECRET } from '@shell/config/types';
4
5
  import { _EDIT, _VIEW } from '@shell/config/query-params';
5
6
  import { SECRET_TYPES as TYPES } from '@shell/config/secret';
6
- import sortBy from 'lodash/sortBy';
7
+ import { PaginationParamFilter } from '@shell/types/store/pagination.types';
8
+ import { LABEL_SELECT_KINDS } from '@shell/types/components/labeledSelect';
7
9
 
8
10
  const NONE = '__[[NONE]]__';
9
11
 
10
12
  export default {
11
- components: { LabeledSelect },
13
+ components: { LabeledSelect, ResourceLabeledSelect },
12
14
 
13
15
  props: {
14
16
  value: {
@@ -62,6 +64,33 @@ export default {
62
64
  }
63
65
  },
64
66
 
67
+ data() {
68
+ return {
69
+ secrets: null,
70
+ SECRET,
71
+ allSecretsSettings: {
72
+ mapResult: (secrets) => {
73
+ const allSecretsInNamespace = secrets.filter((secret) => this.types.includes(secret._type) && secret.namespace === this.namespace);
74
+ const mappedSecrets = this.mapSecrets(allSecretsInNamespace.sort((a, b) => a.name.localeCompare(b.name)));
75
+
76
+ this.secrets = allSecretsInNamespace; // We need the key from the selected secret
77
+
78
+ return mappedSecrets;
79
+ }
80
+ },
81
+ paginateSecretsSetting: {
82
+ requestSettings: this.paginatePageOptions,
83
+ mapResult: (secrets) => {
84
+ const mappedSecrets = this.mapSecrets(secrets);
85
+
86
+ this.secrets = secrets; // We need the key from the selected secret. When paginating we won't touch the store, so just pass back here
87
+
88
+ return mappedSecrets;
89
+ }
90
+ }
91
+ };
92
+ },
93
+
65
94
  computed: {
66
95
  name: {
67
96
  get() {
@@ -89,36 +118,77 @@ export default {
89
118
  this.$emit('input', { [this.mountKey]: { secretKeyRef: { [this.nameKey]: this.name, [this.keyKey]: key } } });
90
119
  }
91
120
  },
92
- secrets() {
93
- const allSecrets = this.$store.getters[`${ this.inStore }/all`](SECRET);
94
121
 
95
- return allSecrets
96
- .filter((secret) => this.types.includes(secret._type) && secret.namespace === this.namespace);
97
- },
98
- secretNames() {
99
- const mappedSecrets = this.secrets.map((secret) => ({
100
- label: secret.name,
101
- value: secret.name
102
- })).sort();
103
-
104
- return [{ label: 'None', value: NONE }, ...sortBy(mappedSecrets, 'label')];
105
- },
106
122
  keys() {
107
- const secret = this.secrets.find((secret) => secret.name === this.name) || {};
123
+ const secret = (this.secrets || []).find((secret) => secret.name === this.name) || {};
108
124
 
109
125
  return Object.keys(secret.data || {}).map((key) => ({
110
126
  label: key,
111
127
  value: key
112
128
  }));
113
129
  },
130
+
114
131
  isView() {
115
132
  return this.mode === _VIEW;
116
133
  },
134
+
117
135
  isKeyDisabled() {
118
136
  return !this.isView && (!this.name || this.name === NONE || this.disabled);
119
137
  }
120
138
  },
121
139
 
140
+ methods: {
141
+ /**
142
+ * Provide a set of options for the LabelSelect ([none, ...{label, value}])
143
+ */
144
+ mapSecrets(secrets) {
145
+ const mappedSecrets = secrets
146
+ .reduce((res, s) => {
147
+ if (s.kind === LABEL_SELECT_KINDS.NONE) {
148
+ return res;
149
+ }
150
+
151
+ if (s.id) {
152
+ res.push({ label: s.name, value: s.name });
153
+ } else {
154
+ res.push(s);
155
+ }
156
+
157
+ return res;
158
+ }, []);
159
+
160
+ return [
161
+ {
162
+ label: 'None', value: NONE, kind: LABEL_SELECT_KINDS.NONE
163
+ },
164
+ ...mappedSecrets
165
+ ];
166
+ },
167
+
168
+ /**
169
+ * @param [LabelSelectPaginationFunctionOptions] opts
170
+ * @returns LabelSelectPaginationFunctionOptions
171
+ */
172
+ paginatePageOptions(opts) {
173
+ const { opts: { filter } } = opts;
174
+
175
+ const filters = !!filter ? [PaginationParamFilter.createSingleField({ field: 'metadata.name', value: filter })] : [];
176
+
177
+ filters.push(
178
+ PaginationParamFilter.createSingleField({ field: 'metadata.namespace', value: this.namespace }),
179
+ PaginationParamFilter.createSingleField({ field: 'metadata.fields.1', value: this.types.join(',') })
180
+ );
181
+
182
+ return {
183
+ ...opts,
184
+ filters,
185
+ groupByNamespace: false,
186
+ classify: true,
187
+ sort: [{ asc: true, field: 'metadata.name' }],
188
+ };
189
+ },
190
+ }
191
+
122
192
  };
123
193
  </script>
124
194
 
@@ -128,12 +198,17 @@ export default {
128
198
  :class="{'show-key-selector': showKeySelector}"
129
199
  >
130
200
  <div class="input-container">
131
- <LabeledSelect
201
+ <!-- key by namespace to ensure label select current page is recreated on ns change -->
202
+ <ResourceLabeledSelect
203
+ :key="namespace"
132
204
  v-model="name"
133
205
  :disabled="!isView && disabled"
134
- :options="secretNames"
135
206
  :label="secretNameLabel"
136
207
  :mode="mode"
208
+ :resource-type="SECRET"
209
+ :in-store="inStore"
210
+ :paginated-resource-settings="paginateSecretsSetting"
211
+ :all-resources-settings="allSecretsSettings"
137
212
  />
138
213
  <LabeledSelect
139
214
  v-if="showKeySelector"
@@ -7,6 +7,11 @@ import { SECRET_TYPES } from '@shell/config/secret';
7
7
  import { base64Encode } from '@shell/utils/crypto';
8
8
  import { addObjects, insertAt } from '@shell/utils/array';
9
9
  import { sortBy } from '@shell/utils/sort';
10
+ import {
11
+ FilterArgs,
12
+ PaginationFilterField,
13
+ PaginationParamFilter,
14
+ } from '@shell/types/store/pagination.types';
10
15
 
11
16
  export default {
12
17
  name: 'SelectOrCreateAuthSecret',
@@ -47,6 +52,9 @@ export default {
47
52
  required: true,
48
53
  },
49
54
 
55
+ /**
56
+ * Limit the selection of an existing secret to the namespace provided
57
+ */
50
58
  limitToNamespace: {
51
59
  type: Boolean,
52
60
  default: true,
@@ -117,23 +125,38 @@ export default {
117
125
  */
118
126
  delegateCreateToParent: {
119
127
  type: Boolean,
120
- default: false
121
- }
128
+ default: false,
129
+ },
130
+
131
+ /**
132
+ * Set to false to make a fresh http request to secrets every time. This can be used when secrets have already been used for
133
+ * another purpose on the same page
134
+ *
135
+ * Set to true to cache the response
136
+ */
137
+ cacheSecrets: {
138
+ type: Boolean,
139
+ default: false,
140
+ },
122
141
  },
123
142
 
124
143
  async fetch() {
125
144
  if ( (this.allowSsh || this.allowBasic || this.allowRke) && this.$store.getters[`${ this.inStore }/schemaFor`](SECRET) ) {
126
- // Avoid an async call and loading screen if already loaded by someone else
127
- if ( this.$store.getters[`${ this.inStore }/haveAll`](SECRET) ) {
128
- this.allSecrets = this.$store.getters[`${ this.inStore }/all`](SECRET);
145
+ if (this.$store.getters[`${ this.inStore }/paginationEnabled`](SECRET)) {
146
+ // Filter results via api (because we shouldn't be fetching them all...)
147
+ this.filteredSecrets = await this.filterSecretsByApi();
129
148
  } else {
130
- this.allSecrets = await this.$store.dispatch(`${ this.inStore }/findAll`, { type: SECRET });
149
+ // Cannot yet filter via api, so fetch all and filter later on
150
+ this.allSecrets = await this.$store.dispatch(
151
+ `${ this.inStore }/findAll`,
152
+ { type: SECRET }
153
+ );
131
154
  }
132
155
  }
133
156
 
134
157
  if ( this.allowS3 && this.$store.getters['rancher/canList'](NORMAN.CLOUD_CREDENTIAL) ) {
135
158
  // Avoid an async call and loading screen if already loaded by someone else
136
- if ( this.$store.getters['rancher/haveAll'](NORMAN.CLOUD_CREDENTIAL) ) {
159
+ if (this.$store.getters['rancher/haveAll'](NORMAN.CLOUD_CREDENTIAL)) {
137
160
  this.allCloudCreds = this.$store.getters['rancher/all'](NORMAN.CLOUD_CREDENTIAL);
138
161
  } else {
139
162
  this.allCloudCreds = await this.$store.dispatch('rancher/findAll', { type: NORMAN.CLOUD_CREDENTIAL });
@@ -166,34 +189,30 @@ export default {
166
189
  this.update();
167
190
  },
168
191
 
169
- data(props) {
192
+ data() {
170
193
  return {
171
194
  allCloudCreds: [],
172
- allSecrets: [],
173
- selected: null,
195
+
196
+ allSecrets: null,
197
+ filteredSecrets: null,
198
+
199
+ selected: null,
200
+
201
+ filterByNamespace: this.namespace && this.limitToNamespace,
174
202
 
175
203
  publicKey: '',
176
204
  privateKey: '',
177
- uniqueId: new Date().getTime() // Allows form state to be individually tracked if the form is in a list
205
+ uniqueId: new Date().getTime(), // Allows form state to be individually tracked if the form is in a list
206
+
207
+ SSH: AUTH_TYPE._SSH,
208
+ BASIC: AUTH_TYPE._BASIC,
209
+ S3: AUTH_TYPE._S3,
178
210
  };
179
211
  },
180
212
 
181
213
  computed: {
182
- _SSH() {
183
- return AUTH_TYPE._SSH;
184
- },
185
-
186
- _BASIC() {
187
- return AUTH_TYPE._BASIC;
188
- },
189
-
190
- _S3() {
191
- return AUTH_TYPE._S3;
192
- },
193
-
194
- options() {
214
+ secretTypes() {
195
215
  const types = [];
196
- const keys = [];
197
216
 
198
217
  if ( this.allowSsh ) {
199
218
  types.push(SECRET_TYPES.SSH);
@@ -207,41 +226,55 @@ export default {
207
226
  types.push(SECRET_TYPES.RKE_AUTH_CONFIG);
208
227
  }
209
228
 
210
- let out = this.allSecrets
211
- .filter((x) => this.namespace && this.limitToNamespace ? x.metadata.namespace === this.namespace : true)
212
- .filter((x) => {
213
- // Must match one of the types if given
214
- if ( types.length && !types.includes(x._type) ) {
215
- return false;
216
- }
217
-
218
- // Must match ALL of the keys if given
219
- if ( keys.length ) {
220
- const dataKeys = Object.keys(x.data || {});
229
+ return types;
230
+ },
221
231
 
222
- if ( !keys.every((key) => dataKeys.includes(key)) ) {
232
+ /**
233
+ * Fitler secrets given their namespace and required secret type
234
+ *
235
+ * Convert secrets to list of options and suplement with custom entries
236
+ */
237
+ options() {
238
+ let filteredSecrets = [];
239
+
240
+ if (this.allSecrets) {
241
+ // Fitler secrets given their namespace and required secret type
242
+ filteredSecrets = this.allSecrets
243
+ .filter((x) => this.filterByNamespace ? x.metadata.namespace === this.namespace : true
244
+ )
245
+ .filter((x) => {
246
+ // Must match one of the required types
247
+ if (
248
+ this.secretTypes.length &&
249
+ !this.secretTypes.includes(x._type)
250
+ ) {
223
251
  return false;
224
252
  }
225
- }
226
253
 
227
- return true;
228
- }).map((x) => {
229
- const {
230
- dataPreview, subTypeDisplay, metadata, id
231
- } = x;
254
+ return true;
255
+ });
256
+ } else if (this.filteredSecrets) {
257
+ filteredSecrets = this.filteredSecrets;
258
+ }
232
259
 
233
- const label = subTypeDisplay && dataPreview ? `${ metadata.name } (${ subTypeDisplay }: ${ dataPreview })` : `${ metadata.name } (${ subTypeDisplay })`;
260
+ let out = filteredSecrets.map((x) => {
261
+ const {
262
+ dataPreview, subTypeDisplay, metadata, id
263
+ } = x;
234
264
 
235
- return {
236
- label,
237
- group: metadata.namespace,
238
- value: id,
239
- };
240
- });
265
+ const label =
266
+ subTypeDisplay && dataPreview ? `${ metadata.name } (${ subTypeDisplay }: ${ dataPreview })` : `${ metadata.name } (${ subTypeDisplay })`;
241
267
 
242
- if ( this.allowS3 ) {
268
+ return {
269
+ label,
270
+ group: metadata.namespace,
271
+ value: id,
272
+ };
273
+ });
274
+
275
+ if (this.allowS3) {
243
276
  const more = this.allCloudCreds
244
- .filter((x) => ['aws', 's3'].includes(x.provider) )
277
+ .filter((x) => ['aws', 's3'].includes(x.provider))
245
278
  .map((x) => {
246
279
  return {
247
280
  label: `${ x.nameDisplay } (${ x.providerDisplay })`,
@@ -349,11 +382,16 @@ export default {
349
382
  publicKey: 'updateKeyVal',
350
383
  privateKey: 'updateKeyVal',
351
384
 
352
- namespace(ns) {
353
- if ( ns && !this.selected.startsWith(`${ ns }/`) ) {
385
+ async namespace(ns) {
386
+ if (ns && !this.selected.startsWith(`${ ns }/`)) {
354
387
  this.selected = AUTH_TYPE._NONE;
355
388
  }
356
- }
389
+
390
+ // if ns has changed and we're filtering by api... we need to re-fetch entries
391
+ if (this.filteredSecrets && this.filterByNamespace) {
392
+ this.filteredSecrets = await this.filterSecretsByApi();
393
+ }
394
+ },
357
395
  },
358
396
 
359
397
  created() {
@@ -369,8 +407,43 @@ export default {
369
407
  },
370
408
 
371
409
  methods: {
410
+ async filterSecretsByApi() {
411
+ const findPageArgs = {
412
+ // Of type ActionFindPageArgs
413
+ namespaced: this.filterByNamespace ? this.namespace : '',
414
+ pagination: new FilterArgs({
415
+ filters: [
416
+ PaginationParamFilter.createMultipleFields(
417
+ this.secretTypes.map(
418
+ (t) => new PaginationFilterField({
419
+ field: 'metadata.fields.1',
420
+ value: t,
421
+ })
422
+ )
423
+ ),
424
+ ],
425
+ }),
426
+ };
427
+
428
+ if (this.cacheSecrets) {
429
+ return await this.$store.dispatch(`${ this.inStore }/findPage`, {
430
+ type: SECRET,
431
+ opt: findPageArgs,
432
+ });
433
+ }
434
+
435
+ const url = this.$store.getters[`${ this.inStore }/urlFor`](
436
+ SECRET,
437
+ null,
438
+ findPageArgs
439
+ );
440
+ const res = await this.$store.dispatch(`cluster/request`, { url });
441
+
442
+ return res?.data || [];
443
+ },
444
+
372
445
  updateKeyVal() {
373
- if ( ![AUTH_TYPE._SSH, AUTH_TYPE._BASIC, AUTH_TYPE._S3].includes(this.selected)) {
446
+ if ( ![AUTH_TYPE._SSH, AUTH_TYPE._BASIC, AUTH_TYPE._S3].includes(this.selected) ) {
374
447
  this.privateKey = '';
375
448
  this.publicKey = '';
376
449
  }
@@ -485,7 +558,7 @@ export default {
485
558
  :selectable="option => !option.disabled"
486
559
  />
487
560
  </div>
488
- <template v-if="selected === _SSH">
561
+ <template v-if="selected === SSH">
489
562
  <div :class="moreCols">
490
563
  <LabeledInput
491
564
  v-model="publicKey"
@@ -505,7 +578,7 @@ export default {
505
578
  />
506
579
  </div>
507
580
  </template>
508
- <template v-else-if="selected === _BASIC">
581
+ <template v-else-if="selected === BASIC">
509
582
  <div :class="moreCols">
510
583
  <LabeledInput
511
584
  v-model="publicKey"
@@ -524,7 +597,7 @@ export default {
524
597
  />
525
598
  </div>
526
599
  </template>
527
- <template v-else-if="selected === _S3">
600
+ <template v-else-if="selected === S3">
528
601
  <div :class="moreCols">
529
602
  <LabeledInput
530
603
  v-model="publicKey"
@@ -13,28 +13,22 @@
13
13
 
14
14
  name: example-secret-name
15
15
  key: example-secret-key
16
+
17
+ FIXME: The solution to above would have been to have a configurable path to set/get name and key from.
18
+ This would have avoided a lot of copy and paste
16
19
  */
17
20
  import LabeledSelect from '@shell/components/form/LabeledSelect';
21
+ import ResourceLabeledSelect from '@shell/components/form/ResourceLabeledSelect';
18
22
  import { SECRET } from '@shell/config/types';
19
23
  import { _EDIT, _VIEW } from '@shell/config/query-params';
20
24
  import { TYPES } from '@shell/models/secret';
21
- import sortBy from 'lodash/sortBy';
25
+ import { LABEL_SELECT_KINDS } from '@shell/types/components/labeledSelect';
26
+ import { PaginationParamFilter } from '@shell/types/store/pagination.types';
22
27
 
23
28
  const NONE = '__[[NONE]]__';
24
29
 
25
30
  export default {
26
- components: { LabeledSelect },
27
-
28
- async fetch() {
29
- // Make sure secrets are in the store so that the secret
30
- // selectors in the receiver config forms will have secrets
31
- // to choose from.
32
- const allSecrets = await this.$store.dispatch('cluster/findAll', { type: SECRET });
33
-
34
- const allSecretsInNamespace = allSecrets.filter((secret) => this.types.includes(secret._type) && secret.namespace === this.namespace);
35
-
36
- this.secrets = allSecretsInNamespace;
37
- },
31
+ components: { LabeledSelect, ResourceLabeledSelect },
38
32
 
39
33
  props: {
40
34
  test: { type: String, default: '' },
@@ -74,24 +68,37 @@ export default {
74
68
 
75
69
  data(props) {
76
70
  return {
77
- secrets: [],
78
- name: props.initialName,
79
- key: props.initialKey,
80
- none: NONE
71
+ secrets: [],
72
+ name: props.initialName,
73
+ key: props.initialKey,
74
+ none: NONE,
75
+ SECRET,
76
+ allSecretsSettings: {
77
+ mapResult: (secrets) => {
78
+ const allSecretsInNamespace = secrets.filter((secret) => this.types.includes(secret._type) && secret.namespace === this.namespace);
79
+ const mappedSecrets = this.mapSecrets(allSecretsInNamespace.sort((a, b) => a.name.localeCompare(b.name)));
80
+
81
+ this.secrets = allSecretsInNamespace; // We need the key from the selected secret
82
+
83
+ return mappedSecrets;
84
+ }
85
+ },
86
+ paginateSecretsSetting: {
87
+ requestSettings: this.paginatePageOptions,
88
+ mapResult: (secrets) => {
89
+ const mappedSecrets = this.mapSecrets(secrets);
90
+
91
+ this.secrets = secrets; // We need the key from the selected secret. When paginating we won't touch the store, so just pass back here
92
+
93
+ return mappedSecrets;
94
+ }
95
+ }
81
96
  };
82
97
  },
83
98
 
84
99
  computed: {
85
- secretNames() {
86
- const mappedSecrets = this.secrets.map((secret) => ({
87
- label: secret.name,
88
- value: secret.name
89
- })).sort();
90
-
91
- return [{ label: 'None', value: NONE }, ...sortBy(mappedSecrets, 'label')];
92
- },
93
100
  keys() {
94
- const secret = this.secrets.find((secret) => secret.name === this.name) || {};
101
+ const secret = (this.secrets || []).find((secret) => secret.name === this.name) || {};
95
102
 
96
103
  return Object.keys(secret.data || {}).map((key) => ({
97
104
  label: key,
@@ -107,6 +114,56 @@ export default {
107
114
  },
108
115
 
109
116
  methods: {
117
+ /**
118
+ * Provide a set of options for the LabelSelect ([none, ...{label, value}])
119
+ */
120
+ mapSecrets(secrets) {
121
+ const mappedSecrets = secrets
122
+ .reduce((res, s) => {
123
+ if (s.kind === LABEL_SELECT_KINDS.NONE) {
124
+ return res;
125
+ }
126
+
127
+ if (s.id) {
128
+ res.push({ label: s.name, value: s.name });
129
+ } else {
130
+ res.push(s);
131
+ }
132
+
133
+ return res;
134
+ }, []);
135
+
136
+ return [
137
+ {
138
+ label: 'None', value: NONE, kind: LABEL_SELECT_KINDS.NONE
139
+ },
140
+ ...mappedSecrets
141
+ ];
142
+ },
143
+
144
+ /**
145
+ * @param [LabelSelectPaginationFunctionOptions] opts
146
+ * @returns LabelSelectPaginationFunctionOptions
147
+ */
148
+ paginatePageOptions(opts) {
149
+ const { opts: { filter } } = opts;
150
+
151
+ const filters = !!filter ? [PaginationParamFilter.createSingleField({ field: 'metadata.name', value: filter })] : [];
152
+
153
+ filters.push(
154
+ PaginationParamFilter.createSingleField({ field: 'metadata.namespace', value: this.namespace }),
155
+ PaginationParamFilter.createSingleField({ field: 'metadata.fields.1', value: this.types.join(',') })
156
+ );
157
+
158
+ return {
159
+ ...opts,
160
+ filters,
161
+ groupByNamespace: false,
162
+ classify: true,
163
+ sort: [{ asc: true, field: 'metadata.name' }],
164
+ };
165
+ },
166
+
110
167
  updateSecretName(e) {
111
168
  if (e.value === this.none) {
112
169
  // The key should appear blank if the secret name is cleared
@@ -128,13 +185,16 @@ export default {
128
185
  <template>
129
186
  <div class="secret-selector show-key-selector">
130
187
  <div class="input-container">
131
- <LabeledSelect
188
+ <ResourceLabeledSelect
132
189
  v-model="name"
133
190
  class="col span-6"
134
191
  :disabled="!isView && disabled"
135
- :options="secretNames"
192
+ :loading="$fetchState.pending"
136
193
  :label="secretNameLabel"
137
194
  :mode="mode"
195
+ :resource-type="SECRET"
196
+ :paginated-resource-settings="paginateSecretsSetting"
197
+ :all-resources-settings="allSecretsSettings"
138
198
  @selecting="updateSecretName"
139
199
  />
140
200
  <LabeledSelect
@@ -3,10 +3,10 @@ import KeyValue from '@shell/components/form/KeyValue';
3
3
  import { _VIEW } from '@shell/config/query-params';
4
4
  import Select from '@shell/components/form/Select';
5
5
 
6
- const EFFECT_VALUES = {
7
- NO_SCHEDULE: 'NoSchedule',
8
- PREFER_NO_SCHEDULE: 'PreferNoSchedule',
9
- NO_EXECUTE: 'NoExecute',
6
+ const DEFAULT_EFFECT_VALUES = {
7
+ NoSchedule: 'NoSchedule',
8
+ PreferNoSchedule: 'PreferNoSchedule',
9
+ NoExecute: 'NoExecute',
10
10
  };
11
11
 
12
12
  export default {
@@ -24,11 +24,15 @@ export default {
24
24
  disabled: {
25
25
  default: false,
26
26
  type: Boolean
27
+ },
28
+ effectValues: {
29
+ type: Object,
30
+ default: () => DEFAULT_EFFECT_VALUES
27
31
  }
28
32
  },
29
33
 
30
34
  data() {
31
- return { effectOptions: Object.values(EFFECT_VALUES).map((v) => ({ label: v, value: v })) };
35
+ return { effectOptions: Object.keys(this.effectValues).map((k) => ({ label: this.effectValues[k], value: k })) };
32
36
  },
33
37
 
34
38
  computed: {
@@ -43,7 +47,7 @@ export default {
43
47
  },
44
48
 
45
49
  defaultAddData() {
46
- return { effect: EFFECT_VALUES.NO_SCHEDULE };
50
+ return { effect: this.effectOptions[0].value };
47
51
  }
48
52
  }
49
53
  };
@@ -53,6 +57,7 @@ export default {
53
57
  <div class="taints">
54
58
  <KeyValue
55
59
  v-model="localValue"
60
+ data-testid="taints-keyvalue"
56
61
  :title="t('tableHeaders.taints')"
57
62
  :mode="mode"
58
63
  :as-map="false"
@@ -69,9 +74,10 @@ export default {
69
74
  {{ t('tableHeaders.effect') }}
70
75
  </template>
71
76
 
72
- <template #col:effect="{row, queueUpdate}">
77
+ <template #col:effect="{row, queueUpdate, i}">
73
78
  <Select
74
79
  v-model="row.effect"
80
+ :data-testid="`taints-effect-row-${i}`"
75
81
  :options="effectOptions"
76
82
  :disabled="disabled"
77
83
  class="compact-select"