import { Button, Checkbox, Flex, FormControl, FormLabel, Heading, Input, VStack, Select, SelectContent, SelectIcon, SelectListbox, SelectOption, SelectOptionIndicator, SelectOptionText, SelectPlaceholder, SelectTrigger, SelectValue, Box, Tag, TagLabel, TagCloseButton, HStack, } from "@hope-ui/solid" import { MaybeLoading, FolderChooseInput } from "~/components" import { useFetch, useRouter, useT } from "~/hooks" import { getRoleDetail, handleResp, notify, r } from "~/utils" import { PEmptyResp, PResp, User } from "~/types" import { createStore } from "solid-js/store" import { For, Show, createSignal } from "solid-js" import { me } from "~/store" import { PublicKeys } from "./PublicKeys" import { getRoleList } from "~/utils/api" const AddOrEdit = () => { const t = useT() const { params, back } = useRouter() const { id } = params const [roles, setRoles] = createSignal<{ id: number; name: string }[]>([]) const [paths, setPaths] = createSignal([]) const [user, setUser] = createStore({ id: 0, username: "", password: "", base_path: "", role: [], permission: 0, disabled: false, sso_id: "", role_info: [], permissions: [], max_devices: undefined, session_ttl: undefined, }) const [rolesLoading, loadRoles] = useFetch(() => getRoleList()) const [userLoading, loadUser] = useFetch( (): PResp => r.get(`/admin/user/get?id=${id}`), ) const initData = async () => { // 加载角色列表 const rolesResp = await loadRoles() handleResp(rolesResp, (data) => { setRoles(data.content) }) if (id) { const resp = await loadUser() handleResp(resp, (data) => { setUser(data) loadPathsFromRoles(data.role) }) } else { setUser("base_path", "/") } } const loadPathsFromRoles = async (roleIds: number[]) => { const pathSet = new Set() pathSet.add("/") for (const roleId of roleIds) { const resp = await getRoleDetail(roleId) handleResp(resp, (data) => { for (const scope of data.permission_scopes || []) { if (scope.path) { pathSet.add(scope.path) } } }) } setPaths([...pathSet].map((p) => p.toString())) } initData() const [okLoading, ok] = useFetch((): PEmptyResp => { return r.post(`/admin/user/${id ? "update" : "create"}`, user) }) const isNew = () => !id return ( {id ? t("global.edit") : t("global.add")} {t(`users.username`)} setUser("username", e.currentTarget.value)} /> {t(`users.password`)} setUser("password", e.currentTarget.value)} /> {t(`users.base_path`)} {t(`users.role`)} setUser("disabled", e.currentTarget.checked) } color="$neutral10" fontSize="$sm" checked={user.disabled} > {t(`users.disabled`)} {t(`users.max_devices`)} setUser( "max_devices", e.currentTarget.value ? Number(e.currentTarget.value) : undefined, ) } /> {t(`users.session_ttl`)} setUser( "session_ttl", e.currentTarget.value ? Number(e.currentTarget.value) : undefined, ) } /> ) } export default AddOrEdit