diff --git a/src/formkit/theme.ts b/src/formkit/theme.ts index 7b4437cb5..aaa1a3f1a 100644 --- a/src/formkit/theme.ts +++ b/src/formkit/theme.ts @@ -26,8 +26,8 @@ const buttonClassification = { const theme: Record> = { global: { outer: "formkit-disabled:opacity-50", - help: "text-xs text-gray-500", - messages: "list-none p-0 mt-1 mb-0", + help: "text-xs mt-1.5 text-gray-500", + messages: "list-none p-0 mt-1.5 mb-0", message: "text-red-500 mb-1 text-xs", form: "flex flex-col space-y-4", }, diff --git a/src/modules/system/roles/RoleDetail.vue b/src/modules/system/roles/RoleDetail.vue index 56570ac21..c024a8e1a 100644 --- a/src/modules/system/roles/RoleDetail.vue +++ b/src/modules/system/roles/RoleDetail.vue @@ -10,27 +10,21 @@ import { VTag, } from "@halo-dev/components"; import { useRoute, useRouter } from "vue-router"; -import { computed, onMounted, ref } from "vue"; +import { onMounted, ref } from "vue"; import { apiClient } from "@halo-dev/admin-shared"; import type { Role, User } from "@halo-dev/api-client"; -import { pluginLabels, roleLabels } from "@/constants/labels"; +import { pluginLabels } from "@/constants/labels"; import { rbacAnnotations } from "@/constants/annotations"; - -interface RoleTemplateGroup { - module: string | null | undefined; - roles: Role[]; -} +import { useRoleTemplateSelection } from "@/modules/system/roles/composables/use-role"; interface FormState { role: Role; - selectedRoleTemplates: string[]; saving: boolean; } const route = useRoute(); const users = ref([]); -const roles = ref([]); const roleActiveId = ref("detail"); const formState = ref({ role: { @@ -46,36 +40,11 @@ const formState = ref({ }, rules: [], }, - selectedRoleTemplates: [], saving: false, }); -const roleTemplates = computed(() => { - return roles.value.filter( - (role) => - role.metadata.labels?.[roleLabels.TEMPLATE] === "true" && - role.metadata.labels?.["halo.run/hidden"] !== "true" - ); -}); - -const roleTemplateGroups = computed(() => { - const groups: RoleTemplateGroup[] = []; - roleTemplates.value.forEach((role) => { - const group = groups.find( - (group) => - group.module === role.metadata.annotations?.[rbacAnnotations.MODULE] - ); - if (group) { - group.roles.push(role); - } else { - groups.push({ - module: role.metadata.annotations?.[rbacAnnotations.MODULE], - roles: [role], - }); - } - }); - return groups; -}); +const { roleTemplateGroups, handleRoleTemplateSelect, selectedRoleTemplates } = + useRoleTemplateSelection(); const handleFetchRole = async () => { try { @@ -83,23 +52,17 @@ const handleFetchRole = async () => { route.params.name as string ); formState.value.role = response.data; - formState.value.selectedRoleTemplates = JSON.parse( - response.data.metadata.annotations?.[rbacAnnotations.DEPENDENCIES] || "[]" + selectedRoleTemplates.value = new Set( + JSON.parse( + response.data.metadata.annotations?.[rbacAnnotations.DEPENDENCIES] || + "[]" + ) ); } catch (error) { console.error(error); } }; -const handleFetchRoles = async () => { - try { - const { data } = await apiClient.extension.role.listv1alpha1Role(); - roles.value = data.items; - } catch (e) { - console.error(e); - } -}; - const handleFetchUsers = async () => { try { const { data } = await apiClient.extension.user.listv1alpha1User(); @@ -114,7 +77,7 @@ const handleUpdateRole = async () => { formState.value.saving = true; if (formState.value.role.metadata.annotations) { formState.value.role.metadata.annotations[rbacAnnotations.DEPENDENCIES] = - JSON.stringify(formState.value.selectedRoleTemplates); + JSON.stringify(Array.from(selectedRoleTemplates.value)); } await apiClient.extension.role.updatev1alpha1Role( route.params.name as string, @@ -136,7 +99,6 @@ const handleRouteToUser = (name: string) => { onMounted(() => { handleFetchRole(); - handleFetchRoles(); handleFetchUsers(); }); @@ -337,13 +299,14 @@ onMounted(() => {