diff --git a/src/app/(main)/settings/skill/create/page.tsx b/src/app/(main)/settings/skill/create/page.tsx index c98f993..c912af3 100644 --- a/src/app/(main)/settings/skill/create/page.tsx +++ b/src/app/(main)/settings/skill/create/page.tsx @@ -28,11 +28,7 @@ import CreateSkill from "@/components/CreateSkill"; // const Title = ["title1", "title2"]; const CreateStaff: React.FC = async () => { - const { t } = await getServerI18n("staff"); - - const title = ['', t('Additional Info')] - // const regex = new RegExp("^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$") - // console.log(regex) + const { t } = await getServerI18n("skill"); return ( <> diff --git a/src/app/(main)/settings/skill/edit/page.tsx b/src/app/(main)/settings/skill/edit/page.tsx index 05ff61f..7834b4f 100644 --- a/src/app/(main)/settings/skill/edit/page.tsx +++ b/src/app/(main)/settings/skill/edit/page.tsx @@ -17,13 +17,13 @@ const EditSkillPage: React.FC = async ({ searchParams, }) => { console.log(searchParams.id) - const { t } = await getServerI18n("staff"); + const { t } = await getServerI18n("skill"); return ( <> {t("Edit Skill")} - + }> diff --git a/src/app/(main)/settings/skill/page.tsx b/src/app/(main)/settings/skill/page.tsx index f263c87..bcb14ab 100644 --- a/src/app/(main)/settings/skill/page.tsx +++ b/src/app/(main)/settings/skill/page.tsx @@ -38,7 +38,7 @@ const Skill: React.FC = async () => { {t("Create Skill")} - + }> diff --git a/src/app/(main)/settings/team/create/page.tsx b/src/app/(main)/settings/team/create/page.tsx index a47d81c..f748270 100644 --- a/src/app/(main)/settings/team/create/page.tsx +++ b/src/app/(main)/settings/team/create/page.tsx @@ -1,28 +1,6 @@ -// 'use client'; import { I18nProvider, getServerI18n } from "@/i18n"; -import CustomInputForm from "@/components/CustomInputForm"; -import Check from "@mui/icons-material/Check"; -import Close from "@mui/icons-material/Close"; -import Button from "@mui/material/Button"; -import Stack from "@mui/material/Stack"; -import Tab from "@mui/material/Tab"; -import Tabs, { TabsProps } from "@mui/material/Tabs"; -import { useRouter } from "next/navigation"; -import React, { useCallback, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { Task, TaskTemplate } from "@/app/api/tasks"; -import { - FieldErrors, - FormProvider, - SubmitErrorHandler, - SubmitHandler, - useForm, -} from "react-hook-form"; -import { CreateProjectInputs, saveProject } from "@/app/api/projects/actions"; -import { Error } from "@mui/icons-material"; -import { ProjectCategory } from "@/app/api/projects"; -import { Grid, Typography } from "@mui/material"; -import CreateStaffForm from "@/components/CreateStaff/CreateStaff"; +import React from "react"; +import { Typography } from "@mui/material"; import CreateTeam from "@/components/CreateTeam"; const CreateTeamPage: React.FC = async () => { @@ -31,7 +9,7 @@ const CreateTeamPage: React.FC = async () => { return ( <> {t("Create Team")} - + diff --git a/src/app/(main)/settings/team/page.tsx b/src/app/(main)/settings/team/page.tsx index 5e78fb3..b2b67ab 100644 --- a/src/app/(main)/settings/team/page.tsx +++ b/src/app/(main)/settings/team/page.tsx @@ -18,7 +18,7 @@ export const metadata: Metadata = { const Team: React.FC = async () => { - const { t } = await getServerI18n("Team"); + const { t } = await getServerI18n("team"); // preloadTeamLeads(); // preloadStaff(); return ( @@ -41,7 +41,7 @@ export const metadata: Metadata = { {t("Create Team")} - + }> diff --git a/src/app/api/group/actions.ts b/src/app/api/group/actions.ts index 1122c16..eadfe7d 100644 --- a/src/app/api/group/actions.ts +++ b/src/app/api/group/actions.ts @@ -36,16 +36,20 @@ export const fetchAuth = cache(async (target: string, id?: number ) => { }); export const saveGroup = async (data: CreateGroupInputs) => { - return serverFetchJson(`${BASE_API_URL}/group/save`, { - method: "POST", - body: JSON.stringify(data), - headers: { "Content-Type": "application/json" }, - }); + const newGroup = serverFetchJson(`${BASE_API_URL}/group/save`, { + method: "POST", + body: JSON.stringify(data), + headers: { "Content-Type": "application/json" }, + }); + revalidateTag("group") + return newGroup }; export const deleteGroup = async (id: number) => { - return serverFetchWithNoContent(`${BASE_API_URL}/group/${id}`, { + const newGroup = serverFetchWithNoContent(`${BASE_API_URL}/group/${id}`, { method: "DELETE", headers: { "Content-Type": "application/json" }, }); + revalidateTag("group") + return newGroup }; \ No newline at end of file diff --git a/src/app/api/skill/actions.ts b/src/app/api/skill/actions.ts index 6a0deca..15a27a7 100644 --- a/src/app/api/skill/actions.ts +++ b/src/app/api/skill/actions.ts @@ -1,8 +1,9 @@ "use server" -import { serverFetchJson } from "@/app/utils/fetchUtil"; +import { serverFetchJson, serverFetchWithNoContent } from "@/app/utils/fetchUtil"; import { BASE_API_URL } from "@/config/api"; +import { revalidateTag } from "next/cache"; import { cache } from "react"; export interface CreateSkillInputs { @@ -29,9 +30,21 @@ export const fetchSkillCombo = cache(async () => { export const saveSkill = async (data: CreateSkillInputs) => { - return serverFetchJson(`${BASE_API_URL}/skill/save`, { - method: "POST", - body: JSON.stringify(data), - headers: { "Content-Type": "application/json" }, - }); + const newSkill = serverFetchJson(`${BASE_API_URL}/skill/save`, { + method: "POST", + body: JSON.stringify(data), + headers: { "Content-Type": "application/json" }, + }); + revalidateTag("skill") + return newSkill + }; + + +export const deleteSkill = async (id: number) => { + const newSkill = await serverFetchWithNoContent(`${BASE_API_URL}/skill/delete/${id}`, { + method: "DELETE", + headers: { "Content-Type": "application/json" }, + }); + revalidateTag("skill"); + return newSkill }; \ No newline at end of file diff --git a/src/app/api/skill/index.ts b/src/app/api/skill/index.ts index a235426..0ff8d1c 100644 --- a/src/app/api/skill/index.ts +++ b/src/app/api/skill/index.ts @@ -4,11 +4,12 @@ import { cache } from "react"; import "server-only"; export interface SkillResult { - action: any; + action: unknown; id: number; name: string; description: string; code: string; + delete: unknown } export const preloadSkill = () => { @@ -17,12 +18,12 @@ export interface SkillResult { export const fetchSkill = cache(async () => { return serverFetchJson(`${BASE_API_URL}/skill`, { - next: { tags: ["sill"] }, + next: { tags: ["skill"] }, }); }); export const fetchSkillDetail = cache(async (id: number) => { return serverFetchJson(`${BASE_API_URL}/skill/${id}`, { - next: { tags: ["sill"] }, + next: { tags: ["skill"] }, }); }); \ No newline at end of file diff --git a/src/app/api/staff/actions.ts b/src/app/api/staff/actions.ts index 88375d0..fca9727 100644 --- a/src/app/api/staff/actions.ts +++ b/src/app/api/staff/actions.ts @@ -1,9 +1,10 @@ "use server"; -import { serverFetchJson, serverFetchWithNoContent } from "@/app/utils/fetchUtil"; +import { ServerFetchError, serverFetchJson, serverFetchWithNoContent } from "@/app/utils/fetchUtil"; import { BASE_API_URL } from "@/config/api"; import { StaffResult, data } from "."; import { cache } from "react"; import { Team, staff } from "../team/actions"; +import { revalidateTag } from "next/cache"; export interface CreateCustomInputs { // Project details projectCode: string; @@ -41,17 +42,27 @@ export interface CreateStaffInputs { name: string; // team: Team[]; } - // export interface Staff4TransferList { - // records: records[]; - // } export const saveStaff = async (data: CreateStaffInputs) => { - return serverFetchJson(`${BASE_API_URL}/staffs/save`, { + // try { + const newStaffList = await serverFetchJson(`${BASE_API_URL}/staffs/save`, { method: "POST", body: JSON.stringify(data), headers: { "Content-Type": "application/json" }, }); + console.log(newStaffList) + revalidateTag("staffs"); + return newStaffList + + // } catch (e: any) { + // console.log(e.response) + // throw new ServerFetchError( + // "Something went wrong fetching data in serverssssss.", + // e.response, + // ); + // } }; + export const testing = async (data: CreateStaffInputs) => { return serverFetchJson(`${BASE_API_URL}/staffs/testing`, { @@ -62,11 +73,13 @@ export const testing = async (data: CreateStaffInputs) => { }; export const deleteStaff = async (id: number) => { - return serverFetchWithNoContent(`${BASE_API_URL}/staffs/delete/${id}`, { - method: "DELETE", - // body: JSON.stringify(data), - headers: { "Content-Type": "application/json" }, - }); + const newStaffList = await serverFetchWithNoContent(`${BASE_API_URL}/staffs/delete/${id}`, { + method: "DELETE", + // body: JSON.stringify(data), + headers: { "Content-Type": "application/json" }, + }); + revalidateTag("staffs"); + return newStaffList }; diff --git a/src/app/api/staff/index.ts b/src/app/api/staff/index.ts index f24f187..6b15f42 100644 --- a/src/app/api/staff/index.ts +++ b/src/app/api/staff/index.ts @@ -38,6 +38,7 @@ export interface StaffResult { data: data; teamId: number; staffName: string; + userId: number; } export interface searchInput { staffId: string; diff --git a/src/app/api/team/actions.ts b/src/app/api/team/actions.ts index 47e1a82..f57a17a 100644 --- a/src/app/api/team/actions.ts +++ b/src/app/api/team/actions.ts @@ -3,6 +3,7 @@ import { serverFetchJson, serverFetchWithNoContent } from "@/app/utils/fetchUtil import { BASE_API_URL } from "@/config/api"; import { cache } from "react"; import { TeamResult } from "."; +import { revalidateTag } from "next/cache"; export interface CreateTeamInputs { @@ -45,17 +46,21 @@ export const fetchTeamCombo = cache(async () => { }); export const saveTeam = async (data: CreateTeamInputs) => { - return serverFetchJson(`${BASE_API_URL}/team/save`, { - method: "POST", - body: JSON.stringify(data), - headers: { "Content-Type": "application/json" }, - }); + const newTeam = serverFetchJson(`${BASE_API_URL}/team/save`, { + method: "POST", + body: JSON.stringify(data), + headers: { "Content-Type": "application/json" }, + }); + revalidateTag("team") + return newTeam }; export const deleteTeam = async (id: number) => { - return serverFetchWithNoContent(`${BASE_API_URL}/team/delete/${id}`, { + const newTeam = serverFetchWithNoContent(`${BASE_API_URL}/team/delete/${id}`, { method: "DELETE", headers: { "Content-Type": "application/json" }, }); + revalidateTag("team") + return newTeam }; diff --git a/src/app/api/user/actions.ts b/src/app/api/user/actions.ts index 919634c..b6329a8 100644 --- a/src/app/api/user/actions.ts +++ b/src/app/api/user/actions.ts @@ -26,18 +26,22 @@ export const fetchUserDetails = cache(async (id: number) => { }); export const editUser = async (id: number, data: UserInputs) => { - return serverFetchWithNoContent(`${BASE_API_URL}/user/${id}`, { - method: "PUT", - body: JSON.stringify(data), - headers: { "Content-Type": "application/json" }, - }); + const newUser = serverFetchWithNoContent(`${BASE_API_URL}/user/${id}`, { + method: "PUT", + body: JSON.stringify(data), + headers: { "Content-Type": "application/json" }, + }); + revalidateTag("user") + return newUser }; export const deleteUser = async (id: number) => { - return serverFetchWithNoContent(`${BASE_API_URL}/user/${id}`, { - method: "DELETE", - headers: { "Content-Type": "application/json" }, - }); + const newUser = serverFetchWithNoContent(`${BASE_API_URL}/user/${id}`, { + method: "DELETE", + headers: { "Content-Type": "application/json" }, + }); + revalidateTag("user") + return newUser }; export const changePassword = async (data: any) => { diff --git a/src/app/utils/fetchUtil.ts b/src/app/utils/fetchUtil.ts index c1f310b..5e4533e 100644 --- a/src/app/utils/fetchUtil.ts +++ b/src/app/utils/fetchUtil.ts @@ -38,18 +38,23 @@ type FetchParams = Parameters; export async function serverFetchJson(...args: FetchParams) { const response = await serverFetch(...args); - if (response.ok) { return response.json() as T; } else { + const errorText = await response.text() switch (response.status) { case 401: signOutUser(); + case 422: + throw new ServerFetchError( + JSON.parse(errorText).error, + response + ); default: - console.error(await response.text()); + console.error(errorText); throw new ServerFetchError( "Something went wrong fetching data in server.", - response, + response ); } } diff --git a/src/components/ChangePassword/ChangePassword.tsx b/src/components/ChangePassword/ChangePassword.tsx index 1fc384f..01dedcb 100644 --- a/src/components/ChangePassword/ChangePassword.tsx +++ b/src/components/ChangePassword/ChangePassword.tsx @@ -8,7 +8,6 @@ import { useTranslation } from "react-i18next"; import { Button, Stack, Tab, Tabs, TabsProps, Typography } from "@mui/material"; import { Check, Close, Error } from "@mui/icons-material"; import ChagnePasswordForm from "./ChangePasswordForm"; -import { ServerFetchError } from "@/app/utils/fetchUtil"; // interface Props { // // auth?: auth[] diff --git a/src/components/CreateSkill/CreateSkill.tsx b/src/components/CreateSkill/CreateSkill.tsx index d264b34..cb2acc7 100644 --- a/src/components/CreateSkill/CreateSkill.tsx +++ b/src/components/CreateSkill/CreateSkill.tsx @@ -23,7 +23,7 @@ const CreateSkill: React.FC = () => { const [serverError, setServerError] = useState(""); const router = useRouter(); const { t } = useTranslation(); - const [tabIndex, setTabIndex] = useState(0); + // const [tabIndex, setTabIndex] = useState(0); const errors = formProps.formState.errors; const onSubmit = useCallback>( @@ -44,28 +44,28 @@ const CreateSkill: React.FC = () => { router.back(); }; -// const handleReset = useCallback(() => { -// console.log(defaultValues) -// }, [defaultValues]) + const resetSkill = useCallback(() => { + formProps.reset() +}, []) - const handleTabChange = useCallback>( - (_e, newValue) => { - setTabIndex(newValue); - }, - [] - ); + // const handleTabChange = useCallback>( + // (_e, newValue) => { + // setTabIndex(newValue); + // }, + // [] + // ); - const hasErrorsInTab = ( - tabIndex: number, - errors: FieldErrors - ) => { - switch (tabIndex) { - case 0: - return Object.keys(errors).length > 0; - default: - false; - } - }; + // const hasErrorsInTab = ( + // tabIndex: number, + // errors: FieldErrors + // ) => { + // switch (tabIndex) { + // case 0: + // return Object.keys(errors).length > 0; + // default: + // false; + // } + // }; return ( <> @@ -74,13 +74,13 @@ const CreateSkill: React.FC = () => { component="form" onSubmit={formProps.handleSubmit(onSubmit)} > - @@ -88,15 +88,22 @@ const CreateSkill: React.FC = () => { } iconPosition="end" /> - {/* */} - + */} {serverError && ( {serverError} )} - {tabIndex === 0 && } + {/* {tabIndex === 0 && } */} + + diff --git a/src/components/EditSkill/EditSkillForm.tsx b/src/components/EditSkill/EditSkillForm.tsx index 120d2e5..50f813b 100644 --- a/src/components/EditSkill/EditSkillForm.tsx +++ b/src/components/EditSkill/EditSkillForm.tsx @@ -1,47 +1,30 @@ "use client"; - -import { CreateSkillInputs } from "@/app/api/skill/actions"; -import { - Box, - Button, - Card, - CardContent, - Grid, - Stack, - Tab, - Tabs, - TabsProps, - TextField, - Typography, -} from "@mui/material"; -import { useSearchParams } from "next/navigation"; -import { - FieldErrors, - FormProvider, - SubmitErrorHandler, - SubmitHandler, - useForm, - useFormContext, -} from "react-hook-form"; +import Stack from "@mui/material/Stack"; +import Box from "@mui/material/Box"; +import Card from "@mui/material/Card"; +import CardContent from "@mui/material/CardContent"; +import Grid from "@mui/material/Grid"; +import TextField from "@mui/material/TextField"; +import Typography from "@mui/material/Typography"; import { useTranslation } from "react-i18next"; +import CardActions from "@mui/material/CardActions"; +import RestartAlt from "@mui/icons-material/RestartAlt"; +import Button from "@mui/material/Button"; +import { Controller, useFormContext } from "react-hook-form"; +import { FormControl, InputLabel, MenuItem, Select } from "@mui/material"; +import { useCallback } from "react"; +import { CreateSkillInputs } from "@/app/api/skill/actions"; -interface Props { - // users: UserResult[] -} - -const EditSkillForm: React.FC = async ({}) => { +const EditSkillForm: React.FC = () => { const { t } = useTranslation(); - const searchParams = useSearchParams(); - const idString = searchParams.get("id"); const { register, - setValue, - getValues, formState: { errors, defaultValues }, + control, reset, resetField, + setValue, } = useFormContext(); - // const formProps = useForm({}); return ( <> @@ -65,13 +48,14 @@ const EditSkillForm: React.FC = async ({}) => { Boolean(errors.name) && (errors.name?.message ? t(errors.name.message) - : t("Please input correct name")) - } + : `${t("Please input correct ")}${t("name")}` + + )} /> = async ({}) => { Boolean(errors.code) && (errors.code?.message ? t(errors.code.message) - : t("Please input correct name")) - } + : `${t("Please input correct ")}${t("code")}` + )} /> = async ({}) => { Boolean(errors.description) && (errors.description?.message ? t(errors.description.message) - : t("Please input correct name")) - } + : `${t("Please input correct ")}${t("description")}` + )} /> diff --git a/src/components/EditTeam/Allocation.tsx b/src/components/EditTeam/Allocation.tsx index b732168..2376ece 100644 --- a/src/components/EditTeam/Allocation.tsx +++ b/src/components/EditTeam/Allocation.tsx @@ -127,14 +127,14 @@ const Allocation: React.FC = ({ allStaffs: staff, teamLead }) => { const StaffPoolColumns = useMemo[]>( () => [ { - label: t("Add"), + label: t("add"), name: "id", onClick: addStaff, buttonIcon: , }, { label: t("Staff Id"), name: "staffId" }, { label: t("Staff Name"), name: "name" }, - { label: t("Current Position"), name: "currentPosition" }, + { label: t("Position"), name: "currentPosition" }, ], [addStaff, t] ); @@ -142,16 +142,16 @@ const Allocation: React.FC = ({ allStaffs: staff, teamLead }) => { const allocatedStaffColumns = useMemo[]>( () => [ { - label: t("Remove"), + label: t("remove"), name: "action", onClick: removeStaff, buttonIcon: , }, { label: t("Staff Id"), name: "staffId" }, { label: t("Staff Name"), name: "name" }, - { label: t("Current Position"), name: "currentPosition" }, + { label: t("Position"), name: "currentPosition" }, { - label: t("Team Lead"), + label: t("teamLead"), name: "action", onClick: setTeamLead, buttonIcon: , @@ -210,9 +210,6 @@ const Allocation: React.FC = ({ allStaffs: staff, teamLead }) => { sx={{ display: "flex", flexDirection: "column", gap: 1 }} > - - {t("staff")} - @@ -221,7 +218,7 @@ const Allocation: React.FC = ({ allStaffs: staff, teamLead }) => { fullWidth onChange={onQueryInputChange} value={query} - placeholder={t("Search by staff ID, name or position.")} + placeholder={t("Search by Staff Id, Name or Position.")} InputProps={{ endAdornment: query && ( diff --git a/src/components/EditTeam/EditTeam.tsx b/src/components/EditTeam/EditTeam.tsx index 432bc0e..cd5f83a 100644 --- a/src/components/EditTeam/EditTeam.tsx +++ b/src/components/EditTeam/EditTeam.tsx @@ -68,15 +68,13 @@ const EditTeam: React.FC = async ({ staff, desc }) => { ); useEffect(() => { let idList: number[] = [] - console.log(desc) + // console.log(desc) if (idString) { const filteredTeam = staff.filter( (item) => { - console.log(item) - console.log(parseInt(idString)) return (item.teamId === parseInt(idString))} ); - console.log(filteredTeam) + // console.log(filteredTeam) const tempDesc = desc.filter( (item) => item.id === parseInt(idString) ) @@ -100,15 +98,15 @@ const EditTeam: React.FC = async ({ staff, desc }) => { // } idList = filteredIds - console.log(filteredIds) + // console.log(filteredIds) } - console.log(idList) + // console.log(idList) setFilteredItems(filteredTeam); formProps.reset({description: tempDesc[0].description, addStaffIds: idList}) setFilteredDesc(tempDesc[0].description) setFilteredName(tempDesc[0].name) } - console.log(staff) + // console.log(staff) setAllStaffs(staff) @@ -133,7 +131,7 @@ const EditTeam: React.FC = async ({ staff, desc }) => { const onSubmit = useCallback>( async (data) => { try { - console.log(data); + // console.log(data); const tempData = { description: data.description, addStaffIds: data.addStaffIds, diff --git a/src/components/SkillSearch/SkillSearch.tsx b/src/components/SkillSearch/SkillSearch.tsx index c13ea19..9642827 100644 --- a/src/components/SkillSearch/SkillSearch.tsx +++ b/src/components/SkillSearch/SkillSearch.tsx @@ -8,6 +8,7 @@ import DeleteIcon from "@mui/icons-material/Delete"; import { useRouter } from "next/navigation"; import { deleteDialog, successDialog } from "../Swal/CustomAlerts"; import { SkillResult } from "@/app/api/skill"; +import { deleteSkill } from "@/app/api/skill/actions"; interface Props { skill: SkillResult[]; @@ -29,7 +30,7 @@ const SkillSearch: React.FC = ({ skill }) => { type: "text", }, { - label: t("Skill code"), + label: t("Skill Code"), paramName: "code", type: "text", }, @@ -47,11 +48,11 @@ const SkillSearch: React.FC = ({ skill }) => { ); const deleteClick = useCallback((skill: SkillResult) => { - // deleteDialog(async () => { - // await deleteStaff(skill.id); - // successDialog("Delete Success", t); - // setFilteredSkill((prev) => prev.filter((obj) => obj.id !== skill.id)); - // }, t); + deleteDialog(async () => { + await deleteSkill(skill.id); + successDialog("Delete Success", t); + // setFilteredSkill((prev) => prev.filter((obj) => obj.id !== skill.id)); + }, t); }, []); const columns = useMemo[]>( @@ -62,12 +63,12 @@ const SkillSearch: React.FC = ({ skill }) => { onClick: onSkillClick, buttonIcon: , }, - { name: "name", label: t("Name") }, - { name: "code", label: t("Code") }, - { name: "description", label: t("Description") }, + { name: "name", label: t("name") }, + { name: "code", label: t("code") }, + { name: "description", label: t("description") }, { - name: "action", - label: t("Actions"), + name: "delete", + label: t("Delete"), onClick: deleteClick, buttonIcon: , color: "error", diff --git a/src/components/SkillSearch/SkillSearchWrapper.tsx b/src/components/SkillSearch/SkillSearchWrapper.tsx index 33d0547..0f721d1 100644 --- a/src/components/SkillSearch/SkillSearchWrapper.tsx +++ b/src/components/SkillSearch/SkillSearchWrapper.tsx @@ -17,7 +17,6 @@ interface SubComponents { const SkillSearchWrapper: React.FC & SubComponents = async () => { const skill = await fetchSkill() - console.log(skill); return ; }; diff --git a/src/components/StaffSearch/StaffSearch.tsx b/src/components/StaffSearch/StaffSearch.tsx index e19e915..7d2db97 100644 --- a/src/components/StaffSearch/StaffSearch.tsx +++ b/src/components/StaffSearch/StaffSearch.tsx @@ -61,7 +61,7 @@ const StaffSearch: React.FC = ({ staff, abilities }) => { const onStaffClick = useCallback( (staff: StaffResult) => { - console.log(staff); + // console.log(staff); const id = staff.id; router.push(`/settings/staff/edit?id=${id}`); }, @@ -70,8 +70,8 @@ const StaffSearch: React.FC = ({ staff, abilities }) => { const onUserClick = useCallback( (staff: StaffResult) => { - console.log(staff); - router.push(`/settings/staff/user?id=${staff.id}`); + // console.log(staff); + router.push(`/settings/staff/user?id=${staff.userId}`); }, [router, t] ); @@ -94,7 +94,7 @@ const StaffSearch: React.FC = ({ staff, abilities }) => { }, { name: "id", - label: t("Actions"), + label: t("Users"), onClick: onUserClick, buttonIcon: , isHidden: ![MAINTAIN_USER, VIEW_USER].some((ability) => abilities.includes(ability)), diff --git a/src/components/TeamSearch/TeamSearch.tsx b/src/components/TeamSearch/TeamSearch.tsx index 71ecb79..a73acdb 100644 --- a/src/components/TeamSearch/TeamSearch.tsx +++ b/src/components/TeamSearch/TeamSearch.tsx @@ -21,21 +21,28 @@ const TeamSearch: React.FC = ({ team }) => { const { t } = useTranslation(); const [filteredTeam, setFilteredTeam] = useState(team); const router = useRouter(); + // translation + const edit = t("edit") + const name = t("name") + const code = t("code") + const description = t("description") + const teamLead = t("teamLead") + const delete_t = t("delete") const searchCriteria: Criterion[] = useMemo( () => [ { - label: t("Team Name"), + label: name, paramName: "name", type: "text", }, { - label: t("Team Code"), + label: code, paramName: "code", type: "text", }, { - label: t("Team Description"), + label: description, paramName: "description", type: "text", }, @@ -55,10 +62,7 @@ const TeamSearch: React.FC = ({ team }) => { const onDeleteClick = useCallback((team: TeamResult) => { deleteDialog(async () => { await deleteTeam(team.id); - successDialog(t("Delete Success"), t); - - setFilteredTeam((prev) => prev.filter((obj) => obj.id !== team.id)); }, t); }, []); @@ -66,17 +70,17 @@ const TeamSearch: React.FC = ({ team }) => { () => [ { name: "action", - label: t("Edit"), + label: edit, onClick: onTeamClick, buttonIcon: , }, - { name: "name", label: t("Name") }, - { name: "code", label: t("Code") }, - { name: "description", label: t("description") }, - { name: "staffName", label: t("TeamLead") }, + { name: "name", label: name }, + { name: "code", label: code }, + { name: "description", label: description }, + { name: "staffName", label: teamLead }, { name: "action", - label: t("Delete"), + label: delete_t, onClick: onDeleteClick, buttonIcon: , color: "error" diff --git a/src/components/UserGroupSearch/UserGroupSearch.tsx b/src/components/UserGroupSearch/UserGroupSearch.tsx index fee25e4..7a8f7dd 100644 --- a/src/components/UserGroupSearch/UserGroupSearch.tsx +++ b/src/components/UserGroupSearch/UserGroupSearch.tsx @@ -45,10 +45,7 @@ const UserGroupSearch: React.FC = ({ users }) => { const onDeleteClick = useCallback((group: UserGroupResult) => { deleteDialog(async () => { await deleteGroup(group.id); - successDialog(t("Delete Success"), t); - - setFilteredUser((prev) => prev.filter((obj) => obj.id !== group.id)); }, t); }, []); diff --git a/src/components/UserSearch/UserSearch.tsx b/src/components/UserSearch/UserSearch.tsx index 658d25c..b7ac669 100644 --- a/src/components/UserSearch/UserSearch.tsx +++ b/src/components/UserSearch/UserSearch.tsx @@ -44,10 +44,7 @@ const UserSearch: React.FC = ({ users }) => { const onDeleteClick = useCallback((users: UserResult) => { deleteDialog(async () => { await deleteUser(users.id); - successDialog(t("Delete Success"), t); - - setFilteredUser((prev) => prev.filter((obj) => obj.id !== users.id)); }, t); }, []); diff --git a/src/i18n/zh/skill.json b/src/i18n/zh/skill.json new file mode 100644 index 0000000..ad6e848 --- /dev/null +++ b/src/i18n/zh/skill.json @@ -0,0 +1,18 @@ +{ + "Actions": "編輯", + "Skill": "技能", + "Skill Name": "名稱", + "Skill Code": "編號", + "Skill Info": "技能詳情", + "name": "技能", + "code": "編號", + "description": "描述", + "Confirm": "確定", + "Cancel": "取消", + "Delete": "刪除", + "Reset": "重設", + "Edit Skill": "編輯技能", + "Create Skill": "建立技能", + "Please input correct ": "請輸入正確" + +} \ No newline at end of file diff --git a/src/i18n/zh/staff.json b/src/i18n/zh/staff.json index 78bd69e..3c1ad59 100644 --- a/src/i18n/zh/staff.json +++ b/src/i18n/zh/staff.json @@ -6,6 +6,7 @@ "Grade": "級別", "Current Position": "現職", "Actions": "編輯", + "Users": "用戶", "Create Staff": "新增員工", "Company": "公司", "Department": "部門", diff --git a/src/i18n/zh/team.json b/src/i18n/zh/team.json new file mode 100644 index 0000000..0735308 --- /dev/null +++ b/src/i18n/zh/team.json @@ -0,0 +1,25 @@ +{ + "Team": "隊伍", + "Team Info": "隊伍資料", + "Staff Allocation": "員工分配", + "Create Team": "建立隊伍", + "Edit Team": "編輯隊伍", + "name": "名稱", + "code": "編號", + "description": "描述", + "Team Description": "隊伍描述", + "edit": "編輯", + "teamLead": "負責人", + "Confirm": "確定", + "Cancel": "取消", + "delete": "刪除", + "add": "加入", + "remove": "移除", + "Staff Pool": "可分配員工", + "Allocated Staff": "已分配員工", + "Staff Id": "員工編號", + "Staff Name": "員工名稱", + "Position": "職位", + "Search by Staff Id, Name or Position.": "按員工編號、姓名或職位搜索", + "An error has occurred. Please try again later.": "發生了錯誤。請稍後再試" +} \ No newline at end of file