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.
 
 

168 line
4.5 KiB

  1. import { Button, CircularProgress, Grid } from "@mui/material";
  2. import SearchResults, { Column } from "../SearchResults/SearchResults";
  3. import { PickOrderResult } from "@/app/api/pickOrder";
  4. import { useTranslation } from "react-i18next";
  5. import { useCallback, useEffect, useMemo, useState } from "react";
  6. import { isEmpty, upperCase, upperFirst } from "lodash";
  7. import { arrayToDateString, OUTPUT_DATE_FORMAT } from "@/app/utils/formatUtil";
  8. import {
  9. consolidatePickOrder,
  10. fetchPickOrderClient,
  11. } from "@/app/api/pickOrder/actions";
  12. import useUploadContext from "../UploadProvider/useUploadContext";
  13. import dayjs from "dayjs";
  14. import arraySupport from "dayjs/plugin/arraySupport";
  15. dayjs.extend(arraySupport);
  16. interface Props {
  17. filteredPickOrders: PickOrderResult[];
  18. filterArgs: Record<string, any>;
  19. }
  20. const Jodetail: React.FC<Props> = ({ filteredPickOrders, filterArgs }) => {
  21. const { t } = useTranslation("pickOrder");
  22. const [selectedRows, setSelectedRows] = useState<(string | number)[]>([]);
  23. const [filteredPickOrder, setFilteredPickOrder] = useState(
  24. [] as PickOrderResult[],
  25. );
  26. const { setIsUploading } = useUploadContext();
  27. const [isLoading, setIsLoading] = useState(false);
  28. const [pagingController, setPagingController] = useState({
  29. pageNum: 0,
  30. pageSize: 10,
  31. });
  32. const [totalCount, setTotalCount] = useState<number>();
  33. const fetchNewPagePickOrder = useCallback(
  34. async (
  35. pagingController: Record<string, number>,
  36. filterArgs: Record<string, number>,
  37. ) => {
  38. setIsLoading(true);
  39. const params = {
  40. ...pagingController,
  41. ...filterArgs,
  42. };
  43. const res = await fetchPickOrderClient(params);
  44. if (res) {
  45. console.log(res);
  46. setFilteredPickOrder(res.records);
  47. setTotalCount(res.total);
  48. }
  49. setIsLoading(false);
  50. },
  51. [],
  52. );
  53. const handleConsolidatedRows = useCallback(async () => {
  54. console.log(selectedRows);
  55. setIsUploading(true);
  56. try {
  57. const res = await consolidatePickOrder(selectedRows as number[]);
  58. if (res) {
  59. console.log(res);
  60. }
  61. } catch {
  62. setIsUploading(false);
  63. }
  64. fetchNewPagePickOrder(pagingController, filterArgs);
  65. setIsUploading(false);
  66. }, [selectedRows, setIsUploading, fetchNewPagePickOrder, pagingController, filterArgs]);
  67. useEffect(() => {
  68. fetchNewPagePickOrder(pagingController, filterArgs);
  69. }, [fetchNewPagePickOrder, pagingController, filterArgs]);
  70. const columns = useMemo<Column<PickOrderResult>[]>(
  71. () => [
  72. {
  73. name: "id",
  74. label: "",
  75. type: "checkbox",
  76. disabled: (params) => {
  77. return !isEmpty(params.consoCode);
  78. },
  79. },
  80. {
  81. name: "code",
  82. label: t("Code"),
  83. },
  84. {
  85. name: "consoCode",
  86. label: t("Consolidated Code"),
  87. renderCell: (params) => {
  88. return params.consoCode ?? "";
  89. },
  90. },
  91. {
  92. name: "type",
  93. label: t("type"),
  94. renderCell: (params) => {
  95. return upperCase(params.type);
  96. },
  97. },
  98. {
  99. name: "items",
  100. label: t("Items"),
  101. renderCell: (params) => {
  102. return params.items?.map((i) => i.name).join(", ");
  103. },
  104. },
  105. {
  106. name: "targetDate",
  107. label: t("Target Date"),
  108. renderCell: (params) => {
  109. return (
  110. dayjs(params.targetDate)
  111. .add(-1, "month")
  112. .format(OUTPUT_DATE_FORMAT)
  113. );
  114. },
  115. },
  116. {
  117. name: "releasedBy",
  118. label: t("Released By"),
  119. },
  120. {
  121. name: "status",
  122. label: t("Status"),
  123. renderCell: (params) => {
  124. return upperFirst(params.status);
  125. },
  126. },
  127. ],
  128. [t],
  129. );
  130. return (
  131. <Grid container rowGap={1}>
  132. <Grid item xs={3}>
  133. <Button
  134. disabled={selectedRows.length < 1}
  135. variant="outlined"
  136. onClick={handleConsolidatedRows}
  137. >
  138. {t("Consolidate")}
  139. </Button>
  140. </Grid>
  141. <Grid item xs={12}>
  142. {isLoading ? (
  143. <CircularProgress size={40} />
  144. ) : (
  145. <SearchResults<PickOrderResult>
  146. items={filteredPickOrder}
  147. columns={columns}
  148. pagingController={pagingController}
  149. setPagingController={setPagingController}
  150. totalCount={totalCount}
  151. checkboxIds={selectedRows!}
  152. setCheckboxIds={setSelectedRows}
  153. />
  154. )}
  155. </Grid>
  156. </Grid>
  157. );
  158. };
  159. export default Jodetail;