@@ -1,3 +1,4 @@ | |||||
import { searchParamsProps } from "@/app/utils/fetchUtil"; | |||||
import EditPosition from "@/components/EditPosition"; | import EditPosition from "@/components/EditPosition"; | ||||
import EditUserGroup from "@/components/EditUserGroup"; | import EditUserGroup from "@/components/EditUserGroup"; | ||||
import { I18nProvider, getServerI18n } from "@/i18n"; | import { I18nProvider, getServerI18n } from "@/i18n"; | ||||
@@ -8,7 +9,9 @@ export const metadata: Metadata = { | |||||
title: "Edit User Group", | title: "Edit User Group", | ||||
}; | }; | ||||
const Group: React.FC = async () => { | |||||
const Group: React.FC<searchParamsProps> = async ({ | |||||
searchParams, | |||||
}) => { | |||||
const { t } = await getServerI18n("group"); | const { t } = await getServerI18n("group"); | ||||
// Preload necessary dependencies | // Preload necessary dependencies | ||||
@@ -17,7 +20,7 @@ const Group: React.FC = async () => { | |||||
<> | <> | ||||
{/* <Typography variant="h4">{t("Edit User Group")}</Typography> */} | {/* <Typography variant="h4">{t("Edit User Group")}</Typography> */} | ||||
<I18nProvider namespaces={["group"]}> | <I18nProvider namespaces={["group"]}> | ||||
<EditUserGroup /> | |||||
<EditUserGroup id={parseInt(searchParams.id as string)}/> | |||||
</I18nProvider> | </I18nProvider> | ||||
</> | </> | ||||
); | ); | ||||
@@ -14,8 +14,21 @@ export interface UserGroupResult { | |||||
description: string; | description: string; | ||||
} | } | ||||
export type IndivUserGroup = { | |||||
authIds: number[]; | |||||
data: any; | |||||
userIds: number[]; | |||||
} | |||||
export const fetchGroup = cache(async () => { | export const fetchGroup = cache(async () => { | ||||
return serverFetchJson<Records>(`${BASE_API_URL}/group`, { | return serverFetchJson<Records>(`${BASE_API_URL}/group`, { | ||||
next: { tags: ["group"] }, | next: { tags: ["group"] }, | ||||
}); | }); | ||||
}); | }); | ||||
export const fetchIndivGroup = cache(async (id: number) => { | |||||
return serverFetchJson<IndivUserGroup>(`${BASE_API_URL}/group/${id}`, { | |||||
next: { tags: ["group"] }, | |||||
}); | |||||
}); |
@@ -1,6 +1,6 @@ | |||||
"use client"; | "use client"; | ||||
import { useRouter, useSearchParams } from "next/navigation"; | import { useRouter, useSearchParams } from "next/navigation"; | ||||
import { useCallback, useEffect, useMemo, useState } from "react"; | |||||
import React, { useCallback, useEffect, useMemo, useState } from "react"; | |||||
import SearchResults, { Column } from "../SearchResults"; | import SearchResults, { Column } from "../SearchResults"; | ||||
// import { TeamResult } from "@/app/api/team"; | // import { TeamResult } from "@/app/api/team"; | ||||
import { useTranslation } from "react-i18next"; | import { useTranslation } from "react-i18next"; | ||||
@@ -16,19 +16,19 @@ import { | |||||
import { Check, Close, Error } from "@mui/icons-material"; | import { Check, Close, Error } from "@mui/icons-material"; | ||||
import { StaffResult } from "@/app/api/staff"; | import { StaffResult } from "@/app/api/staff"; | ||||
import { CreateGroupInputs, auth, fetchAuth, saveGroup } from "@/app/api/group/actions"; | import { CreateGroupInputs, auth, fetchAuth, saveGroup } from "@/app/api/group/actions"; | ||||
import { UserGroupResult } from "@/app/api/group"; | |||||
import { IndivUserGroup, UserGroupResult } from "@/app/api/group"; | |||||
import { UserResult } from "@/app/api/user"; | import { UserResult } from "@/app/api/user"; | ||||
import GroupInfo from "./GroupInfo"; | import GroupInfo from "./GroupInfo"; | ||||
import AuthorityAllocation from "./AuthorityAllocation"; | import AuthorityAllocation from "./AuthorityAllocation"; | ||||
import UserAllocation from "./UserAllocation"; | import UserAllocation from "./UserAllocation"; | ||||
interface Props { | interface Props { | ||||
groups: UserGroupResult[]; | |||||
// auths: auth[]; | |||||
// groups: UserGroupResult[]; | |||||
auths: auth[]; | |||||
users: UserResult[]; | users: UserResult[]; | ||||
group: IndivUserGroup | |||||
} | } | ||||
const EditUserGroup: React.FC<Props> = ({ groups, users }) => { | |||||
// console.log(users) | |||||
const EditUserGroup: React.FC<Props> = ({ users, auths, group }) => { | |||||
const { t } = useTranslation(); | const { t } = useTranslation(); | ||||
const [serverError, setServerError] = useState(""); | const [serverError, setServerError] = useState(""); | ||||
const formProps = useForm<CreateGroupInputs>(); | const formProps = useForm<CreateGroupInputs>(); | ||||
@@ -36,7 +36,6 @@ const EditUserGroup: React.FC<Props> = ({ groups, users }) => { | |||||
const id = parseInt(searchParams.get("id") || "0"); | const id = parseInt(searchParams.get("id") || "0"); | ||||
const router = useRouter(); | const router = useRouter(); | ||||
const [tabIndex, setTabIndex] = useState(0); | const [tabIndex, setTabIndex] = useState(0); | ||||
const [auths, setAuths] = useState<auth[]>(); | |||||
const errors = formProps.formState.errors; | const errors = formProps.formState.errors; | ||||
@@ -79,22 +78,19 @@ const EditUserGroup: React.FC<Props> = ({ groups, users }) => { | |||||
}, | }, | ||||
[router] | [router] | ||||
); | ); | ||||
const resetGroup = React.useCallback(() => { | |||||
formProps.reset({ | |||||
name: group.data.name, | |||||
description: group.data.description, | |||||
addAuthIds: group.authIds, | |||||
addUserIds: group.userIds, | |||||
}) | |||||
}, []); | |||||
useEffect(() => { | useEffect(() => { | ||||
const thisGroup = groups.filter((item) => item.id === id)[0]; | |||||
const addUserIds = users.filter((item) => item.groupId === id).map((data) => data.id) | |||||
let addAuthIds: number[] = [] | |||||
fetchAuth("group", id).then((data) => { | |||||
setAuths(data.records) | |||||
addAuthIds = data.records.filter((data) => data.v === 1).map((data) => data.id).sort((a, b) => a - b); | |||||
formProps.reset({ | |||||
name: thisGroup.name, | |||||
description: thisGroup.description, | |||||
addAuthIds: addAuthIds, | |||||
addUserIds: addUserIds, | |||||
}); | |||||
}); | |||||
// console.log(auths) | |||||
}, [groups, users]); | |||||
resetGroup() | |||||
}, [group, users]); | |||||
return ( | return ( | ||||
<> | <> | ||||
@@ -1,24 +1,31 @@ | |||||
import React from "react"; | import React from "react"; | ||||
import EditUserGroup from "./EditUserGroup"; | import EditUserGroup from "./EditUserGroup"; | ||||
import EditUserGroupLoading from "./EditUserGroupLoading"; | import EditUserGroupLoading from "./EditUserGroupLoading"; | ||||
import { fetchGroup } from "@/app/api/group"; | |||||
import { fetchGroup, fetchIndivGroup } from "@/app/api/group"; | |||||
import { fetchUser } from "@/app/api/user"; | import { fetchUser } from "@/app/api/user"; | ||||
import { fetchAuth } from "@/app/api/group/actions"; | |||||
interface SubComponents { | interface SubComponents { | ||||
Loading: typeof EditUserGroupLoading; | Loading: typeof EditUserGroupLoading; | ||||
} | } | ||||
const EditUserGroupWrapper: React.FC & SubComponents = async () => { | |||||
interface Props { | |||||
id: number | |||||
} | |||||
const EditUserGroupWrapper: React.FC<Props> & SubComponents = async ({ id }) => { | |||||
const [ | const [ | ||||
groups, | |||||
group, | |||||
users, | users, | ||||
auths, | |||||
] = await Promise.all([ | ] = await Promise.all([ | ||||
fetchGroup(), | |||||
fetchIndivGroup(id), | |||||
fetchUser(), | fetchUser(), | ||||
fetchAuth("group", id), | |||||
]); | ]); | ||||
return <EditUserGroup groups={groups.records} users={users}/>; | |||||
return <EditUserGroup users={users} auths={auths.records} group={group}/>; | |||||
}; | }; | ||||
EditUserGroupWrapper.Loading = EditUserGroupLoading; | EditUserGroupWrapper.Loading = EditUserGroupLoading; | ||||
@@ -43,6 +43,7 @@ const GroupInfo: React.FC = () => { | |||||
<TextField | <TextField | ||||
label={t("Group Name")} | label={t("Group Name")} | ||||
fullWidth | fullWidth | ||||
rows={4} | |||||
{...register("name", { | {...register("name", { | ||||
required: true, | required: true, | ||||
})} | })} | ||||