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.
 
 

154 lines
5.0 KiB

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