| @@ -55,31 +55,25 @@ const createCustomInputs: CreateCustomInputs = { | |||||
| const CreateStaff: React.FC = async () => { | const CreateStaff: React.FC = async () => { | ||||
| const { t } = await getServerI18n("createStaff"); | const { t } = await getServerI18n("createStaff"); | ||||
| const title = ['', 'Additional Info'] | |||||
| const fieldLists = [ | const fieldLists = [ | ||||
| [ | [ | ||||
| { | { | ||||
| id: "name", | id: "name", | ||||
| label: t("Staff Name"), | |||||
| label: t("Staff Id"), | |||||
| type: "text", | type: "text", | ||||
| value: "asdasd", | value: "asdasd", | ||||
| // required: "asdasd", | // required: "asdasd", | ||||
| // option: "asdasd", | // option: "asdasd", | ||||
| }, | }, | ||||
| { | { | ||||
| id: "currentPosition", | |||||
| label: t("Current Position"), | |||||
| type: "combo-Obj", | |||||
| // value: "asdasd", | |||||
| // required: "asdasd", | |||||
| options: [{id: 1, key: 1, value: 1, label: "Potato"}, {id: 2, key: 2, value: 2, label: "Tomato"}], | |||||
| }, | |||||
| { | |||||
| id: "joinPosition", | |||||
| label: t("Join Position"), | |||||
| type: "combo-Obj", | |||||
| // value: "asdasd", | |||||
| id: "name", | |||||
| label: t("Staff Name"), | |||||
| type: "text", | |||||
| value: "asdasd", | |||||
| // required: "asdasd", | // required: "asdasd", | ||||
| options: [{id: 1, key: 1, value: 1, label: "Potato"}, {id: 2, key: 2, value: 2, label: "Tomato"}], | |||||
| // option: "asdasd", | |||||
| }, | }, | ||||
| { | { | ||||
| id: "companyId", | id: "companyId", | ||||
| @@ -89,6 +83,12 @@ const CreateStaff: React.FC = async () => { | |||||
| // required: "asdasd", | // required: "asdasd", | ||||
| options: [{id: 1, key: 1, value: 1, label: "Company A"}, {id: 2, key: 2, value: 2, label: "Company B"}], | options: [{id: 1, key: 1, value: 1, label: "Company A"}, {id: 2, key: 2, value: 2, label: "Company B"}], | ||||
| }, | }, | ||||
| { | |||||
| id: "teamId", | |||||
| label: t("Team"), | |||||
| type: "combo-Obj", | |||||
| options: [{id: 1, key: 1, value: 1, label: "A"}, {id: 2, key: 2, value: 2, label: "B"}], | |||||
| }, | |||||
| { | { | ||||
| id: "gradeId", | id: "gradeId", | ||||
| label: t("Grade"), | label: t("Grade"), | ||||
| @@ -96,10 +96,10 @@ const CreateStaff: React.FC = async () => { | |||||
| options: [{id: 1, key: 1, value: 1, label: "A"}, {id: 2, key: 2, value: 2, label: "B"}], | options: [{id: 1, key: 1, value: 1, label: "A"}, {id: 2, key: 2, value: 2, label: "B"}], | ||||
| }, | }, | ||||
| { | { | ||||
| id: "teamId", | |||||
| label: t("Team"), | |||||
| id: "currentPosition", | |||||
| label: t("Current Position"), | |||||
| type: "combo-Obj", | type: "combo-Obj", | ||||
| options: [{id: 1, key: 1, value: 1, label: "A"}, {id: 2, key: 2, value: 2, label: "B"}], | |||||
| options: [{id: 1, key: 1, value: 1, label: "pos1"}, {id: 2, key: 2, value: 2, label: "pos2"}], | |||||
| }, | }, | ||||
| { | { | ||||
| id: "salaryEffId", | id: "salaryEffId", | ||||
| @@ -112,6 +112,13 @@ const CreateStaff: React.FC = async () => { | |||||
| label: t("Hourly Rate"), | label: t("Hourly Rate"), | ||||
| type: "numeric", | type: "numeric", | ||||
| value: "", | value: "", | ||||
| }, | |||||
| { | |||||
| id: "employType", | |||||
| label: t("Employ Type"), | |||||
| type: "combo-Obj", | |||||
| options: [{id: 1, key: "FT", value: "FT", label: t("FT")}, {id: 2, key: "PT", value: "PT", label: t("PT")}], | |||||
| value: "", | |||||
| }, | }, | ||||
| { | { | ||||
| id: "email", | id: "email", | ||||
| @@ -131,6 +138,8 @@ const CreateStaff: React.FC = async () => { | |||||
| type: "numeric", | type: "numeric", | ||||
| value: "", | value: "", | ||||
| }, | }, | ||||
| ], | |||||
| [ | |||||
| { | { | ||||
| id: "emergContactName", | id: "emergContactName", | ||||
| label: t("Emergency Contact Name"), | label: t("Emergency Contact Name"), | ||||
| @@ -144,12 +153,17 @@ const CreateStaff: React.FC = async () => { | |||||
| value: "", | value: "", | ||||
| }, | }, | ||||
| { | { | ||||
| id: "employType", | |||||
| label: t("Employ Type"), | |||||
| type: "combo-Obj", | |||||
| options: [{id: 1, key: "FT", value: "FT", label: t("FT")}, {id: 2, key: "PT", value: "PT", label: t("PT")}], | |||||
| id: "joinDate", | |||||
| label: t("Join Date"), | |||||
| type: "multiDate", | |||||
| value: "", | value: "", | ||||
| }, | }, | ||||
| { | |||||
| id: "joinPosition", | |||||
| label: t("Join Position"), | |||||
| type: "combo-Obj", | |||||
| options: [{id: 1, key: 1, value: 1, label: "pos1"}, {id: 2, key: 2, value: 2, label: "pos2"}], | |||||
| }, | |||||
| { | { | ||||
| id: "departDate", | id: "departDate", | ||||
| label: t("Depart Date"), | label: t("Depart Date"), | ||||
| @@ -158,7 +172,7 @@ const CreateStaff: React.FC = async () => { | |||||
| }, | }, | ||||
| { | { | ||||
| id: "departReason", | id: "departReason", | ||||
| label: t("Depart Reason"), | |||||
| label: t("Reason"), | |||||
| type: "text", | type: "text", | ||||
| value: "", | value: "", | ||||
| }, | }, | ||||
| @@ -168,15 +182,17 @@ const CreateStaff: React.FC = async () => { | |||||
| type: "remarks", | type: "remarks", | ||||
| value: "", | value: "", | ||||
| }, | }, | ||||
| ], | |||||
| ] | |||||
| ]; | ]; | ||||
| return ( | return ( | ||||
| <> | <> | ||||
| <Typography variant="h4">{t("Create Staff")}</Typography> | <Typography variant="h4">{t("Create Staff")}</Typography> | ||||
| <I18nProvider namespaces={["createStaff"]}> | <I18nProvider namespaces={["createStaff"]}> | ||||
| {/* <CreateStaffForm/>/ */} | |||||
| <CreateStaffForm fieldLists={fieldLists}/> | |||||
| <CreateStaffForm | |||||
| Title={title} | |||||
| fieldLists={fieldLists} | |||||
| /> | |||||
| </I18nProvider> | </I18nProvider> | ||||
| </> | </> | ||||
| ); | ); | ||||
| @@ -10,6 +10,7 @@ export interface CreateCustomInputs { | |||||
| // Miscellaneous | // Miscellaneous | ||||
| expectedProjectFee: string; | expectedProjectFee: string; | ||||
| } | } | ||||
| export interface CreateStaffInputs { | export interface CreateStaffInputs { | ||||
| name: string; | name: string; | ||||
| currentPositionId: number; | currentPositionId: number; | ||||
| @@ -28,7 +29,6 @@ export interface CreateStaffInputs { | |||||
| departReason: string; | departReason: string; | ||||
| remark: string; | remark: string; | ||||
| } | } | ||||
| export const saveStaff = async (data: CreateStaffInputs) => { | export const saveStaff = async (data: CreateStaffInputs) => { | ||||
| return serverFetchJson(`${BASE_API_URL}/staffs/new`, { | return serverFetchJson(`${BASE_API_URL}/staffs/new`, { | ||||
| @@ -12,37 +12,26 @@ export interface Staff { | |||||
| code: string; | code: string; | ||||
| }; | }; | ||||
| } | } | ||||
| export interface resultObj { | |||||
| records: StaffResult[] | |||||
| } | |||||
| export interface StaffResult { | export interface StaffResult { | ||||
| id: number; | id: number; | ||||
| created: string; | |||||
| name: string; | name: string; | ||||
| cost: number; | |||||
| team: string; | |||||
| staffId: string; | staffId: string; | ||||
| type: string; | |||||
| currPos: string; | |||||
| joinPos: string; | |||||
| companyId: string; | |||||
| skillSetId: number; | |||||
| departmentId: number; | |||||
| phone1: string; | |||||
| phone2: string; | |||||
| email: string; | |||||
| emergContactName: string; | |||||
| emergContactPhone: string; | |||||
| employType: string; | |||||
| departDate: string; | |||||
| departReason: string; | |||||
| remarks: string; | |||||
| grade: string; | |||||
| joinPosition: string; | |||||
| currentPosition: string; | |||||
| } | |||||
| export interface searchInput { | |||||
| staffId: string; | |||||
| name: string; | |||||
| team: string; | |||||
| grade: string; | |||||
| currentPosition: string; | |||||
| } | } | ||||
| export const preloadTeamLeads = () => { | export const preloadTeamLeads = () => { | ||||
| fetchTeamLeads(); | fetchTeamLeads(); | ||||
| fetchStaff(); | |||||
| // fetchStaff(); | |||||
| }; | }; | ||||
| export const fetchTeamLeads = cache(async () => { | export const fetchTeamLeads = cache(async () => { | ||||
| @@ -56,8 +45,8 @@ export const preloadStaff = () => { | |||||
| }; | }; | ||||
| export const fetchStaff = cache(async () => { | export const fetchStaff = cache(async () => { | ||||
| return serverFetchJson<resultObj>(`${BASE_API_URL}/staffs/newlist`, { | |||||
| next: { tags: ["teamLeads"] }, | |||||
| }); | |||||
| return serverFetchJson<StaffResult[]>(`${BASE_API_URL}/staffs`, { | |||||
| next: { tags: ["staffs"] }, | |||||
| }); | |||||
| }); | }); | ||||
| @@ -29,10 +29,14 @@ interface formProps { | |||||
| // resetForm: () => void; | // resetForm: () => void; | ||||
| // Title?: string[]; | // Title?: string[]; | ||||
| // isActive: boolean; | // isActive: boolean; | ||||
| Title?: string[] | |||||
| fieldLists: Field[][]; | fieldLists: Field[][]; | ||||
| } | } | ||||
| const CreateStaffForm: React.FC<formProps> = ({ fieldLists }) => { | |||||
| const CreateStaffForm: React.FC<formProps> = ({ | |||||
| Title, | |||||
| fieldLists | |||||
| }) => { | |||||
| // const [formData, setFormData] = useState<any>(null); | // const [formData, setFormData] = useState<any>(null); | ||||
| const router = useRouter(); | const router = useRouter(); | ||||
| const { t } = useTranslation(); | const { t } = useTranslation(); | ||||
| @@ -67,6 +71,7 @@ const CreateStaffForm: React.FC<formProps> = ({ fieldLists }) => { | |||||
| </Typography> | </Typography> | ||||
| )} | )} | ||||
| <CustomInputForm | <CustomInputForm | ||||
| Title={Title} | |||||
| fieldLists={fieldLists} | fieldLists={fieldLists} | ||||
| isActive={true} | isActive={true} | ||||
| onSubmit={onSubmit} | onSubmit={onSubmit} | ||||
| @@ -18,102 +18,39 @@ const StaffSearch: React.FC<Props> = ({ staff }) => { | |||||
| const { t } = useTranslation("staff"); | const { t } = useTranslation("staff"); | ||||
| // If claim searching is done on the server-side, then no need for this. | // If claim searching is done on the server-side, then no need for this. | ||||
| const [filteredClaims, setFilteredClaims] = useState(staff); | |||||
| const [filteredStaff, setFilteredStaff] = useState(staff); | |||||
| // const [filteredStaffRef, setFilteredStaffRef] = useState(staff); | |||||
| const searchCriteria: Criterion<SearchParamNames>[] = useMemo( | const searchCriteria: Criterion<SearchParamNames>[] = useMemo( | ||||
| () => [ | () => [ | ||||
| { | |||||
| label: t("Staff Name"), | |||||
| paramName: "name", | |||||
| type: "text" | |||||
| }, | |||||
| { | |||||
| label: t("Cost (HKD)"), | |||||
| paramName: "cost", | |||||
| type: "text", | |||||
| }, | |||||
| { | { | ||||
| label: t("Expense Type"), | |||||
| paramName: "type", | |||||
| label: t("Team"), | |||||
| paramName: "team", | |||||
| type: "select", | type: "select", | ||||
| options: ["Expense", "Petty Cash"], | |||||
| options: ["1", "2"], | |||||
| }, | }, | ||||
| { | { | ||||
| label: t("Current Position"), | |||||
| paramName: "currPos", | |||||
| type: "select", | |||||
| options: ["Small Potato", "CEO"], | |||||
| label: t("Staff Name"), | |||||
| paramName: "name", | |||||
| type: "text", | |||||
| }, | |||||
| { | |||||
| label: t("Staff ID"), | |||||
| paramName: "staffId", | |||||
| type: "text" | |||||
| }, | }, | ||||
| { | { | ||||
| label: t("Join Position"), | |||||
| paramName: "joinPos", | |||||
| label: t("Grade"), | |||||
| paramName: "grade", | |||||
| type: "select", | type: "select", | ||||
| options: ["Small Potato", "CEO"], | |||||
| options: ["pos1", "CEO"], | |||||
| }, | }, | ||||
| { | { | ||||
| label: t("Company"), | |||||
| paramName: "companyId", | |||||
| label: t("Current Position"), | |||||
| paramName: "currentPosition", | |||||
| type: "select", | type: "select", | ||||
| options: ["1", "2"], | |||||
| options: ["pos1", "CEO"], | |||||
| }, | }, | ||||
| // { | |||||
| // label: t("Skillset"), | |||||
| // paramName: "skillSetId", | |||||
| // type: "select", | |||||
| // options: ["Fly", "Boxing"], | |||||
| // }, | |||||
| // { | |||||
| // label: t("Department"), | |||||
| // paramName: "departmentId", | |||||
| // type: "select", | |||||
| // options: ["Fly", "Boxing"], | |||||
| // }, | |||||
| // { | |||||
| // label: t("phone1"), | |||||
| // paramName: "phone1", | |||||
| // type: "text", | |||||
| // }, | |||||
| // { | |||||
| // label: t("phone2"), | |||||
| // paramName: "phone2", | |||||
| // type: "text", | |||||
| // }, | |||||
| // { | |||||
| // label: t("email"), | |||||
| // paramName: "email", | |||||
| // type: "text", | |||||
| // }, | |||||
| // { | |||||
| // label: t("Emergency Contact Name"), | |||||
| // paramName: "emergContactName", | |||||
| // type: "text", | |||||
| // }, | |||||
| // { | |||||
| // label: t("Emergency Contact Phone"), | |||||
| // paramName: "emergContactPhone", | |||||
| // type: "text", | |||||
| // }, | |||||
| // { | |||||
| // label: t("Employ Type"), | |||||
| // paramName: "employType", | |||||
| // type: "select", | |||||
| // options: ["Full-time", "Part-time"], | |||||
| // }, | |||||
| // { | |||||
| // label: t("Depart Date"), | |||||
| // paramName: "departDate", | |||||
| // type: "date", | |||||
| // }, | |||||
| // { | |||||
| // label: t("Depart Reason"), | |||||
| // paramName: "departReason", | |||||
| // type: "text", | |||||
| // }, | |||||
| // { | |||||
| // label: t("Remarks"), | |||||
| // paramName: "remarks", | |||||
| // type: "text", | |||||
| // }, | |||||
| ], | ], | ||||
| [t], | [t], | ||||
| ); | ); | ||||
| @@ -130,12 +67,11 @@ const StaffSearch: React.FC<Props> = ({ staff }) => { | |||||
| // onClick: onClaimClick, | // onClick: onClaimClick, | ||||
| // buttonIcon: <EditNote />, | // buttonIcon: <EditNote />, | ||||
| // }, | // }, | ||||
| { name: "created", label: t("Creation Date") }, | |||||
| { name: "name", label: t("Related Project Name") }, | |||||
| { name: "staffId", label: t("Staff Id") }, | |||||
| { name: "type", label: t("Expense Type") }, | |||||
| // { name: "status", label: t("Status") }, | |||||
| { name: "remarks", label: t("Remarks") }, | |||||
| { name: "team", label: t("Team") }, | |||||
| { name: "name", label: t("Staff Name") }, | |||||
| { name: "staffId", label: t("Staff ID") }, | |||||
| { name: "grade", label: t("Grade") }, | |||||
| { name: "currentPosition", label: t("Current Position") }, | |||||
| ], | ], | ||||
| [t, onStaffClick], | [t, onStaffClick], | ||||
| ); | ); | ||||
| @@ -145,10 +81,19 @@ const StaffSearch: React.FC<Props> = ({ staff }) => { | |||||
| <SearchBox | <SearchBox | ||||
| criteria={searchCriteria} | criteria={searchCriteria} | ||||
| onSearch={(query) => { | onSearch={(query) => { | ||||
| console.log(query); | |||||
| setFilteredStaff( | |||||
| staff.filter( | |||||
| (s) => | |||||
| s.staffId.toLowerCase().includes(query.staffId.toLowerCase()) && | |||||
| s.name.toLowerCase().includes(query.name.toLowerCase()) | |||||
| // (query.team === "All" || s.team === query.team) && | |||||
| // (query.category === "All" || s.category === query.category) && | |||||
| // (query.team === "All" || s.team === query.team), | |||||
| ) | |||||
| ) | |||||
| }} | }} | ||||
| /> | /> | ||||
| <SearchResults<StaffResult> items={filteredClaims} columns={columns} /> | |||||
| <SearchResults<StaffResult> items={filteredStaff} columns={columns} /> | |||||
| </> | </> | ||||
| ); | ); | ||||
| }; | }; | ||||
| @@ -12,9 +12,9 @@ const StaffSearchWrapper: React.FC & SubComponents = async () => { | |||||
| const staff = await fetchStaff(); | const staff = await fetchStaff(); | ||||
| // const try = ...staff | // const try = ...staff | ||||
| console.log(staff) | console.log(staff) | ||||
| const records = staff.records; | |||||
| // const records = staff.records; | |||||
| return <StaffSearch staff={staff.records} />; | |||||
| return <StaffSearch staff={staff} />; | |||||
| }; | }; | ||||
| StaffSearchWrapper.Loading = StaffSearchLoading; | StaffSearchWrapper.Loading = StaffSearchLoading; | ||||