FPSMS-frontend
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.
 
 
 

127 rivejä
6.2 KiB

  1. "use client"
  2. import { ImportTestingForm } from "@/app/api/settings/importTesting/actions";
  3. import { ImportPoForm } from "@/app/api/settings/importTesting/actions";
  4. import { INPUT_DATE_FORMAT, OUTPUT_DATE_FORMAT, OUTPUT_TIME_FORMAT, dateTimeStringToDayjs } from "@/app/utils/formatUtil";
  5. import { Check } from "@mui/icons-material";
  6. import { Box, Button, Card, CardContent, FormControl, Grid, Stack, Typography } from "@mui/material";
  7. import { DatePicker, DateTimePicker, LocalizationProvider } from "@mui/x-date-pickers";
  8. import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
  9. import dayjs, { Dayjs } from "dayjs";
  10. import React, { useCallback, useState } from "react";
  11. import { Controller, useFormContext } from "react-hook-form";
  12. import { useTranslation } from "react-i18next";
  13. interface Props {
  14. }
  15. const ImportPo: React.FC<Props> = ({
  16. }) => {
  17. const { t } = useTranslation()
  18. const [isLoading, setIsLoading] = useState(false)
  19. const {
  20. control,
  21. formState: { errors },
  22. watch
  23. } = useFormContext<ImportTestingForm>()
  24. const handleDateTimePickerOnChange = useCallback((value: Dayjs | null, onChange: (value: any) => void) => {
  25. const formattedValue = value ? value.format(`${INPUT_DATE_FORMAT} ${OUTPUT_TIME_FORMAT}`) : null
  26. onChange(formattedValue)
  27. }, [])
  28. return (
  29. <Card sx={{ width: '100%' }}>
  30. <CardContent sx={{ display: "flex", flexDirection: "column", gap: 1 }}>
  31. <Grid container>
  32. <Grid container>
  33. <Typography variant="overline">{t("Import PO")}</Typography>
  34. </Grid>
  35. <Grid item xs={8}>
  36. <LocalizationProvider
  37. dateAdapter={AdapterDayjs}
  38. // TODO: Should maybe use a custom adapterLocale here to support YYYY-MM-DD
  39. adapterLocale="zh-hk"
  40. >
  41. <Box display="flex">
  42. <Controller
  43. control={control}
  44. name="po.dateFrom"
  45. rules={{
  46. required: "Please input the date From!",
  47. validate: {
  48. isValid: (value) =>
  49. value && dateTimeStringToDayjs(value).isValid() ? true : "Invalid date-time"
  50. },
  51. }}
  52. render={({ field, fieldState: { error } }) => (
  53. <DateTimePicker
  54. label={t("Import Po From")}
  55. format={`${OUTPUT_DATE_FORMAT} ${OUTPUT_TIME_FORMAT}`}
  56. onChange={(newValue: Dayjs | null) => (handleDateTimePickerOnChange(newValue, field.onChange))}
  57. slotProps={{
  58. textField: {
  59. error: !!error,
  60. helperText: error ? error.message : null
  61. }
  62. }}
  63. />
  64. )}
  65. />
  66. <Box
  67. display="flex"
  68. alignItems="center"
  69. justifyContent="center"
  70. marginInline={2}
  71. >
  72. {"-"}
  73. </Box>
  74. <Controller
  75. control={control}
  76. name="po.dateTo"
  77. rules={{
  78. required: "Please input the date to!",
  79. validate: {
  80. isValid: (value) =>
  81. value && dateTimeStringToDayjs(value).isValid() ? true : "Invalid date-time",
  82. isFuture: (value) =>
  83. dateTimeStringToDayjs(value).isAfter(watch("po.dateFrom")) || "Date must be in the future",
  84. },
  85. }}
  86. render={({ field, fieldState: { error } }) => (
  87. <DateTimePicker
  88. label={t("Import Po To")}
  89. format={`${OUTPUT_DATE_FORMAT} ${OUTPUT_TIME_FORMAT}`}
  90. onChange={(newValue: Dayjs | null) => (handleDateTimePickerOnChange(newValue, field.onChange))}
  91. slotProps={{
  92. textField: {
  93. error: !!error,
  94. helperText: error ? error.message : null
  95. }
  96. }}
  97. />
  98. )}
  99. />
  100. </Box>
  101. </LocalizationProvider>
  102. </Grid>
  103. </Grid>
  104. <Stack direction="row" justifyContent="flex-end" gap={1}>
  105. <Button
  106. name="importPo"
  107. id="importPo"
  108. variant="contained"
  109. startIcon={<Check />}
  110. type="submit"
  111. >
  112. {t("Import Po")}
  113. </Button>
  114. </Stack>
  115. </CardContent>
  116. </Card>
  117. )
  118. }
  119. export default ImportPo;