@rancher/shell 3.0.5-rc.5 → 3.0.5-rc.7

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 (361) hide show
  1. package/assets/data/aws-regions.json +1 -0
  2. package/assets/images/key.svg +17 -0
  3. package/assets/styles/base/_spacing.scss +2 -2
  4. package/assets/styles/base/_variables.scss +17 -11
  5. package/assets/styles/global/_form.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +1 -1
  7. package/assets/styles/themes/_dark.scss +5 -0
  8. package/assets/styles/themes/_light.scss +11 -2
  9. package/assets/styles/vendor/vue-select.scss +1 -1
  10. package/assets/translations/en-us.yaml +426 -64
  11. package/assets/translations/zh-hans.yaml +3 -4
  12. package/cloud-credential/gcp.vue +9 -1
  13. package/components/AppModal.vue +2 -0
  14. package/components/CodeMirror.vue +2 -2
  15. package/components/ConfigMapSettings/Settings.vue +377 -0
  16. package/components/ConfigMapSettings/index.vue +354 -0
  17. package/components/CruResource.vue +1 -2
  18. package/components/DetailText.vue +61 -11
  19. package/components/Drawer/Chrome.vue +115 -0
  20. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +61 -0
  21. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
  22. package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
  23. package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
  24. package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +106 -0
  25. package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
  26. package/components/Drawer/ResourceDetailDrawer/composables.ts +53 -0
  27. package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
  28. package/components/Drawer/ResourceDetailDrawer/index.vue +111 -0
  29. package/components/GrowlManager.vue +16 -15
  30. package/components/IconOrSvg.vue +5 -0
  31. package/components/KeyValueView.vue +1 -1
  32. package/components/Loading.vue +1 -1
  33. package/components/LocaleSelector.vue +9 -1
  34. package/components/PaginatedResourceTable.vue +46 -1
  35. package/components/ProgressBarMulti.vue +1 -0
  36. package/components/PromptModal.vue +6 -1
  37. package/components/PromptRestore.vue +22 -44
  38. package/components/RelatedResources.vue +4 -12
  39. package/components/Resource/Detail/Additional.vue +46 -0
  40. package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +1 -1
  41. package/components/Resource/Detail/Metadata/Annotations/index.vue +5 -0
  42. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
  43. package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +47 -256
  44. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +317 -0
  45. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +34 -5
  46. package/components/Resource/Detail/Metadata/KeyValue.vue +32 -22
  47. package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +1 -1
  48. package/components/Resource/Detail/Metadata/Labels/index.vue +4 -0
  49. package/components/Resource/Detail/Metadata/Rectangle.vue +3 -1
  50. package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +1 -1
  51. package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +1 -1
  52. package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
  53. package/components/Resource/Detail/Metadata/composables.ts +60 -11
  54. package/components/Resource/Detail/Metadata/index.vue +12 -5
  55. package/components/Resource/Detail/Page.vue +15 -0
  56. package/components/Resource/Detail/ResourceRow.vue +37 -18
  57. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
  58. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
  59. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
  60. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
  61. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
  62. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
  63. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
  64. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
  65. package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
  66. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
  67. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
  68. package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
  69. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
  70. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
  71. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
  72. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
  73. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
  74. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
  75. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
  76. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
  77. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
  78. package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
  79. package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
  80. package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
  81. package/components/Resource/Detail/SpacedRow.vue +1 -1
  82. package/components/Resource/Detail/TitleBar/Title.vue +2 -1
  83. package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +1 -1
  84. package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +1 -1
  85. package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
  86. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +1 -1
  87. package/components/Resource/Detail/TitleBar/composables.ts +45 -0
  88. package/components/Resource/Detail/TitleBar/index.vue +85 -13
  89. package/components/Resource/Detail/composables.ts +45 -0
  90. package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
  91. package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
  92. package/components/ResourceDetail/Masthead/index.vue +65 -0
  93. package/components/ResourceDetail/Masthead/latest.vue +44 -0
  94. package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +1 -1
  95. package/components/ResourceDetail/__tests__/index.test.ts +26 -5
  96. package/components/ResourceDetail/index.vue +33 -17
  97. package/components/ResourceDetail/legacy.vue +18 -1
  98. package/components/ResourceList/Masthead.vue +6 -0
  99. package/components/ResourceList/index.vue +1 -0
  100. package/components/ResourceTable.vue +6 -1
  101. package/components/ResourceYaml.vue +15 -2
  102. package/components/RichTranslation.vue +106 -0
  103. package/components/SlideInPanelManager.vue +46 -11
  104. package/components/SortableTable/index.vue +1 -1
  105. package/components/SortableTable/selection.js +0 -1
  106. package/components/StateDot/index.vue +28 -0
  107. package/components/Tabbed/index.vue +17 -16
  108. package/components/Wizard.vue +4 -2
  109. package/components/__tests__/ConfigMapSettings.test.ts +376 -0
  110. package/components/__tests__/GrowlManager.test.ts +0 -25
  111. package/components/__tests__/PromptRestore.test.ts +1 -65
  112. package/components/__tests__/RichTranslation.test.ts +115 -0
  113. package/components/auth/login/ldap.vue +1 -1
  114. package/components/fleet/FleetApplications.vue +0 -7
  115. package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
  116. package/components/fleet/FleetClusterTargets/index.vue +455 -0
  117. package/components/fleet/FleetClusters.vue +25 -6
  118. package/components/fleet/FleetGitRepoPaths.vue +476 -0
  119. package/components/fleet/FleetHelmOps.vue +8 -0
  120. package/components/fleet/FleetRepos.vue +1 -6
  121. package/components/fleet/FleetResources.vue +4 -5
  122. package/components/fleet/FleetValuesFrom.vue +295 -0
  123. package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
  124. package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
  125. package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +13 -13
  126. package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
  127. package/components/fleet/dashboard/ResourceCard.vue +1 -0
  128. package/components/fleet/dashboard/ResourceCardSummary.vue +1 -5
  129. package/components/fleet/dashboard/ResourceDetails.vue +8 -10
  130. package/components/fleet/dashboard/ResourcePanel.vue +17 -9
  131. package/components/form/ArrayList.vue +13 -2
  132. package/components/form/ChangePassword.vue +3 -1
  133. package/components/form/FileImageSelector.vue +1 -1
  134. package/components/form/Footer.vue +10 -4
  135. package/components/form/KeyValue.vue +81 -43
  136. package/components/form/LabeledSelect.vue +56 -16
  137. package/components/form/Labels.vue +90 -17
  138. package/components/form/MatchExpressions.vue +46 -5
  139. package/components/form/NameNsDescription.vue +2 -1
  140. package/components/form/Networking.vue +24 -19
  141. package/components/form/ResourceLabeledSelect.vue +4 -3
  142. package/components/form/ResourceSelector.vue +1 -0
  143. package/components/form/ResourceTabs/index.vue +5 -0
  144. package/components/form/SecretSelector.vue +9 -2
  145. package/components/form/Select.vue +57 -19
  146. package/components/form/SelectOrCreateAuthSecret.vue +6 -3
  147. package/components/form/SimpleSecretSelector.vue +9 -2
  148. package/components/form/Taints.vue +21 -2
  149. package/components/form/UnitInput.vue +8 -0
  150. package/components/form/ValueFromResource.vue +1 -1
  151. package/components/form/__tests__/LabeledSelect.test.ts +8 -4
  152. package/components/form/__tests__/Labels.test.ts +360 -0
  153. package/components/form/__tests__/MatchExpressions.test.ts +16 -13
  154. package/components/form/__tests__/Networking.test.ts +116 -0
  155. package/components/form/__tests__/Select.test.ts +5 -2
  156. package/components/formatter/FleetApplicationSource.vue +1 -1
  157. package/components/formatter/PodImages.vue +1 -1
  158. package/components/formatter/WorkloadHealthScale.vue +1 -1
  159. package/components/formatter/__tests__/LiveDate.test.ts +10 -2
  160. package/components/google/AccountAccess.vue +209 -0
  161. package/components/google/types/gcp.d.ts +136 -0
  162. package/components/google/types/index.d.ts +101 -0
  163. package/components/google/util/__mocks__/gcp.ts +465 -0
  164. package/components/google/util/formatter.ts +82 -0
  165. package/components/google/util/gcp.ts +134 -0
  166. package/components/google/util/index.d.ts +11 -0
  167. package/components/nav/Favorite.vue +1 -1
  168. package/components/nav/Group.vue +71 -45
  169. package/components/nav/Header.vue +5 -1
  170. package/components/nav/NamespaceFilter.vue +13 -1
  171. package/components/nav/NotificationCenter/Notification.vue +510 -0
  172. package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
  173. package/components/nav/NotificationCenter/index.vue +148 -0
  174. package/composables/drawer.ts +26 -0
  175. package/composables/resources.test.ts +63 -0
  176. package/composables/resources.ts +38 -0
  177. package/composables/useIsNewDetailPageEnabled.ts +17 -0
  178. package/config/labels-annotations.js +8 -0
  179. package/config/pagination-table-headers.js +8 -1
  180. package/config/product/auth.js +16 -1
  181. package/config/product/{cis.js → compliance.js} +23 -26
  182. package/config/product/explorer.js +32 -3
  183. package/config/product/fleet.js +7 -0
  184. package/config/product/manager.js +0 -1
  185. package/config/product/settings.js +22 -11
  186. package/config/query-params.js +13 -0
  187. package/config/roles.ts +1 -1
  188. package/config/router/navigation-guards/authentication.js +51 -2
  189. package/config/router/routes.js +47 -31
  190. package/config/settings.ts +21 -3
  191. package/config/store.js +2 -0
  192. package/config/system-namespaces.js +1 -1
  193. package/config/table-headers.js +32 -3
  194. package/config/types.js +16 -7
  195. package/config/version.js +1 -1
  196. package/core/plugin.ts +32 -7
  197. package/core/types.ts +18 -1
  198. package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
  199. package/detail/management.cattle.io.fleetworkspace.vue +18 -27
  200. package/detail/management.cattle.io.oidcclient.vue +369 -0
  201. package/detail/node.vue +2 -2
  202. package/detail/pod.vue +2 -2
  203. package/detail/provisioning.cattle.io.cluster.vue +3 -47
  204. package/detail/service.vue +10 -1
  205. package/detail/workload/index.vue +8 -2
  206. package/dialog/ExtensionCatalogUninstallDialog.vue +7 -4
  207. package/dialog/GenericPrompt.vue +1 -1
  208. package/dialog/ImportDialog.vue +8 -8
  209. package/dialog/OidcClientSecretDialog.vue +117 -0
  210. package/dialog/RotateEncryptionKeyDialog.vue +10 -30
  211. package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
  212. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +5 -2
  213. package/edit/auth/ldap/__tests__/config.test.ts +14 -0
  214. package/edit/auth/ldap/config.vue +24 -0
  215. package/edit/autoscaling.horizontalpodautoscaler/index.vue +4 -1
  216. package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
  217. package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
  218. package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
  219. package/edit/configmap.vue +8 -2
  220. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  221. package/edit/fleet.cattle.io.gitrepo.vue +44 -222
  222. package/edit/fleet.cattle.io.helmop.vue +44 -269
  223. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  224. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  225. package/edit/logging-flow/index.vue +1 -0
  226. package/edit/logging.banzaicloud.io.output/index.vue +1 -0
  227. package/edit/management.cattle.io.fleetworkspace.vue +1 -0
  228. package/edit/management.cattle.io.oidcclient.vue +162 -0
  229. package/edit/management.cattle.io.project.vue +4 -1
  230. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  231. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
  232. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  233. package/edit/monitoring.coreos.com.receiver/auth.vue +30 -30
  234. package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
  235. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  236. package/edit/monitoring.coreos.com.route.vue +1 -0
  237. package/edit/namespace.vue +1 -0
  238. package/edit/networking.istio.io.destinationrule/index.vue +4 -1
  239. package/edit/networking.k8s.io.ingress/Certificate.vue +12 -12
  240. package/edit/networking.k8s.io.ingress/__tests__/Certificate.test.ts +165 -0
  241. package/edit/networking.k8s.io.ingress/index.vue +4 -1
  242. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +7 -2
  243. package/edit/networking.k8s.io.networkpolicy/index.vue +6 -2
  244. package/edit/node.vue +1 -0
  245. package/edit/persistentvolume/index.vue +4 -1
  246. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +3 -2
  247. package/edit/provisioning.cattle.io.cluster/rke2.vue +516 -426
  248. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +48 -39
  249. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
  250. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +2 -2
  251. package/edit/resources.cattle.io.restore.vue +1 -1
  252. package/edit/secret/basic.vue +1 -0
  253. package/edit/secret/index.vue +127 -15
  254. package/edit/service.vue +4 -1
  255. package/edit/serviceaccount.vue +4 -1
  256. package/edit/storage.k8s.io.storageclass/index.vue +4 -1
  257. package/edit/workload/index.vue +5 -0
  258. package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
  259. package/list/management.cattle.io.oidcclient.vue +108 -0
  260. package/list/node.vue +2 -0
  261. package/list/projectsecret.vue +345 -0
  262. package/list/secret.vue +109 -0
  263. package/machine-config/amazonec2.vue +3 -24
  264. package/machine-config/components/GCEImage.vue +374 -0
  265. package/machine-config/google.vue +617 -0
  266. package/mixins/__tests__/brand.spec.ts +170 -0
  267. package/mixins/brand.js +16 -17
  268. package/mixins/create-edit-view/impl.js +10 -1
  269. package/mixins/create-edit-view/index.js +5 -0
  270. package/mixins/resource-fetch-api-pagination.js +24 -8
  271. package/mixins/resource-fetch.js +3 -1
  272. package/mixins/vue-select-overrides.js +1 -0
  273. package/models/cluster.x-k8s.io.machinedeployment.js +11 -2
  274. package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
  275. package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
  276. package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
  277. package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
  278. package/models/fleet-application.js +8 -79
  279. package/models/fleet.cattle.io.cluster.js +13 -2
  280. package/models/fleet.cattle.io.gitrepo.js +2 -2
  281. package/models/fleet.cattle.io.helmop.js +9 -39
  282. package/models/management.cattle.io.fleetworkspace.js +2 -1
  283. package/models/management.cattle.io.oidcclient.js +18 -0
  284. package/models/management.cattle.io.registration.js +3 -0
  285. package/models/provisioning.cattle.io.cluster.js +29 -33
  286. package/models/secret.js +157 -2
  287. package/models/service.js +4 -0
  288. package/models/workload.js +5 -0
  289. package/package.json +2 -2
  290. package/pages/about.vue +4 -58
  291. package/pages/auth/login.vue +1 -1
  292. package/pages/c/_cluster/apps/charts/AddRepoLink.vue +0 -1
  293. package/pages/c/_cluster/apps/charts/index.vue +296 -81
  294. package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
  295. package/pages/c/_cluster/explorer/index.vue +3 -3
  296. package/pages/c/_cluster/explorer/projectsecret.vue +34 -0
  297. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
  298. package/pages/c/_cluster/fleet/application/create.vue +3 -2
  299. package/pages/c/_cluster/fleet/index.vue +94 -57
  300. package/pages/c/_cluster/fleet/settings/index.vue +229 -0
  301. package/pages/c/_cluster/longhorn/index.vue +5 -2
  302. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
  303. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
  304. package/pages/explorer/resource/detail/configmap.vue +30 -7
  305. package/pages/explorer/resource/detail/projectsecret.vue +9 -0
  306. package/pages/explorer/resource/detail/secret.vue +63 -0
  307. package/pages/home.vue +9 -55
  308. package/pages/support/index.vue +4 -6
  309. package/plugins/dashboard-store/__tests__/normalize.test.ts +223 -0
  310. package/plugins/dashboard-store/__tests__/resource-class.test.ts +191 -0
  311. package/plugins/dashboard-store/__tests__/utils/normalize-usecases.ts +1526 -0
  312. package/plugins/dashboard-store/actions.js +19 -5
  313. package/plugins/dashboard-store/getters.js +4 -0
  314. package/plugins/dashboard-store/normalize.js +29 -17
  315. package/plugins/dashboard-store/resource-class.js +68 -19
  316. package/plugins/steve/steve-pagination-utils.ts +38 -19
  317. package/plugins/steve/subscribe.js +6 -1
  318. package/rancher-components/Banner/Banner.vue +13 -0
  319. package/rancher-components/Form/Checkbox/Checkbox.vue +9 -4
  320. package/rancher-components/Form/LabeledInput/LabeledInput.vue +1 -1
  321. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
  322. package/rancher-components/RcItemCard/RcItemCard.vue +8 -3
  323. package/store/auth.js +2 -0
  324. package/store/catalog.js +23 -1
  325. package/store/growl.js +97 -8
  326. package/store/index.js +6 -0
  327. package/store/notifications.ts +426 -0
  328. package/store/prefs.js +0 -1
  329. package/store/type-map.js +19 -16
  330. package/store/uiplugins.ts +15 -1
  331. package/types/fleet.d.ts +24 -0
  332. package/types/kube/kube-api.ts +12 -0
  333. package/types/notifications/index.ts +74 -0
  334. package/types/shell/index.d.ts +661 -589
  335. package/types/store/dashboard-store.types.ts +16 -0
  336. package/types/store/pagination.types.ts +16 -6
  337. package/utils/__tests__/create-yaml.test.ts +235 -0
  338. package/utils/__tests__/fleet.test.ts +148 -0
  339. package/utils/__tests__/object.test.ts +54 -1
  340. package/utils/__tests__/string.test.ts +273 -1
  341. package/utils/__tests__/time.test.ts +31 -0
  342. package/utils/auth.js +9 -2
  343. package/utils/create-yaml.js +103 -9
  344. package/utils/crypto/encryption.ts +103 -0
  345. package/utils/cspAdaptor.ts +51 -0
  346. package/utils/fleet.ts +54 -65
  347. package/utils/object.js +36 -0
  348. package/utils/pagination-utils.ts +19 -1
  349. package/utils/release-notes.ts +48 -0
  350. package/utils/selector-typed.ts +7 -2
  351. package/utils/string.js +24 -0
  352. package/utils/{time.js → time.ts} +25 -6
  353. package/utils/uiplugins.ts +22 -0
  354. package/utils/validators/formRules/index.ts +3 -0
  355. package/components/Resource/Detail/TitleBar/composable.ts +0 -31
  356. package/config/product/legacy.js +0 -62
  357. package/models/etcdbackup.js +0 -45
  358. package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
  359. package/pages/c/_cluster/legacy/project/_page.vue +0 -57
  360. package/pages/c/_cluster/legacy/project/index.vue +0 -32
  361. package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
@@ -1,6 +1,74 @@
1
- <script>
2
- import KeyValue from '@shell/components/form/KeyValue';
1
+ <script lang="ts">
2
+ import { pickBy, omitBy, mapValues } from 'lodash';
3
+ import { matchesSomeRegex } from '@shell/utils/string';
4
+ import { LABELS_TO_IGNORE_REGEX, ANNOTATIONS_TO_IGNORE_REGEX } from '@shell/config/labels-annotations';
5
+ import KeyValue from '@shell/components/form/KeyValue.vue';
3
6
  import { ToggleSwitch } from '@components/Form/ToggleSwitch';
7
+ import { _VIEW } from '@shell/config/query-params';
8
+
9
+ export class Factory {
10
+ private protectedKeys: string[] = [];
11
+ private protectedRegexes: RegExp[] = [];
12
+ private protectedWarning = '';
13
+
14
+ private isProtected(key: string) {
15
+ return this.protectedKeys.includes(key) || matchesSomeRegex(key, this.protectedRegexes);
16
+ }
17
+
18
+ private omitProtected(obj: object) {
19
+ return omitBy(obj, (_, key) => this.isProtected(key));
20
+ }
21
+
22
+ private pickProtected(obj: object) {
23
+ return pickBy(obj, (_, key) => this.isProtected(key));
24
+ }
25
+
26
+ private keyErrorMap(elems: object) {
27
+ return mapValues(this.pickProtected(elems), () => this.protectedWarning);
28
+ }
29
+
30
+ constructor(protectedKeys: string[], protectedRegexes: RegExp[], msg: string, initValue: object) {
31
+ // Init privates
32
+ this.protectedKeys = protectedKeys || [];
33
+ this.protectedRegexes = protectedRegexes || [];
34
+ this.protectedWarning = msg || '';
35
+
36
+ this.initValue = initValue || {};
37
+ this.value = this.omitProtected(this.initValue);
38
+ this.keyErrors = this.keyErrorMap(this.value);
39
+ this.hasProtectedKeys = Object.keys(this.pickProtected(this.initValue)).length > 0;
40
+ }
41
+
42
+ initValue: object = {};
43
+ value: object = {};
44
+ keyErrors: object = {};
45
+ hasProtectedKeys = false;
46
+
47
+ /**
48
+ * Updates resource's model and discard new protected keys
49
+ * Old protected keys remain untouched on edit
50
+ *
51
+ * @param value edited labels/annotations
52
+ * @param callbackFn function to set model's labels/annotations
53
+ */
54
+ update(value: Record<string, string>, callbackFn: (value: object) => void) {
55
+ const neu = value || {};
56
+
57
+ callbackFn({
58
+ ...this.omitProtected(neu),
59
+ ...this.pickProtected(this.initValue),
60
+ });
61
+
62
+ this.value = neu;
63
+ this.keyErrors = this.keyErrorMap(neu);
64
+ }
65
+ }
66
+
67
+ interface DataType {
68
+ labels: Factory,
69
+ annotations: Factory,
70
+ toggler: boolean,
71
+ }
4
72
 
5
73
  export default {
6
74
  components: {
@@ -60,8 +128,14 @@ export default {
60
128
  },
61
129
  },
62
130
 
63
- data() {
64
- return { toggler: false };
131
+ data(): DataType {
132
+ const protectedWarning = this.t('labels.protectedWarning');
133
+
134
+ return {
135
+ labels: new Factory(this.value.systemLabels, LABELS_TO_IGNORE_REGEX, protectedWarning, this.value.labels),
136
+ annotations: new Factory(this.value.systemAnnotations, ANNOTATIONS_TO_IGNORE_REGEX, protectedWarning, this.value.annotations),
137
+ toggler: false
138
+ };
65
139
  },
66
140
 
67
141
  computed: {
@@ -75,6 +149,10 @@ export default {
75
149
 
76
150
  columnsClass() {
77
151
  return `${ this.displaySideBySide ? 'col span-6' : 'row' }`.trim();
152
+ },
153
+
154
+ showToggler() {
155
+ return this.mode === _VIEW && (this.labels.hasProtectedKeys || this.annotations.hasProtectedKeys);
78
156
  }
79
157
  }
80
158
  };
@@ -88,7 +166,7 @@ export default {
88
166
  <t k="labels.labels.title" />
89
167
  </h3>
90
168
  <ToggleSwitch
91
- v-if="value.hasSystemLabels"
169
+ v-if="showToggler"
92
170
  v-model:value="toggler"
93
171
  name="label-system-toggle"
94
172
  :on-label="t('labels.labels.show')"
@@ -98,21 +176,17 @@ export default {
98
176
  <t k="labels.labels.description" />
99
177
  </p>
100
178
  <div :class="columnsClass">
101
- <slot
102
- name="labels"
103
- :toggler="toggler"
104
- >
179
+ <slot name="labels">
105
180
  <KeyValue
106
181
  key="labels"
107
- :value="value.labels"
108
- :protected-keys="value.systemLabels || []"
109
- :toggle-filter="toggler"
182
+ :value="toggler ? labels.initValue : labels.value"
110
183
  :add-label="t('labels.addLabel')"
111
184
  :add-icon="addIcon"
112
185
  :mode="mode"
113
186
  :read-allowed="false"
114
187
  :value-can-be-empty="true"
115
- @update:value="value.setLabels($event)"
188
+ :key-errors="labels.keyErrors"
189
+ @update:value="labels.update($event, (x) => value.setLabels(x))"
116
190
  />
117
191
  </slot>
118
192
  </div>
@@ -125,17 +199,16 @@ export default {
125
199
  >
126
200
  <KeyValue
127
201
  key="annotations"
128
- :value="value.annotations"
202
+ :value="toggler ? annotations.initValue : annotations.value"
129
203
  :add-label="t('labels.addAnnotation')"
130
204
  :add-icon="addIcon"
131
205
  :mode="mode"
132
- :protected-keys="value.systemAnnotations || []"
133
- :toggle-filter="toggler"
134
206
  :title="t('labels.annotations.title')"
135
207
  :title-protip="annotationTitleTooltip"
136
208
  :read-allowed="false"
137
209
  :value-can-be-empty="true"
138
- @update:value="value.setAnnotations($event)"
210
+ :key-errors="annotations.keyErrors"
211
+ @update:value="annotations.update($event, (x) => value.setAnnotations(x))"
139
212
  />
140
213
  </div>
141
214
  </div>
@@ -8,7 +8,7 @@ import { convert, simplify } from '@shell/utils/selector';
8
8
  import LabeledSelect from '@shell/components/form/LabeledSelect';
9
9
 
10
10
  export default {
11
- emits: ['update:value', 'remove'],
11
+ emits: ['update:value', 'add', 'remove'],
12
12
 
13
13
  components: { Select, LabeledSelect },
14
14
  props: {
@@ -54,6 +54,26 @@ export default {
54
54
  default: true
55
55
  },
56
56
 
57
+ labelKey: {
58
+ type: String,
59
+ default: '',
60
+ },
61
+
62
+ addLabel: {
63
+ type: String,
64
+ default: '',
65
+ },
66
+
67
+ addIcon: {
68
+ type: String,
69
+ default: '',
70
+ },
71
+
72
+ addClass: {
73
+ type: String,
74
+ default: '',
75
+ },
76
+
57
77
  // whether or not to show remove rule button right side of the rule
58
78
  showRemoveButton: {
59
79
  type: Boolean,
@@ -146,6 +166,10 @@ export default {
146
166
  return this.mode === 'view';
147
167
  },
148
168
 
169
+ _addLabel() {
170
+ return this.addLabel || this.t('workload.scheduling.affinity.matchExpressions.addRule');
171
+ },
172
+
149
173
  node() {
150
174
  return NODE;
151
175
  },
@@ -212,6 +236,12 @@ export default {
212
236
  }
213
237
 
214
238
  this.rules.push(newRule);
239
+
240
+ this.$nextTick(() => {
241
+ this.focus(this.rules.length - 1);
242
+
243
+ this.$emit('add');
244
+ });
215
245
  },
216
246
 
217
247
  update() {
@@ -245,6 +275,10 @@ export default {
245
275
  this.$emit('update:value', simplify(out));
246
276
  }
247
277
  });
278
+ },
279
+
280
+ focus(index = 0) {
281
+ this.$refs[`input-match-expression-key-${ index }`]?.[0]?.focus();
248
282
  }
249
283
  }
250
284
  };
@@ -274,7 +308,7 @@ export default {
274
308
  {{ t('workload.scheduling.affinity.matchExpressions.matchType') }}
275
309
  </label>
276
310
  <label>
277
- {{ t('workload.scheduling.affinity.matchExpressions.key') }}
311
+ {{ labelKey || t('workload.scheduling.affinity.matchExpressions.key') }}
278
312
  </label>
279
313
  <label>
280
314
  {{ t('workload.scheduling.affinity.matchExpressions.operator') }}
@@ -315,6 +349,7 @@ export default {
315
349
  </div>
316
350
  <input
317
351
  v-else-if="!hasKeySelectOptions"
352
+ :ref="`input-match-expression-key-${index}`"
318
353
  v-model="row.key"
319
354
  :mode="mode"
320
355
  :data-testid="`input-match-expression-key-control-${index}`"
@@ -322,6 +357,7 @@ export default {
322
357
  >
323
358
  <LabeledSelect
324
359
  v-else
360
+ :ref="`input-match-expression-key-${index}`"
325
361
  v-model:value="row.key"
326
362
  :mode="mode"
327
363
  :options="keysSelectOptions"
@@ -389,15 +425,20 @@ export default {
389
425
  </div>
390
426
  <div
391
427
  v-if="!isView && showAddButton"
392
- class="mt-20"
428
+ class="mmt-4"
393
429
  >
394
430
  <button
395
431
  type="button"
396
432
  class="btn role-tertiary add"
397
- :data-testid="`input-match-expression-add-rule`"
433
+ :class="[addClass]"
434
+ data-testid="input-match-expression-add-rule"
398
435
  @click="addRule"
399
436
  >
400
- <t k="workload.scheduling.affinity.matchExpressions.addRule" />
437
+ <i
438
+ v-if="addIcon"
439
+ class="mr-5 icon"
440
+ :class="[addIcon]"
441
+ /> {{ _addLabel }}
401
442
  </button>
402
443
  </div>
403
444
  </div>
@@ -319,7 +319,7 @@ export default {
319
319
  }
320
320
 
321
321
  if (props.descriptionKey) {
322
- description.value = get(v, props.descriptionKey);
322
+ description.value = get(v.value, props.descriptionKey);
323
323
  } else {
324
324
  description.value = metadata?.annotations?.[DESCRIPTION];
325
325
  }
@@ -429,6 +429,7 @@ export default {
429
429
 
430
430
  <template>
431
431
  <div class="row mb-20">
432
+ <slot name="project-selector" />
432
433
  <div
433
434
  v-if="namespaced && !nameNsHidden && createNamespace"
434
435
  :data-testid="componentTestid + '-namespace-create'"
@@ -31,28 +31,23 @@ export default {
31
31
  const t = this.$store.getters['i18n/t'];
32
32
 
33
33
  return {
34
- dnsPolicy: this.value.dnsPolicy || 'ClusterFirst',
35
- networkMode: this.value.hostNetwork ? { label: t('workload.networking.networkMode.options.hostNetwork'), value: true } : { label: t('workload.networking.networkMode.options.normal'), value: false },
36
- hostAliases: [],
37
- nameservers: null,
38
- searches: null,
39
- hostname: null,
40
- subdomain: null,
41
- options: null,
34
+ dnsPolicy: this.value.dnsPolicy || 'ClusterFirst',
35
+ networkMode: this.value.hostNetwork ? { label: t('workload.networking.networkMode.options.hostNetwork'), value: true } : { label: t('workload.networking.networkMode.options.normal'), value: false },
36
+ tmpHostAliases: [],
37
+ nameservers: null,
38
+ searches: null,
39
+ hostname: null,
40
+ subdomain: null,
41
+ options: null,
42
42
  };
43
43
  },
44
44
 
45
45
  created() {
46
- const hostAliases = (this.value.hostAliases || []).map((entry) => {
47
- return {
48
- ip: entry.ip,
49
- hostnames: entry.hostnames.join(', ')
50
- };
51
- });
46
+ const hostAliases = this.value.hostAliases || [];
52
47
  const { dnsConfig = {}, hostname, subdomain } = this.value;
53
48
  const { nameservers, searches, options } = dnsConfig;
54
49
 
55
- this.hostAliases = hostAliases;
50
+ this.tmpHostAliases = hostAliases;
56
51
  this.nameservers = nameservers;
57
52
  this.searches = searches;
58
53
  this.hostname = hostname;
@@ -89,6 +84,15 @@ export default {
89
84
  ];
90
85
  },
91
86
 
87
+ hostAliases() {
88
+ return (this.value.hostAliases || []).map((entry) => {
89
+ return {
90
+ ip: entry.ip,
91
+ hostnames: entry.hostnames?.join(', ') ?? ''
92
+ };
93
+ });
94
+ },
95
+
92
96
  ...mapGetters({ t: 'i18n/t' })
93
97
  },
94
98
 
@@ -121,12 +125,12 @@ export default {
121
125
 
122
126
  methods: {
123
127
  updateHostAliases(neu) {
124
- this.hostAliases = neu.map((entry) => {
128
+ this.tmpHostAliases = neu.map((entry) => {
125
129
  const ip = entry.ip.trim();
126
130
  const hostnames = entry.hostnames.trim().split(/[\s,]+/).filter((x) => !!x);
127
131
 
128
132
  return { ip, hostnames };
129
- }).filter((entry) => entry.ip && entry.hostnames.length);
133
+ });
130
134
  this.update();
131
135
  },
132
136
 
@@ -142,7 +146,7 @@ export default {
142
146
  dnsConfig,
143
147
  dnsPolicy: this.dnsPolicy,
144
148
  hostname: this.hostname,
145
- hostAliases: this.hostAliases,
149
+ hostAliases: this.tmpHostAliases,
146
150
  subdomain: this.subdomain,
147
151
  hostNetwork: this.networkMode.value
148
152
  };
@@ -256,7 +260,8 @@ export default {
256
260
  <div class="col span-12">
257
261
  <KeyValue
258
262
  key="hostAliases"
259
- v-model:value="hostAliases"
263
+ data-test="hostAliases"
264
+ :value="hostAliases"
260
265
  :mode="mode"
261
266
  :title="t('workload.networking.hostAliases.label')"
262
267
  :protip="t('workload.networking.hostAliases.tip')"
@@ -127,9 +127,10 @@ export default defineComponent({
127
127
  const defaultOptions: LabelSelectPaginationFunctionOptions = {
128
128
  opts,
129
129
  filters,
130
- type: this.resourceType,
131
- ctx: { getters: this.$store.getters, dispatch: this.$store.dispatch },
132
- sort: [{ asc: true, field: 'metadata.name' }],
130
+ type: this.resourceType,
131
+ ctx: { getters: this.$store.getters, dispatch: this.$store.dispatch },
132
+ sort: [{ asc: true, field: 'metadata.name' }],
133
+ store: this.inStore
133
134
  };
134
135
  const options = this.paginatedResourceSettings?.requestSettings ? this.paginatedResourceSettings.requestSettings(defaultOptions) : defaultOptions;
135
136
  const res = await labelSelectPaginationFunction(options);
@@ -103,6 +103,7 @@ export default {
103
103
  $store: this.$store,
104
104
  inScopeCount: this.allResourcesInScope,
105
105
  namespace: this.namespace,
106
+ transient: true,
106
107
  });
107
108
  }, 250, { leading: true }),
108
109
  }
@@ -68,6 +68,10 @@ export default {
68
68
  extensionParams: {
69
69
  type: Object,
70
70
  default: null
71
+ },
72
+ useHash: {
73
+ type: Boolean,
74
+ default: true
71
75
  }
72
76
  },
73
77
 
@@ -233,6 +237,7 @@ export default {
233
237
  v-bind="$attrs"
234
238
  :default-tab="defaultTab"
235
239
  :resource="value"
240
+ :use-hash="useHash"
236
241
  @changed="tabChange"
237
242
  >
238
243
  <slot />
@@ -173,11 +173,18 @@ export default {
173
173
  paginatePageOptions(opts) {
174
174
  const { opts: { filter } } = opts;
175
175
 
176
- const filters = !!filter ? [PaginationParamFilter.createSingleField({ field: 'metadata.name', value: filter })] : [];
176
+ const filters = !!filter ? [PaginationParamFilter.createSingleField({
177
+ field: 'metadata.name', value: filter, exact: false, equals: true
178
+ })] : [];
177
179
 
178
180
  filters.push(
179
181
  PaginationParamFilter.createSingleField({ field: 'metadata.namespace', value: this.namespace }),
180
- PaginationParamFilter.createSingleField({ field: 'metadata.fields.1', value: this.types.join(',') })
182
+ PaginationParamFilter.createMultipleFields(this.types.map((t) => ({
183
+ field: 'metadata.fields.1',
184
+ equals: true,
185
+ exact: true,
186
+ value: t
187
+ })))
181
188
  );
182
189
 
183
190
  return {
@@ -5,6 +5,9 @@ import VueSelectOverrides from '@shell/mixins/vue-select-overrides';
5
5
  import { generateRandomAlphaString } from '@shell/utils/string';
6
6
  import { LabeledTooltip } from '@components/LabeledTooltip';
7
7
  import { onClickOption, calculatePosition } from '@shell/utils/select';
8
+ import { _VIEW } from '@shell/config/query-params';
9
+ import { useClickOutside } from '@shell/composables/useClickOutside';
10
+ import { ref } from 'vue';
8
11
 
9
12
  export default {
10
13
  emits: ['update:value', 'createdListItem', 'on-open', 'on-close'],
@@ -81,7 +84,7 @@ export default {
81
84
  },
82
85
  closeOnSelect: {
83
86
  type: Boolean,
84
- default: true
87
+ default: true,
85
88
  },
86
89
 
87
90
  compact: {
@@ -93,11 +96,18 @@ export default {
93
96
  default: false
94
97
  }
95
98
  },
99
+ setup() {
100
+ const select = ref(null);
101
+ const isOpen = ref(false);
102
+
103
+ useClickOutside(select, () => {
104
+ isOpen.value = false;
105
+ });
106
+
107
+ return { isOpen, select };
108
+ },
96
109
  data() {
97
- return {
98
- isOpen: false,
99
- generatedUid: `s-uid-${ generateRandomAlphaString(12) }`
100
- };
110
+ return { generatedUid: `s-uid-${ generateRandomAlphaString(12) }` };
101
111
  },
102
112
  methods: {
103
113
  // resizeHandler = in mixin
@@ -124,16 +134,20 @@ export default {
124
134
  calculatePosition(dropdownList, component, width, this.placement);
125
135
  },
126
136
 
127
- focusSearch(ev) {
128
- const searchBox = document.querySelector('.vs__search');
129
-
130
- // added to mitigate https://github.com/rancher/dashboard/issues/14361
131
- if (!this.isSearchable || (searchBox && document.activeElement && !searchBox.contains(document.activeElement))) {
132
- ev.preventDefault();
137
+ // Ensure we only focus on open, otherwise we re-open on close
138
+ clickSelect(ev) {
139
+ if (this.mode === _VIEW || this.loading === true || this.disabled === true) {
140
+ return;
133
141
  }
134
142
 
135
- this.$refs['select-input'].open = true;
143
+ this.isOpen = !this.isOpen;
136
144
 
145
+ if (this.isOpen) {
146
+ this.focusSearch(ev);
147
+ }
148
+ },
149
+
150
+ focusSearch() {
137
151
  this.$nextTick(() => {
138
152
  const el = this.$refs['select-input']?.searchEl;
139
153
 
@@ -143,6 +157,10 @@ export default {
143
157
  });
144
158
  },
145
159
 
160
+ focusWrapper() {
161
+ this.$refs.select.focus();
162
+ },
163
+
146
164
  get,
147
165
 
148
166
  onClickOption(option, event) {
@@ -195,19 +213,36 @@ export default {
195
213
  },
196
214
 
197
215
  handleDropdownOpen(args) {
216
+ if (!this.isOpen) {
217
+ return false;
218
+ }
219
+
198
220
  // function that prevents the "opening dropdown on focus"
199
221
  // default behaviour of v-select
200
222
  return args.noDrop || args.disabled ? false : args.open;
201
223
  },
202
224
  onOpen() {
203
- this.isOpen = true;
225
+ this.focusSearch();
204
226
  this.$emit('on-open');
205
227
  this.resizeHandler();
206
228
  },
207
229
 
208
- onClose() {
230
+ closeOnSelecting() {
231
+ if (!this.closeOnSelect) {
232
+ return;
233
+ }
234
+
235
+ this.close();
236
+ },
237
+
238
+ close() {
209
239
  this.isOpen = false;
240
+ this.onClose();
241
+ },
242
+
243
+ onClose() {
210
244
  this.$emit('on-close');
245
+ this.focusWrapper();
211
246
  },
212
247
  },
213
248
  computed: {
@@ -272,11 +307,12 @@ export default {
272
307
  role="combobox"
273
308
  :aria-expanded="isOpen"
274
309
  :aria-label="$attrs['aria-label'] || undefined"
310
+ :aria-labelledby="$attrs['aria-labelledby'] || undefined"
275
311
  :aria-describedby="$attrs['aria-describedby'] || undefined"
276
- @click="focusSearch"
277
- @keydown.enter="focusSearch"
278
- @keydown.down.prevent="focusSearch"
279
- @keydown.space="focusSearch"
312
+ @click="clickSelect"
313
+ @keydown.self.enter="clickSelect"
314
+ @keydown.self.down.prevent="clickSelect"
315
+ @keydown.self.space.prevent="clickSelect"
280
316
  >
281
317
  <v-select
282
318
  ref="select-input"
@@ -291,7 +327,7 @@ export default {
291
327
  :get-option-label="(opt) => getOptionLabel(opt)"
292
328
  :label="optionLabel"
293
329
  :options="options"
294
- :close-on-select="closeOnSelect"
330
+ :close-on-select="false"
295
331
  :map-keydown="mappedKeys"
296
332
  :placeholder="placeholder"
297
333
  :reduce="(x) => reduce(x)"
@@ -309,6 +345,8 @@ export default {
309
345
  @open="onOpen"
310
346
  @close="onClose"
311
347
  @option:created="(e) => $emit('createdListItem', e)"
348
+ @option:selecting="closeOnSelecting"
349
+ @option:selected="closeOnSelect && close"
312
350
  @keydown.enter.stop
313
351
  >
314
352
  <template
@@ -237,7 +237,7 @@ export default {
237
237
  let filteredSecrets = [];
238
238
 
239
239
  if (this.allSecrets) {
240
- // Fitler secrets given their namespace and required secret type
240
+ // Filter secrets given their namespace and required secret type
241
241
  filteredSecrets = this.allSecrets
242
242
  .filter((x) => this.filterByNamespace ? x.metadata.namespace === this.namespace : true
243
243
  )
@@ -450,6 +450,7 @@ export default {
450
450
  ),
451
451
  ],
452
452
  }),
453
+ watch: this.cacheSecrets,
453
454
  };
454
455
 
455
456
  if (this.cacheSecrets) {
@@ -464,9 +465,11 @@ export default {
464
465
  null,
465
466
  findPageArgs
466
467
  );
467
- const res = await this.$store.dispatch(`cluster/request`, { url });
468
+ // Strictly speaking this could be any store (request action should be agnostic)
469
+ const res = await this.$store.dispatch(`${ this.inStore }/request`, { url });
468
470
 
469
- return res?.data || [];
471
+ // Classify
472
+ return await this.$store.dispatch(`${ this.inStore }/createMany`, res?.data || []);
470
473
  },
471
474
 
472
475
  updateKeyVal() {
@@ -156,11 +156,18 @@ export default {
156
156
  paginatePageOptions(opts) {
157
157
  const { opts: { filter } } = opts;
158
158
 
159
- const filters = !!filter ? [PaginationParamFilter.createSingleField({ field: 'metadata.name', value: filter })] : [];
159
+ const filters = !!filter ? [PaginationParamFilter.createSingleField({
160
+ field: 'metadata.name', value: filter, exact: false, equals: true
161
+ })] : [];
160
162
 
161
163
  filters.push(
162
164
  PaginationParamFilter.createSingleField({ field: 'metadata.namespace', value: this.namespace }),
163
- PaginationParamFilter.createSingleField({ field: 'metadata.fields.1', value: this.types.join(',') })
165
+ PaginationParamFilter.createMultipleFields(this.types.map((t) => ({
166
+ field: 'metadata.fields.1',
167
+ equals: true,
168
+ exact: true,
169
+ value: t
170
+ })))
164
171
  );
165
172
 
166
173
  return {