| @@ -7,17 +7,34 @@ import { I18nProvider } from "@/i18n"; | |||||
| import EditStaffWrapper from "@/components/EditStaff/EditStaffWrapper"; | import EditStaffWrapper from "@/components/EditStaff/EditStaffWrapper"; | ||||
| import { Metadata } from "next"; | import { Metadata } from "next"; | ||||
| import { searchParamsProps } from "@/app/utils/fetchUtil"; | import { searchParamsProps } from "@/app/utils/fetchUtil"; | ||||
| import { fetchIndivStaff, fetchStaffInvolvedProjects, fetchStaffSalaryEffectiveInfo } from "@/app/api/staff"; | |||||
| import { fetchCompanyCombo } from "@/app/api/companys/actions"; | |||||
| import { fetchTeamCombo } from "@/app/api/team"; | |||||
| import { fetchDepartmentCombo } from "@/app/api/departments/actions"; | |||||
| import { fetchPositionCombo } from "@/app/api/positions/actions"; | |||||
| import { fetchGradeCombo } from "@/app/api/grades/actions"; | |||||
| import { fetchSkillCombo } from "@/app/api/skill/actions"; | |||||
| import { fetchSalaryCombo } from "@/app/api/salarys/actions"; | |||||
| // export const metadata: Metadata = { | // export const metadata: Metadata = { | ||||
| // title: "staff-edit", | // title: "staff-edit", | ||||
| // }; | // }; | ||||
| const EditStaffPage: React.FC<searchParamsProps> = async ({ | const EditStaffPage: React.FC<searchParamsProps> = async ({ | ||||
| searchParams, | |||||
| }) => { | |||||
| // const searchParams = useSearchParams(); | |||||
| // const userId = searchParams.get('param'); | |||||
| // console.log(userId); // Access the value of the "user_id" parameter | |||||
| searchParams, | |||||
| }) => { | |||||
| // preload | |||||
| fetchIndivStaff(parseInt(searchParams.id as string)), | |||||
| fetchCompanyCombo(), | |||||
| fetchTeamCombo(), | |||||
| fetchDepartmentCombo(), | |||||
| fetchPositionCombo(), | |||||
| fetchGradeCombo(), | |||||
| fetchSkillCombo(), | |||||
| fetchSalaryCombo(), | |||||
| fetchStaffSalaryEffectiveInfo(parseInt(searchParams.id as string)), | |||||
| fetchStaffInvolvedProjects(parseInt(searchParams.id as string)) | |||||
| return ( | return ( | ||||
| <> | <> | ||||
| @@ -0,0 +1,63 @@ | |||||
| import { serverFetchJson } from "@/app/utils/fetchUtil"; | |||||
| import { BASE_API_URL } from "@/config/api"; | |||||
| import { cache } from "react"; | |||||
| import { Grade } from "../grades"; | |||||
| import { PositionResult } from "../positions"; | |||||
| export type GradeLogInfo = { | |||||
| id: number, | |||||
| staffId: number, | |||||
| staffName: String, | |||||
| staffCode: String, | |||||
| grade: Grade, | |||||
| from: String, | |||||
| to?: String, | |||||
| } | |||||
| export type PositionLogInfo = { | |||||
| id: number, | |||||
| staffId: number, | |||||
| staffName: String, | |||||
| staffCode: String, | |||||
| position: PositionResult, | |||||
| from: String, | |||||
| to?: String, | |||||
| } | |||||
| type team = { | |||||
| id: number; | |||||
| description: string; | |||||
| name: string; | |||||
| code: string; | |||||
| teamLead?: number | |||||
| } | |||||
| export type TeamLogInfo = { | |||||
| id: number, | |||||
| staffId: number, | |||||
| staffName: String, | |||||
| staffCode: String, | |||||
| Team: team, | |||||
| from: String, | |||||
| to?: String, | |||||
| } | |||||
| export const fetchGradesLog = cache(async (staffId: number) => { | |||||
| return serverFetchJson<GradeLogInfo[]>(`${BASE_API_URL}/gradeLog/${staffId}`, { | |||||
| next: { tags: ["grades"] }, | |||||
| }); | |||||
| }); | |||||
| export const fetchPositionLog = cache(async (staffId: number) => { | |||||
| return serverFetchJson<PositionLogInfo[]>(`${BASE_API_URL}/positionLog/${staffId}`, { | |||||
| next: { tags: ["position"] }, | |||||
| }); | |||||
| }); | |||||
| export const fetchTeamLog = cache(async (staffId: number) => { | |||||
| return serverFetchJson<TeamLogInfo[]>(`${BASE_API_URL}/teamLog/${staffId}`, { | |||||
| next: { tags: ["team"] }, | |||||
| }); | |||||
| }); | |||||
| @@ -20,6 +20,7 @@ import StaffInfo from "./StaffInfo"; | |||||
| import { IndividualStaff, projects, SalaryEffectiveInfo } from "@/app/api/staff"; | import { IndividualStaff, projects, SalaryEffectiveInfo } from "@/app/api/staff"; | ||||
| import dayjs from "dayjs"; | import dayjs from "dayjs"; | ||||
| import ProjectHistory from "./ProjectHistory"; | import ProjectHistory from "./ProjectHistory"; | ||||
| import { InfoHistory } from "./EditStaffWrapper"; | |||||
| // import { useGridApiContext } from '@mui/x-data-grid'; | // import { useGridApiContext } from '@mui/x-data-grid'; | ||||
| export interface comboItem { | export interface comboItem { | ||||
| @@ -37,11 +38,13 @@ interface formProps { | |||||
| combos: comboItem; | combos: comboItem; | ||||
| SalaryEffectiveInfo: SalaryEffectiveInfo[]; | SalaryEffectiveInfo: SalaryEffectiveInfo[]; | ||||
| InvolvedProject?: projects[] | InvolvedProject?: projects[] | ||||
| InfoHistory: InfoHistory | |||||
| } | } | ||||
| const EditStaff: React.FC<formProps> = ({ Staff, combos, SalaryEffectiveInfo, InvolvedProject }) => { | |||||
| console.log(InvolvedProject) | |||||
| const EditStaff: React.FC<formProps> = ({ Staff, combos, SalaryEffectiveInfo, InvolvedProject, InfoHistory }) => { | |||||
| console.log(InfoHistory) | |||||
| const defaultSkillset = Staff.skillset.map((s: any) => s.skill.id) | const defaultSkillset = Staff.skillset.map((s: any) => s.skill.id) | ||||
| const { t } = useTranslation(); | const { t } = useTranslation(); | ||||
| const searchParams = useSearchParams() | const searchParams = useSearchParams() | ||||
| @@ -9,6 +9,7 @@ import { fetchGradeCombo } from "@/app/api/grades/actions"; | |||||
| import { fetchSkillCombo } from "@/app/api/skill/actions"; | import { fetchSkillCombo } from "@/app/api/skill/actions"; | ||||
| import { fetchSalaryCombo } from "@/app/api/salarys/actions"; | import { fetchSalaryCombo } from "@/app/api/salarys/actions"; | ||||
| import { fetchCompanyCombo } from "@/app/api/companys/actions"; | import { fetchCompanyCombo } from "@/app/api/companys/actions"; | ||||
| import { GradeLogInfo, PositionLogInfo, TeamLogInfo, fetchGradesLog, fetchPositionLog, fetchTeamLog } from "@/app/api/staffInfoHistory"; | |||||
| interface SubComponents { | interface SubComponents { | ||||
| Loading: typeof EditStaffLoading; | Loading: typeof EditStaffLoading; | ||||
| @@ -18,6 +19,12 @@ interface Props { | |||||
| id: number | id: number | ||||
| } | } | ||||
| export type InfoHistory = { | |||||
| gradesLog?: GradeLogInfo[], | |||||
| positionLog?: PositionLogInfo[], | |||||
| teamLog?: TeamLogInfo[], | |||||
| } | |||||
| const EditStaffWrapper: React.FC<Props> & SubComponents = async ({ | const EditStaffWrapper: React.FC<Props> & SubComponents = async ({ | ||||
| id | id | ||||
| }) => { | }) => { | ||||
| @@ -33,7 +40,10 @@ const EditStaffWrapper: React.FC<Props> & SubComponents = async ({ | |||||
| SkillCombo, | SkillCombo, | ||||
| SalaryCombo, | SalaryCombo, | ||||
| SalaryEffectiveInfo, | SalaryEffectiveInfo, | ||||
| InvolvedProject | |||||
| InvolvedProject, | |||||
| GradesLog, | |||||
| PositionLog, | |||||
| TeamLog, | |||||
| ] = await Promise.all([ | ] = await Promise.all([ | ||||
| fetchIndivStaff(id), | fetchIndivStaff(id), | ||||
| fetchCompanyCombo(), | fetchCompanyCombo(), | ||||
| @@ -44,11 +54,12 @@ const EditStaffWrapper: React.FC<Props> & SubComponents = async ({ | |||||
| fetchSkillCombo(), | fetchSkillCombo(), | ||||
| fetchSalaryCombo(), | fetchSalaryCombo(), | ||||
| fetchStaffSalaryEffectiveInfo(id), | fetchStaffSalaryEffectiveInfo(id), | ||||
| fetchStaffInvolvedProjects(id) | |||||
| fetchStaffInvolvedProjects(id), | |||||
| fetchGradesLog(id), | |||||
| fetchPositionLog(id), | |||||
| fetchTeamLog(id), | |||||
| ]); | ]); | ||||
| console.log(InvolvedProject) | |||||
| console.log(SalaryCombo.records) | |||||
| const combos: comboItem = { | const combos: comboItem = { | ||||
| company: CompanyCombo.records, | company: CompanyCombo.records, | ||||
| team: TeamCombo.records, | team: TeamCombo.records, | ||||
| @@ -59,12 +70,17 @@ const EditStaffWrapper: React.FC<Props> & SubComponents = async ({ | |||||
| salary: SalaryCombo.records, | salary: SalaryCombo.records, | ||||
| } | } | ||||
| const InfoHistory: InfoHistory = { | |||||
| gradesLog: GradesLog, | |||||
| positionLog: PositionLog, | |||||
| teamLog: TeamLog, | |||||
| } | |||||
| console.log(InfoHistory) | |||||
| Staff.data.joinDate = Staff.data.joinDate && dateArrayToString(Staff.data.joinDate) as string | Staff.data.joinDate = Staff.data.joinDate && dateArrayToString(Staff.data.joinDate) as string | ||||
| Staff.data.departDate = Staff.data.departDate && dateArrayToString(Staff.data.departDate) as string | Staff.data.departDate = Staff.data.departDate && dateArrayToString(Staff.data.departDate) as string | ||||
| // [{id:0, salaryPoint: 1, date:"2021-05-05"}, {id:1, salaryPoint: 43, date:"2024-05-05"}] | |||||
| console.log(Staff.data) | |||||
| return <EditStaff Staff={Staff.data} combos={combos} SalaryEffectiveInfo={SalaryEffectiveInfo} InvolvedProject={InvolvedProject}/>; | |||||
| return <EditStaff Staff={Staff.data} combos={combos} SalaryEffectiveInfo={SalaryEffectiveInfo} InvolvedProject={InvolvedProject} InfoHistory={InfoHistory}/>; | |||||
| }; | }; | ||||
| EditStaffWrapper.Loading = EditStaffLoading; | EditStaffWrapper.Loading = EditStaffLoading; | ||||
| @@ -0,0 +1,11 @@ | |||||
| interface Props { | |||||
| gradeLog?: any[] | |||||
| } | |||||
| const PositionGradeHistory: React.FC<Props> = async ({ gradeLog }) => { | |||||
| return null | |||||
| } | |||||