@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
@@ -22,7 +22,8 @@ import Socket, {
22
22
  EVENT_DISCONNECT_ERROR,
23
23
  NO_WATCH,
24
24
  NO_SCHEMA,
25
- REVISION_TOO_OLD
25
+ REVISION_TOO_OLD,
26
+ NO_PERMS
26
27
  } from '@shell/utils/socket';
27
28
  import { normalizeType } from '@shell/plugins/dashboard-store/normalize';
28
29
  import day from 'dayjs';
@@ -31,8 +32,9 @@ import { escapeHtml } from '@shell/utils/string';
31
32
  import { keyForSubscribe } from '@shell/plugins/steve/resourceWatcher';
32
33
  import { waitFor } from '@shell/utils/async';
33
34
  import { WORKER_MODES } from './worker';
34
- import pAndNFiltering from '@shell/utils/projectAndNamespaceFiltering.utils';
35
+ import acceptOrRejectSocketMessage from './accept-or-reject-socket-message';
35
36
  import { BLANK_CLUSTER, STORE } from '@shell/store/store-types.js';
37
+ import paginationUtils from '@shell/utils/pagination-utils';
36
38
 
37
39
  // minimum length of time a disconnect notification is shown
38
40
  const MINIMUM_TIME_NOTIFIED = 3000;
@@ -130,7 +132,7 @@ export async function createWorker(store, ctx) {
130
132
  }
131
133
  },
132
134
  batchChanges: (batch) => {
133
- dispatch('batchChanges', namespaceHandler.validateBatchChange(ctx, batch));
135
+ dispatch('batchChanges', acceptOrRejectSocketMessage.validateBatchChange(ctx, batch));
134
136
  },
135
137
  dispatch: (msg) => {
136
138
  dispatch(`ws.${ msg.name }`, msg);
@@ -204,66 +206,6 @@ export function equivalentWatch(a, b) {
204
206
  return true;
205
207
  }
206
208
 
207
- /**
208
- * Sockets will not be able to subscribe to more than one namespace. If this is requested we pretend to handle it
209
- * - Changes to all resources are monitored (no namespace provided in sub)
210
- * - We ignore any events not from a required namespace (we have the conversion of project --> namespaces already)
211
- */
212
- const namespaceHandler = {
213
- /**
214
- * Note - namespace can be a list of projects or namespaces
215
- */
216
- subscribeNamespace: (namespace) => {
217
- if (pAndNFiltering.isApplicable({ namespaced: namespace }) && namespace.length) {
218
- return undefined; // AKA sub to everything
219
- }
220
-
221
- return namespace;
222
- },
223
-
224
- validChange: ({ getters, rootGetters }, type, data) => {
225
- const haveNamespace = getters.haveNamespace(type);
226
-
227
- if (haveNamespace?.length) {
228
- const namespaces = rootGetters.activeNamespaceCache;
229
-
230
- if (!namespaces[data.metadata.namespace]) {
231
- return false;
232
- }
233
- }
234
-
235
- return true;
236
- },
237
-
238
- validateBatchChange: ({ getters, rootGetters }, batch) => {
239
- const namespaces = rootGetters.activeNamespaceCache;
240
-
241
- Object.entries(batch).forEach(([type, entries]) => {
242
- const haveNamespace = getters.haveNamespace(type);
243
-
244
- if (!haveNamespace?.length) {
245
- return;
246
- }
247
-
248
- const schema = getters.schemaFor(type);
249
-
250
- if (!schema?.attributes?.namespaced) {
251
- return;
252
- }
253
-
254
- Object.keys(entries).forEach((id) => {
255
- const namespace = id.split('/')[0];
256
-
257
- if (!namespace || !namespaces[namespace]) {
258
- delete entries[id];
259
- }
260
- });
261
- });
262
-
263
- return batch;
264
- }
265
- };
266
-
267
209
  function queueChange({ getters, state, rootGetters }, { data, revision }, load, label) {
268
210
  const type = getters.normalizeType(data.type);
269
211
 
@@ -277,7 +219,7 @@ function queueChange({ getters, state, rootGetters }, { data, revision }, load,
277
219
 
278
220
  // console.log(`${ label } Event [${ state.config.namespace }]`, data.type, data.id); // eslint-disable-line no-console
279
221
 
280
- if (!namespaceHandler.validChange({ getters, rootGetters }, type, data)) {
222
+ if (!acceptOrRejectSocketMessage.validChange({ getters, rootGetters }, type, data)) {
281
223
  return;
282
224
  }
283
225
 
@@ -421,7 +363,7 @@ const sharedActions = {
421
363
  type, selector, id, revision, namespace, stop, force
422
364
  } = params;
423
365
 
424
- namespace = namespaceHandler.subscribeNamespace(namespace);
366
+ namespace = acceptOrRejectSocketMessage.subscribeNamespace(namespace);
425
367
  type = getters.normalizeType(type);
426
368
 
427
369
  if (rootGetters['type-map/isSpoofed'](type)) {
@@ -430,6 +372,14 @@ const sharedActions = {
430
372
  return;
431
373
  }
432
374
 
375
+ const schema = getters.schemaFor(type, false, false);
376
+
377
+ if (!!schema?.attributes?.verbs?.includes && !schema.attributes.verbs.includes('watch')) {
378
+ state.debugSocket && console.info('Will not Watch (type does not have watch verb)', JSON.stringify(params)); // eslint-disable-line no-console
379
+
380
+ return;
381
+ }
382
+
433
383
  // If socket is in error don't try to watch.... unless we `force` it
434
384
  const inError = getters.inError(params);
435
385
 
@@ -453,7 +403,13 @@ const sharedActions = {
453
403
  return;
454
404
  }
455
405
 
456
- if ( typeof revision === 'undefined' ) {
406
+ // isSteveCacheEnabled check is temporary and will be removed once Part 3 of https://github.com/rancher/dashboard/pull/10349 is resolved by backend
407
+ // Steve cache backed api does not return a revision, so `revision` here is always undefined
408
+ // Which means we find a revision within a resource itself and use it in the watch
409
+ // That revision is probably too old and results in a watch error
410
+ // Watch errors mean we make a http request to get latest revision (which is still missing) and try to re-watch with it...
411
+ // etc
412
+ if (typeof revision === 'undefined' && !paginationUtils.isSteveCacheEnabled({ rootGetters })) {
457
413
  revision = getters.nextResourceVersion(type, id);
458
414
  }
459
415
 
@@ -500,7 +456,7 @@ const sharedActions = {
500
456
  const { commit, getters, dispatch } = ctx;
501
457
 
502
458
  if (getters['schemaFor'](type)) {
503
- namespace = namespaceHandler.subscribeNamespace(namespace);
459
+ namespace = acceptOrRejectSocketMessage.subscribeNamespace(namespace);
504
460
 
505
461
  const obj = {
506
462
  type,
@@ -635,13 +591,17 @@ const defaultActions = {
635
591
  await dispatch('find', {
636
592
  type: resourceType,
637
593
  id,
638
- opt,
594
+ opt: {
595
+ ...opt,
596
+ // Pass the namespace so `find` can construct the url correctly
597
+ namespaced: namespace,
598
+ // Ensure that find calls watch with no revision (otherwise it'll use the revision from the resource which is probably stale)
599
+ revision: null
600
+ },
639
601
  });
640
- commit('clearInError', params);
641
602
 
642
603
  return;
643
604
  }
644
-
645
605
  let have, want;
646
606
 
647
607
  if ( selector ) {
@@ -844,15 +804,17 @@ const defaultActions = {
844
804
  const err = msg.data?.error?.toLowerCase();
845
805
 
846
806
  if ( err.includes('watch not allowed') ) {
847
- commit('setInError', { type: msg.resourceType, reason: NO_WATCH });
807
+ commit('setInError', { msg, reason: NO_WATCH });
848
808
  } else if ( err.includes('failed to find schema') ) {
849
- commit('setInError', { type: msg.resourceType, reason: NO_SCHEMA });
809
+ commit('setInError', { msg, reason: NO_SCHEMA });
850
810
  } else if ( err.includes('too old') ) {
851
811
  // Set an error for (all) subs of this type. This..
852
812
  // 1) blocks attempts by resource.stop to resub (as type is in error)
853
813
  // 2) will be cleared when resyncWatch --> watch (with force) --> resource.start completes
854
- commit('setInError', { type: msg.resourceType, reason: REVISION_TOO_OLD });
814
+ commit('setInError', { msg, reason: REVISION_TOO_OLD });
855
815
  dispatch('resyncWatch', msg);
816
+ } else if ( err.includes('the server does not allow this method on the requested resource')) {
817
+ commit('setInError', { msg, reason: NO_PERMS });
856
818
  }
857
819
  },
858
820
 
@@ -1023,10 +985,10 @@ const defaultMutations = {
1023
985
  }
1024
986
  },
1025
987
 
1026
- setInError(state, msg) {
988
+ setInError(state, { msg, reason }) {
1027
989
  const key = keyForSubscribe(msg);
1028
990
 
1029
- state.inError[key] = msg.reason;
991
+ state.inError[key] = reason;
1030
992
  },
1031
993
 
1032
994
  clearInError(state, msg) {
@@ -1,37 +1,9 @@
1
1
  import Vue from 'vue';
2
+ import trimWhitespaceDirective from '@shell/directives/trim-whitespace';
2
3
 
3
- export function trimWhitespace(el, dir) {
4
- for (const node of el.childNodes) {
5
- if (node.nodeType === Node.TEXT_NODE ) {
6
- const trimmed = node.data.trim();
4
+ export default trimWhitespaceDirective;
5
+ /* eslint-disable-next-line no-console */
6
+ console.warn(`Importing trimWhitespaceDirective from plugins has been deprecated, use shell/directives/trim-whitespace.js instead.
7
+ Make sure to invoke it using Vue.directive('trim-whitespace', trimWhitespaceDirective ) to maintain compatibility.`);
7
8
 
8
- if ( trimmed === '') {
9
- node.remove();
10
- } else if ( trimmed !== node.data ) {
11
- node.data = trimmed;
12
- }
13
- }
14
- }
15
- }
16
-
17
- export function trimWhitespaceSsr(el, dir) {
18
- // This causes server<->client dom mismatches sometimes... gave up for now.
19
- /*
20
- for ( const node of (el.children || []) ) {
21
- if ( node.text ) {
22
- const trimmed = node.text.trim();
23
-
24
- if ( trimmed !== node.text ) {
25
- node.text = trimmed;
26
- }
27
- } else if ( node.children ) {
28
- trimWhitespaceSsr(node);
29
- }
30
- }
31
- */
32
- }
33
-
34
- Vue.directive('trim-whitespace', {
35
- inserted: trimWhitespace,
36
- componentUpdated: trimWhitespace
37
- });
9
+ Vue.directive('trim-whitespace', trimWhitespaceDirective );
@@ -1,4 +1,4 @@
1
1
  import Vue from 'vue';
2
- import VModal from 'vue-js-modal/dist/ssr.index';
2
+ import VModal from 'vue-js-modal';
3
3
 
4
4
  Vue.use(VModal);
package/public/index.html CHANGED
@@ -67,6 +67,7 @@
67
67
  <i class="initial-load-spinner"></i>
68
68
  </div>
69
69
  </div>
70
+ <div id="modals"><!--Portal content here--></div>
70
71
  </body>
71
72
 
72
73
  </html>
@@ -1,7 +1,8 @@
1
1
  <script lang="ts">
2
- import Vue from 'vue';
2
+ import { defineComponent } from 'vue';
3
3
  import { mapGetters } from 'vuex';
4
- export default Vue.extend({
4
+
5
+ export default defineComponent({
5
6
  props: {
6
7
  title: {
7
8
  type: String,
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import Vue, { PropType } from 'vue';
2
+ import { PropType, defineComponent } from 'vue';
3
3
 
4
4
  interface Badge {
5
5
  stateBackground: string;
@@ -11,7 +11,7 @@ interface Badge {
11
11
  * <p>Represents a badge whose label and color is either taken from the value property or
12
12
  * from the label and color properties. The state property takes precedence.</p>
13
13
  */
14
- export default Vue.extend({
14
+ export default defineComponent({
15
15
  props: {
16
16
  /**
17
17
  * A value having the properties `stateBackground` and `stateDisplay`
@@ -59,7 +59,7 @@ export default Vue.extend({
59
59
  </script>
60
60
 
61
61
  <template>
62
- <span :class="{'badge-state': true, [bg]: true}">
62
+ <span :class="['badge-state', bg]">
63
63
  <i
64
64
  v-if="icon"
65
65
  class="icon"
@@ -1,16 +1,12 @@
1
1
  import { mount } from '@vue/test-utils';
2
2
  import { Banner } from './index';
3
- import { cleanHtmlDirective } from '@shell/plugins/clean-html-directive';
4
3
 
5
4
  describe('component: Banner', () => {
6
5
  it('should display text based on label', () => {
7
6
  const label = 'test';
8
7
  const wrapper = mount(
9
8
  Banner,
10
- {
11
- directives: { cleanHtmlDirective },
12
- propsData: { label }
13
- });
9
+ { propsData: { label } });
14
10
 
15
11
  const element = wrapper.find('span').element;
16
12
 
@@ -1,9 +1,9 @@
1
1
  <script lang="ts">
2
- import Vue from 'vue';
2
+ import { defineComponent } from 'vue';
3
3
  import { nlToBr } from '@shell/utils/string';
4
4
  import { stringify } from '@shell/utils/error';
5
5
 
6
- export default Vue.extend({
6
+ export default defineComponent({
7
7
  props: {
8
8
  /**
9
9
  * A color class that represents the color of the banner.
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
- import Vue from 'vue';
2
+ import { defineComponent, PropType } from 'vue';
3
3
 
4
- export default Vue.extend({
4
+ export default defineComponent({
5
5
  name: 'Card',
6
6
  props: {
7
7
  /**
@@ -22,7 +22,7 @@ export default Vue.extend({
22
22
  * The function to invoke when the default action button is clicked.
23
23
  */
24
24
  buttonAction: {
25
- type: Function,
25
+ type: Function as PropType<(event: MouseEvent) => void>,
26
26
  default: (): void => { }
27
27
  },
28
28
  /**
@@ -151,7 +151,7 @@ export default Vue.extend({
151
151
 
152
152
  .card-body {
153
153
  justify-content: flex-start;
154
- overflow: scroll;
154
+ overflow: auto;
155
155
  }
156
156
 
157
157
  > * {
@@ -1,10 +1,10 @@
1
1
  <script lang="ts">
2
- import Vue, { PropType } from 'vue';
2
+ import { PropType, defineComponent } from 'vue';
3
3
  import { _EDIT, _VIEW } from '@shell/config/query-params';
4
4
  import { addObject, removeObject } from '@shell/utils/array';
5
5
  import cloneDeep from 'lodash/cloneDeep';
6
6
 
7
- export default Vue.extend({
7
+ export default defineComponent({
8
8
  name: 'Checkbox',
9
9
 
10
10
  props: {
@@ -140,7 +140,7 @@ export default Vue.extend({
140
140
  /**
141
141
  * Toggles the checked state for the checkbox and emits an 'input' event.
142
142
  */
143
- clicked(event: MouseEvent): boolean | void {
143
+ clicked(event: MouseEvent | KeyboardEvent): boolean | void {
144
144
  if ((event.target as HTMLLinkElement).tagName === 'A' && (event.target as HTMLLinkElement).href) {
145
145
  // Ignore links inside the checkbox label so you can click them
146
146
  return true;
@@ -325,6 +325,7 @@ $fontColor: var(--input-label);
325
325
  border-radius: var(--border-radius);
326
326
  transition: all 0.3s ease-out;
327
327
  border: 1px solid var(--border);
328
+ flex-shrink: 0;
328
329
  }
329
330
 
330
331
  input {
@@ -5,7 +5,7 @@ describe('component: LabeledInput', () => {
5
5
  it('should emit input only once', () => {
6
6
  const value = '2';
7
7
  const delay = 1;
8
- const wrapper = mount(LabeledInput as any, {
8
+ const wrapper = mount(LabeledInput, {
9
9
  propsData: { delay },
10
10
  mocks: { $store: { getters: { 'i18n/t': jest.fn() } } }
11
11
  });
@@ -1,21 +1,27 @@
1
1
  <script lang="ts">
2
- import Vue, { VueConstructor } from 'vue';
3
- import CompactInput from '@shell/mixins/compact-input';
4
- import LabeledFormElement from '@shell/mixins/labeled-form-element';
2
+ import { defineComponent } from 'vue';
5
3
  import TextAreaAutoGrow from '@components/Form/TextArea/TextAreaAutoGrow.vue';
6
4
  import LabeledTooltip from '@components/LabeledTooltip/LabeledTooltip.vue';
7
5
  import { escapeHtml } from '@shell/utils/string';
8
6
  import cronstrue from 'cronstrue';
9
7
  import { isValidCron } from 'cron-validator';
10
8
  import { debounce } from 'lodash';
9
+ import { useLabeledFormElement, labeledFormElementProps } from '@shell/composables/useLabeledFormElement';
10
+ import { useCompactInput } from '@shell/composables/useCompactInput';
11
11
 
12
- export default (
13
- Vue as VueConstructor<Vue & InstanceType<typeof LabeledFormElement> & InstanceType<typeof CompactInput>>
14
- ).extend({
12
+ declare module 'vue/types/vue' {
13
+ interface Vue {
14
+ onInput: (event: Event) => void | ((event: Event) => void);
15
+ }
16
+ }
17
+
18
+ export default defineComponent({
15
19
  components: { LabeledTooltip, TextAreaAutoGrow },
16
- mixins: [LabeledFormElement, CompactInput],
20
+
21
+ inheritAttrs: false,
17
22
 
18
23
  props: {
24
+ ...labeledFormElementProps,
19
25
  /**
20
26
  * The type of the Labeled Input.
21
27
  * @values text, cron, multiline, multiline-password
@@ -93,21 +99,36 @@ export default (
93
99
  },
94
100
  },
95
101
 
102
+ setup(props, { emit }) {
103
+ const {
104
+ focused,
105
+ onFocusLabeled,
106
+ onBlurLabeled,
107
+ isDisabled,
108
+ validationMessage,
109
+ requiredField
110
+ } = useLabeledFormElement(props, emit);
111
+ const { isCompact } = useCompactInput(props);
112
+
113
+ return {
114
+ focused,
115
+ onFocusLabeled,
116
+ onBlurLabeled,
117
+ isDisabled,
118
+ validationMessage,
119
+ requiredField,
120
+ isCompact,
121
+ };
122
+ },
123
+
96
124
  data() {
97
125
  return {
98
126
  updated: false,
99
- validationErrors: ''
127
+ validationErrors: '',
100
128
  };
101
129
  },
102
130
 
103
131
  computed: {
104
- /**
105
- * Determines if the Labeled Input @input event should be debounced.
106
- */
107
- onInput(): ((value: string) => void) | void {
108
- return this.delay ? debounce(this.delayInput, this.delay) : this.delayInput;
109
- },
110
-
111
132
  /**
112
133
  * Determines if the Labeled Input should display a label.
113
134
  */
@@ -122,7 +143,7 @@ export default (
122
143
  return !!this.tooltip || !!this.tooltipKey;
123
144
  },
124
145
 
125
- tooltipValue(): string | undefined {
146
+ tooltipValue(): string | Record<string, unknown> | undefined {
126
147
  if (this.hasTooltip) {
127
148
  return this.tooltipKey ? this.t(this.tooltipKey) : this.tooltip;
128
149
  }
@@ -144,7 +165,7 @@ export default (
144
165
  if (this.type !== 'cron' || !this.value) {
145
166
  return;
146
167
  }
147
- if (!isValidCron(this.value)) {
168
+ if (typeof this.value === 'string' && !isValidCron(this.value)) {
148
169
  return this.t('generic.invalidCron');
149
170
  }
150
171
  try {
@@ -173,15 +194,22 @@ export default (
173
194
  /**
174
195
  * The max length for the Labeled Input.
175
196
  */
176
- _maxlength(): number | null {
197
+ _maxlength(): number | undefined {
177
198
  if (this.type === 'text' && this.maxlength) {
178
199
  return this.maxlength;
179
200
  }
180
201
 
181
- return null;
202
+ return undefined;
182
203
  },
183
204
  },
184
205
 
206
+ created() {
207
+ /**
208
+ * Determines if the Labeled Input @input event should be debounced.
209
+ */
210
+ this.onInput = this.delay ? debounce(this.delayInput, this.delay) : this.delayInput;
211
+ },
212
+
185
213
  methods: {
186
214
  /**
187
215
  * Attempts to give the Labeled Input focus.
@@ -220,7 +248,9 @@ export default (
220
248
  * NOTE: In multiline, TextAreaAutoGrow emits a string with the value
221
249
  * https://github.com/rancher/dashboard/issues/10249
222
250
  */
223
- delayInput(value: string): void {
251
+ delayInput(val: string | Event): void {
252
+ const value = typeof val === 'string' ? val : (val?.target as HTMLInputElement)?.value;
253
+
224
254
  this.$emit('input', value);
225
255
  },
226
256
 
@@ -237,7 +267,7 @@ export default (
237
267
  * event.
238
268
  * @see labeled-form-element.ts mixin for onBlurLabeled()
239
269
  */
240
- onBlur(event: string): void {
270
+ onBlur(event: string | FocusEvent): void {
241
271
  this.$emit('blur', event);
242
272
  this.onBlurLabeled();
243
273
  },
@@ -289,7 +319,7 @@ export default (
289
319
  :placeholder="_placeholder"
290
320
  autocapitalize="off"
291
321
  :class="{ conceal: type === 'multiline-password' }"
292
- @input="onInput($event)"
322
+ @input="onInput"
293
323
  @focus="onFocus"
294
324
  @blur="onBlur"
295
325
  />
@@ -306,7 +336,7 @@ export default (
306
336
  autocomplete="off"
307
337
  autocapitalize="off"
308
338
  :data-lpignore="ignorePasswordManagers"
309
- @input="onInput($event.target.value)"
339
+ @input="onInput"
310
340
  @focus="onFocus"
311
341
  @blur="onBlur"
312
342
  @change="onChange"
@@ -325,14 +355,20 @@ export default (
325
355
  :hover="hoverTooltip"
326
356
  :value="validationMessage"
327
357
  />
328
- <label
329
- v-if="cronHint"
330
- class="cron-label"
331
- >{{ cronHint }}</label>
332
- <label
333
- v-if="subLabel"
358
+ <div
359
+ v-if="cronHint || subLabel"
334
360
  class="sub-label"
335
- >{{ subLabel }}</label>
361
+ >
362
+ <div
363
+ v-if="cronHint"
364
+ >
365
+ {{ cronHint }}
366
+ </div>
367
+ <div
368
+ v-if="subLabel"
369
+ v-clean-html="subLabel"
370
+ />
371
+ </div>
336
372
  </div>
337
373
  </template>
338
374
  <style scoped lang="scss">
@@ -1,6 +1,5 @@
1
1
  import { shallowMount } from '@vue/test-utils';
2
2
  import { RadioButton } from './index';
3
- import { cleanHtmlDirective } from '@shell/plugins/clean-html-directive';
4
3
 
5
4
  describe('radioButton.vue', () => {
6
5
  it('renders label slot contents', () => {
@@ -13,8 +12,7 @@ describe('radioButton.vue', () => {
13
12
  const wrapper = shallowMount(
14
13
  RadioButton,
15
14
  {
16
- directives: { cleanHtmlDirective },
17
- propsData: {
15
+ propsData: {
18
16
  label: 'Test Label', val: {}, value: {}
19
17
  }
20
18
  });
@@ -1,8 +1,9 @@
1
1
  <script lang="ts">
2
- import Vue from 'vue';
2
+ import { defineComponent } from 'vue';
3
3
  import { _VIEW } from '@shell/config/query-params';
4
+ import { randomStr } from '@shell/utils/string';
4
5
 
5
- export default Vue.extend({
6
+ export default defineComponent({
6
7
  props: {
7
8
  /**
8
9
  * The name of the input, for grouping.
@@ -71,7 +72,10 @@ export default Vue.extend({
71
72
  },
72
73
 
73
74
  data() {
74
- return { isChecked: this.value === this.val };
75
+ return {
76
+ isChecked: this.value === this.val,
77
+ randomString: `${ randomStr() }-radio`,
78
+ };
75
79
  },
76
80
 
77
81
  computed: {
@@ -115,13 +119,15 @@ export default Vue.extend({
115
119
  /**
116
120
  * Emits the input event.
117
121
  */
118
- clicked({ target }: { target?: HTMLElement }) {
119
- if (this.isDisabled || target?.tagName === 'A') {
122
+ clicked(event: MouseEvent | KeyboardEvent) {
123
+ const target = event.target;
124
+
125
+ if (this.isDisabled || (target instanceof HTMLElement && target.tagName === 'A')) {
120
126
  return;
121
127
  }
122
128
 
123
129
  this.$emit('input', this.val);
124
- }
130
+ },
125
131
  }
126
132
  });
127
133
  </script>
@@ -134,7 +140,7 @@ export default Vue.extend({
134
140
  @click.stop="clicked($event)"
135
141
  >
136
142
  <input
137
- :id="_uid+'-radio'"
143
+ :id="randomString"
138
144
  :disabled="isDisabled"
139
145
  :name="name"
140
146
  :value="''+val"
@@ -1,14 +1,15 @@
1
1
  <script lang="ts">
2
- import Vue, { PropType } from 'vue';
2
+ import { PropType, defineComponent } from 'vue';
3
3
  import { _VIEW } from '@shell/config/query-params';
4
4
  import RadioButton from '@components/Form/Radio/RadioButton.vue';
5
5
 
6
6
  interface Option {
7
7
  value: unknown,
8
- label: string
8
+ label: string,
9
+ description?: string,
9
10
  }
10
11
 
11
- export default Vue.extend({
12
+ export default defineComponent({
12
13
  components: { RadioButton },
13
14
  props: {
14
15
  /**