From 28ee0bf0e0fdbd2e97d0fbbdc6f8e364115a4f93 Mon Sep 17 00:00:00 2001 From: Ryan Wang Date: Wed, 24 Jan 2024 10:34:11 +0800 Subject: [PATCH] refactor: improve role dependency-related functions and i18n (#5227) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /area console /area core /milestone 2.12.x #### What this PR does / why we need it: 优化角色模板依赖的相关功能: 1. 修复勾选某个角色模板之后,其下依赖模板没有选中的问题。 2. 修复编辑角色时,模板其下依赖模板没有选中的问题。 3. 修复角色管理列表中,权限数量显示有误的问题。 4. 移除 **允许管理所有文章** 的角色模板,此角色模板与文章管理重复。 5. 优化 i18n。 #### Which issue(s) this PR fixes: Fixes https://github.com/halo-dev/halo/issues/5222 #### Special notes for your reviewer: 需要测试上诉问题是否还存在。 #### Does this PR introduce a user-facing change? ```release-note 优化角色模板依赖的相关功能,优化文章相关角色的翻译。 ``` --- .../extensions/role-template-post.yaml | 2 +- .../extensions/role-template-uc-content.yaml | 4 +- .../modules/system/roles/RoleDetail.vue | 46 +++++------ .../modules/system/roles/RoleList.vue | 82 ++++++++++++++----- console/src/composables/use-role.ts | 17 ++-- console/src/locales/en.yaml | 10 ++- console/src/locales/zh-CN.yaml | 10 ++- console/src/locales/zh-TW.yaml | 6 +- console/src/utils/role.ts | 32 ++++++++ 9 files changed, 147 insertions(+), 62 deletions(-) create mode 100644 console/src/utils/role.ts diff --git a/application/src/main/resources/extensions/role-template-post.yaml b/application/src/main/resources/extensions/role-template-post.yaml index 70d38c21b..bb442c66c 100644 --- a/application/src/main/resources/extensions/role-template-post.yaml +++ b/application/src/main/resources/extensions/role-template-post.yaml @@ -6,7 +6,7 @@ metadata: halo.run/role-template: "true" annotations: rbac.authorization.halo.run/dependencies: | - [ "role-template-view-posts", "role-template-manage-snapshots", "role-template-manage-tags", "role-template-manage-categories" ] + [ "role-template-view-posts", "role-template-manage-snapshots", "role-template-manage-tags", "role-template-manage-categories", "role-template-post-author" ] rbac.authorization.halo.run/module: "Posts Management" rbac.authorization.halo.run/display-name: "Post Manage" rbac.authorization.halo.run/ui-permissions: | diff --git a/application/src/main/resources/extensions/role-template-uc-content.yaml b/application/src/main/resources/extensions/role-template-uc-content.yaml index eca495a96..a859885b3 100644 --- a/application/src/main/resources/extensions/role-template-uc-content.yaml +++ b/application/src/main/resources/extensions/role-template-uc-content.yaml @@ -8,7 +8,7 @@ metadata: # Currently, yaml definition does not support i18n, please see https://github.com/halo-dev/halo/issues/3573 rbac.authorization.halo.run/display-name: "文章管理员" rbac.authorization.halo.run/dependencies: | - ["role-template-post-editor"] + ["role-template-manage-posts"] rules: [ ] --- @@ -16,6 +16,8 @@ apiVersion: v1alpha1 kind: "Role" metadata: name: role-template-post-editor + # Deprecated, will be removed in the future + deletionTimestamp: 2023-12-01T03:36:25.875373Z labels: halo.run/role-template: "true" annotations: diff --git a/console/console-src/modules/system/roles/RoleDetail.vue b/console/console-src/modules/system/roles/RoleDetail.vue index e8922503c..9d8f8305d 100644 --- a/console/console-src/modules/system/roles/RoleDetail.vue +++ b/console/console-src/modules/system/roles/RoleDetail.vue @@ -11,7 +11,7 @@ import { VDescriptionItem, } from "@halo-dev/components"; import { useRoute } from "vue-router"; -import { computed, onMounted, ref, watch } from "vue"; +import { computed, ref, watch } from "vue"; import { apiClient } from "@/utils/api-client"; import { pluginLabels, roleLabels } from "@/constants/labels"; import { rbacAnnotations } from "@/constants/annotations"; @@ -20,6 +20,8 @@ import { SUPER_ROLE_NAME } from "@/constants/constants"; import { useI18n } from "vue-i18n"; import { formatDatetime } from "@/utils/date"; import { useQuery } from "@tanstack/vue-query"; +import type { Role } from "packages/api-client/dist"; +import { resolveDeepDependencies } from "@/utils/role"; const route = useRoute(); const { t } = useI18n(); @@ -58,12 +60,14 @@ const getRoleCountText = computed(() => { return t("core.role.common.text.contains_all_permissions"); } - const dependenciesCount = JSON.parse( - formState.value.metadata.annotations?.[rbacAnnotations.DEPENDENCIES] || "[]" - ).length; + const dependencies = new Set( + resolveDeepDependencies(formState.value, roleTemplates.value || []) + ); + + console.log(dependencies); return t("core.role.common.text.contains_n_permissions", { - count: dependenciesCount, + count: dependencies.size || 0, }); }); @@ -77,31 +81,27 @@ watch( } ); -const handleFetchRole = async () => { - try { - const response = await apiClient.extension.role.getv1alpha1Role({ +const { refetch } = useQuery({ + queryKey: ["role", route.params.name], + queryFn: async () => { + const { data } = await apiClient.extension.role.getv1alpha1Role({ name: route.params.name as string, }); - formState.value = response.data; - selectedRoleTemplates.value = new Set( - JSON.parse( - response.data.metadata.annotations?.[rbacAnnotations.DEPENDENCIES] || - "[]" - ) + return data; + }, + onSuccess(data) { + formState.value = data; + selectedRoleTemplates.value = new Set( + resolveDeepDependencies(data, roleTemplates.value || []) ); - } catch (error) { - console.error(error); - } -}; + }, + enabled: computed(() => !!roleTemplates.value), +}); const handleUpdateRole = async () => { await handleCreateOrUpdate(); - await handleFetchRole(); + await refetch(); }; - -onMounted(() => { - handleFetchRole(); -});