@rancher/shell 1.2.3 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (699) hide show
  1. package/assets/data/aws-regions.json +9 -0
  2. package/assets/images/vendor/openid.svg +18 -0
  3. package/assets/styles/app.scss +1 -2
  4. package/assets/styles/fonts/_icons.scss +3 -3
  5. package/assets/styles/global/_columns.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +1 -0
  7. package/assets/styles/global/_layout.scss +99 -0
  8. package/assets/styles/themes/_csp.scss +2 -2
  9. package/assets/styles/themes/_dark.scss +8 -2
  10. package/assets/styles/themes/_light.scss +2 -1
  11. package/assets/styles/themes/_suse.scss +1 -1
  12. package/assets/styles/vendor/vue-select.scss +5 -0
  13. package/assets/translations/en-us.yaml +315 -64
  14. package/assets/translations/zh-hans.yaml +7 -31
  15. package/babel.config.js +8 -2
  16. package/chart/__tests__/S3.test.ts +9 -2
  17. package/chart/gatekeeper.vue +2 -11
  18. package/chart/istio.vue +1 -10
  19. package/chart/logging/index.vue +2 -11
  20. package/chart/monitoring/alerting/index.vue +7 -21
  21. package/chart/monitoring/grafana/index.vue +61 -2
  22. package/chart/monitoring/index.vue +52 -26
  23. package/chart/monitoring/prometheus/index.vue +39 -45
  24. package/chart/rancher-backup/S3.vue +11 -9
  25. package/chart/rancher-backup/index.vue +18 -15
  26. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  27. package/cloud-credential/azure.vue +4 -17
  28. package/cloud-credential/generic.vue +18 -9
  29. package/cloud-credential/harvester.vue +11 -3
  30. package/components/AlertTable.vue +17 -7
  31. package/components/AppModal.vue +167 -0
  32. package/components/AssignTo.vue +7 -4
  33. package/components/AsyncButton.vue +27 -5
  34. package/components/BackLink.vue +4 -4
  35. package/components/BannerGraphic.vue +1 -0
  36. package/components/BrandImage.vue +47 -1
  37. package/components/Carousel.vue +15 -8
  38. package/components/Certificates.vue +161 -0
  39. package/components/ClusterBadge.vue +12 -3
  40. package/components/ClusterIconMenu.vue +55 -12
  41. package/components/ClusterProviderIcon.vue +14 -3
  42. package/components/CodeMirror.vue +111 -17
  43. package/components/CommunityLinks.vue +12 -8
  44. package/components/CopyCode.vue +6 -2
  45. package/components/CopyToClipboard.vue +2 -1
  46. package/components/CopyToClipboardText.vue +14 -9
  47. package/components/CreateDriver.vue +81 -0
  48. package/components/CruResource.vue +52 -27
  49. package/components/DetailTop.vue +2 -2
  50. package/components/Dialog.vue +6 -5
  51. package/components/DisableAuthProviderModal.vue +14 -8
  52. package/components/DraggableZone.vue +2 -2
  53. package/components/EtcdInfoBanner.vue +5 -5
  54. package/components/ExplorerMembers.vue +3 -3
  55. package/components/ExplorerProjectsNamespaces.vue +31 -7
  56. package/components/FixedBanner.vue +48 -36
  57. package/components/GlobalRoleBindings.vue +26 -0
  58. package/components/GrafanaDashboard.vue +6 -4
  59. package/components/IconOrSvg.vue +1 -1
  60. package/components/Import.vue +10 -6
  61. package/components/Inactivity.vue +1 -5
  62. package/components/KeyValueView.vue +14 -10
  63. package/components/Markdown.vue +16 -12
  64. package/components/MessageLink.vue +2 -2
  65. package/components/ModalWithCard.vue +5 -8
  66. package/components/MoveModal.vue +35 -33
  67. package/components/PodSecurityAdmission.vue +3 -3
  68. package/components/PromptChangePassword.vue +33 -33
  69. package/components/PromptModal.vue +11 -21
  70. package/components/PromptRemove.vue +12 -17
  71. package/components/PromptRestore.vue +18 -16
  72. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  73. package/components/Questions/__tests__/Float.test.ts +9 -19
  74. package/components/Questions/__tests__/Int.test.ts +9 -19
  75. package/components/Questions/__tests__/String.test.ts +9 -19
  76. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  77. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  78. package/components/Questions/index.vue +19 -3
  79. package/components/ResourceCancelModal.vue +34 -29
  80. package/components/ResourceDetail/Masthead.vue +48 -16
  81. package/components/ResourceDetail/index.vue +6 -4
  82. package/components/ResourceList/Masthead.vue +10 -9
  83. package/components/ResourceList/index.vue +65 -14
  84. package/components/ResourceTable.vue +87 -21
  85. package/components/ResourceYaml.vue +35 -5
  86. package/components/SelectIconGrid.vue +3 -3
  87. package/components/SideNav.vue +50 -94
  88. package/components/SingleClusterInfo.vue +4 -4
  89. package/components/SortableTable/THead.vue +33 -21
  90. package/components/SortableTable/filtering.js +9 -1
  91. package/components/SortableTable/grouping.js +8 -1
  92. package/components/SortableTable/index.vue +143 -44
  93. package/components/SortableTable/paging.js +36 -7
  94. package/components/SortableTable/selection.js +2 -1
  95. package/components/SortableTable/sorting.js +24 -7
  96. package/components/StatusTable.vue +5 -1
  97. package/components/Tabbed/index.vue +18 -1
  98. package/components/TableDataUserIcon.vue +47 -0
  99. package/components/TypeDescription.vue +1 -0
  100. package/components/Wizard.vue +1 -0
  101. package/components/YamlEditor.vue +1 -0
  102. package/components/__tests__/AppModal.test.ts +98 -0
  103. package/components/__tests__/AsyncButton.test.ts +1 -3
  104. package/components/__tests__/BackLink.test.ts +1 -1
  105. package/components/__tests__/ButtonGroup.test.ts +3 -6
  106. package/components/__tests__/Carousel.test.ts +43 -0
  107. package/components/__tests__/Certificates.test.ts +29 -0
  108. package/components/__tests__/CodeMirror.test.ts +87 -0
  109. package/components/__tests__/CopyCode.test.ts +5 -4
  110. package/components/__tests__/CruResource.test.ts +10 -9
  111. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  112. package/components/__tests__/FixedBanner.test.ts +5 -20
  113. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  114. package/components/__tests__/TabTitle.test.ts +129 -0
  115. package/components/auth/AzureWarning.vue +2 -2
  116. package/components/auth/RoleDetailEdit.vue +10 -0
  117. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  118. package/components/auth/login/oidc.vue +7 -1
  119. package/components/fleet/FleetBundles.vue +5 -11
  120. package/components/fleet/FleetClusters.vue +9 -9
  121. package/components/fleet/FleetIntro.vue +11 -17
  122. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  123. package/components/fleet/FleetRepos.vue +63 -27
  124. package/components/fleet/FleetResources.vue +6 -1
  125. package/components/fleet/FleetStatus.vue +3 -3
  126. package/components/fleet/FleetSummary.vue +35 -30
  127. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  128. package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
  129. package/components/form/ArrayList.vue +22 -18
  130. package/components/form/ArrayListSelect.vue +5 -0
  131. package/components/form/BannerSettings.vue +3 -0
  132. package/components/form/ClusterAppearance.vue +132 -0
  133. package/components/form/ColorInput.vue +1 -0
  134. package/components/form/Error.vue +3 -3
  135. package/components/form/FileSelector.vue +1 -0
  136. package/components/form/Footer.vue +2 -2
  137. package/components/form/GitPicker.vue +83 -38
  138. package/components/form/KeyValue.vue +70 -48
  139. package/components/form/LabeledSelect.vue +145 -41
  140. package/components/form/Labels.vue +3 -1
  141. package/components/form/NameNsDescription.vue +26 -9
  142. package/components/form/Password.vue +3 -1
  143. package/components/form/ResourceLabeledSelect.vue +187 -0
  144. package/components/form/ResourceTabs/index.vue +31 -15
  145. package/components/form/SecretSelector.vue +93 -18
  146. package/components/form/SelectOrCreateAuthSecret.vue +132 -59
  147. package/components/form/SimpleSecretSelector.vue +88 -28
  148. package/components/form/Taints.vue +13 -7
  149. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  150. package/components/form/__tests__/KeyValue.test.ts +120 -11
  151. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  152. package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +25 -15
  153. package/components/form/__tests__/Taints.test.ts +70 -0
  154. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  155. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  156. package/components/formatter/AppSummaryGraph.vue +2 -2
  157. package/components/formatter/Checked.vue +11 -3
  158. package/components/formatter/CloudCredPublicData.vue +30 -0
  159. package/components/formatter/ClusterLink.vue +2 -2
  160. package/components/formatter/ClusterProvider.vue +1 -18
  161. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  162. package/components/formatter/FleetSummaryGraph.vue +25 -12
  163. package/components/formatter/ImagePercentageBar.vue +0 -4
  164. package/components/formatter/IngressTarget.vue +18 -7
  165. package/components/formatter/Link.vue +2 -2
  166. package/components/formatter/LinkDetail.vue +2 -2
  167. package/components/formatter/LinkDetailImage.vue +2 -2
  168. package/components/formatter/LinkName.vue +2 -2
  169. package/components/formatter/LiveDuration.vue +1 -1
  170. package/components/formatter/PercentageBar.vue +1 -1
  171. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  172. package/components/formatter/SecretType.vue +2 -2
  173. package/components/formatter/VirtualServiceGateways.vue +2 -2
  174. package/components/formatter/WorkloadDetailEndpoints.vue +12 -22
  175. package/components/formatter/__tests__/Checked.test.ts +19 -0
  176. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  177. package/components/formatter/__tests__/WorkloadDetailEndpoints.test.ts +81 -0
  178. package/components/nav/Group.vue +9 -7
  179. package/components/nav/Header.vue +85 -46
  180. package/components/nav/Jump.vue +19 -9
  181. package/components/nav/NamespaceFilter.vue +8 -1
  182. package/components/nav/TopLevelMenu.vue +392 -136
  183. package/components/nav/Type.vue +71 -106
  184. package/components/nav/WindowManager/ContainerLogs.vue +120 -19
  185. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  186. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  187. package/components/nav/WindowManager/index.vue +11 -10
  188. package/components/nav/__tests__/TopLevelMenu.test.ts +400 -6
  189. package/components/nav/__tests__/Type.test.ts +322 -97
  190. package/components/nuxt/nuxt-child.js +9 -78
  191. package/components/nuxt/nuxt-error.vue +1 -1
  192. package/components/nuxt/nuxt-link.client.js +13 -95
  193. package/{layouts → components/templates}/blank.vue +1 -1
  194. package/{layouts → components/templates}/default.vue +11 -101
  195. package/{layouts → components/templates}/error.vue +13 -26
  196. package/{layouts → components/templates}/home.vue +4 -1
  197. package/{layouts → components/templates}/plain.vue +4 -1
  198. package/{layouts → components/templates}/standalone.vue +1 -5
  199. package/{layouts → components/templates}/unauthenticated.vue +2 -3
  200. package/composables/useCompactInput.test.ts +36 -0
  201. package/composables/useCompactInput.ts +20 -0
  202. package/composables/useLabeledFormElement.test.ts +135 -0
  203. package/composables/useLabeledFormElement.ts +138 -0
  204. package/config/harvester-manager-types.js +2 -0
  205. package/config/home-links.js +2 -1
  206. package/config/labels-annotations.js +2 -1
  207. package/config/middleware.js +0 -6
  208. package/config/pagination-table-headers.js +57 -0
  209. package/config/pod-security-admission.ts +1 -1
  210. package/config/private-label.js +21 -1
  211. package/config/product/auth.js +1 -0
  212. package/config/product/explorer.js +166 -45
  213. package/config/product/fleet.js +6 -1
  214. package/config/product/legacy.js +2 -11
  215. package/config/product/manager.js +51 -25
  216. package/config/query-params.js +2 -0
  217. package/config/roles.ts +23 -0
  218. package/config/router/index.js +23 -0
  219. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  220. package/config/router/navigation-guards/authentication.js +63 -0
  221. package/config/router/navigation-guards/i18n.js +13 -0
  222. package/config/router/navigation-guards/index.js +16 -0
  223. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  224. package/config/router/routes.js +487 -0
  225. package/config/settings.ts +31 -2
  226. package/config/store.js +8 -4
  227. package/config/system-namespaces.js +3 -0
  228. package/config/table-headers.js +66 -1
  229. package/config/types.js +35 -20
  230. package/config/uiplugins.js +10 -5
  231. package/core/plugin-helpers.js +4 -6
  232. package/core/plugin-routes.ts +56 -114
  233. package/core/plugin.ts +18 -11
  234. package/core/plugins-loader.js +7 -9
  235. package/core/plugins.js +289 -285
  236. package/core/types-provisioning.ts +7 -0
  237. package/creators/app/app.package.json +2 -1
  238. package/creators/app/files/.eslintignore +0 -2
  239. package/creators/app/files/.gitlab-ci.yml +14 -0
  240. package/creators/app/files/.vscode/settings.json +0 -1
  241. package/creators/app/init +19 -0
  242. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  243. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  244. package/creators/pkg/init +32 -0
  245. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +119 -0
  246. package/detail/__tests__/service.test.ts +62 -0
  247. package/detail/catalog.cattle.io.app.vue +1 -1
  248. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  249. package/detail/fleet.cattle.io.bundle.vue +1 -1
  250. package/detail/fleet.cattle.io.cluster.vue +11 -1
  251. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  252. package/detail/namespace.vue +2 -2
  253. package/detail/networking.k8s.io.ingress.vue +52 -19
  254. package/detail/node.vue +22 -3
  255. package/detail/provisioning.cattle.io.cluster.vue +31 -13
  256. package/detail/service.vue +1 -1
  257. package/detail/workload/index.vue +1 -0
  258. package/dialog/AddCustomBadgeDialog.vue +318 -161
  259. package/dialog/DeactivateDriverDialog.vue +137 -0
  260. package/dialog/RollbackWorkloadDialog.vue +2 -2
  261. package/dialog/RotateCertificatesDialog.vue +0 -21
  262. package/dialog/ScaleMachineDownDialog.vue +34 -17
  263. package/directives/clean-html.js +15 -0
  264. package/directives/clean-tooltip.js +32 -0
  265. package/directives/focus.js +41 -0
  266. package/directives/int-number.js +21 -0
  267. package/directives/positive-int-number.js +19 -0
  268. package/directives/trim-whitespace.js +19 -0
  269. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  270. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  271. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  272. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  273. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  274. package/edit/__tests__/nodeDriver.test.ts +107 -0
  275. package/edit/__tests__/service.test.ts +85 -0
  276. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  277. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  278. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  279. package/edit/auth/__tests__/azuread.test.ts +241 -0
  280. package/edit/auth/__tests__/oidc.test.ts +137 -0
  281. package/edit/auth/azuread.vue +133 -31
  282. package/edit/auth/github.vue +5 -17
  283. package/edit/auth/googleoauth.vue +6 -23
  284. package/edit/auth/ldap/index.vue +5 -17
  285. package/edit/auth/oidc.vue +143 -42
  286. package/edit/auth/saml.vue +5 -14
  287. package/edit/catalog.cattle.io.clusterrepo.vue +177 -9
  288. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  289. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  290. package/edit/cloudcredential.vue +28 -4
  291. package/edit/configmap.vue +10 -4
  292. package/edit/fleet.cattle.io.gitrepo.vue +3 -1
  293. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  294. package/edit/kontainerDriver.vue +65 -0
  295. package/edit/logging-flow/Match.vue +10 -9
  296. package/edit/logging-flow/index.vue +4 -19
  297. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  298. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  299. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  300. package/edit/management.cattle.io.project.vue +3 -53
  301. package/edit/management.cattle.io.setting.vue +52 -2
  302. package/edit/management.cattle.io.user.vue +2 -1
  303. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  304. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  305. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +1 -1
  306. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -2
  307. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +1 -1
  308. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +15 -3
  309. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +4 -1
  310. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  311. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  312. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  313. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  314. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  315. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  316. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +46 -7
  317. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +1 -1
  318. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  319. package/edit/nodeDriver.vue +65 -0
  320. package/edit/persistentvolume/index.vue +2 -2
  321. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +33 -16
  322. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +276 -0
  323. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  324. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +3 -0
  325. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  326. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  327. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  328. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +77 -13
  329. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +391 -0
  330. package/edit/provisioning.cattle.io.cluster/import.vue +4 -4
  331. package/edit/provisioning.cattle.io.cluster/index.vue +126 -51
  332. package/edit/provisioning.cattle.io.cluster/rke2.vue +325 -791
  333. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  334. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +217 -0
  335. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +123 -129
  336. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  337. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  338. package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +1 -0
  339. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  340. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +190 -0
  341. package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +3 -0
  342. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +148 -0
  343. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  344. package/edit/resources.cattle.io.backup.vue +139 -124
  345. package/edit/resources.cattle.io.restore.vue +146 -126
  346. package/edit/service.vue +13 -0
  347. package/edit/serviceaccount.vue +46 -4
  348. package/edit/token.vue +3 -1
  349. package/edit/workload/Upgrading.vue +3 -2
  350. package/edit/workload/__tests__/Job.test.ts +1 -3
  351. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  352. package/edit/workload/index.vue +2 -1
  353. package/edit/workload/mixins/workload.js +35 -2
  354. package/edit/workload/storage/emptyDir.vue +2 -2
  355. package/initialize/App.vue +75 -0
  356. package/initialize/app-extended.js +128 -0
  357. package/initialize/entry-helpers.js +546 -0
  358. package/initialize/entry.js +32 -0
  359. package/initialize/install-components.js +23 -0
  360. package/initialize/install-directives.js +59 -0
  361. package/initialize/install-plugins.js +123 -0
  362. package/list/__tests__/workload.test.ts +1 -1
  363. package/list/catalog.cattle.io.app.vue +1 -0
  364. package/list/cis.cattle.io.clusterscan.vue +16 -10
  365. package/list/group.principal.vue +2 -2
  366. package/list/management.cattle.io.feature.vue +16 -16
  367. package/list/management.cattle.io.setting.vue +1 -0
  368. package/list/management.cattle.io.user.vue +13 -4
  369. package/list/networking.k8s.io.ingress.vue +36 -0
  370. package/list/node.vue +212 -73
  371. package/list/provisioning.cattle.io.cluster.vue +17 -4
  372. package/list/ui.cattle.io.navlink.vue +2 -2
  373. package/list/workload.vue +22 -0
  374. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  375. package/machine-config/__tests__/vmwarevsphere.test.ts +1 -3
  376. package/machine-config/amazonec2.vue +1 -1
  377. package/machine-config/azure.vue +2 -1
  378. package/machine-config/generic.vue +11 -15
  379. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  380. package/machine-config/vmwarevsphere.vue +31 -27
  381. package/middleware/authenticated.js +23 -399
  382. package/mixins/__tests__/chart.test.ts +48 -6
  383. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  384. package/mixins/auth-config.js +5 -9
  385. package/mixins/brand.js +102 -96
  386. package/mixins/chart.js +27 -13
  387. package/mixins/create-edit-view/index.js +2 -2
  388. package/mixins/fetch.client.js +42 -48
  389. package/mixins/labeled-form-element.ts +27 -2
  390. package/mixins/page-actions.js +7 -5
  391. package/mixins/resource-fetch-api-pagination.js +304 -0
  392. package/mixins/resource-fetch-namespaced.js +1 -1
  393. package/mixins/resource-fetch.js +46 -5
  394. package/models/__tests__/cluster.test.ts +44 -0
  395. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  396. package/models/__tests__/management.cattle.io.cluster.test.ts +23 -0
  397. package/models/__tests__/management.cattle.io.node.ts +85 -0
  398. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  399. package/models/__tests__/namespace.test.ts +49 -9
  400. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +241 -0
  401. package/models/__tests__/schema.tests.ts +24 -0
  402. package/models/__tests__/secret.test.ts +37 -0
  403. package/models/__tests__/steve-schema.test.ts +73 -0
  404. package/models/__tests__/storage.k8s.io.storageclass.test.ts +22 -0
  405. package/models/__tests__/workload.test.ts +91 -0
  406. package/models/catalog.cattle.io.app.js +8 -0
  407. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  408. package/models/catalog.cattle.io.uiplugin.js +7 -8
  409. package/models/cis.cattle.io.clusterscan.js +29 -8
  410. package/models/cloudcredential.js +9 -1
  411. package/models/cluster/node.js +8 -4
  412. package/models/cluster/schema.js +6 -0
  413. package/models/cluster.js +33 -0
  414. package/models/cluster.x-k8s.io.machine.js +1 -1
  415. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  416. package/models/driver.js +63 -0
  417. package/models/fleet.cattle.io.cluster.js +27 -11
  418. package/models/fleet.cattle.io.gitrepo.js +66 -13
  419. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  420. package/models/kontainerdriver.js +85 -0
  421. package/models/management/schema.js +6 -0
  422. package/models/management.cattle.io.authconfig.js +3 -2
  423. package/models/management.cattle.io.cluster.js +16 -7
  424. package/models/management.cattle.io.globalrole.js +2 -0
  425. package/models/management.cattle.io.kontainerdriver.js +1 -0
  426. package/models/management.cattle.io.node.js +18 -14
  427. package/models/management.cattle.io.nodepool.js +17 -0
  428. package/models/management.cattle.io.project.js +0 -36
  429. package/models/management.cattle.io.setting.js +11 -7
  430. package/models/management.cattle.io.user.js +2 -2
  431. package/models/monitoring.coreos.com.receiver.js +3 -1
  432. package/models/monitoring.coreos.com.route.js +1 -1
  433. package/models/namespace.js +1 -1
  434. package/models/networking.k8s.io.ingress.js +2 -1
  435. package/models/nodedriver.js +85 -0
  436. package/models/pod.js +20 -0
  437. package/models/provisioning.cattle.io.cluster.js +125 -10
  438. package/models/schema.js +28 -7
  439. package/models/secret.js +126 -18
  440. package/models/service.js +2 -0
  441. package/models/steve-schema.ts +254 -0
  442. package/models/storage.k8s.io.storageclass.js +1 -1
  443. package/models/workload.js +17 -0
  444. package/models/workload.service.js +18 -0
  445. package/package.json +18 -14
  446. package/pages/about.vue +12 -6
  447. package/pages/account/create-key.vue +0 -1
  448. package/pages/account/index.vue +7 -3
  449. package/pages/auth/login.vue +106 -103
  450. package/pages/auth/logout.vue +2 -4
  451. package/pages/auth/setup.vue +92 -66
  452. package/pages/auth/verify.vue +30 -24
  453. package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +2 -17
  454. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  455. package/pages/c/_cluster/apps/charts/index.vue +99 -69
  456. package/pages/c/_cluster/apps/charts/install.helpers.js +2 -13
  457. package/pages/c/_cluster/apps/charts/install.vue +12 -11
  458. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  459. package/pages/c/_cluster/auth/config/index.vue +15 -9
  460. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  461. package/pages/c/_cluster/ecm/index.vue +0 -2
  462. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  463. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  464. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  465. package/pages/c/_cluster/explorer/index.vue +253 -91
  466. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  467. package/pages/c/_cluster/explorer/tools/index.vue +10 -6
  468. package/pages/c/_cluster/fleet/index.vue +89 -94
  469. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  470. package/pages/c/_cluster/longhorn/index.vue +52 -17
  471. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  472. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  473. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  474. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +91 -0
  475. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  476. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  477. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +60 -0
  478. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  479. package/pages/c/_cluster/manager/pages/_page.vue +4 -5
  480. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  481. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  482. package/pages/c/_cluster/neuvector/index.vue +1 -0
  483. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  484. package/pages/c/_cluster/settings/banners.vue +86 -10
  485. package/pages/c/_cluster/settings/brand.vue +261 -38
  486. package/pages/c/_cluster/settings/index.vue +4 -6
  487. package/pages/c/_cluster/settings/links.vue +3 -2
  488. package/pages/c/_cluster/settings/performance.vue +71 -3
  489. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  490. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +12 -8
  491. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  492. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  493. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  494. package/pages/c/_cluster/uiplugins/InstallDialog.vue +55 -19
  495. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  496. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  497. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  498. package/pages/c/_cluster/uiplugins/index.vue +38 -54
  499. package/pages/diagnostic.vue +2 -2
  500. package/pages/fail-whale.vue +103 -42
  501. package/pages/home.vue +81 -24
  502. package/pages/prefs.vue +8 -4
  503. package/pages/support/index.vue +14 -10
  504. package/pkg/auto-import.js +1 -1
  505. package/plugins/axios.js +0 -36
  506. package/plugins/back-button.js +3 -5
  507. package/plugins/clean-html-directive.js +5 -30
  508. package/plugins/clean-html.js +53 -0
  509. package/plugins/clean-tooltip-directive.js +6 -31
  510. package/plugins/codemirror-loader.js +1 -1
  511. package/plugins/codemirror.js +41 -9
  512. package/plugins/dashboard-store/__tests__/mutations.test.ts +389 -0
  513. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  514. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  515. package/plugins/dashboard-store/actions.js +132 -25
  516. package/plugins/dashboard-store/classify.js +1 -18
  517. package/plugins/dashboard-store/getters.js +154 -44
  518. package/plugins/dashboard-store/index.js +0 -111
  519. package/plugins/dashboard-store/mutations.js +150 -52
  520. package/plugins/dashboard-store/resource-class.js +77 -127
  521. package/plugins/directives.js +6 -39
  522. package/plugins/ember-cookie.js +13 -0
  523. package/plugins/global-formatters.js +26 -5
  524. package/plugins/i18n.js +89 -55
  525. package/plugins/int-number.js +6 -20
  526. package/plugins/plugin.js +3 -3
  527. package/plugins/positive-int-number.js +6 -17
  528. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +81 -10
  529. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  530. package/plugins/steve/__tests__/resource-utils.test.ts +159 -0
  531. package/plugins/steve/__tests__/steve-class.test.ts +59 -0
  532. package/plugins/steve/__tests__/subscribe.spec.ts +4 -1
  533. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  534. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  535. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  536. package/plugins/steve/actions.js +3 -38
  537. package/plugins/steve/getters.js +164 -61
  538. package/plugins/steve/hybrid-class.js +5 -1
  539. package/plugins/steve/mutations.js +24 -3
  540. package/plugins/steve/norman-class.js +142 -2
  541. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  542. package/plugins/steve/resource-utils.ts +38 -0
  543. package/plugins/steve/schema.d.ts +22 -0
  544. package/plugins/steve/steve-class.js +22 -0
  545. package/plugins/steve/steve-pagination-utils.ts +368 -0
  546. package/plugins/steve/subscribe.js +17 -76
  547. package/plugins/trim-whitespace.js +6 -34
  548. package/plugins/vue-js-modal.js +1 -1
  549. package/promptRemove/pod.vue +15 -7
  550. package/public/index.html +1 -0
  551. package/rancher-components/Accordion/Accordion.test.ts +45 -0
  552. package/rancher-components/Accordion/Accordion.vue +86 -0
  553. package/rancher-components/Accordion/index.ts +1 -0
  554. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  555. package/rancher-components/Banner/Banner.test.ts +1 -5
  556. package/rancher-components/Banner/Banner.vue +2 -2
  557. package/rancher-components/Card/Card.vue +4 -4
  558. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  559. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  560. package/rancher-components/Form/LabeledInput/LabeledInput.vue +57 -24
  561. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  562. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  563. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  564. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  565. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  566. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  567. package/rancher-components/StringList/StringList.test.ts +270 -0
  568. package/rancher-components/StringList/StringList.vue +65 -26
  569. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +69 -0
  570. package/scripts/clean +1 -1
  571. package/scripts/extension/bundle +19 -7
  572. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  573. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  574. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  575. package/scripts/extension/helm/package/Dockerfile +1 -1
  576. package/scripts/extension/helm/scripts/package +11 -3
  577. package/scripts/extension/helm/scripts/patch +27 -0
  578. package/scripts/extension/parse-tag-name +4 -4
  579. package/scripts/extension/publish +25 -14
  580. package/scripts/publish-shell.sh +11 -1
  581. package/scripts/serve-pkgs +0 -2
  582. package/scripts/test-plugins-build.sh +87 -11
  583. package/scripts/vue-migrate.js +683 -0
  584. package/server/har-file.js +183 -0
  585. package/store/__tests__/catalog.test.ts +224 -0
  586. package/store/__tests__/type-map.test.ts +1122 -0
  587. package/store/auth.js +23 -4
  588. package/store/aws.js +53 -6
  589. package/store/catalog.js +22 -6
  590. package/store/cru-resource.ts +26 -0
  591. package/store/customisation.js +35 -0
  592. package/store/features.js +7 -4
  593. package/store/i18n.js +11 -0
  594. package/store/index.js +140 -49
  595. package/store/plugins.js +8 -4
  596. package/store/prefs.js +33 -38
  597. package/store/type-map.js +288 -213
  598. package/store/type-map.utils.ts +226 -0
  599. package/tsconfig.json +34 -9
  600. package/tsconfig.paths.json +21 -0
  601. package/types/components/labeledSelect.ts +50 -0
  602. package/types/resources/settings.d.ts +32 -0
  603. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  604. package/types/shell/index.d.ts +1045 -770
  605. package/types/store/dashboard-store.types.ts +42 -0
  606. package/types/store/pagination.types.ts +457 -0
  607. package/types/store/type-map.ts +30 -0
  608. package/types/store/vuex.d.ts +9 -0
  609. package/types/vue-shim.d.ts +51 -0
  610. package/utils/__tests__/cluster.test.ts +20 -18
  611. package/utils/__tests__/create-yaml.test.ts +359 -2
  612. package/utils/__tests__/kontainer.test.ts +180 -0
  613. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  614. package/utils/alertmanagerconfig.js +19 -0
  615. package/utils/array.ts +40 -1
  616. package/utils/async.ts +2 -0
  617. package/utils/auth.js +152 -4
  618. package/utils/axios.js +2 -21
  619. package/utils/azure.js +24 -0
  620. package/utils/banners.js +103 -0
  621. package/utils/clipboard.js +5 -0
  622. package/utils/cluster.js +1 -1
  623. package/utils/config.js +4 -0
  624. package/utils/create-yaml.js +59 -28
  625. package/utils/custom-validators.js +0 -2
  626. package/utils/error.js +41 -1
  627. package/utils/formatter.js +5 -3
  628. package/utils/git.ts +1 -1
  629. package/utils/install-redirect.js +1 -1
  630. package/utils/kontainer.ts +190 -0
  631. package/utils/object.js +24 -0
  632. package/utils/pagination-utils.ts +154 -0
  633. package/utils/pod-security-admission.ts +1 -1
  634. package/utils/router.js +86 -0
  635. package/utils/settings.ts +46 -0
  636. package/utils/time.js +2 -1
  637. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  638. package/utils/url.ts +1 -1
  639. package/utils/validators/formRules/__tests__/index.test.ts +70 -4
  640. package/utils/validators/formRules/index.ts +15 -9
  641. package/utils/validators/index.js +1 -0
  642. package/utils/validators/setting.js +6 -10
  643. package/utils/version.js +2 -1
  644. package/vue.config.js +377 -401
  645. package/.DS_Store +0 -0
  646. package/assets/images/providers/aks-black.svg +0 -28
  647. package/assets/images/providers/aks.svg +0 -31
  648. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  649. package/components/ChartPsp.vue +0 -76
  650. package/components/EventsTable.vue +0 -67
  651. package/components/TabbedLinks/index.vue +0 -94
  652. package/components/__tests__/ChartPsp.test.ts +0 -75
  653. package/components/formatter/__tests__/ClusterProvider.test.ts +0 -28
  654. package/components/nuxt/nuxt-link.server.js +0 -16
  655. package/components/nuxt/nuxt.js +0 -101
  656. package/config/router.js +0 -408
  657. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -237
  658. package/initialize/App.js +0 -198
  659. package/initialize/client.js +0 -875
  660. package/initialize/index.js +0 -364
  661. package/initialize/layouts.ts +0 -26
  662. package/middleware/i18n.js +0 -10
  663. package/middleware/unauthenticated.js +0 -22
  664. package/mixins/fetch.server.js +0 -73
  665. package/pages/c/_cluster/apps/index.vue +0 -17
  666. package/pages/c/_cluster/auth/index.vue +0 -19
  667. package/pages/c/_cluster/index.vue +0 -17
  668. package/pages/c/_cluster/legacy/index.vue +0 -22
  669. package/pages/c/_cluster/manager/index.vue +0 -22
  670. package/pages/c/_cluster/mcapps/index.vue +0 -21
  671. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  672. package/pages/c/index.vue +0 -9
  673. package/pages/rio/mesh.vue +0 -508
  674. package/plugins/dashboard-store/__tests__/mutations.spec.ts +0 -406
  675. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  676. package/plugins/portal-vue.js +0 -4
  677. package/plugins/portal.js +0 -4
  678. package/plugins/resize.js +0 -5
  679. package/plugins/shortkey.js +0 -4
  680. package/plugins/tooltip.js +0 -4
  681. package/plugins/transitions.js +0 -4
  682. package/plugins/v-select.js +0 -4
  683. package/plugins/vue-clipboard2.js +0 -4
  684. package/tsconfig.default.json +0 -46
  685. package/utils/group.js +0 -70
  686. package/utils/nuxt.js +0 -659
  687. package/utils/router.scrollBehavior.js +0 -80
  688. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  689. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  690. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  691. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  692. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  693. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  694. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  695. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  696. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
  697. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  698. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  699. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
@@ -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
  }
@@ -88,10 +91,18 @@ export default {
88
91
  default: null,
89
92
  type: [String, Object, Number, Array, Boolean]
90
93
  },
94
+ options: {
95
+ type: Array,
96
+ default: () => ([])
97
+ },
91
98
  closeOnSelect: {
92
99
  type: Boolean,
93
100
  default: true
94
101
  },
102
+ noOptionsLabelKey: {
103
+ type: String,
104
+ default: 'labelSelect.noOptions.empty'
105
+ }
95
106
  },
96
107
 
97
108
  data() {
@@ -105,6 +116,16 @@ export default {
105
116
  hasLabel() {
106
117
  return this.isCompact ? false : !!this.label || !!this.labelKey || !!this.$slots.label;
107
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
+ }
108
129
  },
109
130
 
110
131
  methods: {
@@ -149,18 +170,6 @@ export default {
149
170
  return;
150
171
  }
151
172
 
152
- // 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
153
- // 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
154
- if (typeof this.options[0] === 'object') {
155
- const newOption = this.getUpdatedOption(option);
156
-
157
- if (newOption) {
158
- const label = get(newOption, this.optionLabel);
159
-
160
- return this.localizedLabel ? this.$store.getters['i18n/t'](label) || label : label;
161
- }
162
- }
163
-
164
173
  if (this.$attrs['get-option-label']) {
165
174
  return this.$attrs['get-option-label'](option);
166
175
  }
@@ -177,14 +186,6 @@ export default {
177
186
  }
178
187
  },
179
188
 
180
- // If the option's label changed in parent but value did not, the label wont be automatically updated here
181
- // Ensure that the label being shown is still present in the options prop and find the new one if not
182
- getUpdatedOption(option) {
183
- const isOutdated = this.options && !this.options.find((opt) => option[this.optionLabel] === opt[this.optionLabel]);
184
-
185
- return isOutdated ? this.options.find((opt) => isEqual(this.reduce(option), this.reduce(opt))) : undefined;
186
- },
187
-
188
189
  positionDropdown(dropdownList, component, { width }) {
189
190
  calculatePosition(dropdownList, component, width, this.placement);
190
191
  },
@@ -215,8 +216,12 @@ export default {
215
216
  },
216
217
 
217
218
  onSearch(newSearchString) {
218
- if (newSearchString) {
219
- 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
+ }
220
225
  }
221
226
  },
222
227
 
@@ -272,16 +277,17 @@ export default {
272
277
  class="inline"
273
278
  :append-to-body="appendToBody"
274
279
  :calculate-position="positionDropdown"
275
- :class="{ 'no-label': !(label || '').length }"
280
+ :class="{ 'no-label': !(label || '').length}"
276
281
  :clearable="clearable"
277
282
  :disabled="isView || disabled || loading"
278
283
  :get-option-key="getOptionKey"
279
284
  :get-option-label="(opt) => getOptionLabel(opt)"
280
285
  :label="optionLabel"
281
- :options="options"
286
+ :options="_options"
282
287
  :map-keydown="mappedKeys"
283
288
  :placeholder="placeholder"
284
289
  :reduce="(x) => reduce(x)"
290
+ :filterable="isFilterable"
285
291
  :searchable="isSearchable"
286
292
  :selectable="selectable"
287
293
  :value="value != null && !loading ? value : ''"
@@ -297,6 +303,11 @@ export default {
297
303
  <template #option="option">
298
304
  <template v-if="option.kind === 'group'">
299
305
  <div class="vs__option-kind-group">
306
+ <i
307
+ v-if="option.icon"
308
+ class="icon"
309
+ :class="{ [option.icon]: true}"
310
+ />
300
311
  <b>{{ getOptionLabel(option) }}</b>
301
312
  <div v-if="option.badge">
302
313
  {{ option.badge }}
@@ -313,6 +324,8 @@ export default {
313
324
  </template>
314
325
  <div
315
326
  v-else
327
+ class="vs__option-kind"
328
+ :class="{ 'has-icon' : hasGroupIcon}"
316
329
  @mousedown="(e) => onClickOption(option, e)"
317
330
  >
318
331
  {{ getOptionLabel(option) }}
@@ -333,6 +346,45 @@ export default {
333
346
  v-bind="scope"
334
347
  />
335
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>
336
388
  </v-select>
337
389
  <i
338
390
  v-if="loading"
@@ -510,21 +562,73 @@ export default {
510
562
  }
511
563
  }
512
564
 
513
- // Styling for option group badge
514
- .vs__dropdown-menu .vs__dropdown-option .vs__option-kind-group {
515
- display: flex;
516
- > b {
517
- 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
+ }
518
626
  }
519
- > div {
520
- background-color: var(--primary);
521
- border-radius: 4px;
522
- color: var(--primary-text);
523
- font-size: 12px;
524
- height: 18px;
525
- line-height: 18px;
526
- margin-top: 1px;
527
- padding: 0 10px;
627
+
628
+ .no-options-slot .paginating {
629
+ display: flex;
630
+ align-items: center;
631
+ justify-content: center;
528
632
  }
529
633
  }
530
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>
@@ -2,6 +2,7 @@
2
2
  import { mapGetters } from 'vuex';
3
3
  import { LabeledInput } from '@components/Form/LabeledInput';
4
4
  import { CHARSET, randomStr } from '@shell/utils/string';
5
+ import { copyTextToClipboard } from '@shell/utils/clipboard';
5
6
 
6
7
  export default {
7
8
  components: { LabeledInput },
@@ -75,6 +76,7 @@ export default {
75
76
  }
76
77
  },
77
78
  methods: {
79
+ copyTextToClipboard,
78
80
  generatePassword() {
79
81
  this.password = randomStr(16, CHARSET.ALPHA_NUM);
80
82
  },
@@ -109,7 +111,7 @@ export default {
109
111
  >
110
112
  <a
111
113
  href="#"
112
- @click.prevent.stop="$copyText(password)"
114
+ @click.prevent.stop="copyTextToClipboard(password)"
113
115
  >{{ t('action.copy') }}</a>
114
116
  </div>
115
117
  <div
@@ -0,0 +1,187 @@
1
+ <script lang="ts">
2
+ import { PropType, defineComponent } from 'vue';
3
+ import LabeledSelect from '@shell/components/form/LabeledSelect.vue';
4
+ import { PaginationParamFilter } from '@shell/types/store/pagination.types';
5
+ import { labelSelectPaginationFunction, LabelSelectPaginationFunctionOptions } from '@shell/components/form/labeled-select-utils/labeled-select.utils';
6
+ import { LabelSelectPaginateFn, LabelSelectPaginateFnOptions, LabelSelectPaginateFnResponse } from '@shell/types/components/labeledSelect';
7
+
8
+ type PaginateTypeOverridesFn = (opts: LabelSelectPaginationFunctionOptions) => LabelSelectPaginationFunctionOptions;
9
+
10
+ interface SharedSettings {
11
+ /**
12
+ * Provide specific LabelSelect options for this mode (paginated / not paginated)
13
+ */
14
+ labelSelectOptions?: { [key: string]: any },
15
+ /**
16
+ * Map the resources shown in LabelSelect
17
+ */
18
+ mapResult?: (resources: any[]) => any[]
19
+ }
20
+
21
+ /**
22
+ * Settings to use when the LabelSelect is paginating
23
+ */
24
+ export interface ResourceLabeledSelectPaginateSettings extends SharedSettings {
25
+ /**
26
+ * Override the convience function which fetches a page of results
27
+ */
28
+ overrideRequest?: LabelSelectPaginateFn,
29
+ /**
30
+ * Override the default settings used in the convience function to fetch a page of results
31
+ */
32
+ requestSettings?: PaginateTypeOverridesFn,
33
+ }
34
+
35
+ /**
36
+ * Settings to use when the LabelSelect is fetching all resources (not paginating)
37
+ */
38
+ export type ResourceLabeledSelectSettings = SharedSettings
39
+
40
+ /**
41
+ * Force a specific mode
42
+ */
43
+ export enum RESOURCE_LABEL_SELECT_MODE {
44
+ /**
45
+ * Fetch all resources
46
+ */
47
+ ALL_RESOURCES = 'ALL', // eslint-disable-line no-unused-vars
48
+ /**
49
+ * Determine if all resources are fetched given system settings
50
+ */
51
+ DYNAMIC = 'DYNAMIC', // eslint-disable-line no-unused-vars
52
+ }
53
+
54
+ /**
55
+ * Convience wrapper around the LabelSelect component to support pagination
56
+ *
57
+ * Handles
58
+ *
59
+ * 1) Conditionally enabling the pagination feature given system settings
60
+ * 2) Helper function to fetch the pagination result
61
+ *
62
+ * A number of ways can be provided to override the convienences (see props)
63
+ */
64
+ export default defineComponent({
65
+ name: 'ResourceLabeledSelect',
66
+
67
+ components: { LabeledSelect },
68
+
69
+ props: {
70
+ /**
71
+ * Resource to show
72
+ */
73
+ resourceType: {
74
+ type: String,
75
+ required: true
76
+ },
77
+
78
+ inStore: {
79
+ type: String,
80
+ default: 'cluster',
81
+ },
82
+
83
+ /**
84
+ * Determine if pagination is used via settings (DYNAMIC) or hardcode off
85
+ */
86
+ paginateMode: {
87
+ type: String as PropType<RESOURCE_LABEL_SELECT_MODE>,
88
+ default: RESOURCE_LABEL_SELECT_MODE.DYNAMIC,
89
+ },
90
+
91
+ /**
92
+ * Specific settings to use when we're showing all results
93
+ */
94
+ allResourcesSettings: {
95
+ type: Object as PropType<ResourceLabeledSelectSettings>,
96
+ default: null,
97
+ },
98
+
99
+ /**
100
+ * Specific settings to use when we're showing paginated results
101
+ */
102
+ paginatedResourceSettings: {
103
+ type: Object as PropType<ResourceLabeledSelectPaginateSettings>,
104
+ default: null,
105
+ },
106
+ },
107
+
108
+ data() {
109
+ return { paginate: false };
110
+ },
111
+
112
+ async fetch() {
113
+ switch (this.paginateMode) {
114
+ case RESOURCE_LABEL_SELECT_MODE.ALL_RESOURCES:
115
+ this.paginate = false;
116
+ break;
117
+ case RESOURCE_LABEL_SELECT_MODE.DYNAMIC:
118
+ this.paginate = this.$store.getters[`${ this.inStore }/paginationEnabled`](this.resourceType);
119
+ break;
120
+ }
121
+
122
+ if (!this.paginate) {
123
+ await this.$store.dispatch(`${ this.inStore }/findAll`, { type: this.resourceType });
124
+ }
125
+ },
126
+
127
+ computed: {
128
+ labelSelectAttributes() {
129
+ return this.paginate ? {
130
+ ...this.$attrs,
131
+ ...this.paginatedResourceSettings?.labelSelectOptions || {}
132
+ } : {
133
+ ...this.$attrs,
134
+ ...this.allResourcesSettings?.labelSelectOptions || {}
135
+ };
136
+ },
137
+
138
+ allOfType() {
139
+ if (this.$fetchState.pending || this.paginate) {
140
+ return [];
141
+ }
142
+
143
+ const all = this.$store.getters[`${ this.inStore }/all`](this.resourceType);
144
+
145
+ return this.allResourcesSettings?.mapResult ? this.allResourcesSettings.mapResult(all) : all;
146
+ }
147
+ },
148
+
149
+ methods: {
150
+ /**
151
+ * Typeof LabelSelectPaginateFn
152
+ */
153
+ async paginateType(opts: LabelSelectPaginateFnOptions): Promise<LabelSelectPaginateFnResponse> {
154
+ if (this.paginatedResourceSettings?.overrideRequest) {
155
+ return await this.paginatedResourceSettings.overrideRequest(opts);
156
+ }
157
+
158
+ const { filter } = opts;
159
+ const filters = !!filter ? [PaginationParamFilter.createSingleField({ field: 'metadata.name', value: filter })] : [];
160
+ const defaultOptions: LabelSelectPaginationFunctionOptions = {
161
+ opts,
162
+ filters,
163
+ type: this.resourceType,
164
+ ctx: { getters: this.$store.getters, dispatch: this.$store.dispatch },
165
+ sort: [{ asc: true, field: 'metadata.name' }],
166
+ };
167
+ const options = this.paginatedResourceSettings?.requestSettings ? this.paginatedResourceSettings.requestSettings(defaultOptions) : defaultOptions;
168
+ const res = await labelSelectPaginationFunction(options);
169
+
170
+ return this.paginatedResourceSettings?.mapResult ? {
171
+ ...res,
172
+ page: this.paginatedResourceSettings.mapResult(res.page)
173
+ } : res;
174
+ },
175
+ },
176
+ });
177
+ </script>
178
+
179
+ <template>
180
+ <LabeledSelect
181
+ v-bind="labelSelectAttributes"
182
+ :loading="$fetchState.pending"
183
+ :options="allOfType"
184
+ :paginate="paginateType"
185
+ v-on="$listeners"
186
+ />
187
+ </template>
@@ -73,11 +73,13 @@ export default {
73
73
  const inStore = this.$store.getters['currentStore'](EVENT);
74
74
 
75
75
  return {
76
- hasEvents: this.$store.getters[`${ inStore }/schemaFor`](EVENT), // @TODO be smarter about which resources actually ever have events
77
- allEvents: [],
78
- selectedTab: this.defaultTab,
79
- didLoadEvents: false,
80
- extensionTabs: getApplicableExtensionEnhancements(this, ExtensionPoint.TAB, TabLocation.RESOURCE_DETAIL, this.$route, this, this.extensionParams),
76
+ hasEvents: this.$store.getters[`${ inStore }/schemaFor`](EVENT), // @TODO be smarter about which resources actually ever have events
77
+ allEvents: [],
78
+ selectedTab: this.defaultTab,
79
+ didLoadEvents: false,
80
+ extensionTabs: getApplicableExtensionEnhancements(this, ExtensionPoint.TAB, TabLocation.RESOURCE_DETAIL, this.$route, this, this.extensionParams),
81
+ inStore,
82
+ showConditions: false,
81
83
  };
82
84
  },
83
85
 
@@ -85,16 +87,13 @@ export default {
85
87
  this.$store.dispatch('cluster/forgetType', EVENT);
86
88
  },
87
89
 
88
- computed: {
89
- showConditions() {
90
- const inStore = this.$store.getters['currentStore'](this.value.type);
91
-
92
- if ( this.$store.getters[`${ inStore }/schemaFor`](this.value.type) ) {
93
- return this.isView && this.needConditions && this.value?.type && this.$store.getters[`${ inStore }/pathExistsInSchema`](this.value.type, 'status.conditions');
94
- }
90
+ fetch() {
91
+ // By this stage the `value` should be set. Taking a chance that this is true
92
+ // The alternative is have an expensive watch on the `value` and trigger there (as well)
93
+ this.setShowConditions();
94
+ },
95
95
 
96
- return false;
97
- },
96
+ computed: {
98
97
  showEvents() {
99
98
  return this.isView && this.needEvents && this.hasEvents;
100
99
  },
@@ -166,7 +165,24 @@ export default {
166
165
  this.didLoadEvents = true;
167
166
  });
168
167
  }
169
- }
168
+ },
169
+
170
+ /**
171
+ * Conditions come from a resource's `status`. They are used by both core resources like workloads as well as those from CRDs
172
+ * - Workloads
173
+ * - Nodes
174
+ * - Fleet git repo
175
+ * - Cluster (provisioning)
176
+ *
177
+ * Check here if the resource type contains conditions via the schema resourceFields
178
+ */
179
+ async setShowConditions() {
180
+ if (this.isView && this.needConditions && !!this.value?.type && !!this.schema?.fetchResourceFields) {
181
+ await this.schema.fetchResourceFields();
182
+
183
+ this.showConditions = this.$store.getters[`${ this.inStore }/pathExistsInSchema`](this.value.type, 'status.conditions');
184
+ }
185
+ },
170
186
  }
171
187
  };
172
188
  </script>