@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
@@ -11,6 +11,7 @@ import FileSelector from '@shell/components/form/FileSelector';
11
11
  import { _EDIT, _VIEW } from '@shell/config/query-params';
12
12
  import { asciiLike } from '@shell/utils/string';
13
13
  import CodeMirror from '@shell/components/CodeMirror';
14
+ import isEqual from 'lodash/isEqual';
14
15
 
15
16
  export default {
16
17
  name: 'KeyValue',
@@ -58,10 +59,8 @@ export default {
58
59
  },
59
60
 
60
61
  protip: {
61
- type: [String, Boolean],
62
- default() {
63
- return this.$store.getters['i18n/t']('keyValue.protip', null, true);
64
- },
62
+ type: [String, Boolean],
63
+ default: '',
65
64
  },
66
65
  // For asMap=false, the name of the field that goes into the row objects
67
66
  keyName: {
@@ -69,10 +68,8 @@ export default {
69
68
  default: 'key',
70
69
  },
71
70
  keyLabel: {
72
- type: String,
73
- default() {
74
- return this.$store.getters['i18n/t']('generic.key');
75
- },
71
+ type: String,
72
+ default: '',
76
73
  },
77
74
  keyEditable: {
78
75
  type: Boolean,
@@ -93,10 +90,8 @@ export default {
93
90
  default: false,
94
91
  },
95
92
  keyPlaceholder: {
96
- type: String,
97
- default() {
98
- return this.$store.getters['i18n/t']('keyValue.keyPlaceholder');
99
- },
93
+ type: String,
94
+ default: '',
100
95
  },
101
96
  /**
102
97
  * List of keys which needs to be disabled and hidden based on toggler
@@ -122,16 +117,12 @@ export default {
122
117
  default: 'value',
123
118
  },
124
119
  valueLabel: {
125
- type: String,
126
- default() {
127
- return this.$store.getters['i18n/t']('generic.value');
128
- },
120
+ type: String,
121
+ default: '',
129
122
  },
130
123
  valuePlaceholder: {
131
- type: String,
132
- default() {
133
- return this.$store.getters['i18n/t']('keyValue.valuePlaceholder');
134
- },
124
+ type: String,
125
+ default: '',
135
126
  },
136
127
  valueCanBeEmpty: {
137
128
  type: Boolean,
@@ -184,10 +175,8 @@ export default {
184
175
  default: () => {},
185
176
  },
186
177
  addLabel: {
187
- type: String,
188
- default() {
189
- return this.$store.getters['i18n/t']('generic.add');
190
- },
178
+ type: String,
179
+ default: '',
191
180
  },
192
181
  addIcon: {
193
182
  type: String,
@@ -197,12 +186,6 @@ export default {
197
186
  type: Boolean,
198
187
  default: true,
199
188
  },
200
- readLabel: {
201
- type: String,
202
- default() {
203
- return this.$store.getters['i18n/t']('generic.readFromFile');
204
- },
205
- },
206
189
  readIcon: {
207
190
  type: String,
208
191
  default: 'icon-upload',
@@ -237,7 +220,7 @@ export default {
237
220
  },
238
221
  parserSeparators: {
239
222
  type: Array,
240
- default: () => [': ', '='],
223
+ default: () => [':', '='],
241
224
  },
242
225
  loading: {
243
226
  default: false,
@@ -262,10 +245,29 @@ export default {
262
245
  return {
263
246
  rows,
264
247
  codeMirrorFocus: {},
248
+ lastUpdated: null
265
249
  };
266
250
  },
267
-
268
251
  computed: {
252
+ _protip() {
253
+ return this.protip || this.t('keyValue.protip', null, true);
254
+ },
255
+ _keyLabel() {
256
+ return this.keyLabel || this.t('generic.key');
257
+ },
258
+ _keyPlaceholder() {
259
+ return this.keyPlaceholder || this.t('keyValue.keyPlaceholder');
260
+ },
261
+ _valueLabel() {
262
+ return this.valueLabel || this.t('generic.value');
263
+ },
264
+ _valuePlaceholder() {
265
+ return this.valuePlaceholder || this.t('keyValue.valuePlaceholder');
266
+ },
267
+ _addLabel() {
268
+ return this.addLabel || this.t('generic.add');
269
+ },
270
+
269
271
  isView() {
270
272
  return this.mode === _VIEW;
271
273
  },
@@ -303,14 +305,28 @@ export default {
303
305
  this.queueUpdate = debounce(this.update, 500);
304
306
  },
305
307
  watch: {
306
- defaultValue(neu) {
307
- if (Array.isArray(neu)) {
308
- this.rows = this.getRows(neu);
309
- this.$emit('input', neu);
308
+ /**
309
+ * KV works with v-model=value
310
+ * value is transformed into this.rows (base64 decode, mark supported etc)
311
+ * on input, this.update constructs a new value from this.rows and emits
312
+ * if the parent component changes value, KV needs to re-compute this.rows
313
+ * If the value changes because the user has edited it using KV, then KV should NOT re-compute rows
314
+ * the value watcher will compare the last value KV emitted with the new value KV detects and re-compute rows if they don't match
315
+ */
316
+ value: {
317
+ deep: true,
318
+ handler(neu, old) {
319
+ this.valuePropChanged(neu, old);
310
320
  }
311
321
  }
312
322
  },
313
323
  methods: {
324
+ valuePropChanged(neu) {
325
+ if (!isEqual(neu, this.lastUpdated)) {
326
+ this.rows = this.getRows(neu);
327
+ }
328
+ },
329
+
314
330
  isProtected(key) {
315
331
  return this.protectedKeys && this.protectedKeys.includes(key);
316
332
  },
@@ -495,16 +511,18 @@ export default {
495
511
  return entry;
496
512
  });
497
513
  }
514
+ this.lastUpdated = out;
515
+
498
516
  this.$emit('input', out);
499
517
  },
500
- onPaste(index, event, pastedValue) {
518
+ onPaste(index, event) {
501
519
  const text = event.clipboardData.getData('text/plain');
502
520
  const lines = text.split('\n');
503
521
  const splits = lines.map((line) => {
504
- const splitter = !line.includes(':') || ((line.indexOf('=') < line.indexOf(':')) && line.includes(':')) ? '=' : ':';
522
+ const splitter = this.parserSeparators.find((sep) => line.includes(sep));
505
523
 
506
- return line.split(splitter);
507
- });
524
+ return splitter ? line.split(splitter) : '';
525
+ }).filter((split) => split && split.length > 0);
508
526
 
509
527
  if (splits.length === 0 || (splits.length === 1 && splits[0].length < 2)) {
510
528
  return;
@@ -587,15 +605,15 @@ export default {
587
605
  >
588
606
  <template v-if="rows.length || isView">
589
607
  <label class="text-label">
590
- {{ keyLabel }}
608
+ {{ _keyLabel }}
591
609
  <i
592
- v-if="protip && !isView && addAllowed"
593
- v-clean-tooltip="protip"
610
+ v-if="_protip && !isView && addAllowed"
611
+ v-clean-tooltip="_protip"
594
612
  class="icon icon-info"
595
613
  />
596
614
  </label>
597
615
  <label class="text-label">
598
- {{ valueLabel }}
616
+ {{ _valueLabel }}
599
617
  </label>
600
618
  <label
601
619
  v-for="c in extraColumns"
@@ -653,7 +671,7 @@ export default {
653
671
  ref="key"
654
672
  v-model="row[keyName]"
655
673
  :disabled="isView || disabled || !keyEditable || isProtected(row.key)"
656
- :placeholder="keyPlaceholder"
674
+ :placeholder="_keyPlaceholder"
657
675
  :data-testid="`input-kv-item-key-${i}`"
658
676
  @input="queueUpdate"
659
677
  @paste="onPaste(i, $event)"
@@ -704,7 +722,7 @@ export default {
704
722
  :class="{'conceal': valueConcealed}"
705
723
  :disabled="disabled || isProtected(row.key)"
706
724
  :mode="mode"
707
- :placeholder="valuePlaceholder"
725
+ :placeholder="_valuePlaceholder"
708
726
  :min-height="40"
709
727
  :spellcheck="false"
710
728
  @input="queueUpdate"
@@ -714,10 +732,11 @@ export default {
714
732
  v-model="row[valueName]"
715
733
  :disabled="isView || disabled || isProtected(row.key)"
716
734
  :type="valueConcealed ? 'password' : 'text'"
717
- :placeholder="valuePlaceholder"
735
+ :placeholder="_valuePlaceholder"
718
736
  autocorrect="off"
719
737
  autocapitalize="off"
720
738
  spellcheck="false"
739
+ :data-testid="`input-kv-item-value-${i}`"
721
740
  @input="queueUpdate"
722
741
  >
723
742
  <FileSelector
@@ -784,7 +803,7 @@ export default {
784
803
  <i
785
804
  v-if="loading"
786
805
  class="mr-5 icon icon-spinner icon-spin icon-lg"
787
- /> {{ addLabel }}
806
+ /> {{ _addLabel }}
788
807
  </button>
789
808
  <FileSelector
790
809
  v-if="readAllowed"
@@ -5,13 +5,16 @@ import { get } from '@shell/utils/object';
5
5
  import { LabeledTooltip } from '@components/LabeledTooltip';
6
6
  import VueSelectOverrides from '@shell/mixins/vue-select-overrides';
7
7
  import { onClickOption, calculatePosition } from '@shell/utils/select';
8
- import isEqual from 'lodash/isEqual';
8
+ import LabeledSelectPagination from '@shell/components/form/labeled-select-utils/labeled-select-pagination';
9
+ import { LABEL_SELECT_NOT_OPTION_KINDS } from '@shell/types/components/labeledSelect';
10
+
11
+ // In theory this would be nicer as LabeledSelect/index.vue, however that would break a lot of places where we import this (which includes extensions)
9
12
 
10
13
  export default {
11
14
  name: 'LabeledSelect',
12
15
 
13
16
  components: { LabeledTooltip },
14
- mixins: [CompactInput, LabeledFormElement, VueSelectOverrides],
17
+ mixins: [CompactInput, LabeledFormElement, VueSelectOverrides, LabeledSelectPagination],
15
18
 
16
19
  props: {
17
20
  appendToBody: {
@@ -67,7 +70,7 @@ export default {
67
70
  selectable: {
68
71
  default: (opt) => {
69
72
  if ( opt ) {
70
- if ( opt.disabled || opt.kind === 'group' || opt.kind === 'divider' || opt.loading ) {
73
+ if ( opt.disabled || LABEL_SELECT_NOT_OPTION_KINDS.includes(opt.kind) || opt.loading ) {
71
74
  return false;
72
75
  }
73
76
  }
@@ -89,13 +92,17 @@ export default {
89
92
  type: [String, Object, Number, Array, Boolean]
90
93
  },
91
94
  options: {
92
- type: Array,
93
- required: true
95
+ type: Array,
96
+ default: () => ([])
94
97
  },
95
98
  closeOnSelect: {
96
99
  type: Boolean,
97
100
  default: true
98
101
  },
102
+ noOptionsLabelKey: {
103
+ type: String,
104
+ default: 'labelSelect.noOptions.empty'
105
+ }
99
106
  },
100
107
 
101
108
  data() {
@@ -109,6 +116,16 @@ export default {
109
116
  hasLabel() {
110
117
  return this.isCompact ? false : !!this.label || !!this.labelKey || !!this.$slots.label;
111
118
  },
119
+
120
+ hasGroupIcon() {
121
+ // Required for option.icon. Note that we only apply if paginating as well (there might be 2 x performance issues with 2k entries. one to iterate through this list, the other with conditional class per entry in dom)
122
+ return this.canPaginate ? !!this._options.find((o) => o.kind === 'group' && !!o.icon) : false;
123
+ },
124
+
125
+ _options() {
126
+ // If we're paginated show the page as provided by `paginate`. See label-select-pagination mixin
127
+ return this.canPaginate ? this.page : this.options;
128
+ }
112
129
  },
113
130
 
114
131
  methods: {
@@ -153,18 +170,6 @@ export default {
153
170
  return;
154
171
  }
155
172
 
156
- // This check is only needed if its possible for an option's label to change without the option's value changing - we can skip this if options are just strings or numbers
157
- // HOWEVER even if strings are passed to v-select the 'option' in the slot is normalized to {label: <option>} so we have to check the options prop here instead of the 'option' itself
158
- if (typeof this.options[0] === 'object') {
159
- const newOption = this.getUpdatedOption(option);
160
-
161
- if (newOption) {
162
- const label = get(newOption, this.optionLabel);
163
-
164
- return this.localizedLabel ? this.$store.getters['i18n/t'](label) || label : label;
165
- }
166
- }
167
-
168
173
  if (this.$attrs['get-option-label']) {
169
174
  return this.$attrs['get-option-label'](option);
170
175
  }
@@ -181,14 +186,6 @@ export default {
181
186
  }
182
187
  },
183
188
 
184
- // If the option's label changed in parent but value did not, the label wont be automatically updated here
185
- // Ensure that the label being shown is still present in the options prop and find the new one if not
186
- getUpdatedOption(option) {
187
- const isOutdated = this.options && !this.options.find((opt) => option[this.optionLabel] === opt[this.optionLabel]);
188
-
189
- return isOutdated ? this.options.find((opt) => isEqual(this.reduce(option), this.reduce(opt))) : undefined;
190
- },
191
-
192
189
  positionDropdown(dropdownList, component, { width }) {
193
190
  calculatePosition(dropdownList, component, width, this.placement);
194
191
  },
@@ -219,8 +216,12 @@ export default {
219
216
  },
220
217
 
221
218
  onSearch(newSearchString) {
222
- if (newSearchString) {
223
- this.dropdownShouldOpen(this.$refs['select-input'], true);
219
+ if (this.canPaginate) {
220
+ this.setPaginationFilter(newSearchString);
221
+ } else {
222
+ if (newSearchString) {
223
+ this.dropdownShouldOpen(this.$refs['select-input'], true);
224
+ }
224
225
  }
225
226
  },
226
227
 
@@ -276,16 +277,17 @@ export default {
276
277
  class="inline"
277
278
  :append-to-body="appendToBody"
278
279
  :calculate-position="positionDropdown"
279
- :class="{ 'no-label': !(label || '').length }"
280
+ :class="{ 'no-label': !(label || '').length}"
280
281
  :clearable="clearable"
281
282
  :disabled="isView || disabled || loading"
282
283
  :get-option-key="getOptionKey"
283
284
  :get-option-label="(opt) => getOptionLabel(opt)"
284
285
  :label="optionLabel"
285
- :options="options"
286
+ :options="_options"
286
287
  :map-keydown="mappedKeys"
287
288
  :placeholder="placeholder"
288
289
  :reduce="(x) => reduce(x)"
290
+ :filterable="isFilterable"
289
291
  :searchable="isSearchable"
290
292
  :selectable="selectable"
291
293
  :value="value != null && !loading ? value : ''"
@@ -301,6 +303,11 @@ export default {
301
303
  <template #option="option">
302
304
  <template v-if="option.kind === 'group'">
303
305
  <div class="vs__option-kind-group">
306
+ <i
307
+ v-if="option.icon"
308
+ class="icon"
309
+ :class="{ [option.icon]: true}"
310
+ />
304
311
  <b>{{ getOptionLabel(option) }}</b>
305
312
  <div v-if="option.badge">
306
313
  {{ option.badge }}
@@ -317,6 +324,8 @@ export default {
317
324
  </template>
318
325
  <div
319
326
  v-else
327
+ class="vs__option-kind"
328
+ :class="{ 'has-icon' : hasGroupIcon}"
320
329
  @mousedown="(e) => onClickOption(option, e)"
321
330
  >
322
331
  {{ getOptionLabel(option) }}
@@ -337,6 +346,45 @@ export default {
337
346
  v-bind="scope"
338
347
  />
339
348
  </template>
349
+
350
+ <div
351
+ v-if="canPaginate && totalResults"
352
+ slot="list-footer"
353
+ class="pagination-slot"
354
+ >
355
+ <div class="load-more">
356
+ <i
357
+ v-if="paginating"
358
+ class="icon icon-spinner icon-spin"
359
+ />
360
+ <div v-else>
361
+ <a
362
+ v-if="canLoadMore"
363
+ @click="loadMore"
364
+ > {{ t('labelSelect.pagination.more') }}</a>
365
+ </div>
366
+ </div>
367
+
368
+ <div class="count">
369
+ {{ optionCounts }}
370
+ </div>
371
+ </div>
372
+ <template #no-options="{ search }">
373
+ <div class="no-options-slot">
374
+ <div
375
+ v-if="paginating"
376
+ class="paginating"
377
+ >
378
+ <i class="icon icon-spinner icon-spin" />
379
+ </div>
380
+ <template v-else-if="search">
381
+ {{ t('labelSelect.noOptions.noMatch') }}
382
+ </template>
383
+ <template v-else>
384
+ {{ t(noOptionsLabelKey) }}
385
+ </template>
386
+ </div>
387
+ </template>
340
388
  </v-select>
341
389
  <i
342
390
  v-if="loading"
@@ -514,21 +562,73 @@ export default {
514
562
  }
515
563
  }
516
564
 
517
- // Styling for option group badge
518
- .vs__dropdown-menu .vs__dropdown-option .vs__option-kind-group {
519
- display: flex;
520
- > b {
521
- flex: 1;
565
+ $icon-size: 18px;
566
+
567
+ // This represents the drop down area. Note - it might be attached to body and NOT the parent label select div
568
+ .vs__dropdown-menu {
569
+
570
+ // Styling for individual options
571
+ .vs__dropdown-option .vs__option-kind {
572
+ &-group {
573
+ display: flex;
574
+ align-items: center;
575
+
576
+ i { // icon
577
+ width: $icon-size;
578
+ }
579
+
580
+ > b { // group label
581
+ flex: 1;
582
+ }
583
+
584
+ > div { // badge
585
+ background-color: var(--primary);
586
+ border-radius: 4px;
587
+ color: var(--primary-text);
588
+ font-size: 12px;
589
+ height: 18px;
590
+ line-height: 18px;
591
+ margin-top: 1px;
592
+ padding: 0 10px;
593
+ }
594
+ }
595
+
596
+ &.has-icon {
597
+ padding-left: $icon-size;
598
+ }
599
+ }
600
+
601
+ &.has-icon .vs__option-kind div{
602
+ padding-left: $icon-size;
603
+ }
604
+
605
+ .pagination-slot {
606
+ display: flex;
607
+ align-items: center;
608
+ justify-content: center;
609
+ position: relative;
610
+ margin-top: 5px;
611
+
612
+ .load-more {
613
+ display: flex;
614
+ align-items: center;
615
+ height: 19px;
616
+
617
+ a {
618
+ cursor: pointer;
619
+ }
620
+ }
621
+
622
+ .count {
623
+ position: absolute;
624
+ right: 10px;
625
+ }
522
626
  }
523
- > div {
524
- background-color: var(--primary);
525
- border-radius: 4px;
526
- color: var(--primary-text);
527
- font-size: 12px;
528
- height: 18px;
529
- line-height: 18px;
530
- margin-top: 1px;
531
- padding: 0 10px;
627
+
628
+ .no-options-slot .paginating {
629
+ display: flex;
630
+ align-items: center;
631
+ justify-content: center;
532
632
  }
533
633
  }
534
634
 
@@ -52,7 +52,7 @@ export default {
52
52
  showLabelTitle: {
53
53
  type: Boolean,
54
54
  default: true,
55
- },
55
+ }
56
56
  },
57
57
 
58
58
  data() {
@@ -124,6 +124,8 @@ export default {
124
124
  :value="value.annotations"
125
125
  :add-label="t('labels.addAnnotation')"
126
126
  :mode="mode"
127
+ :protected-keys="value.systemAnnotations || []"
128
+ :toggle-filter="toggler"
127
129
  :title="t('labels.annotations.title')"
128
130
  :title-protip="annotationTitleTooltip"
129
131
  :read-allowed="false"
@@ -1,6 +1,6 @@
1
1
  <script>
2
2
  import Vue from 'vue';
3
- import { mapGetters } from 'vuex';
3
+ import { mapGetters, mapActions } from 'vuex';
4
4
  import { get, set } from '@shell/utils/object';
5
5
  import { sortBy } from '@shell/utils/sort';
6
6
  import { NAMESPACE } from '@shell/config/types';
@@ -14,7 +14,7 @@ export default {
14
14
  name: 'NameNsDescription',
15
15
  components: {
16
16
  LabeledInput,
17
- LabeledSelect
17
+ LabeledSelect,
18
18
  },
19
19
 
20
20
  props: {
@@ -215,6 +215,7 @@ export default {
215
215
 
216
216
  computed: {
217
217
  ...mapGetters(['currentProduct', 'currentCluster', 'namespaces', 'allowedNamespaces']),
218
+ ...mapActions('cru-resource', ['setCreateNamespace']),
218
219
  namespaceReallyDisabled() {
219
220
  return (
220
221
  !!this.forceNamespace || this.namespaceDisabled || this.mode === _EDIT
@@ -289,6 +290,10 @@ export default {
289
290
  return this.mode === _CREATE;
290
291
  },
291
292
 
293
+ showCustomize() {
294
+ return this.mode === _CREATE && this.name && this.name.length > 0;
295
+ },
296
+
292
297
  colSpan() {
293
298
  if (!this.horizontal) {
294
299
  return `span-8`;
@@ -310,7 +315,7 @@ export default {
310
315
 
311
316
  watch: {
312
317
  name(val) {
313
- if ( this.normalizeName ) {
318
+ if (this.normalizeName) {
314
319
  val = normalizeName(val);
315
320
  }
316
321
 
@@ -370,22 +375,28 @@ export default {
370
375
  cancelCreateNamespace(e) {
371
376
  this.createNamespace = false;
372
377
  this.$parent.$emit('createNamespace', false);
373
- // In practise we should always have a defaultNamespace... unless we're in non-kube extension world, so fall back on options
374
- this.namespace = this.$store.getters['defaultNamespace'] || this.options.find((o) => !!o.value)?.value ;
378
+ // In practice we should always have a defaultNamespace... unless we're in non-kube extension world, so fall back on options
379
+ this.namespace = this.$store.getters['defaultNamespace'] || this.options.find((o) => !!o.value)?.value;
375
380
  },
376
381
 
377
382
  selectNamespace(e) {
378
383
  if (!e || e.value === '') { // The blank value in the dropdown is labeled "Create a New Namespace"
379
384
  this.createNamespace = true;
380
- this.$parent.$emit('createNamespace', true);
385
+ this.$store.dispatch(
386
+ 'cru-resource/setCreateNamespace',
387
+ true,
388
+ );
381
389
  this.$emit('isNamespaceNew', true);
382
390
  Vue.nextTick(() => this.$refs.namespace.focus());
383
391
  } else {
384
392
  this.createNamespace = false;
385
- this.$parent.$emit('createNamespace', false);
393
+ this.$store.dispatch(
394
+ 'cru-resource/setCreateNamespace',
395
+ false,
396
+ );
386
397
  this.$emit('isNamespaceNew', false);
387
398
  }
388
- }
399
+ },
389
400
  },
390
401
  };
391
402
  </script>
@@ -459,6 +470,8 @@ export default {
459
470
  />
460
471
  </div>
461
472
 
473
+ <slot name="customize" />
474
+ <!-- // TODO: here goes the custom component -->
462
475
  <div
463
476
  v-show="!descriptionHidden"
464
477
  :data-testid="componentTestid + '-description'"
@@ -505,13 +518,16 @@ button {
505
518
  padding-top: 7px;
506
519
  }
507
520
  }
521
+
508
522
  .row {
509
523
  &.name-ns-description {
510
524
  max-height: $input-height;
511
525
  }
526
+
512
527
  .namespace-select ::v-deep {
513
528
  .labeled-select {
514
529
  min-width: 40%;
530
+
515
531
  .v-select.inline {
516
532
  &.vs--single {
517
533
  padding-bottom: 2px;
@@ -527,9 +543,10 @@ button {
527
543
  max-height: initial;
528
544
  }
529
545
 
530
- & > div > * {
546
+ &>div>* {
531
547
  margin-bottom: 20px;
532
548
  }
533
549
  }
550
+
534
551
  }
535
552
  </style>