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