Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 

144 wiersze
4.6 KiB

  1. "use client";
  2. import Stack from "@mui/material/Stack";
  3. import Box from "@mui/material/Box";
  4. import Card from "@mui/material/Card";
  5. import CardContent from "@mui/material/CardContent";
  6. import FormControl from "@mui/material/FormControl";
  7. import Grid from "@mui/material/Grid";
  8. import InputLabel from "@mui/material/InputLabel";
  9. import MenuItem from "@mui/material/MenuItem";
  10. import Select from "@mui/material/Select";
  11. import TextField from "@mui/material/TextField";
  12. import Typography from "@mui/material/Typography";
  13. import { useTranslation } from "react-i18next";
  14. import CardActions from "@mui/material/CardActions";
  15. import RestartAlt from "@mui/icons-material/RestartAlt";
  16. import Button from "@mui/material/Button";
  17. import { Controller, UseFormRegister, useFormContext } from "react-hook-form";
  18. import { CreateInvoiceInputs } from "@/app/api/invoices/actions";
  19. import { LocalizationProvider, DatePicker } from "@mui/x-date-pickers";
  20. import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
  21. import dayjs from "dayjs";
  22. import { InvoiceInformation } from "@/app/api/invoices/actions";
  23. import { INPUT_DATE_FORMAT } from "@/app/utils/formatUtil";
  24. import React, { useCallback, useEffect, useMemo, useState } from "react";
  25. interface Props {
  26. invoiceinfo: InvoiceInformation
  27. }
  28. const InvoiceDetails: React.FC<Props> = ({
  29. invoiceinfo,
  30. }) => {
  31. const {
  32. t,
  33. i18n: { language },
  34. } = useTranslation();
  35. const {
  36. register,
  37. formState: { errors },
  38. control,
  39. setValue,
  40. getValues,
  41. } = useFormContext<InvoiceInformation>();
  42. useEffect(() => {
  43. // const invoiceDate = getValues("invoiceDate");
  44. // const dueDate = getValues("dueDate");
  45. setValue("invoiceDate", dayjs(invoiceinfo.invoiceDate).format(INPUT_DATE_FORMAT))
  46. setValue("dueDate", dayjs(invoiceinfo.dueDate).format(INPUT_DATE_FORMAT))
  47. }, [invoiceinfo,]);
  48. return (
  49. <Card>
  50. <CardContent component={Stack} spacing={4}>
  51. <Box>
  52. <Typography variant="overline" display="block" marginBlockEnd={1}>
  53. {t("Invoice Information")}
  54. </Typography>
  55. <LocalizationProvider
  56. dateAdapter={AdapterDayjs}
  57. adapterLocale={`${language}-hk`}
  58. >
  59. <Grid container spacing={2} columns={{ xs: 6, sm: 12 }}>
  60. <Grid item xs={6}>
  61. <TextField
  62. label={t("Client")}
  63. fullWidth
  64. disabled
  65. defaultValue={invoiceinfo.client}
  66. />
  67. </Grid>
  68. <Grid item xs={6}>
  69. <TextField
  70. label={t("Address")}
  71. fullWidth
  72. disabled
  73. defaultValue={invoiceinfo.address}
  74. />
  75. </Grid>
  76. <Grid item xs={6}>
  77. <TextField
  78. label={t("Attention")}
  79. fullWidth
  80. disabled
  81. defaultValue={invoiceinfo.attention}
  82. />
  83. </Grid>
  84. <Grid item xs={6}>
  85. <FormControl fullWidth>
  86. <DatePicker
  87. label={t("Invoice Date")}
  88. value={dayjs(invoiceinfo.invoiceDate)}
  89. onChange={(date) => {
  90. if (!date) return;
  91. setValue("invoiceDate", date.format(INPUT_DATE_FORMAT));
  92. }}
  93. />
  94. </FormControl>
  95. </Grid>
  96. <Grid item xs={6}>
  97. <FormControl fullWidth>
  98. <DatePicker
  99. label={t("Due Date")}
  100. value={dayjs(invoiceinfo.dueDate)}
  101. onChange={(date) => {
  102. if (!date) return;
  103. setValue("dueDate", date.format(INPUT_DATE_FORMAT));
  104. }}
  105. />
  106. </FormControl>
  107. </Grid>
  108. <Grid item xs={6}>
  109. <TextField
  110. label={t("Project ref no.")}
  111. fullWidth
  112. disabled
  113. defaultValue={invoiceinfo.projectRefNo}
  114. />
  115. </Grid>
  116. <Grid item xs={6}>
  117. <TextField
  118. label={t("Amount (HKD)")}
  119. fullWidth
  120. {...register("amount", {
  121. required: "Amount required!",
  122. })}
  123. error={Boolean(errors.amount)}
  124. />
  125. </Grid>
  126. </Grid>
  127. </LocalizationProvider>
  128. </Box>
  129. {/* <CardActions sx={{ justifyContent: "flex-end" }}>
  130. <Button variant="text" startIcon={<RestartAlt />}>
  131. {t("Reset")}
  132. </Button>
  133. </CardActions> */}
  134. </CardContent>
  135. </Card>
  136. );
  137. };
  138. export default InvoiceDetails;