@rancher/shell 0.3.0 → 0.3.2

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 (342) hide show
  1. package/assets/styles/global/_button.scss +5 -1
  2. package/assets/styles/global/_columns.scss +4 -0
  3. package/assets/styles/global/_gauges.scss +1 -1
  4. package/assets/styles/global/_layout.scss +5 -2
  5. package/assets/styles/global/_select.scss +1 -4
  6. package/assets/styles/themes/_dark.scss +5 -4
  7. package/assets/styles/themes/_light.scss +4 -3
  8. package/assets/styles/themes/_suse.scss +1 -1
  9. package/assets/styles/vendor/vue-select.scss +4 -3
  10. package/assets/translations/en-us.yaml +673 -73
  11. package/assets/translations/zh-hans.yaml +720 -207
  12. package/chart/monitoring/steps/uninstall-v1.vue +2 -2
  13. package/cloud-credential/azure.vue +23 -0
  14. package/cloud-credential/harvester.vue +25 -62
  15. package/cloud-credential/pnap.vue +80 -0
  16. package/components/.DS_Store +0 -0
  17. package/components/ActionMenu.vue +28 -7
  18. package/components/AdvancedSection.vue +9 -2
  19. package/components/Alert.vue +2 -2
  20. package/components/ButtonDropdown.vue +0 -2
  21. package/components/ButtonGroup.vue +1 -0
  22. package/components/CollapsibleCard.vue +0 -1
  23. package/components/CruResource.vue +41 -4
  24. package/components/DetailTop.vue +72 -4
  25. package/components/DisableAuthProviderModal.vue +106 -0
  26. package/{rancher-components/components/Utils/DraggableZone → components}/DraggableZone.vue +0 -0
  27. package/components/ExplorerMembers.vue +253 -30
  28. package/components/ExplorerProjectsNamespaces.vue +77 -33
  29. package/components/ExtensionPanel.vue +42 -0
  30. package/components/GrowlManager.vue +3 -3
  31. package/components/IconOrSvg.vue +178 -0
  32. package/components/LogItem.vue +69 -0
  33. package/components/PodSecurityAdmission.vue +302 -0
  34. package/components/PromptModal.vue +1 -0
  35. package/components/ResourceDetail/Masthead.vue +69 -4
  36. package/components/ResourceDetail/index.vue +12 -5
  37. package/components/ResourceList/Masthead.vue +11 -1
  38. package/components/ResourceList/ResourceLoadingIndicator.vue +12 -2
  39. package/components/ResourceList/index.vue +66 -12
  40. package/components/ResourceList/resource-list.config.js +7 -0
  41. package/components/ResourceTable.vue +33 -6
  42. package/components/SimpleBox.vue +1 -1
  43. package/components/SortableTable/THead.vue +21 -14
  44. package/components/SortableTable/filtering.js +1 -1
  45. package/components/SortableTable/index.vue +21 -10
  46. package/components/SortableTable/selection.js +15 -3
  47. package/components/Tabbed/Tab.vue +1 -1
  48. package/components/Tabbed/index.vue +20 -15
  49. package/components/__tests__/.DS_Store +0 -0
  50. package/components/__tests__/AsyncButton.test.ts +140 -0
  51. package/components/__tests__/BackLink.test.ts +33 -0
  52. package/components/__tests__/ButtonGroup.test.ts +124 -0
  53. package/components/__tests__/ClusterBadge.test.ts +32 -0
  54. package/components/__tests__/CollapsibleCard.test.ts +64 -0
  55. package/components/__tests__/ConsumptionGauge.test.ts +88 -0
  56. package/components/__tests__/CruResource.test.ts +3 -2
  57. package/components/__tests__/FixedBanner.test.ts +129 -0
  58. package/components/__tests__/GrowlManager.test.ts +147 -0
  59. package/components/__tests__/NamespaceFilter.test.ts +33 -25
  60. package/components/__tests__/PercentageBar.test.ts +32 -0
  61. package/components/__tests__/PodSecurityAdmission.test.ts +398 -0
  62. package/components/auth/AuthBanner.vue +20 -10
  63. package/components/auth/RoleDetailEdit.vue +26 -17
  64. package/components/auth/SelectPrincipal.vue +36 -5
  65. package/components/form/ArrayList.vue +3 -35
  66. package/components/form/ArrayListGrouped.vue +13 -4
  67. package/components/form/ArrayListSelect.vue +5 -5
  68. package/components/form/Error.vue +8 -0
  69. package/components/form/KeyValue.vue +39 -7
  70. package/components/form/LabeledSelect.vue +5 -2
  71. package/components/form/Labels.vue +46 -16
  72. package/components/form/Members/ClusterPermissionsEditor.vue +17 -17
  73. package/components/form/Members/MembershipEditor.vue +12 -12
  74. package/components/form/NameNsDescription.vue +1 -1
  75. package/components/form/NodeScheduling.vue +1 -1
  76. package/components/form/Probe.vue +3 -3
  77. package/components/form/ResourceQuota/Project.vue +6 -6
  78. package/components/form/ResourceTabs/index.vue +24 -6
  79. package/components/form/Security.vue +7 -6
  80. package/components/form/Select.vue +3 -2
  81. package/components/form/SelectOrCreateAuthSecret.vue +22 -29
  82. package/components/form/ServicePorts.vue +8 -0
  83. package/components/form/WorkloadPorts.vue +7 -1
  84. package/components/form/__tests__/ArrayList.test.ts +74 -0
  85. package/components/form/__tests__/ArrayListGrouped.test.ts +6 -4
  86. package/components/formatter/Checked.vue +1 -1
  87. package/components/formatter/ClusterLink.vue +5 -0
  88. package/components/formatter/IconIsDefault.vue +2 -2
  89. package/components/formatter/InternalExternalIP.vue +11 -8
  90. package/components/formatter/LiveDuration.vue +78 -0
  91. package/components/formatter/WorkloadHealthScale.vue +5 -3
  92. package/components/nav/Header.vue +74 -7
  93. package/components/nav/NamespaceFilter.vue +146 -63
  94. package/components/nav/TopLevelMenu.vue +22 -19
  95. package/components/nav/WindowManager/ContainerLogs.vue +83 -126
  96. package/components/nav/WindowManager/ContainerShell.vue +9 -7
  97. package/components/nav/WindowManager/Window.vue +2 -0
  98. package/components/nav/WindowManager/index.vue +10 -0
  99. package/config/elemental-types.js +9 -0
  100. package/config/features.js +2 -0
  101. package/config/home-links.js +4 -1
  102. package/config/pod-security-admission.ts +82 -0
  103. package/config/product/apps.js +1 -1
  104. package/config/product/auth.js +6 -5
  105. package/config/product/backup.js +1 -1
  106. package/config/product/explorer.js +6 -6
  107. package/config/product/fleet.js +1 -1
  108. package/config/product/manager.js +6 -2
  109. package/config/query-params.js +1 -0
  110. package/config/secret.js +0 -1
  111. package/config/settings.ts +26 -9
  112. package/config/table-headers.js +22 -11
  113. package/config/types.js +4 -1
  114. package/config/uiplugins.js +3 -3
  115. package/content/docs/zh-hans/getting-started.md +113 -137
  116. package/content/docs/zh-hans/whats-new.md +8 -46
  117. package/core/plugin-helpers.js +171 -0
  118. package/core/plugin.ts +61 -1
  119. package/core/plugins.js +33 -0
  120. package/core/types.ts +128 -2
  121. package/creators/pkg/package-lock.json +37 -0
  122. package/creators/pkg/package.json +1 -1
  123. package/detail/catalog.cattle.io.app.vue +1 -1
  124. package/detail/pod.vue +1 -1
  125. package/detail/provisioning.cattle.io.cluster.vue +35 -9
  126. package/detail/service.vue +2 -9
  127. package/detail/workload/index.vue +0 -1
  128. package/dialog/AddClusterMemberDialog.vue +22 -28
  129. package/dialog/AddProjectMemberDialog.vue +53 -9
  130. package/dialog/DiagnosticTimingsDialog.vue +8 -7
  131. package/dialog/DrainNode.vue +44 -48
  132. package/dialog/ForceMachineRemoveDialog.vue +5 -7
  133. package/dialog/GenericPrompt.vue +15 -20
  134. package/dialog/RollbackWorkloadDialog.vue +15 -46
  135. package/dialog/RotateCertificatesDialog.vue +5 -7
  136. package/dialog/RotateEncryptionKeyDialog.vue +5 -9
  137. package/dialog/SaveAsRKETemplateDialog.vue +5 -13
  138. package/dialog/ScaleMachineDownDialog.vue +1 -1
  139. package/dialog/ScalePoolDownDialog.vue +121 -0
  140. package/edit/__tests__/management.cattle.io.setting.test.ts +3 -3
  141. package/edit/auth/azuread.vue +16 -16
  142. package/edit/auth/github.vue +8 -0
  143. package/edit/auth/googleoauth.vue +10 -1
  144. package/edit/auth/ldap/index.vue +10 -0
  145. package/edit/auth/oidc.vue +10 -0
  146. package/edit/auth/saml.vue +10 -0
  147. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
  148. package/edit/catalog.cattle.io.clusterrepo.vue +3 -0
  149. package/edit/cloudcredential.vue +3 -7
  150. package/edit/logging-flow/Match.vue +39 -8
  151. package/edit/logging-flow/index.vue +27 -4
  152. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +107 -0
  153. package/edit/management.cattle.io.project.vue +8 -1
  154. package/edit/management.cattle.io.setting.vue +5 -2
  155. package/edit/management.cattle.io.user.vue +7 -1
  156. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +36 -8
  157. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +2 -2
  158. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +14 -6
  159. package/edit/namespace.vue +18 -4
  160. package/edit/networking.k8s.io.ingress/Certificate.vue +1 -0
  161. package/edit/networking.k8s.io.ingress/IngressClass.vue +8 -6
  162. package/edit/networking.k8s.io.ingress/RulePath.vue +12 -6
  163. package/edit/networking.k8s.io.ingress/index.vue +8 -6
  164. package/edit/persistentvolume/index.vue +30 -27
  165. package/edit/persistentvolume/plugins/cephfs.vue +29 -29
  166. package/edit/persistentvolume/plugins/csi.vue +102 -62
  167. package/edit/persistentvolume/plugins/fc.vue +19 -19
  168. package/edit/persistentvolume/plugins/iscsi.vue +45 -45
  169. package/edit/persistentvolume/plugins/rbd.vue +39 -39
  170. package/edit/persistentvolumeclaim.vue +78 -75
  171. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +11 -7
  172. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +10 -1
  173. package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +87 -27
  174. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +3 -6
  175. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +96 -0
  176. package/edit/provisioning.cattle.io.cluster/import.vue +1 -1
  177. package/edit/provisioning.cattle.io.cluster/index.vue +29 -6
  178. package/edit/provisioning.cattle.io.cluster/rke2.vue +445 -154
  179. package/edit/secret/index.vue +3 -7
  180. package/edit/service.vue +3 -1
  181. package/edit/storage.k8s.io.storageclass/index.vue +100 -16
  182. package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +114 -0
  183. package/edit/workload/__tests__/index.test.ts +98 -0
  184. package/edit/workload/index.vue +58 -8
  185. package/edit/workload/mixins/workload.js +107 -70
  186. package/edit/workload/storage/ContainerMountPaths.vue +0 -10
  187. package/edit/workload/storage/emptyDir.vue +88 -0
  188. package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
  189. package/edit/workload/storage/index.vue +8 -0
  190. package/edit/workload/storage/persistentVolumeClaim/index.vue +1 -1
  191. package/layouts/default.vue +57 -44
  192. package/list/__tests__/workload.test.ts +5 -2
  193. package/list/catalog.cattle.io.app.vue +1 -0
  194. package/list/cis.cattle.io.clusterscan.vue +1 -0
  195. package/list/fleet.cattle.io.bundle.vue +5 -6
  196. package/list/fleet.cattle.io.cluster.vue +6 -3
  197. package/list/fleet.cattle.io.clusterregistrationtoken.vue +5 -6
  198. package/list/fleet.cattle.io.gitrepo.vue +4 -9
  199. package/list/helm.cattle.io.projecthelmchart.vue +1 -5
  200. package/list/logging.banzaicloud.io.clusterflow.vue +4 -1
  201. package/list/logging.banzaicloud.io.flow.vue +6 -5
  202. package/list/management.cattle.io.cluster.vue +1 -0
  203. package/list/management.cattle.io.feature.vue +3 -4
  204. package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +47 -0
  205. package/list/management.cattle.io.setting.vue +2 -2
  206. package/list/management.cattle.io.user.vue +4 -10
  207. package/list/monitoring.coreos.com.alertmanagerconfig.vue +2 -7
  208. package/list/node.vue +8 -5
  209. package/list/persistentvolume.vue +3 -3
  210. package/list/persistentvolumeclaim.vue +3 -4
  211. package/list/provisioning.cattle.io.cluster.vue +18 -19
  212. package/list/service.vue +6 -14
  213. package/list/workload.vue +43 -38
  214. package/machine-config/azure.vue +429 -60
  215. package/machine-config/pnap.vue +288 -0
  216. package/mixins/auth-config.js +1 -3
  217. package/mixins/browser-tab-visibility.js +8 -14
  218. package/mixins/chart.js +1 -1
  219. package/mixins/create-edit-view/impl.js +4 -0
  220. package/mixins/create-edit-view/index.js +4 -2
  221. package/mixins/resource-fetch-namespaced.js +98 -0
  222. package/mixins/resource-fetch.js +79 -45
  223. package/mixins/resource-manager.js +1 -23
  224. package/models/apps.controllerrevision.js +7 -0
  225. package/models/apps.daemonset.js +18 -0
  226. package/models/apps.deployment.js +44 -0
  227. package/models/apps.replicaset.js +7 -0
  228. package/models/apps.statefulset.js +18 -0
  229. package/models/batch.job.js +7 -14
  230. package/models/cluster/node.js +10 -2
  231. package/models/cluster.x-k8s.io.machine.js +26 -4
  232. package/models/cluster.x-k8s.io.machinedeployment.js +12 -2
  233. package/models/event.js +7 -0
  234. package/models/logging.banzaicloud.io.flow.js +4 -0
  235. package/models/management.cattle.io.cluster.js +1 -1
  236. package/models/management.cattle.io.clusterroletemplatebinding.js +1 -1
  237. package/models/management.cattle.io.globalrole.js +2 -2
  238. package/models/management.cattle.io.node.js +37 -2
  239. package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +4 -0
  240. package/models/management.cattle.io.project.js +30 -11
  241. package/models/management.cattle.io.setting.js +1 -1
  242. package/models/management.cattle.io.user.js +37 -1
  243. package/models/namespace.js +42 -5
  244. package/models/persistentvolume.js +14 -2
  245. package/models/pod.js +15 -0
  246. package/models/projectroletemplatebinding.js +7 -0
  247. package/models/provisioning.cattle.io.cluster.js +61 -10
  248. package/models/rke-machine.cattle.io.pnapmachinetemplate.js +15 -0
  249. package/models/service.js +14 -13
  250. package/models/storage.k8s.io.storageclass.js +33 -18
  251. package/models/workload.js +38 -7
  252. package/nuxt.config.js +27 -17
  253. package/package.json +7 -7
  254. package/pages/about.vue +14 -2
  255. package/pages/c/_cluster/apps/charts/index.vue +21 -3
  256. package/pages/c/_cluster/apps/charts/install.vue +59 -22
  257. package/pages/c/_cluster/auth/config/_id.vue +6 -0
  258. package/pages/c/_cluster/auth/config/index.vue +8 -6
  259. package/pages/c/_cluster/auth/group.principal/assign-edit.vue +1 -1
  260. package/pages/c/_cluster/auth/roles/index.vue +1 -1
  261. package/pages/c/_cluster/explorer/index.vue +51 -6
  262. package/pages/c/_cluster/longhorn/index.vue +1 -1
  263. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +15 -4
  264. package/pages/c/_cluster/monitoring/index.vue +1 -1
  265. package/pages/c/_cluster/neuvector/index.vue +1 -1
  266. package/pages/c/_cluster/settings/performance.vue +48 -2
  267. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +2 -0
  268. package/pages/c/_cluster/uiplugins/InstallDialog.vue +3 -0
  269. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +42 -2
  270. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +2 -0
  271. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +1 -0
  272. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +2 -0
  273. package/pages/c/_cluster/uiplugins/index.vue +42 -3
  274. package/pages/diagnostic.vue +5 -4
  275. package/pages/home.vue +105 -30
  276. package/pages/prefs.vue +23 -12
  277. package/pages/rio/mesh.vue +1 -1
  278. package/pkg/dynamic-importer.lib.js +8 -0
  279. package/pkg/vue.config.js +4 -0
  280. package/plugins/dashboard-store/__tests__/mutations.spec.js +406 -0
  281. package/plugins/dashboard-store/actions.js +32 -25
  282. package/plugins/dashboard-store/getters.js +50 -33
  283. package/plugins/dashboard-store/mutations.js +134 -28
  284. package/plugins/dashboard-store/resource-class.js +37 -42
  285. package/plugins/steve/actions.js +30 -0
  286. package/plugins/steve/caches/resourceCache.js +60 -0
  287. package/plugins/steve/getters.js +44 -1
  288. package/plugins/steve/mutations.js +97 -36
  289. package/plugins/steve/resourceWatcher.js +277 -0
  290. package/plugins/steve/schema.utils.js +25 -0
  291. package/plugins/steve/subscribe.js +288 -115
  292. package/plugins/steve/worker/index.js +17 -0
  293. package/plugins/steve/worker/web-worker.advanced.js +302 -0
  294. package/plugins/steve/{web-worker.steve-sub-worker.js → worker/web-worker.basic.js} +3 -44
  295. package/rancher-components/Card/Card.vue +3 -3
  296. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -0
  297. package/rancher-components/StringList/StringList.test.ts +45 -420
  298. package/rancher-components/StringList/StringList.vue +1 -10
  299. package/rancher-components/components/Banner/Banner.test.ts +44 -0
  300. package/rancher-components/components/Banner/Banner.vue +130 -61
  301. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +13 -22
  302. package/rancher-components/components/Form/Checkbox/Checkbox.vue +8 -6
  303. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +9 -9
  304. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +0 -1
  305. package/rancher-components/components/StringList/StringList.test.ts +7 -7
  306. package/rancher-components/components/StringList/StringList.vue +21 -15
  307. package/scripts/test-plugins-build.sh +8 -0
  308. package/static/loading-indicator.html +1 -1
  309. package/store/action-menu.js +4 -3
  310. package/store/index.js +54 -3
  311. package/store/plugins.js +0 -17
  312. package/store/pnap.js +128 -0
  313. package/store/prefs.js +4 -2
  314. package/store/type-map.js +81 -13
  315. package/types/pod-security-admission.ts +36 -0
  316. package/types/shell/index.d.ts +497 -396
  317. package/utils/__tests__/object.test.ts +17 -1
  318. package/utils/__tests__/pod-security-admission.test.ts +61 -0
  319. package/utils/async.ts +36 -0
  320. package/utils/color.js +45 -0
  321. package/utils/crypto/browserHashUtils.js +18 -0
  322. package/utils/dynamic-importer.js +8 -0
  323. package/utils/install-redirect.js +1 -1
  324. package/utils/object.js +24 -0
  325. package/utils/pod-security-admission.ts +39 -0
  326. package/utils/socket.js +61 -24
  327. package/utils/string.js +2 -0
  328. package/utils/svg-filter.js +301 -0
  329. package/utils/time.js +49 -0
  330. package/utils/validators/cidr.js +4 -0
  331. package/utils/validators/formRules/__tests__/index.test.ts +23 -3
  332. package/utils/validators/formRules/index.ts +14 -0
  333. package/config/product/harvester-manager.js +0 -162
  334. package/edit/harvesterhci.io.management.cluster.vue +0 -153
  335. package/list/harvesterhci.io.management.cluster.vue +0 -241
  336. package/machine-config/harvester.vue +0 -693
  337. package/models/harvesterhci.io.management.cluster.js +0 -228
  338. package/pages/c/_cluster/harvesterManager/index.vue +0 -24
  339. package/rancher-components/Card/Card.test.ts +0 -39
  340. package/rancher-components/Utils/DraggableZone/DraggableZone.vue +0 -181
  341. package/rancher-components/Utils/DraggableZone/index.ts +0 -1
  342. package/rancher-components/components/Utils/DraggableZone/index.ts +0 -1
package/core/plugin.ts CHANGED
@@ -1,6 +1,16 @@
1
1
  import { RouteConfig } from 'vue-router';
2
2
  import { DSL as STORE_DSL } from '@shell/store/type-map';
3
- import { CoreStoreInit, IPlugin } from './types';
3
+ import {
4
+ CoreStoreInit,
5
+ Action,
6
+ Tab,
7
+ Card,
8
+ Panel,
9
+ TableColumn,
10
+ IPlugin,
11
+ LocationConfig,
12
+ ExtensionPoint,
13
+ } from './types';
4
14
  import coreStore, { coreStoreModule, coreStoreState } from '@shell/plugins/dashboard-store';
5
15
  import {
6
16
  PluginRouteConfig, RegisterStore, UnregisterStore, CoreStoreSpecifics, CoreStoreConfig, OnNavToPackage, OnNavAwayFromPackage, OnLogOut
@@ -20,6 +30,8 @@ export class Plugin implements IPlugin {
20
30
  public onLeave: OnNavAwayFromPackage = () => Promise.resolve();
21
31
  public _onLogOut: OnLogOut = () => Promise.resolve();
22
32
 
33
+ public uiConfig: { [key: string]: any } = {};
34
+
23
35
  // Plugin metadata (plugin package.json)
24
36
  public _metadata: any = {};
25
37
 
@@ -34,6 +46,11 @@ export class Plugin implements IPlugin {
34
46
  constructor(id: string) {
35
47
  this.id = id;
36
48
  this.name = id;
49
+
50
+ // Initialize uiConfig for all of the possible enum values
51
+ Object.values(ExtensionPoint).forEach((v) => {
52
+ this.uiConfig[v] = {};
53
+ });
37
54
  }
38
55
 
39
56
  get metadata() {
@@ -108,6 +125,49 @@ export class Plugin implements IPlugin {
108
125
  this.routes.push({ parent, route });
109
126
  }
110
127
 
128
+ private _addUIConfig(type: string, where: string, when: LocationConfig | string, config: any) {
129
+ // For convenience 'when' can be a string to indicate a resource, so convert it to the LocationConfig format
130
+ const locationConfig = (typeof when === 'string') ? { resource: when } : when;
131
+
132
+ this.uiConfig[type][where] = this.uiConfig[type][where] || [];
133
+ this.uiConfig[type][where].push({ ...config, locationConfig });
134
+ }
135
+
136
+ /**
137
+ * Adds an action/button to the UI
138
+ */
139
+ addAction(where: string, when: LocationConfig | string, action: Action): void {
140
+ this._addUIConfig(ExtensionPoint.ACTION, where, when, action);
141
+ }
142
+
143
+ /**
144
+ * Adds a tab to the UI
145
+ */
146
+ addTab(where: string, when: LocationConfig | string, tab: Tab): void {
147
+ this._addUIConfig(ExtensionPoint.TAB, where, when, tab);
148
+ }
149
+
150
+ /**
151
+ * Adds a panel/component to the UI
152
+ */
153
+ addPanel(where: string, when: LocationConfig | string, panel: Panel): void {
154
+ this._addUIConfig(ExtensionPoint.PANEL, where, when, panel);
155
+ }
156
+
157
+ /**
158
+ * Adds a card to the to the UI
159
+ */
160
+ addCard( where: string, when: LocationConfig | string, card: Card): void {
161
+ this._addUIConfig(ExtensionPoint.CARD, where, when, card);
162
+ }
163
+
164
+ /**
165
+ * Adds a new column to a table on the UI
166
+ */
167
+ addTableColumn(where: string, when: LocationConfig | string, column: TableColumn): void {
168
+ this._addUIConfig(ExtensionPoint.TABLE_COL, where, when, column);
169
+ }
170
+
111
171
  setHomePage(component: any) {
112
172
  this.addRoute({
113
173
  name: 'home',
package/core/plugins.js CHANGED
@@ -3,6 +3,7 @@ import { clearModelCache } from '@shell/plugins/dashboard-store/model-loader';
3
3
  import { Plugin } from './plugin';
4
4
  import { PluginRoutes } from './plugin-routes';
5
5
  import { UI_PLUGIN_BASE_URL } from '@shell/config/uiplugins';
6
+ import { ExtensionPoint } from './types';
6
7
 
7
8
  const MODEL_TYPE = 'models';
8
9
 
@@ -21,6 +22,12 @@ export default function({
21
22
 
22
23
  const pluginRoutes = new PluginRoutes(app.router);
23
24
 
25
+ const uiConfig = {};
26
+
27
+ for (const ep in ExtensionPoint) {
28
+ uiConfig[ExtensionPoint[ep]] = {};
29
+ }
30
+
24
31
  inject('plugin', {
25
32
  // Plugins should not use these - but we will pass them in for now as a 2nd argument
26
33
  // in case there are use cases not covered that require direct access - we may remove access later
@@ -251,6 +258,18 @@ export default function({
251
258
  });
252
259
  });
253
260
 
261
+ // UI Configuration - copy UI config from a plugin into the global uiConfig object
262
+ Object.keys(plugin.uiConfig).forEach((actionType) => {
263
+ Object.keys(plugin.uiConfig[actionType]).forEach((actionLocation) => {
264
+ plugin.uiConfig[actionType][actionLocation].forEach((action) => {
265
+ if (!uiConfig[actionType][actionLocation]) {
266
+ uiConfig[actionType][actionLocation] = [];
267
+ }
268
+ uiConfig[actionType][actionLocation].push(action);
269
+ });
270
+ });
271
+ });
272
+
254
273
  // l10n
255
274
  Object.keys(plugin.l10n).forEach((name) => {
256
275
  plugin.l10n[name].forEach((fn) => {
@@ -334,6 +353,20 @@ export default function({
334
353
  return validators[name];
335
354
  },
336
355
 
356
+ /**
357
+ * Return the UI configuration for the given type and location
358
+ */
359
+ getUIConfig(type, uiArea) {
360
+ return uiConfig[type][uiArea] || [];
361
+ },
362
+
363
+ /**
364
+ * Returns all UI Configuration (useful for debugging)
365
+ */
366
+ getAllUIConfig() {
367
+ return uiConfig;
368
+ },
369
+
337
370
  // Timestamp that a UI package was last loaded
338
371
  // Typically used to invalidate caches (e.g. i18n) when new plugins are loaded
339
372
  get lastLoad() {
package/core/types.ts CHANGED
@@ -31,10 +31,111 @@ export type OnEnterLeavePackageConfig = {
31
31
  isExt: string,
32
32
  oldIsExt: string
33
33
  }
34
+
34
35
  export type OnNavToPackage = (store: any, config: OnEnterLeavePackageConfig) => Promise<void>;
35
36
  export type OnNavAwayFromPackage = (store: any, config: OnEnterLeavePackageConfig) => Promise<void>;
36
37
  export type OnLogOut = (store: any) => Promise<void>;
37
38
 
39
+ /** Enum regarding the extensionable areas/places of the UI */
40
+ export enum ExtensionPoint {
41
+ ACTION = 'Action', // eslint-disable-line no-unused-vars
42
+ TAB = 'Tab', // eslint-disable-line no-unused-vars
43
+ PANEL = 'Panel', // eslint-disable-line no-unused-vars
44
+ CARD = 'Card', // eslint-disable-line no-unused-vars
45
+ TABLE_COL = 'TableColumn', // eslint-disable-line no-unused-vars
46
+ }
47
+
48
+ /** Enum regarding action locations that are extensionable in the UI */
49
+ export enum ActionLocation {
50
+ HEADER = 'header-action', // eslint-disable-line no-unused-vars
51
+ TABLE = 'table-action', // eslint-disable-line no-unused-vars
52
+ }
53
+
54
+ /** Enum regarding panel locations that are extensionable in the UI */
55
+ export enum PanelLocation {
56
+ DETAILS_MASTHEAD = 'details-masthead', // eslint-disable-line no-unused-vars
57
+ DETAIL_TOP = 'detail-top', // eslint-disable-line no-unused-vars
58
+ RESOURCE_LIST = 'resource-list', // eslint-disable-line no-unused-vars
59
+ }
60
+
61
+ /** Enum regarding tab locations that are extensionable in the UI */
62
+ export enum TabLocation {
63
+ RESOURCE_DETAIL = 'tab', // eslint-disable-line no-unused-vars
64
+ }
65
+
66
+ /** Enum regarding card locations that are extensionable in the UI */
67
+ export enum CardLocation {
68
+ CLUSTER_DASHBOARD_CARD = 'cluster-dashboard-card', // eslint-disable-line no-unused-vars
69
+ }
70
+
71
+ /** Enum regarding table col locations that are extensionable in the UI */
72
+ export enum TableColumnLocation {
73
+ RESOURCE = 'resource-list', // eslint-disable-line no-unused-vars
74
+ }
75
+
76
+ /** Definition of the shortcut object (keyboard shortcuts) */
77
+ export type ShortCutKey = {
78
+ windows?: string[];
79
+ mac?: string[];
80
+ };
81
+
82
+ /** Definition of the action options (table actions) */
83
+ export type ActionOpts = {
84
+ event: any;
85
+ isAlt: boolean;
86
+ action: any;
87
+ };
88
+
89
+ /** Definition of an extension action (options that can be passed when setting an extension action) */
90
+ export type Action = {
91
+ label?: string;
92
+ labelKey?: string;
93
+ tooltipKey?: string;
94
+ tooltip?: string;
95
+ shortcut?: string | ShortCutKey;
96
+ svg?: Function;
97
+ icon?: string;
98
+ multiple?: boolean;
99
+ enabled?: (ctx: any) => boolean;
100
+ invoke: (opts: ActionOpts, resources: any[]) => void | boolean | Promise<boolean>;
101
+ };
102
+
103
+ /** Definition of a panel (options that can be passed when defining an extension panel enhancement) */
104
+ export type Panel = {
105
+ component: Function;
106
+ };
107
+
108
+ /** Definition of a card (options that can be passed when defining an extension card enhancement) */
109
+ export type Card = {
110
+ label?: string;
111
+ labelKey?: string;
112
+ component: Function;
113
+ };
114
+
115
+ export type TableColumn = any;
116
+
117
+ /** Definition of a tab (options that can be passed when defining an extension tab enhancement) */
118
+ export type Tab = {
119
+ name: string;
120
+ label?: string;
121
+ labelKey?: string;
122
+ tooltipKey?: string;
123
+ tooltip?: string;
124
+ showHeader?: boolean;
125
+ weight?: number;
126
+ component: Function;
127
+ };
128
+
129
+ /** Definition of the locationConfig object (used in extensions) */
130
+ export type LocationConfig = {
131
+ product?: string[],
132
+ resource?: string[],
133
+ namespace?: string[],
134
+ cluster?: string[],
135
+ id?: string[],
136
+ mode?: string[]
137
+ };
138
+
38
139
  /**
39
140
  * Interface for a Dashboard plugin
40
141
  */
@@ -63,7 +164,7 @@ export interface IPlugin {
63
164
  validators: {[key: string]: Function};
64
165
 
65
166
  /**
66
- * Add a module contains localisations for a specific locale
167
+ * Add a module containing localisations for a specific locale
67
168
  */
68
169
  addL10n(locale: string, fn: Function): void;
69
170
 
@@ -73,6 +174,31 @@ export interface IPlugin {
73
174
  addRoute(route: RouteConfig): void;
74
175
  addRoute(parent: string, route: RouteConfig): void;
75
176
 
177
+ /**
178
+ * Adds an action/button to the UI
179
+ */
180
+ addAction(where: ActionLocation | string, when: LocationConfig | string, action: Action): void;
181
+
182
+ /**
183
+ * Adds a tab to the UI (ResourceTabs component)
184
+ */
185
+ addTab(where: TabLocation | string, when: LocationConfig | string, action: Tab): void;
186
+
187
+ /**
188
+ * Adds a panel/component to the UI
189
+ */
190
+ addPanel(where: PanelLocation | string, when: LocationConfig | string, action: Panel): void;
191
+
192
+ /**
193
+ * Adds a card to the UI
194
+ */
195
+ addCard(where: CardLocation | string, when: LocationConfig | string, action: Card): void;
196
+
197
+ /**
198
+ * Adds a new column to the SortableTable component
199
+ */
200
+ addTableColumn(where: TableColumnLocation | string, when: LocationConfig | string, action: TableColumn): void;
201
+
76
202
  /**
77
203
  * Set the component to use for the landing home page
78
204
  * @param component Home page component
@@ -116,7 +242,7 @@ export interface IPlugin {
116
242
  onLogOut?: OnLogOut
117
243
  ): void;
118
244
 
119
- /**
245
+ /**
120
246
  * Register 'something' that can be dynamically loaded - e.g. model, edit, create, list, i18n
121
247
  * @param {String} type type of thing to register, e.g. 'edit'
122
248
  * @param {String} name unique name of 'something'
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@rancher/create-pkg",
3
+ "version": "0.1.37",
4
+ "lockfileVersion": 1,
5
+ "requires": true,
6
+ "dependencies": {
7
+ "fs-extra": {
8
+ "version": "10.1.0",
9
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
10
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
11
+ "requires": {
12
+ "graceful-fs": "^4.2.0",
13
+ "jsonfile": "^6.0.1",
14
+ "universalify": "^2.0.0"
15
+ }
16
+ },
17
+ "graceful-fs": {
18
+ "version": "4.2.10",
19
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
20
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
21
+ },
22
+ "jsonfile": {
23
+ "version": "6.1.0",
24
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
25
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
26
+ "requires": {
27
+ "graceful-fs": "^4.1.6",
28
+ "universalify": "^2.0.0"
29
+ }
30
+ },
31
+ "universalify": {
32
+ "version": "2.0.0",
33
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
34
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
35
+ }
36
+ }
37
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rancher/create-pkg",
3
3
  "description": "Rancher UI Package generator",
4
- "version": "0.0.0",
4
+ "version": "0.0.1",
5
5
  "license": "Apache-2.0",
6
6
  "author": "SUSE",
7
7
  "private": false,
@@ -30,7 +30,7 @@ export default {
30
30
  },
31
31
 
32
32
  async fetch() {
33
- await this.$store.dispatch('catalog/load');
33
+ await this.$store.dispatch('catalog/load', { force: true, reset: true });
34
34
 
35
35
  this.allOperations = await this.$store.dispatch('cluster/findAll', { type: CATALOG.OPERATION });
36
36
  },
package/detail/pod.vue CHANGED
@@ -98,7 +98,7 @@ export default {
98
98
  stateDisplay: status ? this.value.containerStateDisplay(status) : undefined,
99
99
  stateBackground: status ? this.value.containerStateColor(status).replace('text', 'bg') : undefined,
100
100
  nameSort: sortableNumericSuffix(container.name).toLowerCase(),
101
- readyIcon: status?.ready ? 'icon-checkmark icon-2x text-success ml-5' : 'icon-x icon-2x text-error ml-5',
101
+ readyIcon: status?.ready ? 'icon-checkmark text-success ml-5' : 'icon-x text-error ml-5',
102
102
  availableActions: this.value.containerActions,
103
103
  stateObj: status, // Required if there's a description
104
104
  stateDescription: descriptions.join(' | '), // Required to display the description
@@ -9,7 +9,7 @@ import Tab from '@shell/components/Tabbed/Tab';
9
9
  import { allHash } from '@shell/utils/promise';
10
10
  import { CAPI, MANAGEMENT, NORMAN, SNAPSHOT } from '@shell/config/types';
11
11
  import {
12
- STATE, NAME as NAME_COL, AGE, AGE_NORMAN, STATE_NORMAN, ROLES, MACHINE_NODE_OS, MANAGEMENT_NODE_OS, NAME, IP_ADDRESS
12
+ STATE, NAME as NAME_COL, AGE, AGE_NORMAN, INTERNAL_EXTERNAL_IP, STATE_NORMAN, ROLES, MACHINE_NODE_OS, MANAGEMENT_NODE_OS, NAME,
13
13
  } from '@shell/config/table-headers';
14
14
  import CustomCommand from '@shell/edit/provisioning.cattle.io.cluster/CustomCommand';
15
15
  import AsyncButton from '@shell/components/AsyncButton.vue';
@@ -17,7 +17,7 @@ import AnsiUp from 'ansi_up';
17
17
  import day from 'dayjs';
18
18
  import { addParams } from '@shell/utils/url';
19
19
  import { base64Decode } from '@shell/utils/crypto';
20
- import { DATE_FORMAT, TIME_FORMAT } from '@shell/store/prefs';
20
+ import { DATE_FORMAT, TIME_FORMAT, SCALE_POOL_PROMPT } from '@shell/store/prefs';
21
21
  import { escapeHtml } from '@shell/utils/string';
22
22
  import MachineSummaryGraph from '@shell/components/formatter/MachineSummaryGraph';
23
23
  import Socket, {
@@ -29,6 +29,7 @@ import Socket, {
29
29
  } from '@shell/utils/socket';
30
30
  import { get } from '@shell/utils/object';
31
31
  import CapiMachineDeployment from '@shell/models/cluster.x-k8s.io.machinedeployment';
32
+ import { isAlternate } from '@shell/utils/platform';
32
33
 
33
34
  let lastId = 1;
34
35
  const ansiup = new AnsiUp();
@@ -253,7 +254,9 @@ export default {
253
254
  const emptyPools = (this.value.spec.rkeConfig?.machinePools || []).filter((mp) => {
254
255
  const machinePrefix = `${ this.value.name }-${ mp.name }`;
255
256
  const machines = this.value.machines.filter((machine) => {
256
- return machine.spec?.infrastructureRef?.name.startsWith(machinePrefix);
257
+ const isElementalCluster = machine.spec?.infrastructureRef?.apiVersion.startsWith('elemental.cattle.io');
258
+
259
+ return !isElementalCluster ? machine.spec?.infrastructureRef?.name.startsWith(machinePrefix) : machine.spec?.infrastructureRef?.name.includes(machinePrefix);
257
260
  });
258
261
 
259
262
  return machines.length === 0;
@@ -356,7 +359,7 @@ export default {
356
359
  formatterOpts: { reference: 'kubeNodeDetailLocation' },
357
360
  dashIfEmpty: true,
358
361
  },
359
- IP_ADDRESS,
362
+ INTERNAL_EXTERNAL_IP,
360
363
  MACHINE_NODE_OS,
361
364
  ROLES,
362
365
  AGE,
@@ -375,7 +378,7 @@ export default {
375
378
  formatterOpts: { reference: 'kubeNodeDetailLocation' },
376
379
  dashIfEmpty: true,
377
380
  },
378
- IP_ADDRESS,
381
+ INTERNAL_EXTERNAL_IP,
379
382
  MANAGEMENT_NODE_OS,
380
383
  ROLES,
381
384
  AGE
@@ -500,6 +503,24 @@ export default {
500
503
  },
501
504
 
502
505
  methods: {
506
+ toggleScaleDownModal( event, resources ) {
507
+ // Check if the user held alt key when an action is clicked.
508
+ const alt = isAlternate(event);
509
+ const showScalePoolPrompt = this.$store.getters['prefs/get'](SCALE_POOL_PROMPT);
510
+
511
+ // Prompt if showScalePoolPrompt pref not store and user did not held alt key
512
+ if (!alt && !showScalePoolPrompt) {
513
+ this.$store.dispatch('management/promptModal', {
514
+ component: 'ScalePoolDownDialog',
515
+ resources,
516
+ modalWidth: '450px'
517
+ });
518
+ } else {
519
+ // User held alt key, so don't prompt
520
+ resources.scalePool(-1);
521
+ }
522
+ },
523
+
503
524
  async takeSnapshot(btnCb) {
504
525
  try {
505
526
  await this.value.takeSnapshot();
@@ -679,16 +700,21 @@ export default {
679
700
  </div>
680
701
  </div>
681
702
  <div
682
- v-if="group.ref"
683
- class="right mr-45"
703
+ v-if="group.ref && poolSummaryInfo[group.ref]"
704
+ class="right group-header-buttons mr-20"
684
705
  >
706
+ <MachineSummaryGraph
707
+ :row="poolSummaryInfo[group.ref]"
708
+ :horizontal="true"
709
+ class="mr-20"
710
+ />
685
711
  <template v-if="value.hasLink('update') && group.ref.showScalePool">
686
712
  <button
687
713
  v-tooltip="t('node.list.scaleDown')"
688
714
  :disabled="!group.ref.canScaleDownPool()"
689
715
  type="button"
690
716
  class="btn btn-sm role-secondary"
691
- @click="group.ref.scalePool(-1)"
717
+ @click="toggleScaleDownModal($event, group.ref)"
692
718
  >
693
719
  <i class="icon icon-sm icon-minus" />
694
720
  </button>
@@ -772,7 +798,7 @@ export default {
772
798
  :disabled="group.ref.spec.quantity < 2"
773
799
  type="button"
774
800
  class="btn btn-sm role-secondary"
775
- @click="group.ref.scalePool(-1)"
801
+ @click="toggleScaleDownModal($event, group.ref)"
776
802
  >
777
803
  <i class="icon icon-sm icon-minus" />
778
804
  </button>
@@ -11,7 +11,6 @@ import Tab from '@shell/components/Tabbed/Tab';
11
11
  import { CATTLE_PUBLIC_ENDPOINTS } from '@shell/config/labels-annotations';
12
12
  import { KEY, VALUE } from '@shell/config/table-headers';
13
13
  import { POD } from '@shell/config/types';
14
- import { allHash } from '@shell/utils/promise';
15
14
  import { findBy } from '@shell/utils/array';
16
15
 
17
16
  export default {
@@ -36,13 +35,7 @@ export default {
36
35
  },
37
36
 
38
37
  async fetch() {
39
- const hash = { pods: this.value.pods() };
40
-
41
- const res = await allHash(hash);
42
-
43
- for (const k in res) {
44
- this[k] = res[k];
45
- }
38
+ await this.value.fetchPods();
46
39
  },
47
40
 
48
41
  data() {
@@ -159,7 +152,7 @@ export default {
159
152
  :weight="4"
160
153
  >
161
154
  <ResourceTable
162
- :rows="pods"
155
+ :rows="value.pods"
163
156
  :headers="podTableHeaders"
164
157
  key-field="id"
165
158
  :table-actions="false"
@@ -373,7 +373,6 @@ export default {
373
373
  </div>
374
374
  <ResourceTabs
375
375
  :value="value"
376
- :always-show-events="true"
377
376
  >
378
377
  <Tab
379
378
  v-if="isCronJob"
@@ -9,9 +9,9 @@ export default {
9
9
  },
10
10
 
11
11
  props: {
12
- resources: {
13
- type: Array,
14
- required: true
12
+ onAdd: {
13
+ type: Function,
14
+ default: () => {}
15
15
  }
16
16
  },
17
17
 
@@ -19,12 +19,6 @@ export default {
19
19
  return { bindings: [] };
20
20
  },
21
21
 
22
- computed: {
23
- onAdd() {
24
- return this.resources[0];
25
- },
26
- },
27
-
28
22
  methods: {
29
23
  close() {
30
24
  this.$emit('close');
@@ -39,33 +33,33 @@ export default {
39
33
  </script>
40
34
 
41
35
  <template>
42
- <Card
43
- class="prompt-rotate"
44
- :show-highlight-border="false"
36
+ <Card
37
+ class="prompt-rotate"
38
+ :show-highlight-border="false"
45
39
  >
46
- <h4
47
- slot="title"
48
- class="text-default-text"
49
- v-html="t('addClusterMemberDialog.title')"
40
+ <h4
41
+ slot="title"
42
+ class="text-default-text"
43
+ v-html="t('addClusterMemberDialog.title')"
50
44
  />
51
45
 
52
- <div
53
- slot="body"
54
- class="pl-10 pr-10"
46
+ <div
47
+ slot="body"
48
+ class="pl-10 pr-10"
55
49
  >
56
- <ClusterPermissionsEditor
57
- v-model="bindings"
58
- :use-two-columns-for-custom="true"
50
+ <ClusterPermissionsEditor
51
+ v-model="bindings"
52
+ :use-two-columns-for-custom="true"
59
53
  />
60
54
  </div>
61
55
 
62
- <div
63
- slot="actions"
64
- class="buttons"
56
+ <div
57
+ slot="actions"
58
+ class="buttons"
65
59
  >
66
- <button
67
- class="btn role-secondary mr-10"
68
- @click="close"
60
+ <button
61
+ class="btn role-secondary mr-10"
62
+ @click="close"
69
63
  >
70
64
  {{ t('generic.cancel') }}
71
65
  </button>