@rancher/shell 0.5.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (581) hide show
  1. package/assets/data/aws-regions.json +9 -0
  2. package/assets/images/vendor/openid.svg +18 -0
  3. package/assets/styles/app.scss +1 -2
  4. package/assets/styles/fonts/_icons.scss +3 -3
  5. package/assets/styles/global/_columns.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +2 -0
  7. package/assets/styles/themes/_csp.scss +2 -2
  8. package/assets/styles/themes/_dark.scss +8 -2
  9. package/assets/styles/themes/_light.scss +2 -1
  10. package/assets/styles/themes/_suse.scss +1 -1
  11. package/assets/styles/vendor/vue-select.scss +5 -0
  12. package/assets/translations/en-us.yaml +296 -58
  13. package/assets/translations/zh-hans.yaml +5 -27
  14. package/babel.config.js +1 -1
  15. package/chart/__tests__/S3.test.ts +9 -2
  16. package/chart/monitoring/grafana/index.vue +6 -2
  17. package/chart/monitoring/prometheus/index.vue +2 -2
  18. package/chart/rancher-backup/S3.vue +11 -9
  19. package/chart/rancher-backup/index.vue +15 -5
  20. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  21. package/cloud-credential/generic.vue +18 -9
  22. package/cloud-credential/harvester.vue +11 -3
  23. package/components/AppModal.vue +167 -0
  24. package/components/AssignTo.vue +7 -4
  25. package/components/AsyncButton.vue +18 -5
  26. package/components/BackLink.vue +4 -4
  27. package/components/BannerGraphic.vue +1 -0
  28. package/components/BrandImage.vue +47 -1
  29. package/components/Carousel.vue +14 -8
  30. package/components/Certificates.vue +8 -11
  31. package/components/ClusterBadge.vue +12 -3
  32. package/components/ClusterIconMenu.vue +44 -16
  33. package/components/ClusterProviderIcon.vue +14 -3
  34. package/components/CodeMirror.vue +73 -38
  35. package/components/CommunityLinks.vue +12 -8
  36. package/components/CreateDriver.vue +81 -0
  37. package/components/CruResource.vue +51 -27
  38. package/components/DetailTop.vue +2 -2
  39. package/components/Dialog.vue +6 -5
  40. package/components/DisableAuthProviderModal.vue +14 -8
  41. package/components/DraggableZone.vue +2 -2
  42. package/components/ExplorerMembers.vue +3 -3
  43. package/components/ExplorerProjectsNamespaces.vue +6 -6
  44. package/components/FixedBanner.vue +47 -36
  45. package/components/GlobalRoleBindings.vue +26 -0
  46. package/components/Import.vue +10 -6
  47. package/components/Inactivity.vue +1 -5
  48. package/components/KeyValueView.vue +14 -10
  49. package/components/MessageLink.vue +2 -2
  50. package/components/ModalWithCard.vue +5 -8
  51. package/components/MoveModal.vue +35 -33
  52. package/components/PodSecurityAdmission.vue +3 -3
  53. package/components/PromptChangePassword.vue +33 -33
  54. package/components/PromptModal.vue +11 -21
  55. package/components/PromptRemove.vue +11 -17
  56. package/components/PromptRestore.vue +18 -16
  57. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  58. package/components/Questions/__tests__/Float.test.ts +9 -19
  59. package/components/Questions/__tests__/Int.test.ts +9 -19
  60. package/components/Questions/__tests__/String.test.ts +9 -19
  61. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  62. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  63. package/components/Questions/index.vue +18 -2
  64. package/components/ResourceCancelModal.vue +34 -29
  65. package/components/ResourceDetail/Masthead.vue +23 -7
  66. package/components/ResourceDetail/index.vue +5 -0
  67. package/components/ResourceList/Masthead.vue +28 -10
  68. package/components/ResourceList/index.vue +65 -14
  69. package/components/ResourceTable.vue +73 -19
  70. package/components/ResourceYaml.vue +1 -0
  71. package/components/SelectIconGrid.vue +3 -3
  72. package/components/SideNav.vue +15 -37
  73. package/components/SingleClusterInfo.vue +4 -4
  74. package/components/SortableTable/THead.vue +26 -12
  75. package/components/SortableTable/filtering.js +9 -1
  76. package/components/SortableTable/grouping.js +8 -1
  77. package/components/SortableTable/index.vue +142 -42
  78. package/components/SortableTable/paging.js +36 -7
  79. package/components/SortableTable/selection.js +2 -1
  80. package/components/SortableTable/sorting.js +24 -7
  81. package/components/TabTitle.vue +84 -0
  82. package/components/Tabbed/index.vue +6 -1
  83. package/components/TableDataUserIcon.vue +47 -0
  84. package/components/TypeDescription.vue +1 -0
  85. package/components/Wizard.vue +1 -0
  86. package/components/__tests__/AppModal.test.ts +98 -0
  87. package/components/__tests__/AsyncButton.test.ts +1 -3
  88. package/components/__tests__/BackLink.test.ts +1 -1
  89. package/components/__tests__/ButtonGroup.test.ts +3 -6
  90. package/components/__tests__/Carousel.test.ts +43 -0
  91. package/components/__tests__/Certificates.test.ts +29 -0
  92. package/components/__tests__/{CodeMirror.spec.ts → CodeMirror.test.ts} +5 -17
  93. package/components/__tests__/CruResource.test.ts +10 -9
  94. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  95. package/components/__tests__/FixedBanner.test.ts +5 -20
  96. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  97. package/components/__tests__/TabTitle.test.ts +129 -0
  98. package/components/auth/AzureWarning.vue +2 -2
  99. package/components/auth/RoleDetailEdit.vue +10 -0
  100. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  101. package/components/auth/login/oidc.vue +7 -1
  102. package/components/fleet/FleetClusters.vue +9 -9
  103. package/components/fleet/FleetIntro.vue +11 -17
  104. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  105. package/components/fleet/FleetRepos.vue +1 -0
  106. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  107. package/components/form/ArrayList.vue +30 -19
  108. package/components/form/ArrayListSelect.vue +9 -4
  109. package/components/form/ClusterAppearance.vue +132 -0
  110. package/components/form/ColorInput.vue +1 -0
  111. package/components/form/Error.vue +3 -3
  112. package/components/form/Footer.vue +2 -2
  113. package/components/form/GitPicker.vue +83 -38
  114. package/components/form/KeyValue.vue +67 -48
  115. package/components/form/LabeledSelect.vue +143 -43
  116. package/components/form/Labels.vue +3 -1
  117. package/components/form/NameNsDescription.vue +26 -9
  118. package/components/form/ResourceLabeledSelect.vue +187 -0
  119. package/components/form/ResourceTabs/index.vue +31 -15
  120. package/components/form/SecretSelector.vue +93 -18
  121. package/components/form/Select.vue +1 -1
  122. package/components/form/SelectOrCreateAuthSecret.vue +135 -62
  123. package/components/form/SimpleSecretSelector.vue +88 -28
  124. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  125. package/components/form/__tests__/KeyValue.test.ts +121 -12
  126. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  127. package/components/form/__tests__/NameNsDescription.test.ts +25 -15
  128. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  129. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  130. package/components/formatter/AppSummaryGraph.vue +2 -2
  131. package/components/formatter/CloudCredPublicData.vue +30 -0
  132. package/components/formatter/ClusterLink.vue +2 -2
  133. package/components/formatter/FleetSummaryGraph.vue +2 -1
  134. package/components/formatter/ImagePercentageBar.vue +0 -4
  135. package/components/formatter/IngressTarget.vue +18 -7
  136. package/components/formatter/Link.vue +2 -2
  137. package/components/formatter/LinkDetail.vue +2 -2
  138. package/components/formatter/LinkDetailImage.vue +2 -2
  139. package/components/formatter/LinkName.vue +2 -2
  140. package/components/formatter/LiveDate.vue +16 -0
  141. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  142. package/components/formatter/SecretType.vue +2 -2
  143. package/components/formatter/VirtualServiceGateways.vue +2 -2
  144. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  145. package/components/nav/Group.vue +7 -5
  146. package/components/nav/Header.vue +82 -43
  147. package/components/nav/NamespaceFilter.vue +8 -1
  148. package/components/nav/TopLevelMenu.vue +336 -125
  149. package/components/nav/Type.vue +58 -102
  150. package/components/nav/__tests__/TopLevelMenu.test.ts +370 -9
  151. package/components/nav/__tests__/Type.test.ts +321 -126
  152. package/components/nuxt/nuxt-child.js +0 -5
  153. package/components/nuxt/nuxt-error.vue +1 -1
  154. package/components/nuxt/nuxt-link.client.js +13 -95
  155. package/components/templates/default.vue +3 -3
  156. package/components/templates/error.vue +6 -10
  157. package/components/templates/standalone.vue +0 -4
  158. package/components/templates/unauthenticated.vue +1 -2
  159. package/components/user.retention/user-retention-header.vue +34 -0
  160. package/composables/useCompactInput.test.ts +36 -0
  161. package/composables/useCompactInput.ts +2 -2
  162. package/composables/useI18n.ts +26 -0
  163. package/composables/useLabeledFormElement.test.ts +135 -0
  164. package/composables/useStore.ts +16 -0
  165. package/config/home-links.js +32 -1
  166. package/config/labels-annotations.js +2 -1
  167. package/config/middleware.js +0 -6
  168. package/config/pagination-table-headers.js +57 -0
  169. package/config/pod-security-admission.ts +1 -1
  170. package/config/private-label.js +1 -3
  171. package/config/product/auth.js +1 -0
  172. package/config/product/explorer.js +167 -46
  173. package/config/product/legacy.js +3 -95
  174. package/config/product/manager.js +44 -11
  175. package/config/query-params.js +1 -0
  176. package/config/roles.ts +23 -0
  177. package/config/router/index.js +23 -0
  178. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  179. package/config/router/navigation-guards/authentication.js +63 -0
  180. package/config/router/navigation-guards/index.js +15 -0
  181. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  182. package/config/router/routes.js +487 -0
  183. package/config/settings.ts +38 -2
  184. package/config/store.js +7 -3
  185. package/config/table-headers.js +46 -1
  186. package/config/types.js +36 -16
  187. package/config/uiplugins.js +10 -5
  188. package/core/plugin-helpers.js +1 -1
  189. package/core/plugin.ts +2 -1
  190. package/core/plugins.js +289 -282
  191. package/creators/app/files/.eslintignore +0 -2
  192. package/creators/app/files/.vscode/settings.json +0 -1
  193. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  194. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  195. package/creators/pkg/init +32 -0
  196. package/detail/__tests__/service.test.ts +62 -0
  197. package/detail/catalog.cattle.io.app.vue +1 -1
  198. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  199. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  200. package/detail/namespace.vue +2 -2
  201. package/detail/networking.k8s.io.ingress.vue +52 -19
  202. package/detail/node.vue +20 -43
  203. package/detail/pod.vue +1 -68
  204. package/detail/provisioning.cattle.io.cluster.vue +2 -1
  205. package/detail/service.vue +1 -1
  206. package/detail/workload/index.vue +2 -15
  207. package/dialog/AddCustomBadgeDialog.vue +318 -161
  208. package/dialog/DeactivateDriverDialog.vue +118 -0
  209. package/dialog/RollbackWorkloadDialog.vue +2 -2
  210. package/dialog/RotateCertificatesDialog.vue +0 -21
  211. package/directives/clean-html.js +15 -0
  212. package/directives/clean-tooltip.js +32 -0
  213. package/directives/focus.js +41 -0
  214. package/directives/int-number.js +21 -0
  215. package/directives/positive-int-number.js +19 -0
  216. package/directives/trim-whitespace.js +19 -0
  217. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  218. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  219. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  220. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  221. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  222. package/edit/__tests__/nodeDriver.test.ts +107 -0
  223. package/edit/__tests__/service.test.ts +1 -5
  224. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  225. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  226. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  227. package/edit/auth/__tests__/azuread.test.ts +241 -0
  228. package/edit/auth/__tests__/oidc.test.ts +137 -0
  229. package/edit/auth/azuread.vue +133 -31
  230. package/edit/auth/github.vue +5 -17
  231. package/edit/auth/googleoauth.vue +5 -18
  232. package/edit/auth/ldap/index.vue +5 -17
  233. package/edit/auth/oidc.vue +143 -42
  234. package/edit/auth/saml.vue +5 -14
  235. package/edit/catalog.cattle.io.clusterrepo.vue +175 -20
  236. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  237. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  238. package/edit/cloudcredential.vue +26 -4
  239. package/edit/configmap.vue +10 -4
  240. package/edit/fleet.cattle.io.gitrepo.vue +7 -4
  241. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  242. package/edit/kontainerDriver.vue +65 -0
  243. package/edit/logging-flow/Match.vue +10 -9
  244. package/edit/logging-flow/index.vue +4 -19
  245. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  246. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  247. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  248. package/edit/management.cattle.io.project.vue +2 -1
  249. package/edit/management.cattle.io.setting.vue +20 -0
  250. package/edit/management.cattle.io.user.vue +2 -1
  251. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  252. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  253. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +1 -0
  254. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +3 -0
  255. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +2 -0
  256. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  257. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  258. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  259. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  260. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  261. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  262. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +45 -6
  263. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/selectors.test.ts +1 -1
  264. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  265. package/edit/nodeDriver.vue +65 -0
  266. package/edit/persistentvolume/index.vue +2 -2
  267. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +18 -9
  268. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +165 -1
  269. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +1 -1
  270. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +0 -3
  271. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  272. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +70 -12
  273. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +5 -0
  274. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  275. package/edit/provisioning.cattle.io.cluster/index.vue +21 -15
  276. package/edit/provisioning.cattle.io.cluster/rke2.vue +185 -114
  277. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +67 -7
  278. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +19 -6
  279. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  280. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +7 -0
  281. package/edit/provisioning.cattle.io.cluster/tabs/etcd/S3Config.vue +1 -0
  282. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +1 -0
  283. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +3 -0
  284. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +1 -0
  285. package/edit/resources.cattle.io.backup.vue +139 -124
  286. package/edit/resources.cattle.io.restore.vue +146 -126
  287. package/edit/service.vue +1 -0
  288. package/edit/serviceaccount.vue +46 -4
  289. package/edit/workload/__tests__/Job.test.ts +1 -3
  290. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  291. package/edit/workload/mixins/workload.js +34 -1
  292. package/edit/workload/storage/emptyDir.vue +2 -2
  293. package/initialize/App.vue +75 -0
  294. package/initialize/app-extended.js +128 -0
  295. package/initialize/entry-helpers.js +549 -0
  296. package/initialize/entry.js +32 -0
  297. package/initialize/install-components.js +23 -0
  298. package/initialize/install-directives.js +59 -0
  299. package/initialize/install-plugins.js +123 -0
  300. package/list/__tests__/workload.test.ts +1 -1
  301. package/list/cis.cattle.io.clusterscan.vue +16 -10
  302. package/list/group.principal.vue +2 -2
  303. package/list/management.cattle.io.feature.vue +11 -7
  304. package/list/management.cattle.io.user.vue +36 -3
  305. package/list/networking.k8s.io.ingress.vue +36 -0
  306. package/list/node.vue +211 -73
  307. package/list/provisioning.cattle.io.cluster.vue +17 -4
  308. package/list/ui.cattle.io.navlink.vue +2 -2
  309. package/list/workload.vue +22 -0
  310. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  311. package/machine-config/__tests__/vmwarevsphere.test.ts +162 -59
  312. package/machine-config/amazonec2.vue +1 -1
  313. package/machine-config/azure.vue +38 -21
  314. package/machine-config/generic.vue +11 -15
  315. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  316. package/machine-config/vmwarevsphere.vue +20 -11
  317. package/middleware/authenticated.js +9 -361
  318. package/mixins/__tests__/chart.test.ts +48 -6
  319. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  320. package/mixins/auth-config.js +3 -2
  321. package/mixins/brand.js +75 -57
  322. package/mixins/chart.js +27 -13
  323. package/mixins/create-edit-view/index.js +2 -2
  324. package/mixins/fetch.client.js +42 -48
  325. package/mixins/labeled-form-element.ts +21 -1
  326. package/mixins/page-actions.js +7 -5
  327. package/mixins/resource-fetch-api-pagination.js +304 -0
  328. package/mixins/resource-fetch-namespaced.js +1 -1
  329. package/mixins/resource-fetch.js +46 -5
  330. package/models/__tests__/cluster.test.ts +44 -0
  331. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  332. package/models/__tests__/schema.tests.ts +24 -0
  333. package/models/__tests__/steve-schema.test.ts +73 -0
  334. package/models/__tests__/workload.test.ts +1 -1
  335. package/models/catalog.cattle.io.app.js +8 -0
  336. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  337. package/models/catalog.cattle.io.uiplugin.js +7 -8
  338. package/models/cis.cattle.io.clusterscan.js +29 -8
  339. package/models/cloudcredential.js +9 -1
  340. package/models/cluster/node.js +4 -0
  341. package/models/cluster/schema.js +6 -0
  342. package/models/cluster.js +33 -0
  343. package/models/driver.js +62 -0
  344. package/models/fleet.cattle.io.cluster.js +23 -11
  345. package/models/fleet.cattle.io.gitrepo.js +10 -0
  346. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  347. package/models/kontainerdriver.js +68 -0
  348. package/models/management/schema.js +6 -0
  349. package/models/management.cattle.io.authconfig.js +3 -2
  350. package/models/management.cattle.io.cluster.js +5 -4
  351. package/models/management.cattle.io.globalrole.js +2 -0
  352. package/models/management.cattle.io.user.js +67 -2
  353. package/models/monitoring.coreos.com.receiver.js +3 -1
  354. package/models/monitoring.coreos.com.route.js +1 -1
  355. package/models/networking.k8s.io.ingress.js +2 -1
  356. package/models/nodedriver.js +68 -0
  357. package/models/provisioning.cattle.io.cluster.js +34 -1
  358. package/models/schema.js +28 -7
  359. package/models/service.js +2 -0
  360. package/models/steve-schema.ts +254 -0
  361. package/models/workload.js +1 -0
  362. package/package.json +6 -5
  363. package/pages/about.vue +12 -5
  364. package/pages/account/index.vue +7 -2
  365. package/pages/auth/login.vue +106 -102
  366. package/pages/auth/logout.vue +2 -2
  367. package/pages/auth/setup.vue +57 -64
  368. package/pages/auth/verify.vue +17 -17
  369. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  370. package/pages/c/_cluster/apps/charts/index.vue +37 -13
  371. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  372. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  373. package/pages/c/_cluster/auth/config/index.vue +15 -9
  374. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  375. package/pages/c/_cluster/auth/user.retention/index.vue +384 -0
  376. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  377. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  378. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  379. package/pages/c/_cluster/explorer/index.vue +231 -72
  380. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  381. package/pages/c/_cluster/explorer/tools/index.vue +12 -176
  382. package/pages/c/_cluster/fleet/index.vue +88 -93
  383. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  384. package/pages/c/_cluster/longhorn/index.vue +52 -17
  385. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  386. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  387. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  388. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +94 -0
  389. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  390. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  391. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +63 -0
  392. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  393. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  394. package/pages/c/_cluster/monitoring/index.vue +1 -17
  395. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  396. package/pages/c/_cluster/neuvector/index.vue +1 -0
  397. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  398. package/pages/c/_cluster/settings/banners.vue +86 -8
  399. package/pages/c/_cluster/settings/brand.vue +258 -36
  400. package/pages/c/_cluster/settings/index.vue +4 -4
  401. package/pages/c/_cluster/settings/links.vue +5 -3
  402. package/pages/c/_cluster/settings/performance.vue +71 -2
  403. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  404. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +10 -7
  405. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  406. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  407. package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
  408. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  409. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  410. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  411. package/pages/c/_cluster/uiplugins/index.vue +38 -52
  412. package/pages/diagnostic.vue +1 -0
  413. package/pages/fail-whale.vue +103 -41
  414. package/pages/home.vue +81 -24
  415. package/pages/prefs.vue +8 -3
  416. package/pages/support/index.vue +12 -2
  417. package/plugins/clean-html-directive.js +5 -12
  418. package/plugins/clean-tooltip-directive.js +6 -31
  419. package/plugins/codemirror.js +0 -9
  420. package/plugins/dashboard-store/__tests__/mutations.test.ts +296 -313
  421. package/plugins/dashboard-store/actions.js +140 -32
  422. package/plugins/dashboard-store/getters.js +86 -39
  423. package/plugins/dashboard-store/index.js +0 -99
  424. package/plugins/dashboard-store/mutations.js +150 -48
  425. package/plugins/dashboard-store/resource-class.js +14 -109
  426. package/plugins/directives.js +6 -39
  427. package/plugins/ember-cookie.js +13 -0
  428. package/plugins/global-formatters.js +26 -5
  429. package/plugins/i18n.js +90 -56
  430. package/plugins/int-number.js +6 -20
  431. package/plugins/plugin.js +3 -3
  432. package/plugins/positive-int-number.js +6 -17
  433. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +124 -31
  434. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  435. package/plugins/steve/__tests__/subscribe.spec.ts +109 -0
  436. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  437. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  438. package/plugins/steve/actions.js +0 -1
  439. package/plugins/steve/getters.js +183 -63
  440. package/plugins/steve/hybrid-class.js +5 -1
  441. package/plugins/steve/mutations.js +29 -5
  442. package/plugins/steve/norman-class.js +123 -2
  443. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  444. package/plugins/steve/schema.d.ts +22 -0
  445. package/plugins/steve/steve-pagination-utils.ts +368 -0
  446. package/plugins/steve/subscribe.js +37 -75
  447. package/plugins/trim-whitespace.js +6 -34
  448. package/plugins/vue-js-modal.js +1 -1
  449. package/public/index.html +1 -0
  450. package/rancher-components/Accordion/Accordion.vue +3 -2
  451. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  452. package/rancher-components/Banner/Banner.test.ts +1 -5
  453. package/rancher-components/Banner/Banner.vue +2 -2
  454. package/rancher-components/Card/Card.vue +4 -4
  455. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  456. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  457. package/rancher-components/Form/LabeledInput/LabeledInput.vue +66 -30
  458. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  459. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  460. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  461. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  462. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  463. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  464. package/rancher-components/StringList/StringList.vue +8 -8
  465. package/rancher-components/components/Accordion/Accordion.vue +3 -2
  466. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  467. package/rancher-components/components/Banner/Banner.test.ts +1 -5
  468. package/rancher-components/components/Banner/Banner.vue +2 -2
  469. package/rancher-components/components/Card/Card.vue +4 -4
  470. package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
  471. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  472. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +66 -30
  473. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
  474. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  475. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  476. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  477. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  478. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  479. package/rancher-components/components/StringList/StringList.vue +8 -8
  480. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +27 -8
  481. package/scripts/clean +1 -1
  482. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  483. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  484. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  485. package/scripts/extension/helm/package/Dockerfile +1 -1
  486. package/scripts/extension/helm/scripts/patch +27 -0
  487. package/scripts/extension/publish +6 -6
  488. package/scripts/serve-pkgs +0 -2
  489. package/scripts/test-plugins-build.sh +6 -6
  490. package/scripts/vue-migrate.js +683 -0
  491. package/store/__tests__/catalog.test.ts +224 -0
  492. package/store/auth.js +23 -4
  493. package/store/aws.js +53 -6
  494. package/store/catalog.js +21 -5
  495. package/store/cru-resource.ts +26 -0
  496. package/store/customisation.js +35 -0
  497. package/store/features.js +6 -4
  498. package/store/index.js +132 -39
  499. package/store/plugins.js +8 -4
  500. package/store/type-map.js +143 -143
  501. package/store/type-map.utils.ts +226 -0
  502. package/tsconfig.json +0 -1
  503. package/tsconfig.paths.json +4 -1
  504. package/types/components/labeledSelect.ts +50 -0
  505. package/types/resources/settings.d.ts +32 -0
  506. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  507. package/types/shell/index.d.ts +996 -782
  508. package/types/store/dashboard-store.types.ts +42 -0
  509. package/types/store/pagination.types.ts +457 -0
  510. package/types/store/type-map.ts +30 -0
  511. package/types/store/vuex.d.ts +9 -0
  512. package/types/vue-shim.d.ts +51 -0
  513. package/utils/__tests__/cluster.test.ts +20 -18
  514. package/utils/__tests__/create-yaml.test.ts +359 -2
  515. package/utils/__tests__/kontainer.test.ts +92 -0
  516. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  517. package/utils/alertmanagerconfig.js +19 -0
  518. package/utils/array.ts +40 -1
  519. package/utils/async.ts +2 -0
  520. package/utils/auth.js +152 -4
  521. package/utils/axios.js +2 -2
  522. package/utils/banners.js +103 -0
  523. package/utils/cluster.js +1 -1
  524. package/utils/config.js +4 -0
  525. package/utils/create-yaml.js +54 -27
  526. package/utils/error.js +25 -0
  527. package/utils/formatter.js +5 -3
  528. package/utils/git.ts +1 -1
  529. package/utils/install-redirect.js +1 -1
  530. package/utils/kontainer.ts +186 -0
  531. package/utils/monitoring.js +2 -37
  532. package/utils/pagination-utils.ts +154 -0
  533. package/utils/pod-security-admission.ts +1 -1
  534. package/utils/router.js +86 -0
  535. package/utils/settings.ts +46 -0
  536. package/utils/socket.js +1 -0
  537. package/utils/time.js +1 -0
  538. package/utils/title.ts +3 -0
  539. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  540. package/utils/validators/formRules/__tests__/index.test.ts +21 -0
  541. package/utils/validators/formRules/index.ts +3 -0
  542. package/utils/validators/index.js +1 -0
  543. package/vue.config.js +376 -421
  544. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  545. package/chart/monitoring/steps/uninstall-v1.vue +0 -135
  546. package/components/EventsTable.vue +0 -67
  547. package/components/TabbedLinks/index.vue +0 -94
  548. package/components/nuxt/nuxt-link.server.js +0 -16
  549. package/components/nuxt/nuxt.js +0 -101
  550. package/config/router.js +0 -425
  551. package/initialize/App.js +0 -152
  552. package/initialize/client.js +0 -734
  553. package/initialize/index.js +0 -287
  554. package/middleware/i18n.js +0 -10
  555. package/middleware/unauthenticated.js +0 -22
  556. package/mixins/v1-workload-metrics.js +0 -43
  557. package/pages/c/_cluster/apps/index.vue +0 -15
  558. package/pages/c/_cluster/auth/index.vue +0 -17
  559. package/pages/c/_cluster/index.vue +0 -15
  560. package/pages/c/_cluster/legacy/index.vue +0 -22
  561. package/pages/c/_cluster/manager/index.vue +0 -22
  562. package/pages/c/_cluster/mcapps/index.vue +0 -21
  563. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  564. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  565. package/plugins/index.js +0 -11
  566. package/plugins/portal-vue.js +0 -4
  567. package/plugins/portal.js +0 -4
  568. package/plugins/resize.js +0 -5
  569. package/plugins/shortkey.js +0 -4
  570. package/plugins/tooltip.js +0 -4
  571. package/plugins/v-select.js +0 -4
  572. package/utils/group.js +0 -70
  573. package/utils/nuxt.js +0 -638
  574. package/utils/router.scrollBehavior.js +0 -78
  575. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  576. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  577. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  578. /package/plugins/steve/__tests__/{steve-class.spec.ts → steve-class.test.ts} +0 -0
  579. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  580. /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  581. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import Vue from 'vue';
1
+ import Vue, { markRaw } from 'vue';
2
2
  import { addObject, addObjects, clear, removeObject } from '@shell/utils/array';
3
3
  import { SCHEMA, COUNT } from '@shell/config/types';
4
4
  import { normalizeType, keyFieldFor } from '@shell/plugins/dashboard-store/normalize';
@@ -14,15 +14,31 @@ function registerType(state, type) {
14
14
  list: [],
15
15
  haveAll: false,
16
16
  haveSelector: {},
17
- haveNamespace: undefined, // If the cached list only contains resources for a namespace, this will contain the ns name
18
- revision: 0, // The highest known resourceVersion from the server for this type
19
- generation: 0, // Updated every time something is loaded for this type
20
- loadCounter: 0, // Used to cancel incremental loads if the page changes during load
17
+ /**
18
+ * If the cached list only contains resources for a namespace, this will contain the ns name
19
+ */
20
+ haveNamespace: undefined,
21
+ /**
22
+ * If the cached list only contains resources from a pagination request, this will contain the pagination settings (`StorePagination`)
23
+ */
24
+ havePage: undefined,
25
+ /**
26
+ * The highest known resourceVersion from the server for this type
27
+ */
28
+ revision: 0,
29
+ /**
30
+ * Updated every time something is loaded for this type
31
+ */
32
+ generation: 0,
33
+ /**
34
+ * Used to cancel incremental loads if the page changes during load
35
+ */
36
+ loadCounter: 0,
37
+
38
+ // Not enumerable so they don't get sent back to the client for SSR
39
+ map: markRaw(new Map()),
21
40
  };
22
41
 
23
- // Not enumerable so they don't get sent back to the client for SSR
24
- Object.defineProperty(cache, 'map', { value: new Map() });
25
-
26
42
  Vue.set(state.types, type, cache);
27
43
  }
28
44
 
@@ -47,11 +63,28 @@ function replaceResource(existing, data, getters) {
47
63
  return replace(existing, data);
48
64
  }
49
65
 
50
- export function load(state, { data, ctx, existing }) {
66
+ /**
67
+ * `load` can be called as part of a loop. to avoid common look ups create them up front and pass as `cachedArgs`
68
+ */
69
+ export function createLoadArgs(ctx, dataType) {
51
70
  const { getters } = ctx;
52
- let type = normalizeType(data.type);
71
+ const type = normalizeType(dataType);
53
72
  const keyField = getters.keyFieldForType(type);
54
73
  const opts = ctx.rootGetters[`type-map/optionsFor`](type);
74
+
75
+ return {
76
+ type, keyField, opts
77
+ };
78
+ }
79
+
80
+ export function load(state, {
81
+ data, ctx, existing, cachedArgs
82
+ }) {
83
+ const { getters } = ctx;
84
+ // Optimisation. This can run once per resource loaded.., so pass in from parent
85
+ const { type: cachedType, keyField, opts } = cachedArgs || createLoadArgs(ctx, data.type);
86
+ let type = cachedType;
87
+
55
88
  const limit = opts?.limit;
56
89
 
57
90
  // Inject special fields for indexing schemas
@@ -65,37 +98,52 @@ export function load(state, { data, ctx, existing }) {
65
98
 
66
99
  cache.generation++;
67
100
 
68
- let entry;
101
+ let entry = cache.map.get(id);
102
+ const inMap = !!entry;
69
103
 
104
+ //
105
+ // Determine the `entry` that should be in the local map and list cache
106
+ //
70
107
  if ( existing && !existing.id ) {
71
- // A specific proxy instance to used was passed in (for create -> save),
72
- // use it instead of making a new proxy
73
- entry = replaceResource(existing, data, getters);
74
- addObject(cache.list, entry);
75
- cache.map.set(id, entry);
76
- // console.log('### Mutation added from existing proxy', type, id);
77
- } else {
78
- entry = cache.map.get(id);
108
+ // A specific proxy instance to use was passed in (for create -> save), use it instead of making a new proxy
109
+ // `existing` is a classified resource created locally that is most probably not in the store (unless a slow connection means it's added by socket before the API responds)
110
+ // Note - `existing` has no `id` because the resource was created locally and not supplied by Rancher API
79
111
 
80
- if ( entry ) {
81
- // There's already an entry in the store, update it
82
- replaceResource(entry, data, getters);
83
- // console.log('### Mutation Updated', type, id);
112
+ // Get the latest and greatest version of the resource
113
+ const latestEntry = replaceResource(existing, data, getters);
114
+
115
+ if (inMap) {
116
+ // There's already an entry in the store, so merge changes into it. The list entry is a reference to the map (and vice versa)
117
+ entry = replaceResource(entry, latestEntry, getters);
118
+ } else {
119
+ // There's no entry, using existing proxy
120
+ entry = latestEntry;
121
+ }
122
+ } else {
123
+ if (inMap) {
124
+ // There's already an entry in the store, so merge changes into it. The list entry is a reference to the map (and vice versa)
125
+ entry = replaceResource(entry, data, getters);
84
126
  } else {
85
127
  // There's no entry, make a new proxy
86
128
  entry = classify(ctx, data);
87
- addObject(cache.list, entry);
88
- cache.map.set(id, entry);
89
- // console.log('### Mutation', type, id);
129
+ }
130
+ }
90
131
 
91
- // If there is a limit to the number of resources we can store for this type then
92
- // remove the first one to keep the list size to that limit
93
- if (limit && cache.list.length > limit) {
94
- const rm = cache.list.shift();
132
+ //
133
+ // Ensure the `entry` is in both both list and cache
134
+ // Note - We should be safe assuming the two collections have parity (not in map means not in list)
135
+ //
136
+ if (!inMap) {
137
+ cache.list.push(entry);
138
+ cache.map.set(id, entry);
139
+ }
95
140
 
96
- cache.map.delete(rm.id);
97
- }
98
- }
141
+ // If there is a limit to the number of resources we can store for this type then
142
+ // remove the first one to keep the list size to that limit
143
+ if (limit && cache.list.length > limit) {
144
+ const rm = cache.list.shift();
145
+
146
+ cache.map.delete(rm.id);
99
147
  }
100
148
 
101
149
  if ( data.baseType ) {
@@ -117,6 +165,7 @@ export function forgetType(state, type) {
117
165
  cache.haveAll = false;
118
166
  cache.haveSelector = {};
119
167
  cache.haveNamespace = undefined;
168
+ cache.havePage = undefined;
120
169
  cache.revision = 0;
121
170
  cache.generation = 0;
122
171
  clear(cache.list);
@@ -291,13 +340,39 @@ export function loadAll(state, {
291
340
 
292
341
  // Allow requester to skip setting that everything has loaded
293
342
  if (!skipHaveAll) {
294
- cache.haveNamespace = namespace;
295
- cache.haveAll = !namespace;
343
+ if (namespace) {
344
+ cache.havePage = false;
345
+ cache.haveNamespace = namespace;
346
+ cache.haveAll = false;
347
+ } else {
348
+ cache.havePage = false;
349
+ cache.haveNamespace = false;
350
+ cache.haveAll = true;
351
+ }
296
352
  }
297
353
 
298
354
  return proxies;
299
355
  }
300
356
 
357
+ /**
358
+ * Add a set of resources to the store for a given type
359
+ *
360
+ * Don't mark the 'haveAll' field - this is used for incremental loading
361
+ */
362
+ export function loadAdd(state, { type, data: allLatest, ctx }) {
363
+ const { getters } = ctx;
364
+ const keyField = getters.keyFieldForType(type);
365
+ const cachedArgs = createLoadArgs(ctx, allLatest?.[0]?.type);
366
+
367
+ allLatest.forEach((entry) => {
368
+ const existing = state.types[type].map.get(entry[keyField]);
369
+
370
+ load(state, {
371
+ data: entry, ctx, existing, cachedArgs
372
+ });
373
+ });
374
+ }
375
+
301
376
  export default {
302
377
  registerType,
303
378
  load,
@@ -310,8 +385,12 @@ export default {
310
385
  Object.assign(state.config, config);
311
386
  },
312
387
 
388
+ /**
389
+ * Load multiple different types of resources
390
+ */
313
391
  loadMulti(state, { data, ctx }) {
314
392
  // console.log('### Mutation loadMulti', data?.length);
393
+
315
394
  for ( const entry of data ) {
316
395
  load(state, { data: entry, ctx });
317
396
  }
@@ -321,9 +400,12 @@ export default {
321
400
  type, entries, ctx, selector, revision
322
401
  }) {
323
402
  const cache = registerType(state, type);
403
+ const cachedArgs = createLoadArgs(ctx, entries?.[0]?.type);
324
404
 
325
405
  for ( const data of entries ) {
326
- load(state, { data, ctx });
406
+ load(state, {
407
+ data, ctx, cachedArgs
408
+ });
327
409
  }
328
410
 
329
411
  cache.haveSelector[selector] = true;
@@ -343,12 +425,13 @@ export default {
343
425
  // const allExisting = getters.all({type});
344
426
  const keyField = getters.keyFieldForType(type);
345
427
  const cache = state.types[type];
428
+ const cachedArgs = createLoadArgs(ctx, allLatest?.[0].type);
346
429
 
347
430
  allLatest.forEach((entry) => {
348
431
  const existing = state.types[type].map.get(entry[keyField]);
349
432
 
350
433
  load(state, {
351
- data: entry, ctx, existing
434
+ data: entry, ctx, existing, cachedArgs
352
435
  });
353
436
  });
354
437
  cache.list.forEach((entry) => {
@@ -358,19 +441,38 @@ export default {
358
441
  });
359
442
  },
360
443
 
361
- // Add a set of resources to the store for a given type
362
- // Don't mark the 'haveAll' field - this is used for incremental loading
363
- loadAdd(state, { type, data: allLatest, ctx }) {
364
- const { getters } = ctx;
365
- const keyField = getters.keyFieldForType(type);
444
+ loadAdd,
366
445
 
367
- allLatest.forEach((entry) => {
368
- const existing = state.types[type].map.get(entry[keyField]);
446
+ loadPage(state, {
447
+ type,
448
+ data,
449
+ ctx,
450
+ pagination,
451
+ }) {
452
+ if (!data) {
453
+ return;
454
+ }
369
455
 
370
- load(state, {
371
- data: entry, ctx, existing
372
- });
373
- });
456
+ const keyField = ctx.getters.keyFieldForType(type);
457
+ const proxies = data.map((x) => classify(ctx, x));
458
+ const cache = registerType(state, type);
459
+
460
+ clear(cache.list);
461
+ cache.map.clear();
462
+ cache.generation++;
463
+
464
+ addObjects(cache.list, proxies);
465
+
466
+ for ( let i = 0 ; i < proxies.length ; i++ ) {
467
+ cache.map.set(proxies[i][keyField], proxies[i]);
468
+ }
469
+
470
+ // havePage is of type `StorePagination`
471
+ cache.havePage = pagination;
472
+ cache.haveNamespace = undefined;
473
+ cache.haveAll = undefined;
474
+
475
+ return proxies;
374
476
  },
375
477
 
376
478
  forgetAll(state, { type }) {
@@ -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',
@@ -1138,10 +1122,10 @@ export default class Resource {
1138
1122
  */
1139
1123
  processSaveResponse(res) { }
1140
1124
 
1141
- async _save(opt = {}) {
1125
+ async _save(opt = { }) {
1142
1126
  const forNew = !this.id;
1143
1127
 
1144
- const errors = await this.validationErrors(this, opt.ignoreFields);
1128
+ const errors = this.validationErrors(this, opt);
1145
1129
 
1146
1130
  if (!isEmpty(errors)) {
1147
1131
  return Promise.reject(errors);
@@ -1260,11 +1244,11 @@ export default class Resource {
1260
1244
  // ------------------------------------------------------------------
1261
1245
 
1262
1246
  currentRoute() {
1263
- return window.$nuxt.$route;
1247
+ return window.$globalApp.$route;
1264
1248
  }
1265
1249
 
1266
1250
  currentRouter() {
1267
- return window.$nuxt.$router;
1251
+ return window.$globalApp.$router;
1268
1252
  }
1269
1253
 
1270
1254
  get listLocation() {
@@ -1674,93 +1658,14 @@ export default class Resource {
1674
1658
  return errors;
1675
1659
  }
1676
1660
 
1677
- validationErrors(data = this, ignoreFields) {
1678
- const errors = [];
1679
- const {
1680
- type: originalType,
1681
- schema
1682
- } = data;
1683
- const type = normalizeType(originalType);
1684
-
1685
- if ( !originalType ) {
1686
- // eslint-disable-next-line
1687
- console.warn(this.t('validation.noType'), data);
1688
-
1689
- return errors;
1690
- }
1691
-
1692
- if ( !schema ) {
1693
- // eslint-disable-next-line
1694
- // console.warn(this.t('validation.noSchema'), originalType, data);
1695
-
1696
- return errors;
1697
- }
1698
-
1699
- const fields = schema.resourceFields || {};
1700
- const keys = Object.keys(fields);
1701
- let field, key, val, displayKey;
1702
-
1703
- for ( let i = 0 ; i < keys.length ; i++ ) {
1704
- const fieldErrors = [];
1705
-
1706
- key = keys[i];
1707
- field = fields[key];
1708
- val = get(data, key);
1709
- displayKey = displayKeyFor(type, key, this.$rootGetters);
1710
-
1711
- const fieldType = field?.type ? normalizeType(field.type) : null;
1712
- const valIsString = isString(val);
1713
-
1714
- if ( ignoreFields && ignoreFields.includes(key) ) {
1715
- continue;
1716
- }
1717
-
1718
- if ( val === undefined ) {
1719
- val = null;
1720
- }
1721
-
1722
- if (valIsString) {
1723
- if (fieldType) {
1724
- Vue.set(data, key, coerceStringTypeToScalarType(val, fieldType));
1725
- }
1726
-
1727
- // Empty strings on nullable string fields -> null
1728
- if ( field.nullable && val.length === 0 && STRING_LIKE_TYPES.includes(fieldType)) {
1729
- val = null;
1730
-
1731
- Vue.set(data, key, val);
1732
- }
1733
- }
1734
- if (fieldType === 'boolean') {
1735
- validateBoolean(val, field, displayKey, this.$rootGetters, fieldErrors);
1736
- } else {
1737
- validateLength(val, field, displayKey, this.$rootGetters, fieldErrors);
1738
- validateChars(val, field, displayKey, this.$rootGetters, fieldErrors);
1739
- }
1740
-
1741
- if (fieldErrors.length > 0) {
1742
- fieldErrors.push(this.t('validation.required', { key: displayKey }));
1743
- errors.push(...fieldErrors);
1744
- continue;
1745
- }
1746
-
1747
- // IDs claim to be these but are lies...
1748
- if ( key !== 'id' && !isEmpty(val) && DNS_LIKE_TYPES.includes(fieldType) ) {
1749
- // DNS types should be lowercase
1750
- const tolower = (val || '').toLowerCase();
1751
-
1752
- if ( tolower !== val ) {
1753
- val = tolower;
1754
-
1755
- Vue.set(data, key, val);
1756
- }
1757
-
1758
- fieldErrors.push(...validateDnsLikeTypes(val, fieldType, displayKey, this.$rootGetters, fieldErrors));
1759
- }
1760
- errors.push(...fieldErrors);
1761
- }
1762
-
1763
- 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);
1764
1669
  }
1765
1670
 
1766
1671
  get ownersByType() {
@@ -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
+ }