From 34dea0802e0233ff53ef1d7eee3b6cf4352efcf6 Mon Sep 17 00:00:00 2001 From: Ryan Wang Date: Thu, 30 Mar 2023 23:30:14 +0800 Subject: [PATCH] feat: add role select input type for formkit (#3641) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind feature /area console /milestone 2.4.0 #### What this PR does / why we need it: 添加角色选择的 FormKit 输入类型。 #### Which issue(s) this PR fixes: Fixes #3637 #### Special notes for your reviewer: 测试方式: 1. 测试为用户分配角色,检查角色下拉框是否正常加载角色列表即可。 #### Does this PR introduce a user-facing change? ```release-note Console 端添加角色选择的 FormKit 输入类型。 ``` --- console/src/formkit/formkit.config.ts | 2 + console/src/formkit/inputs/role-select.ts | 40 +++++++++++++++++++ .../users/components/GrantPermissionModal.vue | 29 +------------- 3 files changed, 44 insertions(+), 27 deletions(-) create mode 100644 console/src/formkit/inputs/role-select.ts diff --git a/console/src/formkit/formkit.config.ts b/console/src/formkit/formkit.config.ts index 2b519b000..47f143593 100644 --- a/console/src/formkit/formkit.config.ts +++ b/console/src/formkit/formkit.config.ts @@ -15,6 +15,7 @@ import { tagSelect } from "./inputs/tag-select"; import { categorySelect } from "./inputs/category-select"; import { categoryCheckbox } from "./inputs/category-checkbox"; import { tagCheckbox } from "./inputs/tag-checkbox"; +import { roleSelect } from "./inputs/role-select"; import radioAlt from "./plugins/radio-alt"; import stopImplicitSubmission from "./plugins/stop-implicit-submission"; @@ -39,6 +40,7 @@ const config: DefaultConfigOptions = { singlePageSelect, categoryCheckbox, tagCheckbox, + roleSelect, }, locales: { zh, en }, locale: "zh", diff --git a/console/src/formkit/inputs/role-select.ts b/console/src/formkit/inputs/role-select.ts new file mode 100644 index 000000000..8ad62a127 --- /dev/null +++ b/console/src/formkit/inputs/role-select.ts @@ -0,0 +1,40 @@ +import { rbacAnnotations } from "@/constants/annotations"; +import { roleLabels } from "@/constants/labels"; +import { apiClient } from "@/utils/api-client"; +import type { FormKitNode, FormKitTypeDefinition } from "@formkit/core"; +import { select, selects, defaultIcon } from "@formkit/inputs"; +import { i18n } from "@/locales"; + +function optionsHandler(node: FormKitNode) { + node.on("created", async () => { + const { data } = await apiClient.extension.role.listv1alpha1Role({ + page: 0, + size: 0, + labelSelector: [`!${roleLabels.TEMPLATE}`], + }); + + node.props.options = [ + { + label: i18n.global.t( + "core.user.grant_permission_modal.fields.role.placeholder" + ), + value: "", + }, + ...data.items.map((role) => { + return { + label: + role.metadata?.annotations?.[rbacAnnotations.DISPLAY_NAME] || + role.metadata.name, + value: role.metadata?.name, + }; + }), + ]; + }); +} + +export const roleSelect: FormKitTypeDefinition = { + ...select, + props: ["placeholder"], + forceTypeProp: "select", + features: [optionsHandler, selects, defaultIcon("select", "select")], +}; diff --git a/console/src/modules/system/users/components/GrantPermissionModal.vue b/console/src/modules/system/users/components/GrantPermissionModal.vue index d80933411..917519dad 100644 --- a/console/src/modules/system/users/components/GrantPermissionModal.vue +++ b/console/src/modules/system/users/components/GrantPermissionModal.vue @@ -1,15 +1,9 @@