@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
@@ -1,13 +1,14 @@
1
1
  <script>
2
2
  import Favorite from '@shell/components/nav/Favorite';
3
- import { FAVORITE, USED } from '@shell/store/type-map';
4
- import { linkActiveClass } from '@shell/config/router';
3
+ import { TYPE_MODES } from '@shell/store/type-map';
5
4
 
6
- const showFavoritesFor = [FAVORITE, USED];
5
+ import TabTitle from '@shell/components/TabTitle';
6
+
7
+ const showFavoritesFor = [TYPE_MODES.FAVORITE, TYPE_MODES.USED];
7
8
 
8
9
  export default {
9
10
 
10
- components: { Favorite },
11
+ components: { Favorite, TabTitle },
11
12
 
12
13
  props: {
13
14
  type: {
@@ -27,77 +28,32 @@ export default {
27
28
  },
28
29
 
29
30
  data() {
30
- return {
31
- near: false,
32
- over: false,
33
- menuPath: this.type.route ? this.$router.resolve(this.type.route)?.route?.path : undefined,
34
- linkActiveClass
35
- };
31
+ return { near: false };
36
32
  },
37
33
 
38
34
  computed: {
39
- isCurrent() {
40
- // This is required to avoid scenarios where fragments break vue routers location matching
41
- // For example, the following fails
42
- // Curruent Path /c/c-m-hzqf4tqt/explorer/members#project-membership
43
- // Menu Path /c/c-m-hzqf4tqt/explorer/members
44
- // vue-router exact-path="true" fixes this (https://v3.router.vuejs.org/api/#exact-path),
45
- // but fails when the the current path is a child (for instance a resource detail page)
46
-
47
- // Scenarios to consider
48
- // - Fragement world
49
- // Curruent Path /c/c-m-hzqf4tqt/explorer/members#project-membership
50
- // Menu Path /c/c-m-hzqf4tqt/explorer/members
51
- // - Similar current paths
52
- // /c/c-m-hzqf4tqt/fleet/fleet.cattle.io.bundlenamespacemapping
53
- // /c/c-m-hzqf4tqt/fleet/fleet.cattle.io.bundle
54
- // - Other menu items that appear in current menu item
55
- // /c/c-m-hzqf4tqt/fleet
56
- // /c/c-m-hzqf4tqt/fleet/management.cattle.io.fleetworkspace
57
-
58
- // If there's no hash the n-link will determine it's linkActiveClass correctly, so avoid this faff
59
- const invalidHash = !this.$route.hash;
60
- // Lets be super safe
61
- const invalidProps = !this.menuPath || !this.$route.path;
62
-
63
- if (invalidHash || invalidProps) {
64
- return false;
65
- }
66
-
67
- // We're kind of, but in a fixing way, copying n-link --> vue-router link see vue-router/src/components/link.js & vue-router/src/util/route.js
68
- // We're only going to compare the path and ignore query and fragment
69
-
70
- if (this.type.exact) {
71
- return this.$route.path === this.menuPath;
72
- }
73
-
74
- const currentPath = this.$route.path.split('/');
75
- const menuPath = this.menuPath.split('/');
76
-
77
- if (menuPath.length > currentPath.length) {
78
- return false;
79
- }
80
-
81
- for (let i = 0; i < menuPath.length; i++) {
82
- if (menuPath[i] !== currentPath[i]) {
83
- return false;
84
- }
85
- }
86
-
87
- return true;
88
- },
89
-
90
35
  showFavorite() {
91
36
  return ( this.type.mode && this.near && showFavoritesFor.includes(this.type.mode) );
92
37
  },
93
38
 
94
39
  showCount() {
95
- return typeof this.type.count !== 'undefined';
40
+ return this.count !== undefined && this.count !== null;
96
41
  },
97
42
 
98
43
  namespaceIcon() {
99
44
  return this.type.namespaced;
100
45
  },
46
+
47
+ count() {
48
+ if (this.type.count !== undefined) {
49
+ return this.type.count;
50
+ }
51
+
52
+ const inStore = this.$store.getters['currentStore'](this.type.name);
53
+
54
+ return this.$store.getters[`${ inStore }/count`]({ name: this.type.name });
55
+ }
56
+
101
57
  },
102
58
 
103
59
  methods: {
@@ -105,14 +61,6 @@ export default {
105
61
  this.near = val;
106
62
  },
107
63
 
108
- setOver(val) {
109
- this.over = val;
110
- },
111
-
112
- removeFavorite() {
113
- this.$store.dispatch('type-map/removeFavorite', this.type.name);
114
- },
115
-
116
64
  selectType() {
117
65
  // Prevent issues if custom NavLink is used #5047
118
66
  if (this.type?.route) {
@@ -128,57 +76,74 @@ export default {
128
76
  </script>
129
77
 
130
78
  <template>
131
- <n-link
79
+ <router-link
132
80
  v-if="type.route"
133
81
  :key="type.name"
82
+ v-slot="{ href, navigate, isActive, isExactActive }"
83
+ custom
134
84
  :to="type.route"
135
- tag="li"
136
- class="child nav-type"
137
- :class="{'root': isRoot, [`depth-${depth}`]: true, [linkActiveClass]: isCurrent}"
138
85
  :exact="type.exact"
86
+ :exact-path="type['exact-path']"
139
87
  >
140
- <a
141
- @click="selectType"
142
- @mouseenter="setNear(true)"
143
- @mouseleave="setNear(false)"
88
+ <li
89
+ class="child nav-type"
90
+ :class="{'root': isRoot, [`depth-${depth}`]: true, 'router-link-active': isActive, 'router-link-exact-active': isExactActive}"
91
+ @click="navigate"
92
+ @keypress.enter="navigate"
144
93
  >
145
- <span
146
- v-if="type.labelKey"
147
- class="label"
148
- ><t :k="type.labelKey" /></span>
149
- <span
150
- v-else
151
- v-clean-html="type.labelDisplay || type.label"
152
- class="label"
153
- :class="{'no-icon': !type.icon}"
154
- />
155
- <span
156
- v-if="showFavorite || showCount"
157
- class="count"
94
+ <TabTitle
95
+ v-if="isExactActive"
96
+ :show-child="false"
158
97
  >
159
- <Favorite
160
- v-if="showFavorite"
161
- :resource="type.name"
162
- />
163
- <i
164
- v-if="namespaceIcon"
165
- class="icon icon-namespace namespaced"
98
+ {{ type.labelKey ? t(type.labelKey) : (type.labelDisplay || type.label) }}
99
+ </TabTitle>
100
+ <a
101
+ :href="href"
102
+ @click="selectType(); navigate($event);"
103
+ @mouseenter="setNear(true)"
104
+ @mouseleave="setNear(false)"
105
+ >
106
+ <span
107
+ v-if="type.labelKey"
108
+ class="label"
109
+ ><t :k="type.labelKey" /></span>
110
+ <span
111
+ v-else
112
+ v-clean-html="type.labelDisplay || type.label"
113
+ class="label"
114
+ :class="{'no-icon': !type.icon}"
166
115
  />
167
- {{ type.count }}
168
- </span>
169
- </a>
170
- </n-link>
116
+ <span
117
+ v-if="showFavorite || namespaceIcon || showCount"
118
+ class="count"
119
+ >
120
+ <Favorite
121
+ v-if="showFavorite"
122
+ :resource="type.name"
123
+ />
124
+ <i
125
+ v-if="namespaceIcon"
126
+ class="icon icon-namespace"
127
+ :class="{'ns-and-icon': showCount}"
128
+ data-testid="type-namespaced"
129
+ />
130
+ <span
131
+ v-if="showCount"
132
+ data-testid="type-count"
133
+ >{{ count }}</span>
134
+ </span>
135
+ </a>
136
+ </li>
137
+ </router-link>
171
138
  <li
172
139
  v-else-if="type.link"
173
140
  class="child nav-type"
141
+ data-testid="link-type"
174
142
  >
175
143
  <a
176
144
  :href="type.link"
177
145
  :target="type.target"
178
146
  rel="noopener noreferrer nofollow"
179
- @click="selectType"
180
- @mouseenter="setNear(true)"
181
- @mouseleave="setNear(false)"
182
147
  >
183
148
  <span class="label">{{ type.label }}&nbsp;<i class="icon icon-external-link" /></span>
184
149
  </a>
@@ -189,7 +154,7 @@ export default {
189
154
  </template>
190
155
 
191
156
  <style lang="scss" scoped>
192
- .namespaced {
157
+ .ns-and-icon {
193
158
  margin-right: 4px;
194
159
  }
195
160
 
@@ -2,7 +2,7 @@
2
2
  import { saveAs } from 'file-saver';
3
3
  import AnsiUp from 'ansi_up';
4
4
  import { addParams } from '@shell/utils/url';
5
- import { base64Decode } from '@shell/utils/crypto';
5
+ import { base64DecodeToBuffer } from '@shell/utils/crypto';
6
6
  import { LOGS_RANGE, LOGS_TIME, LOGS_WRAP } from '@shell/store/prefs';
7
7
  import LabeledSelect from '@shell/components/form/LabeledSelect';
8
8
  import { Checkbox } from '@components/Form/Checkbox';
@@ -25,6 +25,61 @@ import Window from './Window';
25
25
 
26
26
  let lastId = 1;
27
27
  const ansiup = new AnsiUp();
28
+ // Convert arrayBuffer(Uint8Array) to string
29
+ // ref: https://developer.mozilla.org/en-US/docs/Web/API/TextDecoder
30
+ // ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/of
31
+ const ab2str = (input, outputEncoding = 'utf8') => {
32
+ const decoder = new TextDecoder(outputEncoding);
33
+
34
+ return decoder.decode(input);
35
+ };
36
+
37
+ // The utf-8 encoded messages pushed by websocket may truncate multi-byte utf-8 characters,
38
+ // which causes the front-end to be unable to parse the truncated multi-byte utf-8 characters in the previous and next messages when decoding.
39
+ // Therefore, we need to determine whether the last 4 bytes of the current pushed message contain incomplete utf-8 encoded characters.
40
+ // ref: https://en.wikipedia.org/wiki/UTF-8#Encoding
41
+ const isLogTruncated = (uint8ArrayBuffer) => {
42
+ const len = uint8ArrayBuffer.length;
43
+ const count = Math.min(4, len);
44
+ let isTruncated = false;
45
+
46
+ // Parses the last ${count} bytes of the array to determine if there are any truncated utf-8 characters.
47
+ for ( let i = 0; i < count; i++ ) {
48
+ const a = uint8ArrayBuffer[len - (1 + i)];
49
+
50
+ // 1 byte utf-8 character in binary form: 0xxxxxxxxx
51
+ if ((a & 0b10000000) === 0b00000000) {
52
+ break;
53
+ }
54
+ // Multi-byte utf-8 character, intermediate binary form: 10xxxxxx
55
+ if ((a & 0b11000000) === 0b10000000) {
56
+ continue;
57
+ }
58
+ // 2 byte utf-8 character in binary form: 110xxxxx 10xxxxxx
59
+ if ((a & 0b11100000) === 0b11000000) {
60
+ if ( i !== 1) {
61
+ isTruncated = true;
62
+ }
63
+ break;
64
+ }
65
+ // 3 byte utf-8 character in binary form: 1110xxxx 10xxxxxx 10xxxxxx
66
+ if ((a & 0b11110000) === 0b11100000) {
67
+ if (i !== 2) {
68
+ isTruncated = true;
69
+ }
70
+ break;
71
+ }
72
+ // 4 byte utf-8 character in binary form: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
73
+ if ((a & 0b11111000) === 0b11110000) {
74
+ if (i !== 3) {
75
+ isTruncated = true;
76
+ }
77
+ break;
78
+ }
79
+ }
80
+
81
+ return isTruncated;
82
+ };
28
83
 
29
84
  export default {
30
85
  components: {
@@ -273,34 +328,80 @@ export default {
273
328
  console.error('Connect Error', e); // eslint-disable-line no-console
274
329
  });
275
330
 
331
+ let logBuffer = [];
332
+ let truncatedLog = '';
333
+
276
334
  this.socket.addEventListener(EVENT_MESSAGE, (e) => {
277
- const line = base64Decode(e.detail.data);
335
+ const decodedData = e.detail?.data || '';
336
+ const replacedData = decodedData.replace(/[-_]/g, (char) => char === '-' ? '+' : '/');
337
+ const b = base64DecodeToBuffer(replacedData);
338
+ const isTruncated = isLogTruncated(b);
278
339
 
279
- let msg = line;
280
- let time = null;
340
+ if (isTruncated === true) {
341
+ logBuffer.push(...b);
342
+
343
+ return;
344
+ }
281
345
 
282
- const idx = line.indexOf(' ');
346
+ let d;
347
+
348
+ // If the logBuffer is not empty,
349
+ // there are truncated utf-8 characters in the previous message
350
+ // that need to be merged with the current message before decoding.
351
+ if (logBuffer.length > 0) {
352
+ // Convert arrayBuffer(Uint8Array) to string
353
+ // ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/of
354
+ d = ab2str(Uint8Array.of(...logBuffer, ...b));
355
+ logBuffer = [];
356
+ } else {
357
+ d = b.toString();
358
+ }
359
+ let data = d;
360
+
361
+ if (truncatedLog) {
362
+ data = `${ truncatedLog }${ d }`;
363
+ truncatedLog = '';
364
+ }
283
365
 
284
- if ( idx > 0 ) {
285
- const timeStr = line.substr(0, idx);
286
- const date = new Date(timeStr);
366
+ if (!d.endsWith('\n')) {
367
+ const lines = data.split(/\n/);
287
368
 
288
- if ( !isNaN(date.getSeconds()) ) {
289
- time = date.toISOString();
290
- msg = line.substr(idx + 1);
369
+ if (lines.length === 1) {
370
+ truncatedLog = data;
371
+
372
+ return;
291
373
  }
374
+ data = lines.slice(0, -1).join('\n');
375
+ truncatedLog = lines.slice(-1);
292
376
  }
377
+ // Websocket message may contain multiple lines - loop through each line, one by one
378
+ data.split('\n').filter((line) => line).forEach((line) => {
379
+ let msg = line;
380
+ let time = null;
381
+
382
+ const idx = line.indexOf(' ');
383
+
384
+ if ( idx > 0 ) {
385
+ const timeStr = line.substr(0, idx);
386
+ const date = new Date(timeStr);
293
387
 
294
- const parsedLine = {
295
- id: lastId++,
296
- msg: ansiup.ansi_to_html(msg),
297
- rawMsg: msg,
298
- time,
299
- };
388
+ if ( !isNaN(date.getSeconds()) ) {
389
+ time = date.toISOString();
390
+ msg = line.substr(idx + 1);
391
+ }
392
+ }
393
+
394
+ const parsedLine = {
395
+ id: lastId++,
396
+ msg: ansiup.ansi_to_html(msg),
397
+ rawMsg: msg,
398
+ time,
399
+ };
300
400
 
301
- Object.freeze(parsedLine);
401
+ Object.freeze(parsedLine);
302
402
 
303
- this.backlog.push(parsedLine);
403
+ this.backlog.push(parsedLine);
404
+ });
304
405
  });
305
406
 
306
407
  this.socket.connect();
@@ -79,6 +79,7 @@ export default {
79
79
  fitAddon: null,
80
80
  searchAddon: null,
81
81
  webglAddon: null,
82
+ canvasAddon: null,
82
83
  isOpen: false,
83
84
  isOpening: false,
84
85
  backlog: [],
@@ -155,6 +156,7 @@ export default {
155
156
  webgl: import(/* webpackChunkName: "xterm" */ 'xterm-addon-webgl'),
156
157
  weblinks: import(/* webpackChunkName: "xterm" */ 'xterm-addon-web-links'),
157
158
  search: import(/* webpackChunkName: "xterm" */ 'xterm-addon-search'),
159
+ canvas: import(/* webpackChunkName: "xterm" */ 'xterm-addon-canvas')
158
160
  });
159
161
 
160
162
  const terminal = new xterm.Terminal({
@@ -171,10 +173,11 @@ export default {
171
173
  this.searchAddon = new addons.search.SearchAddon();
172
174
 
173
175
  try {
174
- this.webglAddon = new addons.webgl.WebGlAddon();
176
+ this.webglAddon = new addons.webgl.WebglAddon();
175
177
  } catch (e) {
176
178
  // Some browsers (Safari) don't support the webgl renderer, so don't use it.
177
179
  this.webglAddon = null;
180
+ this.canvasAddon = new addons.canvas.CanvasAddon();
178
181
  }
179
182
 
180
183
  terminal.loadAddon(this.fitAddon);
@@ -184,6 +187,8 @@ export default {
184
187
 
185
188
  if (this.webglAddon) {
186
189
  terminal.loadAddon(this.webglAddon);
190
+ } else {
191
+ terminal.loadAddon(this.canvasAddon);
187
192
  }
188
193
 
189
194
  this.fit();
@@ -0,0 +1,186 @@
1
+ import { shallowMount } from '@vue/test-utils';
2
+ import ContainerLogs from '@shell/components/nav/WindowManager/ContainerLogs.vue';
3
+ import { base64Encode } from '@shell/utils/crypto';
4
+ import { Buffer } from 'buffer';
5
+ import { addEventListener } from '@shell/utils/socket';
6
+
7
+ jest.mock('@shell/utils/socket');
8
+
9
+ const getDefaultOptions = () => {
10
+ return {
11
+ propsData: {
12
+ tab: {},
13
+ active: true,
14
+ height: 100,
15
+ pod: {
16
+ spec: { nodeName: 'nodeId' },
17
+ links: { view: 'url' },
18
+ os: 'linux'
19
+ },
20
+ },
21
+ data() {
22
+ return { range: '30 minute' };
23
+ },
24
+ mocks: {
25
+ $store: {
26
+ getters: {
27
+ 'prefs/get': jest.fn(),
28
+ 'i18n/t': jest.fn(),
29
+ currentProduct: { inStore: 'cluster' }
30
+ }
31
+ }
32
+ }
33
+ };
34
+ };
35
+
36
+ describe('component: ContainerLogs', () => {
37
+ it('should receive messages correctly', async() => {
38
+ jest.clearAllMocks();
39
+ const wrapper = await shallowMount(ContainerLogs, getDefaultOptions());
40
+
41
+ const data1 = 'container logs test1\n';
42
+ const messageCallback = addEventListener.mock.calls.find(([e]) => e === 'message')[1];
43
+
44
+ messageCallback({ detail: { data: base64Encode(data1) } });
45
+
46
+ await wrapper.vm.$nextTick();
47
+ expect(wrapper.vm.backlog).toHaveLength(1);
48
+ expect(wrapper.vm.backlog[0].rawMsg).toBe(data1.trimEnd());
49
+ const data2 = 'container logs test2 中文日志内容测试\n';
50
+
51
+ messageCallback({ detail: { data: base64Encode(data2) } });
52
+ await wrapper.vm.$nextTick();
53
+ expect(wrapper.vm.backlog).toHaveLength(2);
54
+ expect(wrapper.vm.backlog[1].rawMsg).toBe(data2.trimEnd());
55
+ });
56
+
57
+ it('should not fail for an empty message/string', async() => {
58
+ jest.clearAllMocks();
59
+ const wrapper = await shallowMount(ContainerLogs, getDefaultOptions());
60
+
61
+ const data1 = '';
62
+ const messageCallback = addEventListener.mock.calls.find(([e]) => e === 'message')[1];
63
+
64
+ messageCallback({ detail: { data: base64Encode(data1) } });
65
+ await wrapper.vm.$nextTick();
66
+ expect(wrapper.vm.backlog).toHaveLength(0);
67
+ expect(wrapper.vm.filtered).toHaveLength(0);
68
+ });
69
+
70
+ it('should merge the message which be truncated line', async() => {
71
+ jest.clearAllMocks();
72
+ const wrapper = await shallowMount(ContainerLogs, getDefaultOptions());
73
+ const part1 = 'container logs part1';
74
+ const messageCallback = addEventListener.mock.calls.find(([e]) => e === 'message')[1];
75
+
76
+ messageCallback({ detail: { data: base64Encode(part1) } });
77
+ await wrapper.vm.$nextTick();
78
+
79
+ expect(wrapper.vm.backlog).toHaveLength(0);
80
+ const part2 = 'container logs part2\n';
81
+
82
+ messageCallback({ detail: { data: base64Encode(part2) } });
83
+ await wrapper.vm.$nextTick();
84
+ expect(wrapper.vm.backlog).toHaveLength(1);
85
+ expect(wrapper.vm.backlog[0].rawMsg).toBe(`${ part1 }${ part2 }`.trimEnd());
86
+ });
87
+
88
+ it('should merge truncated 2-byte utf-8 character messages', async() => {
89
+ jest.clearAllMocks();
90
+ const wrapper = await shallowMount(ContainerLogs, getDefaultOptions());
91
+ // Contains 2-byte utf-8 character message with one character truncation
92
+ const message = '¡¢£¤¥\n';
93
+ const arr = Buffer.from(message);
94
+
95
+ const part1 = arr.slice(0, 3).toString('base64');
96
+ const part2 = arr.slice(3).toString('base64');
97
+
98
+ const messageCallback = addEventListener.mock.calls.find(([e]) => e === 'message')[1];
99
+
100
+ messageCallback({ detail: { data: part1 } });
101
+ await wrapper.vm.$nextTick();
102
+ expect(wrapper.vm.backlog).toHaveLength(0);
103
+ messageCallback({ detail: { data: part2 } });
104
+ await wrapper.vm.$nextTick();
105
+ expect(wrapper.vm.backlog).toHaveLength(1);
106
+ expect(wrapper.vm.backlog[0].rawMsg).toBe(message.trimEnd());
107
+ });
108
+ it('should merge truncated 3-byte utf-8 character messages', async() => {
109
+ jest.clearAllMocks();
110
+ const wrapper = await shallowMount(ContainerLogs, getDefaultOptions());
111
+ // Contains 3-byte utf-8 character message with one character truncation
112
+ const message = 'ࠀࠁࠂࠃ\n';
113
+ const arr = Buffer.from(message);
114
+ // Truncate at the fourth byte
115
+ const part1 = arr.slice(0, 4).toString('base64');
116
+ const part2 = arr.slice(4).toString('base64');
117
+
118
+ const messageCallback = addEventListener.mock.calls.find(([e]) => e === 'message')[1];
119
+
120
+ messageCallback({ detail: { data: part1 } });
121
+ await wrapper.vm.$nextTick();
122
+ expect(wrapper.vm.backlog).toHaveLength(0);
123
+ messageCallback({ detail: { data: part2 } });
124
+ await wrapper.vm.$nextTick();
125
+ expect(wrapper.vm.backlog).toHaveLength(1);
126
+ expect(wrapper.vm.backlog[0].rawMsg).toBe(message.trimEnd());
127
+
128
+ // Truncate at the fifth byte
129
+ const part3 = arr.slice(0, 5).toString('base64');
130
+ const part4 = arr.slice(5).toString('base64');
131
+
132
+ messageCallback({ detail: { data: part3 } });
133
+ await wrapper.vm.$nextTick();
134
+ expect(wrapper.vm.backlog).toHaveLength(1);
135
+ messageCallback({ detail: { data: part4 } });
136
+ await wrapper.vm.$nextTick();
137
+ expect(wrapper.vm.backlog).toHaveLength(2);
138
+ expect(wrapper.vm.backlog[1].rawMsg).toBe(message.trimEnd());
139
+ });
140
+
141
+ it('should merge truncated 4-byte utf-8 character messages', async() => {
142
+ jest.clearAllMocks();
143
+ const wrapper = await shallowMount(ContainerLogs, getDefaultOptions());
144
+ // Contains 4-byte utf-8 character message with one character truncation
145
+ const message = '𐀀𐀁𐀂𐀃\n';
146
+ const arr = Buffer.from(message);
147
+
148
+ // Truncate at the fifth byte
149
+ const part1 = arr.slice(0, 5).toString('base64');
150
+ const part2 = arr.slice(5).toString('base64');
151
+
152
+ const messageCallback = addEventListener.mock.calls.find(([e]) => e === 'message')[1];
153
+
154
+ messageCallback({ detail: { data: part1 } });
155
+ await wrapper.vm.$nextTick();
156
+ expect(wrapper.vm.backlog).toHaveLength(0);
157
+ messageCallback({ detail: { data: part2 } });
158
+ await wrapper.vm.$nextTick();
159
+ expect(wrapper.vm.backlog).toHaveLength(1);
160
+ expect(wrapper.vm.backlog[0].rawMsg).toBe(message.trimEnd());
161
+
162
+ // Truncate at the sixth byte
163
+ const part3 = arr.slice(0, 6).toString('base64');
164
+ const part4 = arr.slice(6).toString('base64');
165
+
166
+ messageCallback({ detail: { data: part3 } });
167
+ await wrapper.vm.$nextTick();
168
+ expect(wrapper.vm.backlog).toHaveLength(1);
169
+ messageCallback({ detail: { data: part4 } });
170
+ await wrapper.vm.$nextTick();
171
+ expect(wrapper.vm.backlog).toHaveLength(2);
172
+ expect(wrapper.vm.backlog[1].rawMsg).toBe(message.trimEnd());
173
+
174
+ // Truncate at the seventh byte
175
+ const part5 = arr.slice(0, 7).toString('base64');
176
+ const part6 = arr.slice(7).toString('base64');
177
+
178
+ messageCallback({ detail: { data: part5 } });
179
+ await wrapper.vm.$nextTick();
180
+ expect(wrapper.vm.backlog).toHaveLength(2);
181
+ messageCallback({ detail: { data: part6 } });
182
+ await wrapper.vm.$nextTick();
183
+ expect(wrapper.vm.backlog).toHaveLength(3);
184
+ expect(wrapper.vm.backlog[2].rawMsg).toBe(message.trimEnd());
185
+ });
186
+ });
@@ -20,10 +20,6 @@ export default {
20
20
 
21
21
  height: {
22
22
  get() {
23
- if ( process.server ) {
24
- return 0;
25
- }
26
-
27
23
  if ( this.userHeight ) {
28
24
  return this.userHeight;
29
25
  }
@@ -52,10 +48,6 @@ export default {
52
48
 
53
49
  width: {
54
50
  get() {
55
- if ( process.server ) {
56
- return 0;
57
- }
58
-
59
51
  if (this.userWidth) {
60
52
  return this.userWidth;
61
53
  }
@@ -342,7 +334,8 @@ export default {
342
334
  />
343
335
  <span class="tab-label"> {{ tab.label }}</span>
344
336
  <i
345
- class="closer icon icon-fw icon-x"
337
+ data-testid="wm-tab-close-button"
338
+ class="closer icon icon-fw icon-x wm-closer-button"
346
339
  @click.stop="close(tab.id)"
347
340
  />
348
341
  </div>
@@ -440,9 +433,16 @@ export default {
440
433
  margin-left: 5px;
441
434
  border: 1px solid var(--body-text);
442
435
  border-radius: var(--border-radius);
436
+ line-height: 12px;
437
+ font-size: 10px;
438
+ width: 14px;
439
+ align-self: center;
440
+ display: flex;
441
+ justify-content: center;
443
442
 
444
443
  &:hover {
445
- background-color: var(--wm-closer-hover-bg);
444
+ border-color: var(--link-border);
445
+ color: var(--link-border);
446
446
  }
447
447
  }
448
448
  }
@@ -502,4 +502,5 @@ export default {
502
502
  border-right: var(--nav-border-size) solid var(--nav-border);
503
503
  }
504
504
  }
505
+
505
506
  </style>