@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
@@ -16,10 +16,8 @@ import { downloadFile, generateZip } from '@shell/utils/download';
16
16
  import { clone, get } from '@shell/utils/object';
17
17
  import { eachLimit } from '@shell/utils/promise';
18
18
  import { sortableNumericSuffix } from '@shell/utils/sort';
19
- import { coerceStringTypeToScalarType, escapeHtml, ucFirst } from '@shell/utils/string';
19
+ import { escapeHtml, ucFirst } from '@shell/utils/string';
20
20
  import {
21
- displayKeyFor,
22
- validateBoolean,
23
21
  validateChars,
24
22
  validateDnsLikeTypes,
25
23
  validateLength,
@@ -32,26 +30,12 @@ import forIn from 'lodash/forIn';
32
30
  import isEmpty from 'lodash/isEmpty';
33
31
  import isFunction from 'lodash/isFunction';
34
32
  import isString from 'lodash/isString';
35
- import uniq from 'lodash/uniq';
36
33
  import Vue from 'vue';
37
34
 
38
- import { normalizeType } from './normalize';
39
-
40
35
  import { ExtensionPoint, ActionLocation } from '@shell/core/types';
41
36
  import { getApplicableExtensionEnhancements } from '@shell/core/plugin-helpers';
42
37
 
43
- const STRING_LIKE_TYPES = [
44
- 'string',
45
- 'date',
46
- 'blob',
47
- 'enum',
48
- 'multiline',
49
- 'masked',
50
- 'password',
51
- 'dnsLabel',
52
- 'hostname',
53
- ];
54
- const DNS_LIKE_TYPES = ['dnsLabel', 'dnsLabelRestricted', 'hostname'];
38
+ export const DNS_LIKE_TYPES = ['dnsLabel', 'dnsLabelRestricted', 'hostname'];
55
39
 
56
40
  const REMAP_STATE = {
57
41
  disabled: 'inactive',
@@ -105,6 +89,7 @@ export const STATES_ENUM = {
105
89
  ERRORING: 'erroring',
106
90
  ERRORS: 'errors',
107
91
  EXPIRED: 'expired',
92
+ EXPIRING: 'expiring',
108
93
  FAIL: 'fail',
109
94
  FAILED: 'failed',
110
95
  HEALTHY: 'healthy',
@@ -167,6 +152,13 @@ export const STATES_ENUM = {
167
152
  WARNING: 'warning',
168
153
  };
169
154
 
155
+ export function mapStateToEnum(statusString) {
156
+ // e.g. in fleet Status is Capitalized. This function will map it to the enum
157
+ return Object.values(STATES_ENUM).find((val) => {
158
+ return val.toLowerCase() === statusString.toLocaleLowerCase();
159
+ });
160
+ }
161
+
170
162
  export const STATES = {
171
163
  [STATES_ENUM.IN_USE]: {
172
164
  color: 'success', icon: 'dot-open', label: 'In Use', compoundIcon: 'checkmark'
@@ -253,7 +245,10 @@ export const STATES = {
253
245
  color: 'error', icon: 'error', label: 'Errors', compoundIcon: 'error'
254
246
  },
255
247
  [STATES_ENUM.EXPIRED]: {
256
- color: 'warning', icon: 'error', label: 'Expired', compoundIcon: 'warning'
248
+ color: 'error', icon: 'error', label: 'Expired', compoundIcon: 'warning'
249
+ },
250
+ [STATES_ENUM.EXPIRING]: {
251
+ color: 'warning', icon: 'error', label: 'Expiring', compoundIcon: 'error'
257
252
  },
258
253
  [STATES_ENUM.FAIL]: {
259
254
  color: 'error', icon: 'error', label: 'Fail', compoundIcon: 'error'
@@ -512,6 +507,28 @@ export function stateDisplay(state) {
512
507
  return key.split(/-/).map(ucFirst).join('-');
513
508
  }
514
509
 
510
+ export function primaryDisplayStatusFromCount(status) {
511
+ const statusOrder = [
512
+ STATES_ENUM.ERROR,
513
+ STATES_ENUM.FAILED,
514
+ STATES_ENUM.WARNING,
515
+ STATES_ENUM.MODIFIED,
516
+ STATES_ENUM.WAIT_APPLIED,
517
+ STATES_ENUM.ORPHANED,
518
+ STATES_ENUM.MISSING,
519
+ STATES_ENUM.UNKNOWN,
520
+ STATES_ENUM.NOT_READY,
521
+ STATES_ENUM.READY,
522
+ ];
523
+
524
+ // sort status by order of statusOrder
525
+ const existingStatuses = Object.keys(status).filter((key) => {
526
+ return status[key] > 0 && statusOrder.includes(key.toLowerCase());
527
+ }).sort((a, b) => statusOrder.indexOf(a.toLowerCase()) - statusOrder.indexOf(b.toLowerCase()));
528
+
529
+ return existingStatuses[0] ? existingStatuses[0] : STATES_ENUM.UNKNOWN;
530
+ }
531
+
515
532
  export function stateSort(color, display) {
516
533
  color = color.replace(/^(text|bg)-/, '');
517
534
 
@@ -1089,19 +1106,26 @@ export default class Resource {
1089
1106
  return this._save(...arguments);
1090
1107
  }
1091
1108
 
1109
+ /**
1110
+ * Remove any unwanted properties from the object that will be saved
1111
+ */
1112
+ cleanForSave(data, forNew) {
1113
+ delete data.__rehydrate;
1114
+ delete data.__clone;
1115
+
1116
+ return data;
1117
+ }
1118
+
1092
1119
  /**
1093
1120
  * Allow to handle the response of the save request
1094
1121
  * @param {*} res Full request response
1095
1122
  */
1096
1123
  processSaveResponse(res) { }
1097
1124
 
1098
- async _save(opt = {}) {
1099
- delete this.__rehydrate;
1100
- delete this.__clone;
1101
-
1125
+ async _save(opt = { }) {
1102
1126
  const forNew = !this.id;
1103
1127
 
1104
- const errors = await this.validationErrors(this, opt.ignoreFields);
1128
+ const errors = this.validationErrors(this, opt);
1105
1129
 
1106
1130
  if (!isEmpty(errors)) {
1107
1131
  return Promise.reject(errors);
@@ -1145,22 +1169,24 @@ export default class Resource {
1145
1169
  // @TODO remove this once the API maps steve _type <-> k8s type in both directions
1146
1170
  opt.data = this.toSave() || { ...this };
1147
1171
 
1148
- if (opt?.data._type) {
1172
+ if (opt.data._type) {
1149
1173
  opt.data.type = opt.data._type;
1150
1174
  }
1151
1175
 
1152
- if (opt?.data._name) {
1176
+ if (opt.data._name) {
1153
1177
  opt.data.name = opt.data._name;
1154
1178
  }
1155
1179
 
1156
- if (opt?.data._labels) {
1180
+ if (opt.data._labels) {
1157
1181
  opt.data.labels = opt.data._labels;
1158
1182
  }
1159
1183
 
1160
- if (opt?.data._annotations) {
1184
+ if (opt.data._annotations) {
1161
1185
  opt.data.annotations = opt.data._annotations;
1162
1186
  }
1163
1187
 
1188
+ opt.data = this.cleanForSave(opt.data, forNew);
1189
+
1164
1190
  // handle "replace" opt as a query param _replace=true for norman PUT requests
1165
1191
  if (opt?.replace && opt.method === 'put') {
1166
1192
  const argParam = opt.url.includes('?') ? '&' : '?';
@@ -1218,19 +1244,11 @@ export default class Resource {
1218
1244
  // ------------------------------------------------------------------
1219
1245
 
1220
1246
  currentRoute() {
1221
- if ( process.server ) {
1222
- return this.$rootState.$route;
1223
- } else {
1224
- return window.$nuxt.$route;
1225
- }
1247
+ return window.$globalApp.$route;
1226
1248
  }
1227
1249
 
1228
1250
  currentRouter() {
1229
- if ( process.server ) {
1230
- return this.$rootState.$router;
1231
- } else {
1232
- return window.$nuxt.$router;
1233
- }
1251
+ return window.$globalApp.$router;
1234
1252
  }
1235
1253
 
1236
1254
  get listLocation() {
@@ -1347,7 +1365,7 @@ export default class Resource {
1347
1365
 
1348
1366
  async download() {
1349
1367
  const value = await this.followLink('view', { headers: { accept: 'application/yaml' } });
1350
- const data = await this.$dispatch('cleanForDownload', value.data);
1368
+ const data = await this.cleanForDownload(value.data);
1351
1369
 
1352
1370
  downloadFile(`${ this.nameDisplay }.yaml`, data, 'application/yaml');
1353
1371
  }
@@ -1370,7 +1388,7 @@ export default class Resource {
1370
1388
  await eachLimit(items, 10, (item, idx) => {
1371
1389
  return item.followLink('view', { headers: { accept: 'application/yaml' } } ).then(async(data) => {
1372
1390
  const yaml = data.data || data;
1373
- const cleanedYaml = await this.$dispatch('cleanForDownload', yaml);
1391
+ const cleanedYaml = await this.cleanForDownload(yaml);
1374
1392
 
1375
1393
  files[`resources/${ names[idx] }`] = cleanedYaml;
1376
1394
  });
@@ -1447,6 +1465,10 @@ export default class Resource {
1447
1465
  this.$dispatch(`cleanForDiff`, this.toJSON());
1448
1466
  }
1449
1467
 
1468
+ async cleanForDownload(yaml) {
1469
+ return this.$dispatch(`cleanForDownload`, yaml);
1470
+ }
1471
+
1450
1472
  yamlForSave(yaml) {
1451
1473
  try {
1452
1474
  const obj = jsyaml.load(yaml);
@@ -1636,93 +1658,14 @@ export default class Resource {
1636
1658
  return errors;
1637
1659
  }
1638
1660
 
1639
- validationErrors(data = this, ignoreFields) {
1640
- const errors = [];
1641
- const {
1642
- type: originalType,
1643
- schema
1644
- } = data;
1645
- const type = normalizeType(originalType);
1646
-
1647
- if ( !originalType ) {
1648
- // eslint-disable-next-line
1649
- console.warn(this.t('validation.noType'), data);
1650
-
1651
- return errors;
1652
- }
1653
-
1654
- if ( !schema ) {
1655
- // eslint-disable-next-line
1656
- // console.warn(this.t('validation.noSchema'), originalType, data);
1657
-
1658
- return errors;
1659
- }
1660
-
1661
- const fields = schema.resourceFields || {};
1662
- const keys = Object.keys(fields);
1663
- let field, key, val, displayKey;
1664
-
1665
- for ( let i = 0 ; i < keys.length ; i++ ) {
1666
- const fieldErrors = [];
1667
-
1668
- key = keys[i];
1669
- field = fields[key];
1670
- val = get(data, key);
1671
- displayKey = displayKeyFor(type, key, this.$rootGetters);
1672
-
1673
- const fieldType = field?.type ? normalizeType(field.type) : null;
1674
- const valIsString = isString(val);
1675
-
1676
- if ( ignoreFields && ignoreFields.includes(key) ) {
1677
- continue;
1678
- }
1679
-
1680
- if ( val === undefined ) {
1681
- val = null;
1682
- }
1683
-
1684
- if (valIsString) {
1685
- if (fieldType) {
1686
- Vue.set(data, key, coerceStringTypeToScalarType(val, fieldType));
1687
- }
1688
-
1689
- // Empty strings on nullable string fields -> null
1690
- if ( field.nullable && val.length === 0 && STRING_LIKE_TYPES.includes(fieldType)) {
1691
- val = null;
1692
-
1693
- Vue.set(data, key, val);
1694
- }
1695
- }
1696
- if (fieldType === 'boolean') {
1697
- validateBoolean(val, field, displayKey, this.$rootGetters, fieldErrors);
1698
- } else {
1699
- validateLength(val, field, displayKey, this.$rootGetters, fieldErrors);
1700
- validateChars(val, field, displayKey, this.$rootGetters, fieldErrors);
1701
- }
1702
-
1703
- if (fieldErrors.length > 0) {
1704
- fieldErrors.push(this.t('validation.required', { key: displayKey }));
1705
- errors.push(...fieldErrors);
1706
- continue;
1707
- }
1708
-
1709
- // IDs claim to be these but are lies...
1710
- if ( key !== 'id' && !isEmpty(val) && DNS_LIKE_TYPES.includes(fieldType) ) {
1711
- // DNS types should be lowercase
1712
- const tolower = (val || '').toLowerCase();
1713
-
1714
- if ( tolower !== val ) {
1715
- val = tolower;
1716
-
1717
- Vue.set(data, key, val);
1718
- }
1719
-
1720
- fieldErrors.push(...validateDnsLikeTypes(val, fieldType, displayKey, this.$rootGetters, fieldErrors));
1721
- }
1722
- errors.push(...fieldErrors);
1723
- }
1724
-
1725
- return uniq([...errors, ...this.customValidationErrors(data)]);
1661
+ /**
1662
+ * Check this instance is valid against
1663
+ * - any custom dashboard validation
1664
+ *
1665
+ * Models can override this and call super.validationErrors
1666
+ */
1667
+ validationErrors(data = this, opts = { }) {
1668
+ return this.customValidationErrors(data);
1726
1669
  }
1727
1670
 
1728
1671
  get ownersByType() {
@@ -1931,4 +1874,11 @@ export default class Resource {
1931
1874
  get creationTimestamp() {
1932
1875
  return this.metadata?.creationTimestamp;
1933
1876
  }
1877
+
1878
+ /**
1879
+ * Allows model to specify JSON Paths that should be folded in the YAML editor by default
1880
+ */
1881
+ get yamlFolding() {
1882
+ return [];
1883
+ }
1934
1884
  }
@@ -1,41 +1,8 @@
1
1
  import Vue from 'vue';
2
+ import focusDirective from '@shell/plugins/directives.js';
2
3
 
3
- Vue.directive('focus', {
4
- inserted(_el, _binding, vnode) {
5
- const element = getElement(vnode);
6
-
7
- if (element) {
8
- element.focus();
9
- }
10
- }
11
- });
12
-
13
- const getElement = (vnode) => {
14
- const { componentInstance, componentOptions: { tag } } = vnode;
15
-
16
- if (tag === 'LabeledInput') {
17
- return componentInstance.$refs.value;
18
- }
19
-
20
- if (tag === 'LabeledSelect') {
21
- componentInstance.shouldOpen = false;
22
-
23
- return componentInstance.$refs['select-input'].$refs.search;
24
- }
25
-
26
- if (tag === 'SelectPrincipal') {
27
- const labeledSelect = componentInstance.$refs['labeled-select'];
28
-
29
- labeledSelect.shouldOpen = false;
30
-
31
- return labeledSelect.$refs['select-input'].$refs.search;
32
- }
33
-
34
- if (tag === 'TextAreaAutoGrow') {
35
- return componentInstance.$refs.ta;
36
- }
37
-
38
- if (tag === 'Password') {
39
- return componentInstance.$refs.input.$refs.value;
40
- }
41
- };
4
+ export default focusDirective;
5
+ /* eslint-disable-next-line no-console */
6
+ console.warn(`Importing focusDirective from plugins has been deprecated, use shell/directives/focus.js instead.
7
+ Make sure to invoke it using Vue.directive('focus', focusDirective ) to maintain compatibility.`);
8
+ Vue.directive('focus', focusDirective);
@@ -0,0 +1,13 @@
1
+ import { REDIRECTED } from '@shell/config/cookies';
2
+
3
+ export default function({ $cookies }) {
4
+ // This tells Ember not to redirect back to us once you've already been to dashboard once.
5
+ // TODO: Remove this once the ember portion of the app is no longer needed
6
+ if ( !$cookies.get(REDIRECTED) ) {
7
+ $cookies.set(REDIRECTED, 'true', {
8
+ path: '/',
9
+ sameSite: true,
10
+ secure: true,
11
+ });
12
+ }
13
+ }
@@ -1,10 +1,31 @@
1
+ /* eslint-disable no-console */
1
2
  import Vue from 'vue';
2
3
 
3
4
  const components = require.context('@shell/components/formatter', false, /[A-Z]\w+\.(vue)$/);
4
5
 
5
- components.keys().forEach((fileName) => {
6
- const componentConfig = components(fileName);
7
- const componentName = fileName.split('/').pop().split('.')[0];
6
+ const globalFormatters = {
7
+ install: (Vue) => {
8
+ components.keys().forEach((fileName) => {
9
+ const componentConfig = components(fileName);
10
+ const componentName = fileName.split('/').pop().split('.')[0];
8
11
 
9
- Vue.component(componentName, componentConfig.default || componentConfig);
10
- });
12
+ if (Vue.component(componentName)) {
13
+ // eslint-disable-next-line no-console
14
+ console.debug(`Skipping ${ componentName } install. Component already exists.`);
15
+ } else {
16
+ Vue.component(componentName, componentConfig.default || componentConfig);
17
+ }
18
+ });
19
+ }
20
+ };
21
+
22
+ export default globalFormatters;
23
+
24
+ // This is being done for backwards compatibility with our extensions that have written tests and didn't properly make use of Vue.use() when importing and mocking vue plugins
25
+ const isThisFileBeingExecutedInATest = process.env.NODE_ENV === 'test';
26
+
27
+ if (isThisFileBeingExecutedInATest) {
28
+ console.warn('The implicit addition of global formatters has been deprecated in Rancher Shell and will be removed in a future version. Make sure to invoke `Vue.use(globalFormatters)` to maintain compatibility.');
29
+
30
+ Vue.use(globalFormatters);
31
+ }
package/plugins/i18n.js CHANGED
@@ -1,5 +1,7 @@
1
- import Vue from 'vue';
1
+ /* eslint-disable no-console */
2
2
  import { escapeHtml } from '../utils/string';
3
+ import Vue, { watchEffect, ref, h } from 'vue';
4
+ import { useStore } from '../composables/useStore';
3
5
 
4
6
  export function stringFor(store, key, args, raw = false, escapehtml = true) {
5
7
  const translation = store.getters['i18n/t'](key, args);
@@ -26,10 +28,6 @@ export function stringFor(store, key, args, raw = false, escapehtml = true) {
26
28
  }
27
29
  }
28
30
 
29
- Vue.prototype.t = function(key, args, raw) {
30
- return stringFor(this.$store, key, args, raw);
31
- };
32
-
33
31
  function directive(el, binding, vnode /*, oldVnode */) {
34
32
  const { context } = vnode;
35
33
  const raw = binding.modifiers && binding.modifiers.raw === true;
@@ -43,6 +41,9 @@ function directive(el, binding, vnode /*, oldVnode */) {
43
41
  }
44
42
 
45
43
  export function directiveSsr(vnode, binding) {
44
+ // eslint-disable-next-line no-console
45
+ console.warn('Function `directiveSsr` is deprecated. Please install i18n as a vue plugin: `Vue.use(i18n)`');
46
+
46
47
  const { context } = vnode;
47
48
  const raw = binding.modifiers && binding.modifiers.raw === true;
48
49
  const str = stringFor(context.$store, binding.value, {}, raw);
@@ -54,54 +55,87 @@ export function directiveSsr(vnode, binding) {
54
55
  }
55
56
  }
56
57
 
57
- // InnerHTML: <some-tag v-t="'some.key'" />
58
- // As an attribute: <some-tag v-t:title="'some.key'" />
59
- Vue.directive('t', {
60
- bind() {
61
- directive(...arguments);
62
- },
63
-
64
- update() {
65
- directive(...arguments);
66
- },
67
- });
68
-
69
- // Basic (but you might want the directive above): <t k="some.key" />
70
- // With interpolation: <t k="some.key" count="1" :foo="bar" />
71
- Vue.component('t', {
72
- inheritAttrs: false,
73
- props: {
74
- k: {
75
- type: String,
76
- required: true,
77
- },
78
- raw: {
79
- type: Boolean,
80
- default: false,
81
- },
82
- tag: {
83
- type: [String, Object],
84
- default: 'span'
85
- },
86
- escapehtml: {
87
- type: Boolean,
88
- default: true,
89
- }
90
- },
91
-
92
- render(h) {
93
- const msg = stringFor(this.$store, this.k, this.$attrs, this.raw, this.escapehtml);
94
-
95
- if ( this.raw ) {
96
- return h(
97
- this.tag,
98
- { domProps: { innerHTML: msg } }
99
- );
100
- } else {
101
- return h(
102
- this.tag,
103
- [msg]
104
- );
58
+ const i18n = {
59
+ name: 'i18n',
60
+ install: (Vue, _options) => {
61
+ if (Vue.prototype.t && Vue.directive('t') && Vue.component('t')) {
62
+ // eslint-disable-next-line no-console
63
+ console.debug('Skipping i18n install. Directive, component, and option already exist.');
105
64
  }
106
- },
107
- });
65
+
66
+ Vue.prototype.t = function(key, args, raw) {
67
+ return stringFor(this.$store, key, args, raw);
68
+ };
69
+
70
+ // InnerHTML: <some-tag v-t="'some.key'" />
71
+ // As an attribute: <some-tag v-t:title="'some.key'" />
72
+ Vue.directive('t', {
73
+ bind() {
74
+ directive(...arguments);
75
+ },
76
+ update() {
77
+ directive(...arguments);
78
+ },
79
+ });
80
+
81
+ // Basic (but you might want the directive above): <t k="some.key" />
82
+ // With interpolation: <t k="some.key" count="1" :foo="bar" />
83
+ Vue.component('t', {
84
+ inheritAttrs: false,
85
+ props: {
86
+ k: {
87
+ type: String,
88
+ required: true,
89
+ },
90
+ raw: {
91
+ type: Boolean,
92
+ default: false,
93
+ },
94
+ tag: {
95
+ type: [String, Object],
96
+ default: 'span'
97
+ },
98
+ escapehtml: {
99
+ type: Boolean,
100
+ default: true,
101
+ }
102
+ },
103
+ setup(props, ctx) {
104
+ const msg = ref('');
105
+ const store = useStore();
106
+
107
+ // Update msg whenever k, $attrs, raw, or escapehtml changes
108
+ watchEffect(() => {
109
+ msg.value = stringFor(store, props.k, ctx.attrs, props.raw, props.escapehtml);
110
+ });
111
+
112
+ return { msg };
113
+ },
114
+ render() {
115
+ if (this.raw) {
116
+ return h(
117
+ this.tag,
118
+ { domProps: { innerHTML: this.msg } }
119
+ );
120
+ } else {
121
+ return h(
122
+ this.tag,
123
+ [this.msg]
124
+ );
125
+ }
126
+ }
127
+ });
128
+ }
129
+ };
130
+
131
+ export default i18n;
132
+
133
+ // This is being done for backwards compatibility with our extensions that have written tests and didn't properly make use of Vue.use() when importing and mocking translations
134
+ // Example failing test https://github.com/rancher/dashboard/actions/runs/8927503474/job/24521022320?pr=10923
135
+ const isThisFileBeingExecutedInATest = process.env.NODE_ENV === 'test';
136
+
137
+ if (isThisFileBeingExecutedInATest) {
138
+ // Go take a look at our jest.setup.js to see how we make use of Vue.use(i18n, ...)
139
+ console.warn('The implicit addition of i18n options has been deprecated in Rancher Shell and will be removed in a future version. Make sure to invoke `Vue.use(i18n)` to maintain compatibility.');
140
+ Vue.use(i18n);
141
+ }
@@ -1,22 +1,8 @@
1
1
  import Vue from 'vue';
2
+ import intNumberDirective from '@shell/directives/int-number';
2
3
 
3
- export default Vue.directive('intNumber', {
4
- inserted(el) {
5
- el.addEventListener('keypress', (e) => {
6
- e = e || window.event;
7
- const charcode = typeof e.charCode === 'number' ? e.charCode : e.keyCode;
8
- const inputChar = String.fromCharCode(charcode);
9
-
10
- // Allow digits, minus sign at the beginning, and Ctrl key combinations
11
- const re = /^-?\d*$/;
12
-
13
- if (!re.test(inputChar) && charcode > 9 && !e.ctrlKey) {
14
- if (e.preventDefault) {
15
- e.preventDefault();
16
- } else {
17
- e.returnValue = false;
18
- }
19
- }
20
- });
21
- }
22
- });
4
+ export default intNumberDirective;
5
+ /* eslint-disable-next-line no-console */
6
+ console.warn(`Importing intNumberDirective from plugins has been deprecated, use shell/directives/int-number.js instead.
7
+ Make sure to invoke it using Vue.directive('intNumber', intNumberDirective) to maintain compatibility.`);
8
+ Vue.directive('intNumber', intNumberDirective);
package/plugins/plugin.js CHANGED
@@ -32,7 +32,7 @@ export default async function(context) {
32
32
  // Fetch list of installed plugins from endpoint
33
33
  try {
34
34
  const res = await context.store.dispatch('management/request', {
35
- url: `${ UI_PLUGIN_BASE_URL }/index.json`,
35
+ url: `${ UI_PLUGIN_BASE_URL }`,
36
36
  method: 'GET',
37
37
  headers: { accept: 'application/json' },
38
38
  redirectUnauthorized: false,
@@ -68,10 +68,10 @@ export default async function(context) {
68
68
  const res = pluginLoads[name];
69
69
 
70
70
  if (res?.status === 'rejected') {
71
- console.error(`Failed to load plugin: ${ name }`); // eslint-disable-line no-console
71
+ console.error(`Failed to load plugin: ${ name }. `, res.reason || 'Unknown reason'); // eslint-disable-line no-console
72
72
 
73
73
  // Record error in the uiplugins store, so that we can show this to the user
74
- context.store.dispatch('uiplugins/setError', { name, error: 'plugins.error.load' });
74
+ context.store.dispatch('uiplugins/setError', { name, error: 'plugins.error.load' }); // i18n-uses plugins.error.load
75
75
  }
76
76
  });
77
77
  }
@@ -1,19 +1,8 @@
1
1
  import Vue from 'vue';
2
+ import positiveIntNumberDirective from '@shell/directives/positive-int-number';
2
3
 
3
- export default Vue.directive('positiveIntNumber', {
4
- inserted(el) {
5
- el.addEventListener('keypress', (e) => {
6
- e = e || window.event;
7
- const charcode = typeof e.charCode === 'number' ? e.charCode : e.keyCode;
8
- const re = /^\d+$/; // Use regex to match positive numbers
9
-
10
- if (!re.test(String.fromCharCode(charcode)) && charcode > 9 && !e.ctrlKey) {
11
- if (e.preventDefault) {
12
- e.preventDefault();
13
- } else {
14
- e.returnValue = false;
15
- }
16
- }
17
- });
18
- }
19
- });
4
+ export default positiveIntNumberDirective;
5
+ /* eslint-disable-next-line no-console */
6
+ console.warn(`Importing positiveIntNumberDirective from plugins has been deprecated, use shell/directives/positive-int-number.js instead.
7
+ Make sure to invoke it using Vue.directive('positiveIntNumber', positiveIntNumberDirective) to maintain compatibility.`);
8
+ Vue.directive('positiveIntNumber', positiveIntNumberDirective);