You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

145 lines
4.1 KiB

  1. "use client";
  2. import Check from "@mui/icons-material/Check";
  3. import Close from "@mui/icons-material/Close";
  4. import Button from "@mui/material/Button";
  5. import Stack from "@mui/material/Stack";
  6. import Tab from "@mui/material/Tab";
  7. import Tabs, { TabsProps } from "@mui/material/Tabs";
  8. import { useRouter } from "next/navigation";
  9. import React, { useCallback, useState, useLayoutEffect, useEffect } from "react";
  10. import { useTranslation } from "react-i18next";
  11. import { Task, TaskTemplate } from "@/app/api/tasks";
  12. import {
  13. FieldErrors,
  14. FormProvider,
  15. SubmitErrorHandler,
  16. SubmitHandler,
  17. useForm,
  18. } from "react-hook-form";
  19. import { EditPositionInputs, editPosition, fetchPositionDetails, savePosition } from "@/app/api/positions/actions";
  20. import { Error } from "@mui/icons-material";
  21. import { ProjectCategory } from "@/app/api/projects";
  22. import { Typography } from "@mui/material";
  23. import PositionDetails from "./PositionDetails";
  24. import { useSearchParams } from 'next/navigation'
  25. import { PositionResult } from "@/app/api/positions";
  26. const EditPosition: React.FC = ({
  27. // allTasks,
  28. // projectCategories,
  29. // taskTemplates,
  30. // teamLeads,
  31. }) => {
  32. const [serverError, setServerError] = useState("");
  33. const { t } = useTranslation();
  34. const searchParams = useSearchParams()
  35. const router = useRouter();
  36. const [positionDetails, setPositionDetails] = useState<EditPositionInputs>()
  37. const positionId = searchParams.get("id")
  38. const fetchPositionDetail = async () =>{
  39. console.log(positionId)
  40. try{
  41. if (positionId !== null && parseInt(positionId) > 0) {
  42. const postionDetails = await fetchPositionDetails(parseInt(positionId))
  43. const updatedArray: EditPositionInputs[] = postionDetails.map((obj) => {
  44. return {
  45. id: obj.id,
  46. positionCode: obj.code,
  47. positionName: obj.name,
  48. description: obj.description
  49. };
  50. });
  51. setPositionDetails(updatedArray[0])
  52. }
  53. } catch (error){
  54. console.log(error)
  55. setServerError(t("An error has occurred. Please try again later."));
  56. }
  57. }
  58. const handleCancel = () => {
  59. router.back();
  60. };
  61. const onSubmit = useCallback<SubmitHandler<EditPositionInputs>>(
  62. async (data) => {
  63. try {
  64. if (positionId !== null && parseInt(positionId) > 0) {
  65. console.log(data);
  66. setServerError("");
  67. // console.log(JSON.stringify(data));
  68. data.id = parseInt(positionId)
  69. console.log(data);
  70. await editPosition(data)
  71. router.replace("/settings/position");
  72. }
  73. } catch (e) {
  74. setServerError(t("An error has occurred. Please try again later."));
  75. }
  76. },
  77. [router, t],
  78. );
  79. const onSubmitError = useCallback<SubmitErrorHandler<EditPositionInputs>>(
  80. (errors) => {
  81. console.log(errors)
  82. },
  83. [],
  84. );
  85. const formProps = useForm<EditPositionInputs>({
  86. // defaultValues: {
  87. // positionCode: positionDetails ? positionDetails.code : "AAA",
  88. // positionName: positionDetails ? positionDetails.name : "BBB",
  89. // description: positionDetails ? positionDetails.description : "CCC",
  90. // },
  91. });
  92. const errors = formProps.formState.errors;
  93. useEffect(() => {
  94. fetchPositionDetail()
  95. }, [])
  96. useEffect(() => {
  97. if (positionDetails !== null && positionDetails !== undefined) {
  98. console.log(positionDetails)
  99. formProps.reset(positionDetails)
  100. }
  101. }, [positionDetails])
  102. return (
  103. <FormProvider {...formProps}>
  104. <Stack
  105. spacing={2}
  106. component="form"
  107. onSubmit={formProps.handleSubmit(onSubmit, onSubmitError)}
  108. >
  109. {
  110. positionDetails && <PositionDetails positionDetails={positionDetails}/>
  111. }
  112. <Stack direction="row" justifyContent="flex-end" gap={1}>
  113. <Button
  114. variant="outlined"
  115. startIcon={<Close />}
  116. onClick={handleCancel}
  117. >
  118. {t("Cancel")}
  119. </Button>
  120. <Button variant="contained" startIcon={<Check />} type="submit">
  121. {t("Confirm")}
  122. </Button>
  123. </Stack>
  124. </Stack>
  125. </FormProvider>
  126. );
  127. };
  128. export default EditPosition;