dashboard-shell-shell 1.0.122 → 1.0.1000000082

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 (372) hide show
  1. package/.DS_Store +0 -0
  2. package/assets/brand/harvester/favicon.png +0 -0
  3. package/assets/brand/suse/favicon.png +0 -0
  4. package/assets/icons/iconfont.css +19 -3
  5. package/assets/icons/iconfont.js +1 -1
  6. package/assets/icons/iconfont.json +28 -0
  7. package/assets/icons/iconfont.ttf +0 -0
  8. package/assets/icons/iconfont.woff +0 -0
  9. package/assets/icons/iconfont.woff2 +0 -0
  10. package/assets/images/pl/half-logo.svg +2 -23
  11. package/assets/styles/base/_functions.scss +0 -0
  12. package/assets/styles/base/_mixins.scss +0 -0
  13. package/assets/styles/base/_variables.scss +1 -1
  14. package/assets/styles/global/_labeled-input.scss +0 -1
  15. package/assets/styles/global/_layout.scss +1 -1
  16. package/assets/styles/global/_select.scss +4 -2
  17. package/assets/styles/global/_table.scss +5 -0
  18. package/assets/styles/vendor/vue-select.scss +2 -1
  19. package/assets/translations/en-us.yaml +1 -1
  20. package/assets/translations/zh-hans.yaml +25 -15
  21. package/chart/monitoring/index.vue +3 -1
  22. package/chart/monitoring/prometheus/index.vue +13 -10
  23. package/cloud-credential/aws.vue +2 -0
  24. package/components/ActionDropdown.vue +1 -1
  25. package/components/ActionDropdownShell.vue +71 -0
  26. package/components/ActionMenu.vue +2 -2
  27. package/components/ActionMenuShell.vue +3 -0
  28. package/components/AppModal.vue +84 -8
  29. package/components/AssignTo.vue +25 -11
  30. package/components/AsyncButton.vue +24 -7
  31. package/components/BannerGraphic.vue +1 -0
  32. package/components/ButtonDropdown.vue +26 -4
  33. package/components/ButtonGroup.vue +4 -0
  34. package/components/ButtonMultiAction.vue +1 -0
  35. package/components/CodeMirror.vue +19 -6
  36. package/components/CommunityLinks.vue +3 -3
  37. package/components/ConsumptionGauge.vue +24 -5
  38. package/components/CopyToClipboardText.vue +2 -1
  39. package/components/CruResource.vue +13 -7
  40. package/components/CruResourceFooter.vue +2 -2
  41. package/components/DashboardOptions.vue +29 -17
  42. package/components/DetailText.vue +5 -0
  43. package/components/DisableAuthProviderModal.vue +1 -0
  44. package/components/DotState.vue +84 -0
  45. package/components/ExplorerMembers.vue +1 -1
  46. package/components/ExplorerProjectsNamespaces.vue +88 -16
  47. package/components/FixedBanner.vue +19 -12
  48. package/components/GlobalRoleBindings.vue +5 -1
  49. package/components/GrafanaDashboard.vue +4 -4
  50. package/components/GrowlManager.vue +4 -1
  51. package/components/HardwareResourceGauge.vue +39 -3
  52. package/components/InfoBox.vue +3 -3
  53. package/components/InputOrDisplay.vue +28 -2
  54. package/components/LabelValue.vue +20 -1
  55. package/components/LandingPagePreference.vue +5 -3
  56. package/components/LocaleSelector.vue +39 -93
  57. package/components/ModalManager.vue +55 -0
  58. package/components/ModalWithCard.vue +13 -3
  59. package/components/MoveModal.vue +1 -0
  60. package/components/PodSecurityAdmission.vue +1 -1
  61. package/components/PromptChangePassword.vue +1 -1
  62. package/components/PromptModal.vue +16 -3
  63. package/components/PromptRemove.vue +29 -9
  64. package/components/PromptRestore.vue +1 -0
  65. package/components/ResourceCancelModal.vue +1 -0
  66. package/components/ResourceDetail/Masthead.vue +52 -17
  67. package/components/ResourceDetail/__tests__/Masthead.test.ts +5 -1
  68. package/components/ResourceDetail/index.vue +54 -16
  69. package/components/ResourceList/Masthead.vue +26 -4
  70. package/components/ResourceList/index.vue +4 -3
  71. package/components/ResourceTable.vue +1 -0
  72. package/components/SideNav.vue +20 -15
  73. package/components/SlideInPanelManager.vue +126 -0
  74. package/components/SortableTable/THead.vue +10 -4
  75. package/components/SortableTable/actions.js +1 -1
  76. package/components/SortableTable/index.vue +542 -553
  77. package/components/SortableTable/selection.js +2 -13
  78. package/components/StatusBadge.vue +77 -0
  79. package/components/Tabbed/Tab.vue +3 -3
  80. package/components/Tabbed/index.vue +47 -29
  81. package/components/Wizard.vue +2 -2
  82. package/components/YamlEditor.vue +1 -1
  83. package/components/__tests__/AsyncButton.test.ts +2 -2
  84. package/components/__tests__/FixedBanner.test.ts +3 -3
  85. package/components/__tests__/ModalManager.spec.ts +176 -0
  86. package/components/__tests__/SlideInPanelManager.spec.ts +166 -0
  87. package/components/auth/Principal.vue +10 -3
  88. package/components/auth/RoleDetailEdit.vue +1 -1
  89. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  90. package/components/form/ArrayList.vue +123 -85
  91. package/components/form/ArrayListGrouped.vue +10 -2
  92. package/components/form/ArrayListSelect.vue +1 -1
  93. package/components/form/Command.vue +6 -15
  94. package/components/form/EnvVars.vue +16 -8
  95. package/components/form/Footer.vue +10 -7
  96. package/components/form/HealthCheck.vue +3 -3
  97. package/components/form/HookOption.vue +11 -16
  98. package/components/form/InputWithSelect.vue +6 -5
  99. package/components/form/KeyValue.vue +39 -10
  100. package/components/form/LabeledSelect.vue +73 -77
  101. package/components/form/Labels.vue +6 -3
  102. package/components/form/LifecycleHooks.vue +3 -3
  103. package/components/form/MatchExpressions.vue +42 -17
  104. package/components/form/NameNsDescription.vue +163 -116
  105. package/components/form/Networking.vue +20 -12
  106. package/components/form/NodeAffinity.vue +31 -23
  107. package/components/form/NodeScheduling.vue +13 -3
  108. package/components/form/Password.vue +11 -5
  109. package/components/form/PodAffinity.vue +47 -48
  110. package/components/form/Probe.vue +68 -66
  111. package/components/form/ResourceQuota/Namespace.vue +4 -4
  112. package/components/form/ResourceQuota/NamespaceRow.vue +5 -7
  113. package/components/form/ResourceQuota/Project.vue +9 -5
  114. package/components/form/ResourceQuota/ProjectRow.vue +4 -6
  115. package/components/form/ResourceSelector.vue +7 -9
  116. package/components/form/SSHKnownHosts/KnownHostsEditDialog.vue +6 -3
  117. package/components/form/SSHKnownHosts/__tests__/KnownHostsEditDialog.test.ts +12 -1
  118. package/components/form/SSHKnownHosts/index.vue +16 -2
  119. package/components/form/Security.vue +54 -56
  120. package/components/form/Select.vue +44 -7
  121. package/components/form/ShellInput.vue +5 -1
  122. package/components/form/SimpleSecretSelector.vue +29 -9
  123. package/components/form/Tolerations.vue +5 -1
  124. package/components/form/UnitInput.vue +10 -5
  125. package/components/form/ValueFromResource.vue +134 -121
  126. package/components/form/WorkloadPorts.vue +18 -18
  127. package/components/form/__tests__/ArrayList.test.ts +5 -2
  128. package/components/form/__tests__/MatchExpressions.test.ts +12 -12
  129. package/components/form/__tests__/NameNsDescription.test.ts +115 -14
  130. package/components/form/__tests__/Probe.test.ts +12 -8
  131. package/components/form/__tests__/SSHKnownHosts.test.ts +11 -0
  132. package/components/form/__tests__/Select.test.ts +37 -0
  133. package/components/form/__tests__/UnitInput.test.ts +4 -5
  134. package/components/formatter/BadgeStateFormatter.vue +8 -5
  135. package/components/formatter/InternalExternalIP.vue +2 -0
  136. package/components/formatter/LiveDate.vue +3 -3
  137. package/components/formatter/SecretData.vue +20 -7
  138. package/components/nav/Favorite.vue +5 -1
  139. package/components/nav/Group.vue +18 -4
  140. package/components/nav/Header.vue +39 -13
  141. package/components/nav/Jump.vue +7 -0
  142. package/components/nav/NamespaceFilter.vue +21 -11
  143. package/components/nav/Pinned.vue +1 -1
  144. package/components/nav/TopLevelMenu.vue +5 -17
  145. package/components/nav/Type.vue +30 -33
  146. package/components/nav/__tests__/TopLevelMenu.test.ts +0 -40
  147. package/components/rancherResourceDetail/Masthead.vue +769 -0
  148. package/components/rancherResourceDetail/__tests__/Masthead.test.ts +65 -0
  149. package/components/rancherResourceDetail/index.vue +591 -0
  150. package/components/rancherResourceList/Masthead-btn.vue +225 -0
  151. package/components/rancherResourceList/Masthead.vue +375 -0
  152. package/components/rancherResourceList/ResourceLoadingIndicator.vue +140 -0
  153. package/components/rancherResourceList/index.vue +307 -0
  154. package/components/rancherResourceList/resource-list.config.js +7 -0
  155. package/components/rancherResourceTable.vue +783 -0
  156. package/components/rancherSortableTable/THead.vue +561 -0
  157. package/components/rancherSortableTable/actions.js +153 -0
  158. package/components/rancherSortableTable/advanced-filtering.js +272 -0
  159. package/components/rancherSortableTable/debug.js +117 -0
  160. package/components/rancherSortableTable/filtering.js +290 -0
  161. package/components/rancherSortableTable/grouping.js +48 -0
  162. package/components/rancherSortableTable/index.vue +2712 -0
  163. package/components/rancherSortableTable/paging.js +155 -0
  164. package/components/rancherSortableTable/selection.js +629 -0
  165. package/components/rancherSortableTable/sortable-config.ts +4 -0
  166. package/components/rancherSortableTable/sorting.js +129 -0
  167. package/components/templates/blank.vue +4 -1
  168. package/components/templates/default.vue +8 -0
  169. package/components/templates/home.vue +10 -1
  170. package/components/templates/plain.vue +10 -1
  171. package/composables/focusTrap.ts +11 -3
  172. package/composables/useRuntimeFlag.ts +29 -0
  173. package/config/private-label.js +15 -10
  174. package/config/router/routes.js +21 -13
  175. package/config/store.js +4 -0
  176. package/config/table-headers.js +3 -2
  177. package/config/uiplugins.js +5 -1
  178. package/core/plugin-routes.ts +5 -115
  179. package/core/plugins.js +1 -1
  180. package/core/types.ts +23 -2
  181. package/detail/__tests__/autoscaling.horizontalpodautoscaler.test.ts +84 -23
  182. package/detail/autoscaling.horizontalpodautoscaler/index.vue +13 -3
  183. package/detail/provisioning.cattle.io.cluster.vue +72 -6
  184. package/dialog/AddCustomBadgeDialog.vue +1 -0
  185. package/dialog/DeactivateDriverDialog.vue +5 -4
  186. package/dialog/ForceMachineRemoveDialog.vue +6 -3
  187. package/dialog/GitRepoForceUpdateDialog.vue +1 -1
  188. package/dialog/ScalePoolDownDialog.vue +2 -2
  189. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +16 -3
  190. package/edit/auth/__tests__/oidc.test.ts +162 -88
  191. package/edit/auth/azuread.vue +2 -1
  192. package/edit/auth/github.vue +1 -1
  193. package/edit/auth/googleoauth.vue +5 -1
  194. package/edit/auth/ldap/__tests__/config.test.ts +0 -14
  195. package/edit/auth/ldap/config.vue +0 -24
  196. package/edit/auth/ldap/index.vue +1 -1
  197. package/edit/auth/oidc.vue +39 -6
  198. package/edit/auth/saml.vue +1 -1
  199. package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +5 -2
  200. package/edit/cloudcredential.vue +24 -9
  201. package/edit/fleet.cattle.io.clustergroup.vue +5 -3
  202. package/edit/fleet.cattle.io.gitrepo.vue +2 -0
  203. package/edit/logging-flow/Match.vue +1 -1
  204. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +40 -9
  205. package/edit/management.cattle.io.user.vue +28 -3
  206. package/edit/monitoring.coreos.com.alertmanagerconfig/auth.vue +19 -19
  207. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +31 -31
  208. package/edit/monitoring.coreos.com.alertmanagerconfig/routeConfig.vue +36 -12
  209. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +6 -6
  210. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +10 -10
  211. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +4 -4
  212. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +4 -4
  213. package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +1 -1
  214. package/edit/monitoring.coreos.com.receiver/auth.vue +29 -29
  215. package/edit/monitoring.coreos.com.receiver/types/email.vue +6 -6
  216. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +10 -10
  217. package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +5 -5
  218. package/edit/monitoring.coreos.com.receiver/types/slack.vue +4 -4
  219. package/edit/namespace.vue +1 -2
  220. package/edit/networking.k8s.io.ingress/IngressClass.vue +7 -3
  221. package/edit/networking.k8s.io.ingress/RulePath.vue +1 -1
  222. package/edit/networking.k8s.io.ingress/__tests__/IngressClass.test.ts +58 -0
  223. package/edit/persistentvolume/__tests__/persistentvolume.test.ts +14 -2
  224. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +4 -1
  225. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +26 -9
  226. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +8 -10
  227. package/edit/provisioning.cattle.io.cluster/rke2.vue +31 -40
  228. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +5 -2
  229. package/edit/provisioning.cattle.io.cluster/tabs/AgentConfiguration.vue +6 -1
  230. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +33 -2
  231. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +3 -3
  232. package/edit/service.vue +0 -3
  233. package/edit/token.vue +32 -11
  234. package/edit/workload/Job.vue +6 -6
  235. package/edit/workload/__tests__/Job.test.ts +0 -1
  236. package/edit/workload/index.vue +1 -0
  237. package/edit/workload/mixins/workload.js +3 -3
  238. package/initialize/install-plugins.js +2 -1
  239. package/list/harvesterhci.io.management.cluster.vue +4 -1
  240. package/list/management.cattle.io.feature.vue +1 -0
  241. package/list/namespace.vue +3 -1
  242. package/list/provisioning.cattle.io.cluster.vue +20 -12
  243. package/list/workload.vue +7 -6
  244. package/machine-config/__tests__/vmwarevsphere.test.ts +48 -3
  245. package/machine-config/azure.vue +16 -4
  246. package/machine-config/vmwarevsphere.vue +16 -0
  247. package/mixins/resource-fetch.js +2 -1
  248. package/models/__tests__/logging.banzaicloud.io.flow.test.ts +88 -0
  249. package/models/__tests__/namespace.test.ts +25 -1
  250. package/models/cloudcredential.js +5 -0
  251. package/models/kontainerdriver.js +6 -3
  252. package/models/logging.banzaicloud.io.flow.js +2 -1
  253. package/models/management.cattle.io.node.js +3 -3
  254. package/models/management.cattle.io.setting.js +2 -1
  255. package/models/namespace.js +4 -5
  256. package/models/nodedriver.js +6 -3
  257. package/models/storage.k8s.io.storageclass.js +2 -2
  258. package/models/workload.js +4 -1
  259. package/package.json +1 -1
  260. package/pages/about.vue +16 -8
  261. package/pages/account/index.vue +80 -24
  262. package/pages/account/pri.vue +229 -0
  263. package/pages/auth/login.vue +195 -44
  264. package/pages/auth/logout.vue +4 -1
  265. package/pages/auth/setup.vue +144 -19
  266. package/pages/auth/verify.vue +13 -8
  267. package/pages/auth copy/login.vue +595 -0
  268. package/pages/auth copy/logout.vue +47 -0
  269. package/pages/auth copy/setup.vue +523 -0
  270. package/pages/auth copy/verify.vue +203 -0
  271. package/pages/c/_cluster/_product/namespaces.vue +5 -5
  272. package/pages/c/_cluster/apps/charts/chart.vue +1 -1
  273. package/pages/c/_cluster/apps/charts/install.vue +26 -26
  274. package/pages/c/_cluster/auth/config/index.vue +10 -12
  275. package/pages/c/_cluster/explorer/EventsTable.vue +38 -33
  276. package/pages/c/_cluster/explorer/index.vue +17 -15
  277. package/pages/c/_cluster/istio/index.vue +2 -2
  278. package/pages/c/_cluster/longhorn/index.vue +1 -1
  279. package/pages/c/_cluster/monitoring/index.vue +1 -1
  280. package/pages/c/_cluster/monitoring/monitor/_namespace/_id.vue +4 -2
  281. package/pages/c/_cluster/monitoring/monitor/create.vue +4 -2
  282. package/pages/c/_cluster/monitoring/monitor/index.vue +2 -2
  283. package/pages/c/_cluster/monitoring/route-receiver/_id.vue +4 -2
  284. package/pages/c/_cluster/monitoring/route-receiver/create.vue +5 -2
  285. package/pages/c/_cluster/neuvector/index.vue +1 -1
  286. package/pages/c/_cluster/settings/brand.vue +3 -3
  287. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +8 -10
  288. package/pages/diagnostic.vue +59 -11
  289. package/pages/fail-whale.vue +14 -8
  290. package/pages/home.vue +24 -18
  291. package/pages/prefs.vue +9 -7
  292. package/pages/support/index.vue +4 -1
  293. package/pkg/tsconfig.json +9 -9
  294. package/pkg/vue.config.js +1 -1
  295. package/plugins/dashboard-store/normalize.js +3 -1
  296. package/plugins/dashboard-store/resource-class.js +31 -29
  297. package/plugins/internal-api/index.ts +37 -0
  298. package/plugins/internal-api/shared/base-api.ts +13 -0
  299. package/plugins/internal-api/shell/shell.api.ts +108 -0
  300. package/promptRemove/management.cattle.io.fleetworkspace.vue +1 -1
  301. package/promptRemove/management.cattle.io.globalrole.vue +1 -1
  302. package/promptRemove/management.cattle.io.project.vue +2 -2
  303. package/promptRemove/management.cattle.io.roletemplate.vue +1 -1
  304. package/promptRemove/pod.vue +1 -1
  305. package/public/index.html +2 -1
  306. package/rancher-components/BadgeState/BadgeState.vue +5 -1
  307. package/rancher-components/Banner/Banner.vue +8 -2
  308. package/rancher-components/Card/Card.vue +3 -6
  309. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -0
  310. package/rancher-components/Form/LabeledInput/LabeledInput.vue +5 -2
  311. package/rancher-components/Form/Radio/RadioButton.vue +3 -3
  312. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -5
  313. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  314. package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -2
  315. package/rancher-components/RcDropdown/RcDropdownMenu.vue +7 -3
  316. package/rancher-components/RcDropdown/types.ts +1 -0
  317. package/scripts/clean +0 -0
  318. package/scripts/extension/bundle +20 -0
  319. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +2 -2
  320. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -1
  321. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  322. package/scripts/extension/helm/scripts/package +0 -0
  323. package/scripts/extension/helm/scripts/patch +0 -0
  324. package/scripts/extension/helm/scripts/version +0 -0
  325. package/scripts/extension/helmpatch +44 -31
  326. package/scripts/extension/parse-tag-name +0 -0
  327. package/scripts/extension/publish +12 -12
  328. package/scripts/publish-shell.sh +18 -23
  329. package/scripts/serve-pkgs +0 -0
  330. package/scripts/sync-shell-deps +0 -0
  331. package/scripts/test-plugins-build.sh +4 -6
  332. package/scripts/typegen.sh +28 -46
  333. package/server/har-file.js +25 -3
  334. package/static/favicon.ico +0 -0
  335. package/static/favicon.png +0 -0
  336. package/static/loading-indicator.html +2 -2
  337. package/store/aws.js +9 -2
  338. package/store/features.js +2 -1
  339. package/store/i18n.js +3 -3
  340. package/store/modal.ts +71 -0
  341. package/store/slideInPanel.ts +47 -0
  342. package/store/type-map.js +9 -1
  343. package/types/cloud-shell/index.d.ts +11020 -0
  344. package/types/global-vue.d.ts +5 -0
  345. package/types/internal-api/shell/growl.d.ts +25 -0
  346. package/types/internal-api/shell/modal.d.ts +77 -0
  347. package/types/internal-api/shell/slideIn.d.ts +15 -0
  348. package/types/shell/index.d.ts +118 -128
  349. package/types/vue-shim.d.ts +4 -1
  350. package/utils/__tests__/object.test.ts +38 -4
  351. package/utils/__tests__/string.test.ts +2 -2
  352. package/utils/auth.js +1 -0
  353. package/utils/banners.js +0 -45
  354. package/utils/cluster.js +35 -0
  355. package/utils/color.js +9 -8
  356. package/utils/error.js +61 -3
  357. package/utils/errorTranslate.json +450 -30
  358. package/utils/object.js +46 -6
  359. package/utils/router.js +22 -1
  360. package/utils/select.js +26 -3
  361. package/utils/string.js +9 -8
  362. package/utils/title.ts +1 -1
  363. package/utils/validators/machine-pool.ts +20 -0
  364. package/vue.config.js +7 -2
  365. package/components/formatter/ExtensionCache.vue +0 -74
  366. package/components/formatter/Port.vue +0 -24
  367. package/components/formatter/SecretType.vue +0 -41
  368. package/types/resources/fleet.d.ts +0 -57
  369. package/types/resources/pod-security-admission.ts +0 -36
  370. package/types/resources/settings.d.ts +0 -93
  371. package/types/resources/userPreferences.d.ts +0 -13
  372. package/types/vue-shim.d +0 -20
@@ -0,0 +1,108 @@
1
+ import { GrowlConfig } from '@shell/types/internal-api/shell/growl';
2
+ import { ModalConfig } from '@shell/types/internal-api/shell/modal';
3
+ import { SlideInConfig } from '@shell/types/internal-api/shell/slideIn';
4
+
5
+ import { BaseApi } from '@shell/plugins/internal-api/shared/base-api';
6
+
7
+ export default class ShellApi extends BaseApi {
8
+ static apiName() {
9
+ return 'shell';
10
+ }
11
+
12
+ /**
13
+ * Dispatches a growl notification.
14
+ *
15
+ * @param config - Configuration for the growl notification.
16
+ * - If `message` is a string, it is treated as the main content of the notification.
17
+ * - If `message` is a `DetailedMessage` object, `title` and `description` are extracted.
18
+ *
19
+ * Example:
20
+ * ```ts
21
+ * this.$shell.growl({ message: 'Operation successful!', type: 'success' });
22
+ * this.$shell.growl({ message: { title: 'Warning', description: 'Check your input.' }, type: 'warning' });
23
+ * ```
24
+ */
25
+ protected growl(config: GrowlConfig): void {
26
+ const { type = 'error', timeout = 5000 } = config;
27
+
28
+ let title = '';
29
+ let description = '';
30
+
31
+ if (typeof config.message === 'string') {
32
+ description = config.message;
33
+ } else {
34
+ title = config.message.title || '';
35
+ description = config.message.description;
36
+ }
37
+
38
+ this.$store.dispatch(
39
+ `growl/${ type }`,
40
+ {
41
+ title,
42
+ message: description,
43
+ timeout,
44
+ },
45
+ { root: true }
46
+ );
47
+ }
48
+
49
+ /**
50
+ * Opens a modal by committing to the Vuex store.
51
+ *
52
+ * This method updates the store's `modal` module to show a modal with the
53
+ * specified configuration. The modal is rendered using the `ModalManager` component,
54
+ * and its content is dynamically loaded based on the `component` field in the configuration.
55
+ *
56
+ * @param config A `ModalConfig` object defining the modal’s content and behavior.
57
+ *
58
+ * Example:
59
+ * ```ts
60
+ * this.$shell.modal({
61
+ * component: MyCustomModal,
62
+ * componentProps: { title: 'Hello Modal' },
63
+ * resources: [someResource],
64
+ * modalWidth: '800px',
65
+ * closeOnClickOutside: false
66
+ * });
67
+ * ```
68
+ */
69
+ protected modal(config: ModalConfig): void {
70
+ this.$store.commit('modal/openModal', {
71
+ component: config.component,
72
+ componentProps: config.componentProps || {},
73
+ resources: config.resources || [],
74
+ modalWidth: config.modalWidth || '600px',
75
+ closeOnClickOutside: config.closeOnClickOutside ?? true,
76
+ // modalSticky: config.modalSticky ?? false // Not implemented yet
77
+ });
78
+ }
79
+
80
+ /**
81
+ * Opens the slide-in panel with the specified component and props.
82
+ *
83
+ * This method commits the `open` mutation to the `slideInPanel` Vuex module,
84
+ * which sets the current component to be rendered and its associated props.
85
+ * The slide-in panel becomes visible after the mutation.
86
+ *
87
+ * @param config - The configuration object for the slide-in panel.
88
+ *
89
+ * Example Usage:
90
+ * ```ts
91
+ * import MyComponent from '@/components/MyComponent.vue';
92
+ *
93
+ * this.$shell.slideInPanel({
94
+ * component: MyComponent,
95
+ * componentProps: { foo: 'bar' }
96
+ * });
97
+ * ```
98
+ *
99
+ * @param config.component - A Vue component (imported SFC, functional component, etc.) to be rendered in the panel.
100
+ * @param config.componentProps - (Optional) Props to pass to the component. These should align with the component's defined props.
101
+ */
102
+ protected slideInPanel(config: SlideInConfig): void {
103
+ this.$store.commit('slideInPanel/open', {
104
+ component: config.component,
105
+ componentProps: config.componentProps || {}
106
+ });
107
+ }
108
+ }
@@ -71,7 +71,7 @@ export default {
71
71
  <div class="mt-10">
72
72
  <div class="mb-10">
73
73
  {{ t('promptRemove.attemptingToRemove', { type }) }} <span
74
- v-clean-html="resourceNames(names, t)"
74
+ v-clean-html="resourceNames(names, null, t)"
75
75
  class="description"
76
76
  />
77
77
  </div>
@@ -21,7 +21,7 @@ export default {
21
21
 
22
22
  <template>
23
23
  <div>
24
- {{ t('promptRemove.attemptingToRemove', { type }) }} <span v-clean-html="resourceNames(names, t)" />
24
+ {{ t('promptRemove.attemptingToRemove', { type }) }} <span v-clean-html="resourceNames(names, null, t)" />
25
25
  <div
26
26
  v-if="info"
27
27
  class="text info mb-10 mt-20"
@@ -94,7 +94,7 @@ export default {
94
94
  <template v-if="!canSeeProjectlessNamespaces">
95
95
  <span class="delete-warning"> {{ t('promptRemove.willDeleteAssociatedNamespaces') }}</span> <br>
96
96
  <div
97
- v-clean-html="resourceNames(names, t)"
97
+ v-clean-html="resourceNames(names, null, t)"
98
98
  class="mt-10"
99
99
  />
100
100
  </template>
@@ -108,7 +108,7 @@ export default {
108
108
  :label="t('promptRemove.deleteAssociatedNamespaces')"
109
109
  />
110
110
  <div class="mt-10 ml-20">
111
- <span v-clean-html="resourceNames(names, t)" />
111
+ <span v-clean-html="resourceNames(names, null, t)" />
112
112
  </div>
113
113
  </div>
114
114
  </div>
@@ -22,7 +22,7 @@ export default {
22
22
  <template>
23
23
  <div>
24
24
  {{ t('promptRemove.attemptingToRemove', { type }) }} <span
25
- v-clean-html="resourceNames(names, t)"
25
+ v-clean-html="resourceNames(names, null, t)"
26
26
  />
27
27
  <div
28
28
  v-if="info"
@@ -98,7 +98,7 @@ export default {
98
98
  <div class="mt-10">
99
99
  <div class="mb-30">
100
100
  {{ t('promptRemove.attemptingToRemove', { type }) }} <span
101
- v-clean-html="resourceNames(names, t)"
101
+ v-clean-html="resourceNames(names, null, t)"
102
102
  class="body"
103
103
  />
104
104
  </div>
package/public/index.html CHANGED
@@ -6,7 +6,7 @@
6
6
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
7
7
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
8
8
  <link rel="shortcut icon" type="image/x-icon" href="/favicon.png">
9
- <title>Rancher</title>
9
+ <title>HCI</title>
10
10
  </head>
11
11
 
12
12
  <body>
@@ -16,6 +16,7 @@
16
16
  </div>
17
17
  </div>
18
18
  <div id="modals"><!--Portal content here--></div>
19
+ <div id="slides"></div>
19
20
 
20
21
  <script>
21
22
  (() => {
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { PropType, defineComponent } from 'vue';
3
+ import { mapGetters } from 'vuex';
3
4
 
4
5
  interface Badge {
5
6
  stateBackground: string;
@@ -47,12 +48,15 @@ export default defineComponent({
47
48
  },
48
49
 
49
50
  computed: {
51
+ ...mapGetters({ t: 'i18n/t' }),
50
52
  bg(): string | null {
51
53
  return this.value?.stateBackground || this.color;
52
54
  },
53
55
 
54
56
  msg(): string | null {
55
- return this.value?.stateDisplay || this.label;
57
+ let text = this.value?.stateDisplay || this.label;
58
+ let zhText = this.t(`stateLabel.${ text }`)
59
+ return zhText ? zhText : text
56
60
  }
57
61
  }
58
62
  });
@@ -123,6 +123,10 @@ export default defineComponent({
123
123
  $left-border-size: 4px;
124
124
  $icon-size: 24px;
125
125
 
126
+ .banner__content {
127
+ line-height: 18px !important;
128
+ }
129
+
126
130
  .banner {
127
131
  display: flex;
128
132
  /* margin: 15px 0; */
@@ -173,6 +177,8 @@ $icon-size: 24px;
173
177
  border-left: solid $left-border-size transparent;
174
178
  display: flex;
175
179
  gap: 3px;
180
+ word-wrap:break-word;
181
+ word-break:break-all;
176
182
 
177
183
  .primary & {
178
184
  background: var(--primary);
@@ -190,8 +196,8 @@ $icon-size: 24px;
190
196
  }
191
197
 
192
198
  .info & {
193
- /* background: var(--info-banner-bg); */
194
- background: #f2f2f2;
199
+ background: var(--info-banner-bg);
200
+ // background: #f2f2f2;
195
201
  border-color: var(--info);
196
202
  }
197
203
 
@@ -76,7 +76,7 @@ export default defineComponent({
76
76
  <template>
77
77
  <div
78
78
  id="focus-trap-card-container-element"
79
- class="card-container"
79
+ class="card-containers"
80
80
  :class="{'highlight-border': showHighlightBorder, 'card-sticky': sticky}"
81
81
  data-testid="card"
82
82
  >
@@ -117,17 +117,15 @@ export default defineComponent({
117
117
  </template>
118
118
 
119
119
  <style lang='scss'>
120
- .card-container {
120
+ .card-containers {
121
121
  &.highlight-border {
122
122
  border-left: 5px solid var(--primary);
123
123
  }
124
- border-radius: var(--border-radius);
125
124
  display: flex;
126
125
  flex-basis: 40%;
127
- /* margin: 10px; */
128
126
  min-height: 100px;
129
127
  padding: 24px;
130
- box-shadow: 0 0 20px var(--shadow);
128
+ border: 1px solid var(--border);
131
129
  &:not(.top) {
132
130
  align-items: top;
133
131
  flex-direction: row;
@@ -143,7 +141,6 @@ export default defineComponent({
143
141
  justify-content: center;
144
142
  }
145
143
  & .card-actions {
146
- /* align-self: end; */
147
144
  display: flex;
148
145
  justify-content: flex-end;
149
146
  padding-top: 20px;
@@ -301,6 +301,7 @@ export default defineComponent({
301
301
  <span
302
302
  v-else-if="label"
303
303
  :id="idForLabel"
304
+ :style="label == '记住用户名' ? { color: '#fff' } : ''"
304
305
  >{{ label }}</span>
305
306
  <i
306
307
  v-if="tooltipKey"
@@ -479,6 +480,9 @@ $fontColor: var(--input-label);
479
480
 
480
481
  // Disabled styles
481
482
  &.disabled {
483
+ span {
484
+ color: var(--muted);
485
+ }
482
486
  .checkbox-custom {
483
487
  background-color: var(--checkbox-disabled-bg);
484
488
  border-color: var(--checkbox-disabled-bg);
@@ -464,6 +464,7 @@ export default defineComponent({
464
464
  />
465
465
  </div>
466
466
  </div>
467
+ <slot name="suffixNew" />
467
468
  </div>
468
469
  </template>
469
470
  <style scoped lang="scss">
@@ -490,14 +491,16 @@ export default defineComponent({
490
491
  .label-input-all{
491
492
  display: flex;
492
493
  label{
493
- width: 160px;
494
+ width: 160px !important;
494
495
  line-height: 32px;
495
496
  .required{
496
497
  color: red;
497
498
  }
498
499
  }
499
500
  }
500
-
501
+ .span-4 {
502
+ width: none;
503
+ }
501
504
  .v-popper--has-tooltip INPUT, .v-popper--has-tooltip INPUT:hover, .v-popper--has-tooltip INPUT:focus{
502
505
  padding: 0px 0px 0px 11px;
503
506
  }
@@ -248,7 +248,8 @@ $fontColor: var(--input-label);
248
248
  &.disabled,
249
249
  &.disabled .radio-label,
250
250
  &.disabled .radio-button-outer-container-description {
251
- cursor: not-allowed
251
+ cursor: not-allowed;
252
+ color: var(--muted);
252
253
  }
253
254
 
254
255
  .radio-custom {
@@ -260,7 +261,7 @@ $fontColor: var(--input-label);
260
261
  border-radius: 50%;
261
262
  transition: all 0.3s ease-out;
262
263
  border: 1.5px solid var(--border);
263
- margin-top: 4px;
264
+ margin-top: 3px !important;
264
265
 
265
266
  &:focus {
266
267
  outline: none;
@@ -305,7 +306,6 @@ $fontColor: var(--input-label);
305
306
  }
306
307
  }
307
308
  }
308
-
309
309
  input:disabled ~ .radio-custom:not([aria-checked="true"]) {
310
310
  background-color: var(--disabled-bg);
311
311
  opacity: .25;
@@ -108,7 +108,7 @@ export default defineComponent({
108
108
  * (unless the input is long)
109
109
  */
110
110
  style(): string {
111
- return `height: ${ this.curHeight }px; overflow: ${ this.overflow };`;
111
+ return `height: ${ this.curHeight }px; overflow: ${ this.overflow };min-height:${ this.curHeight }px;`;
112
112
  },
113
113
 
114
114
  className(): string | unknown[] | Record<string, boolean> {
@@ -165,14 +165,10 @@ export default defineComponent({
165
165
  return;
166
166
  }
167
167
 
168
- el.style.height = '1px';
169
-
170
168
  const border = parseInt(getComputedStyle(el).getPropertyValue('borderTopWidth'), 10) || 0 + parseInt(getComputedStyle(el).getPropertyValue('borderBottomWidth'), 10) || 0;
171
169
  const neu = Math.max(this.minHeight, Math.min(el.scrollHeight + border, this.maxHeight));
172
170
 
173
171
  el.style.overflowY = el.scrollHeight > neu ? 'auto' : 'hidden';
174
- el.style.height = `${ neu }px`;
175
-
176
172
  this.curHeight = neu;
177
173
  }
178
174
  }
@@ -111,9 +111,6 @@ export default defineComponent({
111
111
  right: 5px;
112
112
  top: 10px;
113
113
  z-index: 3;
114
- /* right: 30px;
115
- top: $input-padding-lg;
116
- z-index: z-index(hoverOverContent); */
117
114
  }
118
115
 
119
116
  @mixin tooltipColors($color) {
@@ -122,11 +119,19 @@ export default defineComponent({
122
119
  }
123
120
  }
124
121
 
122
+ &.null {
123
+
124
+ .status-icon {
125
+ top: 5px;
126
+ right: -20px;
127
+ }
128
+ }
129
+
125
130
  &.error {
126
131
  @include tooltipColors(var(--error));
127
132
 
128
133
  .status-icon {
129
- top: 7px;
134
+ top: 9px !important;
130
135
  right: 5px;
131
136
  }
132
137
  }
@@ -101,8 +101,7 @@ const handleActivate = (e: KeyboardEvent) => {
101
101
  align-items: center;
102
102
  padding: 8px 10px;
103
103
  min-width: 145px;
104
- /* margin: 0 9px; */
105
- /* border-radius: 4px; */
104
+ border-radius: 4px;
106
105
 
107
106
  &:hover {
108
107
  cursor: pointer;
@@ -12,6 +12,7 @@ withDefaults(defineProps<RcDropdownMenuComponentProps>(), {
12
12
  buttonRole: 'primary',
13
13
  buttonSize: undefined,
14
14
  isDetail: false,
15
+ showIcon: false
15
16
  });
16
17
 
17
18
  const emit = defineEmits(['update:open', 'select']);
@@ -32,8 +33,10 @@ const hasOptions = (options: DropdownOption[]) => {
32
33
  :data-testid="dataTestid"
33
34
  :aria-label="buttonAriaLabel"
34
35
  >
35
- <i style="font-style: normal;" v-if="buttonRole === 'link'">操作</i>
36
- <i class="icon icon-actions" v-else/>
36
+ <div v-if="showIcon">
37
+ <i data-v-5db2c2c7="" class="icon icon-actions" alt="More actions icon"></i>
38
+ </div>
39
+ <a v-else href="javascript:;">操作</a>
37
40
  </rc-dropdown-trigger>
38
41
  <template #dropdownCollection>
39
42
  <template
@@ -63,7 +66,8 @@ const hasOptions = (options: DropdownOption[]) => {
63
66
  v-if="!hasOptions(options)"
64
67
  disabled
65
68
  >
66
- No actions available
69
+ <!-- No actions available -->
70
+ 暂无可执行的操作。
67
71
  </rc-dropdown-item>
68
72
  </template>
69
73
  </rc-dropdown>
@@ -46,4 +46,5 @@ export type RcDropdownMenuComponentProps = {
46
46
  buttonAriaLabel?: string;
47
47
  dropdownAriaLabel?: string;
48
48
  dataTestid?: string;
49
+ showIcon?: Boolean;
49
50
  }
package/scripts/clean CHANGED
File without changes
@@ -29,12 +29,32 @@ cp -R ${CHART_TEMPLATE}/* ${TMP}/container/
29
29
  # Copy the plugin assets
30
30
  mkdir -p ${TMP}/container/plugin
31
31
 
32
+ # Copy Helm charts and plugin assets
32
33
  cp -R ${BASE_DIR}/assets/* ${TMP}/container/plugin
33
34
  cp ${BASE_DIR}/package.json ${TMP}/container/plugin
34
35
  cp ${BASE_DIR}/index.yaml ${TMP}/container/
35
36
  cp ${BASE_DIR}/index.yaml ${TMP}/container/plugin
36
37
  rm -f ${TMP}/container/plugin/report.html
37
38
 
39
+ # Add extension .tgz files with proper naming
40
+ echo -e "${CYAN}Copying extension archives...${RESET}"
41
+ for pkg_dir in ${BASE_DIR}/extensions/*/; do
42
+ pkg=$(basename "${pkg_dir}")
43
+ echo -e "Processing package: ${pkg}"
44
+
45
+ # Find all .tgz files in the package directory
46
+ for tgz_path in "${pkg_dir}"*.tgz; do
47
+ if [ -f "${tgz_path}" ]; then
48
+ # Extract version from filename
49
+ version=$(basename "${tgz_path}" .tgz)
50
+ compressed_package_name="${pkg}-${version}.tgz"
51
+
52
+ echo "Copying ${tgz_path} to ${TMP}/container/plugin/${compressed_package_name}"
53
+ cp "${tgz_path}" "${TMP}/container/plugin/${compressed_package_name}"
54
+ fi
55
+ done
56
+ done
57
+
38
58
  # Generate files.txt for each pkg and move pkg files into relative plugin directories
39
59
  for d in ${BASE_DIR}/dist-pkg/*; do
40
60
  pkg=$(basename $d)
@@ -38,7 +38,7 @@ Common labels
38
38
  helm.sh/chart: {{ include "extension-server.chart" . }}
39
39
  {{ include "extension-server.selectorLabels" . }}
40
40
  {{- if .Chart.AppVersion }}
41
- app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
41
+ app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" | quote }}
42
42
  {{- end }}
43
43
  app.kubernetes.io/managed-by: {{ .Release.Service }}
44
44
  {{- end }}
@@ -60,4 +60,4 @@ Pkg annotations
60
60
  {{ $key }}: {{ $value | quote }}
61
61
  {{- end }}
62
62
  {{- end }}
63
- {{- end }}
63
+ {{- end }}
@@ -8,7 +8,8 @@ spec:
8
8
  plugin:
9
9
  name: {{ include "extension-server.fullname" . }}
10
10
  version: {{ (semver (default .Chart.AppVersion .Values.plugin.versionOverride)).Original }}
11
- endpoint: http://{{ include "extension-server.fullname" . }}.{{ .Release.Namespace }}.svc
11
+ endpoint: {{ .Values.plugin.endpoint | quote }}
12
+ compressedEndpoint: {{ .Values.plugin.compressedEndpoint | quote }}
12
13
  noCache: {{ .Values.plugin.noCache }}
13
14
  noAuth: {{ .Values.plugin.noAuth }}
14
15
  metadata: {{ include "extension-server.pluginMetadata" . | indent 6 }}
@@ -3,6 +3,8 @@ fullnameOverride: ""
3
3
  plugin:
4
4
  enabled: true
5
5
  versionOverride: ""
6
+ endpoint: ""
7
+ compressedEndpoint: ""
6
8
  noCache: false
7
9
  noAuth: false
8
10
  metadata: {}
File without changes
File without changes
File without changes
@@ -1,15 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // Update Chart.yaml and values.yaml files
4
-
5
3
  const fs = require('fs');
6
4
  const path = require('path');
7
5
  const yaml = require('js-yaml');
8
6
 
9
- // TODO: Should already be in the template
10
- // const UI_PLUGIN_ANNOTATION_NAME = 'catalog.cattle.io/ui-component';
11
- // const UI_PLUGIN_ANNOTATION_VALUE = 'plugins';
12
-
13
7
  console.log('Helm file update');
14
8
 
15
9
  if (process.argv.length !== 4) {
@@ -17,12 +11,10 @@ if (process.argv.length !== 4) {
17
11
  process.exit(1);
18
12
  }
19
13
 
20
- const destFolder = process.argv[2];
14
+ const chartFolder = process.argv[2];
21
15
  const pkgFilePath = process.argv[3];
22
16
 
23
17
  const pkgFile = JSON.parse(fs.readFileSync(pkgFilePath, 'utf8'));
24
-
25
- const chartFolder = destFolder;
26
18
  const chartFile = path.join(chartFolder, 'Chart.yaml');
27
19
  const valuesFile = path.join(chartFolder, 'values.yaml');
28
20
 
@@ -32,36 +24,57 @@ if (!fs.existsSync(chartFolder)) {
32
24
  }
33
25
 
34
26
  // --------------------------------------------------------------------------------
35
- // Chart.yaml
27
+ // Chart.yaml updates (annotations)
36
28
  // --------------------------------------------------------------------------------
37
29
  const chart = yaml.load(fs.readFileSync(chartFile, 'utf8'));
38
- let updated = false;
39
-
40
- // Add in annotations to match any rules in the package file
41
- if (pkgFile.rancher && typeof pkgFile.rancher === 'object') {
42
- // See if there are any annotations and merge them in, if there are
43
- if (pkgFile.rancher.annotations) {
44
- chart.annotations = chart.annotations || {};
45
- Object.keys(pkgFile.rancher.annotations).forEach((key) => {
46
- chart.annotations[key] = pkgFile.rancher.annotations[key];
47
- updated = true;
48
- });
49
- }
30
+ let chartUpdated = false;
31
+
32
+ if (pkgFile.rancher?.annotations) {
33
+ chart.annotations = chart.annotations || {};
34
+ Object.entries(pkgFile.rancher.annotations).forEach(([key, value]) => {
35
+ if (chart.annotations[key] !== value) {
36
+ chart.annotations[key] = value;
37
+ chartUpdated = true;
38
+ }
39
+ });
50
40
  }
51
41
 
52
- if (updated) {
53
- // Write out updated file
54
- const str = yaml.dump(chart);
55
-
56
- fs.writeFileSync(chartFile, str, 'utf8');
42
+ if (chartUpdated) {
43
+ fs.writeFileSync(chartFile, yaml.dump(chart), 'utf8');
44
+ console.log('Updated Chart.yaml annotations');
57
45
  }
58
46
 
59
47
  // --------------------------------------------------------------------------------
60
- // values.yaml
48
+ // values.yaml updates (endpoints)
61
49
  // --------------------------------------------------------------------------------
62
-
63
50
  const values = yaml.load(fs.readFileSync(valuesFile, 'utf8'));
64
51
 
65
- const valuesYaml = yaml.dump(values, { quotingType: '"' });
52
+ // Get package metadata from package.json
53
+ const pkgName = pkgFile.name;
54
+ const pkgVersion = pkgFile.version;
55
+ const pkgFullName = `${ pkgName }-${ pkgVersion }`;
56
+
57
+ // Determine build type from environment
58
+ const isGitHubBuild = process.env.GITHUB_BUILD === 'true';
59
+
60
+ // Set endpoints based on build type
61
+ if (isGitHubBuild) {
62
+ const githubSource = process.env.GITHUB_SOURCE;
63
+ const githubBranch = process.env.GITHUB_BRANCH;
64
+
65
+ values.plugin.endpoint = `https://raw.githubusercontent.com/${ githubSource }/${ githubBranch }/extensions/${ pkgName }/${ pkgVersion }`;
66
+ } else {
67
+ const imagePrefix = process.env.IMAGE_PREFIX || '';
68
+ const baseExt = process.env.BASE_EXT;
69
+
70
+ values.plugin.endpoint = `http://${ imagePrefix }${ baseExt }-svc.cattle-ui-plugin-system:8080/plugin/${ pkgFullName }`;
71
+ }
72
+
73
+ // Always set compressedEndpoint as endpoint + .tgz
74
+ values.plugin.compressedEndpoint = `${ values.plugin.endpoint }.tgz`;
66
75
 
67
- fs.writeFileSync(valuesFile, valuesYaml, 'utf8');
76
+ // Write updated values.yaml
77
+ fs.writeFileSync(valuesFile, yaml.dump(values, { quotingType: '"' }), 'utf8');
78
+ console.log('Updated values.yaml endpoints:');
79
+ console.log(`- endpoint: ${ values.plugin.endpoint }`);
80
+ console.log(`- compressedEndpoint: ${ values.plugin.compressedEndpoint }`);
File without changes