@rancher/shell 0.5.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (581) hide show
  1. package/assets/data/aws-regions.json +9 -0
  2. package/assets/images/vendor/openid.svg +18 -0
  3. package/assets/styles/app.scss +1 -2
  4. package/assets/styles/fonts/_icons.scss +3 -3
  5. package/assets/styles/global/_columns.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +2 -0
  7. package/assets/styles/themes/_csp.scss +2 -2
  8. package/assets/styles/themes/_dark.scss +8 -2
  9. package/assets/styles/themes/_light.scss +2 -1
  10. package/assets/styles/themes/_suse.scss +1 -1
  11. package/assets/styles/vendor/vue-select.scss +5 -0
  12. package/assets/translations/en-us.yaml +296 -58
  13. package/assets/translations/zh-hans.yaml +5 -27
  14. package/babel.config.js +1 -1
  15. package/chart/__tests__/S3.test.ts +9 -2
  16. package/chart/monitoring/grafana/index.vue +6 -2
  17. package/chart/monitoring/prometheus/index.vue +2 -2
  18. package/chart/rancher-backup/S3.vue +11 -9
  19. package/chart/rancher-backup/index.vue +15 -5
  20. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  21. package/cloud-credential/generic.vue +18 -9
  22. package/cloud-credential/harvester.vue +11 -3
  23. package/components/AppModal.vue +167 -0
  24. package/components/AssignTo.vue +7 -4
  25. package/components/AsyncButton.vue +18 -5
  26. package/components/BackLink.vue +4 -4
  27. package/components/BannerGraphic.vue +1 -0
  28. package/components/BrandImage.vue +47 -1
  29. package/components/Carousel.vue +14 -8
  30. package/components/Certificates.vue +8 -11
  31. package/components/ClusterBadge.vue +12 -3
  32. package/components/ClusterIconMenu.vue +44 -16
  33. package/components/ClusterProviderIcon.vue +14 -3
  34. package/components/CodeMirror.vue +73 -38
  35. package/components/CommunityLinks.vue +12 -8
  36. package/components/CreateDriver.vue +81 -0
  37. package/components/CruResource.vue +51 -27
  38. package/components/DetailTop.vue +2 -2
  39. package/components/Dialog.vue +6 -5
  40. package/components/DisableAuthProviderModal.vue +14 -8
  41. package/components/DraggableZone.vue +2 -2
  42. package/components/ExplorerMembers.vue +3 -3
  43. package/components/ExplorerProjectsNamespaces.vue +6 -6
  44. package/components/FixedBanner.vue +47 -36
  45. package/components/GlobalRoleBindings.vue +26 -0
  46. package/components/Import.vue +10 -6
  47. package/components/Inactivity.vue +1 -5
  48. package/components/KeyValueView.vue +14 -10
  49. package/components/MessageLink.vue +2 -2
  50. package/components/ModalWithCard.vue +5 -8
  51. package/components/MoveModal.vue +35 -33
  52. package/components/PodSecurityAdmission.vue +3 -3
  53. package/components/PromptChangePassword.vue +33 -33
  54. package/components/PromptModal.vue +11 -21
  55. package/components/PromptRemove.vue +11 -17
  56. package/components/PromptRestore.vue +18 -16
  57. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  58. package/components/Questions/__tests__/Float.test.ts +9 -19
  59. package/components/Questions/__tests__/Int.test.ts +9 -19
  60. package/components/Questions/__tests__/String.test.ts +9 -19
  61. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  62. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  63. package/components/Questions/index.vue +18 -2
  64. package/components/ResourceCancelModal.vue +34 -29
  65. package/components/ResourceDetail/Masthead.vue +23 -7
  66. package/components/ResourceDetail/index.vue +5 -0
  67. package/components/ResourceList/Masthead.vue +28 -10
  68. package/components/ResourceList/index.vue +65 -14
  69. package/components/ResourceTable.vue +73 -19
  70. package/components/ResourceYaml.vue +1 -0
  71. package/components/SelectIconGrid.vue +3 -3
  72. package/components/SideNav.vue +15 -37
  73. package/components/SingleClusterInfo.vue +4 -4
  74. package/components/SortableTable/THead.vue +26 -12
  75. package/components/SortableTable/filtering.js +9 -1
  76. package/components/SortableTable/grouping.js +8 -1
  77. package/components/SortableTable/index.vue +142 -42
  78. package/components/SortableTable/paging.js +36 -7
  79. package/components/SortableTable/selection.js +2 -1
  80. package/components/SortableTable/sorting.js +24 -7
  81. package/components/TabTitle.vue +84 -0
  82. package/components/Tabbed/index.vue +6 -1
  83. package/components/TableDataUserIcon.vue +47 -0
  84. package/components/TypeDescription.vue +1 -0
  85. package/components/Wizard.vue +1 -0
  86. package/components/__tests__/AppModal.test.ts +98 -0
  87. package/components/__tests__/AsyncButton.test.ts +1 -3
  88. package/components/__tests__/BackLink.test.ts +1 -1
  89. package/components/__tests__/ButtonGroup.test.ts +3 -6
  90. package/components/__tests__/Carousel.test.ts +43 -0
  91. package/components/__tests__/Certificates.test.ts +29 -0
  92. package/components/__tests__/{CodeMirror.spec.ts → CodeMirror.test.ts} +5 -17
  93. package/components/__tests__/CruResource.test.ts +10 -9
  94. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  95. package/components/__tests__/FixedBanner.test.ts +5 -20
  96. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  97. package/components/__tests__/TabTitle.test.ts +129 -0
  98. package/components/auth/AzureWarning.vue +2 -2
  99. package/components/auth/RoleDetailEdit.vue +10 -0
  100. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  101. package/components/auth/login/oidc.vue +7 -1
  102. package/components/fleet/FleetClusters.vue +9 -9
  103. package/components/fleet/FleetIntro.vue +11 -17
  104. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  105. package/components/fleet/FleetRepos.vue +1 -0
  106. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  107. package/components/form/ArrayList.vue +30 -19
  108. package/components/form/ArrayListSelect.vue +9 -4
  109. package/components/form/ClusterAppearance.vue +132 -0
  110. package/components/form/ColorInput.vue +1 -0
  111. package/components/form/Error.vue +3 -3
  112. package/components/form/Footer.vue +2 -2
  113. package/components/form/GitPicker.vue +83 -38
  114. package/components/form/KeyValue.vue +67 -48
  115. package/components/form/LabeledSelect.vue +143 -43
  116. package/components/form/Labels.vue +3 -1
  117. package/components/form/NameNsDescription.vue +26 -9
  118. package/components/form/ResourceLabeledSelect.vue +187 -0
  119. package/components/form/ResourceTabs/index.vue +31 -15
  120. package/components/form/SecretSelector.vue +93 -18
  121. package/components/form/Select.vue +1 -1
  122. package/components/form/SelectOrCreateAuthSecret.vue +135 -62
  123. package/components/form/SimpleSecretSelector.vue +88 -28
  124. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  125. package/components/form/__tests__/KeyValue.test.ts +121 -12
  126. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  127. package/components/form/__tests__/NameNsDescription.test.ts +25 -15
  128. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  129. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  130. package/components/formatter/AppSummaryGraph.vue +2 -2
  131. package/components/formatter/CloudCredPublicData.vue +30 -0
  132. package/components/formatter/ClusterLink.vue +2 -2
  133. package/components/formatter/FleetSummaryGraph.vue +2 -1
  134. package/components/formatter/ImagePercentageBar.vue +0 -4
  135. package/components/formatter/IngressTarget.vue +18 -7
  136. package/components/formatter/Link.vue +2 -2
  137. package/components/formatter/LinkDetail.vue +2 -2
  138. package/components/formatter/LinkDetailImage.vue +2 -2
  139. package/components/formatter/LinkName.vue +2 -2
  140. package/components/formatter/LiveDate.vue +16 -0
  141. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  142. package/components/formatter/SecretType.vue +2 -2
  143. package/components/formatter/VirtualServiceGateways.vue +2 -2
  144. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  145. package/components/nav/Group.vue +7 -5
  146. package/components/nav/Header.vue +82 -43
  147. package/components/nav/NamespaceFilter.vue +8 -1
  148. package/components/nav/TopLevelMenu.vue +336 -125
  149. package/components/nav/Type.vue +58 -102
  150. package/components/nav/__tests__/TopLevelMenu.test.ts +370 -9
  151. package/components/nav/__tests__/Type.test.ts +321 -126
  152. package/components/nuxt/nuxt-child.js +0 -5
  153. package/components/nuxt/nuxt-error.vue +1 -1
  154. package/components/nuxt/nuxt-link.client.js +13 -95
  155. package/components/templates/default.vue +3 -3
  156. package/components/templates/error.vue +6 -10
  157. package/components/templates/standalone.vue +0 -4
  158. package/components/templates/unauthenticated.vue +1 -2
  159. package/components/user.retention/user-retention-header.vue +34 -0
  160. package/composables/useCompactInput.test.ts +36 -0
  161. package/composables/useCompactInput.ts +2 -2
  162. package/composables/useI18n.ts +26 -0
  163. package/composables/useLabeledFormElement.test.ts +135 -0
  164. package/composables/useStore.ts +16 -0
  165. package/config/home-links.js +32 -1
  166. package/config/labels-annotations.js +2 -1
  167. package/config/middleware.js +0 -6
  168. package/config/pagination-table-headers.js +57 -0
  169. package/config/pod-security-admission.ts +1 -1
  170. package/config/private-label.js +1 -3
  171. package/config/product/auth.js +1 -0
  172. package/config/product/explorer.js +167 -46
  173. package/config/product/legacy.js +3 -95
  174. package/config/product/manager.js +44 -11
  175. package/config/query-params.js +1 -0
  176. package/config/roles.ts +23 -0
  177. package/config/router/index.js +23 -0
  178. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  179. package/config/router/navigation-guards/authentication.js +63 -0
  180. package/config/router/navigation-guards/index.js +15 -0
  181. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  182. package/config/router/routes.js +487 -0
  183. package/config/settings.ts +38 -2
  184. package/config/store.js +7 -3
  185. package/config/table-headers.js +46 -1
  186. package/config/types.js +36 -16
  187. package/config/uiplugins.js +10 -5
  188. package/core/plugin-helpers.js +1 -1
  189. package/core/plugin.ts +2 -1
  190. package/core/plugins.js +289 -282
  191. package/creators/app/files/.eslintignore +0 -2
  192. package/creators/app/files/.vscode/settings.json +0 -1
  193. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  194. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  195. package/creators/pkg/init +32 -0
  196. package/detail/__tests__/service.test.ts +62 -0
  197. package/detail/catalog.cattle.io.app.vue +1 -1
  198. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  199. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  200. package/detail/namespace.vue +2 -2
  201. package/detail/networking.k8s.io.ingress.vue +52 -19
  202. package/detail/node.vue +20 -43
  203. package/detail/pod.vue +1 -68
  204. package/detail/provisioning.cattle.io.cluster.vue +2 -1
  205. package/detail/service.vue +1 -1
  206. package/detail/workload/index.vue +2 -15
  207. package/dialog/AddCustomBadgeDialog.vue +318 -161
  208. package/dialog/DeactivateDriverDialog.vue +118 -0
  209. package/dialog/RollbackWorkloadDialog.vue +2 -2
  210. package/dialog/RotateCertificatesDialog.vue +0 -21
  211. package/directives/clean-html.js +15 -0
  212. package/directives/clean-tooltip.js +32 -0
  213. package/directives/focus.js +41 -0
  214. package/directives/int-number.js +21 -0
  215. package/directives/positive-int-number.js +19 -0
  216. package/directives/trim-whitespace.js +19 -0
  217. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  218. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  219. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  220. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  221. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  222. package/edit/__tests__/nodeDriver.test.ts +107 -0
  223. package/edit/__tests__/service.test.ts +1 -5
  224. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  225. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  226. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  227. package/edit/auth/__tests__/azuread.test.ts +241 -0
  228. package/edit/auth/__tests__/oidc.test.ts +137 -0
  229. package/edit/auth/azuread.vue +133 -31
  230. package/edit/auth/github.vue +5 -17
  231. package/edit/auth/googleoauth.vue +5 -18
  232. package/edit/auth/ldap/index.vue +5 -17
  233. package/edit/auth/oidc.vue +143 -42
  234. package/edit/auth/saml.vue +5 -14
  235. package/edit/catalog.cattle.io.clusterrepo.vue +175 -20
  236. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  237. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  238. package/edit/cloudcredential.vue +26 -4
  239. package/edit/configmap.vue +10 -4
  240. package/edit/fleet.cattle.io.gitrepo.vue +7 -4
  241. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  242. package/edit/kontainerDriver.vue +65 -0
  243. package/edit/logging-flow/Match.vue +10 -9
  244. package/edit/logging-flow/index.vue +4 -19
  245. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  246. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  247. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  248. package/edit/management.cattle.io.project.vue +2 -1
  249. package/edit/management.cattle.io.setting.vue +20 -0
  250. package/edit/management.cattle.io.user.vue +2 -1
  251. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  252. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  253. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +1 -0
  254. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +3 -0
  255. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +2 -0
  256. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  257. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  258. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  259. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  260. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  261. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  262. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +45 -6
  263. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/selectors.test.ts +1 -1
  264. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  265. package/edit/nodeDriver.vue +65 -0
  266. package/edit/persistentvolume/index.vue +2 -2
  267. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +18 -9
  268. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +165 -1
  269. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +1 -1
  270. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +0 -3
  271. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  272. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +70 -12
  273. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +5 -0
  274. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  275. package/edit/provisioning.cattle.io.cluster/index.vue +21 -15
  276. package/edit/provisioning.cattle.io.cluster/rke2.vue +185 -114
  277. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +67 -7
  278. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +19 -6
  279. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  280. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +7 -0
  281. package/edit/provisioning.cattle.io.cluster/tabs/etcd/S3Config.vue +1 -0
  282. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +1 -0
  283. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +3 -0
  284. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +1 -0
  285. package/edit/resources.cattle.io.backup.vue +139 -124
  286. package/edit/resources.cattle.io.restore.vue +146 -126
  287. package/edit/service.vue +1 -0
  288. package/edit/serviceaccount.vue +46 -4
  289. package/edit/workload/__tests__/Job.test.ts +1 -3
  290. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  291. package/edit/workload/mixins/workload.js +34 -1
  292. package/edit/workload/storage/emptyDir.vue +2 -2
  293. package/initialize/App.vue +75 -0
  294. package/initialize/app-extended.js +128 -0
  295. package/initialize/entry-helpers.js +549 -0
  296. package/initialize/entry.js +32 -0
  297. package/initialize/install-components.js +23 -0
  298. package/initialize/install-directives.js +59 -0
  299. package/initialize/install-plugins.js +123 -0
  300. package/list/__tests__/workload.test.ts +1 -1
  301. package/list/cis.cattle.io.clusterscan.vue +16 -10
  302. package/list/group.principal.vue +2 -2
  303. package/list/management.cattle.io.feature.vue +11 -7
  304. package/list/management.cattle.io.user.vue +36 -3
  305. package/list/networking.k8s.io.ingress.vue +36 -0
  306. package/list/node.vue +211 -73
  307. package/list/provisioning.cattle.io.cluster.vue +17 -4
  308. package/list/ui.cattle.io.navlink.vue +2 -2
  309. package/list/workload.vue +22 -0
  310. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  311. package/machine-config/__tests__/vmwarevsphere.test.ts +162 -59
  312. package/machine-config/amazonec2.vue +1 -1
  313. package/machine-config/azure.vue +38 -21
  314. package/machine-config/generic.vue +11 -15
  315. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  316. package/machine-config/vmwarevsphere.vue +20 -11
  317. package/middleware/authenticated.js +9 -361
  318. package/mixins/__tests__/chart.test.ts +48 -6
  319. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  320. package/mixins/auth-config.js +3 -2
  321. package/mixins/brand.js +75 -57
  322. package/mixins/chart.js +27 -13
  323. package/mixins/create-edit-view/index.js +2 -2
  324. package/mixins/fetch.client.js +42 -48
  325. package/mixins/labeled-form-element.ts +21 -1
  326. package/mixins/page-actions.js +7 -5
  327. package/mixins/resource-fetch-api-pagination.js +304 -0
  328. package/mixins/resource-fetch-namespaced.js +1 -1
  329. package/mixins/resource-fetch.js +46 -5
  330. package/models/__tests__/cluster.test.ts +44 -0
  331. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  332. package/models/__tests__/schema.tests.ts +24 -0
  333. package/models/__tests__/steve-schema.test.ts +73 -0
  334. package/models/__tests__/workload.test.ts +1 -1
  335. package/models/catalog.cattle.io.app.js +8 -0
  336. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  337. package/models/catalog.cattle.io.uiplugin.js +7 -8
  338. package/models/cis.cattle.io.clusterscan.js +29 -8
  339. package/models/cloudcredential.js +9 -1
  340. package/models/cluster/node.js +4 -0
  341. package/models/cluster/schema.js +6 -0
  342. package/models/cluster.js +33 -0
  343. package/models/driver.js +62 -0
  344. package/models/fleet.cattle.io.cluster.js +23 -11
  345. package/models/fleet.cattle.io.gitrepo.js +10 -0
  346. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  347. package/models/kontainerdriver.js +68 -0
  348. package/models/management/schema.js +6 -0
  349. package/models/management.cattle.io.authconfig.js +3 -2
  350. package/models/management.cattle.io.cluster.js +5 -4
  351. package/models/management.cattle.io.globalrole.js +2 -0
  352. package/models/management.cattle.io.user.js +67 -2
  353. package/models/monitoring.coreos.com.receiver.js +3 -1
  354. package/models/monitoring.coreos.com.route.js +1 -1
  355. package/models/networking.k8s.io.ingress.js +2 -1
  356. package/models/nodedriver.js +68 -0
  357. package/models/provisioning.cattle.io.cluster.js +34 -1
  358. package/models/schema.js +28 -7
  359. package/models/service.js +2 -0
  360. package/models/steve-schema.ts +254 -0
  361. package/models/workload.js +1 -0
  362. package/package.json +6 -5
  363. package/pages/about.vue +12 -5
  364. package/pages/account/index.vue +7 -2
  365. package/pages/auth/login.vue +106 -102
  366. package/pages/auth/logout.vue +2 -2
  367. package/pages/auth/setup.vue +57 -64
  368. package/pages/auth/verify.vue +17 -17
  369. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  370. package/pages/c/_cluster/apps/charts/index.vue +37 -13
  371. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  372. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  373. package/pages/c/_cluster/auth/config/index.vue +15 -9
  374. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  375. package/pages/c/_cluster/auth/user.retention/index.vue +384 -0
  376. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  377. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  378. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  379. package/pages/c/_cluster/explorer/index.vue +231 -72
  380. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  381. package/pages/c/_cluster/explorer/tools/index.vue +12 -176
  382. package/pages/c/_cluster/fleet/index.vue +88 -93
  383. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  384. package/pages/c/_cluster/longhorn/index.vue +52 -17
  385. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  386. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  387. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  388. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +94 -0
  389. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  390. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  391. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +63 -0
  392. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  393. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  394. package/pages/c/_cluster/monitoring/index.vue +1 -17
  395. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  396. package/pages/c/_cluster/neuvector/index.vue +1 -0
  397. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  398. package/pages/c/_cluster/settings/banners.vue +86 -8
  399. package/pages/c/_cluster/settings/brand.vue +258 -36
  400. package/pages/c/_cluster/settings/index.vue +4 -4
  401. package/pages/c/_cluster/settings/links.vue +5 -3
  402. package/pages/c/_cluster/settings/performance.vue +71 -2
  403. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  404. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +10 -7
  405. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  406. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  407. package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
  408. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  409. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  410. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  411. package/pages/c/_cluster/uiplugins/index.vue +38 -52
  412. package/pages/diagnostic.vue +1 -0
  413. package/pages/fail-whale.vue +103 -41
  414. package/pages/home.vue +81 -24
  415. package/pages/prefs.vue +8 -3
  416. package/pages/support/index.vue +12 -2
  417. package/plugins/clean-html-directive.js +5 -12
  418. package/plugins/clean-tooltip-directive.js +6 -31
  419. package/plugins/codemirror.js +0 -9
  420. package/plugins/dashboard-store/__tests__/mutations.test.ts +296 -313
  421. package/plugins/dashboard-store/actions.js +140 -32
  422. package/plugins/dashboard-store/getters.js +86 -39
  423. package/plugins/dashboard-store/index.js +0 -99
  424. package/plugins/dashboard-store/mutations.js +150 -48
  425. package/plugins/dashboard-store/resource-class.js +14 -109
  426. package/plugins/directives.js +6 -39
  427. package/plugins/ember-cookie.js +13 -0
  428. package/plugins/global-formatters.js +26 -5
  429. package/plugins/i18n.js +90 -56
  430. package/plugins/int-number.js +6 -20
  431. package/plugins/plugin.js +3 -3
  432. package/plugins/positive-int-number.js +6 -17
  433. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +124 -31
  434. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  435. package/plugins/steve/__tests__/subscribe.spec.ts +109 -0
  436. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  437. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  438. package/plugins/steve/actions.js +0 -1
  439. package/plugins/steve/getters.js +183 -63
  440. package/plugins/steve/hybrid-class.js +5 -1
  441. package/plugins/steve/mutations.js +29 -5
  442. package/plugins/steve/norman-class.js +123 -2
  443. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  444. package/plugins/steve/schema.d.ts +22 -0
  445. package/plugins/steve/steve-pagination-utils.ts +368 -0
  446. package/plugins/steve/subscribe.js +37 -75
  447. package/plugins/trim-whitespace.js +6 -34
  448. package/plugins/vue-js-modal.js +1 -1
  449. package/public/index.html +1 -0
  450. package/rancher-components/Accordion/Accordion.vue +3 -2
  451. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  452. package/rancher-components/Banner/Banner.test.ts +1 -5
  453. package/rancher-components/Banner/Banner.vue +2 -2
  454. package/rancher-components/Card/Card.vue +4 -4
  455. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  456. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  457. package/rancher-components/Form/LabeledInput/LabeledInput.vue +66 -30
  458. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  459. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  460. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  461. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  462. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  463. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  464. package/rancher-components/StringList/StringList.vue +8 -8
  465. package/rancher-components/components/Accordion/Accordion.vue +3 -2
  466. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  467. package/rancher-components/components/Banner/Banner.test.ts +1 -5
  468. package/rancher-components/components/Banner/Banner.vue +2 -2
  469. package/rancher-components/components/Card/Card.vue +4 -4
  470. package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
  471. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  472. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +66 -30
  473. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
  474. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  475. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  476. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  477. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  478. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  479. package/rancher-components/components/StringList/StringList.vue +8 -8
  480. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +27 -8
  481. package/scripts/clean +1 -1
  482. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  483. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  484. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  485. package/scripts/extension/helm/package/Dockerfile +1 -1
  486. package/scripts/extension/helm/scripts/patch +27 -0
  487. package/scripts/extension/publish +6 -6
  488. package/scripts/serve-pkgs +0 -2
  489. package/scripts/test-plugins-build.sh +6 -6
  490. package/scripts/vue-migrate.js +683 -0
  491. package/store/__tests__/catalog.test.ts +224 -0
  492. package/store/auth.js +23 -4
  493. package/store/aws.js +53 -6
  494. package/store/catalog.js +21 -5
  495. package/store/cru-resource.ts +26 -0
  496. package/store/customisation.js +35 -0
  497. package/store/features.js +6 -4
  498. package/store/index.js +132 -39
  499. package/store/plugins.js +8 -4
  500. package/store/type-map.js +143 -143
  501. package/store/type-map.utils.ts +226 -0
  502. package/tsconfig.json +0 -1
  503. package/tsconfig.paths.json +4 -1
  504. package/types/components/labeledSelect.ts +50 -0
  505. package/types/resources/settings.d.ts +32 -0
  506. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  507. package/types/shell/index.d.ts +996 -782
  508. package/types/store/dashboard-store.types.ts +42 -0
  509. package/types/store/pagination.types.ts +457 -0
  510. package/types/store/type-map.ts +30 -0
  511. package/types/store/vuex.d.ts +9 -0
  512. package/types/vue-shim.d.ts +51 -0
  513. package/utils/__tests__/cluster.test.ts +20 -18
  514. package/utils/__tests__/create-yaml.test.ts +359 -2
  515. package/utils/__tests__/kontainer.test.ts +92 -0
  516. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  517. package/utils/alertmanagerconfig.js +19 -0
  518. package/utils/array.ts +40 -1
  519. package/utils/async.ts +2 -0
  520. package/utils/auth.js +152 -4
  521. package/utils/axios.js +2 -2
  522. package/utils/banners.js +103 -0
  523. package/utils/cluster.js +1 -1
  524. package/utils/config.js +4 -0
  525. package/utils/create-yaml.js +54 -27
  526. package/utils/error.js +25 -0
  527. package/utils/formatter.js +5 -3
  528. package/utils/git.ts +1 -1
  529. package/utils/install-redirect.js +1 -1
  530. package/utils/kontainer.ts +186 -0
  531. package/utils/monitoring.js +2 -37
  532. package/utils/pagination-utils.ts +154 -0
  533. package/utils/pod-security-admission.ts +1 -1
  534. package/utils/router.js +86 -0
  535. package/utils/settings.ts +46 -0
  536. package/utils/socket.js +1 -0
  537. package/utils/time.js +1 -0
  538. package/utils/title.ts +3 -0
  539. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  540. package/utils/validators/formRules/__tests__/index.test.ts +21 -0
  541. package/utils/validators/formRules/index.ts +3 -0
  542. package/utils/validators/index.js +1 -0
  543. package/vue.config.js +376 -421
  544. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  545. package/chart/monitoring/steps/uninstall-v1.vue +0 -135
  546. package/components/EventsTable.vue +0 -67
  547. package/components/TabbedLinks/index.vue +0 -94
  548. package/components/nuxt/nuxt-link.server.js +0 -16
  549. package/components/nuxt/nuxt.js +0 -101
  550. package/config/router.js +0 -425
  551. package/initialize/App.js +0 -152
  552. package/initialize/client.js +0 -734
  553. package/initialize/index.js +0 -287
  554. package/middleware/i18n.js +0 -10
  555. package/middleware/unauthenticated.js +0 -22
  556. package/mixins/v1-workload-metrics.js +0 -43
  557. package/pages/c/_cluster/apps/index.vue +0 -15
  558. package/pages/c/_cluster/auth/index.vue +0 -17
  559. package/pages/c/_cluster/index.vue +0 -15
  560. package/pages/c/_cluster/legacy/index.vue +0 -22
  561. package/pages/c/_cluster/manager/index.vue +0 -22
  562. package/pages/c/_cluster/mcapps/index.vue +0 -21
  563. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  564. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  565. package/plugins/index.js +0 -11
  566. package/plugins/portal-vue.js +0 -4
  567. package/plugins/portal.js +0 -4
  568. package/plugins/resize.js +0 -5
  569. package/plugins/shortkey.js +0 -4
  570. package/plugins/tooltip.js +0 -4
  571. package/plugins/v-select.js +0 -4
  572. package/utils/group.js +0 -70
  573. package/utils/nuxt.js +0 -638
  574. package/utils/router.scrollBehavior.js +0 -78
  575. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  576. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  577. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  578. /package/plugins/steve/__tests__/{steve-class.spec.ts → steve-class.test.ts} +0 -0
  579. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  580. /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  581. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
@@ -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
- const 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 })`,
@@ -254,7 +287,7 @@ export default {
254
287
  }
255
288
 
256
289
  if ( !this.limitToNamespace ) {
257
- sortBy(out, 'group');
290
+ out = sortBy(out, 'group');
258
291
  if ( out.length ) {
259
292
  let lastGroup = '';
260
293
 
@@ -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,11 +578,11 @@ 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"
512
- data-testid="auth-secret-basic-public-key"
585
+ data-testid="auth-secret-basic-username"
513
586
  :mode="mode"
514
587
  label-key="selectOrCreateAuthSecret.basic.username"
515
588
  />
@@ -517,14 +590,14 @@ export default {
517
590
  <div :class="moreCols">
518
591
  <LabeledInput
519
592
  v-model="privateKey"
520
- data-testid="auth-secret-basic-private-key"
593
+ data-testid="auth-secret-basic-password"
521
594
  :mode="mode"
522
595
  type="password"
523
596
  label-key="selectOrCreateAuthSecret.basic.password"
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
@@ -0,0 +1,53 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import BannerSettings from '@shell/components/form/BannerSettings.vue';
3
+
4
+ describe('view: management.cattle.io.setting should', () => {
5
+ const requiredSetup = () => ({
6
+ mocks: {
7
+ $fetchState: { pending: false },
8
+ $store: {
9
+ getters: {
10
+ currentStore: () => 'current_store',
11
+ currentCluster: { id: 'local' },
12
+ currentProduct: { inStore: 'cluster' },
13
+ isExplorer: false,
14
+ 'management/schemaFor': jest.fn(),
15
+ 'current_store/schemaFor': jest.fn(),
16
+ 'current_store/all': jest.fn(),
17
+ 'i18n/t': jest.fn(),
18
+ 'i18n/exists': jest.fn(),
19
+ 'prefs/get': () => {},
20
+ },
21
+ dispatch: jest.fn(),
22
+ },
23
+ $route: { query: { AS: '' } },
24
+ $router: { applyQuery: jest.fn() },
25
+ }
26
+ });
27
+
28
+ it('allowing to save if no rules in settings', () => {
29
+ const wrapper = mount(BannerSettings, {
30
+ stubs: { TypeDescription: true },
31
+ propsData: {
32
+ value: { foo: { text: '' } },
33
+ mode: 'view',
34
+ bannerType: 'foo'
35
+ },
36
+ computed: { hideDescriptions: () => true },
37
+ data: () => ({
38
+ vendor: 'Rancher',
39
+ uiPLSetting: { vendor: 'Rancher' },
40
+
41
+ uiBannerSetting: null,
42
+ bannerVal: {},
43
+
44
+ errors: [],
45
+ }),
46
+ ...requiredSetup()
47
+ });
48
+
49
+ const colorInputPreview = wrapper.find('[data-testid="color-input-color-input_preview-container"]');
50
+
51
+ expect(colorInputPreview.element.style.display).not.toBe('flex');
52
+ });
53
+ });