@rancher/shell 0.2.4 → 0.3.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 (493) hide show
  1. package/assets/styles/themes/_dark.scss +4 -0
  2. package/assets/styles/themes/_light.scss +5 -0
  3. package/assets/translations/en-us.yaml +14 -2
  4. package/assets/translations/zh-hans.yaml +7 -5
  5. package/chart/istio.vue +1 -1
  6. package/chart/monitoring/grafana/index.vue +1 -1
  7. package/chart/monitoring/index.vue +1 -1
  8. package/chart/monitoring/prometheus/index.vue +4 -4
  9. package/components/AlertTable.vue +1 -1
  10. package/components/AssignTo.vue +1 -1
  11. package/components/AsyncButton.vue +2 -2
  12. package/components/BrandImage.vue +1 -1
  13. package/components/ButtonGroup.vue +1 -1
  14. package/components/ClusterProviderIcon.vue +2 -2
  15. package/components/Collapse.vue +6 -2
  16. package/components/CollapsibleCard.vue +2 -2
  17. package/components/ConsumptionGauge.vue +4 -4
  18. package/components/ContainerResourceLimit.vue +1 -1
  19. package/components/CountBox.vue +1 -1
  20. package/components/CountGauge.vue +1 -1
  21. package/components/CruResource.vue +2 -1
  22. package/components/DashboardMetrics.vue +2 -2
  23. package/components/ExplorerProjectsNamespaces.vue +6 -6
  24. package/components/FixedBanner.vue +6 -6
  25. package/components/GlobalRoleBindings.vue +6 -6
  26. package/components/GradientBox.vue +2 -2
  27. package/components/IconMessage.vue +4 -4
  28. package/components/Import.vue +5 -5
  29. package/components/InputOrDisplay.vue +1 -1
  30. package/components/KeyValueView.vue +1 -1
  31. package/components/LabelValue.vue +1 -1
  32. package/components/ModalWithCard.vue +1 -1
  33. package/components/MoveModal.vue +1 -1
  34. package/components/PercentageBar.vue +2 -2
  35. package/components/PromptChangePassword.vue +1 -1
  36. package/components/PromptModal.vue +1 -1
  37. package/components/PromptRemove.vue +2 -2
  38. package/components/PromptRestore.vue +13 -13
  39. package/components/Questions/Question.js +1 -1
  40. package/components/ResourceCancelModal.vue +3 -3
  41. package/components/ResourceDetail/Masthead.vue +1 -1
  42. package/components/ResourceList/Masthead.vue +1 -1
  43. package/components/ResourceSummary.vue +4 -4
  44. package/components/RoleBindings.vue +19 -19
  45. package/components/SimpleBox.vue +5 -1
  46. package/components/SingleClusterInfo.vue +5 -5
  47. package/components/SortableTable/THead.vue +6 -2
  48. package/components/SortableTable/actions.js +4 -2
  49. package/components/SortableTable/index.vue +9 -9
  50. package/components/SortableTable/selection.js +2 -2
  51. package/components/TableSparkLine.vue +1 -1
  52. package/components/TypeDescription.vue +1 -1
  53. package/components/Wizard.vue +1 -1
  54. package/components/YamlEditor.vue +6 -6
  55. package/components/__tests__/ApplicationCard.test.ts +27 -0
  56. package/components/__tests__/Collapse.spec.ts +44 -0
  57. package/components/__tests__/CruResource.test.ts +3 -3
  58. package/components/__tests__/NamespaceFilter.test.ts +213 -0
  59. package/components/__tests__/SimpleBox.spec.ts +28 -0
  60. package/components/auth/RoleDetailEdit.vue +17 -15
  61. package/components/auth/SelectPrincipal.vue +9 -0
  62. package/components/auth/login/ldap.vue +3 -0
  63. package/components/cards/ApplicationCard.vue +10 -5
  64. package/components/fleet/FleetBundleResources.vue +8 -8
  65. package/components/fleet/FleetClusters.vue +10 -10
  66. package/components/fleet/FleetRepos.vue +5 -5
  67. package/components/fleet/FleetResources.vue +6 -6
  68. package/components/fleet/FleetSummary.vue +5 -5
  69. package/components/fleet/ResourcesSummary.vue +1 -1
  70. package/components/form/ArrayListGrouped.vue +1 -1
  71. package/components/form/ArrayListSelect.vue +3 -3
  72. package/components/form/BannerSettings.vue +6 -6
  73. package/components/form/ChangePassword.vue +3 -3
  74. package/components/form/Error.vue +2 -2
  75. package/components/form/FileSelector.vue +3 -3
  76. package/components/form/Footer.vue +1 -1
  77. package/components/form/GithubPicker.vue +4 -4
  78. package/components/form/KeyValue.vue +2 -2
  79. package/components/form/MatchExpressions.vue +1 -1
  80. package/components/form/Members/ClusterPermissionsEditor.vue +11 -11
  81. package/components/form/Members/MembershipEditor.vue +2 -2
  82. package/components/form/NodeAffinity.vue +1 -1
  83. package/components/form/Password.vue +3 -3
  84. package/components/form/PodAffinity.vue +1 -1
  85. package/components/form/ProjectMemberEditor.vue +1 -1
  86. package/components/form/ResourceQuota/shared.js +12 -12
  87. package/components/form/SecretSelector.vue +1 -1
  88. package/components/form/Security.vue +1 -1
  89. package/components/form/Select.vue +4 -0
  90. package/components/form/SimpleSecretSelector.vue +1 -1
  91. package/components/form/Taints.vue +1 -1
  92. package/components/form/UnitInput.vue +7 -7
  93. package/components/form/ValueFromResource.vue +1 -1
  94. package/components/form/WorkloadPorts.vue +1 -1
  95. package/components/formatter/AppSummaryGraph.vue +4 -4
  96. package/components/formatter/BadgeStateFormatter.vue +2 -2
  97. package/components/formatter/Checked.vue +1 -1
  98. package/components/formatter/ClusterLink.vue +3 -3
  99. package/components/formatter/Date.vue +1 -1
  100. package/components/formatter/DelayedValue.vue +1 -1
  101. package/components/formatter/Endpoints.vue +1 -1
  102. package/components/formatter/FleetSummaryGraph.vue +4 -4
  103. package/components/formatter/IconIsDefault.vue +1 -1
  104. package/components/formatter/IconText.vue +4 -4
  105. package/components/formatter/ImagePercentageBar.vue +4 -4
  106. package/components/formatter/IngressFullPath.vue +1 -1
  107. package/components/formatter/LinkDetail.vue +3 -3
  108. package/components/formatter/List.vue +1 -1
  109. package/components/formatter/ListLink.vue +1 -1
  110. package/components/formatter/ListLinkDetail.vue +1 -1
  111. package/components/formatter/LiveDate.vue +3 -3
  112. package/components/formatter/LivePodRestarts.vue +1 -1
  113. package/components/formatter/Number.vue +1 -1
  114. package/components/formatter/Percentage.vue +2 -2
  115. package/components/formatter/PercentageBar.vue +3 -3
  116. package/components/formatter/PodImages.vue +1 -1
  117. package/components/formatter/Principal.vue +1 -1
  118. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  119. package/components/formatter/QualityText.vue +1 -1
  120. package/components/formatter/ReceiverIcons.vue +2 -2
  121. package/components/formatter/Scale.vue +1 -1
  122. package/components/formatter/ScanResult.vue +1 -1
  123. package/components/formatter/SecretData.vue +1 -1
  124. package/components/formatter/ServiceType.vue +1 -1
  125. package/components/formatter/Shortened.vue +1 -1
  126. package/components/formatter/VerticalScroll.vue +2 -2
  127. package/components/formatter/VirtualServiceGateways.vue +3 -3
  128. package/components/formatter/Weight.vue +2 -2
  129. package/components/formatter/WorkloadDetailEndpoints.vue +1 -1
  130. package/components/formatter/WorkloadHealthScale.vue +2 -2
  131. package/components/formatter/__tests__/Date.test.ts +60 -0
  132. package/components/formatter/__tests__/LinkDetail.test.ts +72 -0
  133. package/components/formatter/__tests__/LiveDate.test.ts +84 -0
  134. package/components/formatter/__tests__/Si.test.ts +35 -0
  135. package/components/graph/LinePlot.vue +1 -1
  136. package/components/graph/ProgressArc.vue +5 -5
  137. package/components/nav/GlobalLoading.vue +1 -1
  138. package/components/nav/Header.vue +1 -2
  139. package/components/nav/Jump.vue +3 -3
  140. package/components/nav/NamespaceFilter.vue +71 -22
  141. package/components/nav/TopLevelMenu.vue +4 -4
  142. package/components/nav/Type.vue +1 -1
  143. package/components/nav/WindowManager/ChartReadme.vue +1 -1
  144. package/components/nav/WindowManager/ContainerLogs.vue +3 -3
  145. package/components/nav/WindowManager/ContainerShell.vue +19 -0
  146. package/components/nav/WindowManager/KubectlShell.vue +6 -6
  147. package/components/nav/WindowManager/MachineSsh.vue +1 -1
  148. package/components/nav/WindowManager/index.vue +196 -25
  149. package/config/labels-annotations.js +19 -19
  150. package/config/product/apps.js +5 -5
  151. package/config/product/auth.js +20 -20
  152. package/config/product/cis.js +24 -24
  153. package/config/product/explorer.js +22 -21
  154. package/config/product/fleet.js +7 -7
  155. package/config/product/gatekeeper.js +7 -7
  156. package/config/product/harvester-manager.js +8 -8
  157. package/config/product/istio.js +7 -7
  158. package/config/product/legacy.js +21 -21
  159. package/config/product/logging.js +90 -90
  160. package/config/product/manager.js +14 -14
  161. package/config/product/monitoring.js +36 -36
  162. package/config/product/multi-cluster-apps.js +24 -24
  163. package/config/product/settings.js +42 -42
  164. package/config/settings.ts +16 -16
  165. package/config/table-headers.js +55 -48
  166. package/config/types.js +7 -7
  167. package/config/uiplugins.js +4 -4
  168. package/creators/app/app.package.json +4 -1
  169. package/creators/app/{.eslintignore → files/.eslintignore} +0 -0
  170. package/creators/app/{.eslintrc.js → files/.eslintrc.js} +0 -0
  171. package/creators/app/{.vscode → files/.vscode}/settings.json +0 -0
  172. package/creators/app/{babel.config.js → files/babel.config.js} +0 -0
  173. package/creators/app/{nuxt.config.js → files/nuxt.config.js} +0 -0
  174. package/creators/app/{tsconfig.json → files/tsconfig.json} +2 -1
  175. package/creators/app/init +16 -17
  176. package/creators/app/package.json +7 -1
  177. package/creators/pkg/{babel.config.js → files/babel.config.js} +0 -0
  178. package/creators/pkg/{index.ts → files/index.ts} +0 -0
  179. package/creators/pkg/{tsconfig.json → files/tsconfig.json} +13 -12
  180. package/creators/pkg/{vue.config.js → files/vue.config.js} +0 -0
  181. package/creators/pkg/init +1 -1
  182. package/creators/pkg/package.json +1 -1
  183. package/creators/update/init +56 -0
  184. package/creators/update/package.json +20 -0
  185. package/creators/update/upgrade +56 -0
  186. package/detail/cis.cattle.io.clusterscan.vue +6 -6
  187. package/detail/configmap.vue +1 -1
  188. package/detail/constraints.gatekeeper.sh.constraint.vue +1 -1
  189. package/detail/fleet.cattle.io.bundle.vue +5 -5
  190. package/detail/fleet.cattle.io.gitrepo.vue +5 -5
  191. package/detail/helm.cattle.io.projecthelmchart.vue +1 -1
  192. package/detail/management.cattle.io.user.vue +3 -3
  193. package/detail/namespace.vue +13 -13
  194. package/detail/node.vue +2 -2
  195. package/detail/pod.vue +1 -1
  196. package/detail/provisioning.cattle.io.cluster.vue +12 -1
  197. package/detail/secret.vue +2 -2
  198. package/detail/workload/index.vue +1 -1
  199. package/dialog/AddClusterMemberDialog.vue +1 -1
  200. package/dialog/AddCustomBadgeDialog.vue +4 -4
  201. package/dialog/AddProjectMemberDialog.vue +29 -22
  202. package/dialog/AddonConfigConfirmationDialog.vue +1 -1
  203. package/dialog/DiagnosticTimingsDialog.vue +1 -1
  204. package/dialog/DrainNode.vue +12 -12
  205. package/dialog/ForceMachineRemoveDialog.vue +1 -1
  206. package/dialog/GenericPrompt.vue +1 -1
  207. package/dialog/RollbackWorkloadDialog.vue +8 -8
  208. package/dialog/RotateCertificatesDialog.vue +4 -4
  209. package/dialog/RotateEncryptionKeyDialog.vue +1 -1
  210. package/dialog/SaveAsRKETemplateDialog.vue +1 -1
  211. package/dialog/ScaleMachineDownDialog.vue +1 -1
  212. package/edit/__tests__/management.cattle.io.setting.test.ts +1 -1
  213. package/edit/auth/azuread.vue +2 -2
  214. package/edit/auth/github.vue +2 -2
  215. package/edit/auth/ldap/index.vue +4 -4
  216. package/edit/auth/oidc.vue +3 -3
  217. package/edit/auth/saml.vue +4 -4
  218. package/edit/autoscaling.horizontalpodautoscaler/external-metric.vue +2 -2
  219. package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +1 -1
  220. package/edit/autoscaling.horizontalpodautoscaler/object-metric.vue +2 -2
  221. package/edit/autoscaling.horizontalpodautoscaler/pod-metric.vue +2 -2
  222. package/edit/cis.cattle.io.clusterscan.vue +2 -2
  223. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -1
  224. package/edit/fleet.cattle.io.clustergroup.vue +3 -3
  225. package/edit/fleet.cattle.io.gitrepo.vue +9 -9
  226. package/edit/group.principal.vue +2 -2
  227. package/edit/helm.cattle.io.projecthelmchart.vue +3 -3
  228. package/edit/logging-flow/index.vue +1 -1
  229. package/edit/logging.banzaicloud.io.output/providers/datadog.vue +1 -1
  230. package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +1 -1
  231. package/edit/logging.banzaicloud.io.output/providers/gcs.vue +1 -1
  232. package/edit/logging.banzaicloud.io.output/providers/gelf.vue +1 -1
  233. package/edit/logging.banzaicloud.io.output/providers/kafka.vue +1 -1
  234. package/edit/logging.banzaicloud.io.output/providers/logz.vue +1 -1
  235. package/edit/logging.banzaicloud.io.output/providers/loki.vue +1 -1
  236. package/edit/logging.banzaicloud.io.output/providers/opensearch.vue +213 -0
  237. package/edit/logging.banzaicloud.io.output/providers/redis.vue +142 -0
  238. package/edit/logging.banzaicloud.io.output/providers/s3.vue +1 -1
  239. package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +1 -1
  240. package/edit/logging.banzaicloud.io.output/providers/syslog.vue +1 -1
  241. package/edit/management.cattle.io.fleetworkspace.vue +1 -1
  242. package/edit/management.cattle.io.project.vue +3 -3
  243. package/edit/management.cattle.io.projectroletemplatebinding.vue +5 -5
  244. package/edit/management.cattle.io.setting.vue +1 -1
  245. package/edit/management.cattle.io.user.vue +4 -4
  246. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +15 -15
  247. package/edit/monitoring.coreos.com.alertmanagerconfig/tls.vue +1 -1
  248. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +4 -4
  249. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +5 -5
  250. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +3 -3
  251. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +3 -3
  252. package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +4 -4
  253. package/edit/monitoring.coreos.com.receiver/auth.vue +2 -2
  254. package/edit/monitoring.coreos.com.receiver/index.vue +1 -1
  255. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  256. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +1 -1
  257. package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +1 -1
  258. package/edit/monitoring.coreos.com.receiver/types/webhook.vue +1 -1
  259. package/edit/monitoring.coreos.com.route.vue +1 -1
  260. package/edit/networking.istio.io.destinationrule/LoadBalancer.vue +1 -1
  261. package/edit/networking.k8s.io.ingress/Certificates.vue +3 -3
  262. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
  263. package/edit/networking.k8s.io.ingress/IngressClass.vue +1 -1
  264. package/edit/networking.k8s.io.ingress/Rule.vue +1 -1
  265. package/edit/networking.k8s.io.ingress/RulePath.vue +5 -5
  266. package/edit/networking.k8s.io.ingress/Rules.vue +7 -7
  267. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -1
  268. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +3 -3
  269. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +1 -1
  270. package/edit/networking.k8s.io.networkpolicy/index.vue +5 -5
  271. package/edit/persistentvolume/index.vue +1 -1
  272. package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +1 -1
  273. package/edit/persistentvolume/plugins/azureDisk.vue +1 -1
  274. package/edit/persistentvolume/plugins/azureFile.vue +1 -1
  275. package/edit/persistentvolume/plugins/cephfs.vue +2 -2
  276. package/edit/persistentvolume/plugins/cinder.vue +1 -1
  277. package/edit/persistentvolume/plugins/csi.vue +2 -2
  278. package/edit/persistentvolume/plugins/fc.vue +2 -2
  279. package/edit/persistentvolume/plugins/flexVolume.vue +2 -2
  280. package/edit/persistentvolume/plugins/flocker.vue +1 -1
  281. package/edit/persistentvolume/plugins/gcePersistentDisk.vue +1 -1
  282. package/edit/persistentvolume/plugins/glusterfs.vue +1 -1
  283. package/edit/persistentvolume/plugins/hostPath.vue +1 -1
  284. package/edit/persistentvolume/plugins/iscsi.vue +2 -2
  285. package/edit/persistentvolume/plugins/local.vue +1 -1
  286. package/edit/persistentvolume/plugins/longhorn.vue +2 -2
  287. package/edit/persistentvolume/plugins/nfs.vue +1 -1
  288. package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -1
  289. package/edit/persistentvolume/plugins/portworxVolume.vue +1 -1
  290. package/edit/persistentvolume/plugins/quobyte.vue +1 -1
  291. package/edit/persistentvolume/plugins/rbd.vue +2 -2
  292. package/edit/persistentvolume/plugins/scaleIO.vue +1 -1
  293. package/edit/persistentvolume/plugins/storageos.vue +1 -1
  294. package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -1
  295. package/edit/persistentvolumeclaim.vue +2 -2
  296. package/edit/provisioning.cattle.io.cluster/DrainOptions.vue +1 -1
  297. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +1 -1
  298. package/edit/provisioning.cattle.io.cluster/S3Config.vue +1 -1
  299. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.tests.ts +1 -1
  300. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  301. package/edit/provisioning.cattle.io.cluster/index.vue +2 -2
  302. package/edit/provisioning.cattle.io.cluster/rke2.vue +18 -12
  303. package/edit/resources.cattle.io.backup.vue +2 -2
  304. package/edit/secret/generic.vue +1 -0
  305. package/edit/storage.k8s.io.storageclass/index.vue +2 -2
  306. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/no-provisioner.vue +1 -1
  307. package/edit/token.vue +1 -1
  308. package/edit/ui.cattle.io.navlink.vue +8 -8
  309. package/edit/workload/Job.vue +3 -3
  310. package/edit/workload/Upgrading.vue +1 -1
  311. package/edit/workload/VolumeClaimTemplate.vue +1 -1
  312. package/edit/workload/index.vue +3 -3
  313. package/edit/workload/mixins/workload.js +23 -23
  314. package/edit/workload/storage/ContainerMountPaths.vue +1 -1
  315. package/edit/workload/storage/Mount.vue +1 -1
  316. package/edit/workload/storage/azureDisk.vue +1 -1
  317. package/edit/workload/storage/azureFile.vue +1 -1
  318. package/edit/workload/storage/csi/index.vue +1 -1
  319. package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
  320. package/edit/workload/storage/gcePersistentDisk.vue +1 -1
  321. package/edit/workload/storage/hostPath.vue +1 -1
  322. package/edit/workload/storage/nfs.vue +1 -1
  323. package/edit/workload/storage/persistentVolumeClaim/index.vue +1 -1
  324. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -1
  325. package/edit/workload/storage/secret.vue +1 -1
  326. package/edit/workload/storage/vsphereVolume.vue +1 -1
  327. package/layouts/default.vue +77 -16
  328. package/list/__tests__/workload.test.ts +50 -0
  329. package/list/fleet.cattle.io.gitrepo.vue +1 -1
  330. package/list/group.principal.vue +8 -8
  331. package/list/harvesterhci.io.management.cluster.vue +1 -1
  332. package/list/helm.cattle.io.projecthelmchart.vue +1 -1
  333. package/list/management.cattle.io.feature.vue +1 -1
  334. package/list/node.vue +1 -1
  335. package/list/provisioning.cattle.io.cluster.vue +3 -3
  336. package/machine-config/amazonec2.vue +1 -1
  337. package/machine-config/harvester.vue +4 -4
  338. package/mixins/__tests__/create-edit-view.test.ts +1 -1
  339. package/mixins/chart.js +14 -14
  340. package/mixins/create-edit-view/index.js +5 -5
  341. package/mixins/form-validation.js +1 -1
  342. package/mixins/labeled-form-element.ts +6 -6
  343. package/mixins/resource-fetch.js +3 -3
  344. package/mixins/resource-manager.js +1 -1
  345. package/models/autoscaling.horizontalpodautoscaler.js +5 -5
  346. package/models/batch.cronjob.js +15 -15
  347. package/models/batch.job.js +22 -0
  348. package/models/catalog.cattle.io.app.js +6 -6
  349. package/models/catalog.cattle.io.clusterrepo.js +7 -7
  350. package/models/catalog.cattle.io.operation.js +5 -5
  351. package/models/chart.js +4 -4
  352. package/models/cis.cattle.io.clusterscan.js +10 -10
  353. package/models/cluster/node.js +36 -36
  354. package/models/cluster.x-k8s.io.machine.js +13 -13
  355. package/models/constraints.gatekeeper.sh.constraint.js +1 -1
  356. package/models/etcdbackup.js +4 -4
  357. package/models/fleet.cattle.io.cluster.js +15 -15
  358. package/models/fleet.cattle.io.clustergroup.js +1 -1
  359. package/models/fleet.cattle.io.gitrepo.js +15 -15
  360. package/models/group.principal.js +1 -1
  361. package/models/logging.banzaicloud.io.clusterflow.js +2 -2
  362. package/models/logging.banzaicloud.io.flow.js +2 -2
  363. package/models/logging.banzaicloud.io.output.js +15 -3
  364. package/models/management.cattle.io.authconfig.js +4 -4
  365. package/models/management.cattle.io.cluster.js +9 -9
  366. package/models/management.cattle.io.clusterroletemplatebinding.js +8 -8
  367. package/models/management.cattle.io.globalrole.js +24 -3
  368. package/models/management.cattle.io.node.js +9 -9
  369. package/models/management.cattle.io.nodepool.js +3 -3
  370. package/models/management.cattle.io.nodetemplate.js +21 -21
  371. package/models/management.cattle.io.project.js +2 -2
  372. package/models/management.cattle.io.projectroletemplatebinding.js +6 -6
  373. package/models/management.cattle.io.roletemplate.js +54 -31
  374. package/models/management.cattle.io.user.js +4 -4
  375. package/models/monitoring.coreos.com.alertmanagerconfig.js +4 -4
  376. package/models/monitoring.coreos.com.receiver.js +7 -7
  377. package/models/monitoring.coreos.com.route.js +2 -2
  378. package/models/namespace.js +13 -0
  379. package/models/persistentvolumeclaim.js +4 -4
  380. package/models/pod.js +10 -10
  381. package/models/provisioning.cattle.io.cluster.js +29 -29
  382. package/models/rbac.authorization.k8s.io.role.js +4 -4
  383. package/models/rke.cattle.io.etcdsnapshot.js +4 -4
  384. package/models/service.js +15 -15
  385. package/models/storage.k8s.io.storageclass.js +8 -8
  386. package/models/workload.js +28 -28
  387. package/nuxt.config.js +32 -17
  388. package/package.json +2 -2
  389. package/pages/about.vue +1 -1
  390. package/pages/account/index.vue +1 -1
  391. package/pages/auth/login.vue +37 -7
  392. package/pages/auth/setup.vue +11 -11
  393. package/pages/c/_cluster/_product/_resource/_id.vue +2 -2
  394. package/pages/c/_cluster/apps/charts/chart.vue +4 -4
  395. package/pages/c/_cluster/apps/charts/index.vue +18 -18
  396. package/pages/c/_cluster/apps/charts/install.vue +14 -14
  397. package/pages/c/_cluster/auth/config/_id.vue +2 -2
  398. package/pages/c/_cluster/auth/roles/_resource/_id.vue +2 -2
  399. package/pages/c/_cluster/auth/roles/index.vue +4 -6
  400. package/pages/c/_cluster/explorer/EventsTable.vue +8 -8
  401. package/pages/c/_cluster/explorer/index.vue +14 -14
  402. package/pages/c/_cluster/explorer/tools/index.vue +4 -4
  403. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +2 -2
  404. package/pages/c/_cluster/fleet/index.vue +10 -10
  405. package/pages/c/_cluster/gatekeeper/index.vue +1 -1
  406. package/pages/c/_cluster/legacy/index.vue +1 -1
  407. package/pages/c/_cluster/longhorn/index.vue +1 -1
  408. package/pages/c/_cluster/mcapps/index.vue +1 -1
  409. package/pages/c/_cluster/navlinks/_group.vue +1 -1
  410. package/pages/c/_cluster/neuvector/index.vue +1 -1
  411. package/pages/c/_cluster/settings/banners.vue +30 -30
  412. package/pages/c/_cluster/settings/brand.vue +9 -9
  413. package/pages/c/_cluster/settings/links.vue +6 -6
  414. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +1 -1
  415. package/pages/c/_cluster/uiplugins/InstallDialog.vue +1 -1
  416. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +25 -8
  417. package/pages/c/_cluster/uiplugins/index.vue +2 -2
  418. package/pages/prefs.vue +11 -11
  419. package/pages/rio/mesh.vue +4 -4
  420. package/pages/support/index.vue +7 -7
  421. package/pkg/vue.config.js +10 -1
  422. package/plugins/dashboard-store/mutations.js +6 -6
  423. package/plugins/dashboard-store/normalize.js +1 -1
  424. package/plugins/dashboard-store/resource-class.js +100 -100
  425. package/plugins/steve/subscribe.js +4 -4
  426. package/plugins/steve/web-worker.steve-sub-worker.js +3 -3
  427. package/promptRemove/management.cattle.io.project.vue +1 -1
  428. package/promptRemove/mixin/roleDeletionCheck.js +7 -7
  429. package/promptRemove/pod.vue +2 -2
  430. package/rancher-components/Card/Card.test.ts +39 -0
  431. package/rancher-components/Card/Card.vue +3 -3
  432. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +0 -1
  433. package/rancher-components/StringList/StringList.test.ts +420 -45
  434. package/rancher-components/StringList/StringList.vue +10 -1
  435. package/rancher-components/Utils/DraggableZone/DraggableZone.vue +181 -0
  436. package/rancher-components/Utils/DraggableZone/index.ts +1 -0
  437. package/rancher-components/components/BadgeState/BadgeState.spec.ts +12 -0
  438. package/rancher-components/components/BadgeState/BadgeState.vue +111 -0
  439. package/rancher-components/components/BadgeState/index.ts +1 -0
  440. package/rancher-components/components/Banner/Banner.test.ts +13 -0
  441. package/rancher-components/components/Banner/Banner.vue +174 -0
  442. package/rancher-components/components/Banner/index.ts +1 -0
  443. package/rancher-components/components/Card/Card.test.ts +37 -0
  444. package/rancher-components/components/Card/Card.vue +166 -0
  445. package/rancher-components/components/Card/index.ts +1 -0
  446. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +77 -0
  447. package/rancher-components/components/Form/Checkbox/Checkbox.vue +416 -0
  448. package/rancher-components/components/Form/Checkbox/index.ts +1 -0
  449. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +23 -0
  450. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +355 -0
  451. package/rancher-components/components/Form/LabeledInput/index.ts +1 -0
  452. package/rancher-components/components/Form/Radio/RadioButton.vue +276 -0
  453. package/rancher-components/components/Form/Radio/RadioGroup.vue +253 -0
  454. package/rancher-components/components/Form/Radio/index.ts +2 -0
  455. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +169 -0
  456. package/rancher-components/components/Form/TextArea/index.ts +1 -0
  457. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +94 -0
  458. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +149 -0
  459. package/rancher-components/components/Form/ToggleSwitch/index.ts +1 -0
  460. package/rancher-components/components/Form/index.ts +5 -0
  461. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +152 -0
  462. package/rancher-components/components/LabeledTooltip/index.ts +1 -0
  463. package/rancher-components/components/StringList/StringList.test.ts +483 -0
  464. package/rancher-components/components/StringList/StringList.vue +605 -0
  465. package/rancher-components/components/StringList/index.ts +1 -0
  466. package/rancher-components/components/Utils/DraggableZone/DraggableZone.vue +181 -0
  467. package/rancher-components/components/Utils/DraggableZone/index.ts +1 -0
  468. package/scripts/publish-shell.sh +38 -5
  469. package/scripts/record-deps.js +37 -0
  470. package/scripts/test-plugins-build.sh +11 -7
  471. package/scripts/typegen.sh +84 -0
  472. package/store/action-menu.js +3 -3
  473. package/store/auth.js +4 -4
  474. package/store/aws.js +4 -4
  475. package/store/catalog.js +22 -22
  476. package/store/index.js +4 -4
  477. package/store/plugins.js +2 -2
  478. package/store/prefs.js +9 -1
  479. package/store/type-map.js +46 -31
  480. package/store/uiplugins.ts +2 -2
  481. package/store/wm.js +10 -0
  482. package/types/shell/index.d.ts +3059 -0
  483. package/types/vue-shim.d +20 -0
  484. package/utils/alertmanagerconfig.js +6 -6
  485. package/utils/gc/gc-types.ts +1 -1
  486. package/utils/object.js +2 -2
  487. package/utils/parse-externalid.js +5 -5
  488. package/utils/time.js +6 -0
  489. package/utils/validators/formRules/__tests__/index.test.ts +3 -3
  490. package/components/.DS_Store +0 -0
  491. package/components/__tests__/.DS_Store +0 -0
  492. package/creators/pkg/nuxt.config.js +0 -6
  493. package/creators/pkg/package-lock.json +0 -37
@@ -58,23 +58,23 @@ export default class CapiMachine extends SteveModel {
58
58
  const out = super._availableActions;
59
59
 
60
60
  const openSsh = {
61
- action: 'openSsh',
62
- enabled: !!this.links.shell && this.isRunning,
63
- icon: 'icon icon-fw icon-chevron-right',
64
- label: 'SSH Shell',
61
+ action: 'openSsh',
62
+ enabled: !!this.links.shell && this.isRunning,
63
+ icon: 'icon icon-fw icon-chevron-right',
64
+ label: 'SSH Shell',
65
65
  };
66
66
  const downloadKeys = {
67
- action: 'downloadKeys',
68
- enabled: !!this.links.sshkeys,
69
- icon: 'icon icon-fw icon-download',
70
- label: this.t('node.actions.downloadSSHKey'),
67
+ action: 'downloadKeys',
68
+ enabled: !!this.links.sshkeys,
69
+ icon: 'icon icon-fw icon-download',
70
+ label: this.t('node.actions.downloadSSHKey'),
71
71
  };
72
72
  const forceRemove = {
73
- action: 'toggleForceRemoveModal',
74
- altAction: 'forceMachineRemove',
75
- enabled: !!this.isRemoveForceable,
76
- label: this.t('node.actions.forceDelete'),
77
- icon: 'icon icon-trash',
73
+ action: 'toggleForceRemoveModal',
74
+ altAction: 'forceMachineRemove',
75
+ enabled: !!this.isRemoveForceable,
76
+ label: this.t('node.actions.forceDelete'),
77
+ icon: 'icon icon-trash',
78
78
  };
79
79
  const scaleDown = {
80
80
  action: 'toggleScaleDownModal',
@@ -56,7 +56,7 @@ export default class GateKeeperConstraint extends SteveModel {
56
56
  return violations.map((violation) => {
57
57
  return {
58
58
  ...violation,
59
- resourceLink: {
59
+ resourceLink: {
60
60
  text: violation.name,
61
61
  to: {
62
62
  name: 'c-cluster-product-resource-id',
@@ -3,10 +3,10 @@ import NormanModel from '@shell/plugins/steve/norman-class';
3
3
  export default class Rke1EtcdBackup extends NormanModel {
4
4
  get _availableActions() {
5
5
  const restore = {
6
- action: 'promptRestore',
7
- enabled: true,
8
- icon: 'icon icon-fw icon-backup-restore',
9
- label: 'Restore'
6
+ action: 'promptRestore',
7
+ enabled: true,
8
+ icon: 'icon icon-fw icon-backup-restore',
9
+ label: 'Restore'
10
10
  };
11
11
 
12
12
  const baseActions = super._availableActions;
@@ -9,27 +9,27 @@ export default class FleetCluster extends SteveModel {
9
9
  const out = super._availableActions;
10
10
 
11
11
  insertAt(out, 0, {
12
- action: 'pause',
13
- label: 'Pause',
14
- icon: 'icon icon-pause',
15
- bulkable: true,
16
- enabled: !!this.links.update && !this.spec?.paused
12
+ action: 'pause',
13
+ label: 'Pause',
14
+ icon: 'icon icon-pause',
15
+ bulkable: true,
16
+ enabled: !!this.links.update && !this.spec?.paused
17
17
  });
18
18
 
19
19
  insertAt(out, 1, {
20
- action: 'unpause',
21
- label: 'Unpause',
22
- icon: 'icon icon-play',
23
- bulkable: true,
24
- enabled: !!this.links.update && this.spec?.paused === true
20
+ action: 'unpause',
21
+ label: 'Unpause',
22
+ icon: 'icon icon-play',
23
+ bulkable: true,
24
+ enabled: !!this.links.update && this.spec?.paused === true
25
25
  });
26
26
 
27
27
  insertAt(out, 2, {
28
- action: 'forceUpdate',
29
- label: 'Force Update',
30
- icon: 'icon icon-refresh',
31
- bulkable: true,
32
- enabled: !!this.links.update
28
+ action: 'forceUpdate',
29
+ label: 'Force Update',
30
+ icon: 'icon icon-refresh',
31
+ bulkable: true,
32
+ enabled: !!this.links.update
33
33
  });
34
34
 
35
35
  insertAt(out, 3, {
@@ -53,7 +53,7 @@ export default class FleetClusterGroup extends SteveModel {
53
53
  const out = [
54
54
  {
55
55
  label: 'Clusters Ready',
56
- content: `${ this.clusterInfo.ready } of ${ this.clusterInfo.total }`,
56
+ content: `${ this.clusterInfo.ready } of ${ this.clusterInfo.total }`,
57
57
  },
58
58
  ];
59
59
 
@@ -39,27 +39,27 @@ export default class GitRepo extends SteveModel {
39
39
  const out = super._availableActions;
40
40
 
41
41
  insertAt(out, 0, {
42
- action: 'pause',
43
- label: 'Pause',
44
- icon: 'icon icon-pause',
45
- bulkable: true,
46
- enabled: !!this.links.update && !this.spec?.paused
42
+ action: 'pause',
43
+ label: 'Pause',
44
+ icon: 'icon icon-pause',
45
+ bulkable: true,
46
+ enabled: !!this.links.update && !this.spec?.paused
47
47
  });
48
48
 
49
49
  insertAt(out, 1, {
50
- action: 'unpause',
51
- label: 'Unpause',
52
- icon: 'icon icon-play',
53
- bulkable: true,
54
- enabled: !!this.links.update && this.spec?.paused === true
50
+ action: 'unpause',
51
+ label: 'Unpause',
52
+ icon: 'icon icon-play',
53
+ bulkable: true,
54
+ enabled: !!this.links.update && this.spec?.paused === true
55
55
  });
56
56
 
57
57
  insertAt(out, 2, {
58
- action: 'forceUpdate',
59
- label: 'Force Update',
60
- icon: 'icon icon-refresh',
61
- bulkable: true,
62
- enabled: !!this.links.update
58
+ action: 'forceUpdate',
59
+ label: 'Force Update',
60
+ icon: 'icon icon-refresh',
61
+ bulkable: true,
62
+ enabled: !!this.links.update
63
63
  });
64
64
 
65
65
  insertAt(out, 3, { divider: true });
@@ -36,7 +36,7 @@ export default class Group extends Principal {
36
36
  action: 'goToEdit',
37
37
  label: this.t('action.edit'),
38
38
  icon: 'icon icon-edit',
39
- enabled: true,
39
+ enabled: true,
40
40
  },
41
41
  {
42
42
  action: 'promptUnassignGroupRoles',
@@ -28,8 +28,8 @@ export default class LogClusterFlow extends Flow {
28
28
  get customValidationRules() {
29
29
  return [
30
30
  {
31
- path: 'spec',
32
- validators: ['flowOutput'],
31
+ path: 'spec',
32
+ validators: ['flowOutput'],
33
33
  },
34
34
  ];
35
35
  }
@@ -102,8 +102,8 @@ export default class LogFlow extends SteveModel {
102
102
  get customValidationRules() {
103
103
  return [
104
104
  {
105
- path: 'spec',
106
- validators: ['flowOutput:verifyLocal'],
105
+ path: 'spec',
106
+ validators: ['flowOutput:verifyLocal'],
107
107
  },
108
108
  ];
109
109
  }
@@ -76,6 +76,18 @@ export const PROVIDERS = [
76
76
  labelKey: 'logging.outputProviders.newrelic',
77
77
  default: { },
78
78
  },
79
+ {
80
+ name: 'opensearch',
81
+ labelKey: 'logging.outputProviders.opensearch',
82
+ default: {},
83
+ },
84
+ {
85
+ name: 'redis',
86
+ labelKey: 'logging.outputProviders.redis',
87
+ default: {
88
+ port: 6379, db_number: 0, ttl: 0
89
+ },
90
+ },
79
91
  {
80
92
  name: 'splunkHec',
81
93
  labelKey: 'logging.outputProviders.splunkHec',
@@ -142,7 +154,7 @@ export default class LogOutput extends SteveModel {
142
154
  get url() {
143
155
  return {
144
156
  name: 'c-cluster-product-resource-namespace-id',
145
- params: {
157
+ params: {
146
158
  resource: this.type,
147
159
  id: this.name,
148
160
  namespace: this.namespace
@@ -153,8 +165,8 @@ export default class LogOutput extends SteveModel {
153
165
  get customValidationRules() {
154
166
  return [
155
167
  {
156
- path: 'spec.logdna',
157
- validators: ['logdna'],
168
+ path: 'spec.logdna',
169
+ validators: ['logdna'],
158
170
  }
159
171
  ];
160
172
  }
@@ -24,10 +24,10 @@ export default class AuthConfig extends SteveModel {
24
24
  const out = super._availableActions;
25
25
 
26
26
  insertAt(out, 0, {
27
- action: 'disable',
28
- label: 'Disable',
29
- icon: 'icon icon-spinner',
30
- enabled: this.enabled === true,
27
+ action: 'disable',
28
+ label: 'Disable',
29
+ icon: 'icon icon-spinner',
30
+ enabled: this.enabled === true,
31
31
  });
32
32
 
33
33
  insertAt(out, 1, { divider: true });
@@ -43,10 +43,10 @@ export default class MgmtCluster extends HybridModel {
43
43
  const out = super._availableActions;
44
44
 
45
45
  insertAt(out, 0, {
46
- action: 'openShell',
47
- label: this.t('nav.shell'),
48
- icon: 'icon icon-terminal',
49
- enabled: !!this.links.shell,
46
+ action: 'openShell',
47
+ label: this.t('nav.shell'),
48
+ icon: 'icon icon-terminal',
49
+ enabled: !!this.links.shell,
50
50
  });
51
51
 
52
52
  insertAt(out, 1, {
@@ -59,11 +59,11 @@ export default class MgmtCluster extends HybridModel {
59
59
  });
60
60
 
61
61
  insertAt(out, 2, {
62
- action: 'copyKubeConfig',
63
- label: this.t('cluster.copyConfig'),
64
- bulkable: false,
65
- enabled: this.$rootGetters['isRancher'] && this.hasAction('generateKubeconfig'),
66
- icon: 'icon icon-copy',
62
+ action: 'copyKubeConfig',
63
+ label: this.t('cluster.copyConfig'),
64
+ bulkable: false,
65
+ enabled: this.$rootGetters['isRancher'] && this.hasAction('generateKubeconfig'),
66
+ icon: 'icon icon-copy',
67
67
  });
68
68
 
69
69
  return out;
@@ -77,9 +77,9 @@ export default class CRTB extends HybridModel {
77
77
  const name = `c-cluster-product-resource-id`;
78
78
 
79
79
  const params = {
80
- resource: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING,
81
- id: this.clusterName,
82
- product: 'explorer',
80
+ resource: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING,
81
+ id: this.clusterName,
82
+ product: 'explorer',
83
83
  };
84
84
 
85
85
  return { name, params };
@@ -116,11 +116,11 @@ export default class CRTB extends HybridModel {
116
116
  const principalProperty = principal.principalType === 'group' ? 'groupPrincipalId' : 'userPrincipalId';
117
117
 
118
118
  return this.$dispatch(`rancher/create`, {
119
- type: NORMAN.CLUSTER_ROLE_TEMPLATE_BINDING,
120
- roleTemplateId: this.roleTemplateName,
121
- [principalProperty]: principal.id,
122
- clusterId: this.clusterName,
123
- id: this.id?.replace('/', ':')
119
+ type: NORMAN.CLUSTER_ROLE_TEMPLATE_BINDING,
120
+ roleTemplateId: this.roleTemplateName,
121
+ [principalProperty]: principal.id,
122
+ clusterId: this.clusterName,
123
+ id: this.id?.replace('/', ':')
124
124
  }, { root: true });
125
125
  })();
126
126
  }
@@ -1,10 +1,11 @@
1
1
  import { DESCRIPTION } from '@shell/config/labels-annotations';
2
2
  import { SCHEMA, NORMAN } from '@shell/config/types';
3
- import { CATTLE_API_GROUP, SUBTYPE_MAPPING } from '@shell/models/management.cattle.io.roletemplate';
3
+ import { CATTLE_API_GROUP, SUBTYPE_MAPPING, CREATE_VERBS } from '@shell/models/management.cattle.io.roletemplate';
4
4
  import { uniq } from '@shell/utils/array';
5
5
  import { get } from '@shell/utils/object';
6
6
  import SteveModel from '@shell/plugins/steve/steve-class';
7
7
  import Role from './rbac.authorization.k8s.io.role';
8
+ import { AS, MODE, _CLONE, _UNFLAG } from '@shell/config/query-params';
8
9
 
9
10
  const BASE = 'user-base';
10
11
  const USER = 'user';
@@ -22,8 +23,8 @@ export default class GlobalRole extends SteveModel {
22
23
  const out = this._details;
23
24
 
24
25
  out.unshift({
25
- label: this.t('resourceDetail.detailTop.name'),
26
- content: get(this, 'name')
26
+ label: this.t('resourceDetail.detailTop.name'),
27
+ content: get(this, 'name')
27
28
  });
28
29
 
29
30
  return out;
@@ -113,6 +114,26 @@ export default class GlobalRole extends SteveModel {
113
114
  })();
114
115
  }
115
116
 
117
+ get canCreate() {
118
+ const schema = this.$getters['schemaFor'](this.type);
119
+
120
+ return schema?.resourceMethods.find(verb => CREATE_VERBS.has(verb));
121
+ }
122
+
123
+ goToClone(moreQuery = {}) {
124
+ const location = this.detailLocation;
125
+
126
+ location.query = {
127
+ ...location.query,
128
+ [MODE]: _CLONE,
129
+ [AS]: _UNFLAG,
130
+ roleContext: GLOBAL,
131
+ ...moreQuery
132
+ };
133
+
134
+ this.currentRouter().push(location);
135
+ }
136
+
116
137
  async save() {
117
138
  const norman = await this.norman;
118
139
 
@@ -13,18 +13,18 @@ export default class MgmtNode extends HybridModel {
13
13
  const out = super._availableActions;
14
14
 
15
15
  const downloadKeys = {
16
- action: 'downloadKeys',
17
- enabled: !!this.norman?.links?.nodeConfig,
18
- icon: 'icon icon-fw icon-download',
19
- label: this.t('node.actions.downloadNodeConfig'),
16
+ action: 'downloadKeys',
17
+ enabled: !!this.norman?.links?.nodeConfig,
18
+ icon: 'icon icon-fw icon-download',
19
+ label: this.t('node.actions.downloadNodeConfig'),
20
20
  };
21
21
 
22
22
  const scaleDown = {
23
- action: 'scaleDown',
24
- enabled: !!this.canScaleDown,
25
- icon: 'icon icon-minus icon-fw',
26
- label: this.t('node.actions.scaleDown'),
27
- bulkable: true,
23
+ action: 'scaleDown',
24
+ enabled: !!this.canScaleDown,
25
+ icon: 'icon icon-minus icon-fw',
26
+ label: this.t('node.actions.scaleDown'),
27
+ bulkable: true,
28
28
  };
29
29
 
30
30
  insertAt(out, 0, { divider: true });
@@ -79,9 +79,9 @@ export default class MgmtNodePool extends HybridModel {
79
79
  // These are used in `stateParts` which is show in the same context as `stateParts` for machine deployments (rke2 pools))
80
80
  // Using actual states here would look strange when against bucket states for RKE2
81
81
  const res = {
82
- pending: 0,
83
- unavailable: 0,
84
- ready: 0,
82
+ pending: 0,
83
+ unavailable: 0,
84
+ ready: 0,
85
85
  };
86
86
 
87
87
  if (!this.nodes) {
@@ -3,8 +3,8 @@ import HybridModel from '@shell/plugins/steve/hybrid-class';
3
3
 
4
4
  const CONFIG_KEYS = [
5
5
  {
6
- driver: 'aliyunecs',
7
- size: { key: 'instanceType' },
6
+ driver: 'aliyunecs',
7
+ size: { key: 'instanceType' },
8
8
  location: {
9
9
  getDisplayProperty(that) {
10
10
  return `${ that.providerConfig?.region }${ that.providerConfig?.zone }`;
@@ -12,8 +12,8 @@ const CONFIG_KEYS = [
12
12
  }
13
13
  },
14
14
  {
15
- driver: 'amazonec2',
16
- size: { key: 'instanceType' },
15
+ driver: 'amazonec2',
16
+ size: { key: 'instanceType' },
17
17
  location: {
18
18
  getDisplayProperty(that) {
19
19
  return `${ that.providerConfig?.region }${ that.providerConfig?.zone }`;
@@ -21,47 +21,47 @@ const CONFIG_KEYS = [
21
21
  }
22
22
  },
23
23
  {
24
- driver: 'azure',
25
- size: { key: 'size' },
24
+ driver: 'azure',
25
+ size: { key: 'size' },
26
26
  location: { key: 'location' }
27
27
  },
28
28
  {
29
- driver: 'digitalocean',
30
- size: { key: 'size' },
29
+ driver: 'digitalocean',
30
+ size: { key: 'size' },
31
31
  location: { key: 'region' }
32
32
  },
33
33
  {
34
- driver: 'exoscale',
35
- size: { key: 'instanceProfile' },
34
+ driver: 'exoscale',
35
+ size: { key: 'instanceProfile' },
36
36
  location: { key: 'availabilityZone' }
37
37
  },
38
38
  {
39
- driver: 'linode',
40
- size: { key: 'instanceType' },
39
+ driver: 'linode',
40
+ size: { key: 'instanceType' },
41
41
  location: { key: 'region' }
42
42
  },
43
43
  {
44
- driver: 'oci',
45
- size: { key: 'nodeShape' },
44
+ driver: 'oci',
45
+ size: { key: 'nodeShape' },
46
46
  location: {}
47
47
  },
48
48
  {
49
- driver: 'packet',
50
- size: { key: 'plan' },
49
+ driver: 'packet',
50
+ size: { key: 'plan' },
51
51
  location: { key: 'facilityCode' }
52
52
  },
53
53
  {
54
- driver: 'pnap',
55
- size: { key: 'serverType' },
54
+ driver: 'pnap',
55
+ size: { key: 'serverType' },
56
56
  location: { key: 'serverLocation' }
57
57
  },
58
58
  {
59
- driver: 'rackspace',
60
- size: { key: 'flavorId' },
59
+ driver: 'rackspace',
60
+ size: { key: 'flavorId' },
61
61
  location: { key: 'region' }
62
62
  },
63
63
  {
64
- driver: 'vmwarevsphere',
64
+ driver: 'vmwarevsphere',
65
65
  size: {
66
66
  getDisplayProperty(that) {
67
67
  const size = formatSi(that.providerConfig?.memorySize * 1048576, 1024, 'iB');
@@ -153,8 +153,8 @@ export default class Project extends HybridModel {
153
153
  get normanEditProject() {
154
154
  return (async() => {
155
155
  const normanProject = await this.$dispatch('rancher/find', {
156
- type: NORMAN.PROJECT,
157
- id: this.id.replace('/', ':'),
156
+ type: NORMAN.PROJECT,
157
+ id: this.id.replace('/', ':'),
158
158
  }, { root: true });
159
159
 
160
160
  const clearedResourceQuotas = clearUnusedResourceQuotas(this.spec, ['resourceQuota', 'namespaceDefaultResourceQuota']);
@@ -80,9 +80,9 @@ export default class PRTB extends HybridModel {
80
80
  const name = `c-cluster-product-resource-id`;
81
81
 
82
82
  const params = {
83
- resource: MANAGEMENT.PROJECT,
84
- id: this.projectId,
85
- product: 'explorer',
83
+ resource: MANAGEMENT.PROJECT,
84
+ id: this.projectId,
85
+ product: 'explorer',
86
86
  };
87
87
 
88
88
  return { name, params };
@@ -96,9 +96,9 @@ export default class PRTB extends HybridModel {
96
96
  const name = `c-cluster-product-resource-id`;
97
97
 
98
98
  const params = {
99
- resource: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING,
100
- id: this.clusterName,
101
- product: 'explorer',
99
+ resource: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING,
100
+ id: this.clusterName,
101
+ product: 'explorer',
102
102
  };
103
103
 
104
104
  return { name, params };
@@ -4,44 +4,45 @@ import { DESCRIPTION } from '@shell/config/labels-annotations';
4
4
  import { NORMAN } from '@shell/config/types';
5
5
  import SteveDescriptionModel from '@shell/plugins/steve/steve-description-class';
6
6
  import Role from './rbac.authorization.k8s.io.role';
7
+ import { AS, MODE, _CLONE, _UNFLAG } from '@shell/config/query-params';
7
8
 
8
9
  export const CATTLE_API_GROUP = '.cattle.io';
9
10
 
10
11
  export const SUBTYPE_MAPPING = {
11
- GLOBAL: {
12
- key: 'GLOBAL',
13
- type: 'management.cattle.io.globalrole',
14
- defaultKey: 'newUserDefault',
15
- id: 'GLOBAL',
16
- labelKey: 'rbac.roletemplate.subtypes.GLOBAL.label',
12
+ GLOBAL: {
13
+ key: 'GLOBAL',
14
+ type: 'management.cattle.io.globalrole',
15
+ defaultKey: 'newUserDefault',
16
+ id: 'GLOBAL',
17
+ labelKey: 'rbac.roletemplate.subtypes.GLOBAL.label',
17
18
  },
18
- CLUSTER: {
19
- key: 'CLUSTER',
20
- type: 'management.cattle.io.roletemplate',
21
- context: 'cluster',
22
- defaultKey: 'clusterCreatorDefault',
23
- id: 'CLUSTER',
24
- labelKey: 'rbac.roletemplate.subtypes.CLUSTER.label',
19
+ CLUSTER: {
20
+ key: 'CLUSTER',
21
+ type: 'management.cattle.io.roletemplate',
22
+ context: 'cluster',
23
+ defaultKey: 'clusterCreatorDefault',
24
+ id: 'CLUSTER',
25
+ labelKey: 'rbac.roletemplate.subtypes.CLUSTER.label',
25
26
  },
26
27
  NAMESPACE: {
27
- key: 'NAMESPACE',
28
- type: 'management.cattle.io.roletemplate',
29
- context: 'project',
30
- defaultKey: 'projectCreatorDefault',
31
- id: 'NAMESPACE',
32
- labelKey: 'rbac.roletemplate.subtypes.NAMESPACE.label',
28
+ key: 'NAMESPACE',
29
+ type: 'management.cattle.io.roletemplate',
30
+ context: 'project',
31
+ defaultKey: 'projectCreatorDefault',
32
+ id: 'NAMESPACE',
33
+ labelKey: 'rbac.roletemplate.subtypes.NAMESPACE.label',
33
34
  },
34
35
  RBAC_ROLE: {
35
- key: 'RBAC_ROLE',
36
- type: 'rbac.authorization.k8s.io.role',
37
- id: 'RBAC_ROLE',
38
- labelKey: 'rbac.roletemplate.subtypes.RBAC_ROLE.label',
36
+ key: 'RBAC_ROLE',
37
+ type: 'rbac.authorization.k8s.io.role',
38
+ id: 'RBAC_ROLE',
39
+ labelKey: 'rbac.roletemplate.subtypes.RBAC_ROLE.label',
39
40
  },
40
41
  RBAC_CLUSTER_ROLE: {
41
- key: 'RBAC_CLUSTER_ROLE',
42
- type: 'rbac.authorization.k8s.io.clusterrole',
43
- id: 'RBAC_CLUSTER_ROLE',
44
- labelKey: 'rbac.roletemplate.subtypes.RBAC_CLUSTER_ROLE.label',
42
+ key: 'RBAC_CLUSTER_ROLE',
43
+ type: 'rbac.authorization.k8s.io.clusterrole',
44
+ id: 'RBAC_CLUSTER_ROLE',
45
+ labelKey: 'rbac.roletemplate.subtypes.RBAC_CLUSTER_ROLE.label',
45
46
  }
46
47
  };
47
48
 
@@ -55,6 +56,8 @@ export const VERBS = [
55
56
  'watch',
56
57
  ];
57
58
 
59
+ export const CREATE_VERBS = new Set(['PUT', 'blocked-PUT']);
60
+
58
61
  export default class RoleTemplate extends SteveDescriptionModel {
59
62
  get customValidationRules() {
60
63
  return Role.customValidationRules();
@@ -64,13 +67,13 @@ export default class RoleTemplate extends SteveDescriptionModel {
64
67
  const out = this._details;
65
68
 
66
69
  out.unshift({
67
- label: this.t('resourceDetail.detailTop.name'),
68
- content: get(this, 'name')
70
+ label: this.t('resourceDetail.detailTop.name'),
71
+ content: get(this, 'name')
69
72
  },
70
73
  // API returns a blank description property, this overrides our own link to the description
71
74
  {
72
- label: this.t('resourceDetail.detailTop.description'),
73
- content: this.metadata?.annotations?.[DESCRIPTION]
75
+ label: this.t('resourceDetail.detailTop.description'),
76
+ content: this.metadata?.annotations?.[DESCRIPTION]
74
77
  });
75
78
 
76
79
  return out;
@@ -159,6 +162,26 @@ export default class RoleTemplate extends SteveDescriptionModel {
159
162
  })();
160
163
  }
161
164
 
165
+ get canCreate() {
166
+ const schema = this.$getters['schemaFor'](this.type);
167
+
168
+ return schema?.resourceMethods.find(verb => CREATE_VERBS.has(verb));
169
+ }
170
+
171
+ goToClone(moreQuery = {}) {
172
+ const location = this.detailLocation;
173
+
174
+ location.query = {
175
+ ...location.query,
176
+ [MODE]: _CLONE,
177
+ [AS]: _UNFLAG,
178
+ roleContext: this.subtype,
179
+ ...moreQuery
180
+ };
181
+
182
+ this.currentRouter().push(location);
183
+ }
184
+
162
185
  async save() {
163
186
  const norman = await this.norman;
164
187