dashboard-shell-shell 1.0.122 → 1.0.1000000081

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 +89 -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 +9 -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 +540 -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 +2 -1
  343. package/types/cloud-shell/index.d.ts +11014 -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
@@ -1,6 +1,6 @@
1
1
  <script>
2
- import { mapGetters } from 'vuex';
3
- import { defineAsyncComponent, useTemplateRef, onMounted, onBeforeUnmount } from 'vue';
2
+ import { mapGetters, useStore } from 'vuex';
3
+ import { defineAsyncComponent, ref, onMounted, onBeforeUnmount } from 'vue';
4
4
  import day from 'dayjs';
5
5
  import isEmpty from 'lodash/isEmpty';
6
6
  import { dasherize, ucFirst } from '@shell/utils/string';
@@ -25,6 +25,9 @@ import { getParent } from '@shell/utils/dom';
25
25
  import { FORMATTERS } from '@shell/components/SortableTable/sortable-config';
26
26
  import ButtonMultiAction from '@shell/components/ButtonMultiAction.vue';
27
27
  import ActionMenu from '@shell/components/ActionMenuShell.vue';
28
+ import { useRuntimeFlag } from '@shell/composables/useRuntimeFlag';
29
+ import ActionDropdownShell from '@shell/components/ActionDropdownShell.vue';
30
+ import { harvesterhci2cloud, cloud2harvesterhci } from '@shell/utils/router'
28
31
 
29
32
  // Uncomment for table performance debugging
30
33
  // import tableDebug from './debug';
@@ -56,12 +59,13 @@ export default {
56
59
  components: {
57
60
  THead,
58
61
  Checkbox,
59
- Select,
60
62
  AsyncButton,
63
+ Select,
61
64
  ActionDropdown,
62
65
  LabeledSelect,
63
66
  ButtonMultiAction,
64
67
  ActionMenu,
68
+ ActionDropdownShell,
65
69
  },
66
70
  mixins: [
67
71
  filtering,
@@ -412,10 +416,12 @@ export default {
412
416
  const isLoading = this.loading || false;
413
417
 
414
418
  let isCreatable = false;
415
- const lastPath = this.$route.path.split('/').pop();
419
+ const lastPath = cloud2harvesterhci(this.$route.path.split('/').pop());
416
420
 
417
421
  if (lastPath.includes('.')) {
418
422
  isCreatable = this.$store.getters['type-map/optionsFor'](lastPath).isCreatable;
423
+ } else if (lastPath === 'namespace') {
424
+ isCreatable = this.$store.getters['type-map/optionsFor'](this.$route.name).isCreatable;
419
425
  }
420
426
 
421
427
  return {
@@ -423,6 +429,7 @@ export default {
423
429
  expanded: {},
424
430
  searchQuery,
425
431
  eventualSearchQuery,
432
+ isCreatable,
426
433
  subMatches: null,
427
434
  actionOfInterest: null,
428
435
  loadingDelay: false,
@@ -487,8 +494,8 @@ export default {
487
494
  const $main = document.querySelector('main');
488
495
 
489
496
  $main?.removeEventListener('scroll', this._onScroll);
490
- // 移除所有表格容器的滚动事件监听器
491
- const tables = document.querySelectorAll('.sort-table-div');
497
+ // 移除所有表格容器的滚动事件监听器
498
+ const tables = document.querySelectorAll('.sort-table-div');
492
499
 
493
500
  tables.forEach((table) => {
494
501
  table.removeEventListener('scroll', this._onTableScroll);
@@ -541,6 +548,7 @@ export default {
541
548
  forceUpdateLiveAndDelayed(neu, old) {
542
549
  this.watcherUpdateLiveAndDelayed(neu, old);
543
550
  },
551
+
544
552
  selectedRowsText(neu, old) {
545
553
  if (neu) {
546
554
  this.isMuchSelected = true;
@@ -596,7 +604,7 @@ export default {
596
604
  },
597
605
  },
598
606
  setup(_props, { emit }) {
599
- const table = useTemplateRef('table');
607
+ const table = ref(null);
600
608
 
601
609
  const handleEnterKey = (event) => {
602
610
  if (event.key === 'Enter' && !event.target?.classList?.contains('checkbox-custom')) {
@@ -611,6 +619,14 @@ export default {
611
619
  onBeforeUnmount(() => {
612
620
  table.value.removeEventListener('keyup', handleEnterKey);
613
621
  });
622
+
623
+ const store = useStore();
624
+ const { featureDropdownMenu } = useRuntimeFlag(store);
625
+
626
+ return {
627
+ table,
628
+ featureDropdownMenu,
629
+ };
614
630
  },
615
631
 
616
632
  created() {
@@ -831,7 +847,7 @@ export default {
831
847
  });
832
848
 
833
849
  return rows;
834
- }
850
+ },
835
851
  },
836
852
 
837
853
  methods: {
@@ -919,13 +935,13 @@ export default {
919
935
  },
920
936
  get,
921
937
  dasherize,
922
-
923
938
  muchSelect(value) {
924
939
  console.log(value);
925
940
 
926
941
  this.isMuchSelected = !this.isMuchSelected;
927
942
  this.onToggleAll(value);
928
943
  },
944
+
929
945
  onScroll() {
930
946
  if (this.hasLiveColumns || this.hasDelayedColumns) {
931
947
  clearTimeout(this._liveColumnsTimer);
@@ -1208,99 +1224,28 @@ export default {
1208
1224
  ref="container"
1209
1225
  :data-testid="componentTestid + '-list-container'"
1210
1226
  >
1211
- <div
1212
- :class="{'titled': $slots.title && $slots.title.length, 'mb-40': isFilterLabel}"
1213
- class="sortable-table-header mb-20"
1214
- :style="{marginTop: search&& !isBanner ? marginTopValue + 'px' : '0px',marginLeft: isCreatable ? '100px' : '-10px',maxHeight: '32px'}"
1227
+ <div
1228
+ :class="{'titled': $slots.title && $slots.title.length, 'mb-40': isFilterLabel, 'mb-20': search || isCreatable}"
1229
+ class="sortable-table-header "
1230
+ :style="{marginTop: search&& !isBanner ? marginTopValue + 'px' : '0px',marginLeft: isCreatable ? '100px' : '-10px',maxHeight: '32px'}"
1215
1231
  >
1216
1232
  <slot name="title" />
1217
1233
  <div
1218
1234
  v-if="showHeaderRow"
1219
1235
  class="fixed-header-actions"
1220
- :class="{button: !!$slots['header-button'], 'advanced-filtering': hasAdvancedFiltering}"
1236
+ :class="{button: !!$slots['header-button'], 'advanced-filtering': hasAdvancedFiltering, }"
1221
1237
  style="display: flex;"
1222
1238
  >
1223
1239
  <!-- <div
1224
1240
  :class="bulkActionsClass"
1225
1241
  class="bulk"
1226
1242
  >
1227
- <slot name="header-left">
1228
- <template v-if="tableActions">
1229
- <button
1230
- v-for="(act) in availableActions"
1231
- :id="act.action"
1232
- :key="act.action"
1233
- v-clean-tooltip="actionTooltip"
1234
- type="button"
1235
- class="btn role-primary"
1236
- :class="{[bulkActionClass]:true}"
1237
- :disabled="!act.enabled"
1238
- :data-testid="componentTestid + '-' + act.action"
1239
- @click="applyTableAction(act, null, $event)"
1240
- @keydown.enter.stop
1241
- @mouseover="setBulkActionOfInterest(act)"
1242
- @mouseleave="setBulkActionOfInterest(null)"
1243
- >
1244
- <i
1245
- v-if="act.icon"
1246
- :class="act.icon"
1247
- />
1248
- <span v-clean-html="act.label" />
1249
- </button>
1250
- <ActionDropdown
1251
- :class="bulkActionsDropdownClass"
1252
- class="bulk-actions-dropdown"
1253
- :disable-button="!selectedRows.length"
1254
- size="sm"
1255
- >
1256
- <template #button-content>
1257
- <button
1258
- ref="actionDropDown"
1259
- class="btn bg-primary mr-0"
1260
- :disabled="!selectedRows.length"
1261
- >
1262
- <i class="icon icon-gear" />
1263
- <span>{{ t('sortableTable.bulkActions.collapsed.label') }}</span>
1264
- <i class="ml-10 icon icon-chevron-down" />
1265
- </button>
1266
- </template>
1267
- <template #popover-content>
1268
- <ul class="list-unstyled menu">
1269
- <li
1270
- v-for="(act, i) in hiddenActions"
1271
- :key="i"
1272
- v-close-popper
1273
- v-clean-tooltip="{
1274
- content: actionTooltip,
1275
- placement: 'right'
1276
- }"
1277
- :class="{ disabled: !act.enabled }"
1278
- @click="applyTableAction(act, null, $event)"
1279
- @mouseover="setBulkActionOfInterest(act)"
1280
- @mouseleave="setBulkActionOfInterest(null)"
1281
- >
1282
- <i
1283
- v-if="act.icon"
1284
- :class="act.icon"
1285
- />
1286
- <span v-clean-html="act.label" />
1287
- </li>
1288
- </ul>
1289
- </template>
1290
- </ActionDropdown>
1291
- <label
1292
- v-if="selectedRowsText"
1293
- :class="bulkActionAvailabilityClass"
1294
- class="action-availability"
1295
- >
1296
- {{ selectedRowsText }}
1297
- </label>
1298
- </template>
1299
- </slot>
1243
+
1300
1244
  </div> -->
1301
1245
  <div
1302
1246
  v-if="!hasAdvancedFiltering && $slots['header-middle']"
1303
1247
  class="middle"
1248
+ style="margin-left: 10px;margin-right: -10px;"
1304
1249
  >
1305
1250
  <slot name="header-middle" />
1306
1251
  </div>
@@ -1309,6 +1254,7 @@ export default {
1309
1254
  v-if="search || hasAdvancedFiltering || isTooManyItemsToAutoUpdate || $slots['header-right']"
1310
1255
  class="search row"
1311
1256
  data-testid="search-box-filter-row"
1257
+ style="max-height: 32px;display: contents;"
1312
1258
  >
1313
1259
  <ul
1314
1260
  v-if="hasAdvancedFiltering"
@@ -1389,7 +1335,14 @@ export default {
1389
1335
  </div>
1390
1336
  </div>
1391
1337
  </div>
1392
- <slot name="header-button" />
1338
+ <p
1339
+ v-else-if="search"
1340
+ id="describe-filter-sortable-table"
1341
+ hidden
1342
+ >
1343
+ {{ t('sortableTable.filteringDescription') }}
1344
+ </p>
1345
+ <slot name="header-button" />
1393
1346
  <input
1394
1347
  v-if="search"
1395
1348
  ref="searchQuery"
@@ -1397,300 +1350,320 @@ export default {
1397
1350
  type="search"
1398
1351
  class="input-sm search-box"
1399
1352
  :aria-label="t('sortableTable.searchLabel')"
1353
+ aria-describedby="describe-filter-sortable-table"
1400
1354
  :placeholder="t('sortableTable.search')+searchPlaceholder"
1401
1355
  >
1402
1356
 
1403
1357
  </div>
1404
1358
  </div>
1405
1359
  </div>
1360
+ <div v-if="$slots['banner']">
1361
+ <slot name="banner"></slot>
1362
+ </div>
1406
1363
  <div class="sort-table-div">
1407
- <table
1408
- ref="table"
1409
- class="sortable-table"
1410
- :class="classObject"
1411
- width="100%"
1412
- role="table"
1413
- >
1414
- <THead
1415
- v-if="showHeaders"
1416
- :label-for="labelFor"
1417
- :columns="columns"
1418
- :group="group"
1419
- :group-options="advGroupOptions"
1420
- :has-advanced-filtering="hasAdvancedFiltering"
1421
- :adv-filter-hide-labels-as-cols="advFilterHideLabelsAsCols"
1422
- :table-actions="tableActions"
1423
- :table-cols-options="columnOptions"
1424
- :row-actions="rowActions"
1425
- :sub-expand-column="subExpandColumn"
1426
- :row-actions-width="rowActionsWidth"
1427
- :how-much-selected="howMuchSelected"
1428
- :sort-by="sortBy"
1429
- :default-sort-by="_defaultSortBy"
1430
- :descending="descending"
1431
- :no-rows="noRows"
1432
- :loading="isLoading && !loadingDelay"
1433
- :no-results="noResults"
1434
- @on-toggle-all="onToggleAll"
1435
- @on-sort-change="changeSort"
1436
- @col-visibility-change="changeColVisibility"
1437
- @group-value-change="(val) => $emit('group-value-change', val)"
1438
- @update-cols-options="updateColsOptions"
1439
- />
1364
+ <table
1365
+ ref="table"
1366
+ class="sortable-table"
1367
+ :class="classObject"
1368
+ width="100%"
1369
+ role="table"
1370
+ >
1371
+ <THead
1372
+ v-if="showHeaders"
1373
+ :label-for="labelFor"
1374
+ :columns="columns"
1375
+ :group="group"
1376
+ :group-options="advGroupOptions"
1377
+ :has-advanced-filtering="hasAdvancedFiltering"
1378
+ :adv-filter-hide-labels-as-cols="advFilterHideLabelsAsCols"
1379
+ :table-actions="tableActions"
1380
+ :table-cols-options="columnOptions"
1381
+ :row-actions="rowActions"
1382
+ :sub-expand-column="subExpandColumn"
1383
+ :row-actions-width="rowActionsWidth"
1384
+ :how-much-selected="howMuchSelected"
1385
+ :sort-by="sortBy"
1386
+ :default-sort-by="_defaultSortBy"
1387
+ :descending="descending"
1388
+ :no-rows="noRows"
1389
+ :loading="isLoading && !loadingDelay"
1390
+ :no-results="noResults"
1391
+ @on-toggle-all="onToggleAll"
1392
+ @on-sort-change="changeSort"
1393
+ @col-visibility-change="changeColVisibility"
1394
+ @group-value-change="(val) => $emit('group-value-change', val)"
1395
+ @update-cols-options="updateColsOptions"
1396
+ />
1440
1397
 
1441
- <!-- Don't display anything if we're loading and the delay has yet to pass -->
1442
- <div v-if="isLoading && !loadingDelay" />
1443
-
1444
- <tbody v-else-if="isLoading && !altLoading">
1445
- <slot name="loading">
1446
- <tr>
1447
- <td :colspan="fullColspan">
1448
- <div class="data-loading">
1449
- <i class="icon-spin icon icon-spinner" />
1450
- <t
1451
- k="generic.loading"
1452
- :raw="true"
1453
- />
1454
- </div>
1455
- </td>
1456
- </tr>
1457
- </slot>
1458
- </tbody>
1459
- <tbody v-else-if="noRows">
1460
- <slot name="no-rows">
1461
- <tr class="no-rows">
1462
- <td :colspan="fullColspan">
1398
+ <!-- Don't display anything if we're loading and the delay has yet to pass -->
1399
+ <div v-if="isLoading && !loadingDelay" />
1400
+
1401
+ <tbody v-else-if="isLoading && !altLoading">
1402
+ <slot name="loading">
1403
+ <tr>
1404
+ <td :colspan="fullColspan">
1405
+ <div class="data-loading">
1406
+ <i class="icon-spin icon icon-spinner" />
1463
1407
  <t
1464
- v-if="showNoRows"
1465
- :k="noRowsKey"
1408
+ k="generic.loading"
1409
+ :raw="true"
1466
1410
  />
1467
- </td>
1468
- </tr>
1469
- </slot>
1470
- </tbody>
1471
- <tbody v-else-if="noResults">
1472
- <slot name="no-results">
1473
- <tr class="no-results">
1474
- <td
1475
- :colspan="fullColspan"
1476
- class="text-center"
1411
+ </div>
1412
+ </td>
1413
+ </tr>
1414
+ </slot>
1415
+ </tbody>
1416
+ <tbody v-else-if="noRows">
1417
+ <slot name="no-rows">
1418
+ <tr class="no-rows">
1419
+ <td :colspan="fullColspan">
1420
+ <t
1421
+ v-if="showNoRows"
1422
+ :k="noRowsKey"
1423
+ />
1424
+ </td>
1425
+ </tr>
1426
+ </slot>
1427
+ </tbody>
1428
+ <tbody v-else-if="noResults">
1429
+ <slot name="no-results">
1430
+ <tr class="no-results">
1431
+ <td
1432
+ :colspan="fullColspan"
1433
+ class="text-center"
1434
+ >
1435
+ <t :k="noDataKey" />
1436
+ </td>
1437
+ </tr>
1438
+ </slot>
1439
+ </tbody>
1440
+ <tbody
1441
+ v-for="(groupedRows) in displayRows"
1442
+ v-else
1443
+ :key="groupedRows.key"
1444
+ tabindex="-1"
1445
+ :class="{ group: groupBy }"
1446
+ >
1447
+ <slot
1448
+ v-if="groupBy"
1449
+ name="group-row"
1450
+ :group="groupedRows"
1451
+ :fullColspan="fullColspan"
1452
+ >
1453
+ <tr class="group-row">
1454
+ <td :colspan="fullColspan">
1455
+ <slot
1456
+ name="group-by"
1457
+ :group="groupedRows.grp"
1477
1458
  >
1478
- <t :k="noDataKey" />
1479
- </td>
1480
- </tr>
1481
- </slot>
1482
- </tbody>
1483
- <tbody
1484
- v-for="(groupedRows) in displayRows"
1485
- v-else
1486
- :key="groupedRows.key"
1487
- tabindex="-1"
1488
- :class="{ group: groupBy }"
1459
+ <div
1460
+ v-trim-whitespace
1461
+ class="group-tab"
1462
+ >
1463
+ {{ groupedRows.ref }}
1464
+ </div>
1465
+ </slot>
1466
+ </td>
1467
+ </tr>
1468
+ </slot>
1469
+ <template
1470
+ v-for="(row, i) in groupedRows.rows"
1471
+ :key="i"
1489
1472
  >
1490
1473
  <slot
1491
- v-if="groupBy"
1492
- name="group-row"
1493
- :group="groupedRows"
1494
- :fullColspan="fullColspan"
1495
- >
1496
- <tr class="group-row">
1497
- <td :colspan="fullColspan">
1498
- <slot
1499
- name="group-by"
1500
- :group="groupedRows.grp"
1501
- >
1502
- <div
1503
- v-trim-whitespace
1504
- class="group-tab"
1505
- >
1506
- {{ groupedRows.ref }}
1507
- </div>
1508
- </slot>
1509
- </td>
1510
- </tr>
1511
- </slot>
1512
- <template
1513
- v-for="(row, i) in groupedRows.rows"
1514
- :key="i"
1474
+ name="main-row"
1475
+ :row="row.row"
1515
1476
  >
1516
1477
  <slot
1517
- name="main-row"
1518
- :row="row.row"
1478
+ :name="'main-row:' + (row.row.mainRowKey || i)"
1479
+ :full-colspan="fullColspan"
1519
1480
  >
1520
- <slot
1521
- :name="'main-row:' + (row.row.mainRowKey || i)"
1522
- :full-colspan="fullColspan"
1481
+ <!-- The data-cant-run-bulk-action-of-interest attribute is being used instead of :class because
1482
+ because our selection.js invokes toggleClass and :class clobbers what was added by toggleClass if
1483
+ the value of :class changes. -->
1484
+ <tr
1485
+ class="main-row"
1486
+ :data-testid="componentTestid + '-' + i + '-row'"
1487
+ :class="{ 'has-sub-row': row.showSubRow}"
1488
+ :data-node-id="row.key"
1489
+ :data-cant-run-bulk-action-of-interest="actionOfInterest && !row.canRunBulkActionOfInterest"
1523
1490
  >
1524
- <!-- The data-cant-run-bulk-action-of-interest attribute is being used instead of :class because
1525
- because our selection.js invokes toggleClass and :class clobbers what was added by toggleClass if
1526
- the value of :class changes. -->
1527
- <tr
1528
- class="main-row"
1529
- :data-testid="componentTestid + '-' + i + '-row'"
1530
- :class="{ 'has-sub-row': row.showSubRow}"
1531
- :data-node-id="row.key"
1532
- :data-cant-run-bulk-action-of-interest="actionOfInterest && !row.canRunBulkActionOfInterest"
1491
+ <td
1492
+ v-if="tableActions"
1493
+ class="row-check"
1494
+ align="middle"
1533
1495
  >
1534
- <td
1535
- v-if="tableActions"
1536
- class="row-check"
1537
- align="middle"
1538
- >
1539
- {{ row.mainRowKey }}
1540
- <Checkbox
1541
- class="selection-checkbox"
1542
- :data-node-id="row.key"
1543
- :data-testid="componentTestid + '-' + i + '-checkbox'"
1544
- :value="selectedRows.includes(row.row)"
1545
- :alternate-label="t('sortableTable.genericRowCheckbox', { item: row && row.row ? row.row.id : '' })"
1546
- />
1547
- </td>
1548
- <td
1549
- v-if="subExpandColumn"
1550
- class="row-expand"
1551
- align="middle"
1552
- >
1553
- <i
1554
- data-title="Toggle Expand"
1555
- :class="{
1556
- icon: true,
1557
- 'icon-chevron-right': !expanded[row.row[keyField]],
1558
- 'icon-chevron-down': !!expanded[row.row[keyField]]
1559
- }"
1560
- @click.stop="toggleExpand(row.row)"
1561
- />
1562
- </td>
1563
- <template
1564
- v-for="(col, j) in row.columns"
1565
- :key="j"
1496
+ {{ row.mainRowKey }}
1497
+ <Checkbox
1498
+ class="selection-checkbox"
1499
+ :data-node-id="row.key"
1500
+ :data-testid="componentTestid + '-' + i + '-checkbox'"
1501
+ :value="selectedRows.includes(row.row)"
1502
+ :alternate-label="t('sortableTable.genericRowCheckbox', { item: row && row.row ? row.row.id : '' })"
1503
+ />
1504
+ </td>
1505
+ <td
1506
+ v-if="subExpandColumn"
1507
+ class="row-expand"
1508
+ align="middle"
1509
+ >
1510
+ <i
1511
+ data-title="Toggle Expand"
1512
+ :class="{
1513
+ icon: true,
1514
+ 'icon-chevron-right': !expanded[row.row[keyField]],
1515
+ 'icon-chevron-down': !!expanded[row.row[keyField]]
1516
+ }"
1517
+ @click.stop="toggleExpand(row.row)"
1518
+ />
1519
+ </td>
1520
+ <template
1521
+ v-for="(col, j) in row.columns"
1522
+ :key="j"
1523
+ >
1524
+ <slot
1525
+ :name="'col:' + col.col.name"
1526
+ :row="row.row"
1527
+ :col="col.col"
1528
+ :dt="dt"
1529
+ :expanded="expanded"
1530
+ :rowKey="row.key"
1566
1531
  >
1567
- <slot
1568
- :name="'col:' + col.col.name"
1569
- :row="row.row"
1570
- :col="col.col"
1571
- :dt="dt"
1572
- :expanded="expanded"
1573
- :rowKey="row.key"
1532
+ <td
1533
+ v-show="!hasAdvancedFiltering || (hasAdvancedFiltering && col.col.isColVisible)"
1534
+ :key="col.col.name"
1535
+ :data-title="col.col.label"
1536
+ :data-testid="`sortable-cell-${ i }-${ j }`"
1537
+ :align="col.col.align || 'left'"
1538
+ :class="{['col-'+col.dasherize]: !!col.col.formatter, [col.col.breakpoint]: !!col.col.breakpoint, ['skip-select']: col.col.skipSelect}"
1539
+ :width="col.col.width"
1574
1540
  >
1575
- <td
1576
- v-show="!hasAdvancedFiltering || (hasAdvancedFiltering && col.col.isColVisible)"
1577
- :key="col.col.name"
1578
- :data-title="col.col.label"
1579
- :data-testid="`sortable-cell-${ i }-${ j }`"
1580
- :align="col.col.align || 'left'"
1581
- :class="{['col-'+col.dasherize]: !!col.col.formatter, [col.col.breakpoint]: !!col.col.breakpoint, ['skip-select']: col.col.skipSelect}"
1582
- :width="col.col.width"
1541
+ <slot
1542
+ :name="'cell:' + col.col.name"
1543
+ :row="row.row"
1544
+ :col="col.col"
1545
+ :value="col.value"
1583
1546
  >
1584
- <slot
1585
- :name="'cell:' + col.col.name"
1547
+ <component
1548
+ :is="col.component"
1549
+ v-if="col.component && col.needRef"
1550
+ ref="column"
1551
+ :value="col.value"
1586
1552
  :row="row.row"
1587
1553
  :col="col.col"
1554
+ :get-custom-detail-link="getCustomDetailLink"
1555
+ v-bind="col.col.formatterOpts"
1556
+ :row-key="row.key"
1557
+ />
1558
+ <component
1559
+ :is="col.component"
1560
+ v-else-if="col.component"
1588
1561
  :value="col.value"
1589
- >
1590
- <component
1591
- :is="col.component"
1592
- v-if="col.component && col.needRef"
1593
- ref="column"
1594
- :value="col.value"
1595
- :row="row.row"
1596
- :col="col.col"
1597
- v-bind="col.col.formatterOpts"
1598
- :row-key="row.key"
1599
- :get-custom-detail-link="getCustomDetailLink"
1600
- />
1601
- <component
1602
- :is="col.component"
1603
- v-else-if="col.component"
1604
- :value="col.value"
1605
- :row="row.row"
1606
- :col="col.col"
1607
- v-bind="col.col.formatterOpts"
1608
- :row-key="row.key"
1609
- />
1610
- <component
1611
- :is="col.col.formatter"
1612
- v-else-if="col.col.formatter"
1613
- :value="col.value"
1614
- :row="row.row"
1615
- :col="col.col"
1616
- v-bind="col.col.formatterOpts"
1617
- :row-key="row.key"
1618
- />
1619
- <template v-else-if="col.value !== ''">
1620
- {{ col.formatted }}
1621
- </template>
1622
- <template v-else-if="col.col.dashIfEmpty">
1623
- <span class="text-muted">&mdash;</span>
1624
- </template>
1625
- </slot>
1626
- </td>
1627
- </slot>
1628
- </template>
1629
- <td
1630
- v-if="rowActions"
1631
- :align="'left'"
1632
- style="height:60px"
1562
+ :row="row.row"
1563
+ :col="col.col"
1564
+ v-bind="col.col.formatterOpts"
1565
+ :row-key="row.key"
1566
+ />
1567
+ <component
1568
+ :is="col.col.formatter"
1569
+ v-else-if="col.col.formatter"
1570
+ :value="col.value"
1571
+ :row="row.row"
1572
+ :col="col.col"
1573
+ v-bind="col.col.formatterOpts"
1574
+ :row-key="row.key"
1575
+ />
1576
+ <template v-else-if="col.value !== ''">
1577
+ {{ col.formatted }}
1578
+ </template>
1579
+ <template v-else-if="col.col.dashIfEmpty">
1580
+ <span class="text-muted">&mdash;</span>
1581
+ </template>
1582
+ </slot>
1583
+ </td>
1584
+ </slot>
1585
+ </template>
1586
+ <td
1587
+ v-if="rowActions"
1588
+ :align="'left'"
1589
+ style="height:60px"
1590
+ >
1591
+ <div style="display: flex;align-items: center;">
1592
+ <slot
1593
+ name="row-actions"
1594
+ :row="row.row"
1595
+ :index="i"
1633
1596
  >
1634
- <div style="display: flex;align-items: center;">
1635
- <slot
1636
- name="row-actions"
1637
- :row="row.row"
1638
- :index="i"
1639
- >
1640
- </slot>
1641
- <ActionMenu
1597
+ </slot>
1598
+ <template v-if="featureDropdownMenu">
1599
+ <ActionMenu
1642
1600
  :resource="row.row"
1643
1601
  :data-testid="componentTestid + '-' + i + '-action-button'"
1644
1602
  :button-aria-label="t('sortableTable.tableActionsLabel', { resource: row?.row?.id || '' })"
1645
- />
1646
- </div>
1647
- </td>
1648
- </tr>
1649
- </slot>
1603
+ />
1604
+ </template>
1605
+ <template v-else>
1606
+ <ButtonMultiAction
1607
+ :id="`actionButton+${i}+${(row.row && row.row.name) ? row.row.name : ''}`"
1608
+ :ref="`actionButton${i}`"
1609
+ aria-haspopup="true"
1610
+ aria-expanded="false"
1611
+ :aria-label="t('sortableTable.tableActionsLabel', { resource: row?.row?.id || '' })"
1612
+ :data-testid="componentTestid + '-' + i + '-action-button'"
1613
+ :borderless="true"
1614
+ @click="handleActionButtonClick(i, $event)"
1615
+ @keyup.enter="handleActionButtonClick(i, $event)"
1616
+ @keyup.space="handleActionButtonClick(i, $event)"
1617
+ />
1618
+ </template>
1619
+ </div>
1620
+ </td>
1621
+ </tr>
1650
1622
  </slot>
1651
- <!-- <slot
1652
- v-if="row.showSubRow"
1653
- name="sub-row"
1654
- :full-colspan="fullColspan"
1655
- :row="row.row"
1656
- :sub-matches="subMatches"
1657
- :keyField="keyField"
1658
- :componentTestid="componentTestid"
1659
- :i="i"
1660
- :onRowMouseEnter="onRowMouseEnter"
1661
- :onRowMouseLeave="onRowMouseLeave"
1623
+ </slot>
1624
+ <!-- <slot
1625
+ v-if="row.showSubRow"
1626
+ name="sub-row"
1627
+ :full-colspan="fullColspan"
1628
+ :row="row.row"
1629
+ :sub-matches="subMatches"
1630
+ :keyField="keyField"
1631
+ :componentTestid="componentTestid"
1632
+ :i="i"
1633
+ :onRowMouseEnter="onRowMouseEnter"
1634
+ :onRowMouseLeave="onRowMouseLeave"
1635
+ >
1636
+ <tr
1637
+ v-if="row.row.stateDescription"
1638
+ :key="row.row[keyField] + '-description'"
1639
+ :data-testid="componentTestid + '-' + i + '-row-description'"
1640
+ class="state-description sub-row"
1641
+ @mouseenter="onRowMouseEnter"
1642
+ @mouseleave="onRowMouseLeave"
1662
1643
  >
1663
- <tr
1664
- v-if="row.row.stateDescription"
1665
- :key="row.row[keyField] + '-description'"
1666
- :data-testid="componentTestid + '-' + i + '-row-description'"
1667
- class="state-description sub-row"
1668
- @mouseenter="onRowMouseEnter"
1669
- @mouseleave="onRowMouseLeave"
1644
+ <td
1645
+ v-if="tableActions"
1646
+ class="row-check"
1647
+ align="middle"
1648
+ />
1649
+ <td
1650
+ :colspan="fullColspan - (tableActions ? 1: 0)"
1651
+ :class="{ 'text-error' : row.row.stateObj.error }"
1670
1652
  >
1671
- <td
1672
- v-if="tableActions"
1673
- class="row-check"
1674
- align="middle"
1675
- />
1676
- <td
1677
- :colspan="fullColspan - (tableActions ? 1: 0)"
1678
- :class="{ 'text-error' : row.row.stateObj.error }"
1679
- >
1680
- {{ row.row.stateDescription }}
1681
- </td>
1682
- </tr>
1683
- </slot> -->
1684
- </template>
1685
- </tbody>
1686
- </table>
1687
- </div>
1653
+ {{ row.row.stateDescription }}
1654
+ </td>
1655
+ </tr>
1656
+ </slot> -->
1657
+ </template>
1658
+ </tbody>
1659
+ </table>
1660
+ </div>
1688
1661
  <div
1689
1662
  v-if="!noRows && !noResults"
1690
1663
  :class="$route.path=== '/account'? 'chebox-padding':''"
1691
1664
  style="display: flex;justify-content: flex-start;align-content: center;height: 62px;position: sticky;bottom: 0;background-color: var(--header-bg);padding: 15px 20px 0 30px;margin: 0 -20px 0 -20px;z-index:20"
1692
1665
  >
1693
- <div style="display: flex;justify-content: center;height: 32px;">
1666
+ <div style="display: flex;justify-content: center;height: 32px;">
1694
1667
  <Checkbox
1695
1668
  v-if="tableActions&&availableActions.some(item => item.action != 'download')"
1696
1669
  :value="isMuchSelected"
@@ -1713,9 +1686,9 @@ export default {
1713
1686
  :class="{button: !!$slots['header-button'], 'advanced-filtering': hasAdvancedFiltering,}"
1714
1687
  >
1715
1688
  <div
1716
- :class="bulkActionsClass"
1717
- class="bulk"
1718
- >
1689
+ :class="bulkActionsClass"
1690
+ class="bulk"
1691
+ >
1719
1692
  <slot name="header-left">
1720
1693
  <template v-if="tableActions">
1721
1694
  <button
@@ -1728,6 +1701,8 @@ export default {
1728
1701
  :class="{[bulkActionClass]:true}"
1729
1702
  :disabled="!act.enabled"
1730
1703
  :data-testid="componentTestid + '-' + act.action"
1704
+ role="button"
1705
+ :aria-label="act.label"
1731
1706
  @click="applyTableAction(act, null, $event)"
1732
1707
  @keydown.enter.stop
1733
1708
  @mouseover="setBulkActionOfInterest(act)"
@@ -1739,229 +1714,240 @@ export default {
1739
1714
  />
1740
1715
  <span v-clean-html="act.label" />
1741
1716
  </button>
1742
- <ActionDropdown
1743
- :class="bulkActionsDropdownClass"
1744
- class="bulk-actions-dropdown"
1745
- :disable-button="!selectedRows.length"
1746
- size="sm"
1747
- >
1748
- <template #button-content>
1749
- <button
1750
- ref="actionDropDown"
1751
- class="btn bg-primary mr-0"
1752
- :disabled="!selectedRows.length"
1753
- >
1754
- <i class="icon icon-gear" />
1755
- <span>{{ t('sortableTable.bulkActions.collapsed.label') }}</span>
1756
- <i class="ml-10 icon icon-chevron-down" />
1757
- </button>
1758
- </template>
1759
- <template #popover-content>
1760
- <ul class="list-unstyled menu">
1761
- <li
1762
- v-for="(act, i) in hiddenActions"
1763
- :key="i"
1764
- v-close-popper
1765
- v-clean-tooltip="{
1766
- content: actionTooltip,
1767
- placement: 'right'
1768
- }"
1769
- :class="{ disabled: !act.enabled }"
1770
- @click="applyTableAction(act, null, $event)"
1771
- @mouseover="setBulkActionOfInterest(act)"
1772
- @mouseleave="setBulkActionOfInterest(null)"
1717
+ <template v-if="featureDropdownMenu">
1718
+ <ActionDropdownShell
1719
+ :disabled="!selectedRows.length"
1720
+ :hidden-actions="hiddenActions"
1721
+ :action-tooltip="actionTooltip"
1722
+ @click="applyTableAction"
1723
+ @mouseover="setBulkActionOfInterest"
1724
+ @mouseleave="setBulkActionOfInterest"
1725
+ />
1726
+ </template>
1727
+ <template v-else>
1728
+ <ActionDropdown
1729
+ :class="bulkActionsDropdownClass"
1730
+ class="bulk-actions-dropdown"
1731
+ :disable-button="!selectedRows.length"
1732
+ size="sm"
1733
+ >
1734
+ <template #button-content>
1735
+ <button
1736
+ ref="actionDropDown"
1737
+ class="btn bg-primary mr-0"
1738
+ :disabled="!selectedRows.length"
1773
1739
  >
1774
- <i
1775
- v-if="act.icon"
1776
- :class="act.icon"
1777
- />
1778
- <span v-clean-html="act.label" />
1779
- </li>
1780
- </ul>
1781
- </template>
1782
- </ActionDropdown>
1783
- <label
1784
- v-if="selectedRowsText"
1785
- :class="bulkActionAvailabilityClass"
1786
- class="action-availability"
1787
- >
1788
- {{ selectedRowsText }}
1789
- </label>
1740
+ <i class="icon icon-gear" />
1741
+ <span>{{ t('sortableTable.bulkActions.collapsed.label') }}</span>
1742
+ <i class="ml-10 icon icon-chevron-down" />
1743
+ </button>
1744
+ </template>
1745
+ <template #popover-content>
1746
+ <ul class="list-unstyled menu">
1747
+ <li
1748
+ v-for="(act, i) in hiddenActions"
1749
+ :key="i"
1750
+ v-close-popper
1751
+ v-clean-tooltip="{
1752
+ content: actionTooltip,
1753
+ placement: 'right'
1754
+ }"
1755
+ :class="{ disabled: !act.enabled }"
1756
+ @click="applyTableAction(act, null, $event)"
1757
+ @mouseover="setBulkActionOfInterest(act)"
1758
+ @mouseleave="setBulkActionOfInterest(null)"
1759
+ >
1760
+ <i
1761
+ v-if="act.icon"
1762
+ :class="act.icon"
1763
+ />
1764
+ <span v-clean-html="act.label" />
1765
+ </li>
1766
+ </ul>
1767
+ </template>
1768
+ </ActionDropdown>
1769
+ </template>
1770
+ <label
1771
+ v-if="selectedRowsText"
1772
+ :class="bulkActionAvailabilityClass"
1773
+ class="action-availability"
1774
+ >
1775
+ {{ tableActions&&availableActions.some(item => item.action != 'download') ?selectedRowsText: '' }}
1776
+ </label>
1777
+
1790
1778
  </template>
1791
1779
  </slot>
1792
1780
  </div>
1793
1781
  </div>
1794
1782
  </div>
1795
1783
 
1784
+ <!-- 分页 -->
1785
+ <div
1786
+ v-if="showPaging"
1787
+ class="paging"
1788
+ >
1789
+ <div style="height: 100%; align-content: center;">
1790
+ 共 {{ filteredRows.length }} 条
1791
+ </div>
1796
1792
 
1797
- <!-- 分页 -->
1798
- <div
1799
- v-if="showPaging"
1800
- class="paging"
1793
+ <button
1794
+ type="button"
1795
+ class="btn btn-sm role-multi-action page-btn-normal"
1796
+ :disabled="page == 1"
1797
+ :style="{ color: page <= totalPages ? `var(--default-text) !important` : `var(--paimary)`,border: page <= totalPages ? `solid thin var(--border)` : `solid thin var(--paimary)`}"
1798
+ @click="goToPage('prev')"
1801
1799
  >
1802
- <div style="height: 100%; align-content: center;">
1803
- 共 {{ filteredRows.length }} 条
1804
- </div>
1805
-
1806
- <button
1807
- type="button"
1808
- class="btn btn-sm role-multi-action page-btn-normal"
1809
- :disabled="page == 1"
1810
- :style="{ color: page <= totalPages ? `var(--default-text) !important` : `var(--paimary)`,border: page <= totalPages ? `solid thin var(--border)` : `solid thin var(--paimary)`}"
1811
- @click="goToPage('prev')"
1812
- >
1813
- <!-- <i class="icon icon-chevron-left" /> -->
1814
- <
1815
- </button>
1816
- <button
1817
- type="button"
1818
- class="btn btn-sm role-multi-action page-btn-normal"
1819
- :style="{ color: (page == 1) ? `var(--primary)`:`var(--default-text) !important`,border: (page == 1) ? `solid thin var(--primary)` : `solid thin var(--border)`}"
1820
- @click="goToPage('first')"
1821
- >
1822
- <!-- <i class="icon icon-chevron-beginning" /> -->
1823
- {{ 1 }}
1824
- </button>
1825
- <template v-if="totalPages > 2">
1826
- <div style="display: flex;flex-direction: row;gap: 10px;">
1827
- <button
1828
- v-if="page - 2 > 1 && page <= totalPages "
1829
- type="button"
1830
- class="btn btn-sm role-multi-action page-btn-normal"
1831
- :style="{ color: `var(--default-text) !important`,border: `solid thin white`}"
1832
- >
1833
- ...
1834
- </button>
1835
- <button
1836
- v-if="page - 1 > 1 && page <= totalPages "
1837
- type="button"
1838
- class="btn btn-sm role-multi-action page-btn-normal"
1839
- :style="{ color: `var(--default-text) !important`,border: `solid thin var(--border)`}"
1840
- @click="setPage(page-1)"
1841
- >
1842
- {{ page-1 }}
1843
- </button>
1844
- <button
1845
- v-if="page > 1 && page < totalPages"
1846
- type="button"
1847
- class="btn btn-sm role-multi-action page-btn-normal"
1848
- :style="{ color: `var(--default-text)`,border: `solid thin var(--primary)`}"
1849
- @click="setPage(page)"
1850
- >
1851
- {{ page }}
1852
- </button>
1853
- <button
1854
- v-if="page + 1 < totalPages "
1855
- type="button"
1856
- class="btn btn-sm role-multi-action page-btn-normal"
1857
- :style="{ color: `var(--default-text) !important`,border: `solid thin var(--border)`}"
1858
- @click="setPage(page+1)"
1859
- >
1860
- {{ page+1 }}
1861
- </button>
1862
- <button
1863
- v-if="page +2 < totalPages "
1864
- type="button"
1865
- class="btn btn-sm role-multi-action page-btn-normal"
1866
- :style="{ color: `var(--default-text) !important`,border: `solid thin white`}"
1867
- >
1868
- ...
1869
- </button>
1870
- </div>
1871
- </template>
1872
- <!-- <button
1873
- type="button"
1874
- class="btn btn-sm role-multi-action"
1875
- style="padding: 0;max-width: 32px;background-color: white !important;"
1876
- >
1877
- {{ page }}
1878
- </button> -->
1879
- <button
1880
- v-if="totalPages > 1"
1881
- type="button"
1882
- class="btn btn-sm role-multi-action page-btn-normal"
1883
- :style="{ color: (page == totalPages) ? `var(--primary)`:`var(--default-text) !important`,border: (page == totalPages) ? `solid thin var(--primary)` : `solid thin var(--border)`}"
1884
- @click="goToPage('last')"
1885
- >
1886
- <!-- <i class="icon icon-chevron-end" /> -->
1887
- {{ totalPages }}
1888
- </button>
1889
- <button
1890
- type="button"
1891
- class="btn btn-sm role-multi-action page-btn-normal"
1892
- :disabled="page == totalPages"
1893
- :style="{ color: page <= totalPages ? `var(--default-text) !important` : `var(--paimary)`,border: page <= totalPages ? `solid thin var(--border)` : `solid thin var(--paimary)`}"
1894
- @click="goToPage('next')"
1895
- >
1896
- <!-- <i class="icon icon-chevron-right" /> -->
1800
+ <!-- <i class="icon icon-chevron-left" /> -->
1801
+ <
1802
+ </button>
1803
+ <button
1804
+ type="button"
1805
+ class="btn btn-sm role-multi-action page-btn-normal"
1806
+ :style="{ color: (page == 1) ? `var(--primary)`:`var(--default-text) !important`,border: (page == 1) ? `solid thin var(--primary)` : `solid thin var(--border)`}"
1807
+ @click="goToPage('first')"
1808
+ >
1809
+ <!-- <i class="icon icon-chevron-beginning" /> -->
1810
+ {{ 1 }}
1811
+ </button>
1812
+ <template v-if="totalPages > 2">
1813
+ <div style="display: flex;flex-direction: row;gap: 10px;">
1814
+ <button
1815
+ v-if="page - 2 > 1 && page <= totalPages "
1816
+ type="button"
1817
+ class="btn btn-sm role-multi-action page-btn-normal"
1818
+ :style="{ color: `var(--default-text) !important`,border: `solid thin white`}"
1897
1819
  >
1898
- </button>
1899
-
1900
- <!-- 分页页码切换 -->
1901
- <Select
1902
- :mode="inputPerPage"
1903
- :searchable="false"
1904
- :clearable="false"
1905
- :options="perPageOptions"
1906
- v-model:value="inputPerPage"
1907
- class="pageSelect"
1908
- @update:value="changePerPage"
1909
- />
1910
-
1911
- <div style="height: 100%; align-content: center;">
1912
- 跳至
1913
- </div>
1914
- <input
1915
- v-model="inputPage"
1916
- type="number"
1917
- min="1"
1918
- step="1"
1919
- style="padding: 0px 10px;"
1920
- @keyup.enter="handleToPage"
1921
- >
1922
- <div style="height: 100%; align-content: center;">
1923
-
1820
+ ...
1821
+ </button>
1822
+ <button
1823
+ v-if="page - 1 > 1 && page <= totalPages "
1824
+ type="button"
1825
+ class="btn btn-sm role-multi-action page-btn-normal"
1826
+ :style="{ color: `var(--default-text) !important`,border: `solid thin var(--border)`}"
1827
+ @click="setPage(page-1)"
1828
+ >
1829
+ {{ page-1 }}
1830
+ </button>
1831
+ <button
1832
+ v-if="page > 1 && page < totalPages"
1833
+ type="button"
1834
+ class="btn btn-sm role-multi-action page-btn-normal"
1835
+ :style="{ color: `var(--default-text)`,border: `solid thin var(--primary)`}"
1836
+ @click="setPage(page)"
1837
+ >
1838
+ {{ page }}
1839
+ </button>
1840
+ <button
1841
+ v-if="page + 1 < totalPages "
1842
+ type="button"
1843
+ class="btn btn-sm role-multi-action page-btn-normal"
1844
+ :style="{ color: `var(--default-text) !important`,border: `solid thin var(--border)`}"
1845
+ @click="setPage(page+1)"
1846
+ >
1847
+ {{ page+1 }}
1848
+ </button>
1849
+ <button
1850
+ v-if="page +2 < totalPages "
1851
+ type="button"
1852
+ class="btn btn-sm role-multi-action page-btn-normal"
1853
+ :style="{ color: `var(--default-text) !important`,border: `solid thin white`}"
1854
+ >
1855
+ ...
1856
+ </button>
1924
1857
  </div>
1925
- <!-- <button
1858
+ </template>
1859
+ <!-- <button
1926
1860
  type="button"
1927
1861
  class="btn btn-sm role-multi-action"
1928
- style="padding: 0;max-width: 80px;background-color: white !important;"
1929
- @click="setPage(inputPage)"
1862
+ style="padding: 0;max-width: 32px;background-color: white !important;"
1930
1863
  >
1931
-
1864
+ {{ page }}
1932
1865
  </button> -->
1933
- </div>
1934
- <button
1935
- v-if="search"
1936
- v-shortkey.once="['/']"
1937
- class="hide"
1938
- @shortkey="focusSearch()"
1939
- />
1940
- <template v-if="tableActions">
1941
1866
  <button
1942
- v-shortkey="['j']"
1943
- class="hide"
1944
- @shortkey="focusNext($event)"
1945
- />
1946
- <button
1947
- v-shortkey="['k']"
1948
- class="hide"
1949
- @shortkey="focusPrevious($event)"
1950
- />
1951
- <button
1952
- v-shortkey="['shift','j']"
1953
- class="hide"
1954
- @shortkey="focusNext($event, true)"
1955
- />
1867
+ v-if="totalPages > 1"
1868
+ type="button"
1869
+ class="btn btn-sm role-multi-action page-btn-normal"
1870
+ :style="{ color: (page == totalPages) ? `var(--primary)`:`var(--default-text) !important`,border: (page == totalPages) ? `solid thin var(--primary)` : `solid thin var(--border)`}"
1871
+ @click="goToPage('last')"
1872
+ >
1873
+ <!-- <i class="icon icon-chevron-end" /> -->
1874
+ {{ totalPages }}
1875
+ </button>
1956
1876
  <button
1957
- v-shortkey="['shift','k']"
1958
- class="hide"
1959
- @shortkey="focusPrevious($event, true)"
1877
+ type="button"
1878
+ class="btn btn-sm role-multi-action page-btn-normal"
1879
+ :disabled="page == totalPages"
1880
+ :style="{ color: page <= totalPages ? `var(--default-text) !important` : `var(--paimary)`,border: page <= totalPages ? `solid thin var(--border)` : `solid thin var(--paimary)`}"
1881
+ @click="goToPage('next')"
1882
+ >
1883
+ <!-- <i class="icon icon-chevron-right" /> -->
1884
+ >
1885
+ </button>
1886
+
1887
+ <!-- 分页页码切换 -->
1888
+ <Select
1889
+ :mode="inputPerPage"
1890
+ :searchable="false"
1891
+ :clearable="false"
1892
+ :options="perPageOptions"
1893
+ v-model:value="inputPerPage"
1894
+ class="pageSelect"
1895
+ @update:value="changePerPage"
1960
1896
  />
1961
- <slot name="shortkeys" />
1962
- </template>
1897
+
1898
+ <div style="height: 100%; align-content: center;">
1899
+ 跳至
1900
+ </div>
1901
+ <input
1902
+ v-model="inputPage"
1903
+ type="number"
1904
+ min="1"
1905
+ step="1"
1906
+ style="padding: 0px 10px;"
1907
+ @keyup.enter="handleToPage"
1908
+ >
1909
+ <div style="height: 100%; align-content: center;">
1910
+
1911
+ </div>
1912
+ <!-- <button
1913
+ type="button"
1914
+ class="btn btn-sm role-multi-action"
1915
+ style="padding: 0;max-width: 80px;background-color: white !important;"
1916
+ @click="setPage(inputPage)"
1917
+ >
1918
+
1919
+ </button> -->
1920
+ </div>
1963
1921
  </div>
1964
-
1922
+ <button
1923
+ v-if="search"
1924
+ v-shortkey.once="['/']"
1925
+ class="hide"
1926
+ @shortkey="focusSearch()"
1927
+ />
1928
+ <template v-if="tableActions">
1929
+ <button
1930
+ v-shortkey="['j']"
1931
+ class="hide"
1932
+ @shortkey="focusNext($event)"
1933
+ />
1934
+ <button
1935
+ v-shortkey="['k']"
1936
+ class="hide"
1937
+ @shortkey="focusPrevious($event)"
1938
+ />
1939
+ <button
1940
+ v-shortkey="['shift','j']"
1941
+ class="hide"
1942
+ @shortkey="focusNext($event, true)"
1943
+ />
1944
+ <button
1945
+ v-shortkey="['shift','k']"
1946
+ class="hide"
1947
+ @shortkey="focusPrevious($event, true)"
1948
+ />
1949
+ <slot name="shortkeys" />
1950
+ </template>
1965
1951
  </div>
1966
1952
  </template>
1967
1953
 
@@ -2615,3 +2601,4 @@ export default {
2615
2601
  z-index: 3;
2616
2602
  }
2617
2603
  </style>
2604
+