| @@ -1,4 +1,5 @@ | |||||
| import { fetchAllCustomers, fetchAllSubsidiaries } from "@/app/api/customer"; | import { fetchAllCustomers, fetchAllSubsidiaries } from "@/app/api/customer"; | ||||
| import { fetchGrades } from "@/app/api/grades"; | |||||
| import { | import { | ||||
| fetchProjectBuildingTypes, | fetchProjectBuildingTypes, | ||||
| fetchProjectCategories, | fetchProjectCategories, | ||||
| @@ -34,6 +35,7 @@ const Projects: React.FC = async () => { | |||||
| fetchProjectWorkNatures(); | fetchProjectWorkNatures(); | ||||
| fetchAllCustomers(); | fetchAllCustomers(); | ||||
| fetchAllSubsidiaries(); | fetchAllSubsidiaries(); | ||||
| fetchGrades(); | |||||
| preloadTeamLeads(); | preloadTeamLeads(); | ||||
| preloadStaff(); | preloadStaff(); | ||||
| @@ -1,5 +1,15 @@ | |||||
| import { serverFetchJson } from "@/app/utils/fetchUtil"; | |||||
| import { BASE_API_URL } from "@/config/api"; | |||||
| import { cache } from "react"; | |||||
| export interface Grade { | export interface Grade { | ||||
| name: string; | name: string; | ||||
| id: number; | id: number; | ||||
| code: string; | code: string; | ||||
| } | } | ||||
| export const fetchGrades = cache(async () => { | |||||
| return serverFetchJson<Grade[]>(`${BASE_API_URL}/grades`, { | |||||
| next: { tags: ["grades"] }, | |||||
| }); | |||||
| }); | |||||
| @@ -4,18 +4,18 @@ import { cache } from "react"; | |||||
| import "server-only"; | import "server-only"; | ||||
| export interface PositionResult { | export interface PositionResult { | ||||
| id: number; | |||||
| code: string; | |||||
| name: string; | |||||
| description: string; | |||||
| id: number; | |||||
| code: string; | |||||
| name: string; | |||||
| description: string; | |||||
| } | } | ||||
| export const preloadPositions = () => { | export const preloadPositions = () => { | ||||
| fetchPositions(); | |||||
| fetchPositions(); | |||||
| }; | }; | ||||
| export const fetchPositions = cache(async () => { | export const fetchPositions = cache(async () => { | ||||
| return serverFetchJson<PositionResult[]>(`${BASE_API_URL}/positions`, { | |||||
| next: { tags: ["positions"] }, | |||||
| }); | |||||
| }); | |||||
| return serverFetchJson<PositionResult[]>(`${BASE_API_URL}/positions`, { | |||||
| next: { tags: ["positions"] }, | |||||
| }); | |||||
| }); | |||||
| @@ -51,8 +51,6 @@ export interface Props { | |||||
| buildingTypes: BuildingType[]; | buildingTypes: BuildingType[]; | ||||
| workNatures: WorkNature[]; | workNatures: WorkNature[]; | ||||
| allStaffs: StaffResult[]; | allStaffs: StaffResult[]; | ||||
| // Mocked | |||||
| grades: Grade[]; | grades: Grade[]; | ||||
| } | } | ||||
| @@ -11,6 +11,7 @@ import { | |||||
| } from "@/app/api/projects"; | } from "@/app/api/projects"; | ||||
| import { fetchStaff, fetchTeamLeads } from "@/app/api/staff"; | import { fetchStaff, fetchTeamLeads } from "@/app/api/staff"; | ||||
| import { fetchAllCustomers, fetchAllSubsidiaries } from "@/app/api/customer"; | import { fetchAllCustomers, fetchAllSubsidiaries } from "@/app/api/customer"; | ||||
| import { fetchGrades } from "@/app/api/grades"; | |||||
| const CreateProjectWrapper: React.FC = async () => { | const CreateProjectWrapper: React.FC = async () => { | ||||
| const [ | const [ | ||||
| @@ -27,6 +28,7 @@ const CreateProjectWrapper: React.FC = async () => { | |||||
| buildingTypes, | buildingTypes, | ||||
| workNatures, | workNatures, | ||||
| allStaffs, | allStaffs, | ||||
| grades, | |||||
| ] = await Promise.all([ | ] = await Promise.all([ | ||||
| fetchAllTasks(), | fetchAllTasks(), | ||||
| fetchTaskTemplates(), | fetchTaskTemplates(), | ||||
| @@ -41,6 +43,7 @@ const CreateProjectWrapper: React.FC = async () => { | |||||
| fetchProjectBuildingTypes(), | fetchProjectBuildingTypes(), | ||||
| fetchProjectWorkNatures(), | fetchProjectWorkNatures(), | ||||
| fetchStaff(), | fetchStaff(), | ||||
| fetchGrades(), | |||||
| ]); | ]); | ||||
| return ( | return ( | ||||
| @@ -58,14 +61,7 @@ const CreateProjectWrapper: React.FC = async () => { | |||||
| buildingTypes={buildingTypes} | buildingTypes={buildingTypes} | ||||
| workNatures={workNatures} | workNatures={workNatures} | ||||
| allStaffs={allStaffs} | allStaffs={allStaffs} | ||||
| // Mocks | |||||
| grades={[ | |||||
| { name: "Grade 1", id: 1, code: "1" }, | |||||
| { name: "Grade 2", id: 2, code: "2" }, | |||||
| { name: "Grade 3", id: 3, code: "3" }, | |||||
| { name: "Grade 4", id: 4, code: "4" }, | |||||
| { name: "Grade 5", id: 5, code: "5" }, | |||||
| ]} | |||||
| grades={grades} | |||||
| /> | /> | ||||
| ); | ); | ||||
| }; | }; | ||||
| @@ -54,7 +54,7 @@ export interface Props { | |||||
| } | } | ||||
| const StaffAllocation: React.FC<Props> = ({ | const StaffAllocation: React.FC<Props> = ({ | ||||
| allStaffs: dataStaffs, | |||||
| allStaffs, | |||||
| allTasks, | allTasks, | ||||
| isActive, | isActive, | ||||
| defaultManhourBreakdownByGrade, | defaultManhourBreakdownByGrade, | ||||
| @@ -63,15 +63,6 @@ const StaffAllocation: React.FC<Props> = ({ | |||||
| const { t } = useTranslation(); | const { t } = useTranslation(); | ||||
| const { setValue, getValues, watch } = useFormContext<CreateProjectInputs>(); | const { setValue, getValues, watch } = useFormContext<CreateProjectInputs>(); | ||||
| // TODO: remove this when grade and positions are done | |||||
| const allStaffs = useMemo<StaffResult[]>(() => { | |||||
| return dataStaffs.map((staff, index) => ({ | |||||
| ...staff, | |||||
| grade: grades[index % grades.length].name, | |||||
| currentPosition: `Mock Postion ${index}`, | |||||
| })); | |||||
| }, [dataStaffs, grades]); | |||||
| const [filteredStaff, setFilteredStaff] = React.useState( | const [filteredStaff, setFilteredStaff] = React.useState( | ||||
| allStaffs.sort(staffComparator), | allStaffs.sort(staffComparator), | ||||
| ); | ); | ||||