@rancher/shell 0.1.2 → 0.1.4

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 (347) hide show
  1. package/assets/brand/suse/dark/rancher-logo.svg +1 -148
  2. package/assets/brand/suse/rancher-logo.svg +1 -130
  3. package/assets/images/featured/img1.jpg +0 -0
  4. package/assets/images/featured.jpg +0 -0
  5. package/assets/images/generic-plugin.svg +7 -0
  6. package/assets/styles/themes/_dark.scss +3 -0
  7. package/assets/styles/themes/_light.scss +3 -0
  8. package/assets/styles/themes/_suse.scss +1 -1
  9. package/assets/translations/en-us.yaml +209 -813
  10. package/assets/translations/zh-hans.yaml +28 -792
  11. package/components/ActionMenu.vue +3 -3
  12. package/components/AsyncButton.vue +17 -2
  13. package/components/ButtonDropdown.vue +4 -0
  14. package/components/Carousel.vue +291 -0
  15. package/components/CodeMirror.vue +6 -8
  16. package/components/CommunityLinks.vue +70 -19
  17. package/components/ContainerResourceLimit.vue +14 -0
  18. package/components/CruResource.vue +11 -3
  19. package/components/Dialog.vue +102 -0
  20. package/components/ExplorerMembers.vue +121 -0
  21. package/components/ExplorerProjectsNamespaces.vue +404 -0
  22. package/components/GrafanaDashboard.vue +17 -2
  23. package/components/IconMessage.vue +9 -1
  24. package/components/LocaleSelector.vue +114 -0
  25. package/components/PromptModal.vue +2 -3
  26. package/components/ResourceList/index.vue +1 -1
  27. package/components/ResourceTable.vue +9 -7
  28. package/components/SimpleBox.vue +6 -4
  29. package/components/SingleClusterInfo.vue +1 -1
  30. package/components/SortableTable/index.vue +18 -25
  31. package/components/SortableTable/selection.js +1 -0
  32. package/components/Tabbed/Tab.vue +5 -0
  33. package/components/Tabbed/index.vue +29 -2
  34. package/components/auth/AzureWarning.vue +5 -1
  35. package/components/auth/Principal.vue +2 -1
  36. package/components/auth/RoleDetailEdit.vue +18 -11
  37. package/components/fleet/FleetBundles.vue +8 -3
  38. package/components/fleet/FleetRepos.vue +0 -2
  39. package/components/fleet/FleetSummary.vue +6 -0
  40. package/components/form/KeyValue.vue +80 -58
  41. package/components/form/NameNsDescription.vue +12 -8
  42. package/components/form/NodeScheduling.vue +1 -1
  43. package/components/form/ResourceTabs/index.vue +5 -1
  44. package/components/form/WorkloadPorts.vue +1 -1
  45. package/components/formatter/ClusterLink.vue +3 -7
  46. package/components/formatter/WorkloadHealthScale.vue +1 -1
  47. package/components/nav/Header.vue +9 -9
  48. package/components/nav/NamespaceFilter.vue +10 -7
  49. package/components/nav/TopLevelMenu.vue +10 -65
  50. package/components/nav/WindowManager/ContainerLogs.vue +1 -1
  51. package/config/footer.js +13 -14
  52. package/config/labels-annotations.js +2 -1
  53. package/config/product/explorer.js +5 -4
  54. package/config/product/harvester-manager.js +64 -2
  55. package/config/product/legacy.js +0 -47
  56. package/config/product/manager.js +9 -0
  57. package/config/product/multi-cluster-apps.js +0 -12
  58. package/config/product/settings.js +12 -1
  59. package/config/product/uiplugins.js +17 -0
  60. package/config/settings.js +37 -72
  61. package/config/table-headers.js +0 -1
  62. package/config/types.js +9 -25
  63. package/config/uiplugins.js +60 -0
  64. package/content/docs/en-us/getting-started.md +1 -26
  65. package/core/plugin-routes.ts +34 -22
  66. package/core/plugin.ts +15 -3
  67. package/core/plugins-loader.js +2 -0
  68. package/core/plugins.js +91 -36
  69. package/core/types.ts +7 -1
  70. package/detail/provisioning.cattle.io.cluster.vue +15 -2
  71. package/detail/workload/index.vue +11 -5
  72. package/{components/dialog → dialog}/AddClusterMemberDialog.vue +0 -0
  73. package/{components/dialog → dialog}/AddCustomBadgeDialog.vue +0 -0
  74. package/{components/dialog → dialog}/AddProjectMemberDialog.vue +0 -0
  75. package/{components/dialog → dialog}/AddonConfigConfirmationDialog.vue +0 -0
  76. package/dialog/DiagnosticTimingsDialog.vue +116 -0
  77. package/{components/dialog → dialog}/DrainNode.vue +0 -0
  78. package/{components/dialog → dialog}/ForceMachineRemoveDialog.vue +0 -0
  79. package/{components/dialog → dialog}/GenericPrompt.vue +0 -0
  80. package/{components/dialog → dialog}/RollbackWorkloadDialog.vue +0 -0
  81. package/{components/dialog → dialog}/RotateCertificatesDialog.vue +9 -3
  82. package/{components/dialog → dialog}/RotateEncryptionKeyDialog.vue +0 -0
  83. package/{components/dialog → dialog}/SaveAsRKETemplateDialog.vue +0 -0
  84. package/{components/dialog → dialog}/ScaleMachineDownDialog.vue +0 -0
  85. package/edit/auth/azuread.vue +44 -6
  86. package/edit/management.cattle.io.project.vue +2 -2
  87. package/edit/namespace.vue +17 -10
  88. package/edit/networking.k8s.io.ingress/index.vue +2 -2
  89. package/edit/persistentvolume/index.vue +3 -0
  90. package/edit/persistentvolumeclaim.vue +1 -0
  91. package/edit/pod.vue +27 -0
  92. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +1 -1
  93. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +33 -5
  94. package/edit/provisioning.cattle.io.cluster/rke2.vue +76 -5
  95. package/edit/service.vue +8 -6
  96. package/edit/workload/__tests__/Upgrading.test.ts +1 -0
  97. package/edit/workload/index.vue +375 -15
  98. package/edit/workload/mixins/workload.js +62 -7
  99. package/edit/workload/storage/ContainerMountPaths.vue +240 -0
  100. package/edit/workload/storage/Mount.vue +1 -0
  101. package/edit/workload/storage/awsElasticBlockStore.vue +20 -1
  102. package/edit/workload/storage/azureDisk.vue +22 -2
  103. package/edit/workload/storage/azureFile.vue +20 -2
  104. package/edit/workload/storage/csi/index.vue +23 -1
  105. package/edit/workload/storage/gcePersistentDisk.vue +20 -2
  106. package/edit/workload/storage/index.vue +23 -49
  107. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -0
  108. package/edit/workload/storage/vsphereVolume.vue +11 -1
  109. package/layouts/default.vue +63 -32
  110. package/layouts/error.vue +5 -1
  111. package/layouts/home.vue +14 -5
  112. package/layouts/plain.vue +10 -5
  113. package/list/harvesterhci.io.management.cluster.vue +74 -33
  114. package/list/management.cattle.io.setting.vue +3 -3
  115. package/list/namespace.vue +3 -5
  116. package/list/provisioning.cattle.io.cluster.vue +1 -1
  117. package/machine-config/amazonec2.vue +2 -0
  118. package/machine-config/harvester.vue +100 -51
  119. package/middleware/authenticated.js +56 -52
  120. package/mixins/form-validation.js +1 -1
  121. package/mixins/resource-fetch.js +3 -1
  122. package/models/catalog.cattle.io.uiplugin.js +34 -0
  123. package/models/cluster/node.js +25 -2
  124. package/models/fleet.cattle.io.bundle.js +27 -20
  125. package/models/harvesterhci.io.management.cluster.js +200 -5
  126. package/models/management.cattle.io.cluster.js +1 -1
  127. package/models/management.cattle.io.clusterroletemplatebinding.js +9 -0
  128. package/models/management.cattle.io.project.js +23 -2
  129. package/models/namespace.js +19 -3
  130. package/models/pod.js +19 -2
  131. package/models/provisioning.cattle.io.cluster.js +16 -6
  132. package/models/workload.js +9 -246
  133. package/models/workload.service.js +314 -0
  134. package/nuxt.config.js +80 -34
  135. package/package.json +107 -108
  136. package/pages/auth/login.vue +11 -2
  137. package/pages/auth/setup.vue +1 -1
  138. package/pages/c/_cluster/_product/members/index.vue +3 -93
  139. package/pages/c/_cluster/_product/projectsnamespaces.vue +6 -403
  140. package/pages/c/_cluster/apps/charts/index.vue +46 -1
  141. package/pages/c/_cluster/apps/charts/install.vue +10 -9
  142. package/pages/c/_cluster/explorer/index.vue +72 -9
  143. package/pages/c/_cluster/explorer/tools/index.vue +12 -5
  144. package/pages/c/_cluster/mcapps/index.vue +1 -1
  145. package/pages/c/_cluster/settings/brand.vue +0 -40
  146. package/pages/c/_cluster/settings/links.vue +200 -0
  147. package/pages/c/_cluster/settings/performance.vue +19 -16
  148. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +232 -0
  149. package/pages/c/_cluster/uiplugins/InstallDialog.vue +242 -0
  150. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +284 -0
  151. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +130 -0
  152. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +253 -0
  153. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +115 -0
  154. package/pages/c/_cluster/uiplugins/index.vue +694 -0
  155. package/pages/diagnostic.vue +185 -101
  156. package/pages/docs/_doc.vue +3 -1
  157. package/pages/fail-whale.vue +1 -10
  158. package/pages/home.vue +21 -56
  159. package/pages/index.vue +18 -4
  160. package/pages/prefs.vue +108 -86
  161. package/pages/safeMode.vue +17 -0
  162. package/pages/support/index.vue +23 -15
  163. package/pkg/auto-import.js +44 -7
  164. package/pkg/dynamic-importer.lib.js +4 -0
  165. package/pkg/dynamic-plugin-loader.js +28 -0
  166. package/pkg/import.js +2 -2
  167. package/pkg/model-loader-require.lib.js +3 -0
  168. package/pkg/vue.config.js +9 -6
  169. package/plugins/dashboard-store/model-loader-require.js +12 -0
  170. package/plugins/dashboard-store/model-loader.js +4 -1
  171. package/plugins/dashboard-store/resource-class.js +12 -5
  172. package/plugins/formatters.js +15 -0
  173. package/plugins/plugin.js +56 -4
  174. package/plugins/steve/actions.js +1 -1
  175. package/plugins/steve/index.js +6 -4
  176. package/plugins/steve/mutations.js +1 -1
  177. package/plugins/steve/subscribe.js +89 -56
  178. package/plugins/steve/web-worker.steve-sub-worker.js +24 -15
  179. package/promptRemove/management.cattle.io.globalrole.vue +47 -0
  180. package/promptRemove/management.cattle.io.roletemplate.vue +47 -0
  181. package/promptRemove/mixin/roleDeletionCheck.js +97 -0
  182. package/rancher-components/Form/Checkbox/Checkbox.test.ts +77 -0
  183. package/rancher-components/Form/Checkbox/Checkbox.vue +12 -2
  184. package/scripts/build-pkg.sh +48 -2
  185. package/scripts/drone-build-pkg.sh +31 -0
  186. package/scripts/publish-shell.sh +11 -12
  187. package/scripts/serve-pkgs +17 -10
  188. package/scripts/sync-shell-deps +37 -0
  189. package/store/catalog.js +12 -9
  190. package/store/i18n.js +26 -12
  191. package/store/index.js +4 -181
  192. package/store/prefs.js +46 -2
  193. package/store/type-map.js +47 -33
  194. package/store/uiplugins.ts +15 -61
  195. package/utils/__tests__/object.test.ts +0 -24
  196. package/utils/__tests__/selector.test.ts +1 -1
  197. package/utils/cluster.js +1 -1
  198. package/utils/custom-validators.js +1 -12
  199. package/utils/dynamic-importer.js +5 -1
  200. package/utils/grafana.js +2 -6
  201. package/utils/socket.js +41 -20
  202. package/utils/string.js +1 -7
  203. package/utils/validators/formRules/__tests__/index.test.ts +108 -0
  204. package/utils/validators/formRules/index.ts +9 -1
  205. package/utils/validators/setting.js +0 -35
  206. package/yarn-error.log +195 -0
  207. package/components/FilterLabel.vue +0 -254
  208. package/components/HarvesterUpgradeProgressBarList.vue +0 -109
  209. package/components/VMConsoleBar.vue +0 -87
  210. package/components/dialog/harvester/AddHotplugModal.vue +0 -159
  211. package/components/dialog/harvester/BackupModal.vue +0 -117
  212. package/components/dialog/harvester/CloneTemplate.vue +0 -125
  213. package/components/dialog/harvester/EjectCDROMDialog.vue +0 -157
  214. package/components/dialog/harvester/ExportImageDialog.vue +0 -152
  215. package/components/dialog/harvester/MaintenanceDialog.vue +0 -94
  216. package/components/dialog/harvester/MigrationDialog.vue +0 -154
  217. package/components/dialog/harvester/RestoreDialog.vue +0 -153
  218. package/components/dialog/harvester/SupportBundle.vue +0 -217
  219. package/components/dialog/harvester/UnplugVolume.vue +0 -108
  220. package/components/form/SerialConsole/index.vue +0 -267
  221. package/components/formatter/AttachVMWithName.vue +0 -46
  222. package/components/formatter/CloudInitType.vue +0 -27
  223. package/components/formatter/HarvesterBackupTargetValidation.vue +0 -43
  224. package/components/formatter/HarvesterCPUUsed.vue +0 -122
  225. package/components/formatter/HarvesterDiskState.vue +0 -66
  226. package/components/formatter/HarvesterHostName.vue +0 -66
  227. package/components/formatter/HarvesterIpAddress.vue +0 -90
  228. package/components/formatter/HarvesterMemoryUsed.vue +0 -140
  229. package/components/formatter/HarvesterMigrationState.vue +0 -85
  230. package/components/formatter/HarvesterNodeName.vue +0 -49
  231. package/components/formatter/HarvesterStorageUsed.vue +0 -194
  232. package/components/formatter/HarvesterVmState.vue +0 -123
  233. package/components/nav/HarvesterUpgrade.vue +0 -232
  234. package/components/novnc/NovncConsole.vue +0 -93
  235. package/components/novnc/NovncConsoleItem.vue +0 -89
  236. package/components/novnc/NovncConsoleWrapper.vue +0 -243
  237. package/config/harvester-map.js +0 -44
  238. package/config/harvester-table-headers.js +0 -27
  239. package/config/product/harvester.js +0 -305
  240. package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +0 -364
  241. package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +0 -200
  242. package/detail/harvesterhci.io.host/HarvesterHostNetwork.vue +0 -89
  243. package/detail/harvesterhci.io.host/VirtualMachineInstance.vue +0 -134
  244. package/detail/harvesterhci.io.host/index.vue +0 -243
  245. package/detail/harvesterhci.io.virtualmachinebackup/index.vue +0 -221
  246. package/detail/harvesterhci.io.virtualmachineimage.vue +0 -118
  247. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineBasics.vue +0 -279
  248. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineEvents.vue +0 -75
  249. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineKeypairs.vue +0 -114
  250. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineMigration.vue +0 -79
  251. package/detail/kubevirt.io.virtualmachine/index.vue +0 -213
  252. package/edit/harvesterhci.io.cloudtemplate.vue +0 -123
  253. package/edit/harvesterhci.io.host/HarvesterDisk.vue +0 -262
  254. package/edit/harvesterhci.io.host/index.vue +0 -533
  255. package/edit/harvesterhci.io.keypair.vue +0 -112
  256. package/edit/harvesterhci.io.managedchart/index.vue +0 -25
  257. package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +0 -172
  258. package/edit/harvesterhci.io.networkattachmentdefinition.vue +0 -210
  259. package/edit/harvesterhci.io.setting/additional-ca.vue +0 -36
  260. package/edit/harvesterhci.io.setting/backup-target.vue +0 -182
  261. package/edit/harvesterhci.io.setting/http-proxy.vue +0 -79
  262. package/edit/harvesterhci.io.setting/index.vue +0 -201
  263. package/edit/harvesterhci.io.setting/overcommit-config.vue +0 -94
  264. package/edit/harvesterhci.io.setting/ssl-certificates.vue +0 -117
  265. package/edit/harvesterhci.io.setting/ssl-parameters.vue +0 -161
  266. package/edit/harvesterhci.io.setting/support-bundle-image.vue +0 -134
  267. package/edit/harvesterhci.io.setting/support-bundle-namespaces.vue +0 -73
  268. package/edit/harvesterhci.io.setting/vip-pools.vue +0 -244
  269. package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +0 -81
  270. package/edit/harvesterhci.io.virtualmachinebackup.vue +0 -256
  271. package/edit/harvesterhci.io.virtualmachineimage.vue +0 -364
  272. package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +0 -340
  273. package/edit/harvesterhci.io.volume.vue +0 -195
  274. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +0 -190
  275. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +0 -212
  276. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/basicAuth.vue +0 -94
  277. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/sshkey.vue +0 -85
  278. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +0 -153
  279. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +0 -279
  280. package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +0 -113
  281. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +0 -41
  282. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +0 -281
  283. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/index.vue +0 -142
  284. package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +0 -54
  285. package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +0 -256
  286. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +0 -391
  287. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +0 -40
  288. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +0 -102
  289. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +0 -117
  290. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +0 -74
  291. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +0 -132
  292. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +0 -303
  293. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +0 -285
  294. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +0 -188
  295. package/edit/kubevirt.io.virtualmachine/index.vue +0 -642
  296. package/edit/network.harvesterhci.io.clusternetwork/index.vue +0 -19
  297. package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +0 -134
  298. package/edit/workload/types/Deployment.vue +0 -377
  299. package/edit/workload/types/Generic.vue +0 -295
  300. package/list/harvesterhci.io.cloudtemplate.vue +0 -78
  301. package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +0 -211
  302. package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +0 -40
  303. package/list/harvesterhci.io.dashboard/index.vue +0 -752
  304. package/list/harvesterhci.io.host/index.vue +0 -186
  305. package/list/harvesterhci.io.networkattachmentdefinition.vue +0 -167
  306. package/list/harvesterhci.io.setting.vue +0 -241
  307. package/list/harvesterhci.io.virtualmachinebackup.vue +0 -172
  308. package/list/harvesterhci.io.virtualmachineimage.vue +0 -80
  309. package/list/harvesterhci.io.virtualmachinetemplateversion.vue +0 -173
  310. package/list/harvesterhci.io.volume.vue +0 -122
  311. package/list/kubevirt.io.virtualmachine.vue +0 -193
  312. package/mixins/harvester-vm/impl.js +0 -267
  313. package/mixins/harvester-vm/index.js +0 -1357
  314. package/models/harvester/configmap.js +0 -32
  315. package/models/harvester/harvesterhci.io.blockdevice.js +0 -55
  316. package/models/harvester/harvesterhci.io.keypair.js +0 -12
  317. package/models/harvester/harvesterhci.io.setting.js +0 -127
  318. package/models/harvester/harvesterhci.io.supportbundle.js +0 -35
  319. package/models/harvester/harvesterhci.io.upgrade.js +0 -226
  320. package/models/harvester/harvesterhci.io.virtualmachinebackup.js +0 -116
  321. package/models/harvester/harvesterhci.io.virtualmachineimage.js +0 -255
  322. package/models/harvester/harvesterhci.io.virtualmachinerestore.js +0 -43
  323. package/models/harvester/harvesterhci.io.virtualmachinetemplate.js +0 -69
  324. package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +0 -227
  325. package/models/harvester/k8s.cni.cncf.io.networkattachmentdefinition.js +0 -32
  326. package/models/harvester/kubevirt.io.virtualmachine.js +0 -850
  327. package/models/harvester/kubevirt.io.virtualmachineinstance.js +0 -142
  328. package/models/harvester/management.cattle.io.managedchart.js +0 -191
  329. package/models/harvester/management.cattle.io.setting.js +0 -40
  330. package/models/harvester/network.harvesterhci.io.clusternetwork.js +0 -100
  331. package/models/harvester/network.harvesterhci.io.nodenetwork.js +0 -34
  332. package/models/harvester/node.js +0 -255
  333. package/models/harvester/persistentvolumeclaim.js +0 -166
  334. package/models/harvester/pod.js +0 -185
  335. package/pages/c/_cluster/harvester/airgapupgrade/index.vue +0 -309
  336. package/pages/c/_cluster/harvester/console/_uid/serial.vue +0 -51
  337. package/pages/c/_cluster/harvester/console/_uid/vnc.vue +0 -52
  338. package/pages/c/_cluster/harvester/index.vue +0 -24
  339. package/pages/c/_cluster/harvester/support/index.vue +0 -154
  340. package/pages/plugins.vue +0 -387
  341. package/pkg/model-loader.lib.js +0 -3
  342. package/promptRemove/kubevirt.io.virtualmachine.vue +0 -164
  343. package/server/verdaccio-middleware.js +0 -56
  344. package/store/harvester-common.js +0 -126
  345. package/utils/validators/vm-datavolumes.js +0 -38
  346. package/utils/validators/vm-image.js +0 -32
  347. package/utils/validators/vm.js +0 -221
@@ -0,0 +1,114 @@
1
+ <script>
2
+ import { mapGetters } from 'vuex';
3
+ import Select from '@shell/components/form/Select.vue';
4
+
5
+ export default {
6
+ name: 'LocalSelector',
7
+
8
+ components: { Select },
9
+
10
+ props: {
11
+ mode: {
12
+ type: String,
13
+ default: ''
14
+ },
15
+ },
16
+
17
+ computed: {
18
+ ...mapGetters('i18n', ['selectedLocaleLabel', 'availableLocales']),
19
+
20
+ localesOptions() {
21
+ return Object.keys(this.availableLocales).map((value) => {
22
+ return {
23
+ label: this.t(`locale.${ value }`),
24
+ value
25
+ };
26
+ });
27
+ },
28
+
29
+ selectedOption() {
30
+ return Object.keys(this.availableLocales)[Object.values(this.availableLocales).indexOf(this.selectedLocaleLabel)];
31
+ },
32
+
33
+ showLocale() {
34
+ return (this.availableLocales && Object.keys(this.availableLocales).length > 1) || this.dev;
35
+ },
36
+
37
+ showNone() {
38
+ return !!process.env.dev && this.dev;
39
+ },
40
+ },
41
+
42
+ methods: {
43
+ switchLocale($event) {
44
+ this.$store.dispatch('i18n/switchTo', $event);
45
+ },
46
+ }
47
+ };
48
+ </script>
49
+
50
+ <template>
51
+ <div>
52
+ <div v-if="mode === 'login'">
53
+ <div v-if="showLocale">
54
+ <v-popover
55
+ popover-class="localeSelector"
56
+ placement="top"
57
+ trigger="click"
58
+ >
59
+ <a
60
+ data-testid="locale-selector"
61
+ class="locale-chooser"
62
+ >
63
+ {{ selectedLocaleLabel }}
64
+ <i class="icon icon-fw icon-sort-down" />
65
+ </a>
66
+ <template slot="popover">
67
+ <ul class="list-unstyled dropdown" style="margin: -1px;">
68
+ <li v-if="showNone" v-t="'locale.none'" class="hand" @click="switchLocale('none')" />
69
+ <li
70
+ v-for="(label, name) in availableLocales"
71
+ :key="name"
72
+ class="hand"
73
+ @click="switchLocale(name)"
74
+ >
75
+ {{ label }}
76
+ </li>
77
+ </ul>
78
+ </template>
79
+ </v-popover>
80
+ </div>
81
+ </div>
82
+ <div v-else>
83
+ <Select
84
+ :value="selectedOption"
85
+ :options="localesOptions"
86
+ @input="switchLocale($event)"
87
+ />
88
+ </div>
89
+ </div>
90
+ </template>
91
+
92
+ <style lang="scss" scoped>
93
+ .advanced {
94
+ user-select: none;
95
+ padding: 0 5px;
96
+ line-height: 40px;
97
+ font-size: 15px;
98
+ font-weight: 500;
99
+ }
100
+ .content {
101
+ background: var(--nav-active);
102
+ padding: 10px;
103
+ margin-top: 6px;
104
+ border-radius: 4px;
105
+ }
106
+
107
+ .locale-chooser {
108
+ cursor: pointer;
109
+
110
+ &:hover {
111
+ text-decoration: none;
112
+ }
113
+ }
114
+ </style>
@@ -1,7 +1,6 @@
1
1
  <script>
2
2
  import { mapState } from 'vuex';
3
3
  import { isArray } from '@shell/utils/array';
4
- import { importDialog } from '@shell/utils/dynamic-importer';
5
4
 
6
5
  /**
7
6
  * @name PromptModal
@@ -32,8 +31,8 @@ export default {
32
31
  return this.modalData?.modalWidth || '600px';
33
32
  },
34
33
  component() {
35
- // Looks for a dialog component by looking up @shell/components/dialog/${name}.
36
- return importDialog(this.modalData?.component);
34
+ // Looks for a dialog component by looking up in plugins and @shell/dialog/${name}.
35
+ return this.$store.getters['type-map/importDialog'](this.modalData?.component);
37
36
  },
38
37
  cssProps() {
39
38
  // this computed property lets us generate a scss var that we can use in the style
@@ -50,7 +50,7 @@ export default {
50
50
 
51
51
  if ( !hasFetch ) {
52
52
  if ( !schema ) {
53
- store.dispatch('loadingError', `Type ${ resource } not found`);
53
+ store.dispatch('loadingError', new Error(`Type ${ resource } not found, unable to display list`));
54
54
 
55
55
  return;
56
56
  }
@@ -6,7 +6,6 @@ import ButtonGroup from '@shell/components/ButtonGroup';
6
6
  import SortableTable from '@shell/components/SortableTable';
7
7
  import { NAMESPACE } from '@shell/config/table-headers';
8
8
  import { findBy } from '@shell/utils/array';
9
- import { NAME as HARVESTER } from '@shell/config/product/harvester';
10
9
 
11
10
  // Default group-by in the case the group stored in the preference does not apply
12
11
  const DEFAULT_GROUP = 'namespace';
@@ -117,7 +116,12 @@ export default {
117
116
  getCustomDetailLink: {
118
117
  type: Function,
119
118
  default: null
120
- }
119
+ },
120
+
121
+ ignoreFilter: {
122
+ type: Boolean,
123
+ default: false
124
+ },
121
125
  },
122
126
 
123
127
  data() {
@@ -133,7 +137,7 @@ export default {
133
137
  },
134
138
 
135
139
  computed: {
136
- ...mapGetters(['isVirtualCluster']),
140
+ ...mapGetters(['currentProduct']),
137
141
  isNamespaced() {
138
142
  if ( this.namespaced !== null ) {
139
143
  return this.namespaced;
@@ -196,11 +200,9 @@ export default {
196
200
 
197
201
  filteredRows() {
198
202
  const isAll = this.$store.getters['isAllNamespaces'];
199
- const isVirtualProduct = this.$store.getters['currentProduct'].name === HARVESTER;
200
203
 
201
204
  // If the resources isn't namespaced or we want ALL of them, there's nothing to do.
202
- // If this is a harvester list, 'all' must still be filtered
203
- if ( !this.isNamespaced || (isAll && !isVirtualProduct)) {
205
+ if ( !this.isNamespaced || (isAll && !this.currentProduct?.hideSystemResources) || this.ignoreFilter) {
204
206
  return this.rows || [];
205
207
  }
206
208
 
@@ -212,7 +214,7 @@ export default {
212
214
  }
213
215
 
214
216
  return this.rows.filter((row) => {
215
- if (this.isVirtualCluster && this.isNamespaced) {
217
+ if (this.currentProduct?.hideSystemResources && this.isNamespaced) {
216
218
  return !!includedNamespaces[row.metadata.namespace] && !row.isSystemResource;
217
219
  } else if (!this.isNamespaced) {
218
220
  return true;
@@ -29,10 +29,12 @@ export default {
29
29
 
30
30
  <template>
31
31
  <div v-if="shown" class="simple-box" v-on="$listeners">
32
- <div v-if="title || canClose" class="top">
33
- <h2 v-if="title">
34
- {{ title }}
35
- </h2>
32
+ <div v-if="title || canClose || $slots.title" class="top">
33
+ <slot name="title">
34
+ <h2 v-if="title">
35
+ {{ title }}
36
+ </h2>
37
+ </slot>
36
38
  <div v-if="canClose || pref" class="close-button" @click="closeBox($event)">
37
39
  <i class="icon icon-close" />
38
40
  </div>
@@ -87,7 +87,7 @@ export default {
87
87
  <template>
88
88
  <div v-if="clusterDetail">
89
89
  <div class="single-cluster-header">
90
- <ClusterProviderIcon class="rancher-icon" width="32" />
90
+ <ClusterProviderIcon :cluster="clusterDetail" class="rancher-icon" width="32" />
91
91
  <h1>{{ t('glance.clusterInfo') }}</h1>
92
92
  </div>
93
93
 
@@ -22,16 +22,8 @@ import actions from './actions';
22
22
 
23
23
  // Its quicker to render if we directly supply the components for the formatters
24
24
  // rather than just the name of a global component - so create a map of the formatter comoponents
25
- const FORMATTERS = {};
26
-
27
- const components = require.context('@shell/components/formatter', false, /[A-Z]\w+\.(vue)$/);
28
-
29
- components.keys().forEach((fileName) => {
30
- const componentConfig = components(fileName);
31
- const componentName = fileName.split('/').pop().split('.')[0];
32
-
33
- FORMATTERS[componentName] = componentConfig.default || componentConfig;
34
- });
25
+ // NOTE: This is populated by a plugin (formatters.js) to avoid issues with plugins
26
+ export const FORMATTERS = {};
35
27
 
36
28
  export const COLUMN_BREAKPOINTS = {
37
29
  /**
@@ -334,6 +326,7 @@ export default {
334
326
  clearTimeout(this._loadingDelayTimer);
335
327
  clearTimeout(this._liveColumnsTimer);
336
328
  clearTimeout(this._delayedColumnsTimer);
329
+ clearTimeout(this.manualRefreshTimer);
337
330
 
338
331
  const $main = $('main');
339
332
 
@@ -348,33 +341,31 @@ export default {
348
341
  descending(neu, old) {
349
342
  this.watcherUpdateLiveAndDelayed(neu, old);
350
343
  },
351
-
352
344
  searchQuery(neu, old) {
353
345
  this.watcherUpdateLiveAndDelayed(neu, old);
354
346
  },
355
-
356
347
  sortFields(neu, old) {
357
348
  this.watcherUpdateLiveAndDelayed(neu, old);
358
349
  },
359
-
360
350
  groupBy(neu, old) {
361
351
  this.watcherUpdateLiveAndDelayed(neu, old);
362
352
  },
363
-
364
353
  namespaces(neu, old) {
365
354
  this.watcherUpdateLiveAndDelayed(neu, old);
366
355
  },
367
-
368
356
  page(neu, old) {
369
357
  this.watcherUpdateLiveAndDelayed(neu, old);
370
358
  },
371
359
 
372
360
  // Ensure we update live and delayed columns on first load
373
- initalLoad(neu, old) {
374
- if (neu && !old) {
375
- this._didinit = true;
376
- this.$nextTick(() => this.updateLiveAndDelayed());
377
- }
361
+ initalLoad: {
362
+ handler(neu) {
363
+ if (neu) {
364
+ this._didinit = true;
365
+ this.$nextTick(() => this.updateLiveAndDelayed());
366
+ }
367
+ },
368
+ immediate: true
378
369
  },
379
370
 
380
371
  isManualRefreshLoading(neu, old) {
@@ -382,9 +373,11 @@ export default {
382
373
 
383
374
  // setTimeout is needed so that this is pushed further back on the JS computing queue
384
375
  // because nextTick isn't enough to capture the DOM update for the manual refresh only scenario
385
- setTimeout(() => {
386
- this.watcherUpdateLiveAndDelayed(neu, old);
387
- }, 500);
376
+ if (old && !neu) {
377
+ this.manualRefreshTimer = setTimeout(() => {
378
+ this.watcherUpdateLiveAndDelayed(neu, old);
379
+ }, 1000);
380
+ }
388
381
  }
389
382
  },
390
383
 
@@ -400,7 +393,7 @@ export default {
400
393
  },
401
394
 
402
395
  initalLoad() {
403
- return !this.loading && !this._didinit && this.rows?.length;
396
+ return !!(!this.loading && !this._didinit && this.rows?.length);
404
397
  },
405
398
 
406
399
  fullColspan() {
@@ -863,7 +856,7 @@ export default {
863
856
  <template #button-content>
864
857
  <button ref="actionDropDown" class="btn bg-primary mr-0" :disabled="!selectedRows.length">
865
858
  <i class="icon icon-gear" />
866
- <span>{{ t('harvester.tableHeaders.actions') }}</span>
859
+ <span>{{ t('sortableTable.bulkActions.collapsed.label') }}</span>
867
860
  <i class="ml-10 icon icon-chevron-down" />
868
861
  </button>
869
862
  </template>
@@ -270,6 +270,7 @@ export default {
270
270
  this.$store.commit(`action-menu/show`, {
271
271
  resources,
272
272
  event: e.originalEvent || e, // Handle jQuery event and raw event
273
+ elem: actionElement
273
274
  });
274
275
 
275
276
  return;
@@ -36,6 +36,11 @@ export default {
36
36
  type: Boolean,
37
37
  default: false
38
38
  },
39
+ badge: {
40
+ default: 0,
41
+ required: false,
42
+ type: Number
43
+ },
39
44
  },
40
45
 
41
46
  data() {
@@ -38,6 +38,11 @@ export default {
38
38
  noContent: {
39
39
  type: Boolean,
40
40
  default: false,
41
+ },
42
+
43
+ tabsOnly: {
44
+ type: Boolean,
45
+ default: false,
41
46
  }
42
47
  },
43
48
 
@@ -207,7 +212,7 @@ export default {
207
212
  </script>
208
213
 
209
214
  <template>
210
- <div :class="{'side-tabs': !!sideTabs }">
215
+ <div :class="{'side-tabs': !!sideTabs, 'tabs-only': tabsOnly }">
211
216
  <ul
212
217
  ref="tablist"
213
218
  role="tablist"
@@ -233,6 +238,7 @@ export default {
233
238
  @click.prevent="select(tab.name, $event)"
234
239
  >
235
240
  <span>{{ tab.labelDisplay }}</span>
241
+ <span v-if="tab.badge" class="tab-badge">{{ tab.badge }}</span>
236
242
  <i v-if="hasIcon(tab)" v-tooltip="t('validation.tab')" class="conditions-alert-icon icon-error icon-lg" />
237
243
  </a>
238
244
  </li>
@@ -326,6 +332,15 @@ export default {
326
332
  color: var(--error);
327
333
  }
328
334
  }
335
+
336
+ .tab-badge {
337
+ margin-left: 5px;
338
+ background-color: var(--link);
339
+ color: #fff;
340
+ border-radius: 6px;
341
+ padding: 1px 7px;
342
+ font-size: 11px;
343
+ }
329
344
  }
330
345
  }
331
346
 
@@ -337,6 +352,19 @@ export default {
337
352
  }
338
353
  }
339
354
 
355
+ .tabs-only {
356
+ margin-bottom: 20px;
357
+
358
+ .tab-container {
359
+ display: none;
360
+ }
361
+
362
+ .tabs {
363
+ border: 0;
364
+ border-bottom: 2px solid var(--border);
365
+ }
366
+ }
367
+
340
368
  .side-tabs {
341
369
  display: flex;
342
370
  box-shadow: 0 0 20px var(--shadow);
@@ -349,7 +377,6 @@ export default {
349
377
 
350
378
  // Tabbed component within a tabbed component
351
379
  .tab-container & {
352
- margin: -20px;
353
380
  box-shadow: unset;
354
381
  }
355
382
 
@@ -3,6 +3,7 @@
3
3
  import { NORMAN, MANAGEMENT } from '@shell/config/types';
4
4
  import { get } from '@shell/utils/object';
5
5
  import { AZURE_MIGRATED } from '@shell/config/labels-annotations';
6
+ import { BLANK_CLUSTER } from '@shell/store';
6
7
 
7
8
  export default {
8
9
  async fetch() {
@@ -24,7 +25,10 @@ export default {
24
25
  authConfig: null,
25
26
  authConfigRoute: {
26
27
  name: 'c-cluster-auth-config-id',
27
- params: { id: 'azuread' }
28
+ params: {
29
+ cluster: this.$route.params.cluster || BLANK_CLUSTER,
30
+ id: 'azuread'
31
+ }
28
32
  }
29
33
  };
30
34
  },
@@ -119,7 +119,7 @@ export default {
119
119
  "avatar name"
120
120
  "avatar description";
121
121
  grid-template-columns: $size auto;
122
- grid-template-rows: math.div($size, 2) math.div($size, 2);
122
+ grid-template-rows: auto math.div($size, 2);
123
123
  column-gap: 10px;
124
124
 
125
125
  &.showLabels {
@@ -159,6 +159,7 @@ export default {
159
159
  .name {
160
160
  grid-area: name;
161
161
  line-height: math.div($size, 2);
162
+ overflow-wrap: anywhere;
162
163
  }
163
164
 
164
165
  .description {
@@ -80,11 +80,14 @@ export default {
80
80
  // users to freely type in resources that are not shown in the list.
81
81
 
82
82
  if (this.value.subtype === CLUSTER || this.value.subtype === NAMESPACE) {
83
- this.templateOptions = (await this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.ROLE_TEMPLATE }))
84
- .map(option => ({
85
- label: option.nameDisplay,
86
- value: option.id
87
- }));
83
+ (await this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.ROLE_TEMPLATE })).forEach((template) => {
84
+ // Ensure we have quick access to a specific template. This allows unselected drop downs to show the correct value
85
+ this.keyedTemplateOptions[template.id] = {
86
+ label: template.nameDisplay,
87
+ value: template.id
88
+ };
89
+ });
90
+ this.templateOptions = Object.values(this.keyedTemplateOptions);
88
91
  }
89
92
  },
90
93
 
@@ -97,11 +100,13 @@ export default {
97
100
  resources: [],
98
101
  verbs: []
99
102
  },
100
- verbOptions: VERBS,
101
- templateOptions: [],
102
- resources: this.value.resources,
103
- scopedResources: SCOPED_RESOURCES,
104
- defaultValue: false,
103
+ verbOptions: VERBS,
104
+ templateOptions: [],
105
+ keyedTemplateOptions: {},
106
+ resources: this.value.resources,
107
+ scopedResources: SCOPED_RESOURCES,
108
+ defaultValue: false,
109
+ selectFocused: null,
105
110
  };
106
111
  },
107
112
 
@@ -682,10 +687,12 @@ export default {
682
687
  :taggable="false"
683
688
  :disabled="isBuiltin"
684
689
  :searchable="true"
685
- :options="templateOptions"
690
+ :options="selectFocused === props.i ? templateOptions : [keyedTemplateOptions[props.row.value]]"
686
691
  option-key="value"
687
692
  option-label="label"
688
693
  :mode="mode"
694
+ @on-focus="selectFocused = props.i"
695
+ @on-blur="selectFocused = null"
689
696
  />
690
697
  </div>
691
698
  </div>
@@ -103,9 +103,14 @@ export default {
103
103
  return out;
104
104
  },
105
105
  },
106
+
107
+ methods: {
108
+ displayWarning(row) {
109
+ return !!row.status?.summary && (row.status.summary.desiredReady !== row.status.summary.ready);
110
+ }
111
+ }
106
112
  };
107
113
  </script>
108
-
109
114
  <template>
110
115
  <div>
111
116
  <Loading v-if="$fetchState.pending" />
@@ -117,9 +122,9 @@ export default {
117
122
  :rows="bundles"
118
123
  >
119
124
  <template #cell:deploymentsReady="{row}">
120
- <span v-if="row.status.summary.desiredReady != row.status.summary.ready" class="text-warning">
125
+ <span v-if="displayWarning(row)" class="text-warning">
121
126
  {{ row.status.summary.ready }}/{{ row.status.summary.desiredReady }}</span>
122
- <span v-else>{{ row.status.summary.desiredReady }}</span>
127
+ <span v-else-if="row.status">{{ row.status.summary.desiredReady }}</span>
123
128
  </template>
124
129
  </ResourceTable>
125
130
  </div>
@@ -1,5 +1,4 @@
1
1
  <script>
2
- import { mapGetters } from 'vuex';
3
2
  import ResourceTable from '@shell/components/ResourceTable';
4
3
  import Link from '@shell/components/formatter/Link';
5
4
  import Shortened from '@shell/components/formatter/Shortened';
@@ -32,7 +31,6 @@ export default {
32
31
  },
33
32
 
34
33
  computed: {
35
- ...mapGetters(['isVirtualCluster']),
36
34
  filteredRows() {
37
35
  if (!this.rows) {
38
36
  return [];
@@ -84,6 +84,12 @@ export default {
84
84
  const out = { ...getResourceDefaultState(this.$store.getters['i18n/withFallback'], this.stateKey) };
85
85
 
86
86
  resources.forEach(({ status, metadata }) => {
87
+ if (!status) {
88
+ out[STATES_ENUM.UNKNOWN].count += 1;
89
+
90
+ return;
91
+ }
92
+
87
93
  const k = status?.summary.ready > 0 && status?.summary.desiredReady === status.summary.ready;
88
94
 
89
95
  if (k) {