FPSMS-frontend
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 

107 行
3.5 KiB

  1. "use client"
  2. import { JoDetail } from "@/app/api/jo"
  3. import { useRouter } from "next/navigation";
  4. import { useTranslation } from "react-i18next";
  5. import useUploadContext from "../UploadProvider/useUploadContext";
  6. import { FormProvider, SubmitErrorHandler, SubmitHandler, useForm } from "react-hook-form";
  7. import { useCallback, useState } from "react";
  8. import { Button, Stack, Typography } from "@mui/material";
  9. import StartIcon from "@mui/icons-material/Start";
  10. import ArrowBackIcon from '@mui/icons-material/ArrowBack';
  11. import { releaseJo } from "@/app/api/jo/actions";
  12. import InfoCard from "./InfoCard";
  13. import PickTable from "./PickTable";
  14. type Props = {
  15. id?: number;
  16. defaultValues: Partial<JoDetail> | undefined;
  17. }
  18. const JoSave: React.FC<Props> = ({
  19. defaultValues,
  20. id,
  21. }) => {
  22. const { t } = useTranslation("jo")
  23. const router = useRouter();
  24. const { setIsUploading } = useUploadContext();
  25. const [serverError, setServerError] = useState("");
  26. const formProps = useForm<JoDetail>({
  27. defaultValues: defaultValues
  28. })
  29. const handleBack = useCallback(() => {
  30. router.replace(`/jo`)
  31. }, [])
  32. const handleRelease = useCallback(async () => {
  33. try {
  34. setIsUploading(true)
  35. if (id) {
  36. console.log(id)
  37. const response = await releaseJo({ id: id })
  38. console.log(response.entity.status)
  39. if (response) {
  40. formProps.setValue("status", response.entity.status)
  41. console.log(formProps.watch("status"))
  42. }
  43. }
  44. } catch (e) {
  45. // backend error
  46. setServerError(t("An error has occurred. Please try again later."));
  47. console.log(e);
  48. } finally {
  49. setIsUploading(false)
  50. }
  51. }, [])
  52. const onSubmit = useCallback<SubmitHandler<JoDetail>>(async (data, event) => {
  53. console.log(data)
  54. }, [t])
  55. const onSubmitError = useCallback<SubmitErrorHandler<JoDetail>>((errors) => {
  56. console.log(errors)
  57. }, [t])
  58. return <>
  59. <FormProvider {...formProps}>
  60. <Stack
  61. spacing={2}
  62. component="form"
  63. onSubmit={formProps.handleSubmit(onSubmit, onSubmitError)}
  64. >
  65. {serverError && (
  66. <Typography variant="body2" color="error" alignSelf="flex-end">
  67. {serverError}
  68. </Typography>
  69. )}
  70. {
  71. formProps.watch("status").toLowerCase() === "planning" && (
  72. <Stack direction="row" justifyContent="flex-start" gap={1}>
  73. <Button
  74. variant="outlined"
  75. startIcon={<StartIcon />}
  76. onClick={handleRelease}
  77. >
  78. {t("Release")}
  79. </Button>
  80. </Stack>
  81. )}
  82. <InfoCard />
  83. <PickTable />
  84. <Stack direction="row" justifyContent="flex-end" gap={1}>
  85. <Button
  86. variant="outlined"
  87. startIcon={<ArrowBackIcon />}
  88. onClick={handleBack}
  89. >
  90. {t("Back")}
  91. </Button>
  92. </Stack>
  93. </Stack>
  94. </FormProvider>
  95. </>
  96. }
  97. export default JoSave;