Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 

254 rindas
8.9 KiB

  1. "use client";
  2. import { useCallback, useEffect, useState } from "react";
  3. import CustomInputForm from "../CustomInputForm";
  4. import { useRouter } from "next/navigation";
  5. import { useTranslation } from "react-i18next";
  6. import {
  7. FormProvider,
  8. SubmitHandler,
  9. useForm,
  10. } from "react-hook-form";
  11. import { CreateStaffInputs, saveStaff, testing } from "@/app/api/staff/actions";
  12. import { Button, Stack, Typography } from "@mui/material";
  13. import { comboProp } from "@/app/api/companys/actions";
  14. import StaffInfo from "./StaffInfo";
  15. import { Check, Close } from "@mui/icons-material";
  16. import dayjs from "dayjs";
  17. import { SalaryEffectiveInfo } from "@/app/api/staff";
  18. interface Field {
  19. id: string;
  20. label: string;
  21. type: string;
  22. value?: any;
  23. required?: boolean;
  24. pattern?: string;
  25. message?: string;
  26. options?: any[];
  27. readOnly?: boolean;
  28. }
  29. export interface comboItem {
  30. company: comboProp[];
  31. team: comboProp[];
  32. department: comboProp[];
  33. position: comboProp[];
  34. grade: comboProp[];
  35. skill: comboProp[];
  36. salary: comboProp[];
  37. }
  38. interface formProps {
  39. // Title?: string[];
  40. combos: comboItem;
  41. }
  42. const CreateStaff: React.FC<formProps> = ({ combos }) => {
  43. const { t } = useTranslation();
  44. const formProps = useForm<CreateStaffInputs>({
  45. defaultValues: {
  46. teamHistory: []
  47. }
  48. });
  49. const [serverError, setServerError] = useState("");
  50. const router = useRouter();
  51. // const [tabIndex, setTabIndex] = useState(0);
  52. const errors = formProps.formState.errors;
  53. function chopSalaryPoints(input: string | number): number | null {
  54. if (typeof input === 'string') {
  55. const match = input.match(/(\d+) \((\d+) - (\d+)\)/);
  56. if (match) {
  57. return parseInt(match[1], 10);
  58. }
  59. } else if (typeof input === 'number') {
  60. return input;
  61. }
  62. return null;
  63. }
  64. const onSubmit = useCallback<SubmitHandler<CreateStaffInputs>>(
  65. async (data) => {
  66. // try {
  67. console.log(data);
  68. formProps.clearErrors()
  69. let haveError = false;
  70. const regex_email = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/
  71. const regex_phone = /^\d{8}$/
  72. if (!regex_email.test(data.email)) {
  73. haveError = true
  74. formProps.setError("email", { message: t("Please Enter Correct Email."), type: "required" })
  75. }
  76. if (!regex_phone.test(data.phone1)) {
  77. haveError = true
  78. formProps.setError("phone1", { message: t("Please Enter Correct Phone No.."), type: "required" })
  79. }
  80. if (data.emergContactPhone && !regex_phone.test(data.emergContactPhone)) {
  81. haveError = true
  82. formProps.setError("emergContactPhone", { message: t("Please Enter Correct Phone No.."), type: "required" })
  83. }
  84. if (data.phone2 && data.phone2?.length > 0) {
  85. if(!regex_phone.test(data.phone2)) {
  86. haveError = true
  87. formProps.setError("phone2", { message: t("Please Enter Correct Phone No.."), type: "required" })
  88. }
  89. }
  90. if (data.phone1 === data.phone2 || data.phone1 === data.emergContactPhone || data.phone2 && data.phone2 === data.emergContactPhone && data.phone2.length > 0) {
  91. haveError = true
  92. formProps.setError("phone1", { message: t("Please Enter Different Phone No.."), type: "required" })
  93. if (data.phone2!.length > 0) {
  94. formProps.setError("phone2", { message: t("Please Enter Different Phone No.."), type: "required" })
  95. }
  96. formProps.setError("emergContactPhone", { message: t("Please Enter Different Phone No.."), type: "required" })
  97. }
  98. if (!regex_email.test(data.email)) {
  99. haveError = true
  100. formProps.setError("email", { message: t("Please Enter Correct Email."), type: "required" })
  101. }
  102. if (!data.companyId) {
  103. haveError = true
  104. formProps.setError("companyId", { message: t("Please Enter Company."), type: "required" })
  105. }
  106. if (!data.employType) {
  107. haveError = true
  108. formProps.setError("employType", { message: t("Please Enter Employ Type."), type: "required" })
  109. }
  110. if (data.joinDate && data.departDate && new Date(data.departDate) <= new Date(data.joinDate)) {
  111. haveError = true
  112. formProps.setError("departDate", { message: t("Depart Date cannot be earlier than Join Date."), type: "required" })
  113. }
  114. if (!data.salaryEffectiveInfo || data.salaryEffectiveInfo.length < 1) {
  115. haveError = true
  116. formProps.setError("salaryId", { message: t("Please Enter Salary"), type: "required" })
  117. }
  118. if (!data.gradeHistory || data.gradeHistory.length < 1) {
  119. haveError = true
  120. formProps.setError("gradeId", { message: t("Please Enter Grade"), type: "required" })
  121. }
  122. if (!data.positionHistory || data.positionHistory.length < 1) {
  123. console.log("asdadsasd")
  124. haveError = true
  125. formProps.setError("currentPositionId", { message: t("Please Enter Current Position"), type: "required" })
  126. }
  127. console.log(data.teamHistory)
  128. console.log(haveError)
  129. if (haveError) {
  130. return
  131. }
  132. const teamHistory = data.teamHistory.length !== 0 ? data.teamHistory
  133. .map((item) => ({
  134. id: item.id,
  135. team: combos.team.filter(team => team.label === item.team)[0].id,
  136. from: dayjs(item.from).format('YYYY-MM-DD'),
  137. }))
  138. .sort((a, b) => new Date(a.from).getTime() - new Date(b.from).getTime()) : []
  139. const gradeHistory = data.gradeHistory
  140. .map((item) => ({
  141. id: item.id,
  142. grade: combos.grade.filter(grade => grade.label === item.grade)[0].id,
  143. from: dayjs(item.from).format('YYYY-MM-DD'),
  144. }))
  145. .sort((a, b) => new Date(a.from).getTime() - new Date(b.from).getTime())
  146. console.log(data.positionHistory)
  147. const positionHistory = data.positionHistory
  148. .map((item) => ({
  149. id: item.id,
  150. position: combos.position.filter(position => position.label === item.position)[0].id,
  151. from: dayjs(item.from).format('YYYY-MM-DD'),
  152. }))
  153. .sort((a, b) => new Date(a.from).getTime() - new Date(b.from).getTime())
  154. const salaryEffectiveInfo = data.salaryEffectiveInfo.map((item: SalaryEffectiveInfo) => ({
  155. id: item.id,
  156. salaryPoint: chopSalaryPoints(item.salaryPoint),
  157. date: dayjs(item.date).format('YYYY-MM-DD').toString()
  158. })) // backend sort
  159. const postData: CreateStaffInputs = {
  160. // id: id,
  161. ...data,
  162. salaryEffectiveInfo: salaryEffectiveInfo,
  163. teamHistory: teamHistory,
  164. gradeHistory: gradeHistory ?? [],
  165. positionHistory: positionHistory ?? [],
  166. delTeamHistory: data.delTeamHistory ? data.delTeamHistory : [],
  167. delGradeHistory: data.delGradeHistory ? data.delGradeHistory : [],
  168. delPositionHistory: data.delPositionHistory ? data.delPositionHistory : [],
  169. }
  170. console.log("passed")
  171. console.log(postData)
  172. // return
  173. const res = await saveStaff(postData)
  174. console.log(res)
  175. if (!res.id) {
  176. setServerError(res.message!!);
  177. // formProps.setError(res.errorPosition as keyof CreateStaffInputs, {
  178. // message: res.message!!,
  179. // type: "required",
  180. // });
  181. return
  182. }
  183. router.replace("/settings/staff")
  184. // } catch (e: any) {
  185. // console.log(e);
  186. // setServerError(`An error has occurred. Please try again later.`);
  187. // }
  188. },
  189. [router]
  190. );
  191. const errorKey = Object.keys(formProps.formState.errors)[0]
  192. const err = errors[errorKey as keyof CreateStaffInputs]
  193. const handleCancel = useCallback(() => {
  194. router.back();
  195. }, [router]);
  196. return (
  197. <>
  198. <FormProvider {...formProps}>
  199. <Stack
  200. spacing={2}
  201. component="form"
  202. onSubmit={formProps.handleSubmit(onSubmit)}
  203. >
  204. {serverError && (
  205. <Typography variant="body2" color="error" alignSelf="flex-end">
  206. {serverError}
  207. </Typography>
  208. )}
  209. {err && (
  210. <Typography variant="body2" color="error" alignSelf="flex-end">
  211. {err.message?.toString()}
  212. </Typography>
  213. )
  214. }
  215. <StaffInfo combos={combos}/>
  216. <Stack direction="row" justifyContent="flex-end" gap={1}>
  217. <Button
  218. variant="outlined"
  219. startIcon={<Close />}
  220. onClick={handleCancel}
  221. >
  222. {t("Cancel")}
  223. </Button>
  224. <Button
  225. variant="contained"
  226. startIcon={<Check />}
  227. type="submit"
  228. // disabled={Boolean(formProps.watch("isGridEditing"))}
  229. >
  230. {t("Confirm")}
  231. </Button>
  232. </Stack>
  233. </Stack>
  234. </FormProvider>
  235. </>
  236. );
  237. };
  238. export default CreateStaff;